From 8dee6b1a1008680aa765a3e98cdb4724d5dcdde5 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 17 Jul 2019 22:16:19 +0200 Subject: [PATCH] import v1.1.0_beta1 | 2009-08-21 --- Acl.php | 157 +- Application.php | 298 ++ CHANGELOG | 55 +- CONTRIBUTORS | 1 - INSTALL | 11 +- README | 6 +- bootstrap.php | 28 +- config.default.php | 8 - config.template.php | 7 - languages/en/lang.mo | Bin 12643 -> 16376 bytes languages/en/lang.po | 778 ++-- languages/es/lang.mo | Bin 15320 -> 18051 bytes languages/es/lang.po | 784 ++-- libs/Auth/OpenID.php | 552 +++ libs/Auth/OpenID/AX.php | 1023 +++++ libs/Auth/OpenID/Association.php | 613 +++ libs/Auth/OpenID/BigMath.php | 471 ++ libs/Auth/OpenID/Consumer.php | 2230 ++++++++++ libs/Auth/OpenID/CryptUtil.php | 109 + libs/Auth/OpenID/DatabaseConnection.php | 131 + libs/Auth/OpenID/DiffieHellman.php | 113 + libs/Auth/OpenID/Discover.php | 548 +++ libs/Auth/OpenID/DumbStore.php | 100 + libs/Auth/OpenID/Extension.php | 62 + libs/Auth/OpenID/FileStore.php | 618 +++ libs/Auth/OpenID/HMAC.php | 99 + libs/Auth/OpenID/Interface.php | 197 + libs/Auth/OpenID/KVForm.php | 112 + libs/Auth/OpenID/MemcachedStore.php | 208 + libs/Auth/OpenID/Message.php | 920 ++++ libs/Auth/OpenID/MySQLStore.php | 91 + libs/Auth/OpenID/Nonce.php | 109 + libs/Auth/OpenID/PAPE.php | 301 ++ libs/Auth/OpenID/Parse.php | 352 ++ libs/Auth/OpenID/PostgreSQLStore.php | 113 + libs/Auth/OpenID/SQLStore.php | 569 +++ libs/Auth/OpenID/SQLiteStore.php | 71 + libs/Auth/OpenID/SReg.php | 521 +++ libs/Auth/OpenID/Server.php | 1760 ++++++++ libs/Auth/OpenID/ServerRequest.php | 37 + libs/Auth/OpenID/TrustRoot.php | 462 ++ libs/Auth/OpenID/URINorm.php | 249 ++ libs/Auth/Yadis/HTTPFetcher.php | 147 + libs/Auth/Yadis/Manager.php | 529 +++ libs/Auth/Yadis/Misc.php | 59 + libs/Auth/Yadis/ParanoidHTTPFetcher.php | 226 + libs/Auth/Yadis/ParseHTML.php | 259 ++ libs/Auth/Yadis/PlainHTTPFetcher.php | 249 ++ libs/Auth/Yadis/XML.php | 374 ++ libs/Auth/Yadis/XRDS.php | 478 ++ libs/Auth/Yadis/XRI.php | 234 + libs/Auth/Yadis/XRIRes.php | 72 + libs/Auth/Yadis/Yadis.php | 382 ++ libs/CommunityID/Controller/Action.php | 67 + .../Controller/Action/Helper/ProviderUrl.php | 36 + .../CommunityID/OpenId/DatabaseConnection.php | 79 + libs/Monkeys/AntiSpam.php | 62 + .../Monkeys/Application/Module/Autoloader.php | 10 + libs/Monkeys/Controller/Action.php | 122 +- libs/Monkeys/Controller/Error.php | 13 +- libs/Monkeys/Controller/Plugin/Auth.php | 17 +- libs/Monkeys/Db/Profiler.php | 9 - libs/Monkeys/Db/Table/Gateway.php | 9 - libs/Monkeys/DuplicateException.php | 4 + libs/Monkeys/Form/Decorator/Composite.php | 50 +- libs/Monkeys/Form/Element/DateTime.php | 142 + libs/Monkeys/Form/Element/Password.php | 12 +- libs/Monkeys/Form/Element/Richtextarea.php | 24 + libs/Monkeys/Form/Element/Select.php | 23 + .../Monkeys/Form/Element/list-en1-semic-2.txt | 246 ++ libs/Monkeys/Iterator.php | 54 + libs/Monkeys/Ldap.php | 100 + libs/Monkeys/Lib.php | 21 + libs/Monkeys/Lucene.php | 89 + .../OpenId/Provider/Storage/Database.php | 14 +- libs/Monkeys/Validate/Username.php | 34 + libs/Monkeys/View/Helper/FormDateSelects.php | 6 +- .../View/Helper/FormDateTimeSelects.php | 254 ++ libs/Monkeys/View/Helper/FormRichtextarea.php | 25 + libs/Monkeys/View/Helper/GetBase.php | 9 - libs/Monkeys/tests/sampletext.txt | 1637 +++++++ libs/Monkeys/tests/words.txt | 1 + libs/Zend/Amf/Adobe/Auth.php | 132 + libs/Zend/Amf/Adobe/DbInspector.php | 102 + libs/Zend/Amf/Adobe/Introspector.php | 308 ++ libs/Zend/Amf/Auth/Abstract.php | 41 + libs/Zend/Amf/Constants.php | 11 +- libs/Zend/Amf/Exception.php | 4 +- libs/Zend/Amf/Parse/Amf0/Deserializer.php | 38 +- libs/Zend/Amf/Parse/Amf0/Serializer.php | 154 +- libs/Zend/Amf/Parse/Amf3/Deserializer.php | 830 ++-- libs/Zend/Amf/Parse/Amf3/Serializer.php | 246 +- libs/Zend/Amf/Parse/Deserializer.php | 4 +- libs/Zend/Amf/Parse/InputStream.php | 4 +- libs/Zend/Amf/Parse/OutputStream.php | 4 +- libs/Zend/Amf/Parse/Resource/MysqlResult.php | 69 + libs/Zend/Amf/Parse/Resource/MysqliResult.php | 127 + libs/Zend/Amf/Parse/Resource/Stream.php | 41 + libs/Zend/Amf/Parse/Serializer.php | 4 +- libs/Zend/Amf/Parse/TypeLoader.php | 98 +- libs/Zend/Amf/Request.php | 9 +- libs/Zend/Amf/Request/Http.php | 4 +- libs/Zend/Amf/Response.php | 4 +- libs/Zend/Amf/Response/Http.php | 6 +- libs/Zend/Amf/Server.php | 406 +- libs/Zend/Amf/Server/Exception.php | 4 +- libs/Zend/Amf/Util/BinaryStream.php | 4 +- libs/Zend/Amf/Value/ByteArray.php | 4 +- libs/Zend/Amf/Value/MessageBody.php | 4 +- libs/Zend/Amf/Value/MessageHeader.php | 4 +- .../Amf/Value/Messaging/AbstractMessage.php | 4 +- .../Value/Messaging/AcknowledgeMessage.php | 6 +- .../Amf/Value/Messaging/ArrayCollection.php | 34 + .../Zend/Amf/Value/Messaging/AsyncMessage.php | 4 +- .../Amf/Value/Messaging/CommandMessage.php | 4 +- .../Zend/Amf/Value/Messaging/ErrorMessage.php | 4 +- .../Amf/Value/Messaging/RemotingMessage.php | 4 +- libs/Zend/Amf/Value/TraitsInfo.php | 4 +- libs/Zend/Application.php | 367 ++ libs/Zend/Application/Bootstrap/Bootstrap.php | 79 + .../Bootstrap/BootstrapAbstract.php | 738 ++++ .../Application/Bootstrap/Bootstrapper.php | 94 + libs/Zend/Application/Bootstrap/Exception.php | 38 + .../Bootstrap/ResourceBootstrapper.php | 95 + libs/Zend/Application/Exception.php | 38 + libs/Zend/Application/Module/Autoloader.php | 89 + libs/Zend/Application/Module/Bootstrap.php | 143 + libs/Zend/Application/Resource/Db.php | 156 + libs/Zend/Application/Resource/Exception.php | 35 + .../Application/Resource/Frontcontroller.php | 132 + libs/Zend/Application/Resource/Layout.php | 64 + libs/Zend/Application/Resource/Locale.php | 77 + libs/Zend/Application/Resource/Modules.php | 115 + libs/Zend/Application/Resource/Navigation.php | 112 + libs/Zend/Application/Resource/Resource.php | 80 + .../Application/Resource/ResourceAbstract.php | 159 + libs/Zend/Application/Resource/Router.php | 74 + libs/Zend/Application/Resource/Session.php | 93 + libs/Zend/Application/Resource/Translate.php | 83 + libs/Zend/Application/Resource/View.php | 67 + libs/Zend/Auth/Adapter/DbTable.php | 46 +- libs/Zend/Auth/Adapter/Ldap.php | 18 +- libs/Zend/Cache/Backend.php | 113 +- libs/Zend/Cache/Backend/File.php | 54 +- libs/Zend/Cache/Backend/Memcached.php | 174 +- libs/Zend/Cache/Backend/Sqlite.php | 32 +- libs/Zend/Cache/Backend/TwoLevels.php | 108 +- libs/Zend/Cache/Backend/ZendPlatform.php | 4 +- libs/Zend/Cache/Backend/ZendServer.php | 208 + libs/Zend/Cache/Backend/ZendServer/Disk.php | 101 + libs/Zend/Cache/Backend/ZendServer/ShMem.php | 101 + libs/Zend/Cache/Core.php | 98 +- libs/Zend/Cache/Frontend/Class.php | 18 +- libs/Zend/Cache/Frontend/File.php | 93 +- libs/Zend/Cache/Frontend/Output.php | 6 +- libs/Zend/Cache/Frontend/Page.php | 62 +- libs/Zend/Captcha/Adapter.php | 2 +- libs/Zend/Captcha/Dumb.php | 4 +- libs/Zend/Captcha/Figlet.php | 4 +- libs/Zend/Captcha/Image.php | 145 +- libs/Zend/Captcha/ReCaptcha.php | 109 +- libs/Zend/Captcha/Word.php | 31 +- libs/Zend/CodeGenerator/Abstract.php | 147 + libs/Zend/CodeGenerator/Exception.php | 35 + libs/Zend/CodeGenerator/Php/Abstract.php | 91 + libs/Zend/CodeGenerator/Php/Body.php | 73 + libs/Zend/CodeGenerator/Php/Class.php | 497 +++ libs/Zend/CodeGenerator/Php/Docblock.php | 220 + libs/Zend/CodeGenerator/Php/Docblock/Tag.php | 184 + .../Php/Docblock/Tag/License.php | 98 + .../CodeGenerator/Php/Docblock/Tag/Param.php | 125 + .../CodeGenerator/Php/Docblock/Tag/Return.php | 98 + libs/Zend/CodeGenerator/Php/Exception.php | 37 + libs/Zend/CodeGenerator/Php/File.php | 465 ++ .../CodeGenerator/Php/Member/Abstract.php | 184 + .../CodeGenerator/Php/Member/Container.php | 55 + libs/Zend/CodeGenerator/Php/Method.php | 227 + libs/Zend/CodeGenerator/Php/Parameter.php | 183 + libs/Zend/CodeGenerator/Php/Property.php | 120 + libs/Zend/Config.php | 27 +- libs/Zend/Config/Ini.php | 153 +- libs/Zend/Config/Writer/Array.php | 37 +- libs/Zend/Config/Writer/Ini.php | 58 +- libs/Zend/Config/Writer/Xml.php | 99 +- libs/Zend/Config/Xml.php | 59 +- libs/Zend/Console/Getopt.php | 79 +- libs/Zend/Controller/Action.php | 25 +- .../Controller/Action/Helper/Abstract.php | 9 +- .../Action/Helper/ContextSwitch.php | 28 +- libs/Zend/Controller/Action/Helper/Json.php | 37 +- .../Controller/Action/Helper/Redirector.php | 64 +- .../Controller/Action/Helper/ViewRenderer.php | 6 +- libs/Zend/Controller/Action/Interface.php | 68 + libs/Zend/Controller/Dispatcher/Standard.php | 15 +- libs/Zend/Controller/Front.php | 41 +- libs/Zend/Controller/Plugin/Broker.php | 7 +- libs/Zend/Controller/Request/Abstract.php | 6 + libs/Zend/Controller/Request/Apache404.php | 3 - libs/Zend/Controller/Request/Http.php | 46 +- libs/Zend/Controller/Router/Rewrite.php | 114 +- libs/Zend/Controller/Router/Route.php | 331 +- .../Zend/Controller/Router/Route/Abstract.php | 70 +- libs/Zend/Controller/Router/Route/Chain.php | 71 +- .../Zend/Controller/Router/Route/Hostname.php | 4 +- libs/Zend/Controller/Router/Route/Module.php | 27 +- libs/Zend/Controller/Router/Route/Regex.php | 71 +- libs/Zend/Controller/Router/Route/Static.php | 16 +- libs/Zend/Crypt.php | 105 + libs/Zend/Crypt/DiffieHellman.php | 380 ++ libs/Zend/Crypt/DiffieHellman/Exception.php | 36 + libs/Zend/Crypt/Exception.php | 35 + libs/Zend/Crypt/Hmac.php | 181 + libs/Zend/Crypt/Hmac/Exception.php | 36 + libs/Zend/Crypt/Math.php | 102 + libs/Zend/Crypt/Math/BigInteger.php | 117 + libs/Zend/Crypt/Math/BigInteger/Bcmath.php | 203 + libs/Zend/Crypt/Math/BigInteger/Exception.php | 36 + libs/Zend/Crypt/Math/BigInteger/Gmp.php | 196 + libs/Zend/Crypt/Math/BigInteger/Interface.php | 51 + libs/Zend/Crypt/Math/Exception.php | 36 + libs/Zend/Crypt/Rsa.php | 298 ++ libs/Zend/Crypt/Rsa/Key.php | 95 + libs/Zend/Crypt/Rsa/Key/Private.php | 75 + libs/Zend/Crypt/Rsa/Key/Public.php | 74 + libs/Zend/Currency.php | 137 +- libs/Zend/Date.php | 1023 ++--- libs/Zend/Date/DateObject.php | 33 +- libs/Zend/Db.php | 23 +- libs/Zend/Db/Adapter/Abstract.php | 144 +- libs/Zend/Db/Adapter/Db2.php | 294 +- libs/Zend/Db/Adapter/Mysqli.php | 71 +- libs/Zend/Db/Adapter/Oracle.php | 196 +- libs/Zend/Db/Adapter/Pdo/Abstract.php | 85 +- libs/Zend/Db/Adapter/Pdo/Ibm.php | 28 +- libs/Zend/Db/Adapter/Pdo/Mssql.php | 22 +- libs/Zend/Db/Adapter/Pdo/Mysql.php | 26 +- libs/Zend/Db/Adapter/Pdo/Oci.php | 82 +- libs/Zend/Db/Adapter/Pdo/Pgsql.php | 22 +- libs/Zend/Db/Profiler.php | 4 +- libs/Zend/Db/Profiler/Firebug.php | 1 + libs/Zend/Db/Select.php | 41 +- libs/Zend/Db/Statement.php | 12 +- libs/Zend/Db/Statement/Db2.php | 34 +- libs/Zend/Db/Statement/Oracle.php | 73 +- libs/Zend/Db/Statement/Pdo.php | 20 +- libs/Zend/Db/Statement/Pdo/Ibm.php | 2 +- libs/Zend/Db/Statement/Pdo/Oci.php | 69 + libs/Zend/Db/Table/Abstract.php | 87 +- libs/Zend/Db/Table/Row/Abstract.php | 138 +- libs/Zend/Db/Table/Rowset/Abstract.php | 26 +- libs/Zend/Db/Table/Select.php | 17 +- .../Zend/Dojo/Form/Decorator/DijitElement.php | 12 +- libs/Zend/Dojo/Form/Element/Dijit.php | 3 +- .../Zend/Dojo/Form/Element/SimpleTextarea.php | 43 + libs/Zend/Dojo/View/Exception.php | 28 + libs/Zend/Dojo/View/Helper/ComboBox.php | 27 +- libs/Zend/Dojo/View/Helper/CustomDijit.php | 107 + libs/Zend/Dojo/View/Helper/Dojo/Container.php | 18 +- libs/Zend/Dojo/View/Helper/SimpleTextarea.php | 3 +- libs/Zend/Dojo/View/Helper/Slider.php | 16 +- libs/Zend/Dojo/View/Helper/SubmitButton.php | 11 +- libs/Zend/Dom/Exception.php | 27 + libs/Zend/Feed.php | 26 +- libs/Zend/Feed/Builder.php | 5 +- libs/Zend/Feed/Builder/Entry.php | 14 +- libs/Zend/Feed/Builder/Header.php | 23 +- libs/Zend/Feed/Builder/Header/Itunes.php | 7 +- libs/Zend/Feed/Entry/Atom.php | 28 +- libs/Zend/Feed/Rss.php | 32 +- libs/Zend/File/Transfer.php | 6 +- libs/Zend/File/Transfer/Adapter/Abstract.php | 289 +- libs/Zend/File/Transfer/Adapter/Http.php | 277 +- libs/Zend/Filter.php | 18 +- libs/Zend/Filter/Alnum.php | 41 +- libs/Zend/Filter/Alpha.php | 39 +- libs/Zend/Filter/Callback.php | 133 + libs/Zend/Filter/Decrypt.php | 49 + libs/Zend/Filter/Encrypt.php | 134 + libs/Zend/Filter/Encrypt/Interface.php | 47 + libs/Zend/Filter/Encrypt/Mcrypt.php | 282 ++ libs/Zend/Filter/Encrypt/Openssl.php | 345 ++ libs/Zend/Filter/File/Decrypt.php | 106 + libs/Zend/Filter/File/Encrypt.php | 106 + libs/Zend/Filter/File/LowerCase.php | 20 +- libs/Zend/Filter/File/Rename.php | 43 +- libs/Zend/Filter/File/UpperCase.php | 20 +- libs/Zend/Filter/Input.php | 238 +- libs/Zend/Filter/LocalizedToNormalized.php | 115 + libs/Zend/Filter/NormalizedToLocalized.php | 107 + libs/Zend/Filter/StripTags.php | 51 +- libs/Zend/Form.php | 42 +- libs/Zend/Form/Decorator/Callback.php | 14 +- libs/Zend/Form/Decorator/Captcha/Word.php | 5 + libs/Zend/Form/Decorator/DtDdWrapper.php | 17 +- libs/Zend/Form/Decorator/File.php | 24 +- libs/Zend/Form/Decorator/FormElements.php | 20 +- libs/Zend/Form/Decorator/Label.php | 44 +- .../Form/Decorator/Marker/File/Interface.php | 33 + libs/Zend/Form/Decorator/Tooltip.php | 58 + libs/Zend/Form/Decorator/ViewHelper.php | 7 +- libs/Zend/Form/DisplayGroup.php | 5 +- libs/Zend/Form/Element.php | 344 +- libs/Zend/Form/Element/Captcha.php | 42 + libs/Zend/Form/Element/File.php | 339 +- libs/Zend/Form/Element/Image.php | 6 +- libs/Zend/Form/Element/Multi.php | 4 +- libs/Zend/Form/Element/Submit.php | 5 +- libs/Zend/Gdata.php | 35 +- libs/Zend/Gdata/App.php | 319 +- libs/Zend/Gdata/App/AuthException.php | 2 +- .../Zend/Gdata/App/BadMethodCallException.php | 1 + libs/Zend/Gdata/App/Base.php | 86 +- libs/Zend/Gdata/App/BaseMediaSource.php | 15 +- .../Gdata/App/CaptchaRequiredException.php | 1 + libs/Zend/Gdata/App/Entry.php | 33 +- libs/Zend/Gdata/App/Exception.php | 1 + libs/Zend/Gdata/App/Extension.php | 1 + libs/Zend/Gdata/App/Extension/Author.php | 1 + libs/Zend/Gdata/App/Extension/Category.php | 1 + libs/Zend/Gdata/App/Extension/Content.php | 5 +- libs/Zend/Gdata/App/Extension/Contributor.php | 1 + libs/Zend/Gdata/App/Extension/Control.php | 1 + libs/Zend/Gdata/App/Extension/Draft.php | 1 + libs/Zend/Gdata/App/Extension/Edited.php | 48 + libs/Zend/Gdata/App/Extension/Element.php | 1 + libs/Zend/Gdata/App/Extension/Email.php | 1 + libs/Zend/Gdata/App/Extension/Generator.php | 1 + libs/Zend/Gdata/App/Extension/Icon.php | 1 + libs/Zend/Gdata/App/Extension/Id.php | 1 + libs/Zend/Gdata/App/Extension/Link.php | 1 + libs/Zend/Gdata/App/Extension/Logo.php | 1 + libs/Zend/Gdata/App/Extension/Name.php | 1 + libs/Zend/Gdata/App/Extension/Person.php | 1 + libs/Zend/Gdata/App/Extension/Published.php | 1 + libs/Zend/Gdata/App/Extension/Rights.php | 1 + libs/Zend/Gdata/App/Extension/Source.php | 1 + libs/Zend/Gdata/App/Extension/Subtitle.php | 1 + libs/Zend/Gdata/App/Extension/Summary.php | 1 + libs/Zend/Gdata/App/Extension/Text.php | 1 + libs/Zend/Gdata/App/Extension/Title.php | 1 + libs/Zend/Gdata/App/Extension/Updated.php | 1 + libs/Zend/Gdata/App/Extension/Uri.php | 1 + libs/Zend/Gdata/App/Feed.php | 40 + libs/Zend/Gdata/App/FeedEntryParent.php | 174 +- libs/Zend/Gdata/App/FeedSourceParent.php | 1 + libs/Zend/Gdata/App/HttpException.php | 1 + libs/Zend/Gdata/App/IOException.php | 1 + .../Gdata/App/InvalidArgumentException.php | 1 + libs/Zend/Gdata/App/MediaEntry.php | 73 +- libs/Zend/Gdata/App/MediaFileSource.php | 1 + libs/Zend/Gdata/App/MediaSource.php | 1 + libs/Zend/Gdata/App/Util.php | 3 +- libs/Zend/Gdata/App/VersionException.php | 41 + libs/Zend/Gdata/AuthSub.php | 2 + libs/Zend/Gdata/Books.php | 14 +- libs/Zend/Gdata/Books/CollectionEntry.php | 5 +- libs/Zend/Gdata/Books/CollectionFeed.php | 7 +- .../Gdata/Books/Extension/AnnotationLink.php | 5 +- .../Gdata/Books/Extension/BooksCategory.php | 9 +- libs/Zend/Gdata/Books/Extension/BooksLink.php | 9 +- .../Gdata/Books/Extension/Embeddability.php | 5 +- libs/Zend/Gdata/Books/Extension/InfoLink.php | 5 +- .../Gdata/Books/Extension/PreviewLink.php | 5 +- libs/Zend/Gdata/Books/Extension/Review.php | 5 +- .../Gdata/Books/Extension/ThumbnailLink.php | 5 +- .../Gdata/Books/Extension/Viewability.php | 7 +- libs/Zend/Gdata/Books/VolumeEntry.php | 5 +- libs/Zend/Gdata/Books/VolumeFeed.php | 5 +- libs/Zend/Gdata/Books/VolumeQuery.php | 1 + libs/Zend/Gdata/Calendar.php | 9 +- libs/Zend/Gdata/Calendar/EventEntry.php | 9 +- libs/Zend/Gdata/Calendar/EventFeed.php | 6 +- libs/Zend/Gdata/Calendar/EventQuery.php | 5 +- .../Gdata/Calendar/Extension/AccessLevel.php | 6 +- libs/Zend/Gdata/Calendar/Extension/Color.php | 6 +- libs/Zend/Gdata/Calendar/Extension/Hidden.php | 6 +- libs/Zend/Gdata/Calendar/Extension/Link.php | 6 +- .../Gdata/Calendar/Extension/QuickAdd.php | 6 +- .../Gdata/Calendar/Extension/Selected.php | 6 +- .../Extension/SendEventNotifications.php | 6 +- .../Gdata/Calendar/Extension/Timezone.php | 6 +- .../Gdata/Calendar/Extension/WebContent.php | 6 +- libs/Zend/Gdata/Calendar/ListEntry.php | 5 +- libs/Zend/Gdata/Calendar/ListFeed.php | 5 +- libs/Zend/Gdata/ClientLogin.php | 7 +- libs/Zend/Gdata/Docs.php | 1 + libs/Zend/Gdata/Docs/DocumentListEntry.php | 5 +- libs/Zend/Gdata/Docs/DocumentListFeed.php | 5 +- libs/Zend/Gdata/Docs/Query.php | 1 + libs/Zend/Gdata/DublinCore.php | 12 +- .../Gdata/DublinCore/Extension/Creator.php | 5 +- libs/Zend/Gdata/DublinCore/Extension/Date.php | 5 +- .../DublinCore/Extension/Description.php | 5 +- .../Gdata/DublinCore/Extension/Format.php | 5 +- .../Gdata/DublinCore/Extension/Identifier.php | 5 +- .../Gdata/DublinCore/Extension/Language.php | 5 +- .../Gdata/DublinCore/Extension/Publisher.php | 5 +- .../Gdata/DublinCore/Extension/Rights.php | 5 +- .../Gdata/DublinCore/Extension/Subject.php | 5 +- .../Zend/Gdata/DublinCore/Extension/Title.php | 5 +- libs/Zend/Gdata/Entry.php | 13 +- libs/Zend/Gdata/Exif.php | 11 +- libs/Zend/Gdata/Exif/Entry.php | 35 +- libs/Zend/Gdata/Exif/Extension/Distance.php | 11 +- libs/Zend/Gdata/Exif/Extension/Exposure.php | 11 +- libs/Zend/Gdata/Exif/Extension/FStop.php | 11 +- libs/Zend/Gdata/Exif/Extension/Flash.php | 11 +- .../Zend/Gdata/Exif/Extension/FocalLength.php | 11 +- .../Gdata/Exif/Extension/ImageUniqueId.php | 11 +- libs/Zend/Gdata/Exif/Extension/Iso.php | 11 +- libs/Zend/Gdata/Exif/Extension/Make.php | 11 +- libs/Zend/Gdata/Exif/Extension/Model.php | 11 +- libs/Zend/Gdata/Exif/Extension/Tags.php | 117 +- libs/Zend/Gdata/Exif/Extension/Time.php | 11 +- libs/Zend/Gdata/Exif/Feed.php | 9 +- libs/Zend/Gdata/Extension.php | 13 +- libs/Zend/Gdata/Extension/AttendeeStatus.php | 2 + libs/Zend/Gdata/Extension/AttendeeType.php | 4 +- libs/Zend/Gdata/Extension/Comments.php | 2 + libs/Zend/Gdata/Extension/EntryLink.php | 2 + libs/Zend/Gdata/Extension/EventStatus.php | 2 + .../Zend/Gdata/Extension/ExtendedProperty.php | 2 + libs/Zend/Gdata/Extension/FeedLink.php | 2 + .../Extension/OpenSearchItemsPerPage.php | 2 + .../Gdata/Extension/OpenSearchStartIndex.php | 2 + .../Extension/OpenSearchTotalResults.php | 2 + libs/Zend/Gdata/Extension/OriginalEvent.php | 2 + libs/Zend/Gdata/Extension/Rating.php | 5 +- libs/Zend/Gdata/Extension/Recurrence.php | 2 + .../Gdata/Extension/RecurrenceException.php | 12 + libs/Zend/Gdata/Extension/Reminder.php | 2 + libs/Zend/Gdata/Extension/Transparency.php | 4 +- libs/Zend/Gdata/Extension/Visibility.php | 4 +- libs/Zend/Gdata/Extension/When.php | 6 +- libs/Zend/Gdata/Extension/Where.php | 7 + libs/Zend/Gdata/Extension/Who.php | 7 + libs/Zend/Gdata/Feed.php | 95 +- libs/Zend/Gdata/Gapps.php | 386 +- libs/Zend/Gdata/Gapps/EmailListEntry.php | 73 +- libs/Zend/Gdata/Gapps/EmailListFeed.php | 1 + libs/Zend/Gdata/Gapps/EmailListQuery.php | 1 + .../Gdata/Gapps/EmailListRecipientEntry.php | 43 +- .../Gdata/Gapps/EmailListRecipientFeed.php | 1 + .../Gdata/Gapps/EmailListRecipientQuery.php | 1 + libs/Zend/Gdata/Gapps/Error.php | 1 + libs/Zend/Gdata/Gapps/Extension/EmailList.php | 37 +- libs/Zend/Gdata/Gapps/Extension/Login.php | 135 +- libs/Zend/Gdata/Gapps/Extension/Name.php | 41 +- libs/Zend/Gdata/Gapps/Extension/Nickname.php | 33 +- libs/Zend/Gdata/Gapps/Extension/Quota.php | 35 +- libs/Zend/Gdata/Gapps/NicknameEntry.php | 49 +- libs/Zend/Gdata/Gapps/NicknameFeed.php | 1 + libs/Zend/Gdata/Gapps/NicknameQuery.php | 1 + libs/Zend/Gdata/Gapps/Query.php | 1 + libs/Zend/Gdata/Gapps/ServiceException.php | 1 + libs/Zend/Gdata/Gapps/UserEntry.php | 95 +- libs/Zend/Gdata/Gapps/UserFeed.php | 1 + libs/Zend/Gdata/Gapps/UserQuery.php | 1 + libs/Zend/Gdata/Gbase.php | 13 +- libs/Zend/Gdata/Gbase/Entry.php | 13 +- .../Gdata/Gbase/Extension/BaseAttribute.php | 19 +- libs/Zend/Gdata/Gbase/Feed.php | 7 +- libs/Zend/Gdata/Gbase/ItemEntry.php | 1 + libs/Zend/Gdata/Gbase/ItemFeed.php | 1 + libs/Zend/Gdata/Gbase/ItemQuery.php | 1 + libs/Zend/Gdata/Gbase/Query.php | 1 + libs/Zend/Gdata/Gbase/SnippetEntry.php | 1 + libs/Zend/Gdata/Gbase/SnippetFeed.php | 1 + libs/Zend/Gdata/Gbase/SnippetQuery.php | 1 + libs/Zend/Gdata/Geo.php | 16 +- libs/Zend/Gdata/Geo/Entry.php | 9 +- libs/Zend/Gdata/Geo/Extension/GeoRssWhere.php | 25 +- libs/Zend/Gdata/Geo/Extension/GmlPoint.php | 25 +- libs/Zend/Gdata/Geo/Extension/GmlPos.php | 11 +- libs/Zend/Gdata/Geo/Feed.php | 5 +- libs/Zend/Gdata/Health.php | 273 ++ libs/Zend/Gdata/Health/Extension/Ccr.php | 125 + libs/Zend/Gdata/Health/ProfileEntry.php | 134 + libs/Zend/Gdata/Health/ProfileFeed.php | 66 + libs/Zend/Gdata/Health/ProfileListEntry.php | 99 + libs/Zend/Gdata/Health/ProfileListFeed.php | 52 + libs/Zend/Gdata/Health/Query.php | 284 ++ libs/Zend/Gdata/HttpAdapterStreamingProxy.php | 126 + .../Zend/Gdata/HttpAdapterStreamingSocket.php | 110 + libs/Zend/Gdata/HttpClient.php | 143 +- libs/Zend/Gdata/Kind/EventEntry.php | 9 +- libs/Zend/Gdata/Media.php | 9 +- libs/Zend/Gdata/Media/Entry.php | 7 +- .../Gdata/Media/Extension/MediaCategory.php | 19 +- .../Gdata/Media/Extension/MediaContent.php | 27 +- .../Gdata/Media/Extension/MediaCopyright.php | 19 +- .../Gdata/Media/Extension/MediaCredit.php | 15 +- .../Media/Extension/MediaDescription.php | 15 +- .../Zend/Gdata/Media/Extension/MediaGroup.php | 71 +- libs/Zend/Gdata/Media/Extension/MediaHash.php | 17 +- .../Gdata/Media/Extension/MediaKeywords.php | 5 +- .../Gdata/Media/Extension/MediaPlayer.php | 21 +- .../Gdata/Media/Extension/MediaRating.php | 15 +- .../Media/Extension/MediaRestriction.php | 5 +- libs/Zend/Gdata/Media/Extension/MediaText.php | 19 +- .../Gdata/Media/Extension/MediaThumbnail.php | 21 +- .../Zend/Gdata/Media/Extension/MediaTitle.php | 17 +- libs/Zend/Gdata/Media/Feed.php | 7 +- libs/Zend/Gdata/MediaMimeStream.php | 189 + libs/Zend/Gdata/MimeBodyString.php | 91 + libs/Zend/Gdata/MimeFile.php | 65 + libs/Zend/Gdata/Photos.php | 107 +- libs/Zend/Gdata/Photos/AlbumEntry.php | 85 +- libs/Zend/Gdata/Photos/AlbumFeed.php | 53 +- libs/Zend/Gdata/Photos/AlbumQuery.php | 1 + libs/Zend/Gdata/Photos/CommentEntry.php | 23 +- libs/Zend/Gdata/Photos/Extension/Access.php | 13 +- libs/Zend/Gdata/Photos/Extension/AlbumId.php | 15 +- .../Zend/Gdata/Photos/Extension/BytesUsed.php | 11 +- libs/Zend/Gdata/Photos/Extension/Checksum.php | 11 +- libs/Zend/Gdata/Photos/Extension/Client.php | 11 +- .../Gdata/Photos/Extension/CommentCount.php | 15 +- .../Photos/Extension/CommentingEnabled.php | 11 +- libs/Zend/Gdata/Photos/Extension/Height.php | 11 +- libs/Zend/Gdata/Photos/Extension/Id.php | 11 +- libs/Zend/Gdata/Photos/Extension/Location.php | 11 +- .../Photos/Extension/MaxPhotosPerAlbum.php | 11 +- libs/Zend/Gdata/Photos/Extension/Name.php | 13 +- libs/Zend/Gdata/Photos/Extension/Nickname.php | 11 +- .../Zend/Gdata/Photos/Extension/NumPhotos.php | 11 +- .../Photos/Extension/NumPhotosRemaining.php | 11 +- libs/Zend/Gdata/Photos/Extension/PhotoId.php | 11 +- libs/Zend/Gdata/Photos/Extension/Position.php | 11 +- .../Gdata/Photos/Extension/QuotaCurrent.php | 11 +- .../Gdata/Photos/Extension/QuotaLimit.php | 11 +- libs/Zend/Gdata/Photos/Extension/Rotation.php | 11 +- libs/Zend/Gdata/Photos/Extension/Size.php | 11 +- .../Zend/Gdata/Photos/Extension/Thumbnail.php | 11 +- .../Zend/Gdata/Photos/Extension/Timestamp.php | 11 +- libs/Zend/Gdata/Photos/Extension/User.php | 11 +- libs/Zend/Gdata/Photos/Extension/Version.php | 11 +- libs/Zend/Gdata/Photos/Extension/Weight.php | 11 +- libs/Zend/Gdata/Photos/Extension/Width.php | 11 +- libs/Zend/Gdata/Photos/PhotoEntry.php | 81 +- libs/Zend/Gdata/Photos/PhotoFeed.php | 41 +- libs/Zend/Gdata/Photos/PhotoQuery.php | 1 + libs/Zend/Gdata/Photos/TagEntry.php | 19 +- libs/Zend/Gdata/Photos/UserEntry.php | 57 +- libs/Zend/Gdata/Photos/UserFeed.php | 29 +- libs/Zend/Gdata/Photos/UserQuery.php | 1 + libs/Zend/Gdata/Query.php | 2 + libs/Zend/Gdata/Spreadsheets.php | 32 +- libs/Zend/Gdata/Spreadsheets/CellEntry.php | 5 +- libs/Zend/Gdata/Spreadsheets/CellFeed.php | 5 +- libs/Zend/Gdata/Spreadsheets/CellQuery.php | 1 + .../Zend/Gdata/Spreadsheets/DocumentQuery.php | 1 + .../Gdata/Spreadsheets/Extension/Cell.php | 6 +- .../Gdata/Spreadsheets/Extension/ColCount.php | 6 +- .../Gdata/Spreadsheets/Extension/Custom.php | 6 +- .../Gdata/Spreadsheets/Extension/RowCount.php | 6 +- libs/Zend/Gdata/Spreadsheets/ListEntry.php | 11 +- libs/Zend/Gdata/Spreadsheets/ListFeed.php | 5 +- libs/Zend/Gdata/Spreadsheets/ListQuery.php | 1 + .../Gdata/Spreadsheets/SpreadsheetEntry.php | 7 +- .../Gdata/Spreadsheets/SpreadsheetFeed.php | 5 +- .../Gdata/Spreadsheets/WorksheetEntry.php | 19 +- .../Zend/Gdata/Spreadsheets/WorksheetFeed.php | 7 +- libs/Zend/Gdata/YouTube.php | 343 +- libs/Zend/Gdata/YouTube/ActivityEntry.php | 231 + libs/Zend/Gdata/YouTube/ActivityFeed.php | 65 + libs/Zend/Gdata/YouTube/CommentEntry.php | 12 + libs/Zend/Gdata/YouTube/CommentFeed.php | 5 +- libs/Zend/Gdata/YouTube/ContactEntry.php | 13 +- libs/Zend/Gdata/YouTube/ContactFeed.php | 5 +- libs/Zend/Gdata/YouTube/Extension/AboutMe.php | 50 + libs/Zend/Gdata/YouTube/Extension/Age.php | 5 +- libs/Zend/Gdata/YouTube/Extension/Books.php | 7 +- libs/Zend/Gdata/YouTube/Extension/Company.php | 5 +- libs/Zend/Gdata/YouTube/Extension/Control.php | 7 +- .../Gdata/YouTube/Extension/CountHint.php | 50 + .../Gdata/YouTube/Extension/Description.php | 5 +- .../Zend/Gdata/YouTube/Extension/Duration.php | 21 +- .../Gdata/YouTube/Extension/FirstName.php | 50 + libs/Zend/Gdata/YouTube/Extension/Gender.php | 5 +- libs/Zend/Gdata/YouTube/Extension/Hobbies.php | 5 +- .../Zend/Gdata/YouTube/Extension/Hometown.php | 5 +- .../Zend/Gdata/YouTube/Extension/LastName.php | 50 + libs/Zend/Gdata/YouTube/Extension/Link.php | 7 +- .../Zend/Gdata/YouTube/Extension/Location.php | 5 +- .../Gdata/YouTube/Extension/MediaContent.php | 11 +- .../Gdata/YouTube/Extension/MediaCredit.php | 188 + .../Gdata/YouTube/Extension/MediaGroup.php | 194 +- .../Gdata/YouTube/Extension/MediaRating.php | 149 + libs/Zend/Gdata/YouTube/Extension/Movies.php | 5 +- libs/Zend/Gdata/YouTube/Extension/Music.php | 5 +- libs/Zend/Gdata/YouTube/Extension/NoEmbed.php | 9 +- .../Gdata/YouTube/Extension/Occupation.php | 5 +- .../Gdata/YouTube/Extension/PlaylistId.php | 50 + .../Gdata/YouTube/Extension/PlaylistTitle.php | 50 + .../Zend/Gdata/YouTube/Extension/Position.php | 11 +- libs/Zend/Gdata/YouTube/Extension/Private.php | 13 +- .../Gdata/YouTube/Extension/QueryString.php | 50 + libs/Zend/Gdata/YouTube/Extension/Racy.php | 21 +- .../Zend/Gdata/YouTube/Extension/Recorded.php | 5 +- .../Gdata/YouTube/Extension/Relationship.php | 5 +- .../Gdata/YouTube/Extension/ReleaseDate.php | 5 +- libs/Zend/Gdata/YouTube/Extension/School.php | 5 +- libs/Zend/Gdata/YouTube/Extension/State.php | 29 +- .../Gdata/YouTube/Extension/Statistics.php | 208 +- libs/Zend/Gdata/YouTube/Extension/Status.php | 5 +- libs/Zend/Gdata/YouTube/Extension/Token.php | 7 +- .../Zend/Gdata/YouTube/Extension/Uploaded.php | 50 + .../Zend/Gdata/YouTube/Extension/Username.php | 5 +- libs/Zend/Gdata/YouTube/Extension/VideoId.php | 50 + libs/Zend/Gdata/YouTube/InboxEntry.php | 280 ++ libs/Zend/Gdata/YouTube/InboxFeed.php | 67 + libs/Zend/Gdata/YouTube/MediaEntry.php | 1 + libs/Zend/Gdata/YouTube/PlaylistListEntry.php | 125 +- libs/Zend/Gdata/YouTube/PlaylistListFeed.php | 5 +- .../Zend/Gdata/YouTube/PlaylistVideoEntry.php | 15 +- libs/Zend/Gdata/YouTube/PlaylistVideoFeed.php | 5 +- libs/Zend/Gdata/YouTube/SubscriptionEntry.php | 305 +- libs/Zend/Gdata/YouTube/SubscriptionFeed.php | 5 +- libs/Zend/Gdata/YouTube/UserProfileEntry.php | 472 +- libs/Zend/Gdata/YouTube/VideoEntry.php | 86 +- libs/Zend/Gdata/YouTube/VideoFeed.php | 5 +- libs/Zend/Gdata/YouTube/VideoQuery.php | 316 +- libs/Zend/Http/Client.php | 111 +- libs/Zend/Http/Client/Adapter/Curl.php | 392 ++ libs/Zend/Http/Client/Adapter/Socket.php | 57 +- libs/Zend/Http/Cookie.php | 31 +- libs/Zend/Http/CookieJar.php | 53 +- libs/Zend/Http/Response.php | 12 +- libs/Zend/InfoCard.php | 61 +- libs/Zend/InfoCard/Adapter/Default.php | 7 +- libs/Zend/InfoCard/Cipher.php | 8 +- .../InfoCard/Cipher/Pki/Adapter/Abstract.php | 9 +- libs/Zend/InfoCard/Cipher/Pki/Adapter/Rsa.php | 7 +- .../Cipher/Symmetric/Adapter/Aes256cbc.php | 11 +- libs/Zend/InfoCard/Claims.php | 20 +- libs/Zend/InfoCard/Xml/Assertion.php | 9 +- libs/Zend/InfoCard/Xml/Element.php | 21 +- libs/Zend/InfoCard/Xml/EncryptedData.php | 10 +- libs/Zend/InfoCard/Xml/Security.php | 27 +- libs/Zend/InfoCard/Xml/Security/Transform.php | 14 +- .../Security/Transform/EnvelopedSignature.php | 8 +- .../Xml/Security/Transform/XmlExcC14N.php | 8 +- libs/Zend/Json.php | 392 +- libs/Zend/Json/Decoder.php | 142 +- libs/Zend/Json/Encoder.php | 167 +- libs/Zend/Json/Expr.php | 80 + libs/Zend/Json/Server/Request.php | 2 +- libs/Zend/Layout.php | 16 +- libs/Zend/Loader.php | 45 +- libs/Zend/Loader/Autoloader.php | 464 ++ libs/Zend/Loader/Autoloader/Interface.php | 34 + libs/Zend/Loader/Autoloader/Resource.php | 436 ++ libs/Zend/Loader/PluginLoader.php | 22 +- libs/Zend/Locale.php | 72 +- libs/Zend/Locale/Data.php | 179 +- libs/Zend/Locale/Format.php | 121 +- libs/Zend/Locale/Math.php | 163 +- libs/Zend/Log.php | 9 +- libs/Zend/Log/Filter/Message.php | 5 +- libs/Zend/Log/Filter/Priority.php | 5 +- libs/Zend/Log/Formatter/Firebug.php | 49 + libs/Zend/Log/Formatter/Simple.php | 10 +- libs/Zend/Log/Writer/Abstract.php | 10 +- libs/Zend/Log/Writer/Db.php | 8 +- libs/Zend/Log/Writer/Firebug.php | 26 +- libs/Zend/Log/Writer/Mail.php | 278 ++ libs/Zend/Log/Writer/Stream.php | 8 +- libs/Zend/Mail.php | 425 +- libs/Zend/Mail/Part.php | 39 +- libs/Zend/Mail/Transport/Abstract.php | 10 +- libs/Zend/Mail/Transport/Smtp.php | 12 +- libs/Zend/Measure/Acceleration.php | 3 +- libs/Zend/Measure/Angle.php | 3 +- libs/Zend/Measure/Area.php | 3 +- libs/Zend/Measure/Binary.php | 3 +- libs/Zend/Measure/Capacitance.php | 3 +- libs/Zend/Measure/Cooking/Volume.php | 3 +- libs/Zend/Measure/Cooking/Weight.php | 3 +- libs/Zend/Measure/Current.php | 3 +- libs/Zend/Measure/Density.php | 3 +- libs/Zend/Measure/Energy.php | 3 +- libs/Zend/Measure/Flow/Mass.php | 3 +- libs/Zend/Measure/Flow/Mole.php | 3 +- libs/Zend/Measure/Flow/Volume.php | 3 +- libs/Zend/Measure/Force.php | 3 +- libs/Zend/Measure/Frequency.php | 3 +- libs/Zend/Measure/Illumination.php | 3 +- libs/Zend/Measure/Length.php | 3 +- libs/Zend/Measure/Lightness.php | 3 +- libs/Zend/Measure/Power.php | 3 +- libs/Zend/Measure/Pressure.php | 3 +- libs/Zend/Measure/Speed.php | 3 +- libs/Zend/Measure/Temperature.php | 3 +- libs/Zend/Measure/Time.php | 1 - libs/Zend/Measure/Torque.php | 3 +- libs/Zend/Measure/Viscosity/Dynamic.php | 3 +- libs/Zend/Measure/Viscosity/Kinematic.php | 3 +- libs/Zend/Measure/Volume.php | 3 +- libs/Zend/Measure/Weight.php | 3 +- libs/Zend/Memory.php | 5 +- libs/Zend/Memory/Container.php | 4 - libs/Zend/Memory/Container/Locked.php | 4 - libs/Zend/Memory/Container/Movable.php | 7 +- libs/Zend/Memory/Manager.php | 1 + libs/Zend/Mime.php | 121 +- libs/Zend/Mime/Message.php | 3 +- libs/Zend/Mime/Part.php | 14 +- libs/Zend/Navigation.php | 53 + libs/Zend/Navigation/Container.php | 500 +++ libs/Zend/Navigation/Exception.php | 37 + libs/Zend/Navigation/Page.php | 1118 +++++ libs/Zend/Navigation/Page/Mvc.php | 439 ++ libs/Zend/Navigation/Page/Uri.php | 99 + libs/Zend/OpenId.php | 62 +- libs/Zend/OpenId/Consumer.php | 95 +- libs/Zend/OpenId/Consumer/Storage/File.php | 25 +- libs/Zend/OpenId/Extension.php | 4 +- libs/Zend/OpenId/Provider.php | 4 +- libs/Zend/OpenId/Provider/Storage/File.php | 6 +- libs/Zend/Paginator.php | 411 +- libs/Zend/Paginator/Adapter/DbSelect.php | 130 +- libs/Zend/Pdf.php | 23 +- libs/Zend/Pdf/Cmap.php | 16 +- libs/Zend/Pdf/Color/Cmyk.php | 5 - libs/Zend/Pdf/Color/GrayScale.php | 5 - libs/Zend/Pdf/Color/Html.php | 6 +- libs/Zend/Pdf/Color/Rgb.php | 5 - libs/Zend/Pdf/FileParser.php | 11 +- libs/Zend/Pdf/FileParser/Font.php | 6 +- libs/Zend/Pdf/FileParser/Font/OpenType.php | 8 +- libs/Zend/Pdf/FileParser/Image.php | 19 +- libs/Zend/Pdf/FileParserDataSource.php | 7 +- libs/Zend/Pdf/Filter/Interface.php | 5 - libs/Zend/Pdf/Font.php | 12 +- libs/Zend/Pdf/Image.php | 2 +- libs/Zend/Pdf/Page.php | 174 +- libs/Zend/Pdf/Resource/Font.php | 18 +- libs/Zend/Pdf/Resource/Image/Jpeg.php | 8 +- libs/Zend/Pdf/Resource/Image/Png.php | 14 +- libs/Zend/Pdf/Resource/Image/Tiff.php | 23 +- libs/Zend/Pdf/Style.php | 2 +- libs/Zend/ProgressBar.php | 48 +- libs/Zend/ProgressBar/Adapter.php | 22 +- libs/Zend/ProgressBar/Adapter/Console.php | 235 +- libs/Zend/ProgressBar/Adapter/JsPull.php | 20 +- libs/Zend/ProgressBar/Adapter/JsPush.php | 34 +- libs/Zend/Reflection/Class.php | 247 ++ libs/Zend/Reflection/Docblock.php | 282 ++ libs/Zend/Reflection/Docblock/Tag.php | 140 + libs/Zend/Reflection/Docblock/Tag/Param.php | 93 + libs/Zend/Reflection/Docblock/Tag/Return.php | 72 + libs/Zend/Reflection/Exception.php | 36 + libs/Zend/Reflection/Extension.php | 85 + libs/Zend/Reflection/File.php | 410 ++ libs/Zend/Reflection/Function.php | 129 + libs/Zend/Reflection/Method.php | 185 + libs/Zend/Reflection/Parameter.php | 119 + libs/Zend/Reflection/Property.php | 68 + libs/Zend/Registry.php | 8 +- libs/Zend/Rest/Client.php | 1 + libs/Zend/Rest/Server.php | 27 +- libs/Zend/Search/Lucene.php | 176 +- .../Lucene/Analysis/Analyzer/Common.php | 2 +- .../Lucene/Analysis/TokenFilter/StopWords.php | 12 +- libs/Zend/Search/Lucene/Document/Docx.php | 192 +- .../Zend/Search/Lucene/Document/Exception.php | 36 + libs/Zend/Search/Lucene/Document/Html.php | 170 +- libs/Zend/Search/Lucene/Document/OpenXml.php | 2 +- libs/Zend/Search/Lucene/Document/Pptx.php | 38 +- libs/Zend/Search/Lucene/Document/Xlsx.php | 50 +- libs/Zend/Search/Lucene/FSM.php | 19 +- .../Search/Lucene/Index/DictionaryLoader.php | 19 +- libs/Zend/Search/Lucene/Index/SegmentInfo.php | 327 +- .../Search/Lucene/Index/SegmentMerger.php | 15 +- .../Search/Lucene/Index/SegmentWriter.php | 5 - .../Index/SegmentWriter/DocumentWriter.php | 6 +- .../Index/SegmentWriter/StreamWriter.php | 5 - .../Lucene/Index/TermsPriorityQueue.php | 48 + .../Lucene/Index/TermsStream/Interface.php | 65 + libs/Zend/Search/Lucene/Index/Writer.php | 50 +- libs/Zend/Search/Lucene/Interface.php | 42 +- libs/Zend/Search/Lucene/LockManager.php | 11 +- libs/Zend/Search/Lucene/MultiSearcher.php | 962 ++++ .../Search/BooleanExpressionRecognizer.php | 5 +- .../Lucene/Search/Highlighter/Default.php | 93 + .../Lucene/Search/Highlighter/Interface.php | 52 + libs/Zend/Search/Lucene/Search/Query.php | 76 +- .../Search/Lucene/Search/Query/Boolean.php | 15 +- .../Zend/Search/Lucene/Search/Query/Empty.php | 7 +- .../Zend/Search/Lucene/Search/Query/Fuzzy.php | 130 +- .../Lucene/Search/Query/Insignificant.php | 7 +- .../Search/Lucene/Search/Query/MultiTerm.php | 16 +- .../Search/Lucene/Search/Query/Phrase.php | 22 +- .../Lucene/Search/Query/Preprocessing.php | 133 + .../Search/Query/Preprocessing/Fuzzy.php | 286 ++ .../Search/Query/Preprocessing/Phrase.php | 273 ++ .../Search/Query/Preprocessing/Term.php | 334 ++ .../Zend/Search/Lucene/Search/Query/Range.php | 61 +- libs/Zend/Search/Lucene/Search/Query/Term.php | 33 +- .../Search/Lucene/Search/Query/Wildcard.php | 68 +- libs/Zend/Search/Lucene/Search/QueryEntry.php | 9 - .../Lucene/Search/QueryEntry/Phrase.php | 40 +- .../Lucene/Search/QueryEntry/Subquery.php | 9 +- .../Search/Lucene/Search/QueryEntry/Term.php | 106 +- libs/Zend/Search/Lucene/Search/QueryLexer.php | 14 +- .../Zend/Search/Lucene/Search/QueryParser.php | 75 +- .../Lucene/Search/QueryParserContext.php | 17 +- libs/Zend/Search/Lucene/Search/QueryToken.php | 8 +- .../Lucene/Storage/Directory/Filesystem.php | 2 +- libs/Zend/Search/Lucene/Storage/File.php | 105 +- .../Search/Lucene/Storage/File/Filesystem.php | 7 +- .../Search/Lucene/Storage/File/Memory.php | 103 +- .../Lucene/TermStreamsPriorityQueue.php | 175 + libs/Zend/Server/Abstract.php | 4 +- libs/Zend/Server/Reflection.php | 11 +- libs/Zend/Server/Reflection/Class.php | 9 +- libs/Zend/Server/Reflection/Exception.php | 2 +- libs/Zend/Server/Reflection/Function.php | 2 +- .../Server/Reflection/Function/Abstract.php | 14 +- libs/Zend/Server/Reflection/Method.php | 2 +- libs/Zend/Server/Reflection/Node.php | 2 +- libs/Zend/Server/Reflection/Parameter.php | 10 +- libs/Zend/Server/Reflection/Prototype.php | 9 +- libs/Zend/Server/Reflection/ReturnValue.php | 9 +- libs/Zend/Service/Amazon.php | 17 +- libs/Zend/Service/Amazon/Abstract.php | 167 + libs/Zend/Service/Amazon/Accessories.php | 12 +- libs/Zend/Service/Amazon/CustomerReview.php | 37 +- libs/Zend/Service/Amazon/Ec2.php | 87 + libs/Zend/Service/Amazon/Ec2/Abstract.php | 201 + .../Service/Amazon/Ec2/Availabilityzones.php | 73 + libs/Zend/Service/Amazon/Ec2/Ebs.php | 340 ++ libs/Zend/Service/Amazon/Ec2/Elasticip.php | 155 + libs/Zend/Service/Amazon/Ec2/Exception.php | 48 + libs/Zend/Service/Amazon/Ec2/Image.php | 330 ++ libs/Zend/Service/Amazon/Ec2/Instance.php | 444 ++ libs/Zend/Service/Amazon/Ec2/Keypair.php | 134 + libs/Zend/Service/Amazon/Ec2/Region.php | 73 + libs/Zend/Service/Amazon/Ec2/Response.php | 139 + .../Service/Amazon/Ec2/Securitygroups.php | 288 ++ libs/Zend/Service/Amazon/EditorialReview.php | 12 +- libs/Zend/Service/Amazon/Exception.php | 35 + libs/Zend/Service/Amazon/Item.php | 78 +- libs/Zend/Service/Amazon/ListmaniaList.php | 12 +- libs/Zend/Service/Amazon/Offer.php | 47 +- libs/Zend/Service/Amazon/OfferSet.php | 47 +- libs/Zend/Service/Amazon/S3.php | 802 ++++ libs/Zend/Service/Amazon/S3/Exception.php | 37 + libs/Zend/Service/Amazon/S3/Stream.php | 497 +++ libs/Zend/Service/Amazon/SimilarProduct.php | 17 +- libs/Zend/Service/Audioscrobbler.php | 259 +- libs/Zend/Service/Nirvanix.php | 10 +- libs/Zend/Service/Simpy.php | 38 +- libs/Zend/Service/Simpy/Watchlist.php | 4 +- libs/Zend/Service/SlideShare.php | 28 +- libs/Zend/Service/StrikeIron.php | 13 +- libs/Zend/Service/Technorati.php | 194 +- libs/Zend/Service/Twitter.php | 52 +- libs/Zend/Service/Twitter/Exception.php | 2 +- libs/Zend/Service/Yahoo.php | 11 +- libs/Zend/Service/Yahoo/WebResult.php | 17 +- libs/Zend/Session.php | 19 +- libs/Zend/Session/Namespace.php | 10 +- libs/Zend/Soap/AutoDiscover.php | 127 +- libs/Zend/Soap/AutoDiscover/Exception.php | 9 +- libs/Zend/Soap/Client.php | 204 +- libs/Zend/Soap/Client/Common.php | 2 + libs/Zend/Soap/Client/DotNet.php | 18 +- libs/Zend/Soap/Client/Exception.php | 2 + libs/Zend/Soap/Client/Local.php | 7 +- libs/Zend/Soap/Server.php | 150 +- libs/Zend/Soap/Server/Exception.php | 4 +- libs/Zend/Soap/Wsdl.php | 29 +- libs/Zend/Soap/Wsdl/Strategy/Abstract.php | 36 + libs/Zend/Soap/Wsdl/Strategy/AnyType.php | 2 + .../Soap/Wsdl/Strategy/ArrayOfTypeComplex.php | 57 +- .../Wsdl/Strategy/ArrayOfTypeSequence.php | 4 +- libs/Zend/Soap/Wsdl/Strategy/Composite.php | 174 + .../Soap/Wsdl/Strategy/DefaultComplexType.php | 4 +- libs/Zend/Soap/Wsdl/Strategy/Interface.php | 5 + libs/Zend/Tag/Cloud.php | 410 ++ libs/Zend/Tag/Cloud/Decorator/Cloud.php | 88 + libs/Zend/Tag/Cloud/Decorator/Exception.php | 39 + libs/Zend/Tag/Cloud/Decorator/HtmlCloud.php | 127 + libs/Zend/Tag/Cloud/Decorator/HtmlTag.php | 278 ++ libs/Zend/Tag/Cloud/Decorator/Tag.php | 88 + libs/Zend/Tag/Cloud/Exception.php | 38 + libs/Zend/Tag/Exception.php | 38 + libs/Zend/Tag/Item.php | 220 + libs/Zend/Tag/ItemList.php | 238 + libs/Zend/Tag/Taggable.php | 60 + libs/Zend/Test/PHPUnit/ControllerTestCase.php | 3 +- libs/Zend/Text/MultiByte.php | 153 + libs/Zend/Text/Table/Column.php | 29 +- libs/Zend/TimeSync.php | 26 +- libs/Zend/TimeSync/Ntp.php | 4 +- libs/Zend/TimeSync/Sntp.php | 4 +- libs/Zend/Tool/Framework/Action/Base.php | 95 + libs/Zend/Tool/Framework/Action/Exception.php | 37 + libs/Zend/Tool/Framework/Action/Interface.php | 32 + .../Zend/Tool/Framework/Action/Repository.php | 135 + libs/Zend/Tool/Framework/Client/Abstract.php | 300 ++ libs/Zend/Tool/Framework/Client/Console.php | 257 ++ .../Client/Console/ArgumentParser.php | 503 +++ .../Framework/Client/Console/HelpSystem.php | 373 ++ .../Framework/Client/Console/Manifest.php | 209 + .../Console/ResponseDecorator/Colorizer.php | 67 + libs/Zend/Tool/Framework/Client/Exception.php | 36 + .../Client/Interactive/InputHandler.php | 49 + .../Client/Interactive/InputInterface.php | 16 + .../Client/Interactive/InputRequest.php | 29 + .../Client/Interactive/InputResponse.php | 27 + .../Client/Interactive/OutputInterface.php | 8 + libs/Zend/Tool/Framework/Client/Request.php | 299 ++ libs/Zend/Tool/Framework/Client/Response.php | 223 + .../Response/ContentDecorator/Interface.php | 10 + .../Response/ContentDecorator/Separator.php | 93 + libs/Zend/Tool/Framework/Exception.php | 36 + libs/Zend/Tool/Framework/Loader/Abstract.php | 146 + .../Framework/Loader/IncludePathLoader.php | 115 + .../RecursiveFilterIterator.php | 91 + .../Framework/Manifest/ActionManifestable.php | 47 + .../Tool/Framework/Manifest/Exception.php | 37 + .../Tool/Framework/Manifest/Indexable.php | 42 + .../Tool/Framework/Manifest/Interface.php | 57 + .../Manifest/MetadataManifestable.php | 47 + .../Manifest/ProviderManifestable.php | 47 + .../Tool/Framework/Manifest/Repository.php | 300 ++ libs/Zend/Tool/Framework/Metadata/Basic.php | 221 + libs/Zend/Tool/Framework/Metadata/Dynamic.php | 107 + .../Tool/Framework/Metadata/Interface.php | 52 + libs/Zend/Tool/Framework/Metadata/Tool.php | 218 + .../Zend/Tool/Framework/Provider/Abstract.php | 68 + .../Provider/DocblockManifestable.php | 5 + .../Tool/Framework/Provider/Exception.php | 37 + .../Tool/Framework/Provider/Interactable.php | 5 + .../Tool/Framework/Provider/Interface.php | 31 + .../Tool/Framework/Provider/Pretendable.php | 31 + .../Tool/Framework/Provider/Repository.php | 262 ++ .../Tool/Framework/Provider/Signature.php | 390 ++ libs/Zend/Tool/Framework/Registry.php | 355 ++ .../Framework/Registry/EnabledInterface.php | 40 + .../Tool/Framework/Registry/Exception.php | 8 + .../Tool/Framework/Registry/Interface.php | 112 + .../Tool/Framework/System/Action/Create.php | 44 + .../Tool/Framework/System/Action/Delete.php | 44 + libs/Zend/Tool/Framework/System/Manifest.php | 61 + .../Framework/System/Provider/Manifest.php | 114 + .../Framework/System/Provider/Phpinfo.php | 13 + .../Framework/System/Provider/Version.php | 88 + libs/Zend/Tool/Project/Context/Exception.php | 8 + .../Project/Context/Filesystem/Abstract.php | 165 + .../Project/Context/Filesystem/Directory.php | 77 + .../Tool/Project/Context/Filesystem/File.php | 112 + libs/Zend/Tool/Project/Context/Interface.php | 15 + libs/Zend/Tool/Project/Context/Repository.php | 160 + .../Tool/Project/Context/System/Interface.php | 37 + .../Context/System/NotOverwritable.php | 37 + .../Context/System/ProjectDirectory.php | 128 + .../Context/System/ProjectProfileFile.php | 118 + .../System/ProjectProvidersDirectory.php | 97 + .../Context/System/TopLevelRestrictable.php | 37 + .../Tool/Project/Context/Zf/ActionMethod.php | 224 + .../Tool/Project/Context/Zf/ApisDirectory.php | 57 + .../Context/Zf/ApplicationConfigFile.php | 108 + .../Context/Zf/ApplicationDirectory.php | 49 + .../Tool/Project/Context/Zf/BootstrapFile.php | 103 + .../Project/Context/Zf/CacheDirectory.php | 57 + .../Tool/Project/Context/Zf/ConfigFile.php | 67 + .../Project/Context/Zf/ConfigsDirectory.php | 57 + .../Project/Context/Zf/ControllerFile.php | 197 + .../Context/Zf/ControllersDirectory.php | 57 + .../Tool/Project/Context/Zf/DataDirectory.php | 57 + .../Project/Context/Zf/DbTableDirectory.php | 57 + .../Tool/Project/Context/Zf/DbTableFile.php | 72 + .../Zend/Tool/Project/Context/Zf/FormFile.php | 52 + .../Project/Context/Zf/FormsDirectory.php | 57 + .../Tool/Project/Context/Zf/HtaccessFile.php | 78 + .../Project/Context/Zf/LayoutsDirectory.php | 57 + .../Project/Context/Zf/LibraryDirectory.php | 57 + .../Project/Context/Zf/LocalesDirectory.php | 57 + .../Tool/Project/Context/Zf/LogsDirectory.php | 57 + .../Tool/Project/Context/Zf/ModelFile.php | 52 + .../Project/Context/Zf/ModelsDirectory.php | 57 + .../Project/Context/Zf/ModuleDirectory.php | 97 + .../Project/Context/Zf/ModulesDirectory.php | 57 + .../Context/Zf/ProjectProviderFile.php | 152 + .../Project/Context/Zf/PublicDirectory.php | 57 + .../Context/Zf/PublicImagesDirectory.php | 57 + .../Project/Context/Zf/PublicIndexFile.php | 95 + .../Context/Zf/PublicScriptsDirectory.php | 57 + .../Context/Zf/PublicStylesheetsDirectory.php | 57 + .../Context/Zf/SearchIndexesDirectory.php | 57 + .../Project/Context/Zf/SessionsDirectory.php | 57 + .../Project/Context/Zf/TemporaryDirectory.php | 57 + .../Zf/TestApplicationBootstrapFile.php | 57 + .../Zf/TestApplicationControllerDirectory.php | 57 + .../Zf/TestApplicationControllerFile.php | 107 + .../Context/Zf/TestApplicationDirectory.php | 57 + .../Context/Zf/TestLibraryBootstrapFile.php | 57 + .../Context/Zf/TestLibraryDirectory.php | 57 + .../Project/Context/Zf/TestLibraryFile.php | 107 + .../Zf/TestLibraryNamespaceDirectory.php | 88 + .../Context/Zf/TestPHPUnitConfigFile.php | 57 + .../Project/Context/Zf/TestsDirectory.php | 57 + .../Project/Context/Zf/UploadsDirectory.php | 57 + .../Zf/ViewControllerScriptsDirectory.php | 87 + .../Context/Zf/ViewFiltersDirectory.php | 57 + .../Context/Zf/ViewHelpersDirectory.php | 57 + .../Project/Context/Zf/ViewScriptFile.php | 205 + .../Context/Zf/ViewScriptsDirectory.php | 57 + .../Project/Context/Zf/ViewsDirectory.php | 57 + .../Context/Zf/ZfStandardLibraryDirectory.php | 104 + libs/Zend/Tool/Project/Exception.php | 37 + libs/Zend/Tool/Project/Profile.php | 240 + libs/Zend/Tool/Project/Profile/Exception.php | 37 + .../Project/Profile/FileParser/Interface.php | 54 + .../Tool/Project/Profile/FileParser/Xml.php | 223 + .../Profile/Iterator/ContextFilter.php | 203 + .../Iterator/EnabledResourceFilter.php | 43 + libs/Zend/Tool/Project/Profile/Resource.php | 262 ++ .../Project/Profile/Resource/Container.php | 405 ++ .../Profile/Resource/SearchConstraints.php | 117 + libs/Zend/Tool/Project/Provider/Abstract.php | 201 + libs/Zend/Tool/Project/Provider/Action.php | 168 + .../Zend/Tool/Project/Provider/Controller.php | 199 + libs/Zend/Tool/Project/Provider/Exception.php | 37 + libs/Zend/Tool/Project/Provider/Form.php | 38 + libs/Zend/Tool/Project/Provider/Manifest.php | 90 + libs/Zend/Tool/Project/Provider/Model.php | 43 + libs/Zend/Tool/Project/Provider/Module.php | 165 + libs/Zend/Tool/Project/Provider/Profile.php | 54 + libs/Zend/Tool/Project/Provider/Project.php | 148 + .../Tool/Project/Provider/ProjectProvider.php | 99 + libs/Zend/Tool/Project/Provider/Test.php | 174 + libs/Zend/Tool/Project/Provider/View.php | 118 + libs/Zend/Translate.php | 5 +- libs/Zend/Translate/Adapter.php | 204 +- libs/Zend/Translate/Adapter/Array.php | 15 +- libs/Zend/Translate/Adapter/Csv.php | 17 +- libs/Zend/Translate/Adapter/Gettext.php | 22 +- libs/Zend/Translate/Adapter/Ini.php | 16 +- libs/Zend/Translate/Adapter/Qt.php | 15 +- libs/Zend/Translate/Adapter/Tbx.php | 20 +- libs/Zend/Translate/Adapter/Tmx.php | 30 +- libs/Zend/Translate/Adapter/Xliff.php | 29 +- libs/Zend/Translate/Adapter/XmlTm.php | 17 +- libs/Zend/Uri.php | 12 +- libs/Zend/Uri/Http.php | 33 +- libs/Zend/Validate.php | 29 +- libs/Zend/Validate/Abstract.php | 58 +- libs/Zend/Validate/Alnum.php | 28 +- libs/Zend/Validate/Alpha.php | 25 +- libs/Zend/Validate/Barcode.php | 14 +- libs/Zend/Validate/Date.php | 25 +- libs/Zend/Validate/Db/Abstract.php | 132 + libs/Zend/Validate/Db/NoRecordExists.php | 52 + libs/Zend/Validate/Db/RecordExists.php | 53 + libs/Zend/Validate/EmailAddress.php | 51 +- libs/Zend/Validate/File/Count.php | 35 +- libs/Zend/Validate/File/MimeType.php | 56 +- libs/Zend/Validate/File/Size.php | 39 +- libs/Zend/Validate/File/Upload.php | 55 +- libs/Zend/Validate/File/WordCount.php | 101 + libs/Zend/Validate/Float.php | 53 +- libs/Zend/Validate/Hostname.php | 423 +- libs/Zend/Validate/Hostname/Biz.php | 2917 ++++++++++++ libs/Zend/Validate/Hostname/Cn.php | 2199 +++++++++ libs/Zend/Validate/Hostname/Com.php | 197 + libs/Zend/Validate/Hostname/Jp.php | 739 ++++ libs/Zend/Validate/Iban.php | 202 + libs/Zend/Validate/Int.php | 51 +- libs/Zend/Validate/Ip.php | 11 +- libs/Zend/Validate/NotEmpty.php | 10 +- libs/Zend/Validate/Sitemap/Changefreq.php | 88 + libs/Zend/Validate/Sitemap/Lastmod.php | 80 + libs/Zend/Validate/Sitemap/Loc.php | 78 + libs/Zend/Validate/Sitemap/Priority.php | 74 + libs/Zend/Validate/StringLength.php | 59 +- libs/Zend/Version.php | 6 +- libs/Zend/View/Abstract.php | 66 +- libs/Zend/View/Helper/Cycle.php | 225 + libs/Zend/View/Helper/Doctype.php | 31 +- libs/Zend/View/Helper/FormElement.php | 36 + libs/Zend/View/Helper/FormLabel.php | 3 +- libs/Zend/View/Helper/FormRadio.php | 8 +- libs/Zend/View/Helper/FormSelect.php | 6 +- libs/Zend/View/Helper/HeadLink.php | 58 +- libs/Zend/View/Helper/HeadMeta.php | 11 +- libs/Zend/View/Helper/HeadScript.php | 8 + libs/Zend/View/Helper/HeadStyle.php | 88 +- libs/Zend/View/Helper/HtmlList.php | 13 +- libs/Zend/View/Helper/Json.php | 22 +- libs/Zend/View/Helper/Navigation.php | 335 ++ .../View/Helper/Navigation/Breadcrumbs.php | 324 ++ libs/Zend/View/Helper/Navigation/Helper.php | 211 + .../View/Helper/Navigation/HelperAbstract.php | 850 ++++ libs/Zend/View/Helper/Navigation/Links.php | 778 ++++ libs/Zend/View/Helper/Navigation/Menu.php | 639 +++ libs/Zend/View/Helper/Navigation/Sitemap.php | 469 ++ libs/Zend/View/Helper/PartialLoop.php | 4 +- .../Helper/Placeholder/Container/Abstract.php | 4 +- .../Placeholder/Container/Standalone.php | 3 +- .../Zend/View/Helper/Placeholder/Registry.php | 8 +- libs/Zend/View/Helper/ServerUrl.php | 143 + libs/Zend/View/Helper/Translate.php | 4 +- libs/Zend/Wildfire/Channel/HttpHeaders.php | 112 +- libs/Zend/Wildfire/Plugin/FirePhp.php | 577 ++- libs/Zend/Wildfire/Plugin/FirePhp/Message.php | 50 + .../Wildfire/Plugin/FirePhp/TableMessage.php | 70 +- libs/Zend/Wildfire/Protocol/JsonStream.php | 63 +- libs/Zend/XmlRpc/Client.php | 40 +- .../XmlRpc/Client/ServerIntrospection.php | 8 +- libs/Zend/XmlRpc/Fault.php | 10 +- libs/Zend/XmlRpc/Request.php | 9 +- libs/Zend/XmlRpc/Server.php | 35 +- libs/Zend/XmlRpc/Server/System.php | 5 + libs/Zend/XmlRpc/Value.php | 23 +- libs/htmlpurifier/CREDITS | 9 + libs/htmlpurifier/INSTALL | 373 ++ libs/htmlpurifier/LICENSE | 504 +++ libs/htmlpurifier/NEWS | 842 ++++ .../library/HTMLPurifier.auto.php | 11 + .../library/HTMLPurifier.autoload.php | 21 + .../library/HTMLPurifier.func.php | 23 + .../library/HTMLPurifier.includes.php | 206 + .../library/HTMLPurifier.kses.php | 30 + .../library/HTMLPurifier.path.php | 11 + libs/htmlpurifier/library/HTMLPurifier.php | 236 + .../library/HTMLPurifier.safe-includes.php | 200 + .../library/HTMLPurifier/AttrCollections.php | 128 + .../library/HTMLPurifier/AttrDef.php | 87 + .../library/HTMLPurifier/AttrDef/CSS.php | 87 + .../HTMLPurifier/AttrDef/CSS/AlphaValue.php | 21 + .../HTMLPurifier/AttrDef/CSS/Background.php | 87 + .../AttrDef/CSS/BackgroundPosition.php | 126 + .../HTMLPurifier/AttrDef/CSS/Border.php | 43 + .../HTMLPurifier/AttrDef/CSS/Color.php | 78 + .../HTMLPurifier/AttrDef/CSS/Composite.php | 38 + .../AttrDef/CSS/DenyElementDecorator.php | 28 + .../HTMLPurifier/AttrDef/CSS/Filter.php | 54 + .../library/HTMLPurifier/AttrDef/CSS/Font.php | 149 + .../HTMLPurifier/AttrDef/CSS/FontFamily.php | 90 + .../AttrDef/CSS/ImportantDecorator.php | 40 + .../HTMLPurifier/AttrDef/CSS/Length.php | 47 + .../HTMLPurifier/AttrDef/CSS/ListStyle.php | 78 + .../HTMLPurifier/AttrDef/CSS/Multiple.php | 58 + .../HTMLPurifier/AttrDef/CSS/Number.php | 69 + .../HTMLPurifier/AttrDef/CSS/Percentage.php | 40 + .../AttrDef/CSS/TextDecoration.php | 38 + .../library/HTMLPurifier/AttrDef/CSS/URI.php | 56 + .../library/HTMLPurifier/AttrDef/Enum.php | 65 + .../HTMLPurifier/AttrDef/HTML/Bool.php | 28 + .../HTMLPurifier/AttrDef/HTML/Color.php | 32 + .../HTMLPurifier/AttrDef/HTML/FrameTarget.php | 21 + .../library/HTMLPurifier/AttrDef/HTML/ID.php | 70 + .../HTMLPurifier/AttrDef/HTML/Length.php | 41 + .../HTMLPurifier/AttrDef/HTML/LinkTypes.php | 53 + .../HTMLPurifier/AttrDef/HTML/MultiLength.php | 41 + .../HTMLPurifier/AttrDef/HTML/Nmtokens.php | 48 + .../HTMLPurifier/AttrDef/HTML/Pixels.php | 48 + .../library/HTMLPurifier/AttrDef/Integer.php | 73 + .../library/HTMLPurifier/AttrDef/Lang.php | 73 + .../library/HTMLPurifier/AttrDef/Switch.php | 34 + .../library/HTMLPurifier/AttrDef/Text.php | 15 + .../library/HTMLPurifier/AttrDef/URI.php | 77 + .../HTMLPurifier/AttrDef/URI/Email.php | 17 + .../AttrDef/URI/Email/SimpleCheck.php | 21 + .../library/HTMLPurifier/AttrDef/URI/Host.php | 62 + .../library/HTMLPurifier/AttrDef/URI/IPv4.php | 39 + .../library/HTMLPurifier/AttrDef/URI/IPv6.php | 99 + .../library/HTMLPurifier/AttrTransform.php | 56 + .../HTMLPurifier/AttrTransform/Background.php | 23 + .../HTMLPurifier/AttrTransform/BdoDir.php | 19 + .../HTMLPurifier/AttrTransform/BgColor.php | 23 + .../HTMLPurifier/AttrTransform/BoolToCSS.php | 36 + .../HTMLPurifier/AttrTransform/Border.php | 18 + .../HTMLPurifier/AttrTransform/EnumToCSS.php | 58 + .../AttrTransform/ImgRequired.php | 42 + .../HTMLPurifier/AttrTransform/ImgSpace.php | 44 + .../HTMLPurifier/AttrTransform/Input.php | 40 + .../HTMLPurifier/AttrTransform/Lang.php | 28 + .../HTMLPurifier/AttrTransform/Length.php | 27 + .../HTMLPurifier/AttrTransform/Name.php | 19 + .../HTMLPurifier/AttrTransform/SafeEmbed.php | 15 + .../HTMLPurifier/AttrTransform/SafeObject.php | 16 + .../HTMLPurifier/AttrTransform/SafeParam.php | 50 + .../AttrTransform/ScriptRequired.php | 16 + .../HTMLPurifier/AttrTransform/Textarea.php | 18 + .../library/HTMLPurifier/AttrTypes.php | 74 + .../library/HTMLPurifier/AttrValidator.php | 162 + .../library/HTMLPurifier/Bootstrap.php | 98 + .../library/HTMLPurifier/CSSDefinition.php | 292 ++ .../library/HTMLPurifier/ChildDef.php | 48 + .../HTMLPurifier/ChildDef/Chameleon.php | 48 + .../library/HTMLPurifier/ChildDef/Custom.php | 90 + .../library/HTMLPurifier/ChildDef/Empty.php | 20 + .../HTMLPurifier/ChildDef/Optional.php | 26 + .../HTMLPurifier/ChildDef/Required.php | 117 + .../ChildDef/StrictBlockquote.php | 88 + .../library/HTMLPurifier/ChildDef/Table.php | 142 + .../library/HTMLPurifier/Config.php | 497 +++ .../library/HTMLPurifier/ConfigSchema.php | 231 + .../ConfigSchema/Builder/ConfigSchema.php | 52 + .../HTMLPurifier/ConfigSchema/Builder/Xml.php | 108 + .../HTMLPurifier/ConfigSchema/Exception.php | 11 + .../HTMLPurifier/ConfigSchema/Interchange.php | 57 + .../ConfigSchema/Interchange/Directive.php | 77 + .../ConfigSchema/Interchange/Id.php | 31 + .../ConfigSchema/Interchange/Namespace.php | 21 + .../ConfigSchema/InterchangeBuilder.php | 176 + .../HTMLPurifier/ConfigSchema/Validator.php | 225 + .../ConfigSchema/ValidatorAtom.php | 66 + .../HTMLPurifier/ConfigSchema/schema.ser | Bin 0 -> 11324 bytes .../schema/Attr.AllowedFrameTargets.txt | 12 + .../ConfigSchema/schema/Attr.AllowedRel.txt | 9 + .../ConfigSchema/schema/Attr.AllowedRev.txt | 9 + .../schema/Attr.DefaultImageAlt.txt | 11 + .../schema/Attr.DefaultInvalidImage.txt | 9 + .../schema/Attr.DefaultInvalidImageAlt.txt | 8 + .../schema/Attr.DefaultTextDir.txt | 10 + .../ConfigSchema/schema/Attr.EnableID.txt | 16 + .../ConfigSchema/schema/Attr.IDBlacklist.txt | 5 + .../schema/Attr.IDBlacklistRegexp.txt | 9 + .../ConfigSchema/schema/Attr.IDPrefix.txt | 12 + .../schema/Attr.IDPrefixLocal.txt | 14 + .../HTMLPurifier/ConfigSchema/schema/Attr.txt | 3 + .../schema/AutoFormat.AutoParagraph.txt | 31 + .../ConfigSchema/schema/AutoFormat.Custom.txt | 12 + .../schema/AutoFormat.DisplayLinkURI.txt | 11 + .../schema/AutoFormat.Linkify.txt | 12 + .../schema/AutoFormat.PurifierLinkify.txt | 12 + .../schema/AutoFormat.RemoveEmpty.txt | 45 + .../ConfigSchema/schema/AutoFormat.txt | 3 + .../AutoFormatParam.PurifierLinkifyDocURL.txt | 12 + .../ConfigSchema/schema/AutoFormatParam.txt | 3 + .../schema/CSS.AllowImportant.txt | 8 + .../ConfigSchema/schema/CSS.AllowTricky.txt | 11 + .../schema/CSS.AllowedProperties.txt | 18 + .../ConfigSchema/schema/CSS.DefinitionRev.txt | 11 + .../ConfigSchema/schema/CSS.MaxImgLength.txt | 16 + .../ConfigSchema/schema/CSS.Proprietary.txt | 10 + .../HTMLPurifier/ConfigSchema/schema/CSS.txt | 3 + .../schema/Cache.DefinitionImpl.txt | 14 + .../schema/Cache.SerializerPath.txt | 13 + .../ConfigSchema/schema/Cache.txt | 3 + .../schema/Core.AggressivelyFixLt.txt | 18 + .../schema/Core.CollectErrors.txt | 12 + .../schema/Core.ColorKeywords.txt | 28 + .../schema/Core.ConvertDocumentToFragment.txt | 14 + .../Core.DirectLexLineNumberSyncInterval.txt | 17 + .../ConfigSchema/schema/Core.Encoding.txt | 15 + .../schema/Core.EscapeInvalidChildren.txt | 10 + .../schema/Core.EscapeInvalidTags.txt | 7 + .../schema/Core.EscapeNonASCIICharacters.txt | 13 + .../schema/Core.HiddenElements.txt | 19 + .../ConfigSchema/schema/Core.Language.txt | 10 + .../ConfigSchema/schema/Core.LexerImpl.txt | 34 + .../schema/Core.MaintainLineNumbers.txt | 16 + .../schema/Core.RemoveInvalidImg.txt | 12 + .../schema/Core.RemoveScriptContents.txt | 12 + .../HTMLPurifier/ConfigSchema/schema/Core.txt | 3 + .../ConfigSchema/schema/Filter.Custom.txt | 11 + .../schema/Filter.ExtractStyleBlocks.txt | 74 + .../ConfigSchema/schema/Filter.YouTube.txt | 11 + .../ConfigSchema/schema/Filter.txt | 3 + ...FilterParam.ExtractStyleBlocksEscaping.txt | 14 + .../FilterParam.ExtractStyleBlocksScope.txt | 29 + ...FilterParam.ExtractStyleBlocksTidyImpl.txt | 15 + .../ConfigSchema/schema/FilterParam.txt | 3 + .../ConfigSchema/schema/HTML.Allowed.txt | 22 + .../schema/HTML.AllowedAttributes.txt | 19 + .../schema/HTML.AllowedElements.txt | 18 + .../schema/HTML.AllowedModules.txt | 20 + .../ConfigSchema/schema/HTML.BlockWrapper.txt | 18 + .../ConfigSchema/schema/HTML.CoreModules.txt | 23 + .../schema/HTML.CustomDoctype.txt | 9 + .../ConfigSchema/schema/HTML.DefinitionID.txt | 33 + .../schema/HTML.DefinitionRev.txt | 16 + .../ConfigSchema/schema/HTML.Doctype.txt | 11 + .../schema/HTML.ForbiddenAttributes.txt | 21 + .../schema/HTML.ForbiddenElements.txt | 20 + .../ConfigSchema/schema/HTML.MaxImgLength.txt | 14 + .../ConfigSchema/schema/HTML.Parent.txt | 12 + .../ConfigSchema/schema/HTML.Proprietary.txt | 12 + .../ConfigSchema/schema/HTML.SafeEmbed.txt | 14 + .../ConfigSchema/schema/HTML.SafeObject.txt | 14 + .../ConfigSchema/schema/HTML.Strict.txt | 9 + .../ConfigSchema/schema/HTML.TidyAdd.txt | 8 + .../ConfigSchema/schema/HTML.TidyLevel.txt | 24 + .../ConfigSchema/schema/HTML.TidyRemove.txt | 8 + .../ConfigSchema/schema/HTML.Trusted.txt | 8 + .../ConfigSchema/schema/HTML.XHTML.txt | 11 + .../HTMLPurifier/ConfigSchema/schema/HTML.txt | 3 + .../schema/Output.CommentScriptContents.txt | 10 + .../ConfigSchema/schema/Output.Newline.txt | 13 + .../ConfigSchema/schema/Output.SortAttr.txt | 14 + .../ConfigSchema/schema/Output.TidyFormat.txt | 25 + .../ConfigSchema/schema/Output.txt | 3 + .../ConfigSchema/schema/Test.ForceNoIconv.txt | 7 + .../HTMLPurifier/ConfigSchema/schema/Test.txt | 3 + .../schema/URI.AllowedSchemes.txt | 15 + .../ConfigSchema/schema/URI.Base.txt | 17 + .../ConfigSchema/schema/URI.DefaultScheme.txt | 10 + .../ConfigSchema/schema/URI.DefinitionID.txt | 11 + .../ConfigSchema/schema/URI.DefinitionRev.txt | 11 + .../ConfigSchema/schema/URI.Disable.txt | 14 + .../schema/URI.DisableExternal.txt | 11 + .../schema/URI.DisableExternalResources.txt | 13 + .../schema/URI.DisableResources.txt | 12 + .../ConfigSchema/schema/URI.Host.txt | 19 + .../ConfigSchema/schema/URI.HostBlacklist.txt | 9 + .../ConfigSchema/schema/URI.MakeAbsolute.txt | 13 + .../ConfigSchema/schema/URI.Munge.txt | 83 + .../schema/URI.MungeResources.txt | 17 + .../schema/URI.MungeSecretKey.txt | 30 + .../schema/URI.OverrideAllowedSchemes.txt | 9 + .../HTMLPurifier/ConfigSchema/schema/URI.txt | 3 + .../HTMLPurifier/ConfigSchema/schema/info.ini | 3 + .../library/HTMLPurifier/ContentSets.php | 155 + .../library/HTMLPurifier/Context.php | 82 + .../library/HTMLPurifier/Definition.php | 39 + .../library/HTMLPurifier/DefinitionCache.php | 108 + .../DefinitionCache/Decorator.php | 62 + .../DefinitionCache/Decorator/Cleanup.php | 43 + .../DefinitionCache/Decorator/Memory.php | 46 + .../DefinitionCache/Decorator/Template.php.in | 47 + .../HTMLPurifier/DefinitionCache/Null.php | 39 + .../DefinitionCache/Serializer.php | 172 + .../DefinitionCache/Serializer/README | 3 + .../HTMLPurifier/DefinitionCacheFactory.php | 91 + .../library/HTMLPurifier/Doctype.php | 60 + .../library/HTMLPurifier/DoctypeRegistry.php | 103 + .../library/HTMLPurifier/ElementDef.php | 175 + .../library/HTMLPurifier/Encoder.php | 426 ++ .../library/HTMLPurifier/EntityLookup.php | 44 + .../HTMLPurifier/EntityLookup/entities.ser | 1 + .../library/HTMLPurifier/EntityParser.php | 144 + .../library/HTMLPurifier/ErrorCollector.php | 209 + .../library/HTMLPurifier/ErrorStruct.php | 60 + .../library/HTMLPurifier/Exception.php | 12 + .../library/HTMLPurifier/Filter.php | 46 + .../Filter/ExtractStyleBlocks.php | 135 + .../library/HTMLPurifier/Filter/YouTube.php | 39 + .../library/HTMLPurifier/Generator.php | 183 + .../library/HTMLPurifier/HTMLDefinition.php | 420 ++ .../library/HTMLPurifier/HTMLModule.php | 244 + .../library/HTMLPurifier/HTMLModule/Bdo.php | 31 + .../HTMLModule/CommonAttributes.php | 25 + .../library/HTMLPurifier/HTMLModule/Edit.php | 38 + .../library/HTMLPurifier/HTMLModule/Forms.php | 118 + .../HTMLPurifier/HTMLModule/Hypertext.php | 31 + .../library/HTMLPurifier/HTMLModule/Image.php | 40 + .../HTMLPurifier/HTMLModule/Legacy.php | 143 + .../library/HTMLPurifier/HTMLModule/List.php | 35 + .../library/HTMLPurifier/HTMLModule/Name.php | 18 + .../HTMLModule/NonXMLCommonAttributes.php | 14 + .../HTMLPurifier/HTMLModule/Object.php | 47 + .../HTMLPurifier/HTMLModule/Presentation.php | 36 + .../HTMLPurifier/HTMLModule/Proprietary.php | 33 + .../library/HTMLPurifier/HTMLModule/Ruby.php | 27 + .../HTMLPurifier/HTMLModule/SafeEmbed.php | 33 + .../HTMLPurifier/HTMLModule/SafeObject.php | 50 + .../HTMLPurifier/HTMLModule/Scripting.php | 54 + .../HTMLModule/StyleAttribute.php | 24 + .../HTMLPurifier/HTMLModule/Tables.php | 66 + .../HTMLPurifier/HTMLModule/Target.php | 23 + .../library/HTMLPurifier/HTMLModule/Text.php | 71 + .../library/HTMLPurifier/HTMLModule/Tidy.php | 207 + .../HTMLPurifier/HTMLModule/Tidy/Name.php | 24 + .../HTMLModule/Tidy/Proprietary.php | 23 + .../HTMLPurifier/HTMLModule/Tidy/Strict.php | 21 + .../HTMLModule/Tidy/Transitional.php | 9 + .../HTMLPurifier/HTMLModule/Tidy/XHTML.php | 17 + .../HTMLModule/Tidy/XHTMLAndHTML4.php | 161 + .../HTMLModule/XMLCommonAttributes.php | 14 + .../HTMLPurifier/HTMLModuleManager.php | 403 ++ .../library/HTMLPurifier/IDAccumulator.php | 53 + .../library/HTMLPurifier/Injector.php | 233 + .../HTMLPurifier/Injector/AutoParagraph.php | 340 ++ .../HTMLPurifier/Injector/DisplayLinkURI.php | 26 + .../library/HTMLPurifier/Injector/Linkify.php | 46 + .../HTMLPurifier/Injector/PurifierLinkify.php | 45 + .../HTMLPurifier/Injector/RemoveEmpty.php | 42 + .../HTMLPurifier/Injector/SafeObject.php | 87 + .../library/HTMLPurifier/Language.php | 163 + .../Language/classes/en-x-test.php | 12 + .../Language/messages/en-x-test.php | 11 + .../Language/messages/en-x-testmini.php | 12 + .../HTMLPurifier/Language/messages/en.php | 62 + .../library/HTMLPurifier/LanguageFactory.php | 198 + .../library/HTMLPurifier/Length.php | 115 + .../library/HTMLPurifier/Lexer.php | 298 ++ .../library/HTMLPurifier/Lexer/DOMLex.php | 213 + .../library/HTMLPurifier/Lexer/DirectLex.php | 490 +++ .../library/HTMLPurifier/Lexer/PEARSax3.php | 106 + .../library/HTMLPurifier/Lexer/PH5P.php | 3906 ++++++++++++++++ .../library/HTMLPurifier/PercentEncoder.php | 98 + .../library/HTMLPurifier/Printer.php | 176 + .../HTMLPurifier/Printer/CSSDefinition.php | 38 + .../HTMLPurifier/Printer/ConfigForm.css | 10 + .../HTMLPurifier/Printer/ConfigForm.js | 5 + .../HTMLPurifier/Printer/ConfigForm.php | 368 ++ .../HTMLPurifier/Printer/HTMLDefinition.php | 272 ++ .../library/HTMLPurifier/PropertyList.php | 86 + .../HTMLPurifier/PropertyListIterator.php | 32 + .../library/HTMLPurifier/Strategy.php | 26 + .../HTMLPurifier/Strategy/Composite.php | 25 + .../library/HTMLPurifier/Strategy/Core.php | 18 + .../HTMLPurifier/Strategy/FixNesting.php | 328 ++ .../HTMLPurifier/Strategy/MakeWellFormed.php | 455 ++ .../Strategy/RemoveForeignElements.php | 171 + .../Strategy/ValidateAttributes.php | 39 + .../library/HTMLPurifier/StringHash.php | 39 + .../library/HTMLPurifier/StringHashParser.php | 110 + .../library/HTMLPurifier/TagTransform.php | 36 + .../HTMLPurifier/TagTransform/Font.php | 96 + .../HTMLPurifier/TagTransform/Simple.php | 35 + .../library/HTMLPurifier/Token.php | 57 + .../library/HTMLPurifier/Token/Comment.php | 22 + .../library/HTMLPurifier/Token/Empty.php | 11 + .../library/HTMLPurifier/Token/End.php | 19 + .../library/HTMLPurifier/Token/Start.php | 11 + .../library/HTMLPurifier/Token/Tag.php | 56 + .../library/HTMLPurifier/Token/Text.php | 33 + .../library/HTMLPurifier/TokenFactory.php | 94 + .../htmlpurifier/library/HTMLPurifier/URI.php | 173 + .../library/HTMLPurifier/URIDefinition.php | 93 + .../library/HTMLPurifier/URIFilter.php | 45 + .../URIFilter/DisableExternal.php | 23 + .../URIFilter/DisableExternalResources.php | 12 + .../HTMLPurifier/URIFilter/HostBlacklist.php | 21 + .../HTMLPurifier/URIFilter/MakeAbsolute.php | 114 + .../library/HTMLPurifier/URIFilter/Munge.php | 54 + .../library/HTMLPurifier/URIParser.php | 70 + .../library/HTMLPurifier/URIScheme.php | 42 + .../library/HTMLPurifier/URIScheme/ftp.php | 43 + .../library/HTMLPurifier/URIScheme/http.php | 20 + .../library/HTMLPurifier/URIScheme/https.php | 12 + .../library/HTMLPurifier/URIScheme/mailto.php | 27 + .../library/HTMLPurifier/URIScheme/news.php | 22 + .../library/HTMLPurifier/URIScheme/nntp.php | 20 + .../HTMLPurifier/URISchemeRegistry.php | 69 + .../library/HTMLPurifier/UnitConverter.php | 254 ++ .../library/HTMLPurifier/VarParser.php | 154 + .../HTMLPurifier/VarParser/Flexible.php | 96 + .../library/HTMLPurifier/VarParser/Native.php | 26 + .../HTMLPurifier/VarParserException.php | 11 + .../default/controllers/AboutController.php | 2 +- modules/default/controllers/CidController.php | 54 + .../controllers/FeedbackController.php | 10 +- .../default/controllers/HistoryController.php | 10 +- .../controllers/IdentityController.php | 44 +- .../default/controllers/IndexController.php | 31 +- .../controllers/LearnmoreController.php | 2 +- .../controllers/MaintenancemodeController.php | 14 +- .../controllers/MessageusersController.php | 33 +- .../default/controllers/OpenidController.php | 378 +- .../default/controllers/PrivacyController.php | 2 +- .../default/controllers/SitesController.php | 12 +- modules/default/forms/ErrorMessages.php | 7 +- modules/default/forms/Feedback.php | 61 + modules/default/forms/MessageUsers.php | 34 + modules/default/forms/OpenidLogin.php | 63 + modules/default/models/Association.php | 2 +- modules/default/models/Associations.php | 4 +- modules/default/models/Field.php | 2 +- modules/default/models/Fields.php | 6 +- modules/default/models/FieldsValue.php | 2 +- modules/default/models/FieldsValues.php | 6 +- modules/default/models/Histories.php | 32 +- modules/default/models/History.php | 2 +- modules/default/models/Settings.php | 12 +- modules/default/models/Site.php | 2 +- modules/default/models/Sites.php | 46 +- modules/default/views/scripts/cid/index.phtml | 22 + .../default/views/scripts/error/error.phtml | 8 +- .../views/scripts/feedback/index.phtml | 14 +- .../default/views/scripts/history/index.phtml | 2 +- .../default/views/scripts/identity/id.phtml | 2 +- .../views/scripts/index/index-de.phtml | 29 +- .../views/scripts/index/index-en.phtml | 29 +- .../views/scripts/index/index-es.phtml | 31 +- .../views/scripts/index/index-sv.phtml | 29 +- .../views/scripts/messageusers/index.phtml | 50 +- .../default/views/scripts/openid/login.phtml | 26 +- .../default/views/scripts/openid/trust.phtml | 32 +- .../default/views/scripts/privacy/index.phtml | 4 +- .../default/views/scripts/sites/index.phtml | 6 +- .../controllers/CompleteController.php | 2 +- .../controllers/CredentialsController.php | 28 +- .../install/controllers/IndexController.php | 2 +- .../controllers/PermissionsController.php | 2 +- .../install/controllers/UpgradeController.php | 125 + modules/install/forms/Install.php | 44 + modules/install/forms/UpgradeLogin.php | 29 + .../views/scripts/complete/index.phtml | 6 +- .../views/scripts/credentials/index.phtml | 16 +- .../install/views/scripts/index/index.phtml | 6 +- .../views/scripts/permissions/index.phtml | 12 +- .../install/views/scripts/upgrade/index.phtml | 15 + modules/news/controllers/EditController.php | 98 + modules/news/controllers/IndexController.php | 23 + modules/news/controllers/ViewController.php | 25 + modules/news/forms/Article.php | 44 + modules/news/models/News.php | 58 + modules/news/models/NewsArticle.php | 14 + modules/news/views/scripts/edit/index.phtml | 28 + modules/news/views/scripts/index/index.phtml | 34 + .../news/views/scripts/index/pagination.phtml | 36 + modules/news/views/scripts/view/index.phtml | 15 + .../controllers/AuthorizationsController.php | 10 +- modules/stats/controllers/IndexController.php | 2 +- .../controllers/RegistrationsController.php | 12 +- modules/stats/controllers/SitesController.php | 10 +- modules/stats/controllers/TopController.php | 4 +- modules/stats/models/Stats.php | 6 +- .../views/scripts/authorizations/index.phtml | 10 +- .../views/scripts/registrations/index.phtml | 12 +- modules/stats/views/scripts/sites/index.phtml | 10 +- modules/stats/views/scripts/top/index.phtml | 12 +- modules/users/controllers/LoginController.php | 67 +- .../controllers/ManageusersController.php | 75 +- .../controllers/PersonalinfoController.php | 10 +- .../users/controllers/ProfileController.php | 4 +- .../controllers/ProfilegeneralController.php | 22 +- .../controllers/RecoverpasswordController.php | 16 +- .../users/controllers/RegisterController.php | 34 +- .../users/controllers/UserslistController.php | 20 +- modules/users/forms/AccountInfo.php | 65 + modules/users/forms/ChangePassword.php | 30 + modules/users/forms/Login.php | 62 + modules/users/forms/PersonalInfo.php | 78 + modules/users/forms/RecoverPassword.php | 25 + modules/users/forms/Register.php | 77 + modules/users/models/AuthAttempt.php | 29 + modules/users/models/AuthAttempts.php | 51 + modules/users/models/User.php | 6 +- modules/users/models/Users.php | 115 +- modules/users/views/scripts/login/index.phtml | 78 +- .../views/scripts/manageusers/index.phtml | 59 +- .../views/scripts/personalinfo/edit.phtml | 56 +- .../views/scripts/personalinfo/index.phtml | 10 +- .../views/scripts/personalinfo/show.phtml | 8 +- .../users/views/scripts/profile/index.phtml | 28 +- .../scripts/profilegeneral/accountinfo.phtml | 16 +- .../profilegeneral/changepassword.phtml | 41 +- .../profilegeneral/confirmdelete.phtml | 22 +- .../profilegeneral/editaccountinfo.phtml | 14 +- .../views/scripts/recoverpassword/index.phtml | 8 +- .../users/views/scripts/register/eula.phtml | 10 +- .../users/views/scripts/register/index.phtml | 20 +- resources/en/reminder_mail.txt | 12 + scripts/clear_logs.php | 14 +- setup/final.sql | 37 +- setup/upgrade_1.1.0.beta1.sql | 38 + setup/versions.php | 6 + tests/AllTests.php | 4 +- tests/CaptchaImageTestSessionContainer.php | 4 +- tests/TestHarness.php | 37 +- tests/TestRequest.php | 4 +- tests/Zend_Mail_Transport_Mock.php | 4 +- .../controllers/FeedbackControllerTests.php | 34 +- .../controllers/HistoryControllerTests.php | 26 +- .../controllers/IdentityControllerTests.php | 14 +- .../MessageusersControllerTests.php | 54 +- .../controllers/OpenidControllerTests.php | 70 +- .../ProfilegeneralControllerTests.php | 18 +- .../controllers/RegisterControllerTests.php | 94 +- tests/modules/users/models/UsersTests.php | 12 +- utilities/RandomText.php | 47 + utilities/deleteTestNews.php | 22 + utilities/deleteTestUsers.php | 14 +- utilities/generateRandomHistory.php | 18 +- utilities/generateRandomNews.php | 51 + utilities/generateRandomTrustedSites.php | 16 +- utilities/generateRandomUsers.php | 14 +- views/layouts/layout.phtml | 82 +- webdir/fckeditor/_upgrade.html | 39 + webdir/fckeditor/_whatsnew.html | 177 + webdir/fckeditor/_whatsnew_history.html | 3916 +++++++++++++++++ .../editor/_source/classes/fckcontextmenu.js | 223 + .../_source/classes/fckdataprocessor.js | 119 + .../classes/fckdocumentfragment_gecko.js | 53 + .../_source/classes/fckdocumentfragment_ie.js | 58 + .../editor/_source/classes/fckdomrange.js | 935 ++++ .../_source/classes/fckdomrange_gecko.js | 104 + .../editor/_source/classes/fckdomrange_ie.js | 199 + .../_source/classes/fckdomrangeiterator.js | 327 ++ .../editor/_source/classes/fckeditingarea.js | 368 ++ .../editor/_source/classes/fckelementpath.js | 89 + .../editor/_source/classes/fckenterkey.js | 708 +++ .../editor/_source/classes/fckevents.js | 71 + .../editor/_source/classes/fckhtmliterator.js | 142 + .../editor/_source/classes/fckicon.js | 103 + .../editor/_source/classes/fckiecleanup.js | 68 + .../_source/classes/fckimagepreloader.js | 64 + .../_source/classes/fckkeystrokehandler.js | 141 + .../editor/_source/classes/fckmenublock.js | 153 + .../_source/classes/fckmenublockpanel.js | 54 + .../editor/_source/classes/fckmenuitem.js | 161 + .../editor/_source/classes/fckpanel.js | 463 ++ .../editor/_source/classes/fckplugin.js | 56 + .../editor/_source/classes/fckspecialcombo.js | 376 ++ .../editor/_source/classes/fckstyle.js | 1500 +++++++ .../editor/_source/classes/fcktoolbar.js | 103 + .../_source/classes/fcktoolbarbreak_gecko.js | 36 + .../_source/classes/fcktoolbarbreak_ie.js | 38 + .../_source/classes/fcktoolbarbutton.js | 81 + .../_source/classes/fcktoolbarbuttonui.js | 198 + .../classes/fcktoolbarfontformatcombo.js | 139 + .../_source/classes/fcktoolbarfontscombo.js | 98 + .../classes/fcktoolbarfontsizecombo.js | 76 + .../_source/classes/fcktoolbarpanelbutton.js | 103 + .../_source/classes/fcktoolbarspecialcombo.js | 146 + .../_source/classes/fcktoolbarstylecombo.js | 200 + .../editor/_source/classes/fckw3crange.js | 451 ++ .../editor/_source/classes/fckxml.js | 108 + .../editor/_source/classes/fckxml_gecko.js | 106 + .../editor/_source/classes/fckxml_ie.js | 93 + .../commandclasses/fck_othercommands.js | 634 +++ .../commandclasses/fckblockquotecommand.js | 281 ++ .../commandclasses/fckcorestylecommand.js | 61 + .../_source/commandclasses/fckfitwindow.js | 213 + .../commandclasses/fckindentcommands.js | 282 ++ .../commandclasses/fckjustifycommands.js | 173 + .../_source/commandclasses/fcklistcommands.js | 382 ++ .../_source/commandclasses/fcknamedcommand.js | 39 + .../fckpasteplaintextcommand.js | 40 + .../commandclasses/fckpastewordcommand.js | 40 + .../commandclasses/fckremoveformatcommand.js | 45 + .../_source/commandclasses/fckshowblocks.js | 94 + .../fckspellcheckcommand_gecko.js | 49 + .../commandclasses/fckspellcheckcommand_ie.js | 72 + .../_source/commandclasses/fckstylecommand.js | 60 + .../_source/commandclasses/fcktablecommand.js | 106 + .../commandclasses/fcktextcolorcommand.js | 201 + .../fckeditor/editor/_source/fckconstants.js | 56 + .../fckeditor/editor/_source/fckeditorapi.js | 179 + .../editor/_source/fckjscoreextensions.js | 159 + .../editor/_source/fckscriptloader.js | 122 + .../fckeditor/editor/_source/internals/fck.js | 1256 ++++++ .../_source/internals/fck_contextmenu.js | 345 ++ .../editor/_source/internals/fck_gecko.js | 497 +++ .../editor/_source/internals/fck_ie.js | 456 ++ .../_source/internals/fckbrowserinfo.js | 61 + .../_source/internals/fckcodeformatter.js | 100 + .../editor/_source/internals/fckcommands.js | 172 + .../editor/_source/internals/fckconfig.js | 237 + .../editor/_source/internals/fckdebug.js | 59 + .../_source/internals/fckdebug_empty.js | 31 + .../editor/_source/internals/fckdialog.js | 239 + .../_source/internals/fckdocumentprocessor.js | 270 ++ .../editor/_source/internals/fckdomtools.js | 1057 +++++ .../_source/internals/fcklanguagemanager.js | 165 + .../_source/internals/fcklisthandler.js | 152 + .../editor/_source/internals/fcklistslib.js | 63 + .../editor/_source/internals/fckplugins.js | 46 + .../editor/_source/internals/fckregexlib.js | 100 + .../editor/_source/internals/fckselection.js | 42 + .../_source/internals/fckselection_gecko.js | 228 + .../_source/internals/fckselection_ie.js | 287 ++ .../editor/_source/internals/fckstyles.js | 381 ++ .../_source/internals/fcktablehandler.js | 863 ++++ .../internals/fcktablehandler_gecko.js | 56 + .../_source/internals/fcktablehandler_ie.js | 64 + .../_source/internals/fcktoolbaritems.js | 124 + .../editor/_source/internals/fcktoolbarset.js | 399 ++ .../editor/_source/internals/fcktools.js | 749 ++++ .../_source/internals/fcktools_gecko.js | 282 ++ .../editor/_source/internals/fcktools_ie.js | 234 + .../editor/_source/internals/fckundo.js | 223 + .../editor/_source/internals/fckurlparams.js | 39 + .../editor/_source/internals/fckxhtml.js | 534 +++ .../_source/internals/fckxhtml_gecko.js | 114 + .../editor/_source/internals/fckxhtml_ie.js | 213 + .../_source/internals/fckxhtmlentities.js | 357 ++ .../editor/css/behaviors/disablehandles.htc | 15 + .../editor/css/behaviors/showtableborders.htc | 36 + .../fckeditor/editor/css/fck_editorarea.css | 110 + webdir/fckeditor/editor/css/fck_internal.css | 199 + .../editor/css/fck_showtableborders_gecko.css | 49 + .../editor/css/images/block_address.png | Bin 0 -> 288 bytes .../editor/css/images/block_blockquote.png | Bin 0 -> 293 bytes .../fckeditor/editor/css/images/block_div.png | Bin 0 -> 229 bytes .../fckeditor/editor/css/images/block_h1.png | Bin 0 -> 218 bytes .../fckeditor/editor/css/images/block_h2.png | Bin 0 -> 220 bytes .../fckeditor/editor/css/images/block_h3.png | Bin 0 -> 219 bytes .../fckeditor/editor/css/images/block_h4.png | Bin 0 -> 229 bytes .../fckeditor/editor/css/images/block_h5.png | Bin 0 -> 236 bytes .../fckeditor/editor/css/images/block_h6.png | Bin 0 -> 216 bytes .../fckeditor/editor/css/images/block_p.png | Bin 0 -> 205 bytes .../fckeditor/editor/css/images/block_pre.png | Bin 0 -> 223 bytes .../editor/css/images/fck_anchor.gif | Bin 0 -> 184 bytes .../editor/css/images/fck_flashlogo.gif | Bin 0 -> 599 bytes .../editor/css/images/fck_hiddenfield.gif | Bin 0 -> 105 bytes .../editor/css/images/fck_pagebreak.gif | Bin 0 -> 54 bytes .../editor/css/images/fck_plugin.gif | Bin 0 -> 1709 bytes .../dialog/common/fck_dialog_common.css | 85 + .../editor/dialog/common/fck_dialog_common.js | 347 ++ .../editor/dialog/common/images/locked.gif | Bin 0 -> 74 bytes .../editor/dialog/common/images/reset.gif | Bin 0 -> 104 bytes .../editor/dialog/common/images/unlocked.gif | Bin 0 -> 75 bytes webdir/fckeditor/editor/dialog/fck_about.html | 161 + .../dialog/fck_about/logo_fckeditor.gif | Bin 0 -> 2044 bytes .../editor/dialog/fck_about/logo_fredck.gif | Bin 0 -> 920 bytes .../fck_about/sponsors/spellchecker_net.gif | Bin 0 -> 1447 bytes .../fckeditor/editor/dialog/fck_anchor.html | 220 + .../fckeditor/editor/dialog/fck_button.html | 104 + .../fckeditor/editor/dialog/fck_checkbox.html | 104 + .../editor/dialog/fck_colorselector.html | 172 + webdir/fckeditor/editor/dialog/fck_div.html | 396 ++ .../fckeditor/editor/dialog/fck_docprops.html | 600 +++ .../fck_docprops/fck_document_preview.html | 113 + webdir/fckeditor/editor/dialog/fck_flash.html | 152 + .../editor/dialog/fck_flash/fck_flash.js | 300 ++ .../dialog/fck_flash/fck_flash_preview.html | 50 + webdir/fckeditor/editor/dialog/fck_form.html | 109 + .../editor/dialog/fck_hiddenfield.html | 115 + webdir/fckeditor/editor/dialog/fck_image.html | 258 ++ .../editor/dialog/fck_image/fck_image.js | 512 +++ .../dialog/fck_image/fck_image_preview.html | 72 + webdir/fckeditor/editor/dialog/fck_link.html | 295 ++ .../editor/dialog/fck_link/fck_link.js | 893 ++++ .../fckeditor/editor/dialog/fck_listprop.html | 120 + webdir/fckeditor/editor/dialog/fck_paste.html | 347 ++ .../editor/dialog/fck_radiobutton.html | 104 + .../fckeditor/editor/dialog/fck_replace.html | 650 +++ .../fckeditor/editor/dialog/fck_select.html | 180 + .../editor/dialog/fck_select/fck_select.js | 194 + .../fckeditor/editor/dialog/fck_smiley.html | 111 + .../fckeditor/editor/dialog/fck_source.html | 68 + .../editor/dialog/fck_specialchar.html | 121 + .../editor/dialog/fck_spellerpages.html | 70 + .../fck_spellerpages/spellerpages/blank.html | 0 .../spellerpages/controlWindow.js | 87 + .../spellerpages/controls.html | 153 + .../server-scripts/spellchecker.cfm | 148 + .../server-scripts/spellchecker.php | 199 + .../server-scripts/spellchecker.pl | 181 + .../spellerpages/spellChecker.js | 461 ++ .../spellerpages/spellchecker.html | 71 + .../spellerpages/spellerStyle.css | 49 + .../spellerpages/wordWindow.js | 272 ++ webdir/fckeditor/editor/dialog/fck_table.html | 439 ++ .../editor/dialog/fck_tablecell.html | 293 ++ .../fckeditor/editor/dialog/fck_template.html | 242 + .../dialog/fck_template/images/template1.gif | Bin 0 -> 375 bytes .../dialog/fck_template/images/template2.gif | Bin 0 -> 333 bytes .../dialog/fck_template/images/template3.gif | Bin 0 -> 422 bytes .../fckeditor/editor/dialog/fck_textarea.html | 94 + .../editor/dialog/fck_textfield.html | 136 + webdir/fckeditor/editor/dtd/fck_dtd_test.html | 41 + .../fckeditor/editor/dtd/fck_xhtml10strict.js | 116 + .../editor/dtd/fck_xhtml10transitional.js | 140 + webdir/fckeditor/editor/fckdebug.html | 153 + webdir/fckeditor/editor/fckdialog.html | 819 ++++ webdir/fckeditor/editor/fckeditor.html | 317 ++ .../fckeditor/editor/fckeditor.original.html | 424 ++ .../filemanager/browser/default/browser.css | 87 + .../filemanager/browser/default/browser.html | 200 + .../browser/default/frmactualfolder.html | 95 + .../browser/default/frmcreatefolder.html | 114 + .../browser/default/frmfolders.html | 198 + .../browser/default/frmresourceslist.html | 169 + .../browser/default/frmresourcetype.html | 69 + .../browser/default/frmupload.html | 115 + .../browser/default/images/ButtonArrow.gif | Bin 0 -> 138 bytes .../browser/default/images/Folder.gif | Bin 0 -> 128 bytes .../browser/default/images/Folder32.gif | Bin 0 -> 281 bytes .../browser/default/images/FolderOpened.gif | Bin 0 -> 132 bytes .../browser/default/images/FolderOpened32.gif | Bin 0 -> 264 bytes .../browser/default/images/FolderUp.gif | Bin 0 -> 132 bytes .../browser/default/images/icons/32/ai.gif | Bin 0 -> 1140 bytes .../browser/default/images/icons/32/avi.gif | Bin 0 -> 454 bytes .../browser/default/images/icons/32/bmp.gif | Bin 0 -> 709 bytes .../browser/default/images/icons/32/cs.gif | Bin 0 -> 224 bytes .../default/images/icons/32/default.icon.gif | Bin 0 -> 177 bytes .../browser/default/images/icons/32/dll.gif | Bin 0 -> 258 bytes .../browser/default/images/icons/32/doc.gif | Bin 0 -> 260 bytes .../browser/default/images/icons/32/exe.gif | Bin 0 -> 170 bytes .../browser/default/images/icons/32/fla.gif | Bin 0 -> 946 bytes .../browser/default/images/icons/32/gif.gif | Bin 0 -> 704 bytes .../browser/default/images/icons/32/htm.gif | Bin 0 -> 1527 bytes .../browser/default/images/icons/32/html.gif | Bin 0 -> 1527 bytes .../browser/default/images/icons/32/jpg.gif | Bin 0 -> 463 bytes .../browser/default/images/icons/32/js.gif | Bin 0 -> 274 bytes .../browser/default/images/icons/32/mdb.gif | Bin 0 -> 274 bytes .../browser/default/images/icons/32/mp3.gif | Bin 0 -> 454 bytes .../browser/default/images/icons/32/pdf.gif | Bin 0 -> 567 bytes .../browser/default/images/icons/32/png.gif | Bin 0 -> 464 bytes .../browser/default/images/icons/32/ppt.gif | Bin 0 -> 254 bytes .../browser/default/images/icons/32/rdp.gif | Bin 0 -> 1493 bytes .../browser/default/images/icons/32/swf.gif | Bin 0 -> 725 bytes .../browser/default/images/icons/32/swt.gif | Bin 0 -> 724 bytes .../browser/default/images/icons/32/txt.gif | Bin 0 -> 213 bytes .../browser/default/images/icons/32/vsd.gif | Bin 0 -> 277 bytes .../browser/default/images/icons/32/xls.gif | Bin 0 -> 271 bytes .../browser/default/images/icons/32/xml.gif | Bin 0 -> 408 bytes .../browser/default/images/icons/32/zip.gif | Bin 0 -> 368 bytes .../browser/default/images/icons/ai.gif | Bin 0 -> 403 bytes .../browser/default/images/icons/avi.gif | Bin 0 -> 249 bytes .../browser/default/images/icons/bmp.gif | Bin 0 -> 126 bytes .../browser/default/images/icons/cs.gif | Bin 0 -> 128 bytes .../default/images/icons/default.icon.gif | Bin 0 -> 113 bytes .../browser/default/images/icons/dll.gif | Bin 0 -> 132 bytes .../browser/default/images/icons/doc.gif | Bin 0 -> 140 bytes .../browser/default/images/icons/exe.gif | Bin 0 -> 109 bytes .../browser/default/images/icons/fla.gif | Bin 0 -> 382 bytes .../browser/default/images/icons/gif.gif | Bin 0 -> 125 bytes .../browser/default/images/icons/htm.gif | Bin 0 -> 621 bytes .../browser/default/images/icons/html.gif | Bin 0 -> 621 bytes .../browser/default/images/icons/jpg.gif | Bin 0 -> 125 bytes .../browser/default/images/icons/js.gif | Bin 0 -> 139 bytes .../browser/default/images/icons/mdb.gif | Bin 0 -> 146 bytes .../browser/default/images/icons/mp3.gif | Bin 0 -> 249 bytes .../browser/default/images/icons/pdf.gif | Bin 0 -> 230 bytes .../browser/default/images/icons/png.gif | Bin 0 -> 125 bytes .../browser/default/images/icons/ppt.gif | Bin 0 -> 139 bytes .../browser/default/images/icons/rdp.gif | Bin 0 -> 606 bytes .../browser/default/images/icons/swf.gif | Bin 0 -> 388 bytes .../browser/default/images/icons/swt.gif | Bin 0 -> 388 bytes .../browser/default/images/icons/txt.gif | Bin 0 -> 122 bytes .../browser/default/images/icons/vsd.gif | Bin 0 -> 136 bytes .../browser/default/images/icons/xls.gif | Bin 0 -> 138 bytes .../browser/default/images/icons/xml.gif | Bin 0 -> 231 bytes .../browser/default/images/icons/zip.gif | Bin 0 -> 235 bytes .../browser/default/images/spacer.gif | Bin 0 -> 43 bytes .../filemanager/browser/default/js/common.js | 88 + .../filemanager/browser/default/js/fckxml.js | 147 + .../filemanager/connectors/asp/basexml.asp | 67 + .../connectors/asp/class_upload.asp | 353 ++ .../filemanager/connectors/asp/commands.asp | 202 + .../filemanager/connectors/asp/config.asp | 128 + .../filemanager/connectors/asp/connector.asp | 88 + .../editor/filemanager/connectors/asp/io.asp | 247 ++ .../filemanager/connectors/asp/upload.asp | 65 + .../filemanager/connectors/asp/util.asp | 55 + .../filemanager/connectors/aspx/config.ascx | 98 + .../connectors/aspx/connector.aspx | 32 + .../filemanager/connectors/aspx/upload.aspx | 32 + .../connectors/cfm/ImageObject.cfc | 273 ++ .../connectors/cfm/cf5_connector.cfm | 330 ++ .../filemanager/connectors/cfm/cf5_upload.cfm | 309 ++ .../filemanager/connectors/cfm/cf_basexml.cfm | 72 + .../connectors/cfm/cf_commands.cfm | 230 + .../connectors/cfm/cf_connector.cfm | 89 + .../filemanager/connectors/cfm/cf_io.cfm | 299 ++ .../filemanager/connectors/cfm/cf_upload.cfm | 71 + .../filemanager/connectors/cfm/cf_util.cfm | 131 + .../filemanager/connectors/cfm/config.cfm | 188 + .../filemanager/connectors/cfm/connector.cfm | 32 + .../filemanager/connectors/cfm/image.cfc | 1324 ++++++ .../filemanager/connectors/cfm/upload.cfm | 31 + .../filemanager/connectors/lasso/config.lasso | 65 + .../connectors/lasso/connector.lasso | 330 ++ .../filemanager/connectors/lasso/upload.lasso | 178 + .../filemanager/connectors/perl/basexml.pl | 68 + .../filemanager/connectors/perl/commands.pl | 200 + .../filemanager/connectors/perl/config.pl | 39 + .../filemanager/connectors/perl/connector.cgi | 129 + .../editor/filemanager/connectors/perl/io.pl | 141 + .../filemanager/connectors/perl/upload.cgi | 87 + .../filemanager/connectors/perl/upload_fck.pl | 686 +++ .../filemanager/connectors/perl/util.pl | 66 + .../filemanager/connectors/php/basexml.php | 99 + .../filemanager/connectors/php/commands.php | 280 ++ .../filemanager/connectors/php/config.php | 150 + .../filemanager/connectors/php/connector.php | 87 + .../editor/filemanager/connectors/php/io.php | 303 ++ .../filemanager/connectors/php/phpcompat.php | 17 + .../filemanager/connectors/php/upload.php | 59 + .../filemanager/connectors/php/util.php | 220 + .../filemanager/connectors/py/config.py | 146 + .../filemanager/connectors/py/connector.py | 121 + .../filemanager/connectors/py/fckcommands.py | 202 + .../filemanager/connectors/py/fckconnector.py | 90 + .../filemanager/connectors/py/fckoutput.py | 119 + .../filemanager/connectors/py/fckutil.py | 130 + .../filemanager/connectors/py/htaccess.txt | 23 + .../filemanager/connectors/py/upload.py | 88 + .../editor/filemanager/connectors/py/wsgi.py | 58 + .../editor/filemanager/connectors/py/zope.py | 188 + .../editor/filemanager/connectors/test.html | 210 + .../filemanager/connectors/uploadtest.html | 192 + webdir/fckeditor/editor/images/anchor.gif | Bin 0 -> 184 bytes webdir/fckeditor/editor/images/arrow_ltr.gif | Bin 0 -> 49 bytes webdir/fckeditor/editor/images/arrow_rtl.gif | Bin 0 -> 49 bytes .../editor/images/smiley/msn/angel_smile.gif | Bin 0 -> 445 bytes .../editor/images/smiley/msn/angry_smile.gif | Bin 0 -> 453 bytes .../editor/images/smiley/msn/broken_heart.gif | Bin 0 -> 423 bytes .../editor/images/smiley/msn/cake.gif | Bin 0 -> 453 bytes .../images/smiley/msn/confused_smile.gif | Bin 0 -> 322 bytes .../editor/images/smiley/msn/cry_smile.gif | Bin 0 -> 473 bytes .../editor/images/smiley/msn/devil_smile.gif | Bin 0 -> 444 bytes .../images/smiley/msn/embaressed_smile.gif | Bin 0 -> 1077 bytes .../editor/images/smiley/msn/envelope.gif | Bin 0 -> 1030 bytes .../editor/images/smiley/msn/heart.gif | Bin 0 -> 1012 bytes .../editor/images/smiley/msn/kiss.gif | Bin 0 -> 978 bytes .../editor/images/smiley/msn/lightbulb.gif | Bin 0 -> 303 bytes .../editor/images/smiley/msn/omg_smile.gif | Bin 0 -> 342 bytes .../images/smiley/msn/regular_smile.gif | Bin 0 -> 1036 bytes .../editor/images/smiley/msn/sad_smile.gif | Bin 0 -> 1039 bytes .../editor/images/smiley/msn/shades_smile.gif | Bin 0 -> 1059 bytes .../editor/images/smiley/msn/teeth_smile.gif | Bin 0 -> 1064 bytes .../editor/images/smiley/msn/thumbs_down.gif | Bin 0 -> 992 bytes .../editor/images/smiley/msn/thumbs_up.gif | Bin 0 -> 989 bytes .../editor/images/smiley/msn/tounge_smile.gif | Bin 0 -> 1055 bytes .../smiley/msn/whatchutalkingabout_smile.gif | Bin 0 -> 1034 bytes .../editor/images/smiley/msn/wink_smile.gif | Bin 0 -> 1041 bytes webdir/fckeditor/editor/images/spacer.gif | Bin 0 -> 43 bytes webdir/fckeditor/editor/js/fckadobeair.js | 176 + .../editor/js/fckeditorcode_gecko.js | 108 + .../fckeditor/editor/js/fckeditorcode_ie.js | 109 + .../editor/lang/_translationstatus.txt | 79 + webdir/fckeditor/editor/lang/af.js | 534 +++ webdir/fckeditor/editor/lang/ar.js | 534 +++ webdir/fckeditor/editor/lang/bg.js | 534 +++ webdir/fckeditor/editor/lang/bn.js | 534 +++ webdir/fckeditor/editor/lang/bs.js | 534 +++ webdir/fckeditor/editor/lang/ca.js | 534 +++ webdir/fckeditor/editor/lang/cs.js | 534 +++ webdir/fckeditor/editor/lang/da.js | 534 +++ webdir/fckeditor/editor/lang/de.js | 534 +++ webdir/fckeditor/editor/lang/el.js | 534 +++ webdir/fckeditor/editor/lang/en-au.js | 534 +++ webdir/fckeditor/editor/lang/en-ca.js | 534 +++ webdir/fckeditor/editor/lang/en-uk.js | 534 +++ webdir/fckeditor/editor/lang/en.js | 534 +++ webdir/fckeditor/editor/lang/eo.js | 534 +++ webdir/fckeditor/editor/lang/es.js | 534 +++ webdir/fckeditor/editor/lang/et.js | 534 +++ webdir/fckeditor/editor/lang/eu.js | 535 +++ webdir/fckeditor/editor/lang/fa.js | 534 +++ webdir/fckeditor/editor/lang/fi.js | 534 +++ webdir/fckeditor/editor/lang/fo.js | 534 +++ webdir/fckeditor/editor/lang/fr-ca.js | 534 +++ webdir/fckeditor/editor/lang/fr.js | 534 +++ webdir/fckeditor/editor/lang/gl.js | 534 +++ webdir/fckeditor/editor/lang/gu.js | 534 +++ webdir/fckeditor/editor/lang/he.js | 534 +++ webdir/fckeditor/editor/lang/hi.js | 534 +++ webdir/fckeditor/editor/lang/hr.js | 534 +++ webdir/fckeditor/editor/lang/hu.js | 534 +++ webdir/fckeditor/editor/lang/is.js | 534 +++ webdir/fckeditor/editor/lang/it.js | 534 +++ webdir/fckeditor/editor/lang/ja.js | 534 +++ webdir/fckeditor/editor/lang/km.js | 534 +++ webdir/fckeditor/editor/lang/ko.js | 534 +++ webdir/fckeditor/editor/lang/lt.js | 534 +++ webdir/fckeditor/editor/lang/lv.js | 534 +++ webdir/fckeditor/editor/lang/mn.js | 534 +++ webdir/fckeditor/editor/lang/ms.js | 534 +++ webdir/fckeditor/editor/lang/nb.js | 534 +++ webdir/fckeditor/editor/lang/nl.js | 534 +++ webdir/fckeditor/editor/lang/no.js | 534 +++ webdir/fckeditor/editor/lang/pl.js | 534 +++ webdir/fckeditor/editor/lang/pt-br.js | 534 +++ webdir/fckeditor/editor/lang/pt.js | 534 +++ webdir/fckeditor/editor/lang/ro.js | 534 +++ webdir/fckeditor/editor/lang/ru.js | 534 +++ webdir/fckeditor/editor/lang/sk.js | 534 +++ webdir/fckeditor/editor/lang/sl.js | 534 +++ webdir/fckeditor/editor/lang/sr-latn.js | 534 +++ webdir/fckeditor/editor/lang/sr.js | 534 +++ webdir/fckeditor/editor/lang/sv.js | 534 +++ webdir/fckeditor/editor/lang/th.js | 534 +++ webdir/fckeditor/editor/lang/tr.js | 534 +++ webdir/fckeditor/editor/lang/uk.js | 534 +++ webdir/fckeditor/editor/lang/vi.js | 534 +++ webdir/fckeditor/editor/lang/zh-cn.js | 534 +++ webdir/fckeditor/editor/lang/zh.js | 534 +++ .../editor/plugins/autogrow/fckplugin.js | 111 + .../plugins/bbcode/_sample/sample.config.js | 26 + .../editor/plugins/bbcode/_sample/sample.html | 67 + .../editor/plugins/bbcode/fckplugin.js | 123 + .../plugins/dragresizetable/fckplugin.js | 529 +++ .../plugins/placeholder/fck_placeholder.html | 105 + .../editor/plugins/placeholder/fckplugin.js | 187 + .../editor/plugins/placeholder/lang/de.js | 27 + .../editor/plugins/placeholder/lang/en.js | 27 + .../editor/plugins/placeholder/lang/es.js | 27 + .../editor/plugins/placeholder/lang/fr.js | 27 + .../editor/plugins/placeholder/lang/it.js | 27 + .../editor/plugins/placeholder/lang/pl.js | 27 + .../plugins/placeholder/placeholder.gif | Bin 0 -> 96 bytes .../plugins/simplecommands/fckplugin.js | 29 + .../editor/plugins/tablecommands/fckplugin.js | 33 + .../editor/skins/_fckviewstrips.html | 121 + .../editor/skins/default/fck_dialog.css | 402 ++ .../editor/skins/default/fck_dialog_ie6.js | 110 + .../editor/skins/default/fck_editor.css | 464 ++ .../editor/skins/default/fck_strip.gif | Bin 0 -> 5175 bytes .../skins/default/images/dialog.sides.gif | Bin 0 -> 48 bytes .../skins/default/images/dialog.sides.png | Bin 0 -> 178 bytes .../skins/default/images/dialog.sides.rtl.png | Bin 0 -> 181 bytes .../editor/skins/default/images/sprites.gif | Bin 0 -> 959 bytes .../editor/skins/default/images/sprites.png | Bin 0 -> 3250 bytes .../default/images/toolbar.arrowright.gif | Bin 0 -> 53 bytes .../default/images/toolbar.buttonarrow.gif | Bin 0 -> 46 bytes .../skins/default/images/toolbar.collapse.gif | Bin 0 -> 152 bytes .../skins/default/images/toolbar.end.gif | Bin 0 -> 43 bytes .../skins/default/images/toolbar.expand.gif | Bin 0 -> 152 bytes .../default/images/toolbar.separator.gif | Bin 0 -> 58 bytes .../skins/default/images/toolbar.start.gif | Bin 0 -> 105 bytes .../editor/skins/office2003/fck_dialog.css | 402 ++ .../editor/skins/office2003/fck_dialog_ie6.js | 110 + .../editor/skins/office2003/fck_editor.css | 476 ++ .../editor/skins/office2003/fck_strip.gif | Bin 0 -> 9668 bytes .../skins/office2003/images/dialog.sides.gif | Bin 0 -> 48 bytes .../skins/office2003/images/dialog.sides.png | Bin 0 -> 203 bytes .../office2003/images/dialog.sides.rtl.png | Bin 0 -> 205 bytes .../skins/office2003/images/sprites.gif | Bin 0 -> 959 bytes .../skins/office2003/images/sprites.png | Bin 0 -> 3305 bytes .../office2003/images/toolbar.arrowright.gif | Bin 0 -> 53 bytes .../skins/office2003/images/toolbar.bg.gif | Bin 0 -> 73 bytes .../office2003/images/toolbar.buttonarrow.gif | Bin 0 -> 46 bytes .../office2003/images/toolbar.collapse.gif | Bin 0 -> 152 bytes .../skins/office2003/images/toolbar.end.gif | Bin 0 -> 124 bytes .../office2003/images/toolbar.expand.gif | Bin 0 -> 152 bytes .../office2003/images/toolbar.separator.gif | Bin 0 -> 67 bytes .../skins/office2003/images/toolbar.start.gif | Bin 0 -> 99 bytes .../editor/skins/silver/fck_dialog.css | 402 ++ .../editor/skins/silver/fck_dialog_ie6.js | 110 + .../editor/skins/silver/fck_editor.css | 473 ++ .../editor/skins/silver/fck_strip.gif | Bin 0 -> 5175 bytes .../skins/silver/images/dialog.sides.gif | Bin 0 -> 48 bytes .../skins/silver/images/dialog.sides.png | Bin 0 -> 198 bytes .../skins/silver/images/dialog.sides.rtl.png | Bin 0 -> 200 bytes .../editor/skins/silver/images/sprites.gif | Bin 0 -> 959 bytes .../editor/skins/silver/images/sprites.png | Bin 0 -> 3278 bytes .../silver/images/toolbar.arrowright.gif | Bin 0 -> 53 bytes .../silver/images/toolbar.buttonarrow.gif | Bin 0 -> 46 bytes .../skins/silver/images/toolbar.buttonbg.gif | Bin 0 -> 829 bytes .../skins/silver/images/toolbar.collapse.gif | Bin 0 -> 152 bytes .../skins/silver/images/toolbar.end.gif | Bin 0 -> 43 bytes .../skins/silver/images/toolbar.expand.gif | Bin 0 -> 152 bytes .../skins/silver/images/toolbar.separator.gif | Bin 0 -> 58 bytes .../skins/silver/images/toolbar.start.gif | Bin 0 -> 105 bytes webdir/fckeditor/editor/wsc/ciframe.html | 65 + webdir/fckeditor/editor/wsc/tmpFrameset.html | 67 + webdir/fckeditor/editor/wsc/w.html | 227 + webdir/fckeditor/fckconfig.js | 325 ++ webdir/fckeditor/fckeditor.afp | 159 + webdir/fckeditor/fckeditor.asp | 235 + webdir/fckeditor/fckeditor.cfc | 232 + webdir/fckeditor/fckeditor.cfm | 159 + webdir/fckeditor/fckeditor.js | 330 ++ webdir/fckeditor/fckeditor.lasso | 108 + webdir/fckeditor/fckeditor.php | 31 + webdir/fckeditor/fckeditor.pl | 143 + webdir/fckeditor/fckeditor.py | 160 + webdir/fckeditor/fckeditor_php4.php | 262 ++ webdir/fckeditor/fckeditor_php5.php | 257 ++ webdir/fckeditor/fckpackager.xml | 262 ++ webdir/fckeditor/fckstyles.xml | 111 + webdir/fckeditor/fcktemplates.xml | 103 + webdir/fckeditor/fckutils.cfm | 78 + webdir/fckeditor/license.txt | 1246 ++++++ webdir/images/search_icon.png | Bin 0 -> 1023 bytes webdir/javascript/communityid.js | 313 +- webdir/javascript/fck_custom_config.js | 16 + webdir/javascript/language.php | 20 +- .../yui/animation/animation-debug.js | 27 +- .../javascript/yui/animation/animation-min.js | 12 +- webdir/javascript/yui/animation/animation.js | 27 +- .../yui/assets/skins/sam/ajax-loader.gif | Bin 0 -> 3208 bytes .../yui/assets/skins/sam/autocomplete.css | 6 +- .../javascript/yui/assets/skins/sam/bg-h.gif | Bin 0 -> 212 bytes .../javascript/yui/assets/skins/sam/bg-v.gif | Bin 0 -> 481 bytes .../yui/assets/skins/sam/button.css | 6 +- .../yui/assets/skins/sam/calendar.css | 7 +- .../yui/assets/skins/sam/carousel.css | 6 +- .../yui/assets/skins/sam/colorpicker.css | 6 +- .../yui/assets/skins/sam/container.css | 6 +- .../yui/assets/skins/sam/datatable.css | 7 +- .../yui/assets/skins/sam/editor.css | 9 +- .../yui/assets/skins/sam/imagecropper.css | 4 +- .../yui/assets/skins/sam/layout.css | 4 +- .../yui/assets/skins/sam/logger.css | 4 +- .../javascript/yui/assets/skins/sam/menu.css | 6 +- .../yui/assets/skins/sam/paginator.css | 4 +- .../yui/assets/skins/sam/profilerviewer.css | 4 +- .../yui/assets/skins/sam/resize.css | 6 +- .../yui/assets/skins/sam/simpleeditor.css | 9 +- .../javascript/yui/assets/skins/sam/skin.css | 39 +- .../yui/assets/skins/sam/slider.css | 6 +- .../yui/assets/skins/sam/tabview.css | 7 +- .../yui/assets/skins/sam/treeview.css | 4 +- .../yui/assets/skins/sam/yuitest.css | 4 +- .../autocomplete/assets/autocomplete-core.css | 6 +- .../assets/skins/sam/autocomplete-skin.css | 106 +- .../assets/skins/sam/autocomplete.css | 6 +- .../yui/autocomplete/autocomplete-debug.js | 249 +- .../yui/autocomplete/autocomplete-min.js | 16 +- .../yui/autocomplete/autocomplete.js | 246 +- webdir/javascript/yui/base/base-min.css | 6 +- webdir/javascript/yui/base/base.css | 141 +- .../yui/button/assets/button-core.css | 4 +- .../button/assets/skins/sam/button-skin.css | 18 +- .../yui/button/assets/skins/sam/button.css | 6 +- webdir/javascript/yui/button/button-debug.js | 339 +- webdir/javascript/yui/button/button-min.js | 14 +- webdir/javascript/yui/button/button.js | 339 +- .../yui/calendar/assets/calendar-core.css | 4 +- .../yui/calendar/assets/calendar.css | 4 +- .../assets/skins/sam/calendar-skin.css | 6 +- .../calendar/assets/skins/sam/calendar.css | 7 +- .../javascript/yui/calendar/calendar-debug.js | 80 +- .../javascript/yui/calendar/calendar-min.js | 18 +- webdir/javascript/yui/calendar/calendar.js | 80 +- .../yui/carousel/assets/carousel-core.css | 10 +- .../carousel/assets/skins/sam/ajax-loader.gif | Bin 0 -> 3208 bytes .../assets/skins/sam/carousel-skin.css | 41 +- .../carousel/assets/skins/sam/carousel.css | 6 +- .../javascript/yui/carousel/carousel-debug.js | 3658 +++++++++++++++ .../javascript/yui/carousel/carousel-min.js | 11 + webdir/javascript/yui/carousel/carousel.js | 3616 +++++++++++++++ .../javascript/yui/charts/assets/charts.swf | Bin 67900 -> 71944 bytes webdir/javascript/yui/charts/charts-debug.js | 2326 ++++++++++ webdir/javascript/yui/charts/charts-min.js | 17 + webdir/javascript/yui/charts/charts.js | 2322 ++++++++++ .../colorpicker/assets/colorpicker-core.css | 4 +- .../assets/skins/sam/colorpicker-skin.css | 4 +- .../assets/skins/sam/colorpicker.css | 6 +- .../yui/colorpicker/colorpicker-debug.js | 2784 ++++++------ .../yui/colorpicker/colorpicker-min.js | 10 +- .../javascript/yui/colorpicker/colorpicker.js | 2762 ++++++------ .../yui/connection/connection-debug.js | 15 +- .../yui/connection/connection-min.js | 8 +- .../javascript/yui/connection/connection.js | 15 +- .../yui/container/assets/container-core.css | 14 +- .../yui/container/assets/container.css | 4 +- .../assets/skins/sam/container-skin.css | 10 +- .../container/assets/skins/sam/container.css | 6 +- .../yui/container/container-debug.js | 769 ++-- .../javascript/yui/container/container-min.js | 30 +- webdir/javascript/yui/container/container.js | 769 ++-- .../yui/container/container_core-debug.js | 449 +- .../yui/container/container_core-min.js | 18 +- .../yui/container/container_core.js | 449 +- webdir/javascript/yui/cookie/cookie-debug.js | 23 +- webdir/javascript/yui/cookie/cookie-min.js | 6 +- webdir/javascript/yui/cookie/cookie.js | 23 +- .../yui/datasource/datasource-debug.js | 367 +- .../yui/datasource/datasource-min.js | 15 +- .../javascript/yui/datasource/datasource.js | 360 +- .../yui/datatable/assets/datatable-core.css | 13 +- .../yui/datatable/assets/datatable.css | 4 +- .../assets/skins/sam/datatable-skin.css | 9 +- .../datatable/assets/skins/sam/datatable.css | 7 +- .../yui/datatable/datatable-debug.js | 696 ++- .../javascript/yui/datatable/datatable-min.js | 48 +- webdir/javascript/yui/datatable/datatable.js | 652 ++- webdir/javascript/yui/dom/dom-debug.js | 1374 ++++-- webdir/javascript/yui/dom/dom-min.js | 9 +- webdir/javascript/yui/dom/dom.js | 1344 ++++-- .../javascript/yui/dragdrop/dragdrop-debug.js | 27 +- .../javascript/yui/dragdrop/dragdrop-min.js | 10 +- webdir/javascript/yui/dragdrop/dragdrop.js | 27 +- .../yui/editor/assets/editor-core.css | 14 +- .../yui/editor/assets/simpleeditor-core.css | 4 +- .../editor/assets/skins/sam/editor-skin.css | 4 +- .../yui/editor/assets/skins/sam/editor.css | 9 +- .../assets/skins/sam/simpleeditor-skin.css | 4 +- .../editor/assets/skins/sam/simpleeditor.css | 9 +- webdir/javascript/yui/editor/editor-debug.js | 979 +++-- webdir/javascript/yui/editor/editor-min.js | 43 +- webdir/javascript/yui/editor/editor.js | 973 ++-- .../yui/editor/simpleeditor-debug.js | 723 ++- .../javascript/yui/editor/simpleeditor-min.js | 32 +- webdir/javascript/yui/editor/simpleeditor.js | 718 ++- .../javascript/yui/element/element-debug.js | 1072 +++++ webdir/javascript/yui/element/element-min.js | 8 + webdir/javascript/yui/element/element.js | 1057 +++++ webdir/javascript/yui/event/event-debug.js | 395 +- webdir/javascript/yui/event/event-min.js | 12 +- webdir/javascript/yui/event/event.js | 395 +- webdir/javascript/yui/fonts/fonts-min.css | 6 +- webdir/javascript/yui/fonts/fonts.css | 22 +- webdir/javascript/yui/get/get-debug.js | 8 +- webdir/javascript/yui/get/get-min.js | 6 +- webdir/javascript/yui/get/get.js | 8 +- webdir/javascript/yui/grids/grids-min.css | 6 +- webdir/javascript/yui/grids/grids.css | 622 ++- .../javascript/yui/history/history-debug.js | 70 +- webdir/javascript/yui/history/history-min.js | 6 +- webdir/javascript/yui/history/history.js | 69 +- .../imagecropper/assets/imagecropper-core.css | 4 +- .../assets/skins/sam/imagecropper-skin.css | 4 +- .../assets/skins/sam/imagecropper.css | 4 +- .../yui/imagecropper/imagecropper-debug.js | 907 ++++ .../yui/imagecropper/imagecropper-min.js | 8 + .../yui/imagecropper/imagecropper.js | 889 ++++ .../yui/imageloader/imageloader-debug.js | 6 +- .../yui/imageloader/imageloader-min.js | 6 +- .../javascript/yui/imageloader/imageloader.js | 6 +- webdir/javascript/yui/json/json-debug.js | 6 +- webdir/javascript/yui/json/json-min.js | 6 +- webdir/javascript/yui/json/json.js | 6 +- .../yui/layout/assets/layout-core.css | 4 +- .../layout/assets/skins/sam/layout-skin.css | 4 +- .../yui/layout/assets/skins/sam/layout.css | 4 +- webdir/javascript/yui/layout/layout-debug.js | 28 +- webdir/javascript/yui/layout/layout-min.js | 12 +- webdir/javascript/yui/layout/layout.js | 28 +- .../yui/logger/assets/logger-core.css | 6 +- .../javascript/yui/logger/assets/logger.css | 4 +- .../logger/assets/skins/sam/logger-skin.css | 4 +- .../yui/logger/assets/skins/sam/logger.css | 4 +- webdir/javascript/yui/logger/logger-debug.js | 6 +- webdir/javascript/yui/logger/logger-min.js | 8 +- webdir/javascript/yui/logger/logger.js | 6 +- .../javascript/yui/menu/assets/menu-core.css | 8 +- webdir/javascript/yui/menu/assets/menu.css | 4 +- .../yui/menu/assets/skins/sam/menu-skin.css | 6 +- .../yui/menu/assets/skins/sam/menu.css | 6 +- webdir/javascript/yui/menu/menu-debug.js | 459 +- webdir/javascript/yui/menu/menu-min.js | 21 +- webdir/javascript/yui/menu/menu.js | 459 +- .../yui/paginator/assets/paginator-core.css | 4 +- .../assets/skins/sam/paginator-skin.css | 4 +- .../paginator/assets/skins/sam/paginator.css | 4 +- .../yui/paginator/paginator-debug.js | 337 +- .../javascript/yui/paginator/paginator-min.js | 12 +- webdir/javascript/yui/paginator/paginator.js | 337 +- .../javascript/yui/profiler/profiler-debug.js | 6 +- .../javascript/yui/profiler/profiler-min.js | 6 +- webdir/javascript/yui/profiler/profiler.js | 6 +- .../assets/profilerviewer-core.css | 6 + .../assets/skins/sam/profilerviewer-skin.css | 167 + .../assets/skins/sam/profilerviewer.css | 4 +- .../profilerviewer/profilerviewer-debug.js | 1229 ++++++ .../yui/profilerviewer/profilerviewer-min.js | 9 + .../yui/profilerviewer/profilerviewer.js | 1192 +++++ .../reset-fonts-grids/reset-fonts-grids.css | 6 +- .../yui/reset-fonts/reset-fonts.css | 6 +- webdir/javascript/yui/reset/reset-min.css | 6 +- webdir/javascript/yui/reset/reset.css | 157 +- .../yui/resize/assets/resize-core.css | 4 +- .../resize/assets/skins/sam/resize-skin.css | 17 +- .../yui/resize/assets/skins/sam/resize.css | 6 +- webdir/javascript/yui/resize/resize-debug.js | 77 +- webdir/javascript/yui/resize/resize-min.js | 12 +- webdir/javascript/yui/resize/resize.js | 73 +- .../javascript/yui/selector/selector-debug.js | 655 +++ .../javascript/yui/selector/selector-min.js | 8 + webdir/javascript/yui/selector/selector.js | 648 +++ .../yui/slider/assets/skins/sam/bg-h.gif | Bin 0 -> 212 bytes .../yui/slider/assets/skins/sam/bg-v.gif | Bin 0 -> 481 bytes .../slider/assets/skins/sam/slider-skin.css | 8 +- .../yui/slider/assets/skins/sam/slider.css | 6 +- .../yui/slider/assets/slider-core.css | 4 +- .../yui/slider/assets/slider-skin.css | 20 + webdir/javascript/yui/slider/slider-debug.js | 792 ++-- webdir/javascript/yui/slider/slider-min.js | 10 +- webdir/javascript/yui/slider/slider.js | 775 ++-- .../yui/stylesheet/stylesheet-debug.js | 643 +++ .../yui/stylesheet/stylesheet-min.js | 7 + .../javascript/yui/stylesheet/stylesheet.js | 639 +++ .../yui/tabview/assets/border_tabs.css | 36 +- .../yui/tabview/assets/skin-sam.css | 4 +- .../tabview/assets/skins/sam/tabview-skin.css | 5 +- .../yui/tabview/assets/skins/sam/tabview.css | 7 +- .../yui/tabview/assets/tabview-core.css | 11 +- .../javascript/yui/tabview/assets/tabview.css | 76 +- .../javascript/yui/tabview/tabview-debug.js | 513 ++- webdir/javascript/yui/tabview/tabview-min.js | 8 +- webdir/javascript/yui/tabview/tabview.js | 509 ++- .../javascript/yui/treeview/assets/check0.gif | Bin 0 -> 608 bytes .../javascript/yui/treeview/assets/check1.gif | Bin 0 -> 622 bytes .../javascript/yui/treeview/assets/check2.gif | Bin 0 -> 609 bytes .../yui/treeview/assets/loading.gif | Bin 0 -> 2673 bytes .../assets/skins/sam/treeview-skin.css | 4 +- .../treeview/assets/skins/sam/treeview.css | 4 +- .../yui/treeview/assets/treeview-core.css | 4 +- .../yui/treeview/assets/treeview-skin.css | 248 ++ .../yui/treeview/assets/treeview-sprite.gif | Bin 0 -> 4326 bytes .../javascript/yui/treeview/treeview-debug.js | 2795 ++++++------ .../javascript/yui/treeview/treeview-min.js | 15 +- webdir/javascript/yui/treeview/treeview.js | 2740 +++++++----- .../yui/uploader/assets/uploader.swf | Bin 6754 -> 6920 bytes .../javascript/yui/uploader/uploader-debug.js | 1057 +++++ .../uploader/uploader-experimental-debug.js | 120 +- .../javascript/yui/uploader/uploader-min.js | 15 + webdir/javascript/yui/uploader/uploader.js | 1054 +++++ webdir/javascript/yui/utilities/utilities.js | 34 +- .../yui/yahoo-dom-event/yahoo-dom-event.js | 15 +- webdir/javascript/yui/yahoo/yahoo-debug.js | 122 +- webdir/javascript/yui/yahoo/yahoo-min.js | 6 +- webdir/javascript/yui/yahoo/yahoo.js | 122 +- .../yuiloader-dom-event.js | 20 +- .../yui/yuiloader/yuiloader-debug.js | 159 +- .../javascript/yui/yuiloader/yuiloader-min.js | 10 +- webdir/javascript/yui/yuiloader/yuiloader.js | 159 +- .../yuitest/assets/skins/sam/yuitest-skin.css | 4 +- .../yui/yuitest/assets/skins/sam/yuitest.css | 4 +- .../yui/yuitest/assets/testlogger.css | 32 +- .../yui/yuitest/assets/yuitest-core.css | 4 +- .../javascript/yui/yuitest/yuitest-debug.js | 6 +- webdir/javascript/yui/yuitest/yuitest-min.js | 14 +- webdir/javascript/yui/yuitest/yuitest.js | 6 +- .../yui/yuitest/yuitest_core-debug.js | 6 +- .../yui/yuitest/yuitest_core-min.js | 10 +- webdir/javascript/yui/yuitest/yuitest_core.js | 6 +- webdir/styles/style.css | 77 +- 2306 files changed, 251360 insertions(+), 23428 deletions(-) create mode 100755 Application.php create mode 100644 libs/Auth/OpenID.php create mode 100644 libs/Auth/OpenID/AX.php create mode 100644 libs/Auth/OpenID/Association.php create mode 100644 libs/Auth/OpenID/BigMath.php create mode 100644 libs/Auth/OpenID/Consumer.php create mode 100644 libs/Auth/OpenID/CryptUtil.php create mode 100644 libs/Auth/OpenID/DatabaseConnection.php create mode 100644 libs/Auth/OpenID/DiffieHellman.php create mode 100644 libs/Auth/OpenID/Discover.php create mode 100644 libs/Auth/OpenID/DumbStore.php create mode 100644 libs/Auth/OpenID/Extension.php create mode 100644 libs/Auth/OpenID/FileStore.php create mode 100644 libs/Auth/OpenID/HMAC.php create mode 100644 libs/Auth/OpenID/Interface.php create mode 100644 libs/Auth/OpenID/KVForm.php create mode 100644 libs/Auth/OpenID/MemcachedStore.php create mode 100644 libs/Auth/OpenID/Message.php create mode 100644 libs/Auth/OpenID/MySQLStore.php create mode 100644 libs/Auth/OpenID/Nonce.php create mode 100644 libs/Auth/OpenID/PAPE.php create mode 100644 libs/Auth/OpenID/Parse.php create mode 100644 libs/Auth/OpenID/PostgreSQLStore.php create mode 100644 libs/Auth/OpenID/SQLStore.php create mode 100644 libs/Auth/OpenID/SQLiteStore.php create mode 100644 libs/Auth/OpenID/SReg.php create mode 100644 libs/Auth/OpenID/Server.php create mode 100644 libs/Auth/OpenID/ServerRequest.php create mode 100644 libs/Auth/OpenID/TrustRoot.php create mode 100644 libs/Auth/OpenID/URINorm.php create mode 100644 libs/Auth/Yadis/HTTPFetcher.php create mode 100644 libs/Auth/Yadis/Manager.php create mode 100644 libs/Auth/Yadis/Misc.php create mode 100644 libs/Auth/Yadis/ParanoidHTTPFetcher.php create mode 100644 libs/Auth/Yadis/ParseHTML.php create mode 100644 libs/Auth/Yadis/PlainHTTPFetcher.php create mode 100644 libs/Auth/Yadis/XML.php create mode 100644 libs/Auth/Yadis/XRDS.php create mode 100644 libs/Auth/Yadis/XRI.php create mode 100644 libs/Auth/Yadis/XRIRes.php create mode 100644 libs/Auth/Yadis/Yadis.php create mode 100644 libs/CommunityID/Controller/Action.php create mode 100644 libs/CommunityID/Controller/Action/Helper/ProviderUrl.php create mode 100644 libs/CommunityID/OpenId/DatabaseConnection.php create mode 100644 libs/Monkeys/AntiSpam.php create mode 100644 libs/Monkeys/Application/Module/Autoloader.php create mode 100644 libs/Monkeys/DuplicateException.php create mode 100644 libs/Monkeys/Form/Element/DateTime.php create mode 100644 libs/Monkeys/Form/Element/Richtextarea.php create mode 100644 libs/Monkeys/Form/Element/Select.php create mode 100644 libs/Monkeys/Form/Element/list-en1-semic-2.txt create mode 100644 libs/Monkeys/Iterator.php create mode 100644 libs/Monkeys/Ldap.php create mode 100644 libs/Monkeys/Lib.php create mode 100644 libs/Monkeys/Lucene.php create mode 100644 libs/Monkeys/Validate/Username.php create mode 100644 libs/Monkeys/View/Helper/FormDateTimeSelects.php create mode 100644 libs/Monkeys/View/Helper/FormRichtextarea.php create mode 100644 libs/Monkeys/tests/sampletext.txt create mode 100755 libs/Zend/Amf/Adobe/Auth.php create mode 100755 libs/Zend/Amf/Adobe/DbInspector.php create mode 100755 libs/Zend/Amf/Adobe/Introspector.php create mode 100755 libs/Zend/Amf/Auth/Abstract.php create mode 100755 libs/Zend/Amf/Parse/Resource/MysqlResult.php create mode 100644 libs/Zend/Amf/Parse/Resource/MysqliResult.php create mode 100755 libs/Zend/Amf/Parse/Resource/Stream.php create mode 100755 libs/Zend/Amf/Value/Messaging/ArrayCollection.php create mode 100644 libs/Zend/Application.php create mode 100644 libs/Zend/Application/Bootstrap/Bootstrap.php create mode 100644 libs/Zend/Application/Bootstrap/BootstrapAbstract.php create mode 100644 libs/Zend/Application/Bootstrap/Bootstrapper.php create mode 100644 libs/Zend/Application/Bootstrap/Exception.php create mode 100644 libs/Zend/Application/Bootstrap/ResourceBootstrapper.php create mode 100644 libs/Zend/Application/Exception.php create mode 100644 libs/Zend/Application/Module/Autoloader.php create mode 100644 libs/Zend/Application/Module/Bootstrap.php create mode 100644 libs/Zend/Application/Resource/Db.php create mode 100644 libs/Zend/Application/Resource/Exception.php create mode 100644 libs/Zend/Application/Resource/Frontcontroller.php create mode 100644 libs/Zend/Application/Resource/Layout.php create mode 100644 libs/Zend/Application/Resource/Locale.php create mode 100644 libs/Zend/Application/Resource/Modules.php create mode 100644 libs/Zend/Application/Resource/Navigation.php create mode 100644 libs/Zend/Application/Resource/Resource.php create mode 100644 libs/Zend/Application/Resource/ResourceAbstract.php create mode 100644 libs/Zend/Application/Resource/Router.php create mode 100644 libs/Zend/Application/Resource/Session.php create mode 100644 libs/Zend/Application/Resource/Translate.php create mode 100644 libs/Zend/Application/Resource/View.php create mode 100755 libs/Zend/Cache/Backend/ZendServer.php create mode 100755 libs/Zend/Cache/Backend/ZendServer/Disk.php create mode 100755 libs/Zend/Cache/Backend/ZendServer/ShMem.php create mode 100644 libs/Zend/CodeGenerator/Abstract.php create mode 100644 libs/Zend/CodeGenerator/Exception.php create mode 100644 libs/Zend/CodeGenerator/Php/Abstract.php create mode 100644 libs/Zend/CodeGenerator/Php/Body.php create mode 100644 libs/Zend/CodeGenerator/Php/Class.php create mode 100644 libs/Zend/CodeGenerator/Php/Docblock.php create mode 100644 libs/Zend/CodeGenerator/Php/Docblock/Tag.php create mode 100644 libs/Zend/CodeGenerator/Php/Docblock/Tag/License.php create mode 100644 libs/Zend/CodeGenerator/Php/Docblock/Tag/Param.php create mode 100644 libs/Zend/CodeGenerator/Php/Docblock/Tag/Return.php create mode 100644 libs/Zend/CodeGenerator/Php/Exception.php create mode 100644 libs/Zend/CodeGenerator/Php/File.php create mode 100644 libs/Zend/CodeGenerator/Php/Member/Abstract.php create mode 100644 libs/Zend/CodeGenerator/Php/Member/Container.php create mode 100644 libs/Zend/CodeGenerator/Php/Method.php create mode 100644 libs/Zend/CodeGenerator/Php/Parameter.php create mode 100644 libs/Zend/CodeGenerator/Php/Property.php create mode 100644 libs/Zend/Controller/Action/Interface.php create mode 100644 libs/Zend/Crypt.php create mode 100644 libs/Zend/Crypt/DiffieHellman.php create mode 100644 libs/Zend/Crypt/DiffieHellman/Exception.php create mode 100644 libs/Zend/Crypt/Exception.php create mode 100644 libs/Zend/Crypt/Hmac.php create mode 100644 libs/Zend/Crypt/Hmac/Exception.php create mode 100644 libs/Zend/Crypt/Math.php create mode 100644 libs/Zend/Crypt/Math/BigInteger.php create mode 100644 libs/Zend/Crypt/Math/BigInteger/Bcmath.php create mode 100644 libs/Zend/Crypt/Math/BigInteger/Exception.php create mode 100644 libs/Zend/Crypt/Math/BigInteger/Gmp.php create mode 100644 libs/Zend/Crypt/Math/BigInteger/Interface.php create mode 100644 libs/Zend/Crypt/Math/Exception.php create mode 100644 libs/Zend/Crypt/Rsa.php create mode 100644 libs/Zend/Crypt/Rsa/Key.php create mode 100644 libs/Zend/Crypt/Rsa/Key/Private.php create mode 100644 libs/Zend/Crypt/Rsa/Key/Public.php create mode 100644 libs/Zend/Db/Statement/Pdo/Oci.php create mode 100644 libs/Zend/Dojo/Form/Element/SimpleTextarea.php create mode 100644 libs/Zend/Dojo/View/Helper/CustomDijit.php create mode 100644 libs/Zend/Filter/Callback.php create mode 100644 libs/Zend/Filter/Decrypt.php create mode 100644 libs/Zend/Filter/Encrypt.php create mode 100644 libs/Zend/Filter/Encrypt/Interface.php create mode 100644 libs/Zend/Filter/Encrypt/Mcrypt.php create mode 100644 libs/Zend/Filter/Encrypt/Openssl.php create mode 100644 libs/Zend/Filter/File/Decrypt.php create mode 100644 libs/Zend/Filter/File/Encrypt.php create mode 100644 libs/Zend/Filter/LocalizedToNormalized.php create mode 100644 libs/Zend/Filter/NormalizedToLocalized.php create mode 100644 libs/Zend/Form/Decorator/Marker/File/Interface.php create mode 100644 libs/Zend/Form/Decorator/Tooltip.php create mode 100644 libs/Zend/Gdata/App/Extension/Edited.php create mode 100644 libs/Zend/Gdata/App/VersionException.php create mode 100755 libs/Zend/Gdata/Health.php create mode 100755 libs/Zend/Gdata/Health/Extension/Ccr.php create mode 100755 libs/Zend/Gdata/Health/ProfileEntry.php create mode 100755 libs/Zend/Gdata/Health/ProfileFeed.php create mode 100755 libs/Zend/Gdata/Health/ProfileListEntry.php create mode 100755 libs/Zend/Gdata/Health/ProfileListFeed.php create mode 100755 libs/Zend/Gdata/Health/Query.php create mode 100644 libs/Zend/Gdata/HttpAdapterStreamingProxy.php create mode 100644 libs/Zend/Gdata/HttpAdapterStreamingSocket.php create mode 100644 libs/Zend/Gdata/MediaMimeStream.php create mode 100644 libs/Zend/Gdata/MimeBodyString.php create mode 100644 libs/Zend/Gdata/MimeFile.php create mode 100644 libs/Zend/Gdata/YouTube/ActivityEntry.php create mode 100644 libs/Zend/Gdata/YouTube/ActivityFeed.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/AboutMe.php create mode 100755 libs/Zend/Gdata/YouTube/Extension/CountHint.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/FirstName.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/LastName.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/MediaCredit.php create mode 100755 libs/Zend/Gdata/YouTube/Extension/MediaRating.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/PlaylistId.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/PlaylistTitle.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/QueryString.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/Uploaded.php create mode 100644 libs/Zend/Gdata/YouTube/Extension/VideoId.php create mode 100644 libs/Zend/Gdata/YouTube/InboxEntry.php create mode 100644 libs/Zend/Gdata/YouTube/InboxFeed.php create mode 100644 libs/Zend/Http/Client/Adapter/Curl.php create mode 100644 libs/Zend/Json/Expr.php create mode 100644 libs/Zend/Loader/Autoloader.php create mode 100644 libs/Zend/Loader/Autoloader/Interface.php create mode 100644 libs/Zend/Loader/Autoloader/Resource.php create mode 100644 libs/Zend/Log/Formatter/Firebug.php create mode 100644 libs/Zend/Log/Writer/Mail.php create mode 100644 libs/Zend/Navigation.php create mode 100644 libs/Zend/Navigation/Container.php create mode 100644 libs/Zend/Navigation/Exception.php create mode 100644 libs/Zend/Navigation/Page.php create mode 100644 libs/Zend/Navigation/Page/Mvc.php create mode 100644 libs/Zend/Navigation/Page/Uri.php create mode 100644 libs/Zend/Reflection/Class.php create mode 100644 libs/Zend/Reflection/Docblock.php create mode 100644 libs/Zend/Reflection/Docblock/Tag.php create mode 100644 libs/Zend/Reflection/Docblock/Tag/Param.php create mode 100644 libs/Zend/Reflection/Docblock/Tag/Return.php create mode 100644 libs/Zend/Reflection/Exception.php create mode 100644 libs/Zend/Reflection/Extension.php create mode 100644 libs/Zend/Reflection/File.php create mode 100644 libs/Zend/Reflection/Function.php create mode 100644 libs/Zend/Reflection/Method.php create mode 100644 libs/Zend/Reflection/Parameter.php create mode 100644 libs/Zend/Reflection/Property.php create mode 100644 libs/Zend/Search/Lucene/Document/Exception.php create mode 100644 libs/Zend/Search/Lucene/Index/TermsPriorityQueue.php create mode 100644 libs/Zend/Search/Lucene/Index/TermsStream/Interface.php create mode 100644 libs/Zend/Search/Lucene/MultiSearcher.php create mode 100644 libs/Zend/Search/Lucene/Search/Highlighter/Default.php create mode 100644 libs/Zend/Search/Lucene/Search/Highlighter/Interface.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/Preprocessing.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/Preprocessing/Fuzzy.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/Preprocessing/Phrase.php create mode 100644 libs/Zend/Search/Lucene/Search/Query/Preprocessing/Term.php create mode 100644 libs/Zend/Search/Lucene/TermStreamsPriorityQueue.php create mode 100644 libs/Zend/Service/Amazon/Abstract.php create mode 100644 libs/Zend/Service/Amazon/Ec2.php create mode 100644 libs/Zend/Service/Amazon/Ec2/Abstract.php create mode 100644 libs/Zend/Service/Amazon/Ec2/Availabilityzones.php create mode 100644 libs/Zend/Service/Amazon/Ec2/Ebs.php create mode 100644 libs/Zend/Service/Amazon/Ec2/Elasticip.php create mode 100644 libs/Zend/Service/Amazon/Ec2/Exception.php create mode 100644 libs/Zend/Service/Amazon/Ec2/Image.php create mode 100644 libs/Zend/Service/Amazon/Ec2/Instance.php create mode 100644 libs/Zend/Service/Amazon/Ec2/Keypair.php create mode 100644 libs/Zend/Service/Amazon/Ec2/Region.php create mode 100644 libs/Zend/Service/Amazon/Ec2/Response.php create mode 100644 libs/Zend/Service/Amazon/Ec2/Securitygroups.php create mode 100755 libs/Zend/Service/Amazon/Exception.php create mode 100755 libs/Zend/Service/Amazon/S3.php create mode 100755 libs/Zend/Service/Amazon/S3/Exception.php create mode 100755 libs/Zend/Service/Amazon/S3/Stream.php create mode 100644 libs/Zend/Soap/Wsdl/Strategy/Composite.php create mode 100644 libs/Zend/Tag/Cloud.php create mode 100644 libs/Zend/Tag/Cloud/Decorator/Cloud.php create mode 100644 libs/Zend/Tag/Cloud/Decorator/Exception.php create mode 100644 libs/Zend/Tag/Cloud/Decorator/HtmlCloud.php create mode 100644 libs/Zend/Tag/Cloud/Decorator/HtmlTag.php create mode 100644 libs/Zend/Tag/Cloud/Decorator/Tag.php create mode 100644 libs/Zend/Tag/Cloud/Exception.php create mode 100644 libs/Zend/Tag/Exception.php create mode 100644 libs/Zend/Tag/Item.php create mode 100644 libs/Zend/Tag/ItemList.php create mode 100644 libs/Zend/Tag/Taggable.php create mode 100644 libs/Zend/Text/MultiByte.php create mode 100644 libs/Zend/Tool/Framework/Action/Base.php create mode 100644 libs/Zend/Tool/Framework/Action/Exception.php create mode 100644 libs/Zend/Tool/Framework/Action/Interface.php create mode 100644 libs/Zend/Tool/Framework/Action/Repository.php create mode 100644 libs/Zend/Tool/Framework/Client/Abstract.php create mode 100644 libs/Zend/Tool/Framework/Client/Console.php create mode 100644 libs/Zend/Tool/Framework/Client/Console/ArgumentParser.php create mode 100644 libs/Zend/Tool/Framework/Client/Console/HelpSystem.php create mode 100644 libs/Zend/Tool/Framework/Client/Console/Manifest.php create mode 100644 libs/Zend/Tool/Framework/Client/Console/ResponseDecorator/Colorizer.php create mode 100644 libs/Zend/Tool/Framework/Client/Exception.php create mode 100644 libs/Zend/Tool/Framework/Client/Interactive/InputHandler.php create mode 100644 libs/Zend/Tool/Framework/Client/Interactive/InputInterface.php create mode 100644 libs/Zend/Tool/Framework/Client/Interactive/InputRequest.php create mode 100644 libs/Zend/Tool/Framework/Client/Interactive/InputResponse.php create mode 100644 libs/Zend/Tool/Framework/Client/Interactive/OutputInterface.php create mode 100644 libs/Zend/Tool/Framework/Client/Request.php create mode 100644 libs/Zend/Tool/Framework/Client/Response.php create mode 100644 libs/Zend/Tool/Framework/Client/Response/ContentDecorator/Interface.php create mode 100644 libs/Zend/Tool/Framework/Client/Response/ContentDecorator/Separator.php create mode 100644 libs/Zend/Tool/Framework/Exception.php create mode 100644 libs/Zend/Tool/Framework/Loader/Abstract.php create mode 100644 libs/Zend/Tool/Framework/Loader/IncludePathLoader.php create mode 100644 libs/Zend/Tool/Framework/Loader/IncludePathLoader/RecursiveFilterIterator.php create mode 100644 libs/Zend/Tool/Framework/Manifest/ActionManifestable.php create mode 100644 libs/Zend/Tool/Framework/Manifest/Exception.php create mode 100644 libs/Zend/Tool/Framework/Manifest/Indexable.php create mode 100644 libs/Zend/Tool/Framework/Manifest/Interface.php create mode 100644 libs/Zend/Tool/Framework/Manifest/MetadataManifestable.php create mode 100644 libs/Zend/Tool/Framework/Manifest/ProviderManifestable.php create mode 100644 libs/Zend/Tool/Framework/Manifest/Repository.php create mode 100644 libs/Zend/Tool/Framework/Metadata/Basic.php create mode 100644 libs/Zend/Tool/Framework/Metadata/Dynamic.php create mode 100644 libs/Zend/Tool/Framework/Metadata/Interface.php create mode 100644 libs/Zend/Tool/Framework/Metadata/Tool.php create mode 100644 libs/Zend/Tool/Framework/Provider/Abstract.php create mode 100644 libs/Zend/Tool/Framework/Provider/DocblockManifestable.php create mode 100644 libs/Zend/Tool/Framework/Provider/Exception.php create mode 100644 libs/Zend/Tool/Framework/Provider/Interactable.php create mode 100644 libs/Zend/Tool/Framework/Provider/Interface.php create mode 100644 libs/Zend/Tool/Framework/Provider/Pretendable.php create mode 100644 libs/Zend/Tool/Framework/Provider/Repository.php create mode 100644 libs/Zend/Tool/Framework/Provider/Signature.php create mode 100644 libs/Zend/Tool/Framework/Registry.php create mode 100644 libs/Zend/Tool/Framework/Registry/EnabledInterface.php create mode 100644 libs/Zend/Tool/Framework/Registry/Exception.php create mode 100644 libs/Zend/Tool/Framework/Registry/Interface.php create mode 100644 libs/Zend/Tool/Framework/System/Action/Create.php create mode 100644 libs/Zend/Tool/Framework/System/Action/Delete.php create mode 100644 libs/Zend/Tool/Framework/System/Manifest.php create mode 100644 libs/Zend/Tool/Framework/System/Provider/Manifest.php create mode 100644 libs/Zend/Tool/Framework/System/Provider/Phpinfo.php create mode 100644 libs/Zend/Tool/Framework/System/Provider/Version.php create mode 100644 libs/Zend/Tool/Project/Context/Exception.php create mode 100644 libs/Zend/Tool/Project/Context/Filesystem/Abstract.php create mode 100644 libs/Zend/Tool/Project/Context/Filesystem/Directory.php create mode 100644 libs/Zend/Tool/Project/Context/Filesystem/File.php create mode 100644 libs/Zend/Tool/Project/Context/Interface.php create mode 100644 libs/Zend/Tool/Project/Context/Repository.php create mode 100644 libs/Zend/Tool/Project/Context/System/Interface.php create mode 100644 libs/Zend/Tool/Project/Context/System/NotOverwritable.php create mode 100644 libs/Zend/Tool/Project/Context/System/ProjectDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/System/ProjectProfileFile.php create mode 100644 libs/Zend/Tool/Project/Context/System/ProjectProvidersDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/System/TopLevelRestrictable.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ActionMethod.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ApisDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ApplicationConfigFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ApplicationDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/BootstrapFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/CacheDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ConfigFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ConfigsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ControllerFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ControllersDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/DataDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/DbTableDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/DbTableFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/FormFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/FormsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/HtaccessFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/LayoutsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/LibraryDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/LocalesDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/LogsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ModelFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ModelsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ModuleDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ModulesDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ProjectProviderFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/PublicDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/PublicImagesDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/PublicIndexFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/PublicScriptsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/PublicStylesheetsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/SearchIndexesDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/SessionsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/TemporaryDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/TestApplicationBootstrapFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/TestApplicationControllerDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/TestApplicationControllerFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/TestApplicationDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/TestLibraryBootstrapFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/TestLibraryDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/TestLibraryFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/TestLibraryNamespaceDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/TestPHPUnitConfigFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/TestsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/UploadsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ViewControllerScriptsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ViewFiltersDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ViewHelpersDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ViewScriptFile.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ViewScriptsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ViewsDirectory.php create mode 100644 libs/Zend/Tool/Project/Context/Zf/ZfStandardLibraryDirectory.php create mode 100644 libs/Zend/Tool/Project/Exception.php create mode 100644 libs/Zend/Tool/Project/Profile.php create mode 100644 libs/Zend/Tool/Project/Profile/Exception.php create mode 100644 libs/Zend/Tool/Project/Profile/FileParser/Interface.php create mode 100644 libs/Zend/Tool/Project/Profile/FileParser/Xml.php create mode 100644 libs/Zend/Tool/Project/Profile/Iterator/ContextFilter.php create mode 100644 libs/Zend/Tool/Project/Profile/Iterator/EnabledResourceFilter.php create mode 100644 libs/Zend/Tool/Project/Profile/Resource.php create mode 100644 libs/Zend/Tool/Project/Profile/Resource/Container.php create mode 100644 libs/Zend/Tool/Project/Profile/Resource/SearchConstraints.php create mode 100644 libs/Zend/Tool/Project/Provider/Abstract.php create mode 100644 libs/Zend/Tool/Project/Provider/Action.php create mode 100644 libs/Zend/Tool/Project/Provider/Controller.php create mode 100644 libs/Zend/Tool/Project/Provider/Exception.php create mode 100644 libs/Zend/Tool/Project/Provider/Form.php create mode 100644 libs/Zend/Tool/Project/Provider/Manifest.php create mode 100644 libs/Zend/Tool/Project/Provider/Model.php create mode 100644 libs/Zend/Tool/Project/Provider/Module.php create mode 100644 libs/Zend/Tool/Project/Provider/Profile.php create mode 100644 libs/Zend/Tool/Project/Provider/Project.php create mode 100644 libs/Zend/Tool/Project/Provider/ProjectProvider.php create mode 100644 libs/Zend/Tool/Project/Provider/Test.php create mode 100644 libs/Zend/Tool/Project/Provider/View.php create mode 100644 libs/Zend/Validate/Db/Abstract.php create mode 100644 libs/Zend/Validate/Db/NoRecordExists.php create mode 100644 libs/Zend/Validate/Db/RecordExists.php create mode 100644 libs/Zend/Validate/File/WordCount.php create mode 100644 libs/Zend/Validate/Hostname/Biz.php create mode 100644 libs/Zend/Validate/Hostname/Cn.php create mode 100644 libs/Zend/Validate/Hostname/Com.php create mode 100644 libs/Zend/Validate/Hostname/Jp.php create mode 100644 libs/Zend/Validate/Iban.php create mode 100644 libs/Zend/Validate/Sitemap/Changefreq.php create mode 100644 libs/Zend/Validate/Sitemap/Lastmod.php create mode 100644 libs/Zend/Validate/Sitemap/Loc.php create mode 100644 libs/Zend/Validate/Sitemap/Priority.php create mode 100644 libs/Zend/View/Helper/Cycle.php create mode 100644 libs/Zend/View/Helper/Navigation.php create mode 100644 libs/Zend/View/Helper/Navigation/Breadcrumbs.php create mode 100644 libs/Zend/View/Helper/Navigation/Helper.php create mode 100644 libs/Zend/View/Helper/Navigation/HelperAbstract.php create mode 100644 libs/Zend/View/Helper/Navigation/Links.php create mode 100644 libs/Zend/View/Helper/Navigation/Menu.php create mode 100644 libs/Zend/View/Helper/Navigation/Sitemap.php create mode 100644 libs/Zend/View/Helper/ServerUrl.php create mode 100755 libs/htmlpurifier/CREDITS create mode 100755 libs/htmlpurifier/INSTALL create mode 100755 libs/htmlpurifier/LICENSE create mode 100755 libs/htmlpurifier/NEWS create mode 100755 libs/htmlpurifier/library/HTMLPurifier.auto.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier.autoload.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier.func.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier.includes.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier.kses.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier.path.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier.safe-includes.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrCollections.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrTypes.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/AttrValidator.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Bootstrap.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/CSSDefinition.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ChildDef.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Config.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Namespace.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.PurifierLinkifyDocURL.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormatParam.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksEscaping.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksScope.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksTidyImpl.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.txt create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ContentSets.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Context.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Definition.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/DefinitionCache.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in create mode 100755 libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README create mode 100755 libs/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Doctype.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ElementDef.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Encoder.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/EntityLookup.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser create mode 100755 libs/htmlpurifier/library/HTMLPurifier/EntityParser.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ErrorCollector.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/ErrorStruct.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Exception.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Filter.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Generator.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/IDAccumulator.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Injector.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Language.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Language/messages/en.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/LanguageFactory.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Length.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Lexer.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Lexer/PEARSax3.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/PercentEncoder.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Printer.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/PropertyList.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Strategy.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Strategy/Core.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/StringHash.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/StringHashParser.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/TagTransform.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Token.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Token/Comment.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Token/Empty.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Token/End.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Token/Start.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Token/Tag.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/Token/Text.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/TokenFactory.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URI.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIDefinition.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIFilter.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIParser.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIScheme.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIScheme/http.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIScheme/https.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIScheme/news.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/UnitConverter.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/VarParser.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/VarParser/Native.php create mode 100755 libs/htmlpurifier/library/HTMLPurifier/VarParserException.php create mode 100644 modules/default/controllers/CidController.php create mode 100644 modules/default/forms/Feedback.php create mode 100644 modules/default/forms/MessageUsers.php create mode 100644 modules/default/forms/OpenidLogin.php create mode 100644 modules/default/views/scripts/cid/index.phtml create mode 100644 modules/install/controllers/UpgradeController.php create mode 100644 modules/install/forms/Install.php create mode 100644 modules/install/forms/UpgradeLogin.php create mode 100644 modules/install/views/scripts/upgrade/index.phtml create mode 100644 modules/news/controllers/EditController.php create mode 100644 modules/news/controllers/IndexController.php create mode 100644 modules/news/controllers/ViewController.php create mode 100644 modules/news/forms/Article.php create mode 100644 modules/news/models/News.php create mode 100644 modules/news/models/NewsArticle.php create mode 100644 modules/news/views/scripts/edit/index.phtml create mode 100644 modules/news/views/scripts/index/index.phtml create mode 100644 modules/news/views/scripts/index/pagination.phtml create mode 100644 modules/news/views/scripts/view/index.phtml create mode 100644 modules/users/forms/AccountInfo.php create mode 100644 modules/users/forms/ChangePassword.php create mode 100755 modules/users/forms/Login.php create mode 100644 modules/users/forms/PersonalInfo.php create mode 100644 modules/users/forms/RecoverPassword.php create mode 100755 modules/users/forms/Register.php create mode 100644 modules/users/models/AuthAttempt.php create mode 100644 modules/users/models/AuthAttempts.php create mode 100644 resources/en/reminder_mail.txt create mode 100644 setup/upgrade_1.1.0.beta1.sql create mode 100644 setup/versions.php create mode 100644 utilities/RandomText.php create mode 100644 utilities/deleteTestNews.php create mode 100644 utilities/generateRandomNews.php create mode 100644 webdir/fckeditor/_upgrade.html create mode 100644 webdir/fckeditor/_whatsnew.html create mode 100644 webdir/fckeditor/_whatsnew_history.html create mode 100644 webdir/fckeditor/editor/_source/classes/fckcontextmenu.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckdataprocessor.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckdocumentfragment_gecko.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckdocumentfragment_ie.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckdomrange.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckdomrange_gecko.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckdomrange_ie.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckdomrangeiterator.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckeditingarea.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckelementpath.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckenterkey.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckevents.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckhtmliterator.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckicon.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckiecleanup.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckimagepreloader.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckkeystrokehandler.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckmenublock.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckmenublockpanel.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckmenuitem.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckpanel.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckplugin.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckspecialcombo.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckstyle.js create mode 100644 webdir/fckeditor/editor/_source/classes/fcktoolbar.js create mode 100644 webdir/fckeditor/editor/_source/classes/fcktoolbarbreak_gecko.js create mode 100644 webdir/fckeditor/editor/_source/classes/fcktoolbarbreak_ie.js create mode 100644 webdir/fckeditor/editor/_source/classes/fcktoolbarbutton.js create mode 100644 webdir/fckeditor/editor/_source/classes/fcktoolbarbuttonui.js create mode 100644 webdir/fckeditor/editor/_source/classes/fcktoolbarfontformatcombo.js create mode 100644 webdir/fckeditor/editor/_source/classes/fcktoolbarfontscombo.js create mode 100644 webdir/fckeditor/editor/_source/classes/fcktoolbarfontsizecombo.js create mode 100644 webdir/fckeditor/editor/_source/classes/fcktoolbarpanelbutton.js create mode 100644 webdir/fckeditor/editor/_source/classes/fcktoolbarspecialcombo.js create mode 100644 webdir/fckeditor/editor/_source/classes/fcktoolbarstylecombo.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckw3crange.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckxml.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckxml_gecko.js create mode 100644 webdir/fckeditor/editor/_source/classes/fckxml_ie.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fck_othercommands.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fckblockquotecommand.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fckcorestylecommand.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fckfitwindow.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fckindentcommands.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fckjustifycommands.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fcklistcommands.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fcknamedcommand.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fckpasteplaintextcommand.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fckpastewordcommand.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fckremoveformatcommand.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fckshowblocks.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fckspellcheckcommand_gecko.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fckspellcheckcommand_ie.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fckstylecommand.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fcktablecommand.js create mode 100644 webdir/fckeditor/editor/_source/commandclasses/fcktextcolorcommand.js create mode 100644 webdir/fckeditor/editor/_source/fckconstants.js create mode 100644 webdir/fckeditor/editor/_source/fckeditorapi.js create mode 100644 webdir/fckeditor/editor/_source/fckjscoreextensions.js create mode 100644 webdir/fckeditor/editor/_source/fckscriptloader.js create mode 100644 webdir/fckeditor/editor/_source/internals/fck.js create mode 100644 webdir/fckeditor/editor/_source/internals/fck_contextmenu.js create mode 100644 webdir/fckeditor/editor/_source/internals/fck_gecko.js create mode 100644 webdir/fckeditor/editor/_source/internals/fck_ie.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckbrowserinfo.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckcodeformatter.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckcommands.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckconfig.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckdebug.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckdebug_empty.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckdialog.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckdocumentprocessor.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckdomtools.js create mode 100644 webdir/fckeditor/editor/_source/internals/fcklanguagemanager.js create mode 100644 webdir/fckeditor/editor/_source/internals/fcklisthandler.js create mode 100644 webdir/fckeditor/editor/_source/internals/fcklistslib.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckplugins.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckregexlib.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckselection.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckselection_gecko.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckselection_ie.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckstyles.js create mode 100644 webdir/fckeditor/editor/_source/internals/fcktablehandler.js create mode 100644 webdir/fckeditor/editor/_source/internals/fcktablehandler_gecko.js create mode 100644 webdir/fckeditor/editor/_source/internals/fcktablehandler_ie.js create mode 100644 webdir/fckeditor/editor/_source/internals/fcktoolbaritems.js create mode 100644 webdir/fckeditor/editor/_source/internals/fcktoolbarset.js create mode 100644 webdir/fckeditor/editor/_source/internals/fcktools.js create mode 100644 webdir/fckeditor/editor/_source/internals/fcktools_gecko.js create mode 100644 webdir/fckeditor/editor/_source/internals/fcktools_ie.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckundo.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckurlparams.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckxhtml.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckxhtml_gecko.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckxhtml_ie.js create mode 100644 webdir/fckeditor/editor/_source/internals/fckxhtmlentities.js create mode 100644 webdir/fckeditor/editor/css/behaviors/disablehandles.htc create mode 100644 webdir/fckeditor/editor/css/behaviors/showtableborders.htc create mode 100644 webdir/fckeditor/editor/css/fck_editorarea.css create mode 100644 webdir/fckeditor/editor/css/fck_internal.css create mode 100644 webdir/fckeditor/editor/css/fck_showtableborders_gecko.css create mode 100644 webdir/fckeditor/editor/css/images/block_address.png create mode 100644 webdir/fckeditor/editor/css/images/block_blockquote.png create mode 100644 webdir/fckeditor/editor/css/images/block_div.png create mode 100644 webdir/fckeditor/editor/css/images/block_h1.png create mode 100644 webdir/fckeditor/editor/css/images/block_h2.png create mode 100644 webdir/fckeditor/editor/css/images/block_h3.png create mode 100644 webdir/fckeditor/editor/css/images/block_h4.png create mode 100644 webdir/fckeditor/editor/css/images/block_h5.png create mode 100644 webdir/fckeditor/editor/css/images/block_h6.png create mode 100644 webdir/fckeditor/editor/css/images/block_p.png create mode 100644 webdir/fckeditor/editor/css/images/block_pre.png create mode 100644 webdir/fckeditor/editor/css/images/fck_anchor.gif create mode 100644 webdir/fckeditor/editor/css/images/fck_flashlogo.gif create mode 100644 webdir/fckeditor/editor/css/images/fck_hiddenfield.gif create mode 100644 webdir/fckeditor/editor/css/images/fck_pagebreak.gif create mode 100644 webdir/fckeditor/editor/css/images/fck_plugin.gif create mode 100644 webdir/fckeditor/editor/dialog/common/fck_dialog_common.css create mode 100644 webdir/fckeditor/editor/dialog/common/fck_dialog_common.js create mode 100644 webdir/fckeditor/editor/dialog/common/images/locked.gif create mode 100644 webdir/fckeditor/editor/dialog/common/images/reset.gif create mode 100644 webdir/fckeditor/editor/dialog/common/images/unlocked.gif create mode 100644 webdir/fckeditor/editor/dialog/fck_about.html create mode 100644 webdir/fckeditor/editor/dialog/fck_about/logo_fckeditor.gif create mode 100644 webdir/fckeditor/editor/dialog/fck_about/logo_fredck.gif create mode 100644 webdir/fckeditor/editor/dialog/fck_about/sponsors/spellchecker_net.gif create mode 100644 webdir/fckeditor/editor/dialog/fck_anchor.html create mode 100644 webdir/fckeditor/editor/dialog/fck_button.html create mode 100644 webdir/fckeditor/editor/dialog/fck_checkbox.html create mode 100644 webdir/fckeditor/editor/dialog/fck_colorselector.html create mode 100644 webdir/fckeditor/editor/dialog/fck_div.html create mode 100644 webdir/fckeditor/editor/dialog/fck_docprops.html create mode 100644 webdir/fckeditor/editor/dialog/fck_docprops/fck_document_preview.html create mode 100644 webdir/fckeditor/editor/dialog/fck_flash.html create mode 100644 webdir/fckeditor/editor/dialog/fck_flash/fck_flash.js create mode 100644 webdir/fckeditor/editor/dialog/fck_flash/fck_flash_preview.html create mode 100644 webdir/fckeditor/editor/dialog/fck_form.html create mode 100644 webdir/fckeditor/editor/dialog/fck_hiddenfield.html create mode 100644 webdir/fckeditor/editor/dialog/fck_image.html create mode 100644 webdir/fckeditor/editor/dialog/fck_image/fck_image.js create mode 100644 webdir/fckeditor/editor/dialog/fck_image/fck_image_preview.html create mode 100644 webdir/fckeditor/editor/dialog/fck_link.html create mode 100644 webdir/fckeditor/editor/dialog/fck_link/fck_link.js create mode 100644 webdir/fckeditor/editor/dialog/fck_listprop.html create mode 100644 webdir/fckeditor/editor/dialog/fck_paste.html create mode 100644 webdir/fckeditor/editor/dialog/fck_radiobutton.html create mode 100644 webdir/fckeditor/editor/dialog/fck_replace.html create mode 100644 webdir/fckeditor/editor/dialog/fck_select.html create mode 100644 webdir/fckeditor/editor/dialog/fck_select/fck_select.js create mode 100644 webdir/fckeditor/editor/dialog/fck_smiley.html create mode 100644 webdir/fckeditor/editor/dialog/fck_source.html create mode 100644 webdir/fckeditor/editor/dialog/fck_specialchar.html create mode 100644 webdir/fckeditor/editor/dialog/fck_spellerpages.html create mode 100644 webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/blank.html create mode 100644 webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controlWindow.js create mode 100644 webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/controls.html create mode 100644 webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.cfm create mode 100644 webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php create mode 100644 webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl create mode 100644 webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellChecker.js create mode 100644 webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellchecker.html create mode 100644 webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/spellerStyle.css create mode 100644 webdir/fckeditor/editor/dialog/fck_spellerpages/spellerpages/wordWindow.js create mode 100644 webdir/fckeditor/editor/dialog/fck_table.html create mode 100644 webdir/fckeditor/editor/dialog/fck_tablecell.html create mode 100644 webdir/fckeditor/editor/dialog/fck_template.html create mode 100644 webdir/fckeditor/editor/dialog/fck_template/images/template1.gif create mode 100644 webdir/fckeditor/editor/dialog/fck_template/images/template2.gif create mode 100644 webdir/fckeditor/editor/dialog/fck_template/images/template3.gif create mode 100644 webdir/fckeditor/editor/dialog/fck_textarea.html create mode 100644 webdir/fckeditor/editor/dialog/fck_textfield.html create mode 100644 webdir/fckeditor/editor/dtd/fck_dtd_test.html create mode 100644 webdir/fckeditor/editor/dtd/fck_xhtml10strict.js create mode 100644 webdir/fckeditor/editor/dtd/fck_xhtml10transitional.js create mode 100644 webdir/fckeditor/editor/fckdebug.html create mode 100644 webdir/fckeditor/editor/fckdialog.html create mode 100644 webdir/fckeditor/editor/fckeditor.html create mode 100644 webdir/fckeditor/editor/fckeditor.original.html create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/browser.css create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/browser.html create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/frmactualfolder.html create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/frmcreatefolder.html create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/frmfolders.html create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/frmresourceslist.html create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/frmresourcetype.html create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/frmupload.html create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/ButtonArrow.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/Folder.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/Folder32.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/FolderOpened.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/FolderOpened32.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/FolderUp.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/ai.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/avi.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/bmp.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/cs.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/default.icon.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/dll.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/doc.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/exe.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/fla.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/gif.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/htm.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/html.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/jpg.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/js.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/mdb.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/mp3.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/pdf.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/png.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/ppt.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/rdp.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/swf.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/swt.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/txt.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/vsd.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/xls.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/xml.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/32/zip.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/ai.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/avi.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/bmp.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/cs.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/default.icon.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/dll.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/doc.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/exe.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/fla.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/gif.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/htm.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/html.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/jpg.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/js.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/mdb.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/mp3.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/pdf.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/png.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/ppt.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/rdp.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/swf.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/swt.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/txt.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/vsd.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/xls.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/xml.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/icons/zip.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/images/spacer.gif create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/js/common.js create mode 100644 webdir/fckeditor/editor/filemanager/browser/default/js/fckxml.js create mode 100644 webdir/fckeditor/editor/filemanager/connectors/asp/basexml.asp create mode 100644 webdir/fckeditor/editor/filemanager/connectors/asp/class_upload.asp create mode 100644 webdir/fckeditor/editor/filemanager/connectors/asp/commands.asp create mode 100644 webdir/fckeditor/editor/filemanager/connectors/asp/config.asp create mode 100644 webdir/fckeditor/editor/filemanager/connectors/asp/connector.asp create mode 100644 webdir/fckeditor/editor/filemanager/connectors/asp/io.asp create mode 100644 webdir/fckeditor/editor/filemanager/connectors/asp/upload.asp create mode 100644 webdir/fckeditor/editor/filemanager/connectors/asp/util.asp create mode 100644 webdir/fckeditor/editor/filemanager/connectors/aspx/config.ascx create mode 100644 webdir/fckeditor/editor/filemanager/connectors/aspx/connector.aspx create mode 100644 webdir/fckeditor/editor/filemanager/connectors/aspx/upload.aspx create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/ImageObject.cfc create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/cf5_connector.cfm create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/cf5_upload.cfm create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/cf_basexml.cfm create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/cf_commands.cfm create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/cf_connector.cfm create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/cf_io.cfm create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/cf_upload.cfm create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/cf_util.cfm create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/config.cfm create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/connector.cfm create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/image.cfc create mode 100644 webdir/fckeditor/editor/filemanager/connectors/cfm/upload.cfm create mode 100644 webdir/fckeditor/editor/filemanager/connectors/lasso/config.lasso create mode 100644 webdir/fckeditor/editor/filemanager/connectors/lasso/connector.lasso create mode 100644 webdir/fckeditor/editor/filemanager/connectors/lasso/upload.lasso create mode 100644 webdir/fckeditor/editor/filemanager/connectors/perl/basexml.pl create mode 100644 webdir/fckeditor/editor/filemanager/connectors/perl/commands.pl create mode 100644 webdir/fckeditor/editor/filemanager/connectors/perl/config.pl create mode 100644 webdir/fckeditor/editor/filemanager/connectors/perl/connector.cgi create mode 100644 webdir/fckeditor/editor/filemanager/connectors/perl/io.pl create mode 100644 webdir/fckeditor/editor/filemanager/connectors/perl/upload.cgi create mode 100644 webdir/fckeditor/editor/filemanager/connectors/perl/upload_fck.pl create mode 100644 webdir/fckeditor/editor/filemanager/connectors/perl/util.pl create mode 100644 webdir/fckeditor/editor/filemanager/connectors/php/basexml.php create mode 100644 webdir/fckeditor/editor/filemanager/connectors/php/commands.php create mode 100644 webdir/fckeditor/editor/filemanager/connectors/php/config.php create mode 100644 webdir/fckeditor/editor/filemanager/connectors/php/connector.php create mode 100644 webdir/fckeditor/editor/filemanager/connectors/php/io.php create mode 100644 webdir/fckeditor/editor/filemanager/connectors/php/phpcompat.php create mode 100644 webdir/fckeditor/editor/filemanager/connectors/php/upload.php create mode 100644 webdir/fckeditor/editor/filemanager/connectors/php/util.php create mode 100644 webdir/fckeditor/editor/filemanager/connectors/py/config.py create mode 100644 webdir/fckeditor/editor/filemanager/connectors/py/connector.py create mode 100644 webdir/fckeditor/editor/filemanager/connectors/py/fckcommands.py create mode 100644 webdir/fckeditor/editor/filemanager/connectors/py/fckconnector.py create mode 100644 webdir/fckeditor/editor/filemanager/connectors/py/fckoutput.py create mode 100644 webdir/fckeditor/editor/filemanager/connectors/py/fckutil.py create mode 100644 webdir/fckeditor/editor/filemanager/connectors/py/htaccess.txt create mode 100644 webdir/fckeditor/editor/filemanager/connectors/py/upload.py create mode 100644 webdir/fckeditor/editor/filemanager/connectors/py/wsgi.py create mode 100644 webdir/fckeditor/editor/filemanager/connectors/py/zope.py create mode 100644 webdir/fckeditor/editor/filemanager/connectors/test.html create mode 100644 webdir/fckeditor/editor/filemanager/connectors/uploadtest.html create mode 100644 webdir/fckeditor/editor/images/anchor.gif create mode 100644 webdir/fckeditor/editor/images/arrow_ltr.gif create mode 100644 webdir/fckeditor/editor/images/arrow_rtl.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/angel_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/angry_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/broken_heart.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/cake.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/confused_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/cry_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/devil_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/embaressed_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/envelope.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/heart.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/kiss.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/lightbulb.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/omg_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/regular_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/sad_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/shades_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/teeth_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/thumbs_down.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/thumbs_up.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/tounge_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/whatchutalkingabout_smile.gif create mode 100644 webdir/fckeditor/editor/images/smiley/msn/wink_smile.gif create mode 100644 webdir/fckeditor/editor/images/spacer.gif create mode 100644 webdir/fckeditor/editor/js/fckadobeair.js create mode 100644 webdir/fckeditor/editor/js/fckeditorcode_gecko.js create mode 100644 webdir/fckeditor/editor/js/fckeditorcode_ie.js create mode 100644 webdir/fckeditor/editor/lang/_translationstatus.txt create mode 100644 webdir/fckeditor/editor/lang/af.js create mode 100644 webdir/fckeditor/editor/lang/ar.js create mode 100644 webdir/fckeditor/editor/lang/bg.js create mode 100644 webdir/fckeditor/editor/lang/bn.js create mode 100644 webdir/fckeditor/editor/lang/bs.js create mode 100644 webdir/fckeditor/editor/lang/ca.js create mode 100644 webdir/fckeditor/editor/lang/cs.js create mode 100644 webdir/fckeditor/editor/lang/da.js create mode 100644 webdir/fckeditor/editor/lang/de.js create mode 100644 webdir/fckeditor/editor/lang/el.js create mode 100644 webdir/fckeditor/editor/lang/en-au.js create mode 100644 webdir/fckeditor/editor/lang/en-ca.js create mode 100644 webdir/fckeditor/editor/lang/en-uk.js create mode 100644 webdir/fckeditor/editor/lang/en.js create mode 100644 webdir/fckeditor/editor/lang/eo.js create mode 100644 webdir/fckeditor/editor/lang/es.js create mode 100644 webdir/fckeditor/editor/lang/et.js create mode 100644 webdir/fckeditor/editor/lang/eu.js create mode 100644 webdir/fckeditor/editor/lang/fa.js create mode 100644 webdir/fckeditor/editor/lang/fi.js create mode 100644 webdir/fckeditor/editor/lang/fo.js create mode 100644 webdir/fckeditor/editor/lang/fr-ca.js create mode 100644 webdir/fckeditor/editor/lang/fr.js create mode 100644 webdir/fckeditor/editor/lang/gl.js create mode 100644 webdir/fckeditor/editor/lang/gu.js create mode 100644 webdir/fckeditor/editor/lang/he.js create mode 100644 webdir/fckeditor/editor/lang/hi.js create mode 100644 webdir/fckeditor/editor/lang/hr.js create mode 100644 webdir/fckeditor/editor/lang/hu.js create mode 100644 webdir/fckeditor/editor/lang/is.js create mode 100644 webdir/fckeditor/editor/lang/it.js create mode 100644 webdir/fckeditor/editor/lang/ja.js create mode 100644 webdir/fckeditor/editor/lang/km.js create mode 100644 webdir/fckeditor/editor/lang/ko.js create mode 100644 webdir/fckeditor/editor/lang/lt.js create mode 100644 webdir/fckeditor/editor/lang/lv.js create mode 100644 webdir/fckeditor/editor/lang/mn.js create mode 100644 webdir/fckeditor/editor/lang/ms.js create mode 100644 webdir/fckeditor/editor/lang/nb.js create mode 100644 webdir/fckeditor/editor/lang/nl.js create mode 100644 webdir/fckeditor/editor/lang/no.js create mode 100644 webdir/fckeditor/editor/lang/pl.js create mode 100644 webdir/fckeditor/editor/lang/pt-br.js create mode 100644 webdir/fckeditor/editor/lang/pt.js create mode 100644 webdir/fckeditor/editor/lang/ro.js create mode 100644 webdir/fckeditor/editor/lang/ru.js create mode 100644 webdir/fckeditor/editor/lang/sk.js create mode 100644 webdir/fckeditor/editor/lang/sl.js create mode 100644 webdir/fckeditor/editor/lang/sr-latn.js create mode 100644 webdir/fckeditor/editor/lang/sr.js create mode 100644 webdir/fckeditor/editor/lang/sv.js create mode 100644 webdir/fckeditor/editor/lang/th.js create mode 100644 webdir/fckeditor/editor/lang/tr.js create mode 100644 webdir/fckeditor/editor/lang/uk.js create mode 100644 webdir/fckeditor/editor/lang/vi.js create mode 100644 webdir/fckeditor/editor/lang/zh-cn.js create mode 100644 webdir/fckeditor/editor/lang/zh.js create mode 100644 webdir/fckeditor/editor/plugins/autogrow/fckplugin.js create mode 100644 webdir/fckeditor/editor/plugins/bbcode/_sample/sample.config.js create mode 100644 webdir/fckeditor/editor/plugins/bbcode/_sample/sample.html create mode 100644 webdir/fckeditor/editor/plugins/bbcode/fckplugin.js create mode 100644 webdir/fckeditor/editor/plugins/dragresizetable/fckplugin.js create mode 100644 webdir/fckeditor/editor/plugins/placeholder/fck_placeholder.html create mode 100644 webdir/fckeditor/editor/plugins/placeholder/fckplugin.js create mode 100644 webdir/fckeditor/editor/plugins/placeholder/lang/de.js create mode 100644 webdir/fckeditor/editor/plugins/placeholder/lang/en.js create mode 100644 webdir/fckeditor/editor/plugins/placeholder/lang/es.js create mode 100644 webdir/fckeditor/editor/plugins/placeholder/lang/fr.js create mode 100644 webdir/fckeditor/editor/plugins/placeholder/lang/it.js create mode 100644 webdir/fckeditor/editor/plugins/placeholder/lang/pl.js create mode 100644 webdir/fckeditor/editor/plugins/placeholder/placeholder.gif create mode 100644 webdir/fckeditor/editor/plugins/simplecommands/fckplugin.js create mode 100644 webdir/fckeditor/editor/plugins/tablecommands/fckplugin.js create mode 100644 webdir/fckeditor/editor/skins/_fckviewstrips.html create mode 100644 webdir/fckeditor/editor/skins/default/fck_dialog.css create mode 100644 webdir/fckeditor/editor/skins/default/fck_dialog_ie6.js create mode 100644 webdir/fckeditor/editor/skins/default/fck_editor.css create mode 100644 webdir/fckeditor/editor/skins/default/fck_strip.gif create mode 100644 webdir/fckeditor/editor/skins/default/images/dialog.sides.gif create mode 100644 webdir/fckeditor/editor/skins/default/images/dialog.sides.png create mode 100644 webdir/fckeditor/editor/skins/default/images/dialog.sides.rtl.png create mode 100644 webdir/fckeditor/editor/skins/default/images/sprites.gif create mode 100644 webdir/fckeditor/editor/skins/default/images/sprites.png create mode 100644 webdir/fckeditor/editor/skins/default/images/toolbar.arrowright.gif create mode 100644 webdir/fckeditor/editor/skins/default/images/toolbar.buttonarrow.gif create mode 100644 webdir/fckeditor/editor/skins/default/images/toolbar.collapse.gif create mode 100644 webdir/fckeditor/editor/skins/default/images/toolbar.end.gif create mode 100644 webdir/fckeditor/editor/skins/default/images/toolbar.expand.gif create mode 100644 webdir/fckeditor/editor/skins/default/images/toolbar.separator.gif create mode 100644 webdir/fckeditor/editor/skins/default/images/toolbar.start.gif create mode 100644 webdir/fckeditor/editor/skins/office2003/fck_dialog.css create mode 100644 webdir/fckeditor/editor/skins/office2003/fck_dialog_ie6.js create mode 100644 webdir/fckeditor/editor/skins/office2003/fck_editor.css create mode 100644 webdir/fckeditor/editor/skins/office2003/fck_strip.gif create mode 100644 webdir/fckeditor/editor/skins/office2003/images/dialog.sides.gif create mode 100644 webdir/fckeditor/editor/skins/office2003/images/dialog.sides.png create mode 100644 webdir/fckeditor/editor/skins/office2003/images/dialog.sides.rtl.png create mode 100644 webdir/fckeditor/editor/skins/office2003/images/sprites.gif create mode 100644 webdir/fckeditor/editor/skins/office2003/images/sprites.png create mode 100644 webdir/fckeditor/editor/skins/office2003/images/toolbar.arrowright.gif create mode 100644 webdir/fckeditor/editor/skins/office2003/images/toolbar.bg.gif create mode 100644 webdir/fckeditor/editor/skins/office2003/images/toolbar.buttonarrow.gif create mode 100644 webdir/fckeditor/editor/skins/office2003/images/toolbar.collapse.gif create mode 100644 webdir/fckeditor/editor/skins/office2003/images/toolbar.end.gif create mode 100644 webdir/fckeditor/editor/skins/office2003/images/toolbar.expand.gif create mode 100644 webdir/fckeditor/editor/skins/office2003/images/toolbar.separator.gif create mode 100644 webdir/fckeditor/editor/skins/office2003/images/toolbar.start.gif create mode 100644 webdir/fckeditor/editor/skins/silver/fck_dialog.css create mode 100644 webdir/fckeditor/editor/skins/silver/fck_dialog_ie6.js create mode 100644 webdir/fckeditor/editor/skins/silver/fck_editor.css create mode 100644 webdir/fckeditor/editor/skins/silver/fck_strip.gif create mode 100644 webdir/fckeditor/editor/skins/silver/images/dialog.sides.gif create mode 100644 webdir/fckeditor/editor/skins/silver/images/dialog.sides.png create mode 100644 webdir/fckeditor/editor/skins/silver/images/dialog.sides.rtl.png create mode 100644 webdir/fckeditor/editor/skins/silver/images/sprites.gif create mode 100644 webdir/fckeditor/editor/skins/silver/images/sprites.png create mode 100644 webdir/fckeditor/editor/skins/silver/images/toolbar.arrowright.gif create mode 100644 webdir/fckeditor/editor/skins/silver/images/toolbar.buttonarrow.gif create mode 100644 webdir/fckeditor/editor/skins/silver/images/toolbar.buttonbg.gif create mode 100644 webdir/fckeditor/editor/skins/silver/images/toolbar.collapse.gif create mode 100644 webdir/fckeditor/editor/skins/silver/images/toolbar.end.gif create mode 100644 webdir/fckeditor/editor/skins/silver/images/toolbar.expand.gif create mode 100644 webdir/fckeditor/editor/skins/silver/images/toolbar.separator.gif create mode 100644 webdir/fckeditor/editor/skins/silver/images/toolbar.start.gif create mode 100644 webdir/fckeditor/editor/wsc/ciframe.html create mode 100644 webdir/fckeditor/editor/wsc/tmpFrameset.html create mode 100644 webdir/fckeditor/editor/wsc/w.html create mode 100644 webdir/fckeditor/fckconfig.js create mode 100644 webdir/fckeditor/fckeditor.afp create mode 100644 webdir/fckeditor/fckeditor.asp create mode 100644 webdir/fckeditor/fckeditor.cfc create mode 100644 webdir/fckeditor/fckeditor.cfm create mode 100644 webdir/fckeditor/fckeditor.js create mode 100644 webdir/fckeditor/fckeditor.lasso create mode 100644 webdir/fckeditor/fckeditor.php create mode 100644 webdir/fckeditor/fckeditor.pl create mode 100644 webdir/fckeditor/fckeditor.py create mode 100644 webdir/fckeditor/fckeditor_php4.php create mode 100644 webdir/fckeditor/fckeditor_php5.php create mode 100644 webdir/fckeditor/fckpackager.xml create mode 100644 webdir/fckeditor/fckstyles.xml create mode 100644 webdir/fckeditor/fcktemplates.xml create mode 100644 webdir/fckeditor/fckutils.cfm create mode 100644 webdir/fckeditor/license.txt create mode 100755 webdir/images/search_icon.png create mode 100755 webdir/javascript/fck_custom_config.js create mode 100644 webdir/javascript/yui/assets/skins/sam/ajax-loader.gif create mode 100644 webdir/javascript/yui/assets/skins/sam/bg-h.gif create mode 100644 webdir/javascript/yui/assets/skins/sam/bg-v.gif create mode 100644 webdir/javascript/yui/carousel/assets/skins/sam/ajax-loader.gif create mode 100644 webdir/javascript/yui/carousel/carousel-debug.js create mode 100644 webdir/javascript/yui/carousel/carousel-min.js create mode 100644 webdir/javascript/yui/carousel/carousel.js create mode 100644 webdir/javascript/yui/charts/charts-debug.js create mode 100644 webdir/javascript/yui/charts/charts-min.js create mode 100644 webdir/javascript/yui/charts/charts.js create mode 100644 webdir/javascript/yui/element/element-debug.js create mode 100644 webdir/javascript/yui/element/element-min.js create mode 100644 webdir/javascript/yui/element/element.js create mode 100644 webdir/javascript/yui/imagecropper/imagecropper-debug.js create mode 100644 webdir/javascript/yui/imagecropper/imagecropper-min.js create mode 100644 webdir/javascript/yui/imagecropper/imagecropper.js create mode 100644 webdir/javascript/yui/profilerviewer/assets/profilerviewer-core.css create mode 100644 webdir/javascript/yui/profilerviewer/assets/skins/sam/profilerviewer-skin.css create mode 100644 webdir/javascript/yui/profilerviewer/profilerviewer-debug.js create mode 100644 webdir/javascript/yui/profilerviewer/profilerviewer-min.js create mode 100644 webdir/javascript/yui/profilerviewer/profilerviewer.js create mode 100644 webdir/javascript/yui/selector/selector-debug.js create mode 100644 webdir/javascript/yui/selector/selector-min.js create mode 100644 webdir/javascript/yui/selector/selector.js create mode 100644 webdir/javascript/yui/slider/assets/skins/sam/bg-h.gif create mode 100644 webdir/javascript/yui/slider/assets/skins/sam/bg-v.gif create mode 100644 webdir/javascript/yui/slider/assets/slider-skin.css create mode 100644 webdir/javascript/yui/stylesheet/stylesheet-debug.js create mode 100644 webdir/javascript/yui/stylesheet/stylesheet-min.js create mode 100644 webdir/javascript/yui/stylesheet/stylesheet.js create mode 100644 webdir/javascript/yui/treeview/assets/check0.gif create mode 100644 webdir/javascript/yui/treeview/assets/check1.gif create mode 100644 webdir/javascript/yui/treeview/assets/check2.gif create mode 100644 webdir/javascript/yui/treeview/assets/loading.gif create mode 100644 webdir/javascript/yui/treeview/assets/treeview-skin.css create mode 100644 webdir/javascript/yui/treeview/assets/treeview-sprite.gif create mode 100644 webdir/javascript/yui/uploader/uploader-debug.js create mode 100644 webdir/javascript/yui/uploader/uploader-min.js create mode 100644 webdir/javascript/yui/uploader/uploader.js diff --git a/Acl.php b/Acl.php index 0b4631e..cb83dbf 100755 --- a/Acl.php +++ b/Acl.php @@ -10,102 +10,115 @@ */ -self::$acl->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); +self::$acl->addRole(new Zend_Acl_Role(Users_Model_User::ROLE_GUEST)) + ->addRole(new Zend_Acl_Role(Users_Model_User::ROLE_REGISTERED), Users_Model_User::ROLE_GUEST) + ->addRole(new Zend_Acl_Role(Users_Model_User::ROLE_ADMIN), Users_Model_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']['index']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['default']['identity']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['default']['identity']['id'] = Users_Model_User::ROLE_GUEST; -$privileges['default']['error']['error'] = User::ROLE_GUEST; +$privileges['default']['error']['error'] = Users_Model_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']['openid']['provider'] = Users_Model_User::ROLE_GUEST; +$privileges['default']['openid']['login'] = Users_Model_User::ROLE_GUEST; +$privileges['default']['openid']['authenticate'] = Users_Model_User::ROLE_GUEST; +$privileges['default']['openid']['trust'] = Users_Model_User::ROLE_REGISTERED; +$privileges['default']['openid']['proceed'] = Users_Model_User::ROLE_REGISTERED; -$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']['sites']['index'] = Users_Model_User::ROLE_REGISTERED; +$privileges['default']['sites']['list'] = Users_Model_User::ROLE_REGISTERED; +$privileges['default']['sites']['deny'] = Users_Model_User::ROLE_REGISTERED; +$privileges['default']['sites']['allow'] = Users_Model_User::ROLE_REGISTERED; +$privileges['default']['sites']['delete'] = Users_Model_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']['history']['index'] = Users_Model_User::ROLE_REGISTERED; +$privileges['default']['history']['list'] = Users_Model_User::ROLE_REGISTERED; +$privileges['default']['history']['clear'] = Users_Model_User::ROLE_REGISTERED; -$privileges['default']['messageusers']['index'] = User::ROLE_ADMIN; -$privileges['default']['messageusers']['send'] = User::ROLE_ADMIN; +$privileges['default']['messageusers']['index'] = Users_Model_User::ROLE_ADMIN; +$privileges['default']['messageusers']['send'] = Users_Model_User::ROLE_ADMIN; -$privileges['default']['maintenancemode']['enable'] = User::ROLE_ADMIN; -$privileges['default']['maintenancemode']['disable'] = User::ROLE_ADMIN; +$privileges['default']['maintenancemode']['enable'] = Users_Model_User::ROLE_ADMIN; +$privileges['default']['maintenancemode']['disable'] = Users_Model_User::ROLE_ADMIN; -$privileges['default']['feedback']['index'] = User::ROLE_GUEST; -$privileges['default']['feedback']['send'] = User::ROLE_GUEST; +$privileges['default']['feedback']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['default']['feedback']['send'] = Users_Model_User::ROLE_GUEST; -$privileges['default']['privacy']['index'] = User::ROLE_GUEST; +$privileges['default']['privacy']['index'] = Users_Model_User::ROLE_GUEST; -$privileges['default']['about']['index'] = User::ROLE_GUEST; +$privileges['default']['about']['index'] = Users_Model_User::ROLE_GUEST; -$privileges['default']['learnmore']['index'] = User::ROLE_GUEST; +$privileges['default']['learnmore']['index'] = Users_Model_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['default']['cid']['index'] = Users_Model_User::ROLE_ADMIN; -$privileges['users']['login']['index'] = User::ROLE_GUEST; -$privileges['users']['login']['logout'] = User::ROLE_GUEST; -$privileges['users']['login']['authenticate'] = User::ROLE_GUEST; +$privileges['install']['index']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['install']['permissions']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['install']['credentials']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['install']['credentials']['save'] = Users_Model_User::ROLE_GUEST; +$privileges['install']['complete']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['install']['upgrade']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['install']['upgrade']['proceed'] = Users_Model_User::ROLE_GUEST; -$privileges['users']['userlist']['index'] = User::ROLE_ADMIN; +$privileges['users']['login']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['users']['login']['logout'] = Users_Model_User::ROLE_GUEST; +$privileges['users']['login']['authenticate'] = Users_Model_User::ROLE_GUEST; -$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']['userlist']['index'] = Users_Model_User::ROLE_ADMIN; -$privileges['users']['profile']['index'] = User::ROLE_REGISTERED; -$privileges['users']['profile']['edit'] = User::ROLE_REGISTERED; -$privileges['users']['profile']['save'] = User::ROLE_REGISTERED; +$privileges['users']['register']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['users']['register']['save'] = Users_Model_User::ROLE_GUEST; +$privileges['users']['register']['eula'] = Users_Model_User::ROLE_GUEST; +$privileges['users']['register']['declineeula'] = Users_Model_User::ROLE_GUEST; +$privileges['users']['register']['accepteula'] = Users_Model_User::ROLE_GUEST; -$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']['profile']['index'] = Users_Model_User::ROLE_REGISTERED; +$privileges['users']['profile']['edit'] = Users_Model_User::ROLE_REGISTERED; +$privileges['users']['profile']['save'] = Users_Model_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']['personalinfo']['index'] = Users_Model_User::ROLE_REGISTERED; +$privileges['users']['personalinfo']['show'] = Users_Model_User::ROLE_REGISTERED; +$privileges['users']['personalinfo']['edit'] = Users_Model_User::ROLE_REGISTERED; +$privileges['users']['personalinfo']['save'] = Users_Model_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']['profilegeneral']['accountinfo'] = Users_Model_User::ROLE_REGISTERED; +$privileges['users']['profilegeneral']['editaccountinfo'] = Users_Model_User::ROLE_REGISTERED; +$privileges['users']['profilegeneral']['saveaccountinfo'] = Users_Model_User::ROLE_REGISTERED; +$privileges['users']['profilegeneral']['changepassword'] = Users_Model_User::ROLE_REGISTERED; +$privileges['users']['profilegeneral']['savepassword'] = Users_Model_User::ROLE_REGISTERED; +$privileges['users']['profilegeneral']['confirmdelete'] = Users_Model_User::ROLE_REGISTERED; +$privileges['users']['profilegeneral']['delete'] = Users_Model_User::ROLE_REGISTERED; -$privileges['users']['manageusers']['index'] = User::ROLE_ADMIN; -$privileges['users']['manageusers']['delete'] = User::ROLE_ADMIN; -$privileges['users']['manageusers']['deleteunconfirmed'] = User::ROLE_ADMIN; +$privileges['users']['recoverpassword']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['users']['recoverpassword']['send'] = Users_Model_User::ROLE_GUEST; +$privileges['users']['recoverpassword']['reset'] = Users_Model_User::ROLE_GUEST; -$privileges['users']['userslist']['index'] = User::ROLE_ADMIN; +$privileges['users']['manageusers']['index'] = Users_Model_User::ROLE_ADMIN; +$privileges['users']['manageusers']['delete'] = Users_Model_User::ROLE_ADMIN; +$privileges['users']['manageusers']['deleteunconfirmed'] = Users_Model_User::ROLE_ADMIN; +$privileges['users']['manageusers']['sendreminder'] = Users_Model_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; +$privileges['users']['userslist']['index'] = Users_Model_User::ROLE_ADMIN; + +$privileges['stats']['index']['index'] = Users_Model_User::ROLE_ADMIN; +$privileges['stats']['registrations']['index'] = Users_Model_User::ROLE_ADMIN; +$privileges['stats']['registrations']['graph'] = Users_Model_User::ROLE_ADMIN; +$privileges['stats']['authorizations']['index'] = Users_Model_User::ROLE_ADMIN; +$privileges['stats']['authorizations']['graph'] = Users_Model_User::ROLE_ADMIN; +$privileges['stats']['sites']['index'] = Users_Model_User::ROLE_ADMIN; +$privileges['stats']['sites']['graph'] = Users_Model_User::ROLE_ADMIN; +$privileges['stats']['top']['index'] = Users_Model_User::ROLE_ADMIN; +$privileges['stats']['top']['graph'] = Users_Model_User::ROLE_ADMIN; + +$privileges['news']['index']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['news']['view']['index'] = Users_Model_User::ROLE_GUEST; +$privileges['news']['edit']['add'] = Users_Model_User::ROLE_ADMIN; +$privileges['news']['edit']['index'] = Users_Model_User::ROLE_ADMIN; +$privileges['news']['edit']['save'] = Users_Model_User::ROLE_ADMIN; +$privileges['news']['edit']['delete'] = Users_Model_User::ROLE_ADMIN; diff --git a/Application.php b/Application.php new file mode 100755 index 0000000..18e7bf1 --- /dev/null +++ b/Application.php @@ -0,0 +1,298 @@ +registerNamespace('Monkeys_'); + $loader->registerNamespace('CommunityID'); + $loader->registerNamespace('Auth'); + new Monkeys_Application_Module_Autoloader(array( + 'namespace' => '', + 'basePath' => APP_DIR . '/modules/default', + )); + new Monkeys_Application_Module_Autoloader(array( + 'namespace' => 'Users', + 'basePath' => APP_DIR . '/modules/users', + )); + new Monkeys_Application_Module_Autoloader(array( + 'namespace' => 'News', + 'basePath' => APP_DIR . '/modules/news', + )); + new Monkeys_Application_Module_Autoloader(array( + 'namespace' => 'Stats', + 'basePath' => APP_DIR . '/modules/stats', + )); + new Monkeys_Application_Module_Autoloader(array( + 'namespace' => 'Install', + 'basePath' => APP_DIR . '/modules/install', + )); + } + + public static function setConfig() + { + if (file_exists(APP_DIR . DIRECTORY_SEPARATOR . 'config.php')) { + $configFile = APP_DIR . DIRECTORY_SEPARATOR . 'config.php'; + } else { + $configFile = APP_DIR . DIRECTORY_SEPARATOR . 'config.default.php'; + } + + $config = array(); + require $configFile; + self::$config = new Zend_Config($config, array('allowModifications' => true)); + if(self::$config->environment->installed === null) { + $configFile = APP_DIR . DIRECTORY_SEPARATOR . 'config.default.php'; + require $configFile; + self::$config = new Zend_Config($config, array('allowModifications' => true)); + } + + // @todo: remove this when all interconnected apps use the same LDAP source + self::$config->environment->app = 'communityid'; + + Zend_Registry::set('config', self::$config); + } + + 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); + // unknown PHP bug (tested on PHP 2.8 and PHP 2.10) corrupts the $db reference, so I gotta retrieve it again: + $db = Zend_Db_Table_Abstract::getDefaultAdapter(); + 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') { + try { + $locale = new Zend_Locale(Zend_Locale::BROWSER); + } catch (Zend_Locale_Exception $e) { + // happens when no browser around, e.g. when calling the rest api by other means + $locale = new Zend_Locale('en_US'); + } + } 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); + + $route = new Zend_Controller_Router_Route( + 'news/:id', + array( + 'module' => 'news', + 'controller' => 'view', + 'action' => 'index', + ), + array('id' => '\d+') + ); + $router->addRoute('articleView', $route); + } + + public static function dispatch() + { + self::$front->dispatch(); + } +} + +/** +* this is just a global function used to mark translations +*/ +function translate() {} diff --git a/CHANGELOG b/CHANGELOG index 30930a0..975ecaf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,56 @@ +2009-08-21 Reiner Jung + +NEW FEATURES: + +- Community-ID news feed has been moved to a new About section, visible +only by admins. +- News in the home page are now manageable by the admin. +- Brute-force login attempts are now mitigated through the appearance of +a captcha after the third failed attempt, in both the main page login +section, and when trying to log-in while during an OpenID authentication. +- Removed requirement of having short_open_tag php.ini directive to be On. +- The user's OpenID URL is now visible in all pages when he's logged in. +- The Manage Users section now has a search field. +- You're able to delete unconfirmed users that have not confirmed their +account for a given number of days. +- You're able to send a reminder to unconfirmed users that have not +confirmed their account for a given number of days. +- Added sorting ability for the History Log table. Have it sort from +latest to oldest by default. +- Replaced rich-text editor in the Message Users section with the more +capable FCK Editor. +- Rich-text editor messages are filtered through the HTMLPurifier lib, +that filters out XSS and other malignous content. +- Upgraded Zend Framework to version 1.8.4PL1 + + +FIXED BUGS: + +- Fixed compatibility with OpenID relays that send their info through +POST instead of GET. +- Fixed support for relays not sending the OpenID identifier. This fixes +Facebook compatibility. +- Fixed clashes with other Zend Frameworks located in PHP's include path. +- Now only ascii characters will be allowed in the usernames, to avoid +problems in the OpenID URL. +- Fixed pagination issues in the Manage Users section. +- Fixed pagination issues in the History Log section. +- Fixed problems in the Feedback and Message Users forms. +- Mass-mailing to users will have the recipients in BCC instead of TO, +to avoid revealing E-mails to all recipients. +- Fixed layout issue of the login checkbox "Remember me", under IE and +Opera. +- Fixed some javascript error messages under IE. + + +NEW REQUIREMENTS: + +- Minimal supported PHP version is 5.2.4 + 2009-04-21 Reiner Jung -New features: +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. @@ -11,6 +61,7 @@ New features: - 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: +FIXED BUGS: + - 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 index f5bbd7f..cb02987 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -16,4 +16,3 @@ Translations Testing - diff --git a/INSTALL b/INSTALL index 4350db5..2eb0018 100644 --- a/INSTALL +++ b/INSTALL @@ -1,4 +1,13 @@ -This is the initial Install file for Community-ID. We will work on this file soon. +This is the initial Install file for Community-ID. + +UPGRADE PROCEDURE: + +- Replace all files with the new release, only conserving the config.php file. +- When going to the site, the upgrade will be detected automatically, +and you'll be asked to enter the admin credentials to proceed with the +upgrade. + +INSTALL PROCEDURE: For more information how to install Community-ID please have a look at the projekt wiki: diff --git a/README b/README index 9333cc1..b9a0b5d 100644 --- a/README +++ b/README @@ -1 +1,5 @@ -import things form https://sourceforge.net/projects/communityid/files/ +009-08-21 Reiner Jung + +NEW REQUIREMENTS: + +- Minimal supported PHP version is 5.2.4 diff --git a/bootstrap.php b/bootstrap.php index fa59987..9e8e755 100755 --- a/bootstrap.php +++ b/bootstrap.php @@ -9,18 +9,18 @@ * @packager Keyboard Monkeys */ -require 'Setup.php'; +require 'Application.php'; -Setup::setIncludePath(); -Setup::setAutoLoader(); -Setup::setConfig(); -Setup::setErrorReporting(); -Setup::setLogger(); -Setup::logRequest(); -Setup::setDatabase(); -Setup::setSession(); -Setup::setAcl(); -Setup::setI18N(); -Setup::setLayout(); -Setup::setFrontController(); -Setup::dispatch(); +Application::setIncludePath(); +Application::setAutoLoader(); +Application::setConfig(); +Application::setErrorReporting(); +Application::setLogger(); +Application::logRequest(); +Application::setDatabase(); +Application::setSession(); +Application::setAcl(); +Application::setI18N(); +Application::setLayout(); +Application::setFrontController(); +Application::dispatch(); diff --git a/config.default.php b/config.default.php index 2e70df3..c274018 100644 --- a/config.default.php +++ b/config.default.php @@ -18,14 +18,6 @@ $config['environment']['locale'] = 'auto'; $config['environment']['template'] = 'default'; - -# -# ------- HOME NEWS FEED ------------ -# -$config['news_feed']['url'] = 'http://source.keyboard-monkeys.org/projects/communityid/news?format=atom'; -$config['news_feed']['num_items'] = 3; - - # # ------- LOGGING ------------ # diff --git a/config.template.php b/config.template.php index 208f812..a8ee298 100644 --- a/config.template.php +++ b/config.template.php @@ -20,13 +20,6 @@ $config['environment']['template'] = '{environment.template}'; $config['environment']['news_feed'] = '{environment.news_feed}'; -# -# ------- HOME NEWS FEED ------------ -# -$config['news_feed']['url'] = '{news_feed.url}'; -$config['news_feed']['num_items'] = {news_feed.num_items}; - - # # ------- LOGGING ------------ # diff --git a/languages/en/lang.mo b/languages/en/lang.mo index 27dd1f1c2a7e2bfc35f7b1283ea653662ef244f4..03f68351b464f72279346b63c7cbf136fabad009 100644 GIT binary patch literal 16376 zcmeI2dvqMteaA0ga4?uxcp3s@2jl0;GGMR;HkM`C7D%#?WE)dnqur4-*6z+Svuh!! zfzTvCa6%FwB_xCrC?*s_LK;GNB?MAPQWBula1Jd^Da|<~rEQvX(k3O)&-cz9?Fwwd zpZ!B~{M*mmJ2Ut3yT9M>KIB&qnR1iidI>oOd2t_OX76Fl_UXzs#yiBA55bvmC7cht z;Rx)954-e%A2#M}(icFo%r_jLgi}fHg!{u+;eqg1Q04wFJQPmhM^zpL_kwfa-f#gt z2`+{w!vHRax4^mZWtf9|9A-=_Tm%=xi{Vmu2Rt191DpnbbnI{^_>Kzr*%-@_rg8lW|w~+l%58m`Vm8YKMFOTS3sI*J_YsN9q@d37i5Ud z6qF!6%-~1;It5CAi8LQ%LU*SHL!?_Fn}x4p&39<3^YNRVaPzaOp>(+VzCX|1s1!{1a3=eht;%KS0$l z<5GL3LVb6LV^KOyFy}+*dmEHqZh^9wJE6w?9w>kO z9+W-rgwor8K=t=6n1d%Un9@hT;{epSRG{=W1{ME40XM+!K$>Ev(+R!T3b={b z;`Q@T&tHe?*P9R*GP6!d`?VallMY?_eyH(&#if4*rH3Qt5KG|_xHr7maTKcG+u%O% zYB&Xc#_vj94X2WR1Zo_fgzE2ePsS~ z>b*Ho?OOr&gWXX2KNn7i7eU4SGL(IN63X9igAAQ{1j-=7NigezQrE0mtjg3`|>sCv(XDz5<5?+EIycIg|T#{2s&{T%!V>9-(FH8ajg`?t~YJg9yTK#fNc zYP=K2OQ7s|8GD4Z$529Y(0t~TUsdzb#q0iQuSUEVYBFWvnE@Mp-G z$QO_z(ue5Uj70X%m>#&v-3vRAQyS9ObN_@(%Wrj^m%^-r!^oEqjh*~^CUOb#JtRhS z9hJh)w@vQ85zmv5t?Jr>$e%Gk^S8(&i0tYql7kH`<+eSMbMU8gdVEj>~JrRU|4dW1q$c+&_z4jeN`HKL$@lzK+QL2}gF``)l|^tVI-OK7r`khO9=`Bex)5LH-1}5SfbTYDO+XjzsQ4{uKET zaw)O|$*v2yDIj?ybeRLN%iYg_XCY(Ar;%Rd^T;&hCZrY7btUo_$lb_vgy^7~WdapVeQG4cbX1Iez3 zx!H-#&oba~$aBcy$jOMAop`k*h!Zns_HdL`%YG@CJ;w_ZuN+l9-`naJ!-AJR@dl&V z3rc=i^!!304wA&1Gn-dxd_w{5&hsmkz>gEJ8hHZ&g{M*7HNtjokX=qw}uHwhlm6R7I0^?S0yf@#g? zqguI|(F@Cik!dXyyzXGsYmKX6z8Ki_28LEQp{hn{c?zbjNeh`JdKp#pATh1Qq9htM zt!RvPc}dOPjE2duM$*?~&(G&I>ZGf~^g!J|WB1<_f?|Mv_|)oi9pf6sV_s)8^ua%> zm7V%fCbg^IOwPM)rmIrJC%gUtFVYPLRVw@A#o7^zgQ6YEWH_vNqhS^Gd>~zv$GmD> z!^%IP_L87nNQ*9^bAKq%hpnBRsl(FPT6H*z!%Ne~c$Fab3jWx5Hs;>e<_(5HvEY?d zt@TA&fS*eO4B4-uQu&$}4LV0}&&jzHK5Q{5P6v`GCa@%VI)}f!E58ubA2j%YS8>&N#GIgN z8vTQ;A^JdX*uOEM-#;ufy7HV-hD72V% z;*S0CvY6Cf-c4bYjr9hJRcb2ejN)Y`s0}XFW$VPU9OF*Mh``QBPI42y5Ce$p>+zYSv&Q1Acyl zo03mhUL%K0XC}W^jWjDTofXIM)MC-axLAglhKWFao!H>5C{GWu&I0C=&K{~Rohg{6 zU3hHD>L~fKrXU-l=G(b2vtPY}T82T4|97iLYbcoU6NfNnO#+$b&oFCh#BlrCS{#?R z)<$Msz?85M&oB*v-K>i!tHWzu+uPm_S9kPfw}ZF>jl{#M8f}?NnCIOd)4@y>TWh3) zvLai1`rblsG+;g@kKx+NRI8X6*jbs9G$-M&sWR#VA;%gYi4OFZ&AyC^4O|84tmg(< zuGLiw&(d{IgT0LBRilxhY&wWx#U#SmZKar#rT`X2*-Wd!$}08kq>e&cOeayZMkwb7 zy>~@reB0hy-P*fNK`@f$ZB`iVBp7Ij2r1dU4KIUnRPq`FA%#aaVl_22aXW;K2ndZ$7%;Hu}n{EU*D$ny{k=6Hg#n; z6DAL@5C!QX*sfB?-jFbfjn^XbHBmq4uiSQ{6| zTE-u`Nhh^vt+3?y7&?PeO0v1g#VJij*@skz3+b~eT1p*Z;3uOf%uH-ZC zm+f?%cE`S)d3#n4I?jA8Ygzk-&Q^`=xVJLjR>N{FFgr#8SF=@gDRQG_y*VVoU{Aj0&vukGmTZ}0WG*Ke9> zdeyQn;uUxG$$vt^TZ8*e$VtXmNWDQRC=H-L%&Ip?YQ?JQBfywGCRtVhTf<zsRpJd#j zTv7`=yO!<4TE-UAgnFOTi6mcR?NY8Xi4@Z5n&PTxlW8fR*jompuQsrS?zNbHBH)N3 zW)rvALb|B-M%l9v@a(Ek`zaZhGjmqmZi&Mh(we$HEHGK;?Sg(*K3yaxvpk&88Rlp( z(C`Y;a6+^iUy_c-A>o4+#sJG>O4Vm>C817xb7v>>Y&+}KjSdH_&>CZ(LYXrtw4AMW zKSI;&O%K~pR@D8Pz9wo^{;Aa-Z7|~5|DSfwb${b}eq#ja`U2IQWDpjHivjFO7 zbcJ-QV@FR**);OAJ7{hR#NIVZtIal7S(UPH>)o^>6 z9&EE4SM?JgsCB%RZZ`3$!6*yh_Pk=;8d(gp&>w$OoBG|q%zg;N%HFOw(KT2lCuT!m zdvAAZSG#H0iFrO^|W>XA3XjqNBH@?|LUurz;T*kL1 zO{WjU-l7$5>Sf=RZW0K;SY29bL+5ok@h)Fe#df)o-B?$P%7j);b=2f-=*zYCwRLnb z+7%*ctrW0OVwz_|&9Ws<7J8Lp4O_ql-2y2YD-A?!IgZa=*tB5g{5f;yEwo#|S!Sco z&SW`3sZu4hEAIMuXgOyyv@1`aXA5_;ks7p08u!E&vyu7AYvlxI(=Zc2WY^B4jFpVo z9f#QYeS!r$Gd#m+5DJkz+%B>SEE67Sc2Yt1q0D18jlG1O;KWwgVyp*^FEI$6=_1MQ zKh)m1X8kaAQEqKSQ<<*DCY3VBx?Q?VvCU?+JH8QNZuVWVdNnv(1hQ9a_; z4NlXe-9{J2-__>4{_2FMyE^6By>qxvTa4Xs8WuL3rH%WoNgo4t)MYJeqd^l9?$Z^| zAZISj2^E%2{6v~yj9q+{w8Tl!A6r|-pr?ra<@)t~J+n8=58FI%?z;Z2&UvOGEEp|i zFctQV<69i9!n6*^brf>Wm|7-A{`T^a)?R7oOc!X=dV>n*Ho2~3C@kbw)rOK>f7Iel z>sjBQYtxzmlg#PZqQyJ0xp`Txd1>y%W^eJbmXo+&(%j68xn359GMZh!ck+qpd)fiz z`W3UOIEq`a>tGAJxtQJuh1kE;_fBU+k!GzN8OW8I@=+0xguXk^8 zQ}eVo+?U9n>mRGoO0Aj~Riw|;tn0F-U%sJ#O>SxZJvCx5h;!|ns-y=&O9#U0v~zMj zQNT7YmsQ!qe#0uP{^+b=Oow7gC$k-Ox$Xq@7gqT?fvXO;cuh@<_*Z|@XAd%Zc$RB! z@z|!-ib1l=$BSF+N_E!{Pi)abiY3#cE&f(c+v2cNoo4V|J5g{Bo}FP&9`+N`6@w-m z_G=1QS>SMn-SgxjKQsFuKN=_GSv@wK1%2?38ebB8AXGt*BV@~3|Uo4C+-^QxV7 z%!F0Vg#AFaRp%A^_cx~4$wU6hL;mzHJCld}lZX71hy0U={2amRWNPw|zkWtEdB~rw x9PBZm`#&d>hy0U={Ps^2lZX71hy3r>z~mwSmZdckI-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 diff --git a/languages/en/lang.po b/languages/en/lang.po index 853ca7d..f3e451a 100644 --- a/languages/en/lang.po +++ b/languages/en/lang.po @@ -2,9 +2,9 @@ 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" +"POT-Creation-Date: 2009-08-20 19:39-0500\n" +"PO-Revision-Date: 2009-08-20 19:42-0500\n" +"Last-Translator: Alejandro Pedraza \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -16,42 +16,115 @@ msgstr "" "X-Poedit-SearchPath-1: views\n" "X-Poedit-SearchPath-2: webdir/javascript\n" -#: modules/default/models/Fields.php:32 +#: modules/default/controllers/CidController.php:29 +msgid "Could not retrieve news items" +msgstr "Could not retrieve news items" + +#: modules/default/controllers/CidController.php:47 +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/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 "'%hostname%' is not a valid hostname for email address '%value%'" +msgstr "'%hostname%' is not a valid hostname for email address '%value%'" + +#: modules/default/forms/ErrorMessages.php:23 +msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" +msgstr "'%value%' appears to be a DNS hostname but cannot match TLD against known list" + +#: modules/default/forms/ErrorMessages.php:24 +msgid "'%value%' appears to be a local network name but local network names are not allowed" +msgstr "'%value%' appears to be a local network name but local network names are not allowed" + +#: modules/default/forms/ErrorMessages.php:25 +msgid "Captcha value is wrong" +msgstr "Captcha value is wrong" + +#: modules/default/forms/ErrorMessages.php:26 +msgid "Password confirmation does not match" +msgstr "Password confirmation does not match" + +#: modules/default/forms/ErrorMessages.php:27 +msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" +msgstr "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" + +#: modules/default/forms/OpenidLogin.php:27 +msgid "OpenID URL" +msgstr "OpenID URL" + +#: modules/default/forms/OpenidLogin.php:34 +msgid "Password" +msgstr "Password" + +#: modules/default/forms/MessageUsers.php:17 +msgid "Subject:" +msgstr "Subject:" + +#: modules/default/forms/MessageUsers.php:22 +msgid "CC:" +msgstr "CC:" + +#: modules/default/forms/Feedback.php:25 +msgid "Enter your name" +msgstr "Enter your name" + +#: modules/default/forms/Feedback.php:30 +msgid "Enter your E-mail" +msgstr "Enter your E-mail" + +#: modules/default/forms/Feedback.php:37 +msgid "Enter your questions or comments" +msgstr "Enter your questions or comments" + +#: modules/default/forms/Feedback.php:44 +msgid "Please enter the text below" +msgstr "Please enter the text below" + +#: modules/default/models/Fields.php:45 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 +#: modules/default/models/Fields.php:46 msgid "E-mail" msgstr "E-mail" -#: modules/default/models/Fields.php:34 +#: modules/default/models/Fields.php:47 msgid "Full Name" msgstr "Full Name" -#: modules/default/models/Fields.php:35 +#: modules/default/models/Fields.php:48 msgid "Date of Birth" msgstr "Date of Birth" -#: modules/default/models/Fields.php:36 +#: modules/default/models/Fields.php:49 msgid "Gender" msgstr "Gender" -#: modules/default/models/Fields.php:37 +#: modules/default/models/Fields.php:50 msgid "Postal Code" msgstr "Postal Code" -#: modules/default/models/Fields.php:38 +#: modules/default/models/Fields.php:51 msgid "Country" msgstr "Country" -#: modules/default/models/Fields.php:39 +#: modules/default/models/Fields.php:52 msgid "Language" msgstr "Language" -#: modules/default/models/Fields.php:40 +#: modules/default/models/Fields.php:53 msgid "Time Zone" msgstr "Time Zone" @@ -63,103 +136,52 @@ msgstr "Male" 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 +#: modules/install/controllers/CredentialsController.php:183 #, php-format msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." msgstr "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." -#: modules/install/controllers/CredentialsController.php:188 +#: modules/install/controllers/CredentialsController.php:186 #, php-format msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" msgstr "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" -#: modules/users/controllers/UserslistController.php:50 +#: modules/install/controllers/CredentialsController.php:189 +#, php-format +msgid "You need to have the %s extension installed" +msgstr "You need to have the %s extension installed" + +#: modules/install/controllers/UpgradeController.php:57 +#: modules/install/controllers/UpgradeController.php:65 +#: modules/users/controllers/LoginController.php:46 +#: modules/users/controllers/LoginController.php:74 +msgid "Invalid credentials" +msgstr "Invalid credentials" + +#: modules/install/controllers/UpgradeController.php:73 +#, php-format +msgid "Upgrade was successful. You are now on version %s" +msgstr "Upgrade was successful. You are now on version %s" + +#: modules/install/controllers/UpgradeController.php:97 +#, php-format +msgid "Correct before upgrading: File %s is required to proceed" +msgstr "Correct before upgrading: File %s is required to proceed" + +#: modules/install/forms/UpgradeLogin.php:18 +#: modules/users/forms/AccountInfo.php:26 +msgid "Username" +msgstr "Username" + +#: modules/users/controllers/UserslistController.php:52 msgid "admin" msgstr "admin" -#: modules/users/controllers/UserslistController.php:52 +#: modules/users/controllers/UserslistController.php:54 msgid "confirmed" msgstr "confirmed" -#: modules/users/controllers/UserslistController.php:54 +#: modules/users/controllers/UserslistController.php:56 msgid "unconfirmed" msgstr "unconfirmed" @@ -181,45 +203,108 @@ msgstr "Your acccount has been successfully deleted" msgid "Sorry, registrations are currently disabled" msgstr "Sorry, registrations are currently disabled" +#: modules/users/controllers/RegisterController.php:101 +msgid "Community-ID registration confirmation" +msgstr "Community-ID registration confirmation" + +#: modules/users/controllers/RegisterController.php:104 +msgid "Thank you." +msgstr "Thank you." + +#: modules/users/controllers/RegisterController.php:105 +msgid "You will receive an E-mail with instructions to activate the account." +msgstr "You will receive an E-mail with instructions to activate the account." + +#: modules/users/controllers/RegisterController.php:107 +msgid "The account was created but the E-mail could not be sent" +msgstr "The account was created but the E-mail could not be sent" + +#: modules/users/controllers/RegisterController.php:121 +#: modules/users/controllers/RegisterController.php:149 +#: modules/users/controllers/RegisterController.php:163 +msgid "Invalid token" +msgstr "Invalid token" + +#: modules/users/controllers/RegisterController.php:154 +msgid "Your account has been deleted" +msgstr "Your account has been deleted" + #: modules/users/controllers/ManageusersController.php:25 msgid "User has been deleted successfully" msgstr "User has been deleted successfully" -#: modules/users/forms/AccountInfoForm.php:30 -#: modules/users/forms/RegisterForm.php:26 -msgid "First Name" -msgstr "First Name" +#: modules/users/controllers/ManageusersController.php:42 +msgid "Community-ID registration reminder" +msgstr "Community-ID registration reminder" -#: modules/users/forms/AccountInfoForm.php:35 -#: modules/users/forms/RegisterForm.php:31 -msgid "Last Name" -msgstr "Last Name" +#: modules/users/controllers/RecoverpasswordController.php:51 +msgid "This E-mail is not registered in the system" +msgstr "This E-mail is not registered in the system" -#: modules/users/forms/AccountInfoForm.php:50 -#: modules/users/forms/ChangePasswordForm.php:18 -msgid "Enter password" -msgstr "Enter password" +#: modules/users/controllers/RecoverpasswordController.php:82 +#: modules/users/controllers/RecoverpasswordController.php:121 +msgid "Community-ID password reset" +msgstr "Community-ID password reset" -#: 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/controllers/RecoverpasswordController.php:84 +msgid "Password reset E-mail has been sent" +msgstr "Password reset E-mail has been sent" -#: modules/users/forms/LoginForm.php:8 +#: modules/users/controllers/RecoverpasswordController.php:123 +msgid "You'll receive your new password via E-mail" +msgstr "You'll receive your new password via E-mail" + +#: modules/users/forms/Login.php:18 msgid "USERNAME" msgstr "USERNAME" -#: modules/users/forms/LoginForm.php:13 +#: modules/users/forms/Login.php:27 msgid "PASSWORD" msgstr "PASSWORD" -#: modules/users/forms/RegisterForm.php:48 +#: modules/users/forms/AccountInfo.php:32 +msgid "First Name" +msgstr "First Name" + +#: modules/users/forms/AccountInfo.php:37 +msgid "Last Name" +msgstr "Last Name" + +#: modules/users/forms/AccountInfo.php:52 +#: modules/users/forms/ChangePassword.php:18 +msgid "Enter password" +msgstr "Enter password" + +#: modules/users/forms/AccountInfo.php:58 +#: modules/users/forms/ChangePassword.php:24 +msgid "Enter password again" +msgstr "Enter password again" + +#: modules/users/forms/Register.php:49 msgid "Enter desired password" msgstr "Enter desired password" +#: modules/stats/controllers/SitesController.php:68 +msgid "Trusted sites" +msgstr "Trusted sites" + +#: modules/stats/controllers/SitesController.php:75 +msgid "Sites per user" +msgstr "Sites per user" + +#: modules/news/forms/Article.php:18 +msgid "Title" +msgstr "Title" + +#: modules/news/forms/Article.php:24 +msgid "Publication date" +msgstr "Publication date" + +#: modules/news/forms/Article.php:32 +msgid "Excerpt" +msgstr "Excerpt" + #: webdir/javascript/language.php:30 -#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:12 msgid "Name" msgstr "Name" @@ -359,33 +444,25 @@ msgstr "prev" msgid "IP" msgstr "IP" -#: modules/default/views/scripts/privacy/index.phtml:1 -msgid "Privacy Policy" -msgstr "Privacy Policy" +#: webdir/javascript/language.php:65 +msgid "Delete unconfirmed accounts older than how many days?" +msgstr "Delete unconfirmed accounts older than how many days?" -#: 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" +#: webdir/javascript/language.php:66 +msgid "The value entered is incorrect" +msgstr "The value entered is incorrect" -#: modules/default/views/scripts/messageusers/index.phtml:18 -msgid "switch to Plain-Text" -msgstr "switch to Plain-Text" +#: webdir/javascript/language.php:67 +msgid "Send reminder to accounts older than how many days?" +msgstr "Send reminder to accounts older than how many days?" -#: modules/default/views/scripts/messageusers/index.phtml:21 -msgid "switch to Rich-Text (HTML)" -msgstr "switch to Rich-Text (HTML)" +#: webdir/javascript/language.php:68 +msgid "Are you sure you wish to delete this article?" +msgstr "Are you sure you wish to delete this article?" -#: modules/default/views/scripts/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/login.phtml:9 +msgid "Login" +msgstr "Login" #: modules/default/views/scripts/openid/trust.phtml:3 #, php-format @@ -421,18 +498,6 @@ msgstr "Allow" 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" @@ -449,56 +514,62 @@ msgstr "OK" 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/index/index-es.phtml:37 +#: modules/default/views/scripts/index/index-de.phtml:39 +#: modules/default/views/scripts/index/index-en.phtml:39 +msgid "There are no news articles yet" +msgstr "There are no news articles yet" -#: 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/default/views/scripts/index/index-es.phtml:44 +#: modules/default/views/scripts/index/index-de.phtml:46 +#: modules/default/views/scripts/index/index-en.phtml:46 +msgid "View All" +msgstr "View All" -#: modules/stats/views/scripts/authorizations/index.phtml:1 -msgid "Authorizations per day" -msgstr "Authorizations per day" +#: modules/default/views/scripts/index/index-es.phtml:48 +#: modules/default/views/scripts/index/index-de.phtml:50 +#: modules/default/views/scripts/index/index-en.phtml:50 +msgid "Add New Article" +msgstr "Add New Article" -#: 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/default/views/scripts/cid/index.phtml:1 +msgid "About Community-id" +msgstr "About Community-id" -#: 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/default/views/scripts/cid/index.phtml:3 +msgid "Version installed:" +msgstr "Version installed:" -#: 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/default/views/scripts/cid/index.phtml:8 +msgid "Latest news from Community-ID:" +msgstr "Latest news from Community-ID:" -#: modules/stats/views/scripts/registrations/index.phtml:1 -msgid "Registrations per day" -msgstr "Registrations per day" +#: modules/default/views/scripts/messageusers/index.phtml:9 +msgid "This message will be sent to all registered Community-ID users" +msgstr "This message will be sent to all registered Community-ID users" -#: modules/stats/views/scripts/registrations/index.phtml:6 -msgid "Last Month" -msgstr "Last Month" +#: modules/default/views/scripts/messageusers/index.phtml:16 +msgid "switch to Plain-Text" +msgstr "switch to Plain-Text" -#: modules/stats/views/scripts/top/index.phtml:1 -msgid "Top 10 Trusted Sites" -msgstr "Top 10 Trusted Sites" +#: modules/default/views/scripts/messageusers/index.phtml:19 +msgid "switch to Rich-Text (HTML)" +msgstr "switch to Rich-Text (HTML)" -#: modules/stats/views/scripts/top/index.phtml:7 -#, php-format -msgid "%s users" -msgstr "%s users" +#: modules/default/views/scripts/messageusers/index.phtml:29 +#: modules/default/views/scripts/feedback/index.phtml:7 +#: modules/install/views/scripts/credentials/index.phtml:12 +#: modules/install/views/scripts/upgrade/index.phtml:11 +msgid "Send" +msgstr "Send" -#: modules/stats/views/scripts/sites/index.phtml:1 -msgid "Trusted Sites" -msgstr "Trusted Sites" +#: modules/default/views/scripts/privacy/index.phtml:1 +msgid "Privacy Policy" +msgstr "Privacy Policy" + +#: 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/install/views/scripts/complete/index.phtml:2 msgid "The installation was performed successfully" @@ -508,6 +579,10 @@ msgstr "The installation was performed successfully" msgid "Finish" msgstr "Finish" +#: modules/install/views/scripts/credentials/index.phtml:2 +msgid "Database and E-mail information" +msgstr "Database and E-mail information" + #: modules/install/views/scripts/permissions/index.phtml:2 msgid "Please correct the following problems before proceeding:" msgstr "Please correct the following problems before proceeding:" @@ -516,10 +591,6 @@ msgstr "Please correct the following problems before proceeding:" 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" @@ -528,59 +599,111 @@ msgstr "This Community-ID instance hasn't been installed yet" msgid "Proceed with installation" msgstr "Proceed with installation" -#: modules/users/views/scripts/register/index.phtml:1 -msgid "Registration Form" -msgstr "Registration Form" +#: modules/install/views/scripts/upgrade/index.phtml:1 +msgid "New version detected" +msgstr "New version detected" -#: 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/install/views/scripts/upgrade/index.phtml:3 +msgid "Enter the administrator credentials to proceed with the upgrade:" +msgstr "Enter the administrator credentials to proceed with the upgrade:" -#: modules/users/views/scripts/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/install/views/scripts/upgrade/index.phtml:6 +msgid "Make sure you make a copy of the database before, just in case" +msgstr "Make sure you make a copy of the database before, just in case" #: modules/users/views/scripts/profile/index.phtml:13 msgid "Account info" msgstr "Account info" +#: modules/users/views/scripts/profile/index.phtml:17 +msgid "Edit" +msgstr "Edit" + #: 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/manageusers/index.phtml:11 +msgid "Enter search string" +msgstr "Enter search string" + +#: modules/users/views/scripts/manageusers/index.phtml:12 +msgid "Go" +msgstr "Go" + +#: modules/users/views/scripts/manageusers/index.phtml:13 +msgid "Clear" +msgstr "Clear" + +#: modules/users/views/scripts/manageusers/index.phtml:16 +msgid "All" +msgstr "All" + +#: modules/users/views/scripts/manageusers/index.phtml:19 +msgid "Confirmed" +msgstr "Confirmed" + +#: modules/users/views/scripts/manageusers/index.phtml:22 +msgid "Unconfirmed" +msgstr "Unconfirmed" + +#: modules/users/views/scripts/manageusers/index.phtml:29 +msgid "Total users:" +msgstr "Total users:" + +#: modules/users/views/scripts/manageusers/index.phtml:30 +msgid "Total confirmed users:" +msgstr "Total confirmed users:" + +#: modules/users/views/scripts/manageusers/index.phtml:31 +msgid "Total unconfirmed users:" +msgstr "Total unconfirmed users:" + +#: modules/users/views/scripts/manageusers/index.phtml:34 +msgid "Add User" +msgstr "Add User" + +#: modules/users/views/scripts/manageusers/index.phtml:36 +msgid "Delete Unconfirmed Users" +msgstr "Delete Unconfirmed Users" + +#: modules/users/views/scripts/manageusers/index.phtml:39 +msgid "Send Reminder" +msgstr "Send Reminder" + +#: modules/users/views/scripts/register/eula.phtml:1 +msgid "Please read the following EULA in order to continue" +msgstr "Please read the following EULA in order to continue" + +#: modules/users/views/scripts/register/eula.phtml:8 +msgid "I AGREE" +msgstr "I AGREE" + +#: modules/users/views/scripts/register/eula.phtml:9 +msgid "I DISAGREE" +msgstr "I DISAGREE" + +#: modules/users/views/scripts/register/index.phtml:1 +msgid "Registration Form" +msgstr "Registration Form" + +#: modules/users/views/scripts/profilegeneral/changepassword.phtml:7 +#: modules/users/views/scripts/profilegeneral/editaccountinfo.phtml:13 +#: modules/users/views/scripts/personalinfo/edit.phtml:5 +msgid "Save" +msgstr "Save" + +#: modules/users/views/scripts/profilegeneral/changepassword.phtml:8 +#: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:23 +#: modules/users/views/scripts/profilegeneral/editaccountinfo.phtml:14 +#: modules/users/views/scripts/personalinfo/edit.phtml:6 +msgid "Cancel" +msgstr "Cancel" + #: modules/users/views/scripts/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?" @@ -613,152 +736,205 @@ msgstr "Additional comments:" msgid "OpenID" msgstr "OpenID" +#: 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/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 +msgid "Personal Info" +msgstr "Personal Info" + +#: 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/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 +#: modules/users/views/scripts/login/index.phtml:43 +msgid "About Community-ID" +msgstr "About Community-ID" + +#: modules/users/views/scripts/login/index.phtml:50 msgid "User access is currently disabled for system maintenance.
Please try again later" msgstr "User access is currently disabled for system maintenance.
Please try again later" -#: modules/users/views/scripts/login/index.phtml:58 -#: modules/users/views/scripts_monkeys/login/index.phtml:61 +#: modules/users/views/scripts/login/index.phtml:64 msgid "Remember me" msgstr "Remember me" -#: modules/users/views/scripts/login/index.phtml:61 -#: modules/users/views/scripts_monkeys/login/index.phtml:64 +#: modules/users/views/scripts/login/index.phtml:67 msgid "Log in" msgstr "Log in" -#: modules/users/views/scripts/login/index.phtml:67 -#: modules/users/views/scripts_monkeys/login/index.phtml:70 +#: modules/users/views/scripts/login/index.phtml:73 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 +#: modules/users/views/scripts/login/index.phtml:79 msgid "You don't have an account?" msgstr "You don't have an account?" -#: modules/users/views/scripts/login/index.phtml:75 -#: modules/users/views/scripts_monkeys/login/index.phtml:78 +#: modules/users/views/scripts/login/index.phtml:81 msgid "REGISTER NOW!" msgstr "REGISTER NOW!" -#: modules/users/views/scripts/manageusers/index.phtml:11 -msgid "All" -msgstr "All" +#: modules/stats/views/scripts/sites/index.phtml:1 +msgid "Trusted Sites" +msgstr "Trusted Sites" -#: modules/users/views/scripts/manageusers/index.phtml:14 -msgid "Confirmed" -msgstr "Confirmed" +#: modules/stats/views/scripts/sites/index.phtml:3 +#: modules/stats/views/scripts/registrations/index.phtml:3 +#: modules/stats/views/scripts/authorizations/index.phtml:3 +msgid "Select view" +msgstr "Select view" -#: modules/users/views/scripts/manageusers/index.phtml:17 -msgid "Unconfirmed" -msgstr "Unconfirmed" +#: modules/stats/views/scripts/sites/index.phtml:5 +#: modules/stats/views/scripts/registrations/index.phtml:5 +#: modules/stats/views/scripts/authorizations/index.phtml:5 +msgid "Last Week" +msgstr "Last Week" -#: modules/users/views/scripts/manageusers/index.phtml:24 -msgid "Total users:" -msgstr "Total users:" +#: modules/stats/views/scripts/sites/index.phtml:6 +#: modules/stats/views/scripts/registrations/index.phtml:7 +#: modules/stats/views/scripts/authorizations/index.phtml:6 +msgid "Last Year" +msgstr "Last Year" -#: modules/users/views/scripts/manageusers/index.phtml:25 -msgid "Total confirmed users:" -msgstr "Total confirmed users:" +#: modules/stats/views/scripts/top/index.phtml:1 +msgid "Top 10 Trusted Sites" +msgstr "Top 10 Trusted Sites" -#: modules/users/views/scripts/manageusers/index.phtml:26 -msgid "Total unconfirmed users:" -msgstr "Total unconfirmed users:" +#: modules/stats/views/scripts/top/index.phtml:7 +#, php-format +msgid "%s users" +msgstr "%s users" -#: modules/users/views/scripts/manageusers/index.phtml:29 -msgid "Add User" -msgstr "Add User" +#: modules/stats/views/scripts/registrations/index.phtml:1 +msgid "Registrations per day" +msgstr "Registrations per day" -#: modules/users/views/scripts/manageusers/index.phtml:31 -msgid "Delete Unconfirmed Users" -msgstr "Delete Unconfirmed Users" +#: modules/stats/views/scripts/registrations/index.phtml:6 +msgid "Last Month" +msgstr "Last Month" + +#: modules/stats/views/scripts/authorizations/index.phtml:1 +msgid "Authorizations per day" +msgstr "Authorizations per day" + +#: modules/news/views/scripts/view/index.phtml:3 +#: modules/news/views/scripts/index/index.phtml:16 +#, php-format +msgid "Published on %s" +msgstr "Published on %s" + +#: modules/news/views/scripts/view/index.phtml:6 +msgid "Edit Article" +msgstr "Edit Article" + +#: modules/news/views/scripts/view/index.phtml:7 +msgid "Delete Article" +msgstr "Delete Article" + +#: modules/news/views/scripts/index/pagination.phtml:10 +#: modules/news/views/scripts/index/pagination.phtml:13 +msgid "Previous" +msgstr "Previous" + +#: modules/news/views/scripts/index/pagination.phtml:30 +#: modules/news/views/scripts/index/pagination.phtml:33 +msgid "Next" +msgstr "Next" + +#: modules/news/views/scripts/index/index.phtml:3 +msgid "Latest News" +msgstr "Latest News" + +#: modules/news/views/scripts/index/index.phtml:21 +msgid "read more" +msgstr "read more" -#: 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/layout.phtml:41 +msgid "Your OpenID is:" +msgstr "Your OpenID is:" -#: views/layouts_monkeys/layout.phtml:55 -#: views/layouts/layout.phtml:52 +#: views/layouts/layout.phtml:58 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" +#~ msgid "Body:" +#~ msgstr "Body:" +#~ msgid "OPEN AN ACCOUNT NOW" +#~ msgstr "OPEN AN ACCOUNT NOW" +#~ msgid "" +#~ "Fed up with having to remember dozens of
usernames and passwords
for your favorite websites?" +#~ msgstr "" +#~ "Fed up with having to remember dozens of
usernames and passwords
for your favorite websites?" +#~ msgid "Starting today
you'll only have to remember one" +#~ msgstr "Starting today
you'll only have to remember one" +#~ msgid "Help and Support" +#~ msgstr "Help and Support" +#~ msgid "Privacy" +#~ msgstr "Privacy" +#~ msgid "About Us" +#~ msgstr "About Us" +#~ msgid "Contact Us" +#~ msgstr "Contact Us" diff --git a/languages/es/lang.mo b/languages/es/lang.mo index db6ef769dde7bc87f8d39df3784d6d845e418f3b..23538e599f455d3302fd4186db9fd6544b16f9d6 100644 GIT binary patch delta 7781 zcma);3wRaforfpf1IYcJ07D>zOTrxtL4-(x1TfsG&~0&Y&LkN)=S(~^Cn4TWTMH;w z#g3J#RjU?@7nC-lf?8IhZCB~qB2{Y_Td(U@chPRUk9~Hv`~K!kLb}_%d=J08-}lYT zclqBAueV%#V_x>nAw9lj(B4CZsH(SN%*`{5!~o42M)^>~=mQtRrSKwH3$KM6;i+g` zGR!bWFm8q;;f)awz;%qDg+t)L;W-vTw#pjw>GbEpVmJ`4gxYW`E81Z1^fHXMdv)$L+;LC1lQ60sF#jupDlO z+W3B`_r4GH-lI?legXD_zl1v2TTlo7N60_pkNg=0&*M)4oD3(!i(o$c8xEav=)tk@ z5r}Dw7oiqD1;@iTVGsB@)CS#0=PWfC%3EV1PKCT;l*9RO9n``1Kz)Bx^gMuBJ$QtU zPSzH^@G_K3PD9<`EvOs+32LK3V{)z;4{^US4=#l(;9z(?lx6OOCVUv`LMNeIdphEo zG1y-Rc%O+F{AXAM*Kr!n`%td95^90nP%&{6%!l_wy>|$9gO5k^PeNJlIj9@|4C?z+ zQ0u(`Wuf;9u)jY1oQW^NJW_zTF}6Xbj11HbZ-FxT0eC)agIe%Is15!#;-^qI{0wTN zUiec79UQSBVlmVKXJ+Y)qq7L=gRM|EvY~=05slMu0pnJ9Av_GV@mVNW{Q>IzJQh>1 z_J%reKdARcLs@QIG@c7}&}@11pc2Y=o1sqD7`@;_S?Fr08-E4rfY(7C_-3eu?ud9l zoW%GMI1&B=>L7oF7{%yLB$q=IV&SZ@h0euHWT5i+S*Qbi0z*?m1zj(bTfpIP5S$4W zWJ{qoSPNz9FGE?R5$Zx2D3|VmTK6uf3p@yWDE|-B(Ssx51VIC};E$mWbQ)^mJ`)UM zDjWi3(hHytRvB?EoX&U~lx1#!+UPc@i`*5>KLBNcAHWp*8^5FT7~DeWn=l`{X`yMb z7;c7G&$ue$op2uGV-U9+XQAFd54$(Rh44an7-Br*ER^X7vY0MX3Kc60V0IXt3+O1n z*FmL4Ba{ih3U%X~U>ST0$};aq`~%d@x=qemupgYwcqH5eYan+r?tyym1hnBxQ18ty z!T$PDh?V4CXok937E%g~$DwZaGOULG9*rxf z2z$ZNum?1!Vt;jtnNXBZg9@&)=!FYmZ^p}DK3oN5u}x41+z$J}T`;T@u%3kuMDzVi z4P!OWN5KuyhF^e3;S4x9i(M7fOQ9Cr3JC`z122X9p)B-q#O{2h8;pSZZY)%ZJ|8L@ z)j`C?D;Hi{Vp{LmU4FFM<wqiJv;oDFfaQ3-LQ;XrNt zO*k1Ihq}T0a6SAzBmsgR6TgEd{0vsY zadUGgzYHn{9H?l%91exILZ#I~s0+LR2f>q2H$4OO8}b<(3P%&!dcO>6ekH7Bf1{p` z^7{xJ3{OMd=zS>D^~F&-z)+}z7C_x}22{S!gR<1aQ173HI?x%|AHE9}E1y7FrXOa} zdId16sGmqjA5Mlc%}l5T7DD-SDLfCZf=aV3P~Ww{dUyp?u)PI!^Z$T~iNf=98_t6Z z8CO9a{F;bgKOg&RVlNZga39o$`=JhWAJoPVL;3tDl!;$}a>c9B{GXuS?@3)12SBYm z60U<|;VS4t?ejF$Iw#7pzg~QW3DtpLL7D2!=*3UrD8_$=vdk#1p@S4b`Eo|YRZymG zgnBOnWuYvTslNub@m{D4-U7AGcl3ff2cb;+IIMxE;BZ)2k&F5{P-(aYQqGP2a2tFE zs^S&$X8^nu$^s2=By55@=yg!*9e|2~r=fx}`w|_U_%~1={u3Mle-9OG`4{94SP1pr z6sQ}`feO|NsGF^ZT5tng3LBtqdJy6rqYcW^A3`1M6Uh2mBcE%j@DxJ%`ZA~mQ&1aa zpbmC5tb)7YmGC9l4lm}Xt`PQHl1r;8kQ!rD!LX9TF^u;^ylDIoPJti73g!Q>rTB-5 zHBdov3QmUOC;|$yY8d(!h6jSnyP!7eh8bk)2~aMX4=EMK5-8XCa4Nh3>Ow~#8ENEI z=PXaa$1m{Azdh>GZuN%dg$b)JMx_c1TGk$~ArlAMX4e0wwR#Ve$SBAZFe~#1L zj3{=U?dzRAtV#b0v;wW|Sm_Xh+344(qwVeJKw>OxvQkHDjykfyn^FHuZ~|&X3G{9B zB=V75rY2XYDHyNSP3}bdkeX`2uh5UtI@HlhqRty|Ba->lWcFidJL-X+LUP>~(bK2` z)u8}Afc_rIb!u{bwv9hmYeX~A7tr4z6_cCLZD=VfMN`mp^m8-_?Le!L+E-BndLCVe zZbr`{wTF=6<_8+kh~x185O>Iv-(s*wv$VeGM`)`CQTsbcco+vz8YvUhPUK)*0AGpv z_eE6nUx~J$-=fP=*QPAH4E<34Ur*KNGzZ;?)V_j#hKi8dBs4kf8OFWv zQq+oGMoq{G?gBL?_WAGzMKS|0_jqLAy~5DI=;-EmC_o2jiNEkHVIye;2$P zWuoz7m_o0jp6E3CF6!F8*=103KZ99le>Ax>;xFK9QD0byzJscfgLa{Z(XD78>K{xP zFf^Dophxy6jMOg9A^iXEbMz0ROVAorfF40=N6`}W9(o&%M}LcEAhj3KKcEe07*d;= zL-@Cbzo(EY%qB%taX3v?fsdhg&>6H1eFIHI?dYed9=(Lrjvzbi<$j{ROn-1R?m!`( zU!sHPYv>8|IC=)%j*Q~0XJ$M*?HMJ-jjrdXtfXCBVmh9ga(&Y>o2`TsH#?q~^={g< zla`Y(t#~|bd!AWR%qtnbVS%V;T1`#1mG(^EHS25^sjA&@Zi%{#Z^o>YmQPxKEZb;q zTwP^a4VIJgd~-+2ZAqC4$MgS}^%8E(N|-6zZ*kK*OdZ+Os{ei3Gp)3pyGbJ9w%GA5 zi$+%rUK(^}{4zJ0%%mK@wXCMfsH}5Y?A(+S4;~skreCeyVpgVoCzi0=jt?%&>+d(R zgq52K?j2GTd^F^V;NZ}!f^oxcUXV`PF`wIGFx$*DHKeV$lWM3impcjDEcRsJw0(KT zN!xLmsVVKoY&#wt8MbS4w24t=Cv4v~H>F~3s@_Q_d2>_fspvtb%L6MGb2BO5Gu=eo zPMdzCmBQjJSUA;c#;sOwNw8}8ntpM|@3=$o?crN%J=_#)G(A7f;f(5(AAXC=;z=ik z57L&8!($xMPWg_N2wfVT)ogM6Mt17Bo?Q`qIJ|05_0E``Zt{)gc3nDSrCWo$N4(zu zV%Jz<{koO*H4bJM2_&*{Ho^E#D?0Qg(}H)~DTM7njsjRRkZ5 z+H%1T+w?LRxYf;YRYsN>bDLUCw>~^r-14nD%Og5MKa`r=Gc4$&h(FH`E*w336h3Vx z_#HQ8#xZuxCq!!PoqmuUy>e8{ckAr5v8KsR5f(X^o7S&xdwq0$UN5`ZaWh`9tYDhC zHdB{yVwN8+!>NsM!fV81EXM)Lpv!+&oV>}k8Z@Z-Ei zwvsYqo4CYQ_z+4Cp%6x#v9Xc4DC%>jiz3uBTW!DXhH=;Ab$9$k(93*tRv4AG*obWN<`#^ZOPdxQzr#LU<8AZWtU@r%IC7ZBiB>G0@=0EE(}uFj4a;h3Oe@hu z{AH4M+KHL5Mk{S$*R)q^HYGA-3=tXm$7@a2xdhduvTZY_PncFRWojvp<7SbuIlLh^ zvy)AJYiXF?7Kxk+u9+~pU~}X$RSYYUu;UfRW=H9nNCdY{*i@1tm1NaMtJw|%frP`U zb}Dpq=U2h|6L$8E-0FB0!KFoW21SnGQ;(=25U(n_u}|8z;%3rK2fZgg*|)rG&Mb5G z!isrwgP%?um)|j*ADo>yujkSob!Ex6*^?f~EA6P6RMV7e+LT$PWUj)R&F%M6SIK*f zW7>(}@Pgsl&idJ&(b{_A@ui31J?)2LnS|T+&g9K`BT}4|6j!`P^Gl2q$Agbc3WJ4Hjs>4jxhF3j?4SDl+H~64 zZV?(31RbZ*qQ;mBW@3JZAE+y=nA6^tsxYhhU80~lY$ccHYAj*cVd=1Rk${0c?XmpM z!vuY&7ge4(UY&4APmUDJU@;|yDn+jLGMj9_SHbH$4H=$YP6Ea<3|&ste#oN0PM@9} zQcZ>B-Oi)MZbd>^-{c@0?D<|r{W``kl*p83JlpFtPM}$}tf^Aq(p<5!3csX?|Y6nzXUPO;}+${DdkK$HLon zdMv~Jsn1Sm1s*k72|UANTp8ABy3}k}rGh(q4i2`w;G>z#Cn$dS--r?)PxFn6wS@^c z;15N3Fl$!b=rzOx;rCZc_7k&C=Jlym#dOHyZ_HUxyxgWVY4fIB^$tTQSGjQ&85>sa z=jL3$u{zc4;MDatIi=&V1YsJ@lAoQk`uT}s=l_hBnz={Y=Fc0^ZBatyoZIpXj7hX} zu3SVF-8E`e$Xd_kh<=3QRx?4@RlA;02|vOdB8voK&(ZB%RQ6loZX>N`Mj5P delta 5254 zcmZA333L?o0mt$Gav8#*h>&n*Pzd2j$i)#3F_0i2BoIgeQDKsuz-qD+_Xq@PR}m;4 z6k$BT6HqBNC}I#5t$?&tELycz>}#Paw&D}5zS6#DwYJ~i?!>2^=a0{S{yRJWd*iJe z1MjU!oW8ijJ%;NT=}%^LGNxO=m>+jltuaquWK0_F!wNizy|Hr-V=~b49fxzdpM!dS zCtiRps8_Z6^@s5i?vGv z)0lC11u_QHjOyskn2z_M-oF#|+-_`7`{n}*`odpPUpR*sVtcyT1$!brHCd<;=VB(7 zV?VqOvvC!6#vP~zTW|m#K+VKEsQ3LDv+yi-pna3pE7d?Z)YSFE?l>6LP!Xzwv#2y>>b5Jwlpq_L6`zB-?nVU11e@)3|Dm1c(P%qetdf^kO z8F&`k;Tw1@zJ>JJjN(I$yd1}(jr#sJ)cbb$?m`W$1@+$jsE!@VWd2n+?pORC)uB`V zgP)*!ejc@XzV`0}eHbbbe7O}zlMcNU|b3!yp^M$OQQ1O=_dov4N% z_8)ixHR4ueKbixmk-diM(A%gN{n7VB9L)Wvco|;QH`Q=4>R3;~akvCEV_We`Ozfvn zMBy7$2lDw;4NXLCnlj{_W*%xJ4X7DgjT-Sf)Bv`imgF(idk&&HdJHx4*Zump{rl6% zdlKdhg<(AKng2ls-BrW=eMjI3?#E*>)}hw$0aOFKP&4tQUw;5K(jyqgf8$;ZaTYD? zGthq@4$=9qqo5bxi8`-G{0IJmP26|kuwIU9kpIjP{^6bG1Jq1>i(1PxD|OrkAlt+g zqh@F}YJgW`F0Mt* zOy%+=xdUrtl;MttmWwPf<=D)@gc_KQU3?jUh0tTe=nQ)r_-i{iiNlswf6h56COo<;Wg9`)kmnQ zJ&$U*+tAd=a!@mvhw8{!9F0@45Swu-?!n>s1x~_#In4h^3X5_$BDfwq;c?_Q#=MEz zY-fG{fz!DE7TaSv3!8>BkZoY9P%{ugor?9Sj&DWUG`o?nnm1AHewCoWU`#gMQqO0j zHq9br_DmgW?QTcC=q}U`&vw85B&xwv*crb>J@++Q*oBRt4vxeNa5S=tW)kXqiKP^@ zn`5YvZ$^z|D{>;u^QZ^kK|OaCIT)rR-PZ^QqdGbU)xgyl#~S1>vw06SfKO4U=}XiM zEaxcDv4q)7K@H!JU2z9$&7VSzpS=gW}2 zXiBjT%TRl#1+#Sik5MS0;%}&)TBA~C`;J64P>5=v1l5r;R710|3ob^TmSz6^O4M^} zeK(@se=p9(2eA|Fo6jlei~sZ==#-y2j$KhR(F4_i5vYa=QA=^T?_$)#87`^p1~z}67>T!mNV8J zqo^5LgE~DMQ5}68wTE6ob?{wGE@dI}- zChG5gHEL=%q8j#4?`uJw`OgnxywPd3)`JQ6tUk%KpLOrU&GF*(SaXTKx{`{I~ zB=4h6#ea}VGJQCU`eQQ_bMRIik9%+pevDV)_4HCRc>s0%PN9~}B=~j~c0;{57j?X5 z;Dxvx>AYF#y9ax6|Gw{e)Xb!@gS7;G(Zyjn1h=6+KZJVkTgaHq7uXvUL+Gx0I1%Zr z*??N(Lr5phN2sao&q8a4E=5iK2>*TzY6d4`d%P00`L4oDtnllXp{D!>)ZU69Gm$VG zC}>SuP(6GB0~jZ{MAs~$Uh9WuJ$ZyYOX`TOMMTrOlpG?OAzkWN1G$3edWHO$93;1s zyLJ9`?I59KiB05tBYI>e*+!O;w(BkmS{|Ed_C}Jn>j4Uy`g_S{@>8O}t}98~^%Dx3 zt$u2M4ta@8C%OiuNbcB}UtWb9$S(hW3f}6M#Z5#TRM#yj%v$_88A@IxKO^@ME#pG6 zh9r*gk1nl!bF!5BpO5SPve-^8B0nP6l2)>ZTtoigjF>2NGYi$M~RN~^JEEG zLD-n7`PWgh$TXr$J6P9)Da?MN$w#pli@^H4S9leBI;%i(bYn(BiSUKj3QxDMRfHd4<}2hAD^v$`EgwB zmk*$hYx2d(Up~qcNsyEi{oLy6O130R#@vjRez_gaCbyAa5>9FIit=w3$xGdS_wNmq zt|Y%84}Dil`+K>$oLu5pR^VK+kL>j8e&rj%V`MN{Kr+dEvY518_fzOieoZ?1mBX-! z^zrX!_&&=2E+qf->i$W;^84Ju%`>DM8SuRiuBO~b%Dz{p;z0c~Bx=Q@P9*AOU-I{i z>ZmELt##w!SesTTT<5kf>XjSt_V+%}af%yk9`A)RZt~7$+?E!O*|jmNI_kA#uIo`9 zu64t8p-6)hq)KmG->1_1u+KtoQ{PF6X--WfZbzEUG(L_uS}Q`a<<@e$DHL92#at`m zG&l`4PQ(hjtDJDua_c76M66Mlt7~Dq!HHUSIA}H6(dY^{5{#xktaBq)vm1|Cb#{{* z3B??1g;Nv7=wzC4f;D#S4HO#eddEB0_tn1Bo%(urq%|aJC^aVEI4|DV=tg4R;eKy> z`}=S377tk9eK{b{D;YR_(46uLtCatyPOYr2m~T~7E-;m~F_&JN%0?$VqpWq?z`8)k zP?KHT>~*w;dvmOnUizT51(8^4R6)Br)loV*w7%YQ!}ZM?v-5)yyJ4sG_CePQt4m_H4oE+=3#jpkRD)L2mx&{QUGe zmAO?;Qz#m8!?|U4%o%SL=I592S=)2ogyF^A^BSFC#9n1zv8=%k)wjlm?+SQ5bI+tz zxKTG2aidUQQ3kj_#wXc)Mua+fmrdd#89za*>^gYs#ZMZq?f1s2y~zAmeqytnH0)hlQ?X0c|aG ztrNDRe43i0u-i}*VV!w89%ZM5T&vk)N5vv`)H%A(_Sd}8j@VW-9<^BKkQ;4VdY2`y zYVAMzfHz^{&Poj4%y97\n" +"POT-Creation-Date: 2009-08-20 19:43-0500\n" +"PO-Revision-Date: 2009-08-20 19:52-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" @@ -18,42 +18,115 @@ msgstr "" "X-Poedit-SearchPath-2: webdir/javascript\n" "X-Poedit-SearchPath-3: libs/Monkeys\n" -#: modules/default/models/Fields.php:32 +#: modules/default/controllers/CidController.php:29 +msgid "Could not retrieve news items" +msgstr "No fue posible extraer las noticias" + +#: modules/default/controllers/CidController.php:47 +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/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 "'%hostname%' is not a valid hostname for email address '%value%'" +msgstr "'%hostname%' no es un hostname válido para el correo electrónico '%value%'" + +#: modules/default/forms/ErrorMessages.php:23 +msgid "'%value%' appears to be a DNS hostname but cannot match TLD against known list" +msgstr "'%value%' parece ser un hostname DNS pero no se puede encontrar TLD correspondiente" + +#: modules/default/forms/ErrorMessages.php:24 +msgid "'%value%' appears to be a local network name but local network names are not allowed" +msgstr "'%value%' parece ser un nombre de red local pero nombres de red local no son permitidos" + +#: modules/default/forms/ErrorMessages.php:25 +msgid "Captcha value is wrong" +msgstr "El valor del texto está errado" + +#: modules/default/forms/ErrorMessages.php:26 +msgid "Password confirmation does not match" +msgstr "Las contraseñas no coinciden" + +#: modules/default/forms/ErrorMessages.php:27 +msgid "Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*'(), and \"" +msgstr "Nombre de usuario solamente puede contener caracteres alfanuméricos US-ASCII, y cualquiera de los símbolos $-_.+!*'(), y \"" + +#: modules/default/forms/OpenidLogin.php:27 +msgid "OpenID URL" +msgstr "OpenID URL" + +#: modules/default/forms/OpenidLogin.php:34 +msgid "Password" +msgstr "Contraseña" + +#: modules/default/forms/MessageUsers.php:17 +msgid "Subject:" +msgstr "Asunto:" + +#: modules/default/forms/MessageUsers.php:22 +msgid "CC:" +msgstr "CC:" + +#: modules/default/forms/Feedback.php:25 +msgid "Enter your name" +msgstr "Ingrese su nombre" + +#: modules/default/forms/Feedback.php:30 +msgid "Enter your E-mail" +msgstr "Ingrese su correo electrónico" + +#: modules/default/forms/Feedback.php:37 +msgid "Enter your questions or comments" +msgstr "Ingrese sus preguntas o comentarios" + +#: modules/default/forms/Feedback.php:44 +msgid "Please enter the text below" +msgstr "Por favor ingrese el siguiente texto" + +#: modules/default/models/Fields.php:45 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 +#: modules/default/models/Fields.php:46 msgid "E-mail" msgstr "Correo electrónico" -#: modules/default/models/Fields.php:34 +#: modules/default/models/Fields.php:47 msgid "Full Name" msgstr "Nombre Completo" -#: modules/default/models/Fields.php:35 +#: modules/default/models/Fields.php:48 msgid "Date of Birth" msgstr "Fecha de Nacimiento" -#: modules/default/models/Fields.php:36 +#: modules/default/models/Fields.php:49 msgid "Gender" msgstr "Género" -#: modules/default/models/Fields.php:37 +#: modules/default/models/Fields.php:50 msgid "Postal Code" msgstr "Código Postal" -#: modules/default/models/Fields.php:38 +#: modules/default/models/Fields.php:51 msgid "Country" msgstr "País" -#: modules/default/models/Fields.php:39 +#: modules/default/models/Fields.php:52 msgid "Language" msgstr "Idioma" -#: modules/default/models/Fields.php:40 +#: modules/default/models/Fields.php:53 msgid "Time Zone" msgstr "Zona Horaria" @@ -65,103 +138,52 @@ msgstr "Hombre" 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 +#: modules/install/controllers/CredentialsController.php:183 #, php-format msgid "The directory where Community-ID is installed must be writable by the web server user (%s). Another option is to create an EMPTY config.php file that is writable by that user." msgstr "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 +#: modules/install/controllers/CredentialsController.php:186 #, php-format msgid "The directory \"captchas\" under the web directory for Community-ID must be writable by the web server user (%s)" msgstr "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 +#: modules/install/controllers/CredentialsController.php:189 +#, php-format +msgid "You need to have the %s extension installed" +msgstr "Necesita tener la extensión %s instalada" + +#: modules/install/controllers/UpgradeController.php:57 +#: modules/install/controllers/UpgradeController.php:65 +#: modules/users/controllers/LoginController.php:46 +#: modules/users/controllers/LoginController.php:74 +msgid "Invalid credentials" +msgstr "Credenciales inválidas" + +#: modules/install/controllers/UpgradeController.php:73 +#, php-format +msgid "Upgrade was successful. You are now on version %s" +msgstr "La actualización fue exitosa. Ahora se encuentra en la versión %s" + +#: modules/install/controllers/UpgradeController.php:97 +#, php-format +msgid "Correct before upgrading: File %s is required to proceed" +msgstr "Corrija antes de hacer la actualización: El archivo %s es requerido para proceder" + +#: modules/install/forms/UpgradeLogin.php:18 +#: modules/users/forms/AccountInfo.php:26 +msgid "Username" +msgstr "Nombre de usuario" + +#: modules/users/controllers/UserslistController.php:52 msgid "admin" msgstr "admin" -#: modules/users/controllers/UserslistController.php:52 +#: modules/users/controllers/UserslistController.php:54 msgid "confirmed" msgstr "confirmado" -#: modules/users/controllers/UserslistController.php:54 +#: modules/users/controllers/UserslistController.php:56 msgid "unconfirmed" msgstr "no confirmado" @@ -183,6 +205,10 @@ msgstr "Su cuenta ha sido borrada con éxito" msgid "Sorry, registrations are currently disabled" msgstr "Lo sentimos, los nuevos registros están actualmente deshabilitados" +#: modules/users/controllers/RegisterController.php:101 +msgid "Community-ID registration confirmation" +msgstr "Community-ID confirmación de registro" + #: modules/users/controllers/RegisterController.php:104 msgid "Thank you." msgstr "Gracias." @@ -195,8 +221,23 @@ msgstr "Recibirá por correo electrónico las instrucciones para activar la cuen 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" +#: modules/users/controllers/RegisterController.php:121 +#: modules/users/controllers/RegisterController.php:149 +#: modules/users/controllers/RegisterController.php:163 +msgid "Invalid token" +msgstr "Token inválido" + +#: modules/users/controllers/RegisterController.php:154 +msgid "Your account has been deleted" +msgstr "Su cuenta ha sido borrada" + +#: modules/users/controllers/ManageusersController.php:25 +msgid "User has been deleted successfully" +msgstr "El usuario ha sido borrado con éxito" + +#: modules/users/controllers/ManageusersController.php:42 +#, fuzzy +msgid "Community-ID registration reminder" msgstr "Community-ID confirmación de registro" #: modules/users/controllers/RecoverpasswordController.php:51 @@ -216,45 +257,57 @@ msgstr "El correo electrónico de restablecimiento de contraseña ha sido enviad 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 +#: modules/users/forms/Login.php:18 msgid "USERNAME" msgstr "NOMBRE DE USUARIO" -#: modules/users/forms/LoginForm.php:13 +#: modules/users/forms/Login.php:27 msgid "PASSWORD" msgstr "CONTRASEÑA" -#: modules/users/forms/RegisterForm.php:48 +#: modules/users/forms/AccountInfo.php:32 +msgid "First Name" +msgstr "Nombre" + +#: modules/users/forms/AccountInfo.php:37 +msgid "Last Name" +msgstr "Apellido" + +#: modules/users/forms/AccountInfo.php:52 +#: modules/users/forms/ChangePassword.php:18 +msgid "Enter password" +msgstr "Ingrese contraseña" + +#: modules/users/forms/AccountInfo.php:58 +#: modules/users/forms/ChangePassword.php:24 +msgid "Enter password again" +msgstr "Ingrese contraseña de nuevo" + +#: modules/users/forms/Register.php:49 msgid "Enter desired password" msgstr "Ingrese contraseña deseada" +#: 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/news/forms/Article.php:18 +msgid "Title" +msgstr "Título" + +#: modules/news/forms/Article.php:24 +msgid "Publication date" +msgstr "Fecha de publicación" + +#: modules/news/forms/Article.php:32 +msgid "Excerpt" +msgstr "Extracto" + #: webdir/javascript/language.php:30 -#: modules/users/views/scripts/profilegeneral/accountinfo.phtml:12 msgid "Name" msgstr "Nombre" @@ -394,17 +447,21 @@ msgstr "ant" msgid "IP" msgstr "IP" -#: libs/Monkeys/Form/Element/Language.php:36 -msgid "-- Select a Language --" -msgstr "-- Seleccione un Idioma --" +#: webdir/javascript/language.php:65 +msgid "Delete unconfirmed accounts older than how many days?" +msgstr "¿Eliminar cuentas sin confirmar más antiguas que cuantos días?" -#: libs/Monkeys/Form/Element/Timezone.php:48 -msgid "-- Select a Timezone --" -msgstr "-- Seleccione una zona horaria --" +#: webdir/javascript/language.php:66 +msgid "The value entered is incorrect" +msgstr "El valor ingresado no es correcto" -#: libs/Monkeys/Form/Element/Country.php:36 -msgid "-- Select a Country --" -msgstr "-- Seleccione un País --" +#: webdir/javascript/language.php:67 +msgid "Send reminder to accounts older than how many days?" +msgstr "¿Enviar recordatorio a cuentas más antiguas que cuantos días?" + +#: webdir/javascript/language.php:68 +msgid "Are you sure you wish to delete this article?" +msgstr "¿Está seguro de querer eliminar este artículo?" #: libs/Monkeys/View/Helper/FormDateSelects.php:267 msgid "January" @@ -454,33 +511,21 @@ msgstr "Noviembre" msgid "December" msgstr "Diciembre" -#: modules/default/views/scripts/privacy/index.phtml:1 -msgid "Privacy Policy" -msgstr "Política de Privacidad" +#: libs/Monkeys/Form/Element/Language.php:36 +msgid "-- Select a Language --" +msgstr "-- Seleccione un Idioma --" -#: 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" +#: libs/Monkeys/Form/Element/Country.php:36 +msgid "-- Select a Country --" +msgstr "-- Seleccione un País --" -#: modules/default/views/scripts/messageusers/index.phtml:18 -msgid "switch to Plain-Text" -msgstr "cambiar a texto plano" +#: libs/Monkeys/Form/Element/Timezone.php:48 +msgid "-- Select a Timezone --" +msgstr "-- Seleccione una zona horaria --" -#: 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/login.phtml:9 +msgid "Login" +msgstr "Ingresar" #: modules/default/views/scripts/openid/trust.phtml:3 #, php-format @@ -516,18 +561,6 @@ msgstr "Permitir" 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" @@ -544,56 +577,64 @@ msgstr "OK" 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/index/index-es.phtml:37 +#: modules/default/views/scripts/index/index-de.phtml:39 +#: modules/default/views/scripts/index/index-en.phtml:39 +#: modules/default/views/scripts/index/index-sv.phtml:49 +msgid "There are no news articles yet" +msgstr "No hay artículos todavía" -#: 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/default/views/scripts/index/index-es.phtml:44 +#: modules/default/views/scripts/index/index-de.phtml:46 +#: modules/default/views/scripts/index/index-en.phtml:46 +#: modules/default/views/scripts/index/index-sv.phtml:56 +msgid "View All" +msgstr "Ver Todos" -#: modules/stats/views/scripts/authorizations/index.phtml:1 -msgid "Authorizations per day" -msgstr "Autorizaciones por día" +#: modules/default/views/scripts/index/index-es.phtml:48 +#: modules/default/views/scripts/index/index-de.phtml:50 +#: modules/default/views/scripts/index/index-en.phtml:50 +#: modules/default/views/scripts/index/index-sv.phtml:60 +msgid "Add New Article" +msgstr "Agregar Nuevo Artículo" -#: 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/default/views/scripts/cid/index.phtml:1 +msgid "About Community-id" +msgstr "Sobre Community-id" -#: 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/default/views/scripts/cid/index.phtml:3 +msgid "Version installed:" +msgstr "Versión instalada:" -#: 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/default/views/scripts/cid/index.phtml:8 +msgid "Latest news from Community-ID:" +msgstr "Últimas noticias de Community-ID:" -#: modules/stats/views/scripts/registrations/index.phtml:1 -msgid "Registrations per day" -msgstr "Registros por día" +#: 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/stats/views/scripts/registrations/index.phtml:6 -msgid "Last Month" -msgstr "Ultimo Mes" +#: modules/default/views/scripts/messageusers/index.phtml:16 +msgid "switch to Plain-Text" +msgstr "cambiar a texto plano" -#: modules/stats/views/scripts/top/index.phtml:1 -msgid "Top 10 Trusted Sites" -msgstr "Primeros 10 Sitios de Confianza" +#: modules/default/views/scripts/messageusers/index.phtml:19 +msgid "switch to Rich-Text (HTML)" +msgstr "cambiar a texto enriquecido (HTML)" -#: modules/stats/views/scripts/top/index.phtml:7 -#, php-format -msgid "%s users" -msgstr "%s usuarios" +#: modules/default/views/scripts/messageusers/index.phtml:29 +#: modules/default/views/scripts/feedback/index.phtml:7 +#: modules/install/views/scripts/credentials/index.phtml:12 +msgid "Send" +msgstr "Enviar" -#: modules/stats/views/scripts/sites/index.phtml:1 -msgid "Trusted Sites" -msgstr "Sitios de confianza" +#: modules/default/views/scripts/privacy/index.phtml:1 +msgid "Privacy Policy" +msgstr "Política de Privacidad" + +#: 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/install/views/scripts/complete/index.phtml:2 msgid "The installation was performed successfully" @@ -603,6 +644,10 @@ msgstr "La instalación fue exitosa" msgid "Finish" msgstr "Terminar" +#: 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/permissions/index.phtml:2 msgid "Please correct the following problems before proceeding:" msgstr "Por favor corrija los siguientes problemas antes de proceder:" @@ -611,10 +656,6 @@ msgstr "Por favor corrija los siguientes problemas antes de proceder:" 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" @@ -623,6 +664,84 @@ msgstr "Esta instancia de Community-ID no ha sido instalada aún" msgid "Proceed with installation" msgstr "Proceder con la instalación" +#: modules/install/views/scripts/upgrade/index.phtml:1 +msgid "New version detected" +msgstr "Nueva versión detectada" + +#: modules/install/views/scripts/upgrade/index.phtml:3 +msgid "Enter the administrator credentials to proceed with the upgrade:" +msgstr "Ingrese las credenciales de administrador para proceder con la actualización:" + +#: modules/install/views/scripts/upgrade/index.phtml:6 +msgid "Make sure you make a copy of the database before, just in case" +msgstr "Asegúrese de hacer una copia de respaldo de la base de datos, por si acaso" + +#: modules/users/views/scripts/profile/index.phtml:13 +msgid "Account info" +msgstr "Información de la Cuenta" + +#: modules/users/views/scripts/profile/index.phtml:17 +#: modules/users/views/scripts/personalinfo/index.phtml:16 +msgid "Edit" +msgstr "Editar" + +#: 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/manageusers/index.phtml:11 +msgid "Enter search string" +msgstr "Ingrese cadena de búsqueda" + +#: modules/users/views/scripts/manageusers/index.phtml:12 +msgid "Go" +msgstr "Ir" + +#: modules/users/views/scripts/manageusers/index.phtml:13 +msgid "Clear" +msgstr "Borrar" + +#: modules/users/views/scripts/manageusers/index.phtml:16 +msgid "All" +msgstr "Todos" + +#: modules/users/views/scripts/manageusers/index.phtml:19 +msgid "Confirmed" +msgstr "Confirmados" + +#: modules/users/views/scripts/manageusers/index.phtml:22 +msgid "Unconfirmed" +msgstr "No confirmados" + +#: modules/users/views/scripts/manageusers/index.phtml:29 +msgid "Total users:" +msgstr "Total usuarios:" + +#: modules/users/views/scripts/manageusers/index.phtml:30 +msgid "Total confirmed users:" +msgstr "Total usuarios confirmados:" + +#: modules/users/views/scripts/manageusers/index.phtml:31 +msgid "Total unconfirmed users:" +msgstr "Total usuarios no confirmados:" + +#: modules/users/views/scripts/manageusers/index.phtml:34 +msgid "Add User" +msgstr "Agregar Usuario" + +#: modules/users/views/scripts/manageusers/index.phtml:36 +msgid "Delete Unconfirmed Users" +msgstr "Eliminar Usuarios no Confirmados" + +#: modules/users/views/scripts/manageusers/index.phtml:39 +msgid "Send Reminder" +msgstr "Enviar Recordatorio" + #: 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" @@ -639,55 +758,19 @@ msgstr "EN DESACUERDO" msgid "Registration Form" msgstr "Formulario de Registro" -#: modules/users/views/scripts/personalinfo/edit.phtml:42 +#: modules/users/views/scripts/profilegeneral/changepassword.phtml:7 #: modules/users/views/scripts/profilegeneral/editaccountinfo.phtml:13 -#: modules/users/views/scripts/profilegeneral/changepassword.phtml:36 +#: modules/users/views/scripts/personalinfo/edit.phtml:5 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/changepassword.phtml:8 #: modules/users/views/scripts/profilegeneral/confirmdelete.phtml:23 +#: modules/users/views/scripts/profilegeneral/editaccountinfo.phtml:14 +#: modules/users/views/scripts/personalinfo/edit.phtml:6 msgid "Cancel" msgstr "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?" @@ -720,152 +803,205 @@ msgstr "Comentarios adicionales:" msgid "OpenID" msgstr "OpenID" +#: 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/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 +msgid "Personal Info" +msgstr "Información Personal" + +#: 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/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 +#: modules/users/views/scripts/login/index.phtml:43 +msgid "About Community-ID" +msgstr "Sobre Community-ID" + +#: modules/users/views/scripts/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 +#: modules/users/views/scripts/login/index.phtml:64 msgid "Remember me" msgstr "Recuérdeme" -#: modules/users/views/scripts/login/index.phtml:61 -#: modules/users/views/scripts_monkeys/login/index.phtml:64 +#: modules/users/views/scripts/login/index.phtml:67 msgid "Log in" msgstr "Ingresar" -#: modules/users/views/scripts/login/index.phtml:67 -#: modules/users/views/scripts_monkeys/login/index.phtml:70 +#: modules/users/views/scripts/login/index.phtml:73 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 +#: modules/users/views/scripts/login/index.phtml:79 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 +#: modules/users/views/scripts/login/index.phtml:81 msgid "REGISTER NOW!" msgstr "¡REGISTRESE AHORA!" -#: modules/users/views/scripts/manageusers/index.phtml:11 -msgid "All" -msgstr "Todos" +#: modules/stats/views/scripts/sites/index.phtml:1 +msgid "Trusted Sites" +msgstr "Sitios de confianza" -#: modules/users/views/scripts/manageusers/index.phtml:14 -msgid "Confirmed" -msgstr "Confirmados" +#: modules/stats/views/scripts/sites/index.phtml:3 +#: modules/stats/views/scripts/registrations/index.phtml:3 +#: modules/stats/views/scripts/authorizations/index.phtml:3 +msgid "Select view" +msgstr "Seleccionar vista" -#: modules/users/views/scripts/manageusers/index.phtml:17 -msgid "Unconfirmed" -msgstr "No confirmados" +#: modules/stats/views/scripts/sites/index.phtml:5 +#: modules/stats/views/scripts/registrations/index.phtml:5 +#: modules/stats/views/scripts/authorizations/index.phtml:5 +msgid "Last Week" +msgstr "Semana Pasada" -#: modules/users/views/scripts/manageusers/index.phtml:24 -msgid "Total users:" -msgstr "Total usuarios:" +#: modules/stats/views/scripts/sites/index.phtml:6 +#: modules/stats/views/scripts/registrations/index.phtml:7 +#: modules/stats/views/scripts/authorizations/index.phtml:6 +msgid "Last Year" +msgstr "Año Pasado" -#: modules/users/views/scripts/manageusers/index.phtml:25 -msgid "Total confirmed users:" -msgstr "Total usuarios confirmados:" +#: modules/stats/views/scripts/top/index.phtml:1 +msgid "Top 10 Trusted Sites" +msgstr "Primeros 10 Sitios de Confianza" -#: modules/users/views/scripts/manageusers/index.phtml:26 -msgid "Total unconfirmed users:" -msgstr "Total usuarios no confirmados:" +#: modules/stats/views/scripts/top/index.phtml:7 +#, php-format +msgid "%s users" +msgstr "%s usuarios" -#: modules/users/views/scripts/manageusers/index.phtml:29 -msgid "Add User" -msgstr "Agregar Usuario" +#: modules/stats/views/scripts/registrations/index.phtml:1 +msgid "Registrations per day" +msgstr "Registros por día" -#: modules/users/views/scripts/manageusers/index.phtml:31 -msgid "Delete Unconfirmed Users" -msgstr "Eliminar Usuarios no Confirmados" +#: modules/stats/views/scripts/registrations/index.phtml:6 +msgid "Last Month" +msgstr "Ultimo Mes" + +#: modules/stats/views/scripts/authorizations/index.phtml:1 +msgid "Authorizations per day" +msgstr "Autorizaciones por día" + +#: modules/news/views/scripts/view/index.phtml:3 +#: modules/news/views/scripts/index/index.phtml:16 +#, php-format +msgid "Published on %s" +msgstr "Publicado en %s" + +#: modules/news/views/scripts/view/index.phtml:6 +msgid "Edit Article" +msgstr "Editar Artículo" + +#: modules/news/views/scripts/view/index.phtml:7 +msgid "Delete Article" +msgstr "Eliminar Artículo" + +#: modules/news/views/scripts/index/pagination.phtml:10 +#: modules/news/views/scripts/index/pagination.phtml:13 +msgid "Previous" +msgstr "Anterior" + +#: modules/news/views/scripts/index/pagination.phtml:30 +#: modules/news/views/scripts/index/pagination.phtml:33 +msgid "Next" +msgstr "Siguiente" + +#: modules/news/views/scripts/index/index.phtml:3 +msgid "Latest News" +msgstr "Ultimas Noticias" + +#: modules/news/views/scripts/index/index.phtml:21 +msgid "read more" +msgstr "leer más" -#: 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/layout.phtml:41 +msgid "Your OpenID is:" +msgstr "Su OpenID es:" -#: views/layouts_monkeys/layout.phtml:55 -#: views/layouts/layout.phtml:52 +#: views/layouts/layout.phtml:58 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" +#~ msgid "Body:" +#~ msgstr "Contenido:" +#~ msgid "OPEN AN ACCOUNT NOW" +#~ msgstr "ABRA UNA CUENTA AHORA" +#~ 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?" +#~ msgid "Starting today
you'll only have to remember one" +#~ msgstr "A partir de hoy
solo tendrá que recordar una" +#~ msgid "Help and Support" +#~ msgstr "Ayuda y Soporte" +#~ msgid "Privacy" +#~ msgstr "Privacidad" +#~ msgid "About Us" +#~ msgstr "Sobre Nosotros" +#~ msgid "Contact Us" +#~ msgstr "Contáctenos" diff --git a/libs/Auth/OpenID.php b/libs/Auth/OpenID.php new file mode 100644 index 0000000..6556b5b --- /dev/null +++ b/libs/Auth/OpenID.php @@ -0,0 +1,552 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * The library version string + */ +define('Auth_OpenID_VERSION', '2.1.2'); + +/** + * Require the fetcher code. + */ +require_once "Auth/Yadis/PlainHTTPFetcher.php"; +require_once "Auth/Yadis/ParanoidHTTPFetcher.php"; +require_once "Auth/OpenID/BigMath.php"; +require_once "Auth/OpenID/URINorm.php"; + +/** + * Status code returned by the server when the only option is to show + * an error page, since we do not have enough information to redirect + * back to the consumer. The associated value is an error message that + * should be displayed on an HTML error page. + * + * @see Auth_OpenID_Server + */ +define('Auth_OpenID_LOCAL_ERROR', 'local_error'); + +/** + * Status code returned when there is an error to return in key-value + * form to the consumer. The caller should return a 400 Bad Request + * response with content-type text/plain and the value as the body. + * + * @see Auth_OpenID_Server + */ +define('Auth_OpenID_REMOTE_ERROR', 'remote_error'); + +/** + * Status code returned when there is a key-value form OK response to + * the consumer. The value associated with this code is the + * response. The caller should return a 200 OK response with + * content-type text/plain and the value as the body. + * + * @see Auth_OpenID_Server + */ +define('Auth_OpenID_REMOTE_OK', 'remote_ok'); + +/** + * Status code returned when there is a redirect back to the + * consumer. The value is the URL to redirect back to. The caller + * should return a 302 Found redirect with a Location: header + * containing the URL. + * + * @see Auth_OpenID_Server + */ +define('Auth_OpenID_REDIRECT', 'redirect'); + +/** + * Status code returned when the caller needs to authenticate the + * user. The associated value is a {@link Auth_OpenID_ServerRequest} + * object that can be used to complete the authentication. If the user + * has taken some authentication action, use the retry() method of the + * {@link Auth_OpenID_ServerRequest} object to complete the request. + * + * @see Auth_OpenID_Server + */ +define('Auth_OpenID_DO_AUTH', 'do_auth'); + +/** + * Status code returned when there were no OpenID arguments + * passed. This code indicates that the caller should return a 200 OK + * response and display an HTML page that says that this is an OpenID + * server endpoint. + * + * @see Auth_OpenID_Server + */ +define('Auth_OpenID_DO_ABOUT', 'do_about'); + +/** + * Defines for regexes and format checking. + */ +define('Auth_OpenID_letters', + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); + +define('Auth_OpenID_digits', + "0123456789"); + +define('Auth_OpenID_punct', + "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"); + +if (Auth_OpenID_getMathLib() === null) { + Auth_OpenID_setNoMathSupport(); +} + +/** + * The OpenID utility function class. + * + * @package OpenID + * @access private + */ +class Auth_OpenID { + + /** + * Return true if $thing is an Auth_OpenID_FailureResponse object; + * false if not. + * + * @access private + */ + function isFailure($thing) + { + return is_a($thing, 'Auth_OpenID_FailureResponse'); + } + + /** + * Gets the query data from the server environment based on the + * request method used. If GET was used, this looks at + * $_SERVER['QUERY_STRING'] directly. If POST was used, this + * fetches data from the special php://input file stream. + * + * Returns an associative array of the query arguments. + * + * Skips invalid key/value pairs (i.e. keys with no '=value' + * portion). + * + * Returns an empty array if neither GET nor POST was used, or if + * POST was used but php://input cannot be opened. + * + * @access private + */ + function getQuery($query_str=null) + { + $data = array(); + + if ($query_str !== null) { + $data = Auth_OpenID::params_from_string($query_str); + } else if (!array_key_exists('REQUEST_METHOD', $_SERVER)) { + // Do nothing. + } else { + // XXX HACK FIXME HORRIBLE. + // + // POSTing to a URL with query parameters is acceptable, but + // we don't have a clean way to distinguish those parameters + // when we need to do things like return_to verification + // which only want to look at one kind of parameter. We're + // going to emulate the behavior of some other environments + // by defaulting to GET and overwriting with POST if POST + // data is available. + $data = Auth_OpenID::params_from_string($_SERVER['QUERY_STRING']); + + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $str = file_get_contents('php://input'); + + if ($str === false) { + $post = array(); + } else { + $post = Auth_OpenID::params_from_string($str); + } + + $data = array_merge($data, $post); + } + } + + return $data; + } + + function params_from_string($str) + { + $chunks = explode("&", $str); + + $data = array(); + foreach ($chunks as $chunk) { + $parts = explode("=", $chunk, 2); + + if (count($parts) != 2) { + continue; + } + + list($k, $v) = $parts; + $data[$k] = urldecode($v); + } + + return $data; + } + + /** + * Create dir_name as a directory if it does not exist. If it + * exists, make sure that it is, in fact, a directory. Returns + * true if the operation succeeded; false if not. + * + * @access private + */ + function ensureDir($dir_name) + { + if (is_dir($dir_name) || @mkdir($dir_name)) { + return true; + } else { + $parent_dir = dirname($dir_name); + + // Terminal case; there is no parent directory to create. + if ($parent_dir == $dir_name) { + return true; + } + + return (Auth_OpenID::ensureDir($parent_dir) && @mkdir($dir_name)); + } + } + + /** + * Adds a string prefix to all values of an array. Returns a new + * array containing the prefixed values. + * + * @access private + */ + function addPrefix($values, $prefix) + { + $new_values = array(); + foreach ($values as $s) { + $new_values[] = $prefix . $s; + } + return $new_values; + } + + /** + * Convenience function for getting array values. Given an array + * $arr and a key $key, get the corresponding value from the array + * or return $default if the key is absent. + * + * @access private + */ + function arrayGet($arr, $key, $fallback = null) + { + if (is_array($arr)) { + if (array_key_exists($key, $arr)) { + return $arr[$key]; + } else { + return $fallback; + } + } else { + trigger_error("Auth_OpenID::arrayGet (key = ".$key.") expected " . + "array as first parameter, got " . + gettype($arr), E_USER_WARNING); + + return false; + } + } + + /** + * Replacement for PHP's broken parse_str. + */ + function parse_str($query) + { + if ($query === null) { + return null; + } + + $parts = explode('&', $query); + + $new_parts = array(); + for ($i = 0; $i < count($parts); $i++) { + $pair = explode('=', $parts[$i]); + + if (count($pair) != 2) { + continue; + } + + list($key, $value) = $pair; + $new_parts[$key] = urldecode($value); + } + + return $new_parts; + } + + /** + * Implements the PHP 5 'http_build_query' functionality. + * + * @access private + * @param array $data Either an array key/value pairs or an array + * of arrays, each of which holding two values: a key and a value, + * sequentially. + * @return string $result The result of url-encoding the key/value + * pairs from $data into a URL query string + * (e.g. "username=bob&id=56"). + */ + function httpBuildQuery($data) + { + $pairs = array(); + foreach ($data as $key => $value) { + if (is_array($value)) { + $pairs[] = urlencode($value[0])."=".urlencode($value[1]); + } else { + $pairs[] = urlencode($key)."=".urlencode($value); + } + } + return implode("&", $pairs); + } + + /** + * "Appends" query arguments onto a URL. The URL may or may not + * already have arguments (following a question mark). + * + * @access private + * @param string $url A URL, which may or may not already have + * arguments. + * @param array $args Either an array key/value pairs or an array of + * arrays, each of which holding two values: a key and a value, + * sequentially. If $args is an ordinary key/value array, the + * parameters will be added to the URL in sorted alphabetical order; + * if $args is an array of arrays, their order will be preserved. + * @return string $url The original URL with the new parameters added. + * + */ + function appendArgs($url, $args) + { + if (count($args) == 0) { + return $url; + } + + // Non-empty array; if it is an array of arrays, use + // multisort; otherwise use sort. + if (array_key_exists(0, $args) && + is_array($args[0])) { + // Do nothing here. + } else { + $keys = array_keys($args); + sort($keys); + $new_args = array(); + foreach ($keys as $key) { + $new_args[] = array($key, $args[$key]); + } + $args = $new_args; + } + + $sep = '?'; + if (strpos($url, '?') !== false) { + $sep = '&'; + } + + return $url . $sep . Auth_OpenID::httpBuildQuery($args); + } + + /** + * Implements python's urlunparse, which is not available in PHP. + * Given the specified components of a URL, this function rebuilds + * and returns the URL. + * + * @access private + * @param string $scheme The scheme (e.g. 'http'). Defaults to 'http'. + * @param string $host The host. Required. + * @param string $port The port. + * @param string $path The path. + * @param string $query The query. + * @param string $fragment The fragment. + * @return string $url The URL resulting from assembling the + * specified components. + */ + function urlunparse($scheme, $host, $port = null, $path = '/', + $query = '', $fragment = '') + { + + if (!$scheme) { + $scheme = 'http'; + } + + if (!$host) { + return false; + } + + if (!$path) { + $path = ''; + } + + $result = $scheme . "://" . $host; + + if ($port) { + $result .= ":" . $port; + } + + $result .= $path; + + if ($query) { + $result .= "?" . $query; + } + + if ($fragment) { + $result .= "#" . $fragment; + } + + return $result; + } + + /** + * Given a URL, this "normalizes" it by adding a trailing slash + * and / or a leading http:// scheme where necessary. Returns + * null if the original URL is malformed and cannot be normalized. + * + * @access private + * @param string $url The URL to be normalized. + * @return mixed $new_url The URL after normalization, or null if + * $url was malformed. + */ + function normalizeUrl($url) + { + @$parsed = parse_url($url); + + if (!$parsed) { + return null; + } + + if (isset($parsed['scheme']) && + isset($parsed['host'])) { + $scheme = strtolower($parsed['scheme']); + if (!in_array($scheme, array('http', 'https'))) { + return null; + } + } else { + $url = 'http://' . $url; + } + + $normalized = Auth_OpenID_urinorm($url); + if ($normalized === null) { + return null; + } + list($defragged, $frag) = Auth_OpenID::urldefrag($normalized); + return $defragged; + } + + /** + * Replacement (wrapper) for PHP's intval() because it's broken. + * + * @access private + */ + function intval($value) + { + $re = "/^\\d+$/"; + + if (!preg_match($re, $value)) { + return false; + } + + return intval($value); + } + + /** + * Count the number of bytes in a string independently of + * multibyte support conditions. + * + * @param string $str The string of bytes to count. + * @return int The number of bytes in $str. + */ + function bytes($str) + { + return strlen(bin2hex($str)) / 2; + } + + /** + * Get the bytes in a string independently of multibyte support + * conditions. + */ + function toBytes($str) + { + $hex = bin2hex($str); + + if (!$hex) { + return array(); + } + + $b = array(); + for ($i = 0; $i < strlen($hex); $i += 2) { + $b[] = chr(base_convert(substr($hex, $i, 2), 16, 10)); + } + + return $b; + } + + function urldefrag($url) + { + $parts = explode("#", $url, 2); + + if (count($parts) == 1) { + return array($parts[0], ""); + } else { + return $parts; + } + } + + function filter($callback, &$sequence) + { + $result = array(); + + foreach ($sequence as $item) { + if (call_user_func_array($callback, array($item))) { + $result[] = $item; + } + } + + return $result; + } + + function update(&$dest, &$src) + { + foreach ($src as $k => $v) { + $dest[$k] = $v; + } + } + + /** + * Wrap PHP's standard error_log functionality. Use this to + * perform all logging. It will interpolate any additional + * arguments into the format string before logging. + * + * @param string $format_string The sprintf format for the message + */ + function log($format_string) + { + $args = func_get_args(); + $message = call_user_func_array('sprintf', $args); + error_log($message); + } + + function autoSubmitHTML($form, $title="OpenId transaction in progress") + { + return("". + "". + $title . + "". + "". + $form . + "". + "". + ""); + } +} +?> diff --git a/libs/Auth/OpenID/AX.php b/libs/Auth/OpenID/AX.php new file mode 100644 index 0000000..4a617ae --- /dev/null +++ b/libs/Auth/OpenID/AX.php @@ -0,0 +1,1023 @@ +message = $message; + } +} + +/** + * Abstract class containing common code for attribute exchange + * messages. + * + * @package OpenID + */ +class Auth_OpenID_AX_Message extends Auth_OpenID_Extension { + /** + * ns_alias: The preferred namespace alias for attribute exchange + * messages + */ + var $ns_alias = 'ax'; + + /** + * mode: The type of this attribute exchange message. This must be + * overridden in subclasses. + */ + var $mode = null; + + var $ns_uri = Auth_OpenID_AX_NS_URI; + + /** + * Return Auth_OpenID_AX_Error if the mode in the attribute + * exchange arguments does not match what is expected for this + * class; true otherwise. + * + * @access private + */ + function _checkMode($ax_args) + { + $mode = Auth_OpenID::arrayGet($ax_args, 'mode'); + if ($mode != $this->mode) { + return new Auth_OpenID_AX_Error( + sprintf( + "Expected mode '%s'; got '%s'", + $this->mode, $mode)); + } + + return true; + } + + /** + * Return a set of attribute exchange arguments containing the + * basic information that must be in every attribute exchange + * message. + * + * @access private + */ + function _newArgs() + { + return array('mode' => $this->mode); + } +} + +/** + * Represents a single attribute in an attribute exchange + * request. This should be added to an AXRequest object in order to + * request the attribute. + * + * @package OpenID + */ +class Auth_OpenID_AX_AttrInfo { + /** + * Construct an attribute information object. Do not call this + * directly; call make(...) instead. + * + * @param string $type_uri The type URI for this attribute. + * + * @param int $count The number of values of this type to request. + * + * @param bool $required Whether the attribute will be marked as + * required in the request. + * + * @param string $alias The name that should be given to this + * attribute in the request. + */ + function Auth_OpenID_AX_AttrInfo($type_uri, $count, $required, + $alias) + { + /** + * required: Whether the attribute will be marked as required + * when presented to the subject of the attribute exchange + * request. + */ + $this->required = $required; + + /** + * count: How many values of this type to request from the + * subject. Defaults to one. + */ + $this->count = $count; + + /** + * type_uri: The identifier that determines what the attribute + * represents and how it is serialized. For example, one type + * URI representing dates could represent a Unix timestamp in + * base 10 and another could represent a human-readable + * string. + */ + $this->type_uri = $type_uri; + + /** + * alias: The name that should be given to this attribute in + * the request. If it is not supplied, a generic name will be + * assigned. For example, if you want to call a Unix timestamp + * value 'tstamp', set its alias to that value. If two + * attributes in the same message request to use the same + * alias, the request will fail to be generated. + */ + $this->alias = $alias; + } + + /** + * Construct an attribute information object. For parameter + * details, see the constructor. + */ + function make($type_uri, $count=1, $required=false, + $alias=null) + { + if ($alias !== null) { + $result = Auth_OpenID_AX_checkAlias($alias); + + if (Auth_OpenID_AX::isError($result)) { + return $result; + } + } + + return new Auth_OpenID_AX_AttrInfo($type_uri, $count, $required, + $alias); + } + + /** + * When processing a request for this attribute, the OP should + * call this method to determine whether all available attribute + * values were requested. If self.count == UNLIMITED_VALUES, this + * returns True. Otherwise this returns False, in which case + * self.count is an integer. + */ + function wantsUnlimitedValues() + { + return $this->count === Auth_OpenID_AX_UNLIMITED_VALUES; + } +} + +/** + * Given a namespace mapping and a string containing a comma-separated + * list of namespace aliases, return a list of type URIs that + * correspond to those aliases. + * + * @param $namespace_map The mapping from namespace URI to alias + * @param $alias_list_s The string containing the comma-separated + * list of aliases. May also be None for convenience. + * + * @return $seq The list of namespace URIs that corresponds to the + * supplied list of aliases. If the string was zero-length or None, an + * empty list will be returned. + * + * return null If an alias is present in the list of aliases but + * is not present in the namespace map. + */ +function Auth_OpenID_AX_toTypeURIs(&$namespace_map, $alias_list_s) +{ + $uris = array(); + + if ($alias_list_s) { + foreach (explode(',', $alias_list_s) as $alias) { + $type_uri = $namespace_map->getNamespaceURI($alias); + if ($type_uri === null) { + // raise KeyError( + // 'No type is defined for attribute name %r' % (alias,)) + return new Auth_OpenID_AX_Error( + sprintf('No type is defined for attribute name %s', + $alias) + ); + } else { + $uris[] = $type_uri; + } + } + } + + return $uris; +} + +/** + * An attribute exchange 'fetch_request' message. This message is sent + * by a relying party when it wishes to obtain attributes about the + * subject of an OpenID authentication request. + * + * @package OpenID + */ +class Auth_OpenID_AX_FetchRequest extends Auth_OpenID_AX_Message { + + var $mode = 'fetch_request'; + + function Auth_OpenID_AX_FetchRequest($update_url=null) + { + /** + * requested_attributes: The attributes that have been + * requested thus far, indexed by the type URI. + */ + $this->requested_attributes = array(); + + /** + * update_url: A URL that will accept responses for this + * attribute exchange request, even in the absence of the user + * who made this request. + */ + $this->update_url = $update_url; + } + + /** + * Add an attribute to this attribute exchange request. + * + * @param attribute: The attribute that is being requested + * @return true on success, false when the requested attribute is + * already present in this fetch request. + */ + function add($attribute) + { + if ($this->contains($attribute->type_uri)) { + return new Auth_OpenID_AX_Error( + sprintf("The attribute %s has already been requested", + $attribute->type_uri)); + } + + $this->requested_attributes[$attribute->type_uri] = $attribute; + + return true; + } + + /** + * Get the serialized form of this attribute fetch request. + * + * @returns Auth_OpenID_AX_FetchRequest The fetch request message parameters + */ + function getExtensionArgs() + { + $aliases = new Auth_OpenID_NamespaceMap(); + + $required = array(); + $if_available = array(); + + $ax_args = $this->_newArgs(); + + foreach ($this->requested_attributes as $type_uri => $attribute) { + if ($attribute->alias === null) { + $alias = $aliases->add($type_uri); + } else { + $alias = $aliases->addAlias($type_uri, $attribute->alias); + + if ($alias === null) { + return new Auth_OpenID_AX_Error( + sprintf("Could not add alias %s for URI %s", + $attribute->alias, $type_uri + )); + } + } + + if ($attribute->required) { + $required[] = $alias; + } else { + $if_available[] = $alias; + } + + if ($attribute->count != 1) { + $ax_args['count.' . $alias] = strval($attribute->count); + } + + $ax_args['type.' . $alias] = $type_uri; + } + + if ($required) { + $ax_args['required'] = implode(',', $required); + } + + if ($if_available) { + $ax_args['if_available'] = implode(',', $if_available); + } + + return $ax_args; + } + + /** + * Get the type URIs for all attributes that have been marked as + * required. + * + * @return A list of the type URIs for attributes that have been + * marked as required. + */ + function getRequiredAttrs() + { + $required = array(); + foreach ($this->requested_attributes as $type_uri => $attribute) { + if ($attribute->required) { + $required[] = $type_uri; + } + } + + return $required; + } + + /** + * Extract a FetchRequest from an OpenID message + * + * @param request: The OpenID request containing the attribute + * fetch request + * + * @returns mixed An Auth_OpenID_AX_Error or the + * Auth_OpenID_AX_FetchRequest extracted from the request message if + * successful + */ + function &fromOpenIDRequest($request) + { + $m = $request->message; + $obj = new Auth_OpenID_AX_FetchRequest(); + $ax_args = $m->getArgs($obj->ns_uri); + + $result = $obj->parseExtensionArgs($ax_args); + + if (Auth_OpenID_AX::isError($result)) { + return $result; + } + + if ($obj->update_url) { + // Update URL must match the openid.realm of the + // underlying OpenID 2 message. + $realm = $m->getArg(Auth_OpenID_OPENID_NS, 'realm', + $m->getArg( + Auth_OpenID_OPENID_NS, + 'return_to')); + + if (!$realm) { + $obj = new Auth_OpenID_AX_Error( + sprintf("Cannot validate update_url %s " . + "against absent realm", $obj->update_url)); + } else if (!Auth_OpenID_TrustRoot::match($realm, + $obj->update_url)) { + $obj = new Auth_OpenID_AX_Error( + sprintf("Update URL %s failed validation against realm %s", + $obj->update_url, $realm)); + } + } + + return $obj; + } + + /** + * Given attribute exchange arguments, populate this FetchRequest. + * + * @return $result Auth_OpenID_AX_Error if the data to be parsed + * does not follow the attribute exchange specification. At least + * when 'if_available' or 'required' is not specified for a + * particular attribute type. Returns true otherwise. + */ + function parseExtensionArgs($ax_args) + { + $result = $this->_checkMode($ax_args); + if (Auth_OpenID_AX::isError($result)) { + return $result; + } + + $aliases = new Auth_OpenID_NamespaceMap(); + + foreach ($ax_args as $key => $value) { + if (strpos($key, 'type.') === 0) { + $alias = substr($key, 5); + $type_uri = $value; + + $alias = $aliases->addAlias($type_uri, $alias); + + if ($alias === null) { + return new Auth_OpenID_AX_Error( + sprintf("Could not add alias %s for URI %s", + $alias, $type_uri) + ); + } + + $count_s = Auth_OpenID::arrayGet($ax_args, 'count.' . $alias); + if ($count_s) { + $count = Auth_OpenID::intval($count_s); + if (($count === false) && + ($count_s === Auth_OpenID_AX_UNLIMITED_VALUES)) { + $count = $count_s; + } + } else { + $count = 1; + } + + if ($count === false) { + return new Auth_OpenID_AX_Error( + sprintf("Integer value expected for %s, got %s", + 'count.' . $alias, $count_s)); + } + + $attrinfo = Auth_OpenID_AX_AttrInfo::make($type_uri, $count, + false, $alias); + + if (Auth_OpenID_AX::isError($attrinfo)) { + return $attrinfo; + } + + $this->add($attrinfo); + } + } + + $required = Auth_OpenID_AX_toTypeURIs($aliases, + Auth_OpenID::arrayGet($ax_args, 'required')); + + foreach ($required as $type_uri) { + $attrib =& $this->requested_attributes[$type_uri]; + $attrib->required = true; + } + + $if_available = Auth_OpenID_AX_toTypeURIs($aliases, + Auth_OpenID::arrayGet($ax_args, 'if_available')); + + $all_type_uris = array_merge($required, $if_available); + + foreach ($aliases->iterNamespaceURIs() as $type_uri) { + if (!in_array($type_uri, $all_type_uris)) { + return new Auth_OpenID_AX_Error( + sprintf('Type URI %s was in the request but not ' . + 'present in "required" or "if_available"', + $type_uri)); + + } + } + + $this->update_url = Auth_OpenID::arrayGet($ax_args, 'update_url'); + + return true; + } + + /** + * Iterate over the AttrInfo objects that are contained in this + * fetch_request. + */ + function iterAttrs() + { + return array_values($this->requested_attributes); + } + + function iterTypes() + { + return array_keys($this->requested_attributes); + } + + /** + * Is the given type URI present in this fetch_request? + */ + function contains($type_uri) + { + return in_array($type_uri, $this->iterTypes()); + } +} + +/** + * An abstract class that implements a message that has attribute keys + * and values. It contains the common code between fetch_response and + * store_request. + * + * @package OpenID + */ +class Auth_OpenID_AX_KeyValueMessage extends Auth_OpenID_AX_Message { + + function Auth_OpenID_AX_KeyValueMessage() + { + $this->data = array(); + } + + /** + * Add a single value for the given attribute type to the + * message. If there are already values specified for this type, + * this value will be sent in addition to the values already + * specified. + * + * @param type_uri: The URI for the attribute + * @param value: The value to add to the response to the relying + * party for this attribute + * @return null + */ + function addValue($type_uri, $value) + { + if (!array_key_exists($type_uri, $this->data)) { + $this->data[$type_uri] = array(); + } + + $values =& $this->data[$type_uri]; + $values[] = $value; + } + + /** + * Set the values for the given attribute type. This replaces any + * values that have already been set for this attribute. + * + * @param type_uri: The URI for the attribute + * @param values: A list of values to send for this attribute. + */ + function setValues($type_uri, &$values) + { + $this->data[$type_uri] =& $values; + } + + /** + * Get the extension arguments for the key/value pairs contained + * in this message. + * + * @param aliases: An alias mapping. Set to None if you don't care + * about the aliases for this request. + * + * @access private + */ + function _getExtensionKVArgs(&$aliases) + { + if ($aliases === null) { + $aliases = new Auth_OpenID_NamespaceMap(); + } + + $ax_args = array(); + + foreach ($this->data as $type_uri => $values) { + $alias = $aliases->add($type_uri); + + $ax_args['type.' . $alias] = $type_uri; + $ax_args['count.' . $alias] = strval(count($values)); + + foreach ($values as $i => $value) { + $key = sprintf('value.%s.%d', $alias, $i + 1); + $ax_args[$key] = $value; + } + } + + return $ax_args; + } + + /** + * Parse attribute exchange key/value arguments into this object. + * + * @param ax_args: The attribute exchange fetch_response + * arguments, with namespacing removed. + * + * @return Auth_OpenID_AX_Error or true + */ + function parseExtensionArgs($ax_args) + { + $result = $this->_checkMode($ax_args); + if (Auth_OpenID_AX::isError($result)) { + return $result; + } + + $aliases = new Auth_OpenID_NamespaceMap(); + + foreach ($ax_args as $key => $value) { + if (strpos($key, 'type.') === 0) { + $type_uri = $value; + $alias = substr($key, 5); + + $result = Auth_OpenID_AX_checkAlias($alias); + + if (Auth_OpenID_AX::isError($result)) { + return $result; + } + + $alias = $aliases->addAlias($type_uri, $alias); + + if ($alias === null) { + return new Auth_OpenID_AX_Error( + sprintf("Could not add alias %s for URI %s", + $alias, $type_uri) + ); + } + } + } + + foreach ($aliases->iteritems() as $pair) { + list($type_uri, $alias) = $pair; + + if (array_key_exists('count.' . $alias, $ax_args)) { + + $count_key = 'count.' . $alias; + $count_s = $ax_args[$count_key]; + + $count = Auth_OpenID::intval($count_s); + + if ($count === false) { + return new Auth_OpenID_AX_Error( + sprintf("Integer value expected for %s, got %s", + 'count. %s' . $alias, $count_s, + Auth_OpenID_AX_UNLIMITED_VALUES) + ); + } + + $values = array(); + for ($i = 1; $i < $count + 1; $i++) { + $value_key = sprintf('value.%s.%d', $alias, $i); + + if (!array_key_exists($value_key, $ax_args)) { + return new Auth_OpenID_AX_Error( + sprintf( + "No value found for key %s", + $value_key)); + } + + $value = $ax_args[$value_key]; + $values[] = $value; + } + } else { + $key = 'value.' . $alias; + + if (!array_key_exists($key, $ax_args)) { + return new Auth_OpenID_AX_Error( + sprintf( + "No value found for key %s", + $key)); + } + + $value = $ax_args['value.' . $alias]; + + if ($value == '') { + $values = array(); + } else { + $values = array($value); + } + } + + $this->data[$type_uri] = $values; + } + + return true; + } + + /** + * Get a single value for an attribute. If no value was sent for + * this attribute, use the supplied default. If there is more than + * one value for this attribute, this method will fail. + * + * @param type_uri: The URI for the attribute + * @param default: The value to return if the attribute was not + * sent in the fetch_response. + * + * @return $value Auth_OpenID_AX_Error on failure or the value of + * the attribute in the fetch_response message, or the default + * supplied + */ + function getSingle($type_uri, $default=null) + { + $values = Auth_OpenID::arrayGet($this->data, $type_uri); + if (!$values) { + return $default; + } else if (count($values) == 1) { + return $values[0]; + } else { + return new Auth_OpenID_AX_Error( + sprintf('More than one value present for %s', + $type_uri) + ); + } + } + + /** + * Get the list of values for this attribute in the + * fetch_response. + * + * XXX: what to do if the values are not present? default + * parameter? this is funny because it's always supposed to return + * a list, so the default may break that, though it's provided by + * the user's code, so it might be okay. If no default is + * supplied, should the return be None or []? + * + * @param type_uri: The URI of the attribute + * + * @return $values The list of values for this attribute in the + * response. May be an empty list. If the attribute was not sent + * in the response, returns Auth_OpenID_AX_Error. + */ + function get($type_uri) + { + if (array_key_exists($type_uri, $this->data)) { + return $this->data[$type_uri]; + } else { + return new Auth_OpenID_AX_Error( + sprintf("Type URI %s not found in response", + $type_uri) + ); + } + } + + /** + * Get the number of responses for a particular attribute in this + * fetch_response message. + * + * @param type_uri: The URI of the attribute + * + * @returns int The number of values sent for this attribute. If + * the attribute was not sent in the response, returns + * Auth_OpenID_AX_Error. + */ + function count($type_uri) + { + if (array_key_exists($type_uri, $this->data)) { + return count($this->get($type_uri)); + } else { + return new Auth_OpenID_AX_Error( + sprintf("Type URI %s not found in response", + $type_uri) + ); + } + } +} + +/** + * A fetch_response attribute exchange message. + * + * @package OpenID + */ +class Auth_OpenID_AX_FetchResponse extends Auth_OpenID_AX_KeyValueMessage { + var $mode = 'fetch_response'; + + function Auth_OpenID_AX_FetchResponse($update_url=null) + { + $this->Auth_OpenID_AX_KeyValueMessage(); + $this->update_url = $update_url; + } + + /** + * Serialize this object into arguments in the attribute exchange + * namespace + * + * @return $args The dictionary of unqualified attribute exchange + * arguments that represent this fetch_response, or + * Auth_OpenID_AX_Error on error. + */ + function getExtensionArgs($request=null) + { + $aliases = new Auth_OpenID_NamespaceMap(); + + $zero_value_types = array(); + + if ($request !== null) { + // Validate the data in the context of the request (the + // same attributes should be present in each, and the + // counts in the response must be no more than the counts + // in the request) + + foreach ($this->data as $type_uri => $unused) { + if (!$request->contains($type_uri)) { + return new Auth_OpenID_AX_Error( + sprintf("Response attribute not present in request: %s", + $type_uri) + ); + } + } + + foreach ($request->iterAttrs() as $attr_info) { + // Copy the aliases from the request so that reading + // the response in light of the request is easier + if ($attr_info->alias === null) { + $aliases->add($attr_info->type_uri); + } else { + $alias = $aliases->addAlias($attr_info->type_uri, + $attr_info->alias); + + if ($alias === null) { + return new Auth_OpenID_AX_Error( + sprintf("Could not add alias %s for URI %s", + $attr_info->alias, $attr_info->type_uri) + ); + } + } + + if (array_key_exists($attr_info->type_uri, $this->data)) { + $values = $this->data[$attr_info->type_uri]; + } else { + $values = array(); + $zero_value_types[] = $attr_info; + } + + if (($attr_info->count != Auth_OpenID_AX_UNLIMITED_VALUES) && + ($attr_info->count < count($values))) { + return new Auth_OpenID_AX_Error( + sprintf("More than the number of requested values " . + "were specified for %s", + $attr_info->type_uri) + ); + } + } + } + + $kv_args = $this->_getExtensionKVArgs($aliases); + + // Add the KV args into the response with the args that are + // unique to the fetch_response + $ax_args = $this->_newArgs(); + + // For each requested attribute, put its type/alias and count + // into the response even if no data were returned. + foreach ($zero_value_types as $attr_info) { + $alias = $aliases->getAlias($attr_info->type_uri); + $kv_args['type.' . $alias] = $attr_info->type_uri; + $kv_args['count.' . $alias] = '0'; + } + + $update_url = null; + if ($request) { + $update_url = $request->update_url; + } else { + $update_url = $this->update_url; + } + + if ($update_url) { + $ax_args['update_url'] = $update_url; + } + + Auth_OpenID::update(&$ax_args, $kv_args); + + return $ax_args; + } + + /** + * @return $result Auth_OpenID_AX_Error on failure or true on + * success. + */ + function parseExtensionArgs($ax_args) + { + $result = parent::parseExtensionArgs($ax_args); + + if (Auth_OpenID_AX::isError($result)) { + return $result; + } + + $this->update_url = Auth_OpenID::arrayGet($ax_args, 'update_url'); + + return true; + } + + /** + * Construct a FetchResponse object from an OpenID library + * SuccessResponse object. + * + * @param success_response: A successful id_res response object + * + * @param signed: Whether non-signed args should be processsed. If + * True (the default), only signed arguments will be processsed. + * + * @return $response A FetchResponse containing the data from the + * OpenID message + */ + function fromSuccessResponse($success_response, $signed=true) + { + $obj = new Auth_OpenID_AX_FetchResponse(); + if ($signed) { + $ax_args = $success_response->getSignedNS($obj->ns_uri); + } else { + $ax_args = $success_response->message->getArgs($obj->ns_uri); + } + if ($ax_args === null || Auth_OpenID::isFailure($ax_args) || + sizeof($ax_args) == 0) { + return null; + } + + $result = $obj->parseExtensionArgs($ax_args); + if (Auth_OpenID_AX::isError($result)) { + #XXX log me + return null; + } + return $obj; + } +} + +/** + * A store request attribute exchange message representation. + * + * @package OpenID + */ +class Auth_OpenID_AX_StoreRequest extends Auth_OpenID_AX_KeyValueMessage { + var $mode = 'store_request'; + + /** + * @param array $aliases The namespace aliases to use when making + * this store response. Leave as None to use defaults. + */ + function getExtensionArgs($aliases=null) + { + $ax_args = $this->_newArgs(); + $kv_args = $this->_getExtensionKVArgs($aliases); + Auth_OpenID::update(&$ax_args, $kv_args); + return $ax_args; + } +} + +/** + * An indication that the store request was processed along with this + * OpenID transaction. Use make(), NOT the constructor, to create + * response objects. + * + * @package OpenID + */ +class Auth_OpenID_AX_StoreResponse extends Auth_OpenID_AX_Message { + var $SUCCESS_MODE = 'store_response_success'; + var $FAILURE_MODE = 'store_response_failure'; + + /** + * Returns Auth_OpenID_AX_Error on error or an + * Auth_OpenID_AX_StoreResponse object on success. + */ + function &make($succeeded=true, $error_message=null) + { + if (($succeeded) && ($error_message !== null)) { + return new Auth_OpenID_AX_Error('An error message may only be '. + 'included in a failing fetch response'); + } + + return new Auth_OpenID_AX_StoreResponse($succeeded, $error_message); + } + + function Auth_OpenID_AX_StoreResponse($succeeded=true, $error_message=null) + { + if ($succeeded) { + $this->mode = $this->SUCCESS_MODE; + } else { + $this->mode = $this->FAILURE_MODE; + } + + $this->error_message = $error_message; + } + + /** + * Was this response a success response? + */ + function succeeded() + { + return $this->mode == $this->SUCCESS_MODE; + } + + function getExtensionArgs() + { + $ax_args = $this->_newArgs(); + if ((!$this->succeeded()) && $this->error_message) { + $ax_args['error'] = $this->error_message; + } + + return $ax_args; + } +} + +?> \ No newline at end of file diff --git a/libs/Auth/OpenID/Association.php b/libs/Auth/OpenID/Association.php new file mode 100644 index 0000000..6549dfc --- /dev/null +++ b/libs/Auth/OpenID/Association.php @@ -0,0 +1,613 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * @access private + */ +require_once 'Auth/OpenID/CryptUtil.php'; + +/** + * @access private + */ +require_once 'Auth/OpenID/KVForm.php'; + +/** + * @access private + */ +require_once 'Auth/OpenID/HMAC.php'; + +/** + * This class represents an association between a server and a + * consumer. In general, users of this library will never see + * instances of this object. The only exception is if you implement a + * custom {@link Auth_OpenID_OpenIDStore}. + * + * If you do implement such a store, it will need to store the values + * of the handle, secret, issued, lifetime, and assoc_type instance + * variables. + * + * @package OpenID + */ +class Auth_OpenID_Association { + + /** + * This is a HMAC-SHA1 specific value. + * + * @access private + */ + var $SIG_LENGTH = 20; + + /** + * The ordering and name of keys as stored by serialize. + * + * @access private + */ + var $assoc_keys = array( + 'version', + 'handle', + 'secret', + 'issued', + 'lifetime', + 'assoc_type' + ); + + var $_macs = array( + 'HMAC-SHA1' => 'Auth_OpenID_HMACSHA1', + 'HMAC-SHA256' => 'Auth_OpenID_HMACSHA256' + ); + + /** + * This is an alternate constructor (factory method) used by the + * OpenID consumer library to create associations. OpenID store + * implementations shouldn't use this constructor. + * + * @access private + * + * @param integer $expires_in This is the amount of time this + * association is good for, measured in seconds since the + * association was issued. + * + * @param string $handle This is the handle the server gave this + * association. + * + * @param string secret This is the shared secret the server + * generated for this association. + * + * @param assoc_type This is the type of association this + * instance represents. The only valid values of this field at + * this time is 'HMAC-SHA1' and 'HMAC-SHA256', but new types may + * be defined in the future. + * + * @return association An {@link Auth_OpenID_Association} + * instance. + */ + function fromExpiresIn($expires_in, $handle, $secret, $assoc_type) + { + $issued = time(); + $lifetime = $expires_in; + return new Auth_OpenID_Association($handle, $secret, + $issued, $lifetime, $assoc_type); + } + + /** + * This is the standard constructor for creating an association. + * The library should create all of the necessary associations, so + * this constructor is not part of the external API. + * + * @access private + * + * @param string $handle This is the handle the server gave this + * association. + * + * @param string $secret This is the shared secret the server + * generated for this association. + * + * @param integer $issued This is the time this association was + * issued, in seconds since 00:00 GMT, January 1, 1970. (ie, a + * unix timestamp) + * + * @param integer $lifetime This is the amount of time this + * association is good for, measured in seconds since the + * association was issued. + * + * @param string $assoc_type This is the type of association this + * instance represents. The only valid values of this field at + * this time is 'HMAC-SHA1' and 'HMAC-SHA256', but new types may + * be defined in the future. + */ + function Auth_OpenID_Association( + $handle, $secret, $issued, $lifetime, $assoc_type) + { + if (!in_array($assoc_type, + Auth_OpenID_getSupportedAssociationTypes())) { + $fmt = 'Unsupported association type (%s)'; + trigger_error(sprintf($fmt, $assoc_type), E_USER_ERROR); + } + + $this->handle = $handle; + $this->secret = $secret; + $this->issued = $issued; + $this->lifetime = $lifetime; + $this->assoc_type = $assoc_type; + } + + /** + * This returns the number of seconds this association is still + * valid for, or 0 if the association is no longer valid. + * + * @return integer $seconds The number of seconds this association + * is still valid for, or 0 if the association is no longer valid. + */ + function getExpiresIn($now = null) + { + if ($now == null) { + $now = time(); + } + + return max(0, $this->issued + $this->lifetime - $now); + } + + /** + * This checks to see if two {@link Auth_OpenID_Association} + * instances represent the same association. + * + * @return bool $result true if the two instances represent the + * same association, false otherwise. + */ + function equal($other) + { + return ((gettype($this) == gettype($other)) + && ($this->handle == $other->handle) + && ($this->secret == $other->secret) + && ($this->issued == $other->issued) + && ($this->lifetime == $other->lifetime) + && ($this->assoc_type == $other->assoc_type)); + } + + /** + * Convert an association to KV form. + * + * @return string $result String in KV form suitable for + * deserialization by deserialize. + */ + function serialize() + { + $data = array( + 'version' => '2', + 'handle' => $this->handle, + 'secret' => base64_encode($this->secret), + 'issued' => strval(intval($this->issued)), + 'lifetime' => strval(intval($this->lifetime)), + 'assoc_type' => $this->assoc_type + ); + + assert(array_keys($data) == $this->assoc_keys); + + return Auth_OpenID_KVForm::fromArray($data, $strict = true); + } + + /** + * Parse an association as stored by serialize(). This is the + * inverse of serialize. + * + * @param string $assoc_s Association as serialized by serialize() + * @return Auth_OpenID_Association $result instance of this class + */ + function deserialize($class_name, $assoc_s) + { + $pairs = Auth_OpenID_KVForm::toArray($assoc_s, $strict = true); + $keys = array(); + $values = array(); + foreach ($pairs as $key => $value) { + if (is_array($value)) { + list($key, $value) = $value; + } + $keys[] = $key; + $values[] = $value; + } + + $class_vars = get_class_vars($class_name); + $class_assoc_keys = $class_vars['assoc_keys']; + + sort($keys); + sort($class_assoc_keys); + + if ($keys != $class_assoc_keys) { + trigger_error('Unexpected key values: ' . var_export($keys, true), + E_USER_WARNING); + return null; + } + + $version = $pairs['version']; + $handle = $pairs['handle']; + $secret = $pairs['secret']; + $issued = $pairs['issued']; + $lifetime = $pairs['lifetime']; + $assoc_type = $pairs['assoc_type']; + + if ($version != '2') { + trigger_error('Unknown version: ' . $version, E_USER_WARNING); + return null; + } + + $issued = intval($issued); + $lifetime = intval($lifetime); + $secret = base64_decode($secret); + + return new $class_name( + $handle, $secret, $issued, $lifetime, $assoc_type); + } + + /** + * Generate a signature for a sequence of (key, value) pairs + * + * @access private + * @param array $pairs The pairs to sign, in order. This is an + * array of two-tuples. + * @return string $signature The binary signature of this sequence + * of pairs + */ + function sign($pairs) + { + $kv = Auth_OpenID_KVForm::fromArray($pairs); + + /* Invalid association types should be caught at constructor */ + $callback = $this->_macs[$this->assoc_type]; + + return call_user_func_array($callback, array($this->secret, $kv)); + } + + /** + * Generate a signature for some fields in a dictionary + * + * @access private + * @param array $fields The fields to sign, in order; this is an + * array of strings. + * @param array $data Dictionary of values to sign (an array of + * string => string pairs). + * @return string $signature The signature, base64 encoded + */ + function signMessage($message) + { + if ($message->hasKey(Auth_OpenID_OPENID_NS, 'sig') || + $message->hasKey(Auth_OpenID_OPENID_NS, 'signed')) { + // Already has a sig + return null; + } + + $extant_handle = $message->getArg(Auth_OpenID_OPENID_NS, + 'assoc_handle'); + + if ($extant_handle && ($extant_handle != $this->handle)) { + // raise ValueError("Message has a different association handle") + return null; + } + + $signed_message = $message; + $signed_message->setArg(Auth_OpenID_OPENID_NS, 'assoc_handle', + $this->handle); + + $message_keys = array_keys($signed_message->toPostArgs()); + $signed_list = array(); + $signed_prefix = 'openid.'; + + foreach ($message_keys as $k) { + if (strpos($k, $signed_prefix) === 0) { + $signed_list[] = substr($k, strlen($signed_prefix)); + } + } + + $signed_list[] = 'signed'; + sort($signed_list); + + $signed_message->setArg(Auth_OpenID_OPENID_NS, 'signed', + implode(',', $signed_list)); + $sig = $this->getMessageSignature($signed_message); + $signed_message->setArg(Auth_OpenID_OPENID_NS, 'sig', $sig); + return $signed_message; + } + + /** + * Given a {@link Auth_OpenID_Message}, return the key/value pairs + * to be signed according to the signed list in the message. If + * the message lacks a signed list, return null. + * + * @access private + */ + function _makePairs(&$message) + { + $signed = $message->getArg(Auth_OpenID_OPENID_NS, 'signed'); + if (!$signed || Auth_OpenID::isFailure($signed)) { + // raise ValueError('Message has no signed list: %s' % (message,)) + return null; + } + + $signed_list = explode(',', $signed); + $pairs = array(); + $data = $message->toPostArgs(); + foreach ($signed_list as $field) { + $pairs[] = array($field, Auth_OpenID::arrayGet($data, + 'openid.' . + $field, '')); + } + return $pairs; + } + + /** + * Given an {@link Auth_OpenID_Message}, return the signature for + * the signed list in the message. + * + * @access private + */ + function getMessageSignature(&$message) + { + $pairs = $this->_makePairs($message); + return base64_encode($this->sign($pairs)); + } + + /** + * Confirm that the signature of these fields matches the + * signature contained in the data. + * + * @access private + */ + function checkMessageSignature(&$message) + { + $sig = $message->getArg(Auth_OpenID_OPENID_NS, + 'sig'); + + if (!$sig || Auth_OpenID::isFailure($sig)) { + return false; + } + + $calculated_sig = $this->getMessageSignature($message); + return $calculated_sig == $sig; + } +} + +function Auth_OpenID_getSecretSize($assoc_type) +{ + if ($assoc_type == 'HMAC-SHA1') { + return 20; + } else if ($assoc_type == 'HMAC-SHA256') { + return 32; + } else { + return null; + } +} + +function Auth_OpenID_getAllAssociationTypes() +{ + return array('HMAC-SHA1', 'HMAC-SHA256'); +} + +function Auth_OpenID_getSupportedAssociationTypes() +{ + $a = array('HMAC-SHA1'); + + if (Auth_OpenID_HMACSHA256_SUPPORTED) { + $a[] = 'HMAC-SHA256'; + } + + return $a; +} + +function Auth_OpenID_getSessionTypes($assoc_type) +{ + $assoc_to_session = array( + 'HMAC-SHA1' => array('DH-SHA1', 'no-encryption')); + + if (Auth_OpenID_HMACSHA256_SUPPORTED) { + $assoc_to_session['HMAC-SHA256'] = + array('DH-SHA256', 'no-encryption'); + } + + return Auth_OpenID::arrayGet($assoc_to_session, $assoc_type, array()); +} + +function Auth_OpenID_checkSessionType($assoc_type, $session_type) +{ + if (!in_array($session_type, + Auth_OpenID_getSessionTypes($assoc_type))) { + return false; + } + + return true; +} + +function Auth_OpenID_getDefaultAssociationOrder() +{ + $order = array(); + + if (!Auth_OpenID_noMathSupport()) { + $order[] = array('HMAC-SHA1', 'DH-SHA1'); + + if (Auth_OpenID_HMACSHA256_SUPPORTED) { + $order[] = array('HMAC-SHA256', 'DH-SHA256'); + } + } + + $order[] = array('HMAC-SHA1', 'no-encryption'); + + if (Auth_OpenID_HMACSHA256_SUPPORTED) { + $order[] = array('HMAC-SHA256', 'no-encryption'); + } + + return $order; +} + +function Auth_OpenID_getOnlyEncryptedOrder() +{ + $result = array(); + + foreach (Auth_OpenID_getDefaultAssociationOrder() as $pair) { + list($assoc, $session) = $pair; + + if ($session != 'no-encryption') { + if (Auth_OpenID_HMACSHA256_SUPPORTED && + ($assoc == 'HMAC-SHA256')) { + $result[] = $pair; + } else if ($assoc != 'HMAC-SHA256') { + $result[] = $pair; + } + } + } + + return $result; +} + +function &Auth_OpenID_getDefaultNegotiator() +{ + $x = new Auth_OpenID_SessionNegotiator( + Auth_OpenID_getDefaultAssociationOrder()); + return $x; +} + +function &Auth_OpenID_getEncryptedNegotiator() +{ + $x = new Auth_OpenID_SessionNegotiator( + Auth_OpenID_getOnlyEncryptedOrder()); + return $x; +} + +/** + * A session negotiator controls the allowed and preferred association + * types and association session types. Both the {@link + * Auth_OpenID_Consumer} and {@link Auth_OpenID_Server} use + * negotiators when creating associations. + * + * You can create and use negotiators if you: + + * - Do not want to do Diffie-Hellman key exchange because you use + * transport-layer encryption (e.g. SSL) + * + * - Want to use only SHA-256 associations + * + * - Do not want to support plain-text associations over a non-secure + * channel + * + * It is up to you to set a policy for what kinds of associations to + * accept. By default, the library will make any kind of association + * that is allowed in the OpenID 2.0 specification. + * + * Use of negotiators in the library + * ================================= + * + * When a consumer makes an association request, it calls {@link + * getAllowedType} to get the preferred association type and + * association session type. + * + * The server gets a request for a particular association/session type + * and calls {@link isAllowed} to determine if it should create an + * association. If it is supported, negotiation is complete. If it is + * not, the server calls {@link getAllowedType} to get an allowed + * association type to return to the consumer. + * + * If the consumer gets an error response indicating that the + * requested association/session type is not supported by the server + * that contains an assocation/session type to try, it calls {@link + * isAllowed} to determine if it should try again with the given + * combination of association/session type. + * + * @package OpenID + */ +class Auth_OpenID_SessionNegotiator { + function Auth_OpenID_SessionNegotiator($allowed_types) + { + $this->allowed_types = array(); + $this->setAllowedTypes($allowed_types); + } + + /** + * Set the allowed association types, checking to make sure each + * combination is valid. + * + * @access private + */ + function setAllowedTypes($allowed_types) + { + foreach ($allowed_types as $pair) { + list($assoc_type, $session_type) = $pair; + if (!Auth_OpenID_checkSessionType($assoc_type, $session_type)) { + return false; + } + } + + $this->allowed_types = $allowed_types; + return true; + } + + /** + * Add an association type and session type to the allowed types + * list. The assocation/session pairs are tried in the order that + * they are added. + * + * @access private + */ + function addAllowedType($assoc_type, $session_type = null) + { + if ($this->allowed_types === null) { + $this->allowed_types = array(); + } + + if ($session_type === null) { + $available = Auth_OpenID_getSessionTypes($assoc_type); + + if (!$available) { + return false; + } + + foreach ($available as $session_type) { + $this->addAllowedType($assoc_type, $session_type); + } + } else { + if (Auth_OpenID_checkSessionType($assoc_type, $session_type)) { + $this->allowed_types[] = array($assoc_type, $session_type); + } else { + return false; + } + } + + return true; + } + + // Is this combination of association type and session type allowed? + function isAllowed($assoc_type, $session_type) + { + $assoc_good = in_array(array($assoc_type, $session_type), + $this->allowed_types); + + $matches = in_array($session_type, + Auth_OpenID_getSessionTypes($assoc_type)); + + return ($assoc_good && $matches); + } + + /** + * Get a pair of assocation type and session type that are + * supported. + */ + function getAllowedType() + { + if (!$this->allowed_types) { + return array(null, null); + } + + return $this->allowed_types[0]; + } +} + +?> diff --git a/libs/Auth/OpenID/BigMath.php b/libs/Auth/OpenID/BigMath.php new file mode 100644 index 0000000..4510494 --- /dev/null +++ b/libs/Auth/OpenID/BigMath.php @@ -0,0 +1,471 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * Needed for random number generation + */ +require_once 'Auth/OpenID/CryptUtil.php'; + +/** + * Need Auth_OpenID::bytes(). + */ +require_once 'Auth/OpenID.php'; + +/** + * The superclass of all big-integer math implementations + * @access private + * @package OpenID + */ +class Auth_OpenID_MathLibrary { + /** + * Given a long integer, returns the number converted to a binary + * string. This function accepts long integer values of arbitrary + * magnitude and uses the local large-number math library when + * available. + * + * @param integer $long The long number (can be a normal PHP + * integer or a number created by one of the available long number + * libraries) + * @return string $binary The binary version of $long + */ + function longToBinary($long) + { + $cmp = $this->cmp($long, 0); + if ($cmp < 0) { + $msg = __FUNCTION__ . " takes only positive integers."; + trigger_error($msg, E_USER_ERROR); + return null; + } + + if ($cmp == 0) { + return "\x00"; + } + + $bytes = array(); + + while ($this->cmp($long, 0) > 0) { + array_unshift($bytes, $this->mod($long, 256)); + $long = $this->div($long, pow(2, 8)); + } + + if ($bytes && ($bytes[0] > 127)) { + array_unshift($bytes, 0); + } + + $string = ''; + foreach ($bytes as $byte) { + $string .= pack('C', $byte); + } + + return $string; + } + + /** + * Given a binary string, returns the binary string converted to a + * long number. + * + * @param string $binary The binary version of a long number, + * probably as a result of calling longToBinary + * @return integer $long The long number equivalent of the binary + * string $str + */ + function binaryToLong($str) + { + if ($str === null) { + return null; + } + + // Use array_merge to return a zero-indexed array instead of a + // one-indexed array. + $bytes = array_merge(unpack('C*', $str)); + + $n = $this->init(0); + + if ($bytes && ($bytes[0] > 127)) { + trigger_error("bytesToNum works only for positive integers.", + E_USER_WARNING); + return null; + } + + foreach ($bytes as $byte) { + $n = $this->mul($n, pow(2, 8)); + $n = $this->add($n, $byte); + } + + return $n; + } + + function base64ToLong($str) + { + $b64 = base64_decode($str); + + if ($b64 === false) { + return false; + } + + return $this->binaryToLong($b64); + } + + function longToBase64($str) + { + return base64_encode($this->longToBinary($str)); + } + + /** + * Returns a random number in the specified range. This function + * accepts $start, $stop, and $step values of arbitrary magnitude + * and will utilize the local large-number math library when + * available. + * + * @param integer $start The start of the range, or the minimum + * random number to return + * @param integer $stop The end of the range, or the maximum + * random number to return + * @param integer $step The step size, such that $result - ($step + * * N) = $start for some N + * @return integer $result The resulting randomly-generated number + */ + function rand($stop) + { + static $duplicate_cache = array(); + + // Used as the key for the duplicate cache + $rbytes = $this->longToBinary($stop); + + if (array_key_exists($rbytes, $duplicate_cache)) { + list($duplicate, $nbytes) = $duplicate_cache[$rbytes]; + } else { + if ($rbytes[0] == "\x00") { + $nbytes = Auth_OpenID::bytes($rbytes) - 1; + } else { + $nbytes = Auth_OpenID::bytes($rbytes); + } + + $mxrand = $this->pow(256, $nbytes); + + // If we get a number less than this, then it is in the + // duplicated range. + $duplicate = $this->mod($mxrand, $stop); + + if (count($duplicate_cache) > 10) { + $duplicate_cache = array(); + } + + $duplicate_cache[$rbytes] = array($duplicate, $nbytes); + } + + do { + $bytes = "\x00" . Auth_OpenID_CryptUtil::getBytes($nbytes); + $n = $this->binaryToLong($bytes); + // Keep looping if this value is in the low duplicated range + } while ($this->cmp($n, $duplicate) < 0); + + return $this->mod($n, $stop); + } +} + +/** + * Exposes BCmath math library functionality. + * + * {@link Auth_OpenID_BcMathWrapper} wraps the functionality provided + * by the BCMath extension. + * + * @access private + * @package OpenID + */ +class Auth_OpenID_BcMathWrapper extends Auth_OpenID_MathLibrary{ + var $type = 'bcmath'; + + function add($x, $y) + { + return bcadd($x, $y); + } + + function sub($x, $y) + { + return bcsub($x, $y); + } + + function pow($base, $exponent) + { + return bcpow($base, $exponent); + } + + function cmp($x, $y) + { + return bccomp($x, $y); + } + + function init($number, $base = 10) + { + return $number; + } + + function mod($base, $modulus) + { + return bcmod($base, $modulus); + } + + function mul($x, $y) + { + return bcmul($x, $y); + } + + function div($x, $y) + { + return bcdiv($x, $y); + } + + /** + * Same as bcpowmod when bcpowmod is missing + * + * @access private + */ + function _powmod($base, $exponent, $modulus) + { + $square = $this->mod($base, $modulus); + $result = 1; + while($this->cmp($exponent, 0) > 0) { + if ($this->mod($exponent, 2)) { + $result = $this->mod($this->mul($result, $square), $modulus); + } + $square = $this->mod($this->mul($square, $square), $modulus); + $exponent = $this->div($exponent, 2); + } + return $result; + } + + function powmod($base, $exponent, $modulus) + { + if (function_exists('bcpowmod')) { + return bcpowmod($base, $exponent, $modulus); + } else { + return $this->_powmod($base, $exponent, $modulus); + } + } + + function toString($num) + { + return $num; + } +} + +/** + * Exposes GMP math library functionality. + * + * {@link Auth_OpenID_GmpMathWrapper} wraps the functionality provided + * by the GMP extension. + * + * @access private + * @package OpenID + */ +class Auth_OpenID_GmpMathWrapper extends Auth_OpenID_MathLibrary{ + var $type = 'gmp'; + + function add($x, $y) + { + return gmp_add($x, $y); + } + + function sub($x, $y) + { + return gmp_sub($x, $y); + } + + function pow($base, $exponent) + { + return gmp_pow($base, $exponent); + } + + function cmp($x, $y) + { + return gmp_cmp($x, $y); + } + + function init($number, $base = 10) + { + return gmp_init($number, $base); + } + + function mod($base, $modulus) + { + return gmp_mod($base, $modulus); + } + + function mul($x, $y) + { + return gmp_mul($x, $y); + } + + function div($x, $y) + { + return gmp_div_q($x, $y); + } + + function powmod($base, $exponent, $modulus) + { + return gmp_powm($base, $exponent, $modulus); + } + + function toString($num) + { + return gmp_strval($num); + } +} + +/** + * Define the supported extensions. An extension array has keys + * 'modules', 'extension', and 'class'. 'modules' is an array of PHP + * module names which the loading code will attempt to load. These + * values will be suffixed with a library file extension (e.g. ".so"). + * 'extension' is the name of a PHP extension which will be tested + * before 'modules' are loaded. 'class' is the string name of a + * {@link Auth_OpenID_MathWrapper} subclass which should be + * instantiated if a given extension is present. + * + * You can define new math library implementations and add them to + * this array. + */ +function Auth_OpenID_math_extensions() +{ + $result = array(); + + if (!defined('Auth_OpenID_BUGGY_GMP')) { + $result[] = + array('modules' => array('gmp', 'php_gmp'), + 'extension' => 'gmp', + 'class' => 'Auth_OpenID_GmpMathWrapper'); + } + + $result[] = array( + 'modules' => array('bcmath', 'php_bcmath'), + 'extension' => 'bcmath', + 'class' => 'Auth_OpenID_BcMathWrapper'); + + return $result; +} + +/** + * Detect which (if any) math library is available + */ +function Auth_OpenID_detectMathLibrary($exts) +{ + $loaded = false; + + foreach ($exts as $extension) { + // See if the extension specified is already loaded. + if ($extension['extension'] && + extension_loaded($extension['extension'])) { + $loaded = true; + } + + // Try to load dynamic modules. + if (!$loaded) { + foreach ($extension['modules'] as $module) { + if (@dl($module . "." . PHP_SHLIB_SUFFIX)) { + $loaded = true; + break; + } + } + } + + // If the load succeeded, supply an instance of + // Auth_OpenID_MathWrapper which wraps the specified + // module's functionality. + if ($loaded) { + return $extension; + } + } + + return false; +} + +/** + * {@link Auth_OpenID_getMathLib} checks for the presence of long + * number extension modules and returns an instance of + * {@link Auth_OpenID_MathWrapper} which exposes the module's + * functionality. + * + * Checks for the existence of an extension module described by the + * result of {@link Auth_OpenID_math_extensions()} and returns an + * instance of a wrapper for that extension module. If no extension + * module is found, an instance of {@link Auth_OpenID_MathWrapper} is + * returned, which wraps the native PHP integer implementation. The + * proper calling convention for this method is $lib =& + * Auth_OpenID_getMathLib(). + * + * This function checks for the existence of specific long number + * implementations in the following order: GMP followed by BCmath. + * + * @return Auth_OpenID_MathWrapper $instance An instance of + * {@link Auth_OpenID_MathWrapper} or one of its subclasses + * + * @package OpenID + */ +function &Auth_OpenID_getMathLib() +{ + // The instance of Auth_OpenID_MathWrapper that we choose to + // supply will be stored here, so that subseqent calls to this + // method will return a reference to the same object. + static $lib = null; + + if (isset($lib)) { + return $lib; + } + + if (Auth_OpenID_noMathSupport()) { + $null = null; + return $null; + } + + // If this method has not been called before, look at + // Auth_OpenID_math_extensions and try to find an extension that + // works. + $ext = Auth_OpenID_detectMathLibrary(Auth_OpenID_math_extensions()); + if ($ext === false) { + $tried = array(); + foreach (Auth_OpenID_math_extensions() as $extinfo) { + $tried[] = $extinfo['extension']; + } + $triedstr = implode(", ", $tried); + + Auth_OpenID_setNoMathSupport(); + + $result = null; + return $result; + } + + // Instantiate a new wrapper + $class = $ext['class']; + $lib = new $class(); + + return $lib; +} + +function Auth_OpenID_setNoMathSupport() +{ + if (!defined('Auth_OpenID_NO_MATH_SUPPORT')) { + define('Auth_OpenID_NO_MATH_SUPPORT', true); + } +} + +function Auth_OpenID_noMathSupport() +{ + return defined('Auth_OpenID_NO_MATH_SUPPORT'); +} + +?> diff --git a/libs/Auth/OpenID/Consumer.php b/libs/Auth/OpenID/Consumer.php new file mode 100644 index 0000000..500890b --- /dev/null +++ b/libs/Auth/OpenID/Consumer.php @@ -0,0 +1,2230 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * Require utility classes and functions for the consumer. + */ +require_once "Auth/OpenID.php"; +require_once "Auth/OpenID/Message.php"; +require_once "Auth/OpenID/HMAC.php"; +require_once "Auth/OpenID/Association.php"; +require_once "Auth/OpenID/CryptUtil.php"; +require_once "Auth/OpenID/DiffieHellman.php"; +require_once "Auth/OpenID/KVForm.php"; +require_once "Auth/OpenID/Nonce.php"; +require_once "Auth/OpenID/Discover.php"; +require_once "Auth/OpenID/URINorm.php"; +require_once "Auth/Yadis/Manager.php"; +require_once "Auth/Yadis/XRI.php"; + +/** + * This is the status code returned when the complete method returns + * successfully. + */ +define('Auth_OpenID_SUCCESS', 'success'); + +/** + * Status to indicate cancellation of OpenID authentication. + */ +define('Auth_OpenID_CANCEL', 'cancel'); + +/** + * This is the status code completeAuth returns when the value it + * received indicated an invalid login. + */ +define('Auth_OpenID_FAILURE', 'failure'); + +/** + * This is the status code completeAuth returns when the + * {@link Auth_OpenID_Consumer} instance is in immediate mode, and the + * identity server sends back a URL to send the user to to complete his + * or her login. + */ +define('Auth_OpenID_SETUP_NEEDED', 'setup needed'); + +/** + * This is the status code beginAuth returns when the page fetched + * from the entered OpenID URL doesn't contain the necessary link tags + * to function as an identity page. + */ +define('Auth_OpenID_PARSE_ERROR', 'parse error'); + +/** + * An OpenID consumer implementation that performs discovery and does + * session management. See the Consumer.php file documentation for + * more information. + * + * @package OpenID + */ +class Auth_OpenID_Consumer { + + /** + * @access private + */ + var $discoverMethod = 'Auth_OpenID_discover'; + + /** + * @access private + */ + var $session_key_prefix = "_openid_consumer_"; + + /** + * @access private + */ + var $_token_suffix = "last_token"; + + /** + * Initialize a Consumer instance. + * + * You should create a new instance of the Consumer object with + * every HTTP request that handles OpenID transactions. + * + * @param Auth_OpenID_OpenIDStore $store This must be an object + * that implements the interface in {@link + * Auth_OpenID_OpenIDStore}. Several concrete implementations are + * provided, to cover most common use cases. For stores backed by + * MySQL, PostgreSQL, or SQLite, see the {@link + * Auth_OpenID_SQLStore} class and its sublcasses. For a + * filesystem-backed store, see the {@link Auth_OpenID_FileStore} + * module. As a last resort, if it isn't possible for the server + * to store state at all, an instance of {@link + * Auth_OpenID_DumbStore} can be used. + * + * @param mixed $session An object which implements the interface + * of the {@link Auth_Yadis_PHPSession} class. Particularly, this + * object is expected to have these methods: get($key), set($key), + * $value), and del($key). This defaults to a session object + * which wraps PHP's native session machinery. You should only + * need to pass something here if you have your own sessioning + * implementation. + * + * @param str $consumer_cls The name of the class to instantiate + * when creating the internal consumer object. This is used for + * testing. + */ + function Auth_OpenID_Consumer(&$store, $session = null, + $consumer_cls = null) + { + if ($session === null) { + $session = new Auth_Yadis_PHPSession(); + } + + $this->session =& $session; + + if ($consumer_cls !== null) { + $this->consumer =& new $consumer_cls($store); + } else { + $this->consumer =& new Auth_OpenID_GenericConsumer($store); + } + + $this->_token_key = $this->session_key_prefix . $this->_token_suffix; + } + + /** + * Used in testing to define the discovery mechanism. + * + * @access private + */ + function getDiscoveryObject(&$session, $openid_url, + $session_key_prefix) + { + return new Auth_Yadis_Discovery($session, $openid_url, + $session_key_prefix); + } + + /** + * Start the OpenID authentication process. See steps 1-2 in the + * overview at the top of this file. + * + * @param string $user_url Identity URL given by the user. This + * method performs a textual transformation of the URL to try and + * make sure it is normalized. For example, a user_url of + * example.com will be normalized to http://example.com/ + * normalizing and resolving any redirects the server might issue. + * + * @param bool $anonymous True if the OpenID request is to be sent + * to the server without any identifier information. Use this + * when you want to transport data but don't want to do OpenID + * authentication with identifiers. + * + * @return Auth_OpenID_AuthRequest $auth_request An object + * containing the discovered information will be returned, with a + * method for building a redirect URL to the server, as described + * in step 3 of the overview. This object may also be used to add + * extension arguments to the request, using its 'addExtensionArg' + * method. + */ + function begin($user_url, $anonymous=false) + { + $openid_url = $user_url; + + $disco = $this->getDiscoveryObject($this->session, + $openid_url, + $this->session_key_prefix); + + // Set the 'stale' attribute of the manager. If discovery + // fails in a fatal way, the stale flag will cause the manager + // to be cleaned up next time discovery is attempted. + + $m = $disco->getManager(); + $loader = new Auth_Yadis_ManagerLoader(); + + if ($m) { + if ($m->stale) { + $disco->destroyManager(); + } else { + $m->stale = true; + $disco->session->set($disco->session_key, + serialize($loader->toSession($m))); + } + } + + $endpoint = $disco->getNextService($this->discoverMethod, + $this->consumer->fetcher); + + // Reset the 'stale' attribute of the manager. + $m =& $disco->getManager(); + if ($m) { + $m->stale = false; + $disco->session->set($disco->session_key, + serialize($loader->toSession($m))); + } + + if ($endpoint === null) { + return null; + } else { + return $this->beginWithoutDiscovery($endpoint, + $anonymous); + } + } + + /** + * Start OpenID verification without doing OpenID server + * discovery. This method is used internally by Consumer.begin + * after discovery is performed, and exists to provide an + * interface for library users needing to perform their own + * discovery. + * + * @param Auth_OpenID_ServiceEndpoint $endpoint an OpenID service + * endpoint descriptor. + * + * @param bool anonymous Set to true if you want to perform OpenID + * without identifiers. + * + * @return Auth_OpenID_AuthRequest $auth_request An OpenID + * authentication request object. + */ + function &beginWithoutDiscovery($endpoint, $anonymous=false) + { + $loader = new Auth_OpenID_ServiceEndpointLoader(); + $auth_req = $this->consumer->begin($endpoint); + $this->session->set($this->_token_key, + $loader->toSession($auth_req->endpoint)); + if (!$auth_req->setAnonymous($anonymous)) { + return new Auth_OpenID_FailureResponse(null, + "OpenID 1 requests MUST include the identifier " . + "in the request."); + } + return $auth_req; + } + + /** + * Called to interpret the server's response to an OpenID + * request. It is called in step 4 of the flow described in the + * consumer overview. + * + * @param string $current_url The URL used to invoke the application. + * Extract the URL from your application's web + * request framework and specify it here to have it checked + * against the openid.current_url value in the response. If + * the current_url URL check fails, the status of the + * completion will be FAILURE. + * + * @param array $query An array of the query parameters (key => + * value pairs) for this HTTP request. Defaults to null. If + * null, the GET or POST data are automatically gotten from the + * PHP environment. It is only useful to override $query for + * testing. + * + * @return Auth_OpenID_ConsumerResponse $response A instance of an + * Auth_OpenID_ConsumerResponse subclass. The type of response is + * indicated by the status attribute, which will be one of + * SUCCESS, CANCEL, FAILURE, or SETUP_NEEDED. + */ + function complete($current_url, $query=null) + { + if ($current_url && !is_string($current_url)) { + // This is ugly, but we need to complain loudly when + // someone uses the API incorrectly. + trigger_error("current_url must be a string; see NEWS file " . + "for upgrading notes.", + E_USER_ERROR); + } + + if ($query === null) { + $query = Auth_OpenID::getQuery(); + } + + $loader = new Auth_OpenID_ServiceEndpointLoader(); + $endpoint_data = $this->session->get($this->_token_key); + $endpoint = + $loader->fromSession($endpoint_data); + + $message = Auth_OpenID_Message::fromPostArgs($query); + $response = $this->consumer->complete($message, $endpoint, + $current_url); + $this->session->del($this->_token_key); + + if (in_array($response->status, array(Auth_OpenID_SUCCESS, + Auth_OpenID_CANCEL))) { + if ($response->identity_url !== null) { + $disco = $this->getDiscoveryObject($this->session, + $response->identity_url, + $this->session_key_prefix); + $disco->cleanup(true); + } + } + + return $response; + } +} + +/** + * A class implementing HMAC/DH-SHA1 consumer sessions. + * + * @package OpenID + */ +class Auth_OpenID_DiffieHellmanSHA1ConsumerSession { + var $session_type = 'DH-SHA1'; + var $hash_func = 'Auth_OpenID_SHA1'; + var $secret_size = 20; + var $allowed_assoc_types = array('HMAC-SHA1'); + + function Auth_OpenID_DiffieHellmanSHA1ConsumerSession($dh = null) + { + if ($dh === null) { + $dh = new Auth_OpenID_DiffieHellman(); + } + + $this->dh = $dh; + } + + function getRequest() + { + $math =& Auth_OpenID_getMathLib(); + + $cpub = $math->longToBase64($this->dh->public); + + $args = array('dh_consumer_public' => $cpub); + + if (!$this->dh->usingDefaultValues()) { + $args = array_merge($args, array( + 'dh_modulus' => + $math->longToBase64($this->dh->mod), + 'dh_gen' => + $math->longToBase64($this->dh->gen))); + } + + return $args; + } + + function extractSecret($response) + { + if (!$response->hasKey(Auth_OpenID_OPENID_NS, + 'dh_server_public')) { + return null; + } + + if (!$response->hasKey(Auth_OpenID_OPENID_NS, + 'enc_mac_key')) { + return null; + } + + $math =& Auth_OpenID_getMathLib(); + + $spub = $math->base64ToLong($response->getArg(Auth_OpenID_OPENID_NS, + 'dh_server_public')); + $enc_mac_key = base64_decode($response->getArg(Auth_OpenID_OPENID_NS, + 'enc_mac_key')); + + return $this->dh->xorSecret($spub, $enc_mac_key, $this->hash_func); + } +} + +/** + * A class implementing HMAC/DH-SHA256 consumer sessions. + * + * @package OpenID + */ +class Auth_OpenID_DiffieHellmanSHA256ConsumerSession extends + Auth_OpenID_DiffieHellmanSHA1ConsumerSession { + var $session_type = 'DH-SHA256'; + var $hash_func = 'Auth_OpenID_SHA256'; + var $secret_size = 32; + var $allowed_assoc_types = array('HMAC-SHA256'); +} + +/** + * A class implementing plaintext consumer sessions. + * + * @package OpenID + */ +class Auth_OpenID_PlainTextConsumerSession { + var $session_type = 'no-encryption'; + var $allowed_assoc_types = array('HMAC-SHA1', 'HMAC-SHA256'); + + function getRequest() + { + return array(); + } + + function extractSecret($response) + { + if (!$response->hasKey(Auth_OpenID_OPENID_NS, 'mac_key')) { + return null; + } + + return base64_decode($response->getArg(Auth_OpenID_OPENID_NS, + 'mac_key')); + } +} + +/** + * Returns available session types. + */ +function Auth_OpenID_getAvailableSessionTypes() +{ + $types = array( + 'no-encryption' => 'Auth_OpenID_PlainTextConsumerSession', + 'DH-SHA1' => 'Auth_OpenID_DiffieHellmanSHA1ConsumerSession', + 'DH-SHA256' => 'Auth_OpenID_DiffieHellmanSHA256ConsumerSession'); + + return $types; +} + +/** + * This class is the interface to the OpenID consumer logic. + * Instances of it maintain no per-request state, so they can be + * reused (or even used by multiple threads concurrently) as needed. + * + * @package OpenID + */ +class Auth_OpenID_GenericConsumer { + /** + * @access private + */ + var $discoverMethod = 'Auth_OpenID_discover'; + + /** + * This consumer's store object. + */ + var $store; + + /** + * @access private + */ + var $_use_assocs; + + /** + * @access private + */ + var $openid1_nonce_query_arg_name = 'janrain_nonce'; + + /** + * Another query parameter that gets added to the return_to for + * OpenID 1; if the user's session state is lost, use this claimed + * identifier to do discovery when verifying the response. + */ + var $openid1_return_to_identifier_name = 'openid1_claimed_id'; + + /** + * This method initializes a new {@link Auth_OpenID_Consumer} + * instance to access the library. + * + * @param Auth_OpenID_OpenIDStore $store This must be an object + * that implements the interface in {@link Auth_OpenID_OpenIDStore}. + * Several concrete implementations are provided, to cover most common use + * cases. For stores backed by MySQL, PostgreSQL, or SQLite, see + * the {@link Auth_OpenID_SQLStore} class and its sublcasses. For a + * filesystem-backed store, see the {@link Auth_OpenID_FileStore} module. + * As a last resort, if it isn't possible for the server to store + * state at all, an instance of {@link Auth_OpenID_DumbStore} can be used. + * + * @param bool $immediate This is an optional boolean value. It + * controls whether the library uses immediate mode, as explained + * in the module description. The default value is False, which + * disables immediate mode. + */ + function Auth_OpenID_GenericConsumer(&$store) + { + $this->store =& $store; + $this->negotiator =& Auth_OpenID_getDefaultNegotiator(); + $this->_use_assocs = ($this->store ? true : false); + + $this->fetcher = Auth_Yadis_Yadis::getHTTPFetcher(); + + $this->session_types = Auth_OpenID_getAvailableSessionTypes(); + } + + /** + * Called to begin OpenID authentication using the specified + * {@link Auth_OpenID_ServiceEndpoint}. + * + * @access private + */ + function begin($service_endpoint) + { + $assoc = $this->_getAssociation($service_endpoint); + $r = new Auth_OpenID_AuthRequest($service_endpoint, $assoc); + $r->return_to_args[$this->openid1_nonce_query_arg_name] = + Auth_OpenID_mkNonce(); + + if ($r->message->isOpenID1()) { + $r->return_to_args[$this->openid1_return_to_identifier_name] = + $r->endpoint->claimed_id; + } + + return $r; + } + + /** + * Given an {@link Auth_OpenID_Message}, {@link + * Auth_OpenID_ServiceEndpoint} and optional return_to URL, + * complete OpenID authentication. + * + * @access private + */ + function complete($message, $endpoint, $return_to) + { + $mode = $message->getArg(Auth_OpenID_OPENID_NS, 'mode', + ''); + + $mode_methods = array( + 'cancel' => '_complete_cancel', + 'error' => '_complete_error', + 'setup_needed' => '_complete_setup_needed', + 'id_res' => '_complete_id_res', + ); + + $method = Auth_OpenID::arrayGet($mode_methods, $mode, + '_completeInvalid'); + + return call_user_func_array(array(&$this, $method), + array($message, $endpoint, $return_to)); + } + + /** + * @access private + */ + function _completeInvalid($message, &$endpoint, $unused) + { + $mode = $message->getArg(Auth_OpenID_OPENID_NS, 'mode', + ''); + + return new Auth_OpenID_FailureResponse($endpoint, + sprintf("Invalid openid.mode '%s'", $mode)); + } + + /** + * @access private + */ + function _complete_cancel($message, &$endpoint, $unused) + { + return new Auth_OpenID_CancelResponse($endpoint); + } + + /** + * @access private + */ + function _complete_error($message, &$endpoint, $unused) + { + $error = $message->getArg(Auth_OpenID_OPENID_NS, 'error'); + $contact = $message->getArg(Auth_OpenID_OPENID_NS, 'contact'); + $reference = $message->getArg(Auth_OpenID_OPENID_NS, 'reference'); + + return new Auth_OpenID_FailureResponse($endpoint, $error, + $contact, $reference); + } + + /** + * @access private + */ + function _complete_setup_needed($message, &$endpoint, $unused) + { + if (!$message->isOpenID2()) { + return $this->_completeInvalid($message, $endpoint); + } + + $user_setup_url = $message->getArg(Auth_OpenID_OPENID2_NS, + 'user_setup_url'); + return new Auth_OpenID_SetupNeededResponse($endpoint, $user_setup_url); + } + + /** + * @access private + */ + function _complete_id_res($message, &$endpoint, $return_to) + { + $user_setup_url = $message->getArg(Auth_OpenID_OPENID1_NS, + 'user_setup_url'); + + if ($this->_checkSetupNeeded($message)) { + return new Auth_OpenID_SetupNeededResponse( + $endpoint, $user_setup_url); + } else { + return $this->_doIdRes($message, $endpoint, $return_to); + } + } + + /** + * @access private + */ + function _checkSetupNeeded($message) + { + // In OpenID 1, we check to see if this is a cancel from + // immediate mode by the presence of the user_setup_url + // parameter. + if ($message->isOpenID1()) { + $user_setup_url = $message->getArg(Auth_OpenID_OPENID1_NS, + 'user_setup_url'); + if ($user_setup_url !== null) { + return true; + } + } + + return false; + } + + /** + * @access private + */ + function _doIdRes($message, $endpoint, $return_to) + { + // Checks for presence of appropriate fields (and checks + // signed list fields) + $result = $this->_idResCheckForFields($message); + + if (Auth_OpenID::isFailure($result)) { + return $result; + } + + if (!$this->_checkReturnTo($message, $return_to)) { + return new Auth_OpenID_FailureResponse(null, + sprintf("return_to does not match return URL. Expected %s, got %s", + $return_to, + $message->getArg(Auth_OpenID_OPENID_NS, 'return_to'))); + } + + // Verify discovery information: + $result = $this->_verifyDiscoveryResults($message, $endpoint); + + if (Auth_OpenID::isFailure($result)) { + return $result; + } + + $endpoint = $result; + + $result = $this->_idResCheckSignature($message, + $endpoint->server_url); + + if (Auth_OpenID::isFailure($result)) { + return $result; + } + + $result = $this->_idResCheckNonce($message, $endpoint); + + if (Auth_OpenID::isFailure($result)) { + return $result; + } + + $signed_list_str = $message->getArg(Auth_OpenID_OPENID_NS, 'signed', + Auth_OpenID_NO_DEFAULT); + if (Auth_OpenID::isFailure($signed_list_str)) { + return $signed_list_str; + } + $signed_list = explode(',', $signed_list_str); + + $signed_fields = Auth_OpenID::addPrefix($signed_list, "openid."); + + return new Auth_OpenID_SuccessResponse($endpoint, $message, + $signed_fields); + + } + + /** + * @access private + */ + function _checkReturnTo($message, $return_to) + { + // Check an OpenID message and its openid.return_to value + // against a return_to URL from an application. Return True + // on success, False on failure. + + // Check the openid.return_to args against args in the + // original message. + $result = Auth_OpenID_GenericConsumer::_verifyReturnToArgs( + $message->toPostArgs()); + if (Auth_OpenID::isFailure($result)) { + return false; + } + + // Check the return_to base URL against the one in the + // message. + $msg_return_to = $message->getArg(Auth_OpenID_OPENID_NS, + 'return_to'); + if (Auth_OpenID::isFailure($return_to)) { + // XXX log me + return false; + } + + $return_to_parts = parse_url(Auth_OpenID_urinorm($return_to)); + $msg_return_to_parts = parse_url(Auth_OpenID_urinorm($msg_return_to)); + + // If port is absent from both, add it so it's equal in the + // check below. + if ((!array_key_exists('port', $return_to_parts)) && + (!array_key_exists('port', $msg_return_to_parts))) { + $return_to_parts['port'] = null; + $msg_return_to_parts['port'] = null; + } + + // If path is absent from both, add it so it's equal in the + // check below. + if ((!array_key_exists('path', $return_to_parts)) && + (!array_key_exists('path', $msg_return_to_parts))) { + $return_to_parts['path'] = null; + $msg_return_to_parts['path'] = null; + } + + // The URL scheme, authority, and path MUST be the same + // between the two URLs. + foreach (array('scheme', 'host', 'port', 'path') as $component) { + // If the url component is absent in either URL, fail. + // There should always be a scheme, host, port, and path. + if (!array_key_exists($component, $return_to_parts)) { + return false; + } + + if (!array_key_exists($component, $msg_return_to_parts)) { + return false; + } + + if (Auth_OpenID::arrayGet($return_to_parts, $component) !== + Auth_OpenID::arrayGet($msg_return_to_parts, $component)) { + return false; + } + } + + return true; + } + + /** + * @access private + */ + function _verifyReturnToArgs($query) + { + // Verify that the arguments in the return_to URL are present in this + // response. + + $message = Auth_OpenID_Message::fromPostArgs($query); + $return_to = $message->getArg(Auth_OpenID_OPENID_NS, 'return_to'); + + if (Auth_OpenID::isFailure($return_to)) { + return $return_to; + } + // XXX: this should be checked by _idResCheckForFields + if (!$return_to) { + return new Auth_OpenID_FailureResponse(null, + "Response has no return_to"); + } + + $parsed_url = parse_url($return_to); + + $q = array(); + if (array_key_exists('query', $parsed_url)) { + $rt_query = $parsed_url['query']; + $q = Auth_OpenID::parse_str($rt_query); + } + + foreach ($q as $rt_key => $rt_value) { + if (!array_key_exists($rt_key, $query)) { + return new Auth_OpenID_FailureResponse(null, + sprintf("return_to parameter %s absent from query", $rt_key)); + } else { + $value = $query[$rt_key]; + if ($rt_value != $value) { + return new Auth_OpenID_FailureResponse(null, + sprintf("parameter %s value %s does not match " . + "return_to value %s", $rt_key, + $value, $rt_value)); + } + } + } + + // Make sure all non-OpenID arguments in the response are also + // in the signed return_to. + $bare_args = $message->getArgs(Auth_OpenID_BARE_NS); + foreach ($bare_args as $key => $value) { + if (Auth_OpenID::arrayGet($q, $key) != $value) { + return new Auth_OpenID_FailureResponse(null, + sprintf("Parameter %s = %s not in return_to URL", + $key, $value)); + } + } + + return true; + } + + /** + * @access private + */ + function _idResCheckSignature($message, $server_url) + { + $assoc_handle = $message->getArg(Auth_OpenID_OPENID_NS, + 'assoc_handle'); + if (Auth_OpenID::isFailure($assoc_handle)) { + return $assoc_handle; + } + + $assoc = $this->store->getAssociation($server_url, $assoc_handle); + + if ($assoc) { + if ($assoc->getExpiresIn() <= 0) { + // XXX: It might be a good idea sometimes to re-start + // the authentication with a new association. Doing it + // automatically opens the possibility for + // denial-of-service by a server that just returns + // expired associations (or really short-lived + // associations) + return new Auth_OpenID_FailureResponse(null, + 'Association with ' . $server_url . ' expired'); + } + + if (!$assoc->checkMessageSignature($message)) { + return new Auth_OpenID_FailureResponse(null, + "Bad signature"); + } + } else { + // It's not an association we know about. Stateless mode + // is our only possible path for recovery. XXX - async + // framework will not want to block on this call to + // _checkAuth. + if (!$this->_checkAuth($message, $server_url)) { + return new Auth_OpenID_FailureResponse(null, + "Server denied check_authentication"); + } + } + + return null; + } + + /** + * @access private + */ + function _verifyDiscoveryResults($message, $endpoint=null) + { + if ($message->getOpenIDNamespace() == Auth_OpenID_OPENID2_NS) { + return $this->_verifyDiscoveryResultsOpenID2($message, + $endpoint); + } else { + return $this->_verifyDiscoveryResultsOpenID1($message, + $endpoint); + } + } + + /** + * @access private + */ + function _verifyDiscoveryResultsOpenID1($message, $endpoint) + { + $claimed_id = $message->getArg(Auth_OpenID_BARE_NS, + $this->openid1_return_to_identifier_name); + + if (($endpoint === null) && ($claimed_id === null)) { + return new Auth_OpenID_FailureResponse($endpoint, + 'When using OpenID 1, the claimed ID must be supplied, ' . + 'either by passing it through as a return_to parameter ' . + 'or by using a session, and supplied to the GenericConsumer ' . + 'as the argument to complete()'); + } else if (($endpoint !== null) && ($claimed_id === null)) { + $claimed_id = $endpoint->claimed_id; + } + + $to_match = new Auth_OpenID_ServiceEndpoint(); + $to_match->type_uris = array(Auth_OpenID_TYPE_1_1); + $to_match->local_id = $message->getArg(Auth_OpenID_OPENID1_NS, + 'identity'); + + // Restore delegate information from the initiation phase + $to_match->claimed_id = $claimed_id; + + if ($to_match->local_id === null) { + return new Auth_OpenID_FailureResponse($endpoint, + "Missing required field openid.identity"); + } + + $to_match_1_0 = $to_match->copy(); + $to_match_1_0->type_uris = array(Auth_OpenID_TYPE_1_0); + + if ($endpoint !== null) { + $result = $this->_verifyDiscoverySingle($endpoint, $to_match); + + if (is_a($result, 'Auth_OpenID_TypeURIMismatch')) { + $result = $this->_verifyDiscoverySingle($endpoint, + $to_match_1_0); + } + + if (Auth_OpenID::isFailure($result)) { + // oidutil.log("Error attempting to use stored + // discovery information: " + str(e)) + // oidutil.log("Attempting discovery to + // verify endpoint") + } else { + return $endpoint; + } + } + + // Endpoint is either bad (failed verification) or None + return $this->_discoverAndVerify($to_match->claimed_id, + array($to_match, $to_match_1_0)); + } + + /** + * @access private + */ + function _verifyDiscoverySingle($endpoint, $to_match) + { + // Every type URI that's in the to_match endpoint has to be + // present in the discovered endpoint. + foreach ($to_match->type_uris as $type_uri) { + if (!$endpoint->usesExtension($type_uri)) { + return new Auth_OpenID_TypeURIMismatch($endpoint, + "Required type ".$type_uri." not present"); + } + } + + // Fragments do not influence discovery, so we can't compare a + // claimed identifier with a fragment to discovered + // information. + list($defragged_claimed_id, $_) = + Auth_OpenID::urldefrag($to_match->claimed_id); + + if ($defragged_claimed_id != $endpoint->claimed_id) { + return new Auth_OpenID_FailureResponse($endpoint, + sprintf('Claimed ID does not match (different subjects!), ' . + 'Expected %s, got %s', $defragged_claimed_id, + $endpoint->claimed_id)); + } + + if ($to_match->getLocalID() != $endpoint->getLocalID()) { + return new Auth_OpenID_FailureResponse($endpoint, + sprintf('local_id mismatch. Expected %s, got %s', + $to_match->getLocalID(), $endpoint->getLocalID())); + } + + // If the server URL is None, this must be an OpenID 1 + // response, because op_endpoint is a required parameter in + // OpenID 2. In that case, we don't actually care what the + // discovered server_url is, because signature checking or + // check_auth should take care of that check for us. + if ($to_match->server_url === null) { + if ($to_match->preferredNamespace() != Auth_OpenID_OPENID1_NS) { + return new Auth_OpenID_FailureResponse($endpoint, + "Preferred namespace mismatch (bug)"); + } + } else if ($to_match->server_url != $endpoint->server_url) { + return new Auth_OpenID_FailureResponse($endpoint, + sprintf('OP Endpoint mismatch. Expected %s, got %s', + $to_match->server_url, $endpoint->server_url)); + } + + return null; + } + + /** + * @access private + */ + function _verifyDiscoveryResultsOpenID2($message, $endpoint) + { + $to_match = new Auth_OpenID_ServiceEndpoint(); + $to_match->type_uris = array(Auth_OpenID_TYPE_2_0); + $to_match->claimed_id = $message->getArg(Auth_OpenID_OPENID2_NS, + 'claimed_id'); + + $to_match->local_id = $message->getArg(Auth_OpenID_OPENID2_NS, + 'identity'); + + $to_match->server_url = $message->getArg(Auth_OpenID_OPENID2_NS, + 'op_endpoint'); + + if ($to_match->server_url === null) { + return new Auth_OpenID_FailureResponse($endpoint, + "OP Endpoint URL missing"); + } + + // claimed_id and identifier must both be present or both be + // absent + if (($to_match->claimed_id === null) && + ($to_match->local_id !== null)) { + return new Auth_OpenID_FailureResponse($endpoint, + 'openid.identity is present without openid.claimed_id'); + } + + if (($to_match->claimed_id !== null) && + ($to_match->local_id === null)) { + return new Auth_OpenID_FailureResponse($endpoint, + 'openid.claimed_id is present without openid.identity'); + } + + if ($to_match->claimed_id === null) { + // This is a response without identifiers, so there's + // really no checking that we can do, so return an + // endpoint that's for the specified `openid.op_endpoint' + return Auth_OpenID_ServiceEndpoint::fromOPEndpointURL( + $to_match->server_url); + } + + if (!$endpoint) { + // The claimed ID doesn't match, so we have to do + // discovery again. This covers not using sessions, OP + // identifier endpoints and responses that didn't match + // the original request. + // oidutil.log('No pre-discovered information supplied.') + return $this->_discoverAndVerify($to_match->claimed_id, + array($to_match)); + } else { + + // The claimed ID matches, so we use the endpoint that we + // discovered in initiation. This should be the most + // common case. + $result = $this->_verifyDiscoverySingle($endpoint, $to_match); + + if (Auth_OpenID::isFailure($result)) { + $endpoint = $this->_discoverAndVerify($to_match->claimed_id, + array($to_match)); + if (Auth_OpenID::isFailure($endpoint)) { + return $endpoint; + } + } + } + + // The endpoint we return should have the claimed ID from the + // message we just verified, fragment and all. + if ($endpoint->claimed_id != $to_match->claimed_id) { + $endpoint->claimed_id = $to_match->claimed_id; + } + + return $endpoint; + } + + /** + * @access private + */ + function _discoverAndVerify($claimed_id, $to_match_endpoints) + { + // oidutil.log('Performing discovery on %s' % (claimed_id,)) + list($unused, $services) = call_user_func($this->discoverMethod, + $claimed_id, + $this->fetcher); + + if (!$services) { + return new Auth_OpenID_FailureResponse(null, + sprintf("No OpenID information found at %s", + $claimed_id)); + } + + return $this->_verifyDiscoveryServices($claimed_id, $services, + $to_match_endpoints); + } + + /** + * @access private + */ + function _verifyDiscoveryServices($claimed_id, + &$services, &$to_match_endpoints) + { + // Search the services resulting from discovery to find one + // that matches the information from the assertion + + foreach ($services as $endpoint) { + foreach ($to_match_endpoints as $to_match_endpoint) { + $result = $this->_verifyDiscoverySingle($endpoint, + $to_match_endpoint); + + if (!Auth_OpenID::isFailure($result)) { + // It matches, so discover verification has + // succeeded. Return this endpoint. + return $endpoint; + } + } + } + + return new Auth_OpenID_FailureResponse(null, + sprintf('No matching endpoint found after discovering %s', + $claimed_id)); + } + + /** + * Extract the nonce from an OpenID 1 response. Return the nonce + * from the BARE_NS since we independently check the return_to + * arguments are the same as those in the response message. + * + * See the openid1_nonce_query_arg_name class variable + * + * @returns $nonce The nonce as a string or null + * + * @access private + */ + function _idResGetNonceOpenID1($message, $endpoint) + { + return $message->getArg(Auth_OpenID_BARE_NS, + $this->openid1_nonce_query_arg_name); + } + + /** + * @access private + */ + function _idResCheckNonce($message, $endpoint) + { + if ($message->isOpenID1()) { + // This indicates that the nonce was generated by the consumer + $nonce = $this->_idResGetNonceOpenID1($message, $endpoint); + $server_url = ''; + } else { + $nonce = $message->getArg(Auth_OpenID_OPENID2_NS, + 'response_nonce'); + + $server_url = $endpoint->server_url; + } + + if ($nonce === null) { + return new Auth_OpenID_FailureResponse($endpoint, + "Nonce missing from response"); + } + + $parts = Auth_OpenID_splitNonce($nonce); + + if ($parts === null) { + return new Auth_OpenID_FailureResponse($endpoint, + "Malformed nonce in response"); + } + + list($timestamp, $salt) = $parts; + + if (!$this->store->useNonce($server_url, $timestamp, $salt)) { + return new Auth_OpenID_FailureResponse($endpoint, + "Nonce already used or out of range"); + } + + return null; + } + + /** + * @access private + */ + function _idResCheckForFields($message) + { + $basic_fields = array('return_to', 'assoc_handle', 'sig', 'signed'); + $basic_sig_fields = array('return_to', 'identity'); + + $require_fields = array( + Auth_OpenID_OPENID2_NS => array_merge($basic_fields, + array('op_endpoint')), + + Auth_OpenID_OPENID1_NS => array_merge($basic_fields, + array('identity')) + ); + + $require_sigs = array( + Auth_OpenID_OPENID2_NS => array_merge($basic_sig_fields, + array('response_nonce', + 'claimed_id', + 'assoc_handle', + 'op_endpoint')), + Auth_OpenID_OPENID1_NS => array_merge($basic_sig_fields, + array('nonce')) + ); + + foreach ($require_fields[$message->getOpenIDNamespace()] as $field) { + if (!$message->hasKey(Auth_OpenID_OPENID_NS, $field)) { + return new Auth_OpenID_FailureResponse(null, + "Missing required field '".$field."'"); + } + } + + $signed_list_str = $message->getArg(Auth_OpenID_OPENID_NS, + 'signed', + Auth_OpenID_NO_DEFAULT); + if (Auth_OpenID::isFailure($signed_list_str)) { + return $signed_list_str; + } + $signed_list = explode(',', $signed_list_str); + + foreach ($require_sigs[$message->getOpenIDNamespace()] as $field) { + // Field is present and not in signed list + if ($message->hasKey(Auth_OpenID_OPENID_NS, $field) && + (!in_array($field, $signed_list))) { + return new Auth_OpenID_FailureResponse(null, + "'".$field."' not signed"); + } + } + + return null; + } + + /** + * @access private + */ + function _checkAuth($message, $server_url) + { + $request = $this->_createCheckAuthRequest($message); + if ($request === null) { + return false; + } + + $resp_message = $this->_makeKVPost($request, $server_url); + if (($resp_message === null) || + (is_a($resp_message, 'Auth_OpenID_ServerErrorContainer'))) { + return false; + } + + return $this->_processCheckAuthResponse($resp_message, $server_url); + } + + /** + * @access private + */ + function _createCheckAuthRequest($message) + { + $signed = $message->getArg(Auth_OpenID_OPENID_NS, 'signed'); + if ($signed) { + foreach (explode(',', $signed) as $k) { + $value = $message->getAliasedArg($k); + if ($value === null) { + return null; + } + } + } + $ca_message = $message->copy(); + $ca_message->setArg(Auth_OpenID_OPENID_NS, 'mode', + 'check_authentication'); + return $ca_message; + } + + /** + * @access private + */ + function _processCheckAuthResponse($response, $server_url) + { + $is_valid = $response->getArg(Auth_OpenID_OPENID_NS, 'is_valid', + 'false'); + + $invalidate_handle = $response->getArg(Auth_OpenID_OPENID_NS, + 'invalidate_handle'); + + if ($invalidate_handle !== null) { + $this->store->removeAssociation($server_url, + $invalidate_handle); + } + + if ($is_valid == 'true') { + return true; + } + + return false; + } + + /** + * Adapt a POST response to a Message. + * + * @param $response Result of a POST to an OpenID endpoint. + * + * @access private + */ + function _httpResponseToMessage($response, $server_url) + { + // Should this function be named Message.fromHTTPResponse instead? + $response_message = Auth_OpenID_Message::fromKVForm($response->body); + + if ($response->status == 400) { + return Auth_OpenID_ServerErrorContainer::fromMessage( + $response_message); + } else if ($response->status != 200 and $response->status != 206) { + return null; + } + + return $response_message; + } + + /** + * @access private + */ + function _makeKVPost($message, $server_url) + { + $body = $message->toURLEncoded(); + $resp = $this->fetcher->post($server_url, $body); + + if ($resp === null) { + return null; + } + + return $this->_httpResponseToMessage($resp, $server_url); + } + + /** + * @access private + */ + function _getAssociation($endpoint) + { + if (!$this->_use_assocs) { + return null; + } + + $assoc = $this->store->getAssociation($endpoint->server_url); + + if (($assoc === null) || + ($assoc->getExpiresIn() <= 0)) { + + $assoc = $this->_negotiateAssociation($endpoint); + + if ($assoc !== null) { + $this->store->storeAssociation($endpoint->server_url, + $assoc); + } + } + + return $assoc; + } + + /** + * Handle ServerErrors resulting from association requests. + * + * @return $result If server replied with an C{unsupported-type} + * error, return a tuple of supported C{association_type}, + * C{session_type}. Otherwise logs the error and returns null. + * + * @access private + */ + function _extractSupportedAssociationType(&$server_error, &$endpoint, + $assoc_type) + { + // Any error message whose code is not 'unsupported-type' + // should be considered a total failure. + if (($server_error->error_code != 'unsupported-type') || + ($server_error->message->isOpenID1())) { + return null; + } + + // The server didn't like the association/session type that we + // sent, and it sent us back a message that might tell us how + // to handle it. + + // Extract the session_type and assoc_type from the error + // message + $assoc_type = $server_error->message->getArg(Auth_OpenID_OPENID_NS, + 'assoc_type'); + + $session_type = $server_error->message->getArg(Auth_OpenID_OPENID_NS, + 'session_type'); + + if (($assoc_type === null) || ($session_type === null)) { + return null; + } else if (!$this->negotiator->isAllowed($assoc_type, + $session_type)) { + return null; + } else { + return array($assoc_type, $session_type); + } + } + + /** + * @access private + */ + function _negotiateAssociation($endpoint) + { + // Get our preferred session/association type from the negotiatior. + list($assoc_type, $session_type) = $this->negotiator->getAllowedType(); + + $assoc = $this->_requestAssociation( + $endpoint, $assoc_type, $session_type); + + if (Auth_OpenID::isFailure($assoc)) { + return null; + } + + if (is_a($assoc, 'Auth_OpenID_ServerErrorContainer')) { + $why = $assoc; + + $supportedTypes = $this->_extractSupportedAssociationType( + $why, $endpoint, $assoc_type); + + if ($supportedTypes !== null) { + list($assoc_type, $session_type) = $supportedTypes; + + // Attempt to create an association from the assoc_type + // and session_type that the server told us it + // supported. + $assoc = $this->_requestAssociation( + $endpoint, $assoc_type, $session_type); + + if (is_a($assoc, 'Auth_OpenID_ServerErrorContainer')) { + // Do not keep trying, since it rejected the + // association type that it told us to use. + // oidutil.log('Server %s refused its suggested association + // 'type: session_type=%s, assoc_type=%s' + // % (endpoint.server_url, session_type, + // assoc_type)) + return null; + } else { + return $assoc; + } + } else { + return null; + } + } else { + return $assoc; + } + } + + /** + * @access private + */ + function _requestAssociation($endpoint, $assoc_type, $session_type) + { + list($assoc_session, $args) = $this->_createAssociateRequest( + $endpoint, $assoc_type, $session_type); + + $response_message = $this->_makeKVPost($args, $endpoint->server_url); + + if ($response_message === null) { + // oidutil.log('openid.associate request failed: %s' % (why[0],)) + return null; + } else if (is_a($response_message, + 'Auth_OpenID_ServerErrorContainer')) { + return $response_message; + } + + return $this->_extractAssociation($response_message, $assoc_session); + } + + /** + * @access private + */ + function _extractAssociation(&$assoc_response, &$assoc_session) + { + // Extract the common fields from the response, raising an + // exception if they are not found + $assoc_type = $assoc_response->getArg( + Auth_OpenID_OPENID_NS, 'assoc_type', + Auth_OpenID_NO_DEFAULT); + + if (Auth_OpenID::isFailure($assoc_type)) { + return $assoc_type; + } + + $assoc_handle = $assoc_response->getArg( + Auth_OpenID_OPENID_NS, 'assoc_handle', + Auth_OpenID_NO_DEFAULT); + + if (Auth_OpenID::isFailure($assoc_handle)) { + return $assoc_handle; + } + + // expires_in is a base-10 string. The Python parsing will + // accept literals that have whitespace around them and will + // accept negative values. Neither of these are really in-spec, + // but we think it's OK to accept them. + $expires_in_str = $assoc_response->getArg( + Auth_OpenID_OPENID_NS, 'expires_in', + Auth_OpenID_NO_DEFAULT); + + if (Auth_OpenID::isFailure($expires_in_str)) { + return $expires_in_str; + } + + $expires_in = Auth_OpenID::intval($expires_in_str); + if ($expires_in === false) { + + $err = sprintf("Could not parse expires_in from association ". + "response %s", print_r($assoc_response, true)); + return new Auth_OpenID_FailureResponse(null, $err); + } + + // OpenID 1 has funny association session behaviour. + if ($assoc_response->isOpenID1()) { + $session_type = $this->_getOpenID1SessionType($assoc_response); + } else { + $session_type = $assoc_response->getArg( + Auth_OpenID_OPENID2_NS, 'session_type', + Auth_OpenID_NO_DEFAULT); + + if (Auth_OpenID::isFailure($session_type)) { + return $session_type; + } + } + + // Session type mismatch + if ($assoc_session->session_type != $session_type) { + if ($assoc_response->isOpenID1() && + ($session_type == 'no-encryption')) { + // In OpenID 1, any association request can result in + // a 'no-encryption' association response. Setting + // assoc_session to a new no-encryption session should + // make the rest of this function work properly for + // that case. + $assoc_session = new Auth_OpenID_PlainTextConsumerSession(); + } else { + // Any other mismatch, regardless of protocol version + // results in the failure of the association session + // altogether. + return null; + } + } + + // Make sure assoc_type is valid for session_type + if (!in_array($assoc_type, $assoc_session->allowed_assoc_types)) { + return null; + } + + // Delegate to the association session to extract the secret + // from the response, however is appropriate for that session + // type. + $secret = $assoc_session->extractSecret($assoc_response); + + if ($secret === null) { + return null; + } + + return Auth_OpenID_Association::fromExpiresIn( + $expires_in, $assoc_handle, $secret, $assoc_type); + } + + /** + * @access private + */ + function _createAssociateRequest($endpoint, $assoc_type, $session_type) + { + if (array_key_exists($session_type, $this->session_types)) { + $session_type_class = $this->session_types[$session_type]; + + if (is_callable($session_type_class)) { + $assoc_session = $session_type_class(); + } else { + $assoc_session = new $session_type_class(); + } + } else { + return null; + } + + $args = array( + 'mode' => 'associate', + 'assoc_type' => $assoc_type); + + if (!$endpoint->compatibilityMode()) { + $args['ns'] = Auth_OpenID_OPENID2_NS; + } + + // Leave out the session type if we're in compatibility mode + // *and* it's no-encryption. + if ((!$endpoint->compatibilityMode()) || + ($assoc_session->session_type != 'no-encryption')) { + $args['session_type'] = $assoc_session->session_type; + } + + $args = array_merge($args, $assoc_session->getRequest()); + $message = Auth_OpenID_Message::fromOpenIDArgs($args); + return array($assoc_session, $message); + } + + /** + * Given an association response message, extract the OpenID 1.X + * session type. + * + * This function mostly takes care of the 'no-encryption' default + * behavior in OpenID 1. + * + * If the association type is plain-text, this function will + * return 'no-encryption' + * + * @access private + * @return $typ The association type for this message + */ + function _getOpenID1SessionType($assoc_response) + { + // If it's an OpenID 1 message, allow session_type to default + // to None (which signifies "no-encryption") + $session_type = $assoc_response->getArg(Auth_OpenID_OPENID1_NS, + 'session_type'); + + // Handle the differences between no-encryption association + // respones in OpenID 1 and 2: + + // no-encryption is not really a valid session type for OpenID + // 1, but we'll accept it anyway, while issuing a warning. + if ($session_type == 'no-encryption') { + // oidutil.log('WARNING: OpenID server sent "no-encryption"' + // 'for OpenID 1.X') + } else if (($session_type == '') || ($session_type === null)) { + // Missing or empty session type is the way to flag a + // 'no-encryption' response. Change the session type to + // 'no-encryption' so that it can be handled in the same + // way as OpenID 2 'no-encryption' respones. + $session_type = 'no-encryption'; + } + + return $session_type; + } +} + +/** + * This class represents an authentication request from a consumer to + * an OpenID server. + * + * @package OpenID + */ +class Auth_OpenID_AuthRequest { + + /** + * Initialize an authentication request with the specified token, + * association, and endpoint. + * + * Users of this library should not create instances of this + * class. Instances of this class are created by the library when + * needed. + */ + function Auth_OpenID_AuthRequest(&$endpoint, $assoc) + { + $this->assoc = $assoc; + $this->endpoint =& $endpoint; + $this->return_to_args = array(); + $this->message = new Auth_OpenID_Message( + $endpoint->preferredNamespace()); + $this->_anonymous = false; + } + + /** + * Add an extension to this checkid request. + * + * $extension_request: An object that implements the extension + * request interface for adding arguments to an OpenID message. + */ + function addExtension(&$extension_request) + { + $extension_request->toMessage($this->message); + } + + /** + * Add an extension argument to this OpenID authentication + * request. + * + * Use caution when adding arguments, because they will be + * URL-escaped and appended to the redirect URL, which can easily + * get quite long. + * + * @param string $namespace The namespace for the extension. For + * example, the simple registration extension uses the namespace + * 'sreg'. + * + * @param string $key The key within the extension namespace. For + * example, the nickname field in the simple registration + * extension's key is 'nickname'. + * + * @param string $value The value to provide to the server for + * this argument. + */ + function addExtensionArg($namespace, $key, $value) + { + return $this->message->setArg($namespace, $key, $value); + } + + /** + * Set whether this request should be made anonymously. If a + * request is anonymous, the identifier will not be sent in the + * request. This is only useful if you are making another kind of + * request with an extension in this request. + * + * Anonymous requests are not allowed when the request is made + * with OpenID 1. + */ + function setAnonymous($is_anonymous) + { + if ($is_anonymous && $this->message->isOpenID1()) { + return false; + } else { + $this->_anonymous = $is_anonymous; + return true; + } + } + + /** + * Produce a {@link Auth_OpenID_Message} representing this + * request. + * + * @param string $realm The URL (or URL pattern) that identifies + * your web site to the user when she is authorizing it. + * + * @param string $return_to The URL that the OpenID provider will + * send the user back to after attempting to verify her identity. + * + * Not specifying a return_to URL means that the user will not be + * returned to the site issuing the request upon its completion. + * + * @param bool $immediate If true, the OpenID provider is to send + * back a response immediately, useful for behind-the-scenes + * authentication attempts. Otherwise the OpenID provider may + * engage the user before providing a response. This is the + * default case, as the user may need to provide credentials or + * approve the request before a positive response can be sent. + */ + function getMessage($realm, $return_to=null, $immediate=false) + { + if ($return_to) { + $return_to = Auth_OpenID::appendArgs($return_to, + $this->return_to_args); + } else if ($immediate) { + // raise ValueError( + // '"return_to" is mandatory when + //using "checkid_immediate"') + return new Auth_OpenID_FailureResponse(null, + "'return_to' is mandatory when using checkid_immediate"); + } else if ($this->message->isOpenID1()) { + // raise ValueError('"return_to" is + // mandatory for OpenID 1 requests') + return new Auth_OpenID_FailureResponse(null, + "'return_to' is mandatory for OpenID 1 requests"); + } else if ($this->return_to_args) { + // raise ValueError('extra "return_to" arguments + // were specified, but no return_to was specified') + return new Auth_OpenID_FailureResponse(null, + "extra 'return_to' arguments where specified, " . + "but no return_to was specified"); + } + + if ($immediate) { + $mode = 'checkid_immediate'; + } else { + $mode = 'checkid_setup'; + } + + $message = $this->message->copy(); + if ($message->isOpenID1()) { + $realm_key = 'trust_root'; + } else { + $realm_key = 'realm'; + } + + $message->updateArgs(Auth_OpenID_OPENID_NS, + array( + $realm_key => $realm, + 'mode' => $mode, + 'return_to' => $return_to)); + + if (!$this->_anonymous) { + if ($this->endpoint->isOPIdentifier()) { + // This will never happen when we're in compatibility + // mode, as long as isOPIdentifier() returns False + // whenever preferredNamespace() returns OPENID1_NS. + $claimed_id = $request_identity = + Auth_OpenID_IDENTIFIER_SELECT; + } else { + $request_identity = $this->endpoint->getLocalID(); + $claimed_id = $this->endpoint->claimed_id; + } + + // This is true for both OpenID 1 and 2 + $message->setArg(Auth_OpenID_OPENID_NS, 'identity', + $request_identity); + + if ($message->isOpenID2()) { + $message->setArg(Auth_OpenID_OPENID2_NS, 'claimed_id', + $claimed_id); + } + } + + if ($this->assoc) { + $message->setArg(Auth_OpenID_OPENID_NS, 'assoc_handle', + $this->assoc->handle); + } + + return $message; + } + + function redirectURL($realm, $return_to = null, + $immediate = false) + { + $message = $this->getMessage($realm, $return_to, $immediate); + + if (Auth_OpenID::isFailure($message)) { + return $message; + } + + return $message->toURL($this->endpoint->server_url); + } + + /** + * Get html for a form to submit this request to the IDP. + * + * form_tag_attrs: An array of attributes to be added to the form + * tag. 'accept-charset' and 'enctype' have defaults that can be + * overridden. If a value is supplied for 'action' or 'method', it + * will be replaced. + */ + function formMarkup($realm, $return_to=null, $immediate=false, + $form_tag_attrs=null) + { + $message = $this->getMessage($realm, $return_to, $immediate); + + if (Auth_OpenID::isFailure($message)) { + return $message; + } + + return $message->toFormMarkup($this->endpoint->server_url, + $form_tag_attrs); + } + + /** + * Get a complete html document that will autosubmit the request + * to the IDP. + * + * Wraps formMarkup. See the documentation for that function. + */ + function htmlMarkup($realm, $return_to=null, $immediate=false, + $form_tag_attrs=null) + { + $form = $this->formMarkup($realm, $return_to, $immediate, + $form_tag_attrs); + + if (Auth_OpenID::isFailure($form)) { + return $form; + } + return Auth_OpenID::autoSubmitHTML($form); + } + + function shouldSendRedirect() + { + return $this->endpoint->compatibilityMode(); + } +} + +/** + * The base class for responses from the Auth_OpenID_Consumer. + * + * @package OpenID + */ +class Auth_OpenID_ConsumerResponse { + var $status = null; + + function setEndpoint($endpoint) + { + $this->endpoint = $endpoint; + if ($endpoint === null) { + $this->identity_url = null; + } else { + $this->identity_url = $endpoint->claimed_id; + } + } + + /** + * Return the display identifier for this response. + * + * The display identifier is related to the Claimed Identifier, but the + * two are not always identical. The display identifier is something the + * user should recognize as what they entered, whereas the response's + * claimed identifier (in the identity_url attribute) may have extra + * information for better persistence. + * + * URLs will be stripped of their fragments for display. XRIs will + * display the human-readable identifier (i-name) instead of the + * persistent identifier (i-number). + * + * Use the display identifier in your user interface. Use + * identity_url for querying your database or authorization server. + * + */ + function getDisplayIdentifier() + { + if ($this->endpoint !== null) { + return $this->endpoint->getDisplayIdentifier(); + } + return null; + } +} + +/** + * A response with a status of Auth_OpenID_SUCCESS. Indicates that + * this request is a successful acknowledgement from the OpenID server + * that the supplied URL is, indeed controlled by the requesting + * agent. This has three relevant attributes: + * + * claimed_id - The identity URL that has been authenticated + * + * signed_args - The arguments in the server's response that were + * signed and verified. + * + * status - Auth_OpenID_SUCCESS. + * + * @package OpenID + */ +class Auth_OpenID_SuccessResponse extends Auth_OpenID_ConsumerResponse { + var $status = Auth_OpenID_SUCCESS; + + /** + * @access private + */ + function Auth_OpenID_SuccessResponse($endpoint, $message, $signed_args=null) + { + $this->endpoint = $endpoint; + $this->identity_url = $endpoint->claimed_id; + $this->signed_args = $signed_args; + $this->message = $message; + + if ($this->signed_args === null) { + $this->signed_args = array(); + } + } + + /** + * Extract signed extension data from the server's response. + * + * @param string $prefix The extension namespace from which to + * extract the extension data. + */ + function extensionResponse($namespace_uri, $require_signed) + { + if ($require_signed) { + return $this->getSignedNS($namespace_uri); + } else { + return $this->message->getArgs($namespace_uri); + } + } + + function isOpenID1() + { + return $this->message->isOpenID1(); + } + + function isSigned($ns_uri, $ns_key) + { + // Return whether a particular key is signed, regardless of + // its namespace alias + return in_array($this->message->getKey($ns_uri, $ns_key), + $this->signed_args); + } + + function getSigned($ns_uri, $ns_key, $default = null) + { + // Return the specified signed field if available, otherwise + // return default + if ($this->isSigned($ns_uri, $ns_key)) { + return $this->message->getArg($ns_uri, $ns_key, $default); + } else { + return $default; + } + } + + function getSignedNS($ns_uri) + { + $args = array(); + + $msg_args = $this->message->getArgs($ns_uri); + if (Auth_OpenID::isFailure($msg_args)) { + return null; + } + + foreach ($msg_args as $key => $value) { + if (!$this->isSigned($ns_uri, $key)) { + return null; + } + } + + return $msg_args; + } + + /** + * Get the openid.return_to argument from this response. + * + * This is useful for verifying that this request was initiated by + * this consumer. + * + * @return string $return_to The return_to URL supplied to the + * server on the initial request, or null if the response did not + * contain an 'openid.return_to' argument. + */ + function getReturnTo() + { + return $this->getSigned(Auth_OpenID_OPENID_NS, 'return_to'); + } +} + +/** + * A response with a status of Auth_OpenID_FAILURE. Indicates that the + * OpenID protocol has failed. This could be locally or remotely + * triggered. This has three relevant attributes: + * + * claimed_id - The identity URL for which authentication was + * attempted, if it can be determined. Otherwise, null. + * + * message - A message indicating why the request failed, if one is + * supplied. Otherwise, null. + * + * status - Auth_OpenID_FAILURE. + * + * @package OpenID + */ +class Auth_OpenID_FailureResponse extends Auth_OpenID_ConsumerResponse { + var $status = Auth_OpenID_FAILURE; + + function Auth_OpenID_FailureResponse($endpoint, $message = null, + $contact = null, $reference = null) + { + $this->setEndpoint($endpoint); + $this->message = $message; + $this->contact = $contact; + $this->reference = $reference; + } +} + +/** + * A specific, internal failure used to detect type URI mismatch. + * + * @package OpenID + */ +class Auth_OpenID_TypeURIMismatch extends Auth_OpenID_FailureResponse { +} + +/** + * Exception that is raised when the server returns a 400 response + * code to a direct request. + * + * @package OpenID + */ +class Auth_OpenID_ServerErrorContainer { + function Auth_OpenID_ServerErrorContainer($error_text, + $error_code, + $message) + { + $this->error_text = $error_text; + $this->error_code = $error_code; + $this->message = $message; + } + + /** + * @access private + */ + function fromMessage($message) + { + $error_text = $message->getArg( + Auth_OpenID_OPENID_NS, 'error', ''); + $error_code = $message->getArg(Auth_OpenID_OPENID_NS, 'error_code'); + return new Auth_OpenID_ServerErrorContainer($error_text, + $error_code, + $message); + } +} + +/** + * A response with a status of Auth_OpenID_CANCEL. Indicates that the + * user cancelled the OpenID authentication request. This has two + * relevant attributes: + * + * claimed_id - The identity URL for which authentication was + * attempted, if it can be determined. Otherwise, null. + * + * status - Auth_OpenID_SUCCESS. + * + * @package OpenID + */ +class Auth_OpenID_CancelResponse extends Auth_OpenID_ConsumerResponse { + var $status = Auth_OpenID_CANCEL; + + function Auth_OpenID_CancelResponse($endpoint) + { + $this->setEndpoint($endpoint); + } +} + +/** + * A response with a status of Auth_OpenID_SETUP_NEEDED. Indicates + * that the request was in immediate mode, and the server is unable to + * authenticate the user without further interaction. + * + * claimed_id - The identity URL for which authentication was + * attempted. + * + * setup_url - A URL that can be used to send the user to the server + * to set up for authentication. The user should be redirected in to + * the setup_url, either in the current window or in a new browser + * window. Null in OpenID 2. + * + * status - Auth_OpenID_SETUP_NEEDED. + * + * @package OpenID + */ +class Auth_OpenID_SetupNeededResponse extends Auth_OpenID_ConsumerResponse { + var $status = Auth_OpenID_SETUP_NEEDED; + + function Auth_OpenID_SetupNeededResponse($endpoint, + $setup_url = null) + { + $this->setEndpoint($endpoint); + $this->setup_url = $setup_url; + } +} + +?> diff --git a/libs/Auth/OpenID/CryptUtil.php b/libs/Auth/OpenID/CryptUtil.php new file mode 100644 index 0000000..aacc3cd --- /dev/null +++ b/libs/Auth/OpenID/CryptUtil.php @@ -0,0 +1,109 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +if (!defined('Auth_OpenID_RAND_SOURCE')) { + /** + * The filename for a source of random bytes. Define this yourself + * if you have a different source of randomness. + */ + define('Auth_OpenID_RAND_SOURCE', '/dev/urandom'); +} + +class Auth_OpenID_CryptUtil { + /** + * Get the specified number of random bytes. + * + * Attempts to use a cryptographically secure (not predictable) + * source of randomness if available. If there is no high-entropy + * randomness source available, it will fail. As a last resort, + * for non-critical systems, define + * Auth_OpenID_RAND_SOURCE as null, and + * the code will fall back on a pseudo-random number generator. + * + * @param int $num_bytes The length of the return value + * @return string $bytes random bytes + */ + function getBytes($num_bytes) + { + static $f = null; + $bytes = ''; + if ($f === null) { + if (Auth_OpenID_RAND_SOURCE === null) { + $f = false; + } else { + $f = @fopen(Auth_OpenID_RAND_SOURCE, "r"); + if ($f === false) { + $msg = 'Define Auth_OpenID_RAND_SOURCE as null to ' . + ' continue with an insecure random number generator.'; + trigger_error($msg, E_USER_ERROR); + } + } + } + if ($f === false) { + // pseudorandom used + $bytes = ''; + for ($i = 0; $i < $num_bytes; $i += 4) { + $bytes .= pack('L', mt_rand()); + } + $bytes = substr($bytes, 0, $num_bytes); + } else { + $bytes = fread($f, $num_bytes); + } + return $bytes; + } + + /** + * Produce a string of length random bytes, chosen from chrs. If + * $chrs is null, the resulting string may contain any characters. + * + * @param integer $length The length of the resulting + * randomly-generated string + * @param string $chrs A string of characters from which to choose + * to build the new string + * @return string $result A string of randomly-chosen characters + * from $chrs + */ + function randomString($length, $population = null) + { + if ($population === null) { + return Auth_OpenID_CryptUtil::getBytes($length); + } + + $popsize = strlen($population); + + if ($popsize > 256) { + $msg = 'More than 256 characters supplied to ' . __FUNCTION__; + trigger_error($msg, E_USER_ERROR); + } + + $duplicate = 256 % $popsize; + + $str = ""; + for ($i = 0; $i < $length; $i++) { + do { + $n = ord(Auth_OpenID_CryptUtil::getBytes(1)); + } while ($n < $duplicate); + + $n %= $popsize; + $str .= $population[$n]; + } + + return $str; + } +} + +?> \ No newline at end of file diff --git a/libs/Auth/OpenID/DatabaseConnection.php b/libs/Auth/OpenID/DatabaseConnection.php new file mode 100644 index 0000000..9db6e0e --- /dev/null +++ b/libs/Auth/OpenID/DatabaseConnection.php @@ -0,0 +1,131 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * An empty base class intended to emulate PEAR connection + * functionality in applications that supply their own database + * abstraction mechanisms. See {@link Auth_OpenID_SQLStore} for more + * information. You should subclass this class if you need to create + * an SQL store that needs to access its database using an + * application's database abstraction layer instead of a PEAR database + * connection. Any subclass of Auth_OpenID_DatabaseConnection MUST + * adhere to the interface specified here. + * + * @package OpenID + */ +class Auth_OpenID_DatabaseConnection { + /** + * Sets auto-commit mode on this database connection. + * + * @param bool $mode True if auto-commit is to be used; false if + * not. + */ + function autoCommit($mode) + { + } + + /** + * Run an SQL query with the specified parameters, if any. + * + * @param string $sql An SQL string with placeholders. The + * placeholders are assumed to be specific to the database engine + * for this connection. + * + * @param array $params An array of parameters to insert into the + * SQL string using this connection's escaping mechanism. + * + * @return mixed $result The result of calling this connection's + * internal query function. The type of result depends on the + * underlying database engine. This method is usually used when + * the result of a query is not important, like a DDL query. + */ + function query($sql, $params = array()) + { + } + + /** + * Starts a transaction on this connection, if supported. + */ + function begin() + { + } + + /** + * Commits a transaction on this connection, if supported. + */ + function commit() + { + } + + /** + * Performs a rollback on this connection, if supported. + */ + function rollback() + { + } + + /** + * Run an SQL query and return the first column of the first row + * of the result set, if any. + * + * @param string $sql An SQL string with placeholders. The + * placeholders are assumed to be specific to the database engine + * for this connection. + * + * @param array $params An array of parameters to insert into the + * SQL string using this connection's escaping mechanism. + * + * @return mixed $result The value of the first column of the + * first row of the result set. False if no such result was + * found. + */ + function getOne($sql, $params = array()) + { + } + + /** + * Run an SQL query and return the first row of the result set, if + * any. + * + * @param string $sql An SQL string with placeholders. The + * placeholders are assumed to be specific to the database engine + * for this connection. + * + * @param array $params An array of parameters to insert into the + * SQL string using this connection's escaping mechanism. + * + * @return array $result The first row of the result set, if any, + * keyed on column name. False if no such result was found. + */ + function getRow($sql, $params = array()) + { + } + + /** + * Run an SQL query with the specified parameters, if any. + * + * @param string $sql An SQL string with placeholders. The + * placeholders are assumed to be specific to the database engine + * for this connection. + * + * @param array $params An array of parameters to insert into the + * SQL string using this connection's escaping mechanism. + * + * @return array $result An array of arrays representing the + * result of the query; each array is keyed on column name. + */ + function getAll($sql, $params = array()) + { + } +} + +?> \ No newline at end of file diff --git a/libs/Auth/OpenID/DiffieHellman.php b/libs/Auth/OpenID/DiffieHellman.php new file mode 100644 index 0000000..f4ded7e --- /dev/null +++ b/libs/Auth/OpenID/DiffieHellman.php @@ -0,0 +1,113 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +require_once 'Auth/OpenID.php'; +require_once 'Auth/OpenID/BigMath.php'; + +function Auth_OpenID_getDefaultMod() +{ + return '155172898181473697471232257763715539915724801'. + '966915404479707795314057629378541917580651227423'. + '698188993727816152646631438561595825688188889951'. + '272158842675419950341258706556549803580104870537'. + '681476726513255747040765857479291291572334510643'. + '245094715007229621094194349783925984760375594985'. + '848253359305585439638443'; +} + +function Auth_OpenID_getDefaultGen() +{ + return '2'; +} + +/** + * The Diffie-Hellman key exchange class. This class relies on + * {@link Auth_OpenID_MathLibrary} to perform large number operations. + * + * @access private + * @package OpenID + */ +class Auth_OpenID_DiffieHellman { + + var $mod; + var $gen; + var $private; + var $lib = null; + + function Auth_OpenID_DiffieHellman($mod = null, $gen = null, + $private = null, $lib = null) + { + if ($lib === null) { + $this->lib =& Auth_OpenID_getMathLib(); + } else { + $this->lib =& $lib; + } + + if ($mod === null) { + $this->mod = $this->lib->init(Auth_OpenID_getDefaultMod()); + } else { + $this->mod = $mod; + } + + if ($gen === null) { + $this->gen = $this->lib->init(Auth_OpenID_getDefaultGen()); + } else { + $this->gen = $gen; + } + + if ($private === null) { + $r = $this->lib->rand($this->mod); + $this->private = $this->lib->add($r, 1); + } else { + $this->private = $private; + } + + $this->public = $this->lib->powmod($this->gen, $this->private, + $this->mod); + } + + function getSharedSecret($composite) + { + return $this->lib->powmod($composite, $this->private, $this->mod); + } + + function getPublicKey() + { + return $this->public; + } + + function usingDefaultValues() + { + return ($this->mod == Auth_OpenID_getDefaultMod() && + $this->gen == Auth_OpenID_getDefaultGen()); + } + + function xorSecret($composite, $secret, $hash_func) + { + $dh_shared = $this->getSharedSecret($composite); + $dh_shared_str = $this->lib->longToBinary($dh_shared); + $hash_dh_shared = $hash_func($dh_shared_str); + + $xsecret = ""; + for ($i = 0; $i < Auth_OpenID::bytes($secret); $i++) { + $xsecret .= chr(ord($secret[$i]) ^ ord($hash_dh_shared[$i])); + } + + return $xsecret; + } +} + +?> diff --git a/libs/Auth/OpenID/Discover.php b/libs/Auth/OpenID/Discover.php new file mode 100644 index 0000000..62aeb1d --- /dev/null +++ b/libs/Auth/OpenID/Discover.php @@ -0,0 +1,548 @@ +claimed_id = null; + $this->server_url = null; + $this->type_uris = array(); + $this->local_id = null; + $this->canonicalID = null; + $this->used_yadis = false; // whether this came from an XRDS + $this->display_identifier = null; + } + + function getDisplayIdentifier() + { + if ($this->display_identifier) { + return $this->display_identifier; + } + if (! $this->claimed_id) { + return $this->claimed_id; + } + $parsed = parse_url($this->claimed_id); + $scheme = $parsed['scheme']; + $host = $parsed['host']; + $path = $parsed['path']; + if (array_key_exists('query', $parsed)) { + $query = $parsed['query']; + $no_frag = "$scheme://$host$path?$query"; + } else { + $no_frag = "$scheme://$host$path"; + } + return $no_frag; + } + + function usesExtension($extension_uri) + { + return in_array($extension_uri, $this->type_uris); + } + + function preferredNamespace() + { + if (in_array(Auth_OpenID_TYPE_2_0_IDP, $this->type_uris) || + in_array(Auth_OpenID_TYPE_2_0, $this->type_uris)) { + return Auth_OpenID_OPENID2_NS; + } else { + return Auth_OpenID_OPENID1_NS; + } + } + + /* + * Query this endpoint to see if it has any of the given type + * URIs. This is useful for implementing other endpoint classes + * that e.g. need to check for the presence of multiple versions + * of a single protocol. + * + * @param $type_uris The URIs that you wish to check + * + * @return all types that are in both in type_uris and + * $this->type_uris + */ + function matchTypes($type_uris) + { + $result = array(); + foreach ($type_uris as $test_uri) { + if ($this->supportsType($test_uri)) { + $result[] = $test_uri; + } + } + + return $result; + } + + function supportsType($type_uri) + { + // Does this endpoint support this type? + return ((in_array($type_uri, $this->type_uris)) || + (($type_uri == Auth_OpenID_TYPE_2_0) && + $this->isOPIdentifier())); + } + + function compatibilityMode() + { + return $this->preferredNamespace() != Auth_OpenID_OPENID2_NS; + } + + function isOPIdentifier() + { + return in_array(Auth_OpenID_TYPE_2_0_IDP, $this->type_uris); + } + + function fromOPEndpointURL($op_endpoint_url) + { + // Construct an OP-Identifier OpenIDServiceEndpoint object for + // a given OP Endpoint URL + $obj = new Auth_OpenID_ServiceEndpoint(); + $obj->server_url = $op_endpoint_url; + $obj->type_uris = array(Auth_OpenID_TYPE_2_0_IDP); + return $obj; + } + + function parseService($yadis_url, $uri, $type_uris, $service_element) + { + // Set the state of this object based on the contents of the + // service element. Return true if successful, false if not + // (if findOPLocalIdentifier returns false). + $this->type_uris = $type_uris; + $this->server_url = $uri; + $this->used_yadis = true; + + if (!$this->isOPIdentifier()) { + $this->claimed_id = $yadis_url; + $this->local_id = Auth_OpenID_findOPLocalIdentifier( + $service_element, + $this->type_uris); + if ($this->local_id === false) { + return false; + } + } + + return true; + } + + function getLocalID() + { + // Return the identifier that should be sent as the + // openid.identity_url parameter to the server. + if ($this->local_id === null && $this->canonicalID === null) { + return $this->claimed_id; + } else { + if ($this->local_id) { + return $this->local_id; + } else { + return $this->canonicalID; + } + } + } + + /* + * Parse the given document as XRDS looking for OpenID services. + * + * @return array of Auth_OpenID_ServiceEndpoint or null if the + * document cannot be parsed. + */ + function fromXRDS($uri, $xrds_text) + { + $xrds =& Auth_Yadis_XRDS::parseXRDS($xrds_text); + + if ($xrds) { + $yadis_services = + $xrds->services(array('filter_MatchesAnyOpenIDType')); + return Auth_OpenID_makeOpenIDEndpoints($uri, $yadis_services); + } + + return null; + } + + /* + * Create endpoints from a DiscoveryResult. + * + * @param discoveryResult Auth_Yadis_DiscoveryResult + * @return array of Auth_OpenID_ServiceEndpoint or null if + * endpoints cannot be created. + */ + function fromDiscoveryResult($discoveryResult) + { + if ($discoveryResult->isXRDS()) { + return Auth_OpenID_ServiceEndpoint::fromXRDS( + $discoveryResult->normalized_uri, + $discoveryResult->response_text); + } else { + return Auth_OpenID_ServiceEndpoint::fromHTML( + $discoveryResult->normalized_uri, + $discoveryResult->response_text); + } + } + + function fromHTML($uri, $html) + { + $discovery_types = array( + array(Auth_OpenID_TYPE_2_0, + 'openid2.provider', 'openid2.local_id'), + array(Auth_OpenID_TYPE_1_1, + 'openid.server', 'openid.delegate') + ); + + $services = array(); + + foreach ($discovery_types as $triple) { + list($type_uri, $server_rel, $delegate_rel) = $triple; + + $urls = Auth_OpenID_legacy_discover($html, $server_rel, + $delegate_rel); + + if ($urls === false) { + continue; + } + + list($delegate_url, $server_url) = $urls; + + $service = new Auth_OpenID_ServiceEndpoint(); + $service->claimed_id = $uri; + $service->local_id = $delegate_url; + $service->server_url = $server_url; + $service->type_uris = array($type_uri); + + $services[] = $service; + } + + return $services; + } + + function copy() + { + $x = new Auth_OpenID_ServiceEndpoint(); + + $x->claimed_id = $this->claimed_id; + $x->server_url = $this->server_url; + $x->type_uris = $this->type_uris; + $x->local_id = $this->local_id; + $x->canonicalID = $this->canonicalID; + $x->used_yadis = $this->used_yadis; + + return $x; + } +} + +function Auth_OpenID_findOPLocalIdentifier($service, $type_uris) +{ + // Extract a openid:Delegate value from a Yadis Service element. + // If no delegate is found, returns null. Returns false on + // discovery failure (when multiple delegate/localID tags have + // different values). + + $service->parser->registerNamespace('openid', + Auth_OpenID_XMLNS_1_0); + + $service->parser->registerNamespace('xrd', + Auth_Yadis_XMLNS_XRD_2_0); + + $parser =& $service->parser; + + $permitted_tags = array(); + + if (in_array(Auth_OpenID_TYPE_1_1, $type_uris) || + in_array(Auth_OpenID_TYPE_1_0, $type_uris)) { + $permitted_tags[] = 'openid:Delegate'; + } + + if (in_array(Auth_OpenID_TYPE_2_0, $type_uris)) { + $permitted_tags[] = 'xrd:LocalID'; + } + + $local_id = null; + + foreach ($permitted_tags as $tag_name) { + $tags = $service->getElements($tag_name); + + foreach ($tags as $tag) { + $content = $parser->content($tag); + + if ($local_id === null) { + $local_id = $content; + } else if ($local_id != $content) { + return false; + } + } + } + + return $local_id; +} + +function filter_MatchesAnyOpenIDType(&$service) +{ + $uris = $service->getTypes(); + + foreach ($uris as $uri) { + if (in_array($uri, Auth_OpenID_getOpenIDTypeURIs())) { + return true; + } + } + + return false; +} + +function Auth_OpenID_bestMatchingService($service, $preferred_types) +{ + // Return the index of the first matching type, or something + // higher if no type matches. + // + // This provides an ordering in which service elements that + // contain a type that comes earlier in the preferred types list + // come before service elements that come later. If a service + // element has more than one type, the most preferred one wins. + + foreach ($preferred_types as $index => $typ) { + if (in_array($typ, $service->type_uris)) { + return $index; + } + } + + return count($preferred_types); +} + +function Auth_OpenID_arrangeByType($service_list, $preferred_types) +{ + // Rearrange service_list in a new list so services are ordered by + // types listed in preferred_types. Return the new list. + + // Build a list with the service elements in tuples whose + // comparison will prefer the one with the best matching service + $prio_services = array(); + foreach ($service_list as $index => $service) { + $prio_services[] = array(Auth_OpenID_bestMatchingService($service, + $preferred_types), + $index, $service); + } + + sort($prio_services); + + // Now that the services are sorted by priority, remove the sort + // keys from the list. + foreach ($prio_services as $index => $s) { + $prio_services[$index] = $prio_services[$index][2]; + } + + return $prio_services; +} + +// Extract OP Identifier services. If none found, return the rest, +// sorted with most preferred first according to +// OpenIDServiceEndpoint.openid_type_uris. +// +// openid_services is a list of OpenIDServiceEndpoint objects. +// +// Returns a list of OpenIDServiceEndpoint objects.""" +function Auth_OpenID_getOPOrUserServices($openid_services) +{ + $op_services = Auth_OpenID_arrangeByType($openid_services, + array(Auth_OpenID_TYPE_2_0_IDP)); + + $openid_services = Auth_OpenID_arrangeByType($openid_services, + Auth_OpenID_getOpenIDTypeURIs()); + + if ($op_services) { + return $op_services; + } else { + return $openid_services; + } +} + +function Auth_OpenID_makeOpenIDEndpoints($uri, $yadis_services) +{ + $s = array(); + + if (!$yadis_services) { + return $s; + } + + foreach ($yadis_services as $service) { + $type_uris = $service->getTypes(); + $uris = $service->getURIs(); + + // If any Type URIs match and there is an endpoint URI + // specified, then this is an OpenID endpoint + if ($type_uris && + $uris) { + foreach ($uris as $service_uri) { + $openid_endpoint = new Auth_OpenID_ServiceEndpoint(); + if ($openid_endpoint->parseService($uri, + $service_uri, + $type_uris, + $service)) { + $s[] = $openid_endpoint; + } + } + } + } + + return $s; +} + +function Auth_OpenID_discoverWithYadis($uri, &$fetcher, + $endpoint_filter='Auth_OpenID_getOPOrUserServices', + $discover_function=null) +{ + // Discover OpenID services for a URI. Tries Yadis and falls back + // on old-style discovery if Yadis fails. + + // Might raise a yadis.discover.DiscoveryFailure if no document + // came back for that URI at all. I don't think falling back to + // OpenID 1.0 discovery on the same URL will help, so don't bother + // to catch it. + if ($discover_function === null) { + $discover_function = array('Auth_Yadis_Yadis', 'discover'); + } + + $openid_services = array(); + + $response = call_user_func_array($discover_function, + array($uri, &$fetcher)); + + $yadis_url = $response->normalized_uri; + $yadis_services = array(); + + if ($response->isFailure()) { + return array($uri, array()); + } + + $openid_services = Auth_OpenID_ServiceEndpoint::fromXRDS( + $yadis_url, + $response->response_text); + + if (!$openid_services) { + if ($response->isXRDS()) { + return Auth_OpenID_discoverWithoutYadis($uri, + $fetcher); + } + + // Try to parse the response as HTML to get OpenID 1.0/1.1 + // + $openid_services = Auth_OpenID_ServiceEndpoint::fromHTML( + $yadis_url, + $response->response_text); + } + + $openid_services = call_user_func_array($endpoint_filter, + array(&$openid_services)); + + return array($yadis_url, $openid_services); +} + +function Auth_OpenID_discoverURI($uri, &$fetcher) +{ + $uri = Auth_OpenID::normalizeUrl($uri); + return Auth_OpenID_discoverWithYadis($uri, $fetcher); +} + +function Auth_OpenID_discoverWithoutYadis($uri, &$fetcher) +{ + $http_resp = @$fetcher->get($uri); + + if ($http_resp->status != 200 and $http_resp->status != 206) { + return array($uri, array()); + } + + $identity_url = $http_resp->final_url; + + // Try to parse the response as HTML to get OpenID 1.0/1.1 + $openid_services = Auth_OpenID_ServiceEndpoint::fromHTML( + $identity_url, + $http_resp->body); + + return array($identity_url, $openid_services); +} + +function Auth_OpenID_discoverXRI($iname, &$fetcher) +{ + $resolver = new Auth_Yadis_ProxyResolver($fetcher); + list($canonicalID, $yadis_services) = + $resolver->query($iname, + Auth_OpenID_getOpenIDTypeURIs(), + array('filter_MatchesAnyOpenIDType')); + + $openid_services = Auth_OpenID_makeOpenIDEndpoints($iname, + $yadis_services); + + $openid_services = Auth_OpenID_getOPOrUserServices($openid_services); + + for ($i = 0; $i < count($openid_services); $i++) { + $openid_services[$i]->canonicalID = $canonicalID; + $openid_services[$i]->claimed_id = $canonicalID; + $openid_services[$i]->display_identifier = $iname; + } + + // FIXME: returned xri should probably be in some normal form + return array($iname, $openid_services); +} + +function Auth_OpenID_discover($uri, &$fetcher) +{ + // If the fetcher (i.e., PHP) doesn't support SSL, we can't do + // discovery on an HTTPS URL. + if ($fetcher->isHTTPS($uri) && !$fetcher->supportsSSL()) { + return array($uri, array()); + } + + if (Auth_Yadis_identifierScheme($uri) == 'XRI') { + $result = Auth_OpenID_discoverXRI($uri, $fetcher); + } else { + $result = Auth_OpenID_discoverURI($uri, $fetcher); + } + + // If the fetcher doesn't support SSL, we can't interact with + // HTTPS server URLs; remove those endpoints from the list. + if (!$fetcher->supportsSSL()) { + $http_endpoints = array(); + list($new_uri, $endpoints) = $result; + + foreach ($endpoints as $e) { + if (!$fetcher->isHTTPS($e->server_url)) { + $http_endpoints[] = $e; + } + } + + $result = array($new_uri, $http_endpoints); + } + + return $result; +} + +?> diff --git a/libs/Auth/OpenID/DumbStore.php b/libs/Auth/OpenID/DumbStore.php new file mode 100644 index 0000000..22fd2d3 --- /dev/null +++ b/libs/Auth/OpenID/DumbStore.php @@ -0,0 +1,100 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * Import the interface for creating a new store class. + */ +require_once 'Auth/OpenID/Interface.php'; +require_once 'Auth/OpenID/HMAC.php'; + +/** + * This is a store for use in the worst case, when you have no way of + * saving state on the consumer site. Using this store makes the + * consumer vulnerable to replay attacks, as it's unable to use + * nonces. Avoid using this store if it is at all possible. + * + * Most of the methods of this class are implementation details. + * Users of this class need to worry only about the constructor. + * + * @package OpenID + */ +class Auth_OpenID_DumbStore extends Auth_OpenID_OpenIDStore { + + /** + * Creates a new {@link Auth_OpenID_DumbStore} instance. For the security + * of the tokens generated by the library, this class attempts to + * at least have a secure implementation of getAuthKey. + * + * When you create an instance of this class, pass in a secret + * phrase. The phrase is hashed with sha1 to make it the correct + * length and form for an auth key. That allows you to use a long + * string as the secret phrase, which means you can make it very + * difficult to guess. + * + * Each {@link Auth_OpenID_DumbStore} instance that is created for use by + * your consumer site needs to use the same $secret_phrase. + * + * @param string secret_phrase The phrase used to create the auth + * key returned by getAuthKey + */ + function Auth_OpenID_DumbStore($secret_phrase) + { + $this->auth_key = Auth_OpenID_SHA1($secret_phrase); + } + + /** + * This implementation does nothing. + */ + function storeAssociation($server_url, $association) + { + } + + /** + * This implementation always returns null. + */ + function getAssociation($server_url, $handle = null) + { + return null; + } + + /** + * This implementation always returns false. + */ + function removeAssociation($server_url, $handle) + { + return false; + } + + /** + * In a system truly limited to dumb mode, nonces must all be + * accepted. This therefore always returns true, which makes + * replay attacks feasible. + */ + function useNonce($server_url, $timestamp, $salt) + { + return true; + } + + /** + * This method returns the auth key generated by the constructor. + */ + function getAuthKey() + { + return $this->auth_key; + } +} + +?> \ No newline at end of file diff --git a/libs/Auth/OpenID/Extension.php b/libs/Auth/OpenID/Extension.php new file mode 100644 index 0000000..f362a4b --- /dev/null +++ b/libs/Auth/OpenID/Extension.php @@ -0,0 +1,62 @@ +isOpenID1(); + $added = $message->namespaces->addAlias($this->ns_uri, + $this->ns_alias, + $implicit); + + if ($added === null) { + if ($message->namespaces->getAlias($this->ns_uri) != + $this->ns_alias) { + return null; + } + } + + $message->updateArgs($this->ns_uri, + $this->getExtensionArgs()); + return $message; + } +} + +?> \ No newline at end of file diff --git a/libs/Auth/OpenID/FileStore.php b/libs/Auth/OpenID/FileStore.php new file mode 100644 index 0000000..29d8d20 --- /dev/null +++ b/libs/Auth/OpenID/FileStore.php @@ -0,0 +1,618 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * Require base class for creating a new interface. + */ +require_once 'Auth/OpenID.php'; +require_once 'Auth/OpenID/Interface.php'; +require_once 'Auth/OpenID/HMAC.php'; +require_once 'Auth/OpenID/Nonce.php'; + +/** + * This is a filesystem-based store for OpenID associations and + * nonces. This store should be safe for use in concurrent systems on + * both windows and unix (excluding NFS filesystems). There are a + * couple race conditions in the system, but those failure cases have + * been set up in such a way that the worst-case behavior is someone + * having to try to log in a second time. + * + * Most of the methods of this class are implementation details. + * People wishing to just use this store need only pay attention to + * the constructor. + * + * @package OpenID + */ +class Auth_OpenID_FileStore extends Auth_OpenID_OpenIDStore { + + /** + * Initializes a new {@link Auth_OpenID_FileStore}. This + * initializes the nonce and association directories, which are + * subdirectories of the directory passed in. + * + * @param string $directory This is the directory to put the store + * directories in. + */ + function Auth_OpenID_FileStore($directory) + { + if (!Auth_OpenID::ensureDir($directory)) { + trigger_error('Not a directory and failed to create: ' + . $directory, E_USER_ERROR); + } + $directory = realpath($directory); + + $this->directory = $directory; + $this->active = true; + + $this->nonce_dir = $directory . DIRECTORY_SEPARATOR . 'nonces'; + + $this->association_dir = $directory . DIRECTORY_SEPARATOR . + 'associations'; + + // Temp dir must be on the same filesystem as the assciations + // $directory. + $this->temp_dir = $directory . DIRECTORY_SEPARATOR . 'temp'; + + $this->max_nonce_age = 6 * 60 * 60; // Six hours, in seconds + + if (!$this->_setup()) { + trigger_error('Failed to initialize OpenID file store in ' . + $directory, E_USER_ERROR); + } + } + + function destroy() + { + Auth_OpenID_FileStore::_rmtree($this->directory); + $this->active = false; + } + + /** + * Make sure that the directories in which we store our data + * exist. + * + * @access private + */ + function _setup() + { + return (Auth_OpenID::ensureDir($this->nonce_dir) && + Auth_OpenID::ensureDir($this->association_dir) && + Auth_OpenID::ensureDir($this->temp_dir)); + } + + /** + * Create a temporary file on the same filesystem as + * $this->association_dir. + * + * The temporary directory should not be cleaned if there are any + * processes using the store. If there is no active process using + * the store, it is safe to remove all of the files in the + * temporary directory. + * + * @return array ($fd, $filename) + * @access private + */ + function _mktemp() + { + $name = Auth_OpenID_FileStore::_mkstemp($dir = $this->temp_dir); + $file_obj = @fopen($name, 'wb'); + if ($file_obj !== false) { + return array($file_obj, $name); + } else { + Auth_OpenID_FileStore::_removeIfPresent($name); + } + } + + function cleanupNonces() + { + global $Auth_OpenID_SKEW; + + $nonces = Auth_OpenID_FileStore::_listdir($this->nonce_dir); + $now = time(); + + $removed = 0; + // Check all nonces for expiry + foreach ($nonces as $nonce_fname) { + $base = basename($nonce_fname); + $parts = explode('-', $base, 2); + $timestamp = $parts[0]; + $timestamp = intval($timestamp, 16); + if (abs($timestamp - $now) > $Auth_OpenID_SKEW) { + Auth_OpenID_FileStore::_removeIfPresent($nonce_fname); + $removed += 1; + } + } + return $removed; + } + + /** + * Create a unique filename for a given server url and + * handle. This implementation does not assume anything about the + * format of the handle. The filename that is returned will + * contain the domain name from the server URL for ease of human + * inspection of the data directory. + * + * @return string $filename + */ + function getAssociationFilename($server_url, $handle) + { + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return null; + } + + if (strpos($server_url, '://') === false) { + trigger_error(sprintf("Bad server URL: %s", $server_url), + E_USER_WARNING); + return null; + } + + list($proto, $rest) = explode('://', $server_url, 2); + $parts = explode('/', $rest); + $domain = Auth_OpenID_FileStore::_filenameEscape($parts[0]); + $url_hash = Auth_OpenID_FileStore::_safe64($server_url); + if ($handle) { + $handle_hash = Auth_OpenID_FileStore::_safe64($handle); + } else { + $handle_hash = ''; + } + + $filename = sprintf('%s-%s-%s-%s', $proto, $domain, $url_hash, + $handle_hash); + + return $this->association_dir. DIRECTORY_SEPARATOR . $filename; + } + + /** + * Store an association in the association directory. + */ + function storeAssociation($server_url, $association) + { + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return false; + } + + $association_s = $association->serialize(); + $filename = $this->getAssociationFilename($server_url, + $association->handle); + list($tmp_file, $tmp) = $this->_mktemp(); + + if (!$tmp_file) { + trigger_error("_mktemp didn't return a valid file descriptor", + E_USER_WARNING); + return false; + } + + fwrite($tmp_file, $association_s); + + fflush($tmp_file); + + fclose($tmp_file); + + if (@rename($tmp, $filename)) { + return true; + } else { + // In case we are running on Windows, try unlinking the + // file in case it exists. + @unlink($filename); + + // Now the target should not exist. Try renaming again, + // giving up if it fails. + if (@rename($tmp, $filename)) { + return true; + } + } + + // If there was an error, don't leave the temporary file + // around. + Auth_OpenID_FileStore::_removeIfPresent($tmp); + return false; + } + + /** + * Retrieve an association. If no handle is specified, return the + * association with the most recent issue time. + * + * @return mixed $association + */ + function getAssociation($server_url, $handle = null) + { + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return null; + } + + if ($handle === null) { + $handle = ''; + } + + // The filename with the empty handle is a prefix of all other + // associations for the given server URL. + $filename = $this->getAssociationFilename($server_url, $handle); + + if ($handle) { + return $this->_getAssociation($filename); + } else { + $association_files = + Auth_OpenID_FileStore::_listdir($this->association_dir); + $matching_files = array(); + + // strip off the path to do the comparison + $name = basename($filename); + foreach ($association_files as $association_file) { + $base = basename($association_file); + if (strpos($base, $name) === 0) { + $matching_files[] = $association_file; + } + } + + $matching_associations = array(); + // read the matching files and sort by time issued + foreach ($matching_files as $full_name) { + $association = $this->_getAssociation($full_name); + if ($association !== null) { + $matching_associations[] = array($association->issued, + $association); + } + } + + $issued = array(); + $assocs = array(); + foreach ($matching_associations as $key => $assoc) { + $issued[$key] = $assoc[0]; + $assocs[$key] = $assoc[1]; + } + + array_multisort($issued, SORT_DESC, $assocs, SORT_DESC, + $matching_associations); + + // return the most recently issued one. + if ($matching_associations) { + list($issued, $assoc) = $matching_associations[0]; + return $assoc; + } else { + return null; + } + } + } + + /** + * @access private + */ + function _getAssociation($filename) + { + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return null; + } + + $assoc_file = @fopen($filename, 'rb'); + + if ($assoc_file === false) { + return null; + } + + $assoc_s = fread($assoc_file, filesize($filename)); + fclose($assoc_file); + + if (!$assoc_s) { + return null; + } + + $association = + Auth_OpenID_Association::deserialize('Auth_OpenID_Association', + $assoc_s); + + if (!$association) { + Auth_OpenID_FileStore::_removeIfPresent($filename); + return null; + } + + if ($association->getExpiresIn() == 0) { + Auth_OpenID_FileStore::_removeIfPresent($filename); + return null; + } else { + return $association; + } + } + + /** + * Remove an association if it exists. Do nothing if it does not. + * + * @return bool $success + */ + function removeAssociation($server_url, $handle) + { + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return null; + } + + $assoc = $this->getAssociation($server_url, $handle); + if ($assoc === null) { + return false; + } else { + $filename = $this->getAssociationFilename($server_url, $handle); + return Auth_OpenID_FileStore::_removeIfPresent($filename); + } + } + + /** + * Return whether this nonce is present. As a side effect, mark it + * as no longer present. + * + * @return bool $present + */ + function useNonce($server_url, $timestamp, $salt) + { + global $Auth_OpenID_SKEW; + + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return null; + } + + if ( abs($timestamp - time()) > $Auth_OpenID_SKEW ) { + return False; + } + + if ($server_url) { + list($proto, $rest) = explode('://', $server_url, 2); + } else { + $proto = ''; + $rest = ''; + } + + $parts = explode('/', $rest, 2); + $domain = $this->_filenameEscape($parts[0]); + $url_hash = $this->_safe64($server_url); + $salt_hash = $this->_safe64($salt); + + $filename = sprintf('%08x-%s-%s-%s-%s', $timestamp, $proto, + $domain, $url_hash, $salt_hash); + $filename = $this->nonce_dir . DIRECTORY_SEPARATOR . $filename; + + $result = @fopen($filename, 'x'); + + if ($result === false) { + return false; + } else { + fclose($result); + return true; + } + } + + /** + * Remove expired entries from the database. This is potentially + * expensive, so only run when it is acceptable to take time. + * + * @access private + */ + function _allAssocs() + { + $all_associations = array(); + + $association_filenames = + Auth_OpenID_FileStore::_listdir($this->association_dir); + + foreach ($association_filenames as $association_filename) { + $association_file = fopen($association_filename, 'rb'); + + if ($association_file !== false) { + $assoc_s = fread($association_file, + filesize($association_filename)); + fclose($association_file); + + // Remove expired or corrupted associations + $association = + Auth_OpenID_Association::deserialize( + 'Auth_OpenID_Association', $assoc_s); + + if ($association === null) { + Auth_OpenID_FileStore::_removeIfPresent( + $association_filename); + } else { + if ($association->getExpiresIn() == 0) { + $all_associations[] = array($association_filename, + $association); + } + } + } + } + + return $all_associations; + } + + function clean() + { + if (!$this->active) { + trigger_error("FileStore no longer active", E_USER_ERROR); + return null; + } + + $nonces = Auth_OpenID_FileStore::_listdir($this->nonce_dir); + $now = time(); + + // Check all nonces for expiry + foreach ($nonces as $nonce) { + if (!Auth_OpenID_checkTimestamp($nonce, $now)) { + $filename = $this->nonce_dir . DIRECTORY_SEPARATOR . $nonce; + Auth_OpenID_FileStore::_removeIfPresent($filename); + } + } + + foreach ($this->_allAssocs() as $pair) { + list($assoc_filename, $assoc) = $pair; + if ($assoc->getExpiresIn() == 0) { + Auth_OpenID_FileStore::_removeIfPresent($assoc_filename); + } + } + } + + /** + * @access private + */ + function _rmtree($dir) + { + if ($dir[strlen($dir) - 1] != DIRECTORY_SEPARATOR) { + $dir .= DIRECTORY_SEPARATOR; + } + + if ($handle = opendir($dir)) { + while ($item = readdir($handle)) { + if (!in_array($item, array('.', '..'))) { + if (is_dir($dir . $item)) { + + if (!Auth_OpenID_FileStore::_rmtree($dir . $item)) { + return false; + } + } else if (is_file($dir . $item)) { + if (!unlink($dir . $item)) { + return false; + } + } + } + } + + closedir($handle); + + if (!@rmdir($dir)) { + return false; + } + + return true; + } else { + // Couldn't open directory. + return false; + } + } + + /** + * @access private + */ + function _mkstemp($dir) + { + foreach (range(0, 4) as $i) { + $name = tempnam($dir, "php_openid_filestore_"); + + if ($name !== false) { + return $name; + } + } + return false; + } + + /** + * @access private + */ + function _mkdtemp($dir) + { + foreach (range(0, 4) as $i) { + $name = $dir . strval(DIRECTORY_SEPARATOR) . strval(getmypid()) . + "-" . strval(rand(1, time())); + if (!mkdir($name, 0700)) { + return false; + } else { + return $name; + } + } + return false; + } + + /** + * @access private + */ + function _listdir($dir) + { + $handle = opendir($dir); + $files = array(); + while (false !== ($filename = readdir($handle))) { + if (!in_array($filename, array('.', '..'))) { + $files[] = $dir . DIRECTORY_SEPARATOR . $filename; + } + } + return $files; + } + + /** + * @access private + */ + function _isFilenameSafe($char) + { + $_Auth_OpenID_filename_allowed = Auth_OpenID_letters . + Auth_OpenID_digits . "."; + return (strpos($_Auth_OpenID_filename_allowed, $char) !== false); + } + + /** + * @access private + */ + function _safe64($str) + { + $h64 = base64_encode(Auth_OpenID_SHA1($str)); + $h64 = str_replace('+', '_', $h64); + $h64 = str_replace('/', '.', $h64); + $h64 = str_replace('=', '', $h64); + return $h64; + } + + /** + * @access private + */ + function _filenameEscape($str) + { + $filename = ""; + $b = Auth_OpenID::toBytes($str); + + for ($i = 0; $i < count($b); $i++) { + $c = $b[$i]; + if (Auth_OpenID_FileStore::_isFilenameSafe($c)) { + $filename .= $c; + } else { + $filename .= sprintf("_%02X", ord($c)); + } + } + return $filename; + } + + /** + * Attempt to remove a file, returning whether the file existed at + * the time of the call. + * + * @access private + * @return bool $result True if the file was present, false if not. + */ + function _removeIfPresent($filename) + { + return @unlink($filename); + } + + function cleanupAssociations() + { + $removed = 0; + foreach ($this->_allAssocs() as $pair) { + list($assoc_filename, $assoc) = $pair; + if ($assoc->getExpiresIn() == 0) { + $this->_removeIfPresent($assoc_filename); + $removed += 1; + } + } + return $removed; + } +} + +?> diff --git a/libs/Auth/OpenID/HMAC.php b/libs/Auth/OpenID/HMAC.php new file mode 100644 index 0000000..553170c --- /dev/null +++ b/libs/Auth/OpenID/HMAC.php @@ -0,0 +1,99 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +require_once 'Auth/OpenID.php'; + +/** + * SHA1_BLOCKSIZE is this module's SHA1 blocksize used by the fallback + * implementation. + */ +define('Auth_OpenID_SHA1_BLOCKSIZE', 64); + +function Auth_OpenID_SHA1($text) +{ + if (function_exists('hash') && + function_exists('hash_algos') && + (in_array('sha1', hash_algos()))) { + // PHP 5 case (sometimes): 'hash' available and 'sha1' algo + // supported. + return hash('sha1', $text, true); + } else if (function_exists('sha1')) { + // PHP 4 case: 'sha1' available. + $hex = sha1($text); + $raw = ''; + for ($i = 0; $i < 40; $i += 2) { + $hexcode = substr($hex, $i, 2); + $charcode = (int)base_convert($hexcode, 16, 10); + $raw .= chr($charcode); + } + return $raw; + } else { + // Explode. + trigger_error('No SHA1 function found', E_USER_ERROR); + } +} + +/** + * Compute an HMAC/SHA1 hash. + * + * @access private + * @param string $key The HMAC key + * @param string $text The message text to hash + * @return string $mac The MAC + */ +function Auth_OpenID_HMACSHA1($key, $text) +{ + if (Auth_OpenID::bytes($key) > Auth_OpenID_SHA1_BLOCKSIZE) { + $key = Auth_OpenID_SHA1($key, true); + } + + $key = str_pad($key, Auth_OpenID_SHA1_BLOCKSIZE, chr(0x00)); + $ipad = str_repeat(chr(0x36), Auth_OpenID_SHA1_BLOCKSIZE); + $opad = str_repeat(chr(0x5c), Auth_OpenID_SHA1_BLOCKSIZE); + $hash1 = Auth_OpenID_SHA1(($key ^ $ipad) . $text, true); + $hmac = Auth_OpenID_SHA1(($key ^ $opad) . $hash1, true); + return $hmac; +} + +if (function_exists('hash') && + function_exists('hash_algos') && + (in_array('sha256', hash_algos()))) { + function Auth_OpenID_SHA256($text) + { + // PHP 5 case: 'hash' available and 'sha256' algo supported. + return hash('sha256', $text, true); + } + define('Auth_OpenID_SHA256_SUPPORTED', true); +} else { + define('Auth_OpenID_SHA256_SUPPORTED', false); +} + +if (function_exists('hash_hmac') && + function_exists('hash_algos') && + (in_array('sha256', hash_algos()))) { + + function Auth_OpenID_HMACSHA256($key, $text) + { + // Return raw MAC (not hex string). + return hash_hmac('sha256', $text, $key, true); + } + + define('Auth_OpenID_HMACSHA256_SUPPORTED', true); +} else { + define('Auth_OpenID_HMACSHA256_SUPPORTED', false); +} + +?> diff --git a/libs/Auth/OpenID/Interface.php b/libs/Auth/OpenID/Interface.php new file mode 100644 index 0000000..f4c6062 --- /dev/null +++ b/libs/Auth/OpenID/Interface.php @@ -0,0 +1,197 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * This is the interface for the store objects the OpenID library + * uses. It is a single class that provides all of the persistence + * mechanisms that the OpenID library needs, for both servers and + * consumers. If you want to create an SQL-driven store, please see + * then {@link Auth_OpenID_SQLStore} class. + * + * Change: Version 2.0 removed the storeNonce, getAuthKey, and isDumb + * methods, and changed the behavior of the useNonce method to support + * one-way nonces. + * + * @package OpenID + * @author JanRain, Inc. + */ +class Auth_OpenID_OpenIDStore { + /** + * This method puts an Association object into storage, + * retrievable by server URL and handle. + * + * @param string $server_url The URL of the identity server that + * this association is with. Because of the way the server portion + * of the library uses this interface, don't assume there are any + * limitations on the character set of the input string. In + * particular, expect to see unescaped non-url-safe characters in + * the server_url field. + * + * @param Association $association The Association to store. + */ + function storeAssociation($server_url, $association) + { + trigger_error("Auth_OpenID_OpenIDStore::storeAssociation ". + "not implemented", E_USER_ERROR); + } + + /* + * Remove expired nonces from the store. + * + * Discards any nonce from storage that is old enough that its + * timestamp would not pass useNonce(). + * + * This method is not called in the normal operation of the + * library. It provides a way for store admins to keep their + * storage from filling up with expired data. + * + * @return the number of nonces expired + */ + function cleanupNonces() + { + trigger_error("Auth_OpenID_OpenIDStore::cleanupNonces ". + "not implemented", E_USER_ERROR); + } + + /* + * Remove expired associations from the store. + * + * This method is not called in the normal operation of the + * library. It provides a way for store admins to keep their + * storage from filling up with expired data. + * + * @return the number of associations expired. + */ + function cleanupAssociations() + { + trigger_error("Auth_OpenID_OpenIDStore::cleanupAssociations ". + "not implemented", E_USER_ERROR); + } + + /* + * Shortcut for cleanupNonces(), cleanupAssociations(). + * + * This method is not called in the normal operation of the + * library. It provides a way for store admins to keep their + * storage from filling up with expired data. + */ + function cleanup() + { + return array($this->cleanupNonces(), + $this->cleanupAssociations()); + } + + /** + * Report whether this storage supports cleanup + */ + function supportsCleanup() + { + return true; + } + + /** + * This method returns an Association object from storage that + * matches the server URL and, if specified, handle. It returns + * null if no such association is found or if the matching + * association is expired. + * + * If no handle is specified, the store may return any association + * which matches the server URL. If multiple associations are + * valid, the recommended return value for this method is the one + * most recently issued. + * + * This method is allowed (and encouraged) to garbage collect + * expired associations when found. This method must not return + * expired associations. + * + * @param string $server_url The URL of the identity server to get + * the association for. Because of the way the server portion of + * the library uses this interface, don't assume there are any + * limitations on the character set of the input string. In + * particular, expect to see unescaped non-url-safe characters in + * the server_url field. + * + * @param mixed $handle This optional parameter is the handle of + * the specific association to get. If no specific handle is + * provided, any valid association matching the server URL is + * returned. + * + * @return Association The Association for the given identity + * server. + */ + function getAssociation($server_url, $handle = null) + { + trigger_error("Auth_OpenID_OpenIDStore::getAssociation ". + "not implemented", E_USER_ERROR); + } + + /** + * This method removes the matching association if it's found, and + * returns whether the association was removed or not. + * + * @param string $server_url The URL of the identity server the + * association to remove belongs to. Because of the way the server + * portion of the library uses this interface, don't assume there + * are any limitations on the character set of the input + * string. In particular, expect to see unescaped non-url-safe + * characters in the server_url field. + * + * @param string $handle This is the handle of the association to + * remove. If there isn't an association found that matches both + * the given URL and handle, then there was no matching handle + * found. + * + * @return mixed Returns whether or not the given association existed. + */ + function removeAssociation($server_url, $handle) + { + trigger_error("Auth_OpenID_OpenIDStore::removeAssociation ". + "not implemented", E_USER_ERROR); + } + + /** + * Called when using a nonce. + * + * This method should return C{True} if the nonce has not been + * used before, and store it for a while to make sure nobody + * tries to use the same value again. If the nonce has already + * been used, return C{False}. + * + * Change: In earlier versions, round-trip nonces were used and a + * nonce was only valid if it had been previously stored with + * storeNonce. Version 2.0 uses one-way nonces, requiring a + * different implementation here that does not depend on a + * storeNonce call. (storeNonce is no longer part of the + * interface. + * + * @param string $nonce The nonce to use. + * + * @return bool Whether or not the nonce was valid. + */ + function useNonce($server_url, $timestamp, $salt) + { + trigger_error("Auth_OpenID_OpenIDStore::useNonce ". + "not implemented", E_USER_ERROR); + } + + /** + * Removes all entries from the store; implementation is optional. + */ + function reset() + { + } + +} +?> \ No newline at end of file diff --git a/libs/Auth/OpenID/KVForm.php b/libs/Auth/OpenID/KVForm.php new file mode 100644 index 0000000..fb342a0 --- /dev/null +++ b/libs/Auth/OpenID/KVForm.php @@ -0,0 +1,112 @@ + + * @copyright 2005-2008 Janrain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + */ + +/** + * Container for key-value/comma-newline OpenID format and parsing + */ +class Auth_OpenID_KVForm { + /** + * Convert an OpenID colon/newline separated string into an + * associative array + * + * @static + * @access private + */ + function toArray($kvs, $strict=false) + { + $lines = explode("\n", $kvs); + + $last = array_pop($lines); + if ($last !== '') { + array_push($lines, $last); + if ($strict) { + return false; + } + } + + $values = array(); + + for ($lineno = 0; $lineno < count($lines); $lineno++) { + $line = $lines[$lineno]; + $kv = explode(':', $line, 2); + if (count($kv) != 2) { + if ($strict) { + return false; + } + continue; + } + + $key = $kv[0]; + $tkey = trim($key); + if ($tkey != $key) { + if ($strict) { + return false; + } + } + + $value = $kv[1]; + $tval = trim($value); + if ($tval != $value) { + if ($strict) { + return false; + } + } + + $values[$tkey] = $tval; + } + + return $values; + } + + /** + * Convert an array into an OpenID colon/newline separated string + * + * @static + * @access private + */ + function fromArray($values) + { + if ($values === null) { + return null; + } + + ksort($values); + + $serialized = ''; + foreach ($values as $key => $value) { + if (is_array($value)) { + list($key, $value) = array($value[0], $value[1]); + } + + if (strpos($key, ':') !== false) { + return null; + } + + if (strpos($key, "\n") !== false) { + return null; + } + + if (strpos($value, "\n") !== false) { + return null; + } + $serialized .= "$key:$value\n"; + } + return $serialized; + } +} + +?> \ No newline at end of file diff --git a/libs/Auth/OpenID/MemcachedStore.php b/libs/Auth/OpenID/MemcachedStore.php new file mode 100644 index 0000000..d357c6b --- /dev/null +++ b/libs/Auth/OpenID/MemcachedStore.php @@ -0,0 +1,208 @@ + + * @copyright 2008 JanRain, Inc. + * @license http://www.apache.org/licenses/LICENSE-2.0 Apache + * Contributed by Open Web Technologies + */ + +/** + * Import the interface for creating a new store class. + */ +require_once 'Auth/OpenID/Interface.php'; + +/** + * This is a memcached-based store for OpenID associations and + * nonces. + * + * As memcache has limit of 250 chars for key length, + * server_url, handle and salt are hashed with sha1(). + * + * Most of the methods of this class are implementation details. + * People wishing to just use this store need only pay attention to + * the constructor. + * + * @package OpenID + */ +class Auth_OpenID_MemcachedStore extends Auth_OpenID_OpenIDStore { + + /** + * Initializes a new {@link Auth_OpenID_MemcachedStore} instance. + * Just saves memcached object as property. + * + * @param resource connection Memcache connection resourse + */ + function Auth_OpenID_MemcachedStore($connection, $compress = false) + { + $this->connection = $connection; + $this->compress = $compress ? MEMCACHE_COMPRESSED : 0; + } + + /** + * Store association until its expiration time in memcached. + * Overwrites any existing association with same server_url and + * handle. Handles list of associations for every server. + */ + function storeAssociation($server_url, $association) + { + // create memcached keys for association itself + // and list of associations for this server + $associationKey = $this->associationKey($server_url, + $association->handle); + $serverKey = $this->associationServerKey($server_url); + + // get list of associations + $serverAssociations = $this->connection->get($serverKey); + + // if no such list, initialize it with empty array + if (!$serverAssociations) { + $serverAssociations = array(); + } + // and store given association key in it + $serverAssociations[$association->issued] = $associationKey; + + // save associations' keys list + $this->connection->set( + $serverKey, + $serverAssociations, + $this->compress + ); + // save association itself + $this->connection->set( + $associationKey, + $association, + $this->compress, + $association->issued + $association->lifetime); + } + + /** + * Read association from memcached. If no handle given + * and multiple associations found, returns latest issued + */ + function getAssociation($server_url, $handle = null) + { + // simple case: handle given + if ($handle !== null) { + // get association, return null if failed + $association = $this->connection->get( + $this->associationKey($server_url, $handle)); + return $association ? $association : null; + } + + // no handle given, working with list + // create key for list of associations + $serverKey = $this->associationServerKey($server_url); + + // get list of associations + $serverAssociations = $this->connection->get($serverKey); + // return null if failed or got empty list + if (!$serverAssociations) { + return null; + } + + // get key of most recently issued association + $keys = array_keys($serverAssociations); + sort($keys); + $lastKey = $serverAssociations[array_pop($keys)]; + + // get association, return null if failed + $association = $this->connection->get($lastKey); + return $association ? $association : null; + } + + /** + * Immediately delete association from memcache. + */ + function removeAssociation($server_url, $handle) + { + // create memcached keys for association itself + // and list of associations for this server + $serverKey = $this->associationServerKey($server_url); + $associationKey = $this->associationKey($server_url, + $handle); + + // get list of associations + $serverAssociations = $this->connection->get($serverKey); + // return null if failed or got empty list + if (!$serverAssociations) { + return false; + } + + // ensure that given association key exists in list + $serverAssociations = array_flip($serverAssociations); + if (!array_key_exists($associationKey, $serverAssociations)) { + return false; + } + + // remove given association key from list + unset($serverAssociations[$associationKey]); + $serverAssociations = array_flip($serverAssociations); + + // save updated list + $this->connection->set( + $serverKey, + $serverAssociations, + $this->compress + ); + + // delete association + return $this->connection->delete($associationKey); + } + + /** + * Create nonce for server and salt, expiring after + * $Auth_OpenID_SKEW seconds. + */ + function useNonce($server_url, $timestamp, $salt) + { + global $Auth_OpenID_SKEW; + + // save one request to memcache when nonce obviously expired + if (abs($timestamp - time()) > $Auth_OpenID_SKEW) { + return false; + } + + // returns false when nonce already exists + // otherwise adds nonce + return $this->connection->add( + 'openid_nonce_' . sha1($server_url) . '_' . sha1($salt), + 1, // any value here + $this->compress, + $Auth_OpenID_SKEW); + } + + /** + * Memcache key is prefixed with 'openid_association_' string. + */ + function associationKey($server_url, $handle = null) + { + return 'openid_association_' . sha1($server_url) . '_' . sha1($handle); + } + + /** + * Memcache key is prefixed with 'openid_association_' string. + */ + function associationServerKey($server_url) + { + return 'openid_association_server_' . sha1($server_url); + } + + /** + * Report that this storage doesn't support cleanup + */ + function supportsCleanup() + { + return false; + } +} + +?> \ No newline at end of file diff --git a/libs/Auth/OpenID/Message.php b/libs/Auth/OpenID/Message.php new file mode 100644 index 0000000..5ab115a --- /dev/null +++ b/libs/Auth/OpenID/Message.php @@ -0,0 +1,920 @@ +keys = array(); + $this->values = array(); + + if (is_array($classic_array)) { + foreach ($classic_array as $key => $value) { + $this->set($key, $value); + } + } + } + + /** + * Returns true if $thing is an Auth_OpenID_Mapping object; false + * if not. + */ + function isA($thing) + { + return (is_object($thing) && + strtolower(get_class($thing)) == 'auth_openid_mapping'); + } + + /** + * Returns an array of the keys in the mapping. + */ + function keys() + { + return $this->keys; + } + + /** + * Returns an array of values in the mapping. + */ + function values() + { + return $this->values; + } + + /** + * Returns an array of (key, value) pairs in the mapping. + */ + function items() + { + $temp = array(); + + for ($i = 0; $i < count($this->keys); $i++) { + $temp[] = array($this->keys[$i], + $this->values[$i]); + } + return $temp; + } + + /** + * Returns the "length" of the mapping, or the number of keys. + */ + function len() + { + return count($this->keys); + } + + /** + * Sets a key-value pair in the mapping. If the key already + * exists, its value is replaced with the new value. + */ + function set($key, $value) + { + $index = array_search($key, $this->keys); + + if ($index !== false) { + $this->values[$index] = $value; + } else { + $this->keys[] = $key; + $this->values[] = $value; + } + } + + /** + * Gets a specified value from the mapping, associated with the + * specified key. If the key does not exist in the mapping, + * $default is returned instead. + */ + function get($key, $default = null) + { + $index = array_search($key, $this->keys); + + if ($index !== false) { + return $this->values[$index]; + } else { + return $default; + } + } + + /** + * @access private + */ + function _reflow() + { + // PHP is broken yet again. Sort the arrays to remove the + // hole in the numeric indexes that make up the array. + $old_keys = $this->keys; + $old_values = $this->values; + + $this->keys = array(); + $this->values = array(); + + foreach ($old_keys as $k) { + $this->keys[] = $k; + } + + foreach ($old_values as $v) { + $this->values[] = $v; + } + } + + /** + * Deletes a key-value pair from the mapping with the specified + * key. + */ + function del($key) + { + $index = array_search($key, $this->keys); + + if ($index !== false) { + unset($this->keys[$index]); + unset($this->values[$index]); + $this->_reflow(); + return true; + } + return false; + } + + /** + * Returns true if the specified value has a key in the mapping; + * false if not. + */ + function contains($value) + { + return (array_search($value, $this->keys) !== false); + } +} + +/** + * Maintains a bijective map between namespace uris and aliases. + * + * @package OpenID + */ +class Auth_OpenID_NamespaceMap { + function Auth_OpenID_NamespaceMap() + { + $this->alias_to_namespace = new Auth_OpenID_Mapping(); + $this->namespace_to_alias = new Auth_OpenID_Mapping(); + $this->implicit_namespaces = array(); + } + + function getAlias($namespace_uri) + { + return $this->namespace_to_alias->get($namespace_uri); + } + + function getNamespaceURI($alias) + { + return $this->alias_to_namespace->get($alias); + } + + function iterNamespaceURIs() + { + // Return an iterator over the namespace URIs + return $this->namespace_to_alias->keys(); + } + + function iterAliases() + { + // Return an iterator over the aliases""" + return $this->alias_to_namespace->keys(); + } + + function iteritems() + { + return $this->namespace_to_alias->items(); + } + + function isImplicit($namespace_uri) + { + return in_array($namespace_uri, $this->implicit_namespaces); + } + + function addAlias($namespace_uri, $desired_alias, $implicit=false) + { + // Add an alias from this namespace URI to the desired alias + global $Auth_OpenID_OPENID_PROTOCOL_FIELDS; + + // Check that desired_alias is not an openid protocol field as + // per the spec. + if (in_array($desired_alias, $Auth_OpenID_OPENID_PROTOCOL_FIELDS)) { + Auth_OpenID::log("\"%s\" is not an allowed namespace alias", + $desired_alias); + return null; + } + + // Check that desired_alias does not contain a period as per + // the spec. + if (strpos($desired_alias, '.') !== false) { + Auth_OpenID::log('"%s" must not contain a dot', $desired_alias); + return null; + } + + // Check that there is not a namespace already defined for the + // desired alias + $current_namespace_uri = + $this->alias_to_namespace->get($desired_alias); + + if (($current_namespace_uri !== null) && + ($current_namespace_uri != $namespace_uri)) { + Auth_OpenID::log('Cannot map "%s" because previous mapping exists', + $namespace_uri); + return null; + } + + // Check that there is not already a (different) alias for + // this namespace URI + $alias = $this->namespace_to_alias->get($namespace_uri); + + if (($alias !== null) && ($alias != $desired_alias)) { + Auth_OpenID::log('Cannot map %s to alias %s. ' . + 'It is already mapped to alias %s', + $namespace_uri, $desired_alias, $alias); + return null; + } + + assert((Auth_OpenID_NULL_NAMESPACE === $desired_alias) || + is_string($desired_alias)); + + $this->alias_to_namespace->set($desired_alias, $namespace_uri); + $this->namespace_to_alias->set($namespace_uri, $desired_alias); + if ($implicit) { + array_push($this->implicit_namespaces, $namespace_uri); + } + + return $desired_alias; + } + + function add($namespace_uri) + { + // Add this namespace URI to the mapping, without caring what + // alias it ends up with + + // See if this namespace is already mapped to an alias + $alias = $this->namespace_to_alias->get($namespace_uri); + + if ($alias !== null) { + return $alias; + } + + // Fall back to generating a numerical alias + $i = 0; + while (1) { + $alias = 'ext' . strval($i); + if ($this->addAlias($namespace_uri, $alias) === null) { + $i += 1; + } else { + return $alias; + } + } + + // Should NEVER be reached! + return null; + } + + function contains($namespace_uri) + { + return $this->isDefined($namespace_uri); + } + + function isDefined($namespace_uri) + { + return $this->namespace_to_alias->contains($namespace_uri); + } +} + +/** + * In the implementation of this object, null represents the global + * namespace as well as a namespace with no key. + * + * @package OpenID + */ +class Auth_OpenID_Message { + + function Auth_OpenID_Message($openid_namespace = null) + { + // Create an empty Message + $this->allowed_openid_namespaces = array( + Auth_OpenID_OPENID1_NS, + Auth_OpenID_THE_OTHER_OPENID1_NS, + Auth_OpenID_OPENID2_NS); + + $this->args = new Auth_OpenID_Mapping(); + $this->namespaces = new Auth_OpenID_NamespaceMap(); + if ($openid_namespace === null) { + $this->_openid_ns_uri = null; + } else { + $implicit = Auth_OpenID_isOpenID1($openid_namespace); + $this->setOpenIDNamespace($openid_namespace, $implicit); + } + } + + function isOpenID1() + { + return Auth_OpenID_isOpenID1($this->getOpenIDNamespace()); + } + + function isOpenID2() + { + return $this->getOpenIDNamespace() == Auth_OpenID_OPENID2_NS; + } + + function fromPostArgs($args) + { + // Construct a Message containing a set of POST arguments + $obj = new Auth_OpenID_Message(); + + // Partition into "openid." args and bare args + $openid_args = array(); + foreach ($args as $key => $value) { + + if (is_array($value)) { + return null; + } + + $parts = explode('.', $key, 2); + + if (count($parts) == 2) { + list($prefix, $rest) = $parts; + } else { + $prefix = null; + } + + if ($prefix != 'openid') { + $obj->args->set(array(Auth_OpenID_BARE_NS, $key), $value); + } else { + $openid_args[$rest] = $value; + } + } + + if ($obj->_fromOpenIDArgs($openid_args)) { + return $obj; + } else { + return null; + } + } + + function fromOpenIDArgs($openid_args) + { + // Takes an array. + + // Construct a Message from a parsed KVForm message + $obj = new Auth_OpenID_Message(); + if ($obj->_fromOpenIDArgs($openid_args)) { + return $obj; + } else { + return null; + } + } + + /** + * @access private + */ + function _fromOpenIDArgs($openid_args) + { + global $Auth_OpenID_registered_aliases; + + // Takes an Auth_OpenID_Mapping instance OR an array. + + if (!Auth_OpenID_Mapping::isA($openid_args)) { + $openid_args = new Auth_OpenID_Mapping($openid_args); + } + + $ns_args = array(); + + // Resolve namespaces + foreach ($openid_args->items() as $pair) { + list($rest, $value) = $pair; + + $parts = explode('.', $rest, 2); + + if (count($parts) == 2) { + list($ns_alias, $ns_key) = $parts; + } else { + $ns_alias = Auth_OpenID_NULL_NAMESPACE; + $ns_key = $rest; + } + + if ($ns_alias == 'ns') { + if ($this->namespaces->addAlias($value, $ns_key) === null) { + return false; + } + } else if (($ns_alias == Auth_OpenID_NULL_NAMESPACE) && + ($ns_key == 'ns')) { + // null namespace + if ($this->setOpenIDNamespace($value, false) === false) { + return false; + } + } else { + $ns_args[] = array($ns_alias, $ns_key, $value); + } + } + + if (!$this->getOpenIDNamespace()) { + if ($this->setOpenIDNamespace(Auth_OpenID_OPENID1_NS, true) === + false) { + return false; + } + } + + // Actually put the pairs into the appropriate namespaces + foreach ($ns_args as $triple) { + list($ns_alias, $ns_key, $value) = $triple; + $ns_uri = $this->namespaces->getNamespaceURI($ns_alias); + if ($ns_uri === null) { + $ns_uri = $this->_getDefaultNamespace($ns_alias); + if ($ns_uri === null) { + + $ns_uri = Auth_OpenID_OPENID_NS; + $ns_key = sprintf('%s.%s', $ns_alias, $ns_key); + } else { + $this->namespaces->addAlias($ns_uri, $ns_alias, true); + } + } + + $this->setArg($ns_uri, $ns_key, $value); + } + + return true; + } + + function _getDefaultNamespace($mystery_alias) + { + global $Auth_OpenID_registered_aliases; + if ($this->isOpenID1()) { + return @$Auth_OpenID_registered_aliases[$mystery_alias]; + } + return null; + } + + function setOpenIDNamespace($openid_ns_uri, $implicit) + { + if (!in_array($openid_ns_uri, $this->allowed_openid_namespaces)) { + Auth_OpenID::log('Invalid null namespace: "%s"', $openid_ns_uri); + return false; + } + + $succeeded = $this->namespaces->addAlias($openid_ns_uri, + Auth_OpenID_NULL_NAMESPACE, + $implicit); + if ($succeeded === false) { + return false; + } + + $this->_openid_ns_uri = $openid_ns_uri; + + return true; + } + + function getOpenIDNamespace() + { + return $this->_openid_ns_uri; + } + + function fromKVForm($kvform_string) + { + // Create a Message from a KVForm string + return Auth_OpenID_Message::fromOpenIDArgs( + Auth_OpenID_KVForm::toArray($kvform_string)); + } + + function copy() + { + return $this; + } + + function toPostArgs() + { + // Return all arguments with openid. in front of namespaced + // arguments. + + $args = array(); + + // Add namespace definitions to the output + foreach ($this->namespaces->iteritems() as $pair) { + list($ns_uri, $alias) = $pair; + if ($this->namespaces->isImplicit($ns_uri)) { + continue; + } + if ($alias == Auth_OpenID_NULL_NAMESPACE) { + $ns_key = 'openid.ns'; + } else { + $ns_key = 'openid.ns.' . $alias; + } + $args[$ns_key] = $ns_uri; + } + + foreach ($this->args->items() as $pair) { + list($ns_parts, $value) = $pair; + list($ns_uri, $ns_key) = $ns_parts; + $key = $this->getKey($ns_uri, $ns_key); + $args[$key] = $value; + } + + return $args; + } + + function toArgs() + { + // Return all namespaced arguments, failing if any + // non-namespaced arguments exist. + $post_args = $this->toPostArgs(); + $kvargs = array(); + foreach ($post_args as $k => $v) { + if (strpos($k, 'openid.') !== 0) { + // raise ValueError( + // 'This message can only be encoded as a POST, because it ' + // 'contains arguments that are not prefixed with "openid."') + return null; + } else { + $kvargs[substr($k, 7)] = $v; + } + } + + return $kvargs; + } + + function toFormMarkup($action_url, $form_tag_attrs = null, + $submit_text = "Continue") + { + $form = "
$attr) { + $form .= sprintf(" %s=\"%s\"", $name, $attr); + } + } + + $form .= ">\n"; + + foreach ($this->toPostArgs() as $name => $value) { + $form .= sprintf( + "\n", + $name, $value); + } + + $form .= sprintf("\n", + $submit_text); + + $form .= "
\n"; + + return $form; + } + + function toURL($base_url) + { + // Generate a GET URL with the parameters in this message + // attached as query parameters. + return Auth_OpenID::appendArgs($base_url, $this->toPostArgs()); + } + + function toKVForm() + { + // Generate a KVForm string that contains the parameters in + // this message. This will fail if the message contains + // arguments outside of the 'openid.' prefix. + return Auth_OpenID_KVForm::fromArray($this->toArgs()); + } + + function toURLEncoded() + { + // Generate an x-www-urlencoded string + $args = array(); + + foreach ($this->toPostArgs() as $k => $v) { + $args[] = array($k, $v); + } + + sort($args); + return Auth_OpenID::httpBuildQuery($args); + } + + /** + * @access private + */ + function _fixNS($namespace) + { + // Convert an input value into the internally used values of + // this object + + if ($namespace == Auth_OpenID_OPENID_NS) { + if ($this->_openid_ns_uri === null) { + return new Auth_OpenID_FailureResponse(null, + 'OpenID namespace not set'); + } else { + $namespace = $this->_openid_ns_uri; + } + } + + if (($namespace != Auth_OpenID_BARE_NS) && + (!is_string($namespace))) { + //TypeError + $err_msg = sprintf("Namespace must be Auth_OpenID_BARE_NS, ". + "Auth_OpenID_OPENID_NS or a string. got %s", + print_r($namespace, true)); + return new Auth_OpenID_FailureResponse(null, $err_msg); + } + + if (($namespace != Auth_OpenID_BARE_NS) && + (strpos($namespace, ':') === false)) { + // fmt = 'OpenID 2.0 namespace identifiers SHOULD be URIs. Got %r' + // warnings.warn(fmt % (namespace,), DeprecationWarning) + + if ($namespace == 'sreg') { + // fmt = 'Using %r instead of "sreg" as namespace' + // warnings.warn(fmt % (SREG_URI,), DeprecationWarning,) + return Auth_OpenID_SREG_URI; + } + } + + return $namespace; + } + + function hasKey($namespace, $ns_key) + { + $namespace = $this->_fixNS($namespace); + if (Auth_OpenID::isFailure($namespace)) { + // XXX log me + return false; + } else { + return $this->args->contains(array($namespace, $ns_key)); + } + } + + function getKey($namespace, $ns_key) + { + // Get the key for a particular namespaced argument + $namespace = $this->_fixNS($namespace); + if (Auth_OpenID::isFailure($namespace)) { + return $namespace; + } + if ($namespace == Auth_OpenID_BARE_NS) { + return $ns_key; + } + + $ns_alias = $this->namespaces->getAlias($namespace); + + // No alias is defined, so no key can exist + if ($ns_alias === null) { + return null; + } + + if ($ns_alias == Auth_OpenID_NULL_NAMESPACE) { + $tail = $ns_key; + } else { + $tail = sprintf('%s.%s', $ns_alias, $ns_key); + } + + return 'openid.' . $tail; + } + + function getArg($namespace, $key, $default = null) + { + // Get a value for a namespaced key. + $namespace = $this->_fixNS($namespace); + + if (Auth_OpenID::isFailure($namespace)) { + return $namespace; + } else { + if ((!$this->args->contains(array($namespace, $key))) && + ($default == Auth_OpenID_NO_DEFAULT)) { + $err_msg = sprintf("Namespace %s missing required field %s", + $namespace, $key); + return new Auth_OpenID_FailureResponse(null, $err_msg); + } else { + return $this->args->get(array($namespace, $key), $default); + } + } + } + + function getArgs($namespace) + { + // Get the arguments that are defined for this namespace URI + + $namespace = $this->_fixNS($namespace); + if (Auth_OpenID::isFailure($namespace)) { + return $namespace; + } else { + $stuff = array(); + foreach ($this->args->items() as $pair) { + list($key, $value) = $pair; + list($pair_ns, $ns_key) = $key; + if ($pair_ns == $namespace) { + $stuff[$ns_key] = $value; + } + } + + return $stuff; + } + } + + function updateArgs($namespace, $updates) + { + // Set multiple key/value pairs in one call + + $namespace = $this->_fixNS($namespace); + + if (Auth_OpenID::isFailure($namespace)) { + return $namespace; + } else { + foreach ($updates as $k => $v) { + $this->setArg($namespace, $k, $v); + } + return true; + } + } + + function setArg($namespace, $key, $value) + { + // Set a single argument in this namespace + $namespace = $this->_fixNS($namespace); + + if (Auth_OpenID::isFailure($namespace)) { + return $namespace; + } else { + $this->args->set(array($namespace, $key), $value); + if ($namespace !== Auth_OpenID_BARE_NS) { + $this->namespaces->add($namespace); + } + return true; + } + } + + function delArg($namespace, $key) + { + $namespace = $this->_fixNS($namespace); + + if (Auth_OpenID::isFailure($namespace)) { + return $namespace; + } else { + return $this->args->del(array($namespace, $key)); + } + } + + function getAliasedArg($aliased_key, $default = null) + { + if ($aliased_key == 'ns') { + // Return the namespace URI for the OpenID namespace + return $this->getOpenIDNamespace(); + } + + $parts = explode('.', $aliased_key, 2); + + if (count($parts) != 2) { + $ns = null; + } else { + list($alias, $key) = $parts; + + if ($alias == 'ns') { + // Return the namespace URI for a namespace alias + // parameter. + return $this->namespaces->getNamespaceURI($key); + } else { + $ns = $this->namespaces->getNamespaceURI($alias); + } + } + + if ($ns === null) { + $key = $aliased_key; + $ns = $this->getOpenIDNamespace(); + } + + return $this->getArg($ns, $key, $default); + } +} + +?> diff --git a/libs/Auth/OpenID/MySQLStore.php b/libs/Auth/OpenID/MySQLStore.php new file mode 100644 index 0000000..3fb7217 --- /dev/null +++ b/libs/Auth/OpenID/MySQLStore.php @@ -0,0 +1,91 @@ +sql['nonce_table'] = + "CREATE TABLE %s (\n". + " server_url VARCHAR(2047) NOT NULL,\n". + " timestamp INTEGER NOT NULL,\n". + " salt CHAR(40) NOT NULL,\n". + " UNIQUE (server_url(255), timestamp, salt)\n". + ") ENGINE=InnoDB"; + + $this->sql['assoc_table'] = + "CREATE TABLE %s (\n". + " server_url BLOB NOT NULL,\n". + " handle VARCHAR(255) NOT NULL,\n". + " secret BLOB NOT NULL,\n". + " issued INTEGER NOT NULL,\n". + " lifetime INTEGER NOT NULL,\n". + " assoc_type VARCHAR(64) NOT NULL,\n". + " PRIMARY KEY (server_url(255), handle)\n". + ") ENGINE=InnoDB"; + + $this->sql['set_assoc'] = + "REPLACE INTO %s (server_url, handle, secret, issued,\n". + " lifetime, assoc_type) VALUES (?, ?, ?, ?, ?, ?)"; + + $this->sql['get_assocs'] = + "SELECT handle, secret, issued, lifetime, assoc_type FROM %s ". + "WHERE server_url = ?"; + + $this->sql['get_assoc'] = + "SELECT handle, secret, issued, lifetime, assoc_type FROM %s ". + "WHERE server_url = ? AND handle = ?"; + + $this->sql['remove_assoc'] = + "DELETE FROM %s WHERE server_url = ? AND handle = ?"; + + $this->sql['add_nonce'] = + "INSERT INTO %s (server_url, timestamp, salt) VALUES (?, ?, ?)"; + + $this->sql['clean_nonce'] = + "DELETE FROM %s WHERE timestamp < ?"; + + $this->sql['clean_assoc'] = + "DELETE FROM %s WHERE issued + lifetime < ?"; + } + + /** + * @access private + */ + function blobEncode($blob) + { + return "0x" . bin2hex($blob); + } + + function blobDecode($blob) + { + $blob = substr($blob, 2); + $bin = ''; + $i = 0; + do { + $bin .= chr(hexdec($blob{$i}.$blob{($i + 1)})); + $i += 2; + } while ($i < strlen($blob)); + + return $bin; + } +} + +?> diff --git a/libs/Auth/OpenID/Nonce.php b/libs/Auth/OpenID/Nonce.php new file mode 100644 index 0000000..effecac --- /dev/null +++ b/libs/Auth/OpenID/Nonce.php @@ -0,0 +1,109 @@ + \ No newline at end of file diff --git a/libs/Auth/OpenID/PAPE.php b/libs/Auth/OpenID/PAPE.php new file mode 100644 index 0000000..62cba8a --- /dev/null +++ b/libs/Auth/OpenID/PAPE.php @@ -0,0 +1,301 @@ +preferred_auth_policies = $preferred_auth_policies; + $this->max_auth_age = $max_auth_age; + } + + /** + * Add an acceptable authentication policy URI to this request + * + * This method is intended to be used by the relying party to add + * acceptable authentication types to the request. + * + * policy_uri: The identifier for the preferred type of + * authentication. + */ + function addPolicyURI($policy_uri) + { + if (!in_array($policy_uri, $this->preferred_auth_policies)) { + $this->preferred_auth_policies[] = $policy_uri; + } + } + + function getExtensionArgs() + { + $ns_args = array( + 'preferred_auth_policies' => + implode(' ', $this->preferred_auth_policies) + ); + + if ($this->max_auth_age !== null) { + $ns_args['max_auth_age'] = strval($this->max_auth_age); + } + + return $ns_args; + } + + /** + * Instantiate a Request object from the arguments in a checkid_* + * OpenID message + */ + function fromOpenIDRequest($request) + { + $obj = new Auth_OpenID_PAPE_Request(); + $args = $request->message->getArgs(Auth_OpenID_PAPE_NS_URI); + + if ($args === null || $args === array()) { + return null; + } + + $obj->parseExtensionArgs($args); + return $obj; + } + + /** + * Set the state of this request to be that expressed in these + * PAPE arguments + * + * @param args: The PAPE arguments without a namespace + */ + function parseExtensionArgs($args) + { + // preferred_auth_policies is a space-separated list of policy + // URIs + $this->preferred_auth_policies = array(); + + $policies_str = Auth_OpenID::arrayGet($args, 'preferred_auth_policies'); + if ($policies_str) { + foreach (explode(' ', $policies_str) as $uri) { + if (!in_array($uri, $this->preferred_auth_policies)) { + $this->preferred_auth_policies[] = $uri; + } + } + } + + // max_auth_age is base-10 integer number of seconds + $max_auth_age_str = Auth_OpenID::arrayGet($args, 'max_auth_age'); + if ($max_auth_age_str) { + $this->max_auth_age = Auth_OpenID::intval($max_auth_age_str); + } else { + $this->max_auth_age = null; + } + } + + /** + * Given a list of authentication policy URIs that a provider + * supports, this method returns the subsequence of those types + * that are preferred by the relying party. + * + * @param supported_types: A sequence of authentication policy + * type URIs that are supported by a provider + * + * @return array The sub-sequence of the supported types that are + * preferred by the relying party. This list will be ordered in + * the order that the types appear in the supported_types + * sequence, and may be empty if the provider does not prefer any + * of the supported authentication types. + */ + function preferredTypes($supported_types) + { + $result = array(); + + foreach ($supported_types as $st) { + if (in_array($st, $this->preferred_auth_policies)) { + $result[] = $st; + } + } + return $result; + } +} + +/** + * A Provider Authentication Policy response, sent from a provider to + * a relying party + */ +class Auth_OpenID_PAPE_Response extends Auth_OpenID_Extension { + + var $ns_alias = 'pape'; + var $ns_uri = Auth_OpenID_PAPE_NS_URI; + + function Auth_OpenID_PAPE_Response($auth_policies=null, $auth_time=null, + $nist_auth_level=null) + { + if ($auth_policies) { + $this->auth_policies = $auth_policies; + } else { + $this->auth_policies = array(); + } + + $this->auth_time = $auth_time; + $this->nist_auth_level = $nist_auth_level; + } + + /** + * Add a authentication policy to this response + * + * This method is intended to be used by the provider to add a + * policy that the provider conformed to when authenticating the + * user. + * + * @param policy_uri: The identifier for the preferred type of + * authentication. + */ + function addPolicyURI($policy_uri) + { + if (!in_array($policy_uri, $this->auth_policies)) { + $this->auth_policies[] = $policy_uri; + } + } + + /** + * Create an Auth_OpenID_PAPE_Response object from a successful + * OpenID library response. + * + * @param success_response $success_response A SuccessResponse + * from Auth_OpenID_Consumer::complete() + * + * @returns: A provider authentication policy response from the + * data that was supplied with the id_res response. + */ + function fromSuccessResponse($success_response) + { + $obj = new Auth_OpenID_PAPE_Response(); + + // PAPE requires that the args be signed. + $args = $success_response->getSignedNS(Auth_OpenID_PAPE_NS_URI); + + if ($args === null || $args === array()) { + return null; + } + + $result = $obj->parseExtensionArgs($args); + + if ($result === false) { + return null; + } else { + return $obj; + } + } + + /** + * Parse the provider authentication policy arguments into the + * internal state of this object + * + * @param args: unqualified provider authentication policy + * arguments + * + * @param strict: Whether to return false when bad data is + * encountered + * + * @return null The data is parsed into the internal fields of + * this object. + */ + function parseExtensionArgs($args, $strict=false) + { + $policies_str = Auth_OpenID::arrayGet($args, 'auth_policies'); + if ($policies_str && $policies_str != "none") { + $this->auth_policies = explode(" ", $policies_str); + } + + $nist_level_str = Auth_OpenID::arrayGet($args, 'nist_auth_level'); + if ($nist_level_str !== null) { + $nist_level = Auth_OpenID::intval($nist_level_str); + + if ($nist_level === false) { + if ($strict) { + return false; + } else { + $nist_level = null; + } + } + + if (0 <= $nist_level && $nist_level < 5) { + $this->nist_auth_level = $nist_level; + } else if ($strict) { + return false; + } + } + + $auth_time = Auth_OpenID::arrayGet($args, 'auth_time'); + if ($auth_time !== null) { + if (ereg(PAPE_TIME_VALIDATOR, $auth_time)) { + $this->auth_time = $auth_time; + } else if ($strict) { + return false; + } + } + } + + function getExtensionArgs() + { + $ns_args = array(); + if (count($this->auth_policies) > 0) { + $ns_args['auth_policies'] = implode(' ', $this->auth_policies); + } else { + $ns_args['auth_policies'] = 'none'; + } + + if ($this->nist_auth_level !== null) { + if (!in_array($this->nist_auth_level, range(0, 4), true)) { + return false; + } + $ns_args['nist_auth_level'] = strval($this->nist_auth_level); + } + + if ($this->auth_time !== null) { + if (!ereg(PAPE_TIME_VALIDATOR, $this->auth_time)) { + return false; + } + + $ns_args['auth_time'] = $this->auth_time; + } + + return $ns_args; + } +} + +?> \ No newline at end of file diff --git a/libs/Auth/OpenID/Parse.php b/libs/Auth/OpenID/Parse.php new file mode 100644 index 0000000..546f34f --- /dev/null +++ b/libs/Auth/OpenID/Parse.php @@ -0,0 +1,352 @@ + tags + * in the head of HTML or XHTML documents and parses out their + * attributes according to the OpenID spec. It is a liberal parser, + * but it requires these things from the data in order to work: + * + * - There must be an open tag + * + * - There must be an open tag inside of the tag + * + * - Only s that are found inside of the tag are parsed + * (this is by design) + * + * - The parser follows the OpenID specification in resolving the + * attributes of the link tags. This means that the attributes DO + * NOT get resolved as they would by an XML or HTML parser. In + * particular, only certain entities get replaced, and href + * attributes do not get resolved relative to a base URL. + * + * From http://openid.net/specs.bml: + * + * - The openid.server URL MUST be an absolute URL. OpenID consumers + * MUST NOT attempt to resolve relative URLs. + * + * - The openid.server URL MUST NOT include entities other than &, + * <, >, and ". + * + * The parser ignores SGML comments and . Both kinds + * of quoting are allowed for attributes. + * + * The parser deals with invalid markup in these ways: + * + * - Tag names are not case-sensitive + * + * - The tag is accepted even when it is not at the top level + * + * - The tag is accepted even when it is not a direct child of + * the tag, but a tag must be an ancestor of the + * tag + * + * - tags are accepted even when they are not direct children + * of the tag, but a tag must be an ancestor of the + * tag + * + * - If there is no closing tag for an open or tag, the + * remainder of the document is viewed as being inside of the + * tag. If there is no closing tag for a tag, the link tag is + * treated as a short tag. Exceptions to this rule are that + * closes and or closes + * + * - Attributes of the tag are not required to be quoted. + * + * - In the case of duplicated attribute names, the attribute coming + * last in the tag will be the value returned. + * + * - Any text that does not parse as an attribute within a link tag + * will be ignored. (e.g. will + * ignore pumpkin) + * + * - If there are more than one or tag, the parser only + * looks inside of the first one. + * + * - The contents of '; // Output the data $this->_outputData($data); } - + /** * Defined by Zend_ProgressBar_Adapter_Interface * @@ -119,17 +119,17 @@ class Zend_ProgressBar_Adapter_JsPush extends Zend_ProgressBar_Adapter 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 @@ -141,8 +141,8 @@ class Zend_ProgressBar_Adapter_JsPush extends Zend_ProgressBar_Adapter // for Internet Explorer. The
is required so Safari actually // executes the '; + if (isset($item->attributes['conditional']) + && !empty($item->attributes['conditional']) + && is_string($item->attributes['conditional'])) + { + $html = ''; + } + return $html; } @@ -439,6 +446,7 @@ class Zend_View_Helper_HeadScript extends Zend_View_Helper_Placeholder_Container $escapeEnd = ($useCdata) ? '//]]>' : '//-->'; $items = array(); + $this->getContainer()->ksort(); foreach ($this as $item) { if (!$this->_isValid($item)) { continue; diff --git a/libs/Zend/View/Helper/HeadStyle.php b/libs/Zend/View/Helper/HeadStyle.php index c7321ac..ba3e924 100644 --- a/libs/Zend/View/Helper/HeadStyle.php +++ b/libs/Zend/View/Helper/HeadStyle.php @@ -50,7 +50,7 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ * @var array */ protected $_mediaTypes = array( - 'all', 'aural', 'braille', 'handheld', 'print', + 'all', 'aural', 'braille', 'handheld', 'print', 'projection', 'screen', 'tty', 'tv' ); @@ -76,7 +76,7 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ * Constructor * * Set separator to PHP_EOL. - * + * * @return void */ public function __construct() @@ -84,11 +84,11 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ parent::__construct(); $this->setSeparator(PHP_EOL); } - + /** * Return headStyle object * - * Returns headStyle helper object; optionally, allows specifying + * Returns headStyle helper object; optionally, allows specifying * * @param string $content Stylesheet contents * @param string $placement Append, prepend, or set @@ -124,9 +124,9 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ * - offsetSetStyle($index, $content, $attributes = array()) * - prependStyle($content, $attributes = array()) * - setStyle($content, $attributes = array()) - * - * @param string $method - * @param array $args + * + * @param string $method + * @param array $args * @return void * @throws Zend_View_Exception When no $content provided or invalid method */ @@ -171,9 +171,9 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ /** * Determine if a value is a valid style tag - * - * @param mixed $value - * @param string $method + * + * @param mixed $value + * @param string $method * @return boolean */ protected function _isValid($value) @@ -190,8 +190,8 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ /** * Override append to enforce style creation - * - * @param mixed $value + * + * @param mixed $value * @return void */ public function append($value) @@ -203,12 +203,12 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ return $this->getContainer()->append($value); } - + /** * Override offsetSet to enforce style creation - * + * * @param string|int $index - * @param mixed $value + * @param mixed $value * @return void */ public function offsetSet($index, $value) @@ -223,8 +223,8 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ /** * Override prepend to enforce style creation - * - * @param mixed $value + * + * @param mixed $value * @return void */ public function prepend($value) @@ -239,8 +239,8 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ /** * Override set to enforce style creation - * - * @param mixed $value + * + * @param mixed $value * @return void */ public function set($value) @@ -255,9 +255,9 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ /** * Start capture action - * - * @param mixed $captureType - * @param string $typeOrAttrs + * + * @param mixed $captureType + * @param string $typeOrAttrs * @return void */ public function captureStart($type = Zend_View_Helper_Placeholder_Container_Abstract::APPEND, $attrs = null) @@ -272,10 +272,10 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ $this->_captureType = $type; ob_start(); } - + /** * End capture action and store - * + * * @return void */ public function captureEnd() @@ -301,9 +301,9 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ /** * Convert content and attributes into valid style tag - * + * * @param stdClass $item Item to render - * @param string $indent Indentation to use + * @param string $indent Indentation to use * @return string */ public function itemToString(stdClass $item, $indent) @@ -315,8 +315,20 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ continue; } if ('media' == $key) { - if (!in_array($value, $this->_mediaTypes)) { - continue; + if(false === strpos($value, ',')) { + if (!in_array($value, $this->_mediaTypes)) { + continue; + } + } else { + $media_types = explode(',', $value); + $value = ''; + foreach($media_types as $type) { + if (!in_array($type, $this->_mediaTypes)) { + continue; + } + $value .= $type .','; + } + $value = substr($value, 0, -1); } } $attrString .= sprintf(' %s="%s"', $key, htmlspecialchars($value)); @@ -327,13 +339,20 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ . $indent . '' . PHP_EOL . ''; + if (isset($item->attributes['conditional']) + && !empty($item->attributes['conditional']) + && is_string($item->attributes['conditional'])) + { + $html = ''; + } + return $html; } /** * Create string representation of placeholder - * - * @param string|int $indent + * + * @param string|int $indent * @return string */ public function toString($indent = null) @@ -343,6 +362,7 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ : $this->getIndent(); $items = array(); + $this->getContainer()->ksort(); foreach ($this as $item) { if (!$this->_isValid($item)) { continue; @@ -357,15 +377,17 @@ class Zend_View_Helper_HeadStyle extends Zend_View_Helper_Placeholder_Container_ /** * Create data item for use in stack - * - * @param string $content - * @param array $attributes + * + * @param string $content + * @param array $attributes * @return stdClass */ public function createData($content, array $attributes) { if (!isset($attributes['media'])) { $attributes['media'] = 'screen'; + } else if(is_array($attributes['media'])) { + $attributes['media'] = implode(',', $attributes['media']); } $data = new stdClass(); diff --git a/libs/Zend/View/Helper/HtmlList.php b/libs/Zend/View/Helper/HtmlList.php index b4ee4ad..cd41aec 100644 --- a/libs/Zend/View/Helper/HtmlList.php +++ b/libs/Zend/View/Helper/HtmlList.php @@ -58,14 +58,15 @@ class Zend_View_Helper_HtmlList extends Zend_View_Helper_FormElement foreach ($items as $item) { if (!is_array($item)) { if ($escape) { - $item = $this->view->escape($item); + $item = $this->view->escape($item); } - $list .= '
  • ' . $item . '
  • '; + $list .= '
  • ' . $item . '
  • ' . self::EOL; } else { - if (5 < strlen($list)) { - $list = substr($list, 0, strlen($list) - 5) . $this->htmlList($item, $ordered, $attribs, $escape) . ''; + if (6 < strlen($list)) { + $list = substr($list, 0, strlen($list) - 6) + . $this->htmlList($item, $ordered, $attribs, $escape) . '' . self::EOL; } else { - $list .= '
  • ' . $this->htmlList($item, $ordered, $attribs, $escape) . '
  • '; + $list .= '
  • ' . $this->htmlList($item, $ordered, $attribs, $escape) . '
  • ' . self::EOL; } } } @@ -81,6 +82,6 @@ class Zend_View_Helper_HtmlList extends Zend_View_Helper_FormElement $tag = 'ol'; } - return '<' . $tag . $attribs . '>' . $list . ''; + return '<' . $tag . $attribs . '>' . self::EOL . $list . '' . self::EOL; } } diff --git a/libs/Zend/View/Helper/Json.php b/libs/Zend/View/Helper/Json.php index 29ac608..aba7207 100644 --- a/libs/Zend/View/Helper/Json.php +++ b/libs/Zend/View/Helper/Json.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Json.php 10664 2008-08-05 10:56:06Z matthew $ + * @version $Id: Json.php 15113 2009-04-23 16:54:22Z matthew $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -43,14 +43,28 @@ class Zend_View_Helper_Json extends Zend_View_Helper_Abstract * Encode data as JSON, disable layouts, and set response header * * If $keepLayouts is true, does not disable layouts. - * - * @param mixed $data + * + * @param mixed $data * @param bool $keepLayouts + * NOTE: if boolean, establish $keepLayouts to true|false + * if array, admit params for Zend_Json::encode as enableJsonExprFinder=>true|false + * this array can contains a 'keepLayout'=>true|false + * that will not be passed to Zend_Json::encode method but will be used here * @return string|void */ public function json($data, $keepLayouts = false) { - $data = Zend_Json::encode($data); + $options = array(); + if (is_array($keepLayouts)) + { + $options = $keepLayouts; + $keepLayouts = (array_key_exists('keepLayouts', $keepLayouts)) + ? $keepLayouts['keepLayouts'] + : false; + unset($options['keepLayouts']); + } + + $data = Zend_Json::encode($data, null, $options); if (!$keepLayouts) { require_once 'Zend/Layout.php'; $layout = Zend_Layout::getMvcInstance(); diff --git a/libs/Zend/View/Helper/Navigation.php b/libs/Zend/View/Helper/Navigation.php new file mode 100644 index 0000000..6cdbd70 --- /dev/null +++ b/libs/Zend/View/Helper/Navigation.php @@ -0,0 +1,335 @@ +setContainer($container); + } + + return $this; + } + + /** + * Magic overload: Proxy to other navigation helpers or the container + * + * Examples of usage from a view script or layout: + * + * // proxy to Menu helper and render container: + * echo $this->navigation()->menu(); + * + * // proxy to Breadcrumbs helper and set indentation: + * $this->navigation()->breadcrumbs()->setIndent(8); + * + * // proxy to container and find all pages with 'blog' route: + * $blogPages = $this->navigation()->findAllByRoute('blog'); + * + * + * @param string $method helper name or method name in + * container + * @param array $arguments [optional] arguments to pass + * @return mixed returns what the proxied call returns + * @throws Zend_View_Exception if proxying to a helper, and the + * helper is not an instance of the + * interface specified in + * {@link findHelper()} + * @throws Zend_Navigation_Exception if method does not exist in container + */ + public function __call($method, array $arguments = array()) + { + // check if call should proxy to another helper + if ($helper = $this->findHelper($method, false)) { + return call_user_func_array(array($helper, $method), $arguments); + } + + // default behaviour: proxy call to container + return parent::__call($method, $arguments); + } + + /** + * Returns the helper matching $proxy + * + * The helper must implement the interface + * {@link Zend_View_Helper_Navigation_Helper}. + * + * @param string $proxy helper name + * @param bool $strict [optional] whether + * exceptions should be + * thrown if something goes + * wrong. Default is true. + * @return Zend_View_Helper_Navigation_Helper helper instance + * @throws Zend_Loader_PluginLoader_Exception if $strict is true and + * helper cannot be found + * @throws Zend_View_Exception if $strict is true and + * helper does not implement + * the specified interface + */ + public function findHelper($proxy, $strict = true) + { + if (isset($this->_helpers[$proxy])) { + return $this->_helpers[$proxy]; + } + + if (!$this->view->getPluginLoader('helper')->getPaths(self::NS)) { + $this->view->addHelperPath( + str_replace('_', '/', self::NS), + self::NS); + } + + if ($strict) { + $helper = $this->view->getHelper($proxy); + } else { + try { + $helper = $this->view->getHelper($proxy); + } catch (Zend_Loader_PluginLoader_Exception $e) { + return null; + } + } + + if (!$helper instanceof Zend_View_Helper_Navigation_Helper) { + if ($strict) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf( + 'Proxy helper "%s" is not an instance of ' . + 'Zend_View_Helper_Navigation_Helper', + get_class($helper))); + } + + return null; + } + + $this->_inject($helper); + $this->_helpers[$proxy] = $helper; + + return $helper; + } + + /** + * Injects container, ACL, and translator to the given $helper if this + * helper is configured to do so + * + * @param Zend_View_Helper_Navigation_Helper $helper helper instance + * @return void + */ + protected function _inject(Zend_View_Helper_Navigation_Helper $helper) + { + if ($this->getInjectContainer() && !$helper->hasContainer()) { + $helper->setContainer($this->getContainer()); + } + + if ($this->getInjectAcl()) { + if (!$helper->hasAcl()) { + $helper->setAcl($this->getAcl()); + } + if (!$helper->hasRole()) { + $helper->setRole($this->getRole()); + } + } + + if ($this->getInjectTranslator() && !$helper->hasTranslator()) { + $helper->setTranslator($this->getTranslator()); + } + } + + // Accessors: + + /** + * Sets the default proxy to use in {@link render()} + * + * @param string $proxy default proxy + * @return Zend_View_Helper_Navigation fluent interface, returns self + */ + public function setDefaultProxy($proxy) + { + $this->_defaultProxy = (string) $proxy; + return $this; + } + + /** + * Returns the default proxy to use in {@link render()} + * + * @return string the default proxy to use in {@link render()} + */ + public function getDefaultProxy() + { + return $this->_defaultProxy; + } + + /** + * Sets whether container should be injected when proxying + * + * @param bool $injectContainer [optional] whether container should + * be injected when proxying. Default + * is true. + * @return Zend_View_Helper_Navigation fluent interface, returns self + */ + public function setInjectContainer($injectContainer = true) + { + $this->_injectContainer = (bool) $injectContainer; + return $this; + } + + /** + * Returns whether container should be injected when proxying + * + * @return bool whether container should be injected when proxying + */ + public function getInjectContainer() + { + return $this->_injectContainer; + } + + /** + * Sets whether ACL should be injected when proxying + * + * @param bool $injectAcl [optional] whether ACL should be + * injected when proxying. Default is + * true. + * @return Zend_View_Helper_Navigation fluent interface, returns self + */ + public function setInjectAcl($injectAcl = true) + { + $this->_injectAcl = (bool) $injectAcl; + return $this; + } + + /** + * Returns whether ACL should be injected when proxying + * + * @return bool whether ACL should be injected when proxying + */ + public function getInjectAcl() + { + return $this->_injectAcl; + } + + /** + * Sets whether translator should be injected when proxying + * + * @param bool $injectTranslator [optional] whether translator should + * be injected when proxying. Default + * is true. + * @return Zend_View_Helper_Navigation fluent interface, returns self + */ + public function setInjectTranslator($injectTranslator = true) + { + $this->_injectTranslator = (bool) $injectTranslator; + return $this; + } + + /** + * Returns whether translator should be injected when proxying + * + * @return bool whether translator should be injected when proxying + */ + public function getInjectTranslator() + { + return $this->_injectTranslator; + } + + // Zend_View_Helper_Navigation_Helper: + + /** + * Renders helper + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to + * render the container + * registered in the helper. + * @return string helper output + * @throws Zend_Loader_PluginLoader_Exception if helper cannot be found + * @throws Zend_View_Exception if helper doesn't implement + * the interface specified in + * {@link findHelper()} + */ + public function render(Zend_Navigation_Container $container = null) + { + $helper = $this->findHelper($this->getDefaultProxy()); + return $helper->render($container); + } +} \ No newline at end of file diff --git a/libs/Zend/View/Helper/Navigation/Breadcrumbs.php b/libs/Zend/View/Helper/Navigation/Breadcrumbs.php new file mode 100644 index 0000000..dd634a7 --- /dev/null +++ b/libs/Zend/View/Helper/Navigation/Breadcrumbs.php @@ -0,0 +1,324 @@ +setContainer($container); + } + + return $this; + } + + // Accessors: + + /** + * Sets breadcrumb separator + * + * @param string $separator separator string + * @return Zend_View_Helper_Navigation_Breadcrumbs fluent interface, + * returns self + */ + public function setSeparator($separator) + { + if (is_string($separator)) { + $this->_separator = $separator; + } + + return $this; + } + + /** + * Returns breadcrumb separator + * + * @return string breadcrumb separator + */ + public function getSeparator() + { + return $this->_separator; + } + + /** + * Sets whether last page in breadcrumbs should be hyperlinked + * + * @param bool $linkLast whether last page should + * be hyperlinked + * @return Zend_View_Helper_Navigation_Breadcrumbs fluent interface, + * returns self + */ + public function setLinkLast($linkLast) + { + $this->_linkLast = (bool) $linkLast; + return $this; + } + + /** + * Returns whether last page in breadcrumbs should be hyperlinked + * + * @return bool whether last page in breadcrumbs should be hyperlinked + */ + public function getLinkLast() + { + return $this->_linkLast; + } + + /** + * Sets which partial view script to use for rendering menu + * + * @param string|array $partial partial view script or + * null. If an array is + * given, it is expected to + * contain two values; + * the partial view script + * to use, and the module + * where the script can be + * found. + * @return Zend_View_Helper_Navigation_Breadcrumbs fluent interface, + * returns self + */ + public function setPartial($partial) + { + if (null === $partial || is_string($partial) || is_array($partial)) { + $this->_partial = $partial; + } + + return $this; + } + + /** + * Returns partial view script to use for rendering menu + * + * @return string|array|null + */ + public function getPartial() + { + return $this->_partial; + } + + // Render methods: + + /** + * Renders breadcrumbs by chaining 'a' elements with the separator + * registered in the helper + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to + * render the container + * registered in the helper. + * @return string helper output + */ + public function renderStraight(Zend_Navigation_Container $container = null) + { + if (null === $container) { + $container = $this->getContainer(); + } + + // find deepest active + if (!$active = $this->findActive($container)) { + return ''; + } + + $active = $active['page']; + + // put the deepest active page last in breadcrumbs + if ($this->getLinkLast()) { + $html = $this->htmlify($active); + } else { + $html = $active->getLabel(); + if ($this->getUseTranslator() && $t = $this->getTranslator()) { + $html = $t->translate($html); + } + $html = $this->view->escape($html); + } + + // walk back to root + while ($parent = $active->getParent()) { + if ($parent instanceof Zend_Navigation_Page) { + // prepend crumb to html + $html = $this->htmlify($parent) + . $this->getSeparator() + . $html; + } + + if ($parent === $container) { + // at the root of the given container + break; + } + + $active = $parent; + } + + return strlen($html) ? $this->getIndent() . $html : ''; + } + + /** + * Renders the given $container by invoking the partial view helper + * + * The container will simply be passed on as a model to the view script, + * so in the script it will be available in $this->container. + * + * @param Zend_Navigation_Container $container [optional] container to + * pass to view script. + * Default is to use the + * container registered in the + * helper. + * @param string|array $partial [optional] partial view + * script to use. Default is + * to use the partial + * registered in the helper. + * If an array is given, it is + * expected to contain two + * values; the partial view + * script to use, and the + * module where the script can + * be found. + * @return string helper output + */ + public function renderPartial(Zend_Navigation_Container $container = null, + $partial = null) + { + if (null === $container) { + $container = $this->getContainer(); + } + + if (null === $partial) { + $partial = $this->getPartial(); + } + + if (empty($partial)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception( + 'Unable to render menu: No partial view script provided'); + } + + // put breadcrumb pages in model + $model = array('pages' => array()); + if ($active = $this->findActive($container)) { + $active = $active['page']; + $model['pages'][] = $active; + while ($parent = $active->getParent()) { + if ($parent instanceof Zend_Navigation_Page) { + $model['pages'][] = $parent; + } else { + break; + } + + if ($parent === $container) { + // break if at the root of the given container + break; + } + + $active = $parent; + } + $model['pages'] = array_reverse($model['pages']); + } + + if (is_array($partial)) { + if (count($partial) != 2) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception( + 'Unable to render menu: A view partial supplied as ' . + 'an array must contain two values: partial view ' . + 'script and module where script can be found'); + } + + return $this->view->partial($partial[0], $partial[1], $model); + } + + return $this->view->partial($partial, null, $model); + } + + // Zend_View_Helper_Navigation_Helper: + + /** + * Renders helper + * + * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to + * render the container + * registered in the helper. + * @return string helper output + */ + public function render(Zend_Navigation_Container $container = null) + { + if ($partial = $this->getPartial()) { + return $this->renderPartial($container, $partial); + } else { + return $this->renderStraight($container); + } + } +} \ No newline at end of file diff --git a/libs/Zend/View/Helper/Navigation/Helper.php b/libs/Zend/View/Helper/Navigation/Helper.php new file mode 100644 index 0000000..cad5c26 --- /dev/null +++ b/libs/Zend/View/Helper/Navigation/Helper.php @@ -0,0 +1,211 @@ +_container = $container; + return $this; + } + + /** + * Returns the navigation container helper operates on by default + * + * Implements {@link Zend_View_Helper_Navigation_Interface::getContainer()}. + * + * If a helper is not explicitly set in this helper instance by calling + * {@link setContainer()} or by passing it through the helper entry point, + * this method will look in {@link Zend_Registry} for a container by using + * the key 'Zend_Navigation'. + * + * If no container is set, and nothing is found in Zend_Registry, a new + * container will be instantiated and stored in the helper. + * + * @return Zend_Navigation_Container navigation container + */ + public function getContainer() + { + if (null === $this->_container) { + // try to fetch from registry first + require_once 'Zend/Registry.php'; + if (Zend_Registry::isRegistered('Zend_Navigation')) { + $nav = Zend_Registry::get('Zend_Navigation'); + if ($nav instanceof Zend_Navigation_Container) { + return $this->_container = $nav; + } + } + + // nothing found in registry, create new container + require_once 'Zend/Navigation.php'; + $this->_container = new Zend_Navigation(); + } + + return $this->_container; + } + + /** + * Sets the minimum depth a page must have to be included when rendering + * + * @param int $minDepth [optional] minimum + * depth. Default is + * null, which sets + * no minimum depth. + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setMinDepth($minDepth = null) + { + if (null === $minDepth || is_int($minDepth)) { + $this->_minDepth = $minDepth; + } else { + $this->_minDepth = (int) $minDepth; + } + return $this; + } + + /** + * Returns minimum depth a page must have to be included when rendering + * + * @return int|null minimum depth or null + */ + public function getMinDepth() + { + if (!is_int($this->_minDepth) || $this->_minDepth < 0) { + return 0; + } + return $this->_minDepth; + } + + /** + * Sets the maximum depth a page can have to be included when rendering + * + * @param int $maxDepth [optional] maximum + * depth. Default is + * null, which sets no + * maximum depth. + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setMaxDepth($maxDepth = null) + { + if (null === $maxDepth || is_int($maxDepth)) { + $this->_maxDepth = $maxDepth; + } else { + $this->_maxDepth = (int) $maxDepth; + } + return $this; + } + + /** + * Returns maximum depth a page can have to be included when rendering + * + * @return int|null maximum depth or null + */ + public function getMaxDepth() + { + return $this->_maxDepth; + } + + /** + * Set the indentation string for using in {@link render()}, optionally a + * number of spaces to indent with + * + * @param string|int $indent indentation string or + * number of spaces + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setIndent($indent) + { + $this->_indent = $this->_getWhitespace($indent); + return $this; + } + + /** + * Returns indentation + * + * @return string + */ + public function getIndent() + { + return $this->_indent; + } + + /** + * Sets translator to use in helper + * + * Implements {@link Zend_View_Helper_Navigation_Helper::setTranslator()}. + * + * @param mixed $translator [optional] translator. + * Expects an object of + * type + * {@link Zend_Translate_Adapter} + * or {@link Zend_Translate}, + * or null. Default is + * null, which sets no + * translator. + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + 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(); + } + + return $this; + } + + /** + * Returns translator used in helper + * + * Implements {@link Zend_View_Helper_Navigation_Helper::getTranslator()}. + * + * @return Zend_Translate_Adapter|null translator or 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 ACL to use when iterating pages + * + * Implements {@link Zend_View_Helper_Navigation_Helper::setAcl()}. + * + * @param Zend_Acl $acl [optional] ACL object. + * Default is null. + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setAcl(Zend_Acl $acl = null) + { + $this->_acl = $acl; + return $this; + } + + /** + * Returns ACL or null if it isn't set using {@link setAcl()} or + * {@link setDefaultAcl()} + * + * Implements {@link Zend_View_Helper_Navigation_Helper::getAcl()}. + * + * @return Zend_Acl|null ACL object or null + */ + public function getAcl() + { + if ($this->_acl === null && self::$_defaultAcl !== null) { + return self::$_defaultAcl; + } + + return $this->_acl; + } + + /** + * Sets ACL role(s) to use when iterating pages + * + * Implements {@link Zend_View_Helper_Navigation_Helper::setRole()}. + * + * @param mixed $role [optional] role to + * set. Expects a string, + * an instance of type + * {@link Zend_Acl_Role_Interface}, + * or null. Default is + * null, which will set + * no role. + * @throws Zend_View_Exception if $role is invalid + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setRole($role = null) + { + if (null === $role || is_string($role) || + $role instanceof Zend_Acl_Role_Interface) { + $this->_role = $role; + } else { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf( + '$role must be a string, null, or an instance of ' . + 'Zend_Acl_Role_Interface; %s given', + gettype($role))); + } + + return $this; + } + + /** + * Returns ACL role to use when iterating pages, or null if it isn't set + * using {@link setRole()} or {@link setDefaultRole()} + * + * Implements {@link Zend_View_Helper_Navigation_Helper::getRole()}. + * + * @return string|Zend_Acl_Role_Interface|null role or null + */ + public function getRole() + { + if ($this->_role === null && self::$_defaultRole !== null) { + return self::$_defaultRole; + } + + return $this->_role; + } + + /** + * Sets whether ACL should be used + * + * Implements {@link Zend_View_Helper_Navigation_Helper::setUseAcl()}. + * + * @param bool $useAcl [optional] whether ACL + * should be used. + * Default is true. + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setUseAcl($useAcl = true) + { + $this->_useAcl = (bool) $useAcl; + return $this; + } + + /** + * Returns whether ACL should be used + * + * Implements {@link Zend_View_Helper_Navigation_Helper::getUseAcl()}. + * + * @return bool whether ACL should be used + */ + public function getUseAcl() + { + return $this->_useAcl; + } + + /** + * Return renderInvisible flag + * + * @return bool + */ + public function getRenderInvisible() + { + return $this->_renderInvisible; + } + + /** + * Render invisible items? + * + * @param bool $renderInvisible [optional] boolean flag + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface + * returns self + */ + public function setRenderInvisible($renderInvisible = true) + { + $this->_renderInvisible = (bool) $renderInvisible; + return $this; + } + + /** + * Sets whether translator should be used + * + * Implements {@link Zend_View_Helper_Navigation_Helper::setUseTranslator()}. + * + * @param bool $useTranslator [optional] whether + * translator should be + * used. Default is true. + * @return Zend_View_Helper_Navigation_HelperAbstract fluent interface, + * returns self + */ + public function setUseTranslator($useTranslator = true) + { + $this->_useTranslator = (bool) $useTranslator; + return $this; + } + + /** + * Returns whether translator should be used + * + * Implements {@link Zend_View_Helper_Navigation_Helper::getUseTranslator()}. + * + * @return bool whether translator should be used + */ + public function getUseTranslator() + { + return $this->_useTranslator; + } + + // Magic overloads: + + /** + * Magic overload: Proxy calls to the navigation container + * + * @param string $method method name in container + * @param array $arguments [optional] arguments to pass + * @return mixed returns what the container returns + * @throws Zend_Navigation_Exception if method does not exist in container + */ + public function __call($method, array $arguments = array()) + { + return call_user_func_array( + array($this->getContainer(), $method), + $arguments); + } + + /** + * Magic overload: Proxy to {@link render()}. + * + * This method will trigger an E_USER_ERROR if rendering the helper causes + * an exception to be thrown. + * + * Implements {@link Zend_View_Helper_Navigation_Helper::__toString()}. + * + * @return string + */ + public function __toString() + { + try { + return $this->render(); + } catch (Exception $e) { + $msg = get_class($e) . ': ' . $e->getMessage(); + trigger_error($msg, E_USER_ERROR); + return ''; + } + } + + // Public methods: + + /** + * Finds the deepest active page in the given container + * + * @param Zend_Navigation_Container $container container to search + * @param int|null $minDepth [optional] minimum depth + * required for page to be + * valid. Default is to use + * {@link getMinDepth()}. A + * null value means no minimum + * depth required. + * @param int|null $minDepth [optional] maximum depth + * a page can have to be + * valid. Default is to use + * {@link getMaxDepth()}. A + * null value means no maximum + * depth required. + * @return array an associative array with + * the values 'depth' and + * 'page', or an empty array + * if not found + */ + public function findActive(Zend_Navigation_Container $container, + $minDepth = null, + $maxDepth = -1) + { + if (!is_int($minDepth)) { + $minDepth = $this->getMinDepth(); + } + if ((!is_int($maxDepth) || $maxDepth < 0) && null !== $maxDepth) { + $maxDepth = $this->getMaxDepth(); + } + + $found = null; + $foundDepth = -1; + $iterator = new RecursiveIteratorIterator($container, + RecursiveIteratorIterator::CHILD_FIRST); + + foreach ($iterator as $page) { + $currDepth = $iterator->getDepth(); + if ($currDepth < $minDepth || !$this->accept($page)) { + // page is not accepted + continue; + } + + if ($page->isActive(false) && $currDepth > $foundDepth) { + // found an active page at a deeper level than before + $found = $page; + $foundDepth = $currDepth; + } + } + + if (is_int($maxDepth) && $foundDepth > $maxDepth) { + while ($foundDepth > $maxDepth) { + if (--$foundDepth < $minDepth) { + $found = null; + break; + } + + $found = $found->getParent(); + if (!$found instanceof Zend_Navigation_Page) { + $found = null; + break; + } + } + } + + if ($found) { + return array('page' => $found, 'depth' => $foundDepth); + } else { + return array(); + } + } + + /** + * Checks if the helper has a container + * + * Implements {@link Zend_View_Helper_Navigation_Helper::hasContainer()}. + * + * @return bool whether the helper has a container or not + */ + public function hasContainer() + { + return null !== $this->_container; + } + + /** + * Checks if the helper has an ACL instance + * + * Implements {@link Zend_View_Helper_Navigation_Helper::hasAcl()}. + * + * @return bool whether the helper has a an ACL instance or not + */ + public function hasAcl() + { + return null !== $this->_acl; + } + + /** + * Checks if the helper has an ACL role + * + * Implements {@link Zend_View_Helper_Navigation_Helper::hasRole()}. + * + * @return bool whether the helper has a an ACL role or not + */ + public function hasRole() + { + return null !== $this->_role; + } + + /** + * Checks if the helper has a translator + * + * Implements {@link Zend_View_Helper_Navigation_Helper::hasTranslator()}. + * + * @return bool whether the helper has a translator or not + */ + public function hasTranslator() + { + return null !== $this->_translator; + } + + /** + * Returns an HTML string containing an 'a' element for the given page + * + * @param Zend_Navigation_Page $page page to generate HTML for + * @return string HTML string for the given page + */ + public function htmlify(Zend_Navigation_Page $page) + { + // get label and title for translating + $label = $page->getLabel(); + $title = $page->getTitle(); + + if ($this->getUseTranslator() && $t = $this->getTranslator()) { + if (is_string($label) && !empty($label)) { + $label = $t->translate($label); + } + if (is_string($title) && !empty($title)) { + $title = $t->translate($title); + } + } + + // get attribs for anchor element + $attribs = array( + 'id' => $page->getId(), + 'title' => $title, + 'class' => $page->getClass(), + 'href' => $page->getHref(), + 'target' => $page->getTarget() + ); + + return '_htmlAttribs($attribs) . '>' + . $this->view->escape($label) + . ''; + } + + // Iterator filter methods: + + /** + * Determines whether a page should be accepted when iterating + * + * Rules: + * - If a page is not visible it is not accepted, unless RenderInvisible has + * been set to true. + * - If helper has no ACL, page is accepted + * - If helper has ACL, but no role, page is not accepted + * - If helper has ACL and role: + * - Page is accepted if it has no resource or privilege + * - Page is accepted if ACL allows page's resource or privilege + * - If page is accepted by the rules above and $recursive is true, the page + * will not be accepted if it is the descendant of a non-accepted page. + * + * @param Zend_Navigation_Page $page page to check + * @param bool $recursive [optional] if true, page will not + * be accepted if it is the + * descendant of a page that is not + * accepted. Default is true. + * @return bool whether page should be accepted + */ + public function accept(Zend_Navigation_Page $page, $recursive = true) + { + // accept by default + $accept = true; + + if (!$page->isVisible(false) && !$this->getRenderInvisible()) { + // don't accept invisible pages + $accept = false; + } elseif ($this->getUseAcl() && !$this->_acceptAcl($page)) { + // acl is not amused + $accept = false; + } + + if ($accept && $recursive) { + $parent = $page->getParent(); + if ($parent instanceof Zend_Navigation_Page) { + $accept = $this->accept($parent, true); + } + } + + return $accept; + } + + /** + * Determines whether a page should be accepted by ACL when iterating + * + * Rules: + * - If helper has no ACL, page is accepted + * - If page has a resource or privilege defined, page is accepted + * if the ACL allows access to it using the helper's role + * - If page has no resource or privilege, page is accepted + * + * @param Zend_Navigation_Page $page page to check + * @return bool whether page is accepted by ACL + */ + protected function _acceptAcl(Zend_Navigation_Page $page) + { + if (!$acl = $this->getAcl()) { + // no acl registered means don't use acl + return true; + } + + $role = $this->getRole(); + $resource = $page->getResource(); + $privilege = $page->getPrivilege(); + + if ($resource || $privilege) { + // determine using helper role and page resource/privilege + return $acl->isAllowed($role, $resource, $privilege); + } + + return true; + } + + // Util methods: + + /** + * Retrieve whitespace representation of $indent + * + * @param int|string $indent + * @return string + */ + protected function _getWhitespace($indent) + { + if (is_int($indent)) { + $indent = str_repeat(' ', $indent); + } + + return (string) $indent; + } + + /** + * Converts an associative array to a string of tag attributes. + * + * Overloads {@link Zend_View_Helper_HtmlElement::_htmlAttribs()}. + * + * @param array $attribs an array where each key-value pair is converted + * to an attribute name and value + * @return string an attribute string + */ + protected function _htmlAttribs($attribs) + { + // filter out null values and empty string values + foreach ($attribs as $key => $value) { + if ($value === null || (is_string($value) && !strlen($value))) { + unset($attribs[$key]); + } + } + + return parent::_htmlAttribs($attribs); + } + + /** + * Normalize an ID + * + * Overrides {@link Zend_View_Helper_HtmlElement::_normalizeId()}. + * + * @param string $value + * @return string + */ + protected function _normalizeId($value) + { + $prefix = get_class($this); + $prefix = strtolower(trim(substr($prefix, strrpos($prefix, '_')), '_')); + + return $prefix . '-' . $value; + } + + // Static methods: + + /** + * Sets default ACL to use if another ACL is not explicitly set + * + * @param Zend_Acl $acl [optional] ACL object. Default is null, which + * sets no ACL object. + * @return void + */ + public static function setDefaultAcl(Zend_Acl $acl = null) + { + self::$_defaultAcl = $acl; + } + + /** + * Sets default ACL role(s) to use when iterating pages if not explicitly + * set later with {@link setRole()} + * + * @param midex $role [optional] role to set. Expects null, + * string, or an instance of + * {@link Zend_Acl_Role_Interface}. + * Default is null, which sets no default + * role. + * @throws Zend_View_Exception if role is invalid + * @return void + */ + public static function setDefaultRole($role = null) + { + if (null === $role || + is_string($role) || + $role instanceof Zend_Acl_Role_Interface) { + self::$_defaultRole = $role; + } else { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception( + '$role must be null|string|Zend_Acl_Role_Interface'); + } + } +} \ No newline at end of file diff --git a/libs/Zend/View/Helper/Navigation/Links.php b/libs/Zend/View/Helper/Navigation/Links.php new file mode 100644 index 0000000..02636b2 --- /dev/null +++ b/libs/Zend/View/Helper/Navigation/Links.php @@ -0,0 +1,778 @@ + elements + * + * @category Zend + * @package Zend_View + * @subpackage 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_View_Helper_Navigation_Links + extends Zend_View_Helper_Navigation_HelperAbstract +{ + /**#@+ + * Constants used for specifying which link types to find and render + * + * @var int + */ + const RENDER_ALTERNATE = 0x0001; + const RENDER_STYLESHEET = 0x0002; + const RENDER_START = 0x0004; + const RENDER_NEXT = 0x0008; + const RENDER_PREV = 0x0010; + const RENDER_CONTENTS = 0x0020; + const RENDER_INDEX = 0x0040; + const RENDER_GLOSSARY = 0x0080; + const RENDER_COPYRIGHT = 0x0100; + const RENDER_CHAPTER = 0x0200; + const RENDER_SECTION = 0x0400; + const RENDER_SUBSECTION = 0x0800; + const RENDER_APPENDIX = 0x1000; + const RENDER_HELP = 0x2000; + const RENDER_BOOKMARK = 0x4000; + const RENDER_CUSTOM = 0x8000; + const RENDER_ALL = 0xffff; + /**#@+**/ + + /** + * Maps render constants to W3C link types + * + * @var array + */ + protected static $_RELATIONS = array( + self::RENDER_ALTERNATE => 'alternate', + self::RENDER_STYLESHEET => 'stylesheet', + self::RENDER_START => 'start', + self::RENDER_NEXT => 'next', + self::RENDER_PREV => 'prev', + self::RENDER_CONTENTS => 'contents', + self::RENDER_INDEX => 'index', + self::RENDER_GLOSSARY => 'glossary', + self::RENDER_COPYRIGHT => 'copyright', + self::RENDER_CHAPTER => 'chapter', + self::RENDER_SECTION => 'section', + self::RENDER_SUBSECTION => 'subsection', + self::RENDER_APPENDIX => 'appendix', + self::RENDER_HELP => 'help', + self::RENDER_BOOKMARK => 'bookmark' + ); + + /** + * The helper's render flag + * + * @see render() + * @see setRenderFlag() + * @var int + */ + protected $_renderFlag = self::RENDER_ALL; + + /** + * Root container + * + * Used for preventing methods to traverse above the container given to + * the {@link render()} method. + * + * @see _findRoot() + * + * @var Zend_Navigation_Container + */ + protected $_root; + + /** + * View helper entry point: + * Retrieves helper and optionally sets container to operate on + * + * @param Zend_Navigation_Container $container [optional] container to + * operate on + * @return Zend_View_Helper_Navigation_Links fluent interface, returns + * self + */ + public function links(Zend_Navigation_Container $container = null) + { + if (null !== $container) { + $this->setContainer($container); + } + + return $this; + } + + /** + * Magic overload: Proxy calls to {@link findRelation()} or container + * + * Examples of finder calls: + * + * // METHOD // SAME AS + * $h->findRelNext($page); // $h->findRelation($page, 'rel', 'next') + * $h->findRevSection($page); // $h->findRelation($page, 'rev', 'section'); + * $h->findRelFoo($page); // $h->findRelation($page, 'rel', 'foo'); + * + * + * @param string $method method name + * @param array $arguments method arguments + * @throws Zend_Navigation_Exception if method does not exist in container + */ + public function __call($method, array $arguments = array()) + { + if (@preg_match('/find(Rel|Rev)(.+)/', $method, $match)) { + return $this->findRelation($arguments[0], + strtolower($match[1]), + strtolower($match[2])); + } + + return parent::__call($method, $arguments); + } + + // Accessors: + + /** + * Sets the helper's render flag + * + * The helper uses the bitwise '&' operator against the hex values of the + * render constants. This means that the flag can is "bitwised" value of + * the render constants. Examples: + * + * // render all links except glossary + * $flag = Zend_View_Helper_Navigation_Links:RENDER_ALL ^ + * Zend_View_Helper_Navigation_Links:RENDER_GLOSSARY; + * $helper->setRenderFlag($flag); + * + * // render only chapters and sections + * $flag = Zend_View_Helper_Navigation_Links:RENDER_CHAPTER | + * Zend_View_Helper_Navigation_Links:RENDER_SECTION; + * $helper->setRenderFlag($flag); + * + * // render only relations that are not native W3C relations + * $helper->setRenderFlag(Zend_View_Helper_Navigation_Links:RENDER_CUSTOM); + * + * // render all relations (default) + * $helper->setRenderFlag(Zend_View_Helper_Navigation_Links:RENDER_ALL); + * + * + * Note that custom relations can also be rendered directly using the + * {@link renderLink()} method. + * + * @param int $renderFlag render flag + * @return Zend_View_Helper_Navigation_Links fluent interface, returns self + */ + public function setRenderFlag($renderFlag) + { + $this->_renderFlag = (int) $renderFlag; + return $this; + } + + /** + * Returns the helper's render flag + * + * @return int render flag + */ + public function getRenderFlag() + { + return $this->_renderFlag; + } + + // Finder methods: + + /** + * Finds all relations (forward and reverse) for the given $page + * + * The form of the returned array: + * + * // $page denotes an instance of Zend_Navigation_Page + * $returned = array( + * 'rel' => array( + * 'alternate' => array($page, $page, $page), + * 'start' => array($page), + * 'next' => array($page), + * 'prev' => array($page), + * 'canonical' => array($page) + * ), + * 'rev' => array( + * 'section' => array($page) + * ) + * ); + * + * + * @param Zend_Navigation_Page $page page to find links for + * @return array related pages + */ + public function findAllRelations(Zend_Navigation_Page $page, + $flag = null) + { + if (!is_int($flag)) { + $flag = self::RENDER_ALL; + } + + $result = array('rel' => array(), 'rev' => array()); + $native = array_values(self::$_RELATIONS); + + foreach (array_keys($result) as $rel) { + $meth = 'getDefined' . ucfirst($rel); + $types = array_merge($native, array_diff($page->$meth(), $native)); + + foreach ($types as $type) { + if (!$relFlag = array_search($type, self::$_RELATIONS)) { + $relFlag = self::RENDER_CUSTOM; + } + if (!($flag & $relFlag)) { + continue; + } + if ($found = $this->findRelation($page, $rel, $type)) { + if (!is_array($found)) { + $found = array($found); + } + $result[$rel][$type] = $found; + } + } + } + + return $result; + } + + /** + * Finds relations of the given $rel=$type from $page + * + * This method will first look for relations in the page instance, then + * by searching the root container if nothing was found in the page. + * + * @param Zend_Navigation_Page $page page to find relations for + * @param string $rel relation, "rel" or "rev" + * @param string $type link type, e.g. 'start', 'next' + * @return Zend_Navigaiton_Page|array|null page(s), or null if not found + * @throws Zend_View_Exception if $rel is not "rel" or "rev" + */ + public function findRelation(Zend_Navigation_Page $page, $rel, $type) + { + if (!in_array($rel, array('rel', 'rev'))) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf( + 'Invalid argument: $rel must be "rel" or "rev"; "%s" given', + $rel)); + } + + if (!$result = $this->_findFromProperty($page, $rel, $type)) { + $result = $this->_findFromSearch($page, $rel, $type); + } + + return $result; + } + + /** + * Finds relations of given $type for $page by checking if the + * relation is specified as a property of $page + * + * @param Zend_Navigation_Page $page page to find relations for + * @param string $rel relation, 'rel' or 'rev' + * @param string $type link type, e.g. 'start', 'next' + * @return Zend_Navigation_Page|array|null page(s), or null if not found + */ + protected function _findFromProperty(Zend_Navigation_Page $page, $rel, $type) + { + $method = 'get' . ucfirst($rel); + if ($result = $page->$method($type)) { + if ($result = $this->_convertToPages($result)) { + if (!is_array($result)) { + $result = array($result); + } + + foreach ($result as $key => $page) { + if (!$this->accept($page)) { + unset($result[$key]); + } + } + + return count($result) == 1 ? $result[0] : $result; + } + } + + return null; + } + + /** + * Finds relations of given $rel=$type for $page by using the helper to + * search for the relation in the root container + * + * @param Zend_Navigation_Page $page page to find relations for + * @param string $rel relation, 'rel' or 'rev' + * @param string $type link type, e.g. 'start', 'next', etc + * @return array|null array of pages, or null if not found + */ + protected function _findFromSearch(Zend_Navigation_Page $page, $rel, $type) + { + $found = null; + + $method = 'search' . ucfirst($rel) . ucfirst($type); + if (method_exists($this, $method)) { + $found = $this->$method($page); + } + + return $found; + } + + // Search methods: + + /** + * Searches the root container for the forward 'start' relation of the given + * $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to the first document in a collection of documents. This link type + * tells search engines which document is considered by the author to be the + * starting point of the collection. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|null page or null + */ + public function searchRelStart(Zend_Navigation_Page $page) + { + $found = $this->_findRoot($page); + if (!$found instanceof Zend_Navigation_Page) { + $found->rewind(); + $found = $found->current(); + } + + if ($found === $page || !$this->accept($found)) { + $found = null; + } + + return $found; + } + + /** + * Searches the root container for the forward 'next' relation of the given + * $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to the next document in a linear sequence of documents. User + * agents may choose to preload the "next" document, to reduce the perceived + * load time. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|null page(s) or null + */ + public function searchRelNext(Zend_Navigation_Page $page) + { + $found = null; + $break = false; + $iterator = new RecursiveIteratorIterator($this->_findRoot($page), + RecursiveIteratorIterator::SELF_FIRST); + foreach ($iterator as $intermediate) { + if ($intermediate === $page) { + // current page; break at next accepted page + $break = true; + continue; + } + + if ($break && $this->accept($intermediate)) { + $found = $intermediate; + break; + } + } + + return $found; + } + + /** + * Searches the root container for the forward 'prev' relation of the given + * $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to the previous document in an ordered series of documents. Some + * user agents also support the synonym "Previous". + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|null page or null + */ + public function searchRelPrev(Zend_Navigation_Page $page) + { + $found = null; + $prev = null; + $iterator = new RecursiveIteratorIterator( + $this->_findRoot($page), + RecursiveIteratorIterator::SELF_FIRST); + foreach ($iterator as $intermediate) { + if (!$this->accept($intermediate)) { + continue; + } + if ($intermediate === $page) { + $found = $prev; + break; + } + + $prev = $intermediate; + } + + return $found; + } + + /** + * Searches the root container for forward 'chapter' relations of the given + * $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to a document serving as a chapter in a collection of documents. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|array|null page(s) or null + */ + public function searchRelChapter(Zend_Navigation_Page $page) + { + $found = array(); + + // find first level of pages + $root = $this->_findRoot($page); + + // find start page(s) + $start = $this->findRelation($page, 'rel', 'start'); + if (!is_array($start)) { + $start = array($start); + } + + foreach ($root as $chapter) { + // exclude self and start page from chapters + if ($chapter !== $page && + !in_array($chapter, $start) && + $this->accept($chapter)) { + $found[] = $chapter; + } + } + + switch (count($found)) { + case 0: + return null; + case 1: + return $found[0]; + default: + return $found; + } + } + + /** + * Searches the root container for forward 'section' relations of the given + * $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to a document serving as a section in a collection of documents. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|array|null page(s) or null + */ + public function searchRelSection(Zend_Navigation_Page $page) + { + $found = array(); + + // check if given page has pages and is a chapter page + if ($page->hasPages() && $this->_findRoot($page)->hasPage($page)) { + foreach ($page as $section) { + if ($this->accept($section)) { + $found[] = $section; + } + } + } + + switch (count($found)) { + case 0: + return null; + case 1: + return $found[0]; + default: + return $found; + } + } + + /** + * Searches the root container for forward 'subsection' relations of the + * given $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to a document serving as a subsection in a collection of + * documents. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|array|null page(s) or null + */ + public function searchRelSubsection(Zend_Navigation_Page $page) + { + $found = array(); + + if ($page->hasPages()) { + // given page has child pages, loop chapters + foreach ($this->_findRoot($page) as $chapter) { + // is page a section? + if ($chapter->hasPage($page)) { + foreach ($page as $subsection) { + if ($this->accept($subsection)) { + $found[] = $subsection; + } + } + } + } + } + + switch (count($found)) { + case 0: + return null; + case 1: + return $found[0]; + default: + return $found; + } + } + + /** + * Searches the root container for the reverse 'section' relation of the + * given $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to a document serving as a section in a collection of documents. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|null page(s) or null + */ + public function searchRevSection(Zend_Navigation_Page $page) + { + $found = null; + + if ($parent = $page->getParent()) { + if ($parent instanceof Zend_Navigation_Page && + $this->_findRoot($page)->hasPage($parent)) { + $found = $parent; + } + } + + return $found; + } + + /** + * Searches the root container for the reverse 'section' relation of the + * given $page + * + * From {@link http://www.w3.org/TR/html4/types.html#type-links}: + * Refers to a document serving as a subsection in a collection of + * documents. + * + * @param Zend_Navigation_Page $page page to find relation for + * @return Zend_Navigation_Page|null page(s) or null + */ + public function searchRevSubsection(Zend_Navigation_Page $page) + { + $found = null; + + if ($parent = $page->getParent()) { + if ($parent instanceof Zend_Navigation_Page) { + $root = $this->_findRoot($page); + foreach ($root as $chapter) { + if ($chapter->hasPage($parent)) { + $found = $parent; + break; + } + } + } + } + + return $found; + } + + // Util methods: + + /** + * Returns the root container of the given page + * + * When rendering a container, the render method still store the given + * container as the root container, and unset it when done rendering. This + * makes sure finder methods will not traverse above the container given + * to the render method. + * + * @param Zend_Navigaiton_Page $page page to find root for + * @return Zend_Navigation_Container the root container of the given page + */ + protected function _findRoot(Zend_Navigation_Page $page) + { + if ($this->_root) { + return $this->_root; + } + + $root = $page; + + while ($parent = $page->getParent()) { + $root = $parent; + if ($parent instanceof Zend_Navigation_Page) { + $page = $parent; + } else { + break; + } + } + + return $root; + } + + /** + * Converts a $mixed value to an array of pages + * + * @param mixed $mixed mixed value to get page(s) from + * @param bool $recursive whether $value should be looped + * if it is an array or a config + * @return Zend_Navigation_Page|array|null empty if unable to convert + */ + protected function _convertToPages($mixed, $recursive = true) + { + if (is_object($mixed)) { + if ($mixed instanceof Zend_Navigation_Page) { + // value is a page instance; return directly + return $mixed; + } elseif ($mixed instanceof Zend_Navigation_Container) { + // value is a container; return pages in it + $pages = array(); + foreach ($mixed as $page) { + $pages[] = $page; + } + return $pages; + } elseif ($mixed instanceof Zend_Config) { + // convert config object to array and extract + return $this->_convertToPages($mixed->toArray(), $recursive); + } + } elseif (is_string($mixed)) { + // value is a string; make an URI page + return Zend_Navigation_Page::factory(array( + 'type' => 'uri', + 'uri' => $mixed + )); + } elseif (is_array($mixed) && !empty($mixed)) { + if ($recursive && is_numeric(key($mixed))) { + // first key is numeric; assume several pages + $pages = array(); + foreach ($mixed as $value) { + if ($value = $this->_convertToPages($value, false)) { + $pages[] = $value; + } + } + return $pages; + } else { + // pass array to factory directly + try { + $page = Zend_Navigation_Page::factory($mixed); + return $page; + } catch (Exception $e) { + } + } + } + + // nothing found + return null; + } + + // Render methods: + + /** + * Renders the given $page as a link element, with $attrib = $relation + * + * @param Zend_Navigation_Page $page the page to render the link for + * @param string $attrib the attribute to use for $type, + * either 'rel' or 'rev' + * @param string $relation relation type, muse be one of; + * alternate, appendix, bookmark, + * chapter, contents, copyright, + * glossary, help, home, index, next, + * prev, section, start, stylesheet, + * subsection + * @return string rendered link element + * @throws Zend_View_Exception if $attrib is invalid + */ + public function renderLink(Zend_Navigation_Page $page, $attrib, $relation) + { + if (!in_array($attrib, array('rel', 'rev'))) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf( + 'Invalid relation attribute "%s", must be "rel" or "rev"', + $attrib)); + } + + if (!$href = $page->getHref()) { + return ''; + } + + // TODO: add more attribs + // http://www.w3.org/TR/html401/struct/links.html#h-12.2 + $attribs = array( + $attrib => $relation, + 'href' => $href, + 'title' => $page->getLabel() + ); + + return '_htmlAttribs($attribs) . + $this->getClosingBracket(); + } + + // Zend_View_Helper_Navigation_Helper: + + /** + * Renders helper + * + * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to + * render the container + * registered in the helper. + * @return string helper output + */ + public function render(Zend_Navigation_Container $container = null) + { + if (null === $container) { + $container = $this->getContainer(); + } + + if ($active = $this->findActive($container)) { + $active = $active['page']; + } else { + // no active page + return ''; + } + + $output = ''; + $indent = $this->getIndent(); + $this->_root = $container; + + $result = $this->findAllRelations($active, $this->getRenderFlag()); + foreach ($result as $attrib => $types) { + foreach ($types as $relation => $pages) { + foreach ($pages as $page) { + if ($r = $this->renderLink($page, $attrib, $relation)) { + $output .= $indent . $r . self::EOL; + } + } + } + } + + $this->_root = null; + + // return output (trim last newline by spec) + return strlen($output) ? rtrim($output, self::EOL) : ''; + } +} \ No newline at end of file diff --git a/libs/Zend/View/Helper/Navigation/Menu.php b/libs/Zend/View/Helper/Navigation/Menu.php new file mode 100644 index 0000000..7a87434 --- /dev/null +++ b/libs/Zend/View/Helper/Navigation/Menu.php @@ -0,0 +1,639 @@ +setContainer($container); + } + + return $this; + } + + // Accessors: + + /** + * Sets CSS class to use for the first 'ul' element when rendering + * + * @param string $ulClass CSS class to set + * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self + */ + public function setUlClass($ulClass) + { + if (is_string($ulClass)) { + $this->_ulClass = $ulClass; + } + + return $this; + } + + /** + * Returns CSS class to use for the first 'ul' element when rendering + * + * @return string CSS class + */ + public function getUlClass() + { + return $this->_ulClass; + } + + /** + * Sets a flag indicating whether only active branch should be rendered + * + * @param bool $flag [optional] render only active + * branch. Default is true. + * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self + */ + public function setOnlyActiveBranch($flag = true) + { + $this->_onlyActiveBranch = (bool) $flag; + return $this; + } + + /** + * Returns a flag indicating whether only active branch should be rendered + * + * By default, this value is false, meaning the entire menu will be + * be rendered. + * + * @return bool whether only active branch should be rendered + */ + public function getOnlyActiveBranch() + { + return $this->_onlyActiveBranch; + } + + /** + * Enables/disables rendering of parents when only rendering active branch + * + * See {@link setOnlyActiveBranch()} for more information. + * + * @param bool $flag [optional] render parents when + * rendering active branch. + * Default is true. + * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self + */ + public function setRenderParents($flag = true) + { + $this->_renderParents = (bool) $flag; + return $this; + } + + /** + * Returns flag indicating whether parents should be rendered when rendering + * only the active branch + * + * By default, this value is true. + * + * @return bool whether parents should be rendered + */ + public function getRenderParents() + { + return $this->_renderParents; + } + + /** + * Sets which partial view script to use for rendering menu + * + * @param string|array $partial partial view script or null. If + * an array is given, it is + * expected to contain two values; + * the partial view script to use, + * and the module where the script + * can be found. + * @return Zend_View_Helper_Navigation_Menu fluent interface, returns self + */ + public function setPartial($partial) + { + if (null === $partial || is_string($partial) || is_array($partial)) { + $this->_partial = $partial; + } + + return $this; + } + + /** + * Returns partial view script to use for rendering menu + * + * @return string|array|null + */ + public function getPartial() + { + return $this->_partial; + } + + // Public methods: + + /** + * Returns an HTML string containing an 'a' element for the given page if + * the page's href is not empty, and a 'span' element if it is empty + * + * Overrides {@link Zend_View_Helper_Navigation_Abstract::htmlify()}. + * + * @param Zend_Navigation_Page $page page to generate HTML for + * @return string HTML string for the given page + */ + public function htmlify(Zend_Navigation_Page $page) + { + // get label and title for translating + $label = $page->getLabel(); + $title = $page->getTitle(); + + // translate label and title? + if ($this->getUseTranslator() && $t = $this->getTranslator()) { + if (is_string($label) && !empty($label)) { + $label = $t->translate($label); + } + if (is_string($title) && !empty($title)) { + $title = $t->translate($title); + } + } + + // get attribs for element + $attribs = array( + 'id' => $page->getId(), + 'title' => $title, + 'class' => $page->getClass() + ); + + // does page have a href? + if ($href = $page->getHref()) { + $element = 'a'; + $attribs['href'] = $href; + $attribs['target'] = $page->getTarget(); + } else { + $element = 'span'; + } + + return '<' . $element . $this->_htmlAttribs($attribs) . '>' + . $this->view->escape($label) + . ''; + } + + /** + * Normalizes given render options + * + * @param array $options [optional] options to normalize + * @return array normalized options + */ + protected function _normalizeOptions(array $options = array()) + { + if (isset($options['indent'])) { + $options['indent'] = $this->_getWhitespace($options['indent']); + } else { + $options['indent'] = $this->getIndent(); + } + + if (isset($options['ulClass']) && $options['ulClass'] !== null) { + $options['ulClass'] = (string) $options['ulClass']; + } else { + $options['ulClass'] = $this->getUlClass(); + } + + if (array_key_exists('minDepth', $options)) { + if (null !== $options['minDepth']) { + $options['minDepth'] = (int) $options['minDepth']; + } + } else { + $options['minDepth'] = $this->getMinDepth(); + } + + if ($options['minDepth'] < 0 || $options['minDepth'] === null) { + $options['minDepth'] = 0; + } + + if (array_key_exists('maxDepth', $options)) { + if (null !== $options['maxDepth']) { + $options['maxDepth'] = (int) $options['maxDepth']; + } + } else { + $options['maxDepth'] = $this->getMaxDepth(); + } + + if (!isset($options['onlyActiveBranch'])) { + $options['onlyActiveBranch'] = $this->getOnlyActiveBranch(); + } + + if (!isset($options['renderParents'])) { + $options['renderParents'] = $this->getRenderParents(); + } + + return $options; + } + + // Render methods: + + /** + * Renders the deepest active menu within [$minDepth, $maxDeth], (called + * from {@link renderMenu()}) + * + * @param Zend_Navigation_Container $container container to render + * @param array $active active page and depth + * @param string $ulClass CSS class for first UL + * @param string $indent initial indentation + * @param int|null $minDepth minimum depth + * @param int|null $maxDepth maximum depth + * @return string rendered menu + */ + protected function _renderDeepestMenu(Zend_Navigation_Container $container, + $ulClass, + $indent, + $minDepth, + $maxDepth) + { + if (!$found = $this->findActive($container, $minDepth, $maxDepth)) { + return ''; + } + + $foundPage = $found['page']; + $foundDepth = $found['depth']; + + // render children or siblings? + if (!$foundPage->hasPages()) { + // found pages has no children; render siblings + $foundPage = $foundPage->getParent(); + } else if (is_int($maxDepth) && $foundDepth +1 > $maxDepth) { + // children are below max depth; render siblings + $foundPage = $foundPage->getParent(); + } + + $ulClass = $ulClass ? ' class="' . $ulClass . '"' : ''; + $html = $indent . '' . self::EOL; + + foreach ($foundPage as $page) { + if (!$this->accept($page)) { + continue; + } + $liClass = $page->isActive(true) ? ' class="active"' : ''; + $html .= $indent . ' ' . self::EOL; + $html .= $indent . ' ' . $this->htmlify($page) . self::EOL; + $html .= $indent . ' ' . self::EOL; + } + + $html .= $indent . ''; + + return $html; + } + + /** + * Renders a normal menu (called from {@link renderMenu()}) + * + * @param Zend_Navigation_Container $container container to render + * @param string $ulClass CSS class for first UL + * @param string $indent initial indentation + * @param int|null $minDepth minimum depth + * @param int|null $maxDepth maximum depth + * @param bool $onlyActive render only active branch? + * @return string + */ + protected function _renderMenu(Zend_Navigation_Container $container, + $ulClass, + $indent, + $minDepth, + $maxDepth, + $onlyActive) + { + $html = ''; + + // find deepest active + if ($found = $this->findActive($container, $minDepth, $maxDepth)) { + $foundPage = $found['page']; + $foundDepth = $found['depth']; + } else { + $foundPage = null; + } + + // create iterator + $iterator = new RecursiveIteratorIterator($container, + RecursiveIteratorIterator::SELF_FIRST); + if (is_int($maxDepth)) { + $iterator->setMaxDepth($maxDepth); + } + + // iterate container + $prevDepth = -1; + foreach ($iterator as $page) { + $depth = $iterator->getDepth(); + $isActive = $page->isActive(true); + if ($depth < $minDepth || !$this->accept($page)) { + // page is below minDepth or not accepted by acl/visibilty + continue; + } else if ($onlyActive && !$isActive) { + // page is not active itself, but might be in the active branch + $accept = false; + if ($foundPage) { + if ($foundPage->hasPage($page)) { + // accept if page is a direct child of the active page + $accept = true; + } else if ($foundPage->getParent()->hasPage($page)) { + // page is a sibling of the active page... + if (!$foundPage->hasPages() || + is_int($maxDepth) && $foundDepth + 1 > $maxDepth) { + // accept if active page has no children, or the + // children are too deep to be rendered + $accept = true; + } + } + } + + if (!$accept) { + continue; + } + } + + // make sure indentation is correct + $depth -= $minDepth; + $myIndent = $indent . str_repeat(' ', $depth); + + if ($depth > $prevDepth) { + // start new ul tag + if ($ulClass && $depth == 0) { + $ulClass = ' class="' . $ulClass . '"'; + } else { + $ulClass = ''; + } + $html .= $myIndent . '' . self::EOL; + } else if ($prevDepth > $depth) { + // close li/ul tags until we're at current depth + for ($i = $prevDepth; $i > $depth; $i--) { + $ind = $indent . str_repeat(' ', $i); + $html .= $ind . ' ' . self::EOL; + $html .= $ind . '' . self::EOL; + } + // close previous li tag + $html .= $myIndent . ' ' . self::EOL; + } else { + // close previous li tag + $html .= $myIndent . ' ' . self::EOL; + } + + // render li tag and page + $liClass = $isActive ? ' class="active"' : ''; + $html .= $myIndent . ' ' . self::EOL + . $myIndent . ' ' . $this->htmlify($page) . self::EOL; + + // store as previous depth for next iteration + $prevDepth = $depth; + } + + if ($html) { + // done iterating container; close open ul/li tags + for ($i = $prevDepth+1; $i > 0; $i--) { + $myIndent = $indent . str_repeat(' ', $i-1); + $html .= $myIndent . ' ' . self::EOL + . $myIndent . '' . self::EOL; + } + $html = rtrim($html, self::EOL); + } + + return $html; + } + + /** + * Renders helper + * + * Renders a HTML 'ul' for the given $container. If $container is not given, + * the container registered in the helper will be used. + * + * Available $options: + * + * + * @param Zend_Navigation_Container $container [optional] container to + * create menu from. Default + * is to use the container + * retrieved from + * {@link getContainer()}. + * @param array $options [optional] options for + * controlling rendering + * @return string rendered menu + */ + public function renderMenu(Zend_Navigation_Container $container = null, + array $options = array()) + { + if (null === $container) { + $container = $this->getContainer(); + } + + $options = $this->_normalizeOptions($options); + + if ($options['onlyActiveBranch'] && !$options['renderParents']) { + $html = $this->_renderDeepestMenu($container, + $options['ulClass'], + $options['indent'], + $options['minDepth'], + $options['maxDepth']); + } else { + $html = $this->_renderMenu($container, + $options['ulClass'], + $options['indent'], + $options['minDepth'], + $options['maxDepth'], + $options['onlyActiveBranch']); + } + + return $html; + } + + /** + * Renders the inner-most sub menu for the active page in the $container + * + * This is a convenience method which is equivalent to the following call: + * + * renderMenu($container, array( + * 'indent' => $indent, + * 'ulClass' => $ulClass, + * 'minDepth' => null, + * 'maxDepth' => null, + * 'onlyActiveBranch' => true, + * 'renderParents' => false + * )); + * + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to render + * the container registered in + * the helper. + * @param string $ulClass [optional] CSS class to + * use for UL element. Default + * is to use the value from + * {@link getUlClass()}. + * @param string|int $indent [optional] indentation as + * a string or number of + * spaces. Default is to use + * the value retrieved from + * {@link getIndent()}. + * @return string rendered content + */ + public function renderSubMenu(Zend_Navigation_Container $container = null, + $ulClass = null, + $indent = null) + { + return $this->renderMenu($container, array( + 'indent' => $indent, + 'ulClass' => $ulClass, + 'minDepth' => null, + 'maxDepth' => null, + 'onlyActiveBranch' => true, + 'renderParents' => false + )); + } + + /** + * Renders the given $container by invoking the partial view helper + * + * The container will simply be passed on as a model to the view script + * as-is, and will be available in the partial script as 'container', e.g. + * echo 'Number of pages: ', count($this->container);. + * + * @param Zend_Navigation_Container $container [optional] container to + * pass to view script. Default + * is to use the container + * registered in the helper. + * @param string|array $partial [optional] partial view + * script to use. Default is to + * use the partial registered + * in the helper. If an array + * is given, it is expected to + * contain two values; the + * partial view script to use, + * and the module where the + * script can be found. + * @return string helper output + */ + public function renderPartial(Zend_Navigation_Container $container = null, + $partial = null) + { + if (null === $container) { + $container = $this->getContainer(); + } + + if (null === $partial) { + $partial = $this->getPartial(); + } + + if (empty($partial)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception( + 'Unable to render menu: No partial view script provided'); + } + + $model = array( + 'container' => $container + ); + + if (is_array($partial)) { + if (count($partial) != 2) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception( + 'Unable to render menu: A view partial supplied as ' . + 'an array must contain two values: partial view ' . + 'script and module where script can be found'); + } + + return $this->view->partial($partial[0], $partial[1], $model); + } + + return $this->view->partial($partial, null, $model); + } + + // Zend_View_Helper_Navigation_Helper: + + /** + * Renders menu + * + * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. + * + * If a partial view is registered in the helper, the menu will be rendered + * using the given partial script. If no partial is registered, the menu + * will be rendered as an 'ul' element by the helper's internal method. + * + * @see renderPartial() + * @see renderMenu() + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to + * render the container + * registered in the helper. + * @return string helper output + */ + public function render(Zend_Navigation_Container $container = null) + { + if ($partial = $this->getPartial()) { + return $this->renderPartial($container, $partial); + } else { + return $this->renderMenu($container); + } + } +} \ No newline at end of file diff --git a/libs/Zend/View/Helper/Navigation/Sitemap.php b/libs/Zend/View/Helper/Navigation/Sitemap.php new file mode 100644 index 0000000..398f6d8 --- /dev/null +++ b/libs/Zend/View/Helper/Navigation/Sitemap.php @@ -0,0 +1,469 @@ + tag + * + * @var string + */ + const SITEMAP_NS = 'http://www.sitemaps.org/schemas/sitemap/0.9'; + + /** + * Schema URL + * + * @var string + */ + const SITEMAP_XSD = 'http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'; + + /** + * Whether XML output should be formatted + * + * @var bool + */ + protected $_formatOutput = false; + + /** + * Whether the XML declaration should be included in XML output + * + * @var bool + */ + protected $_useXmlDeclaration = true; + + /** + * Whether sitemap should be validated using Zend_Validate_Sitemap_* + * + * @var bool + */ + protected $_useSitemapValidators = true; + + /** + * Whether sitemap should be schema validated when generated + * + * @var bool + */ + protected $_useSchemaValidation = false; + + /** + * Server url + * + * @var string + */ + protected $_serverUrl; + + /** + * View helper entry point: + * Retrieves helper and optionally sets container to operate on + * + * @param Zend_Navigation_Container $container [optional] container to + * operate on + * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns + * self + */ + public function sitemap(Zend_Navigation_Container $container = null) + { + if (null !== $container) { + $this->setContainer($container); + } + + return $this; + } + + // Accessors: + + /** + * Sets whether XML output should be formatted + * + * @param bool $formatOutput [optional] whether output + * should be formatted. Default + * is true. + * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns + * self + */ + public function setFormatOutput($formatOutput = true) + { + $this->_formatOutput = (bool) $formatOutput; + return $this; + } + + /** + * Returns whether XML output should be formatted + * + * @return bool whether XML output should be formatted + */ + public function getFormatOutput() + { + return $this->_formatOutput; + } + + /** + * Sets whether the XML declaration should be used in output + * + * @param bool $useXmlDecl whether XML delcaration + * should be rendered + * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns + * self + */ + public function setUseXmlDeclaration($useXmlDecl) + { + $this->_useXmlDeclaration = (bool) $useXmlDecl; + return $this; + } + + /** + * Returns whether the XML declaration should be used in output + * + * @return bool whether the XML declaration should be used in output + */ + public function getUseXmlDeclaration() + { + return $this->_useXmlDeclaration; + } + + /** + * Sets whether sitemap should be validated using Zend_Validate_Sitemap_* + * + * @param bool $useSitemapValidators whether sitemap validators + * should be used + * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns + * self + */ + public function setUseSitemapValidators($useSitemapValidators) + { + $this->_useSitemapValidators = (bool) $useSitemapValidators; + return $this; + } + + /** + * Returns whether sitemap should be validated using Zend_Validate_Sitemap_* + * + * @return bool whether sitemap should be validated using validators + */ + public function getUseSitemapValidators() + { + return $this->_useSitemapValidators; + } + + /** + * Sets whether sitemap should be schema validated when generated + * + * @param bool $schemaValidation whether sitemap should + * validated using XSD Schema + * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns + * self + */ + public function setUseSchemaValidation($schemaValidation) + { + $this->_useSchemaValidation = (bool) $schemaValidation; + return $this; + } + + /** + * Returns true if sitemap should be schema validated when generated + * + * @return bool + */ + public function getUseSchemaValidation() + { + return $this->_useSchemaValidation; + } + + /** + * Sets server url (scheme and host-related stuff without request URI) + * + * E.g. http://www.example.com + * + * @param string $serverUrl server URL to set (only + * scheme and host) + * @throws Zend_Uri_Exception if invalid server URL + * @return Zend_View_Helper_Navigation_Sitemap fluent interface, returns + * self + */ + public function setServerUrl($serverUrl) + { + require_once 'Zend/Uri.php'; + $uri = Zend_Uri::factory($serverUrl); + $uri->setFragment(''); + $uri->setPath(''); + $uri->setQuery(''); + + if ($uri->valid()) { + $this->_serverUrl = $uri->getUri(); + } else { + require_once 'Zend/Uri/Exception.php'; + throw new Zend_Uri_Exception(sprintf( + 'Invalid server URL: "%s"', + $serverUrl)); + } + + return $this; + } + + /** + * Returns server URL + * + * @return string server URL + */ + public function getServerUrl() + { + if (!isset($this->_serverUrl)) { + $this->_serverUrl = $this->view->serverUrl(); + } + + return $this->_serverUrl; + } + + // Helper methods: + + /** + * Escapes string for XML usage + * + * @param string $string string to escape + * @return string escaped string + */ + protected function _xmlEscape($string) + { + // TODO: remove check when minimum PHP version is >= 5.2.3 + if (version_compare(PHP_VERSION, '5.2.3', '>=')) { + // do not encode existing HTML entities + return htmlspecialchars($string, ENT_QUOTES, 'UTF-8', false); + } else { + $string = preg_replace('/&(?!(?:#\d++|[a-z]++);)/ui', '&', $string); + $string = str_replace(array('<', '>', '\'', '"'), array('<', '>', ''', '"'), $string); + return $string; + } + } + + // Public methods: + + /** + * Returns an escaped absolute URL for the given page + * + * @param Zend_Navigation_Page $page page to get URL from + * @return string + */ + public function url(Zend_Navigation_Page $page) + { + $href = $page->getHref(); + + if (!isset($href{0})) { + // no href + return ''; + } elseif ($href{0} == '/') { + // href is relative to root; use serverUrl helper + $url = $this->getServerUrl() . $href; + } elseif (preg_match('/^[a-z]+:/im', (string) $href)) { + // scheme is given in href; assume absolute URL already + $url = (string) $href; + } else { + // href is relative to current document; use url helpers + $url = $this->getServerUrl() + . rtrim($this->view->url(), '/') . '/' + . $href; + } + + return $this->_xmlEscape($url); + } + + /** + * Returns a DOMDocument containing the Sitemap XML for the given container + * + * @param Zend_Navigation_Container $container [optional] container to get + * breadcrumbs from, defaults + * to what is registered in the + * helper + * @return DOMDocument DOM representation of the + * container + * @throws Zend_View_Exception if schema validation is on + * and the sitemap is invalid + * according to the sitemap + * schema, or if sitemap + * validators are used and the + * loc element fails validation + */ + public function getDomSitemap(Zend_Navigation_Container $container = null) + { + if (null === $container) { + $container = $this->getContainer(); + } + + // check if we should validate using our own validators + if ($this->getUseSitemapValidators()) { + require_once 'Zend/Validate/Sitemap/Changefreq.php'; + require_once 'Zend/Validate/Sitemap/Lastmod.php'; + require_once 'Zend/Validate/Sitemap/Loc.php'; + require_once 'Zend/Validate/Sitemap/Priority.php'; + + // create validators + $locValidator = new Zend_Validate_Sitemap_Loc(); + $lastmodValidator = new Zend_Validate_Sitemap_Lastmod(); + $changefreqValidator = new Zend_Validate_Sitemap_Changefreq(); + $priorityValidator = new Zend_Validate_Sitemap_Priority(); + } + + // create document + $dom = new DOMDocument('1.0', 'UTF-8'); + $dom->formatOutput = $this->getFormatOutput(); + + // ...and urlset (root) element + $urlSet = $dom->createElementNS(self::SITEMAP_NS, 'urlset'); + $dom->appendChild($urlSet); + + // create iterator + $iterator = new RecursiveIteratorIterator($container, + RecursiveIteratorIterator::SELF_FIRST); + + $maxDepth = $this->getMaxDepth(); + if (is_int($maxDepth)) { + $iterator->setMaxDepth($maxDepth); + } + $minDepth = $this->getMinDepth(); + if (!is_int($minDepth) || $minDepth < 0) { + $minDepth = 0; + } + + // iterate container + foreach ($iterator as $page) { + if ($iterator->getDepth() < $minDepth || !$this->accept($page)) { + // page should not be included + continue; + } + + // get absolute url from page + if (!$url = $this->url($page)) { + // skip page if it has no url (rare case) + continue; + } + + // create url node for this page + $urlNode = $dom->createElementNS(self::SITEMAP_NS, 'url'); + $urlSet->appendChild($urlNode); + + if ($this->getUseSitemapValidators() && + !$locValidator->isValid($url)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf( + 'Encountered an invalid URL for Sitemap XML: "%s"', + $url)); + } + + // put url in 'loc' element + $urlNode->appendChild($dom->createElementNS(self::SITEMAP_NS, + 'loc', $url)); + + // add 'lastmod' element if a valid lastmod is set in page + if (isset($page->lastmod)) { + $lastmod = strtotime((string) $page->lastmod); + + // prevent 1970-01-01... + if ($lastmod !== false) { + $lastmod = date('c', $lastmod); + } + + if (!$this->getUseSitemapValidators() || + $lastmodValidator->isValid($lastmod)) { + $urlNode->appendChild( + $dom->createElementNS(self::SITEMAP_NS, 'lastmod', + $lastmod) + ); + } + } + + // add 'changefreq' element if a valid changefreq is set in page + if (isset($page->changefreq)) { + $changefreq = $page->changefreq; + if (!$this->getUseSitemapValidators() || + $changefreqValidator->isValid($changefreq)) { + $urlNode->appendChild( + $dom->createElementNS(self::SITEMAP_NS, 'changefreq', + $changefreq) + ); + } + } + + // add 'priority' element if a valid priority is set in page + if (isset($page->priority)) { + $priority = $page->priority; + if (!$this->getUseSitemapValidators() || + $priorityValidator->isValid($priority)) { + $urlNode->appendChild( + $dom->createElementNS(self::SITEMAP_NS, 'priority', + $priority) + ); + } + } + } + + // validate using schema if specified + if ($this->getUseSchemaValidation()) { + if (!@$dom->schemaValidate(self::SITEMAP_XSD)) { + require_once 'Zend/View/Exception.php'; + throw new Zend_View_Exception(sprintf( + 'Sitemap is invalid according to XML Schema at "%s"', + self::SITEMAP_XSD)); + } + } + + return $dom; + } + + // Zend_View_Helper_Navigation_Helper: + + /** + * Renders helper + * + * Implements {@link Zend_View_Helper_Navigation_Helper::render()}. + * + * @param Zend_Navigation_Container $container [optional] container to + * render. Default is to + * render the container + * registered in the helper. + * @return string helper output + */ + public function render(Zend_Navigation_Container $container = null) + { + $dom = $this->getDomSitemap($container); + + $xml = $this->getUseXmlDeclaration() ? + $dom->saveXML() : + $dom->saveXML($dom->documentElement); + + return rtrim($xml, PHP_EOL); + } +} \ No newline at end of file diff --git a/libs/Zend/View/Helper/PartialLoop.php b/libs/Zend/View/Helper/PartialLoop.php index ade2e75..6ac4fe6 100644 --- a/libs/Zend/View/Helper/PartialLoop.php +++ b/libs/Zend/View/Helper/PartialLoop.php @@ -16,7 +16,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: PartialLoop.php 12577 2008-11-12 01:31:34Z sidhighwind $ + * @version $Id: PartialLoop.php 13031 2008-12-05 02:40:46Z sidhighwind $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -82,6 +82,8 @@ class Zend_View_Helper_PartialLoop extends Zend_View_Helper_Partial } $content = ''; + // reset the counter if it's call again + $this->partialCounter = 0; foreach ($model as $item) { // increment the counter variable $this->partialCounter++; diff --git a/libs/Zend/View/Helper/Placeholder/Container/Abstract.php b/libs/Zend/View/Helper/Placeholder/Container/Abstract.php index fe02c25..e01231d 100644 --- a/libs/Zend/View/Helper/Placeholder/Container/Abstract.php +++ b/libs/Zend/View/Helper/Placeholder/Container/Abstract.php @@ -15,7 +15,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Abstract.php 9099 2008-03-30 19:35:47Z thomas $ + * @version $Id: Abstract.php 14191 2009-02-28 21:53:47Z matthew $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -23,7 +23,7 @@ * Abstract class representing container for placeholder values * * @package Zend_View - * @subpackage Helpers + * @subpackage 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 */ diff --git a/libs/Zend/View/Helper/Placeholder/Container/Standalone.php b/libs/Zend/View/Helper/Placeholder/Container/Standalone.php index 972705c..234eabb 100644 --- a/libs/Zend/View/Helper/Placeholder/Container/Standalone.php +++ b/libs/Zend/View/Helper/Placeholder/Container/Standalone.php @@ -15,7 +15,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Standalone.php 11373 2008-09-12 17:00:05Z ralph $ + * @version $Id: Standalone.php 13197 2008-12-13 13:31:29Z matthew $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -66,7 +66,6 @@ abstract class Zend_View_Helper_Placeholder_Container_Standalone extends Zend_Vi public function __construct() { $this->setRegistry(Zend_View_Helper_Placeholder_Registry::getRegistry()); - $registry = $this->getRegistry(); $this->setContainer($this->getRegistry()->getContainer($this->_regKey)); } diff --git a/libs/Zend/View/Helper/Placeholder/Registry.php b/libs/Zend/View/Helper/Placeholder/Registry.php index bc74f2f..e3487c8 100644 --- a/libs/Zend/View/Helper/Placeholder/Registry.php +++ b/libs/Zend/View/Helper/Placeholder/Registry.php @@ -15,7 +15,7 @@ * @package Zend_View * @subpackage Helper * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) - * @version $Id: Registry.php 9099 2008-03-30 19:35:47Z thomas $ + * @version $Id: Registry.php 15577 2009-05-14 12:43:34Z matthew $ * @license http://framework.zend.com/license/new-bsd New BSD License */ @@ -158,8 +158,10 @@ class Zend_View_Helper_Placeholder_Registry */ public function setContainerClass($name) { - require_once 'Zend/Loader.php'; - Zend_Loader::loadClass($name); + if (!class_exists($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'))) { diff --git a/libs/Zend/View/Helper/ServerUrl.php b/libs/Zend/View/Helper/ServerUrl.php new file mode 100644 index 0000000..2c8cf26 --- /dev/null +++ b/libs/Zend/View/Helper/ServerUrl.php @@ -0,0 +1,143 @@ +setScheme($scheme); + + if (isset($_SERVER['HTTP_HOST']) && !empty($_SERVER['HTTP_HOST'])) { + $this->setHost($_SERVER['HTTP_HOST']); + } else if (isset($_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'])) { + $name = $_SERVER['SERVER_NAME']; + $port = $_SERVER['SERVER_PORT']; + + if (($scheme == 'http' && $port == 80) || + ($scheme == 'https' && $port == 443)) { + $this->setHost($name); + } else { + $this->setHost($name . ':' . $port); + } + } + } + + /** + * View helper entry point: + * Returns the current host's URL like http://site.com + * + * @param string|boolean $requestUri [optional] if true, the request URI + * found in $_SERVER will be appended + * as a path. If a string is given, it + * will be appended as a path. Default + * is to not append any path. + * @return string server url + */ + public function serverUrl($requestUri = null) + { + if ($requestUri === true) { + $path = $_SERVER['REQUEST_URI']; + } else if (is_string($requestUri)) { + $path = $requestUri; + } else { + $path = ''; + } + + return $this->getScheme() . '://' . $this->getHost() . $path; + } + + /** + * Returns host + * + * @return string host + */ + public function getHost() + { + return $this->_host; + } + + /** + * Sets host + * + * @param string $host new host + * @return Zend_View_Helper_ServerUrl fluent interface, returns self + */ + public function setHost($host) + { + $this->_host = $host; + return $this; + } + + /** + * Returns scheme (typically http or https) + * + * @return string scheme (typically http or https) + */ + public function getScheme() + { + return $this->_scheme; + } + + /** + * Sets scheme (typically http or https) + * + * @param string $scheme new scheme (typically http or https) + * @return Zend_View_Helper_ServerUrl fluent interface, returns self + */ + public function setScheme($scheme) + { + $this->_scheme = $scheme; + return $this; + } +} \ No newline at end of file diff --git a/libs/Zend/View/Helper/Translate.php b/libs/Zend/View/Helper/Translate.php index e07d3d8..2b75a67 100644 --- a/libs/Zend/View/Helper/Translate.php +++ b/libs/Zend/View/Helper/Translate.php @@ -17,7 +17,7 @@ * @subpackage Helper * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License - * @version $Id: Translate.php 12062 2008-10-21 17:28:12Z thomas $ + * @version $Id: Translate.php 15766 2009-05-25 20:09:35Z thomas $ */ /** Zend_Locale */ @@ -92,7 +92,7 @@ class Zend_View_Helper_Translate extends Zend_View_Helper_Abstract } $message = $translate->translate($messageid, $locale); - if ($count === 0) { + if (count($options) === 0) { return $message; } diff --git a/libs/Zend/Wildfire/Channel/HttpHeaders.php b/libs/Zend/Wildfire/Channel/HttpHeaders.php index 671a86c..c6aacb5 100644 --- a/libs/Zend/Wildfire/Channel/HttpHeaders.php +++ b/libs/Zend/Wildfire/Channel/HttpHeaders.php @@ -22,9 +22,6 @@ /** Zend_Wildfire_Channel_Interface */ require_once 'Zend/Wildfire/Channel/Interface.php'; -/** Zend_Wildfire_Exception */ -require_once 'Zend/Wildfire/Exception.php'; - /** Zend_Controller_Request_Abstract */ require_once('Zend/Controller/Request/Abstract.php'); @@ -42,7 +39,7 @@ require_once 'Zend/Controller/Front.php'; /** * Implements communication via HTTP request and response headers for Wildfire Protocols. - * + * * @category Zend * @package Zend_Wildfire * @subpackage Channel @@ -56,25 +53,25 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract * @var string */ protected static $_headerPrefix = 'X-WF-'; - + /** * Singleton instance * @var Zend_Wildfire_Channel_HttpHeaders */ protected static $_instance = null; - + /** * The index of the plugin in the controller dispatch loop plugin stack * @var integer */ protected static $_controllerPluginStackIndex = 999; - + /** * The protocol instances for this channel * @var array */ protected $_protocols = null; - + /** * Initialize singleton instance. * @@ -84,41 +81,50 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract */ public static function init($class = null) { - if (self::$_instance!==null) { + if (self::$_instance !== null) { + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Singleton instance of Zend_Wildfire_Channel_HttpHeaders already exists!'); } - if ($class!==null) { + if ($class !== null) { if (!is_string($class)) { + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Third argument is not a class string'); } - Zend_Loader::loadClass($class); + + if (!class_exists($class)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($class); + } + self::$_instance = new $class(); + if (!self::$_instance instanceof Zend_Wildfire_Channel_HttpHeaders) { self::$_instance = null; + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Invalid class to third argument. Must be subclass of Zend_Wildfire_Channel_HttpHeaders.'); } } else { - self::$_instance = new self(); + self::$_instance = new self(); } - + return self::$_instance; } /** * Get or create singleton instance - * + * * @param $skipCreate boolean True if an instance should not be created * @return Zend_Wildfire_Channel_HttpHeaders */ public static function getInstance($skipCreate=false) - { + { if (self::$_instance===null && $skipCreate!==true) { - return self::init(); + return self::init(); } return self::$_instance; } - + /** * Destroys the singleton instance * @@ -130,10 +136,10 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract { self::$_instance = null; } - + /** * Get the instance of a give protocol for this channel - * + * * @param string $uri The URI for the protocol * @return object Returns the protocol instance for the diven URI */ @@ -142,15 +148,15 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract if (!isset($this->_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 @@ -161,10 +167,11 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract case Zend_Wildfire_Protocol_JsonStream::PROTOCOL_URI; return new Zend_Wildfire_Protocol_JsonStream(); } + require_once 'Zend/Wildfire/Exception.php'; 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. * @@ -190,10 +197,10 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract } 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. */ @@ -206,7 +213,7 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract /** * Register this object as a controller plugin. - * + * * @return void */ protected function _registerControllerPlugin() @@ -214,21 +221,54 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract $controller = Zend_Controller_Front::getInstance(); if (!$controller->hasPlugin(get_class($this))) { $controller->registerPlugin($this, self::$_controllerPluginStackIndex); - } + } } - + /* - * Zend_Wildfire_Channel_Interface + * Zend_Wildfire_Channel_Interface */ /** * Determine if channel is ready. + * + * The channel is ready as long as the request and response objects are initialized, + * can send headers and the FirePHP header exists in the User-Agent. * + * If the header does not exist in the User-Agent, no appropriate client + * is making this request and the messages should not be sent. + * + * A timing issue arises when messages are logged before the request/response + * objects are initialized. In this case we do not yet know if the client + * will be able to accept the messages. If we consequently indicate that + * the channel is not ready, these messages will be dropped which is in + * most cases not the intended behaviour. The intent is to send them at the + * end of the request when the request/response objects will be available + * for sure. + * + * If the request/response objects are not yet initialized we assume if messages are + * logged, the client will be able to receive them. As soon as the request/response + * objects are availoable and a message is logged this assumption is challenged. + * If the client cannot accept the messages any further messages are dropped + * and messages sent prior are kept but discarded when the channel is finally + * flushed at the end of the request. + * + * When the channel is flushed the $forceCheckRequest option is used to force + * a check of the request/response objects. This is the last verification to ensure + * messages are only sent when the client can accept them. + * + * @param boolean $forceCheckRequest OPTIONAL Set to TRUE if the request must be checked * @return boolean Returns TRUE if channel is ready. */ - public function isReady() + public function isReady($forceCheckRequest=false) { + if (!$forceCheckRequest + && !$this->_request + && !$this->_response) { + + return true; + } + return ($this->getResponse()->canSendHeaders() && preg_match_all('/\s?FirePHP\/([\.|\d]*)\s?/si', $this->getRequest()->getHeader('User-Agent'),$m)); @@ -236,7 +276,7 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract /* - * Zend_Controller_Plugin_Abstract + * Zend_Controller_Plugin_Abstract */ /** @@ -248,10 +288,10 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract { $this->flush(); } - + /** * Get the request object - * + * * @return Zend_Controller_Request_Abstract * @throws Zend_Wildfire_Exception */ @@ -262,6 +302,7 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract $this->setRequest($controller->getRequest()); } if (!$this->_request) { + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Request objects not initialized.'); } return $this->_request; @@ -269,7 +310,7 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract /** * Get the response object - * + * * @return Zend_Controller_Response_Abstract * @throws Zend_Wildfire_Exception */ @@ -282,6 +323,7 @@ class Zend_Wildfire_Channel_HttpHeaders extends Zend_Controller_Plugin_Abstract } } if (!$this->_response) { + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Response objects not initialized.'); } return $this->_response; diff --git a/libs/Zend/Wildfire/Plugin/FirePhp.php b/libs/Zend/Wildfire/Plugin/FirePhp.php index 282bde9..4f46bf6 100644 --- a/libs/Zend/Wildfire/Plugin/FirePhp.php +++ b/libs/Zend/Wildfire/Plugin/FirePhp.php @@ -19,12 +19,6 @@ * @license http://framework.zend.com/license/new-bsd New BSD License */ -/** Zend_Loader */ -require_once 'Zend/Loader.php'; - -/** Zend_Wildfire_Exception */ -require_once 'Zend/Wildfire/Exception.php'; - /** Zend_Controller_Request_Abstract */ require_once('Zend/Controller/Request/Abstract.php'); @@ -42,7 +36,7 @@ require_once 'Zend/Wildfire/Plugin/Interface.php'; /** * Primary class for communicating with the FirePHP Firefox Extension. - * + * * @category Zend * @package Zend_Wildfire * @subpackage Plugin @@ -55,33 +49,33 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface * Plain log style. */ const LOG = 'LOG'; - + /** * Information style. */ const INFO = 'INFO'; - + /** * Warning style. */ const WARN = 'WARN'; - + /** * Error style that increments Firebug's error counter. */ const ERROR = 'ERROR'; - + /** * Trace style showing message and expandable full stack trace. */ const TRACE = 'TRACE'; - + /** * Exception style showing message and expandable full stack trace. * Also increments Firebug's error counter. */ const EXCEPTION = 'EXCEPTION'; - + /** * Table style showing summary line and expandable table */ @@ -91,27 +85,27 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface * Dump variable to Server panel in Firebug Request Inspector */ const DUMP = 'DUMP'; - + /** * Start a group in the Firebug Console */ const GROUP_START = 'GROUP_START'; - + /** * End a group in the Firebug Console */ const GROUP_END = 'GROUP_END'; - + /** * The plugin URI for this plugin */ const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/ZendFramework/FirePHP/1.6.2'; - + /** * The protocol URI for this plugin */ const PROTOCOL_URI = Zend_Wildfire_Protocol_JsonStream::PROTOCOL_URI; - + /** * The structure URI for the Dump structure */ @@ -121,7 +115,7 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface * The structure URI for the Firebug Console structure */ const STRUCTURE_URI_FIREBUGCONSOLE = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; - + /** * Singleton instance * @var Zend_Wildfire_Plugin_FirePhp @@ -133,37 +127,43 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface * @var boolean */ protected $_enabled = true; - + /** * The channel via which to send the encoded messages. * @var Zend_Wildfire_Channel_Interface */ protected $_channel = null; - + /** * Messages that are buffered to be sent when protocol flushes * @var array */ protected $_messages = array(); - + /** - * The maximum depth to traverse objects when encoding - * @var int - */ - protected $_maxObjectDepth = 10; - + * Options for the object + * @var array + */ + protected $_options = array( + 'traceOffset' => 1, /* The offset in the trace which identifies the source of the message */ + 'maxTraceDepth' => 99, /* Maximum depth for stack traces */ + 'maxObjectDepth' => 10, /* The maximum depth to traverse objects when encoding */ + 'maxArrayDepth' => 20, /* The maximum depth to traverse nested arrays when encoding */ + 'includeLineNumbers' => true /* Whether to include line and file info for each message */ + ); + /** - * The maximum depth to traverse nested arrays when encoding - * @var int - */ - protected $_maxArrayDepth = 20; - + * Filters used to exclude object members when encoding + * @var array + */ + protected $_objectFilters = array(); + /** * A stack of objects used during encoding to detect recursion * @var array */ protected $_objectStack = array(); - + /** * Create singleton instance. * @@ -173,26 +173,33 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface */ public static function init($class = null) { - if (self::$_instance!==null) { + if (self::$_instance !== null) { + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Singleton instance of Zend_Wildfire_Plugin_FirePhp already exists!'); } - if ($class!==null) { + if ($class !== null) { if (!is_string($class)) { + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Third argument is not a class string'); } - Zend_Loader::loadClass($class); + + if (!class_exists($class)) { + require_once 'Zend/Loader.php'; + Zend_Loader::loadClass($class); + } self::$_instance = new $class(); if (!self::$_instance instanceof Zend_Wildfire_Plugin_FirePhp) { self::$_instance = null; + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Invalid class to third argument. Must be subclass of Zend_Wildfire_Plugin_FirePhp.'); } } else { self::$_instance = new self(); } - + return self::$_instance; } - + /** * Constructor * @return void @@ -205,18 +212,18 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface /** * 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::init(); } return self::$_instance; } - + /** * Destroys the singleton instance * @@ -227,13 +234,13 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface 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. + * + * @param boolean $enabled Set to TRUE to enable sending of messages. * @return boolean The previous value. */ public function setEnabled($enabled) @@ -246,20 +253,74 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface } return $previous; } - + /** * Determine if logging to user-agent is enabled. - * + * * @return boolean Returns TRUE if logging is enabled. */ public function getEnabled() { return $this->_enabled; } - + + /** + * Set a single option + * + * @param string $key The name of the option + * @param mixed $value The value of the option + * @return mixed The previous value of the option + */ + public function setOption($key, $value) + { + if (!array_key_exists($key,$this->_options)) { + throw new Zend_Wildfire_Exception('Option with name "'.$key.'" does not exist!'); + } + $previous = $this->_options[$key]; + $this->_options[$key] = $value; + return $previous; + } + + /** + * Retrieve a single option + * + * @param string $key The name of the option + * @return mixed The value of the option + */ + public function getOption($key) + { + if (!array_key_exists($key,$this->_options)) { + throw new Zend_Wildfire_Exception('Option with name "'.$key.'" does not exist!'); + } + return $this->_options[$key]; + } + + /** + * Retrieve all options + * + * @return array All options + */ + public function getOptions() + { + return $this->_options; + } + + /** + * Specify a filter to be used when encoding an object + * + * Filters are used to exclude object members. + * + * @param string $Class The class name of the object + * @param array $Filter An array of members to exclude + * @return void + */ + public function setObjectFilter($class, $filter) { + $this->_objectFilters[$class] = $filter; + } + /** * 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. */ @@ -267,17 +328,17 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface { 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. @@ -285,17 +346,16 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface * @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. + * @param array $options OPTIONAL Options to change how messages are processed and sent * @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) + public static function send($var, $label=null, $style=null, $options=array()) { - if (self::$_instance===null) { - self::getInstance(); - } + $firephp = self::getInstance(); - if (!self::$_instance->_enabled) { - return false; + if (!$firephp->getEnabled()) { + return false; } if ($var instanceof Zend_Wildfire_Plugin_FirePhp_Message) { @@ -304,68 +364,95 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface if (!in_array($var, self::$_instance->_messages)) { self::$_instance->_messages[] = $var; } - return true; + return true; } - + if ($var->getDestroy()) { - return false; + return false; } $style = $var->getStyle(); $label = $var->getLabel(); + $options = $var->getOptions(); $var = $var->getMessage(); } - + if (!self::$_instance->_channel->isReady()) { - return false; + return false; } + foreach ($options as $name => $value) { + if ($value===null) { + unset($options[$name]); + } + } + $options = array_merge($firephp->getOptions(), $options); + + $trace = null; + + $skipFinalEncode = false; + + $meta = array(); + $meta['Type'] = $style; + if ($var instanceof Exception) { + $eTrace = $var->getTrace(); + $eTrace = array_splice($eTrace, 0, $options['maxTraceDepth']); + $var = array('Class'=>get_class($var), 'Message'=>$var->getMessage(), 'File'=>$var->getFile(), 'Line'=>$var->getLine(), 'Type'=>'throw', - 'Trace'=>$var->getTrace()); - - $style = self::EXCEPTION; - + 'Trace'=>$firephp->_encodeTrace($eTrace)); + + $meta['Type'] = self::EXCEPTION; + + $skipFinalEncode = true; + } else - if ($style==self::TRACE) { - - $trace = debug_backtrace(); - if(!$trace) return false; + if ($meta['Type']==self::TRACE) { - for ( $i=0 ; $i_getStackTrace(array_merge($options, + array('maxTraceDepth'=>$options['maxTraceDepth']+1))); } - $var = array('Class'=>$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)); + $var = array('Class'=>$trace[0]['class'], + 'Type'=>$trace[0]['type'], + 'Function'=>$trace[0]['function'], + 'Message'=>$label, + 'File'=>isset($trace[0]['file'])?$trace[0]['file']:'', + 'Line'=>isset($trace[0]['line'])?$trace[0]['line']:'', + 'Args'=>isset($trace[0]['args'])?$firephp->_encodeObject($trace[0]['args']):'', + 'Trace'=>$firephp->_encodeTrace(array_splice($trace,1))); + + $skipFinalEncode = true; + + } else + if ($meta['Type']==self::TABLE) { + + $var = $firephp->_encodeTable($var); + + $skipFinalEncode = true; + } else { - if ($style===null) { - $style = self::LOG; + if ($meta['Type']===null) { + $meta['Type'] = self::LOG; } } - switch ($style) { + if ($label!=null) { + $meta['Label'] = $label; + } + + switch ($meta['Type']) { case self::LOG: case self::INFO: case self::WARN: @@ -378,182 +465,282 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface case self::GROUP_END: break; default: - throw new Zend_Wildfire_Exception('Log style "'.$style.'" not recognized!'); + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Log style "'.$meta['Type'].'" not recognized!'); break; } - - if ($style == self::DUMP) { - - return self::$_instance->_recordMessage(self::STRUCTURE_URI_DUMP, - array('key'=>$label, - 'data'=>$var)); - + + if ($meta['Type'] != self::DUMP && $options['includeLineNumbers']) { + if (!isset($meta['File']) || !isset($meta['Line'])) { + + if (!$trace) { + $trace = $firephp->_getStackTrace($options); + } + + $meta['File'] = isset($trace[0]['file'])?$trace[0]['file']:''; + $meta['Line'] = isset($trace[0]['line'])?$trace[0]['line']:''; + + } + } else { + unset($meta['File']); + unset($meta['Line']); + } + + if ($meta['Type'] == self::DUMP) { + + return $firephp->_recordMessage(self::STRUCTURE_URI_DUMP, + array('key'=>$meta['Label'], + 'data'=>$var), + $skipFinalEncode); + } else { - $meta = array('Type'=>$style); - - if ($label!=null) { - $meta['Label'] = $label; - } - - return self::$_instance->_recordMessage(self::STRUCTURE_URI_FIREBUGCONSOLE, - array('data'=>$var, - 'meta'=>$meta)); + return $firephp->_recordMessage(self::STRUCTURE_URI_FIREBUGCONSOLE, + array('data'=>$var, + 'meta'=>$meta), + $skipFinalEncode); } } - - + + /** + * Gets a stack trace + * + * @param array $options Options to change how the stack trace is returned + * @return array The stack trace + */ + protected function _getStackTrace($options) + { + $trace = debug_backtrace(); + + return array_splice($trace, $options['traceOffset'], $options['maxTraceDepth']); + } + /** * 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 + * @param boolean $skipEncode TRUE if variable encoding should be skipped * @return boolean Returns TRUE if message was recorded * @throws Zend_Wildfire_Exception */ - protected function _recordMessage($structure, $data) + protected function _recordMessage($structure, $data, $skipEncode=false) { switch($structure) { case self::STRUCTURE_URI_DUMP: - + if (!isset($data['key'])) { + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('You must supply a key.'); } if (!array_key_exists('data',$data)) { + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('You must supply data.'); } - + + $value = $data['data']; + if (!$skipEncode) { + $value = $this->_encodeObject($data['data']); + } + return $this->_channel->getProtocol(self::PROTOCOL_URI)-> recordMessage($this, $structure, - array($data['key']=>$this->_encodeObject($data['data']))); - + array($data['key']=>$value)); + case self::STRUCTURE_URI_FIREBUGCONSOLE: - + if (!isset($data['meta']) || !is_array($data['meta']) || !array_key_exists('Type',$data['meta'])) { - + + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('You must supply a "Type" in the meta information.'); } if (!array_key_exists('data',$data)) { + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('You must supply data.'); } - + + $value = $data['data']; + if (!$skipEncode) { + $value = $this->_encodeObject($data['data']); + } + return $this->_channel->getProtocol(self::PROTOCOL_URI)-> recordMessage($this, $structure, array($data['meta'], - $this->_encodeObject($data['data']))); + $value)); default: + require_once 'Zend/Wildfire/Exception.php'; throw new Zend_Wildfire_Exception('Structure of name "'.$structure.'" is not recognized.'); - break; + break; } - return false; + return false; } - + + /** + * Encodes a table by encoding each row and column with _encodeObject() + * + * @param array $Table The table to be encoded + * @return array + */ + protected function _encodeTable($table) + { + if (!$table) { + return $table; + } + for ($i=0 ; $i_encodeObject($table[$i][$j]); + } + } + } + return $table; + } + + /** + * Encodes a trace by encoding all "args" with _encodeObject() + * + * @param array $Trace The trace to be encoded + * @return array The encoded trace + */ + protected function _encodeTrace($trace) + { + if (!$trace) { + return $trace; + } + for ($i=0 ; $i_encodeObject($trace[$i]['args']); + } + } + return $trace; + } + /** * 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) + protected function _encodeObject($object, $objectDepth = 1, $arrayDepth = 1) { $return = array(); - + if (is_resource($object)) { - + return '** '.(string)$object.' **'; - - } else + + } else if (is_object($object)) { - if ($depth > $this->_maxObjectDepth) { - return '** Max Depth **'; + if ($objectDepth > $this->_options['maxObjectDepth']) { + return '** Max Object Depth ('.$this->_options['maxObjectDepth'].') **'; } - + 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); + + $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 **'; - } - } + + foreach ($properties as $just_name => $property) { + + $name = $raw_name = $just_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 (!(isset($this->_objectFilters[$class]) + && is_array($this->_objectFilters[$class]) + && in_array($just_name,$this->_objectFilters[$class]))) { + + if (array_key_exists($raw_name,$members) + && !$property->isStatic()) { + + $return[$name] = $this->_encodeObject($members[$raw_name], $objectDepth + 1, 1); + + } else { + if (method_exists($property,'setAccessible')) { + $property->setAccessible(true); + $return[$name] = $this->_encodeObject($property->getValue($object), $objectDepth + 1, 1); + } else + if ($property->isPublic()) { + $return[$name] = $this->_encodeObject($property->getValue($object), $objectDepth + 1, 1); + } else { + $return[$name] = '** Need PHP 5.3 to get value **'; + } + } + } else { + $return[$name] = '** Excluded by Filter **'; + } } - + // Include all members that are not defined in the class // but exist in the object - foreach($members as $name => $value) { + foreach($members as $just_name => $value) { + + $name = $raw_name = $just_name; + 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); + + if (!(isset($this->objectFilters[$class]) + && is_array($this->objectFilters[$class]) + && in_array($just_name,$this->objectFilters[$class]))) { + + $return[$name] = $this->_encodeObject($value, $objectDepth + 1, 1); + } else { + $return[$name] = '** Excluded by Filter **'; + } } } - + array_pop($this->_objectStack); - + } elseif (is_array($object)) { - - if ($depth > $this->_maxArrayDepth) { - return '** Max Depth **'; + + if ($arrayDepth > $this->_options['maxArrayDepth']) { + return '** Max Array Depth ('.$this->_options['maxArrayDepth'].') **'; } 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 @@ -561,50 +748,52 @@ class Zend_Wildfire_Plugin_FirePhp implements Zend_Wildfire_Plugin_Interface if ($key=='GLOBALS' && is_array($val) && array_key_exists('GLOBALS',$val)) { - + $val['GLOBALS'] = '** Recursion (GLOBALS) **'; } - $return[$key] = $this->_encodeObject($val, $depth + 1); + $return[$key] = $this->_encodeObject($val, 1, $arrayDepth + 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) { + 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->send($message->getMessage(), + $message->getLabel(), + $message->getStyle(), + $message->getOptions()); } } - + $this->_messages = array(); } } diff --git a/libs/Zend/Wildfire/Plugin/FirePhp/Message.php b/libs/Zend/Wildfire/Plugin/FirePhp/Message.php index cdb80a5..dca8fb1 100644 --- a/libs/Zend/Wildfire/Plugin/FirePhp/Message.php +++ b/libs/Zend/Wildfire/Plugin/FirePhp/Message.php @@ -68,6 +68,15 @@ class Zend_Wildfire_Plugin_FirePhp_Message */ protected $_ruid = false; + /** + * Options for the object + * @var array + */ + protected $_options = array( + 'traceOffset' => null, /* The offset in the trace which identifies the source of the message */ + 'includeLineNumbers' => null /* Whether to include line and file info for this message */ + ); + /** * Creates a new message with the given style and message * @@ -191,5 +200,46 @@ class Zend_Wildfire_Plugin_FirePhp_Message { return $this->_message; } + + /** + * Set a single option + * + * @param string $key The name of the option + * @param mixed $value The value of the option + * @return mixed The previous value of the option + */ + public function setOption($key, $value) + { + if(!array_key_exists($key,$this->_options)) { + throw new Zend_Wildfire_Exception('Option with name "'.$key.'" does not exist!'); + } + $previous = $this->_options[$key]; + $this->_options[$key] = $value; + return $previous; + } + + /** + * Retrieve a single option + * + * @param string $key The name of the option + * @return mixed The value of the option + */ + public function getOption($key) + { + if(!array_key_exists($key,$this->_options)) { + throw new Zend_Wildfire_Exception('Option with name "'.$key.'" does not exist!'); + } + return $this->_options[$key]; + } + + /** + * Retrieve all options + * + * @return array All options + */ + public function getOptions() + { + return $this->_options; + } } diff --git a/libs/Zend/Wildfire/Plugin/FirePhp/TableMessage.php b/libs/Zend/Wildfire/Plugin/FirePhp/TableMessage.php index 8a5bf85..dadaa1a 100644 --- a/libs/Zend/Wildfire/Plugin/FirePhp/TableMessage.php +++ b/libs/Zend/Wildfire/Plugin/FirePhp/TableMessage.php @@ -90,9 +90,75 @@ class Zend_Wildfire_Plugin_FirePhp_TableMessage extends Zend_Wildfire_Plugin_Fir public function getMessage() { $table = $this->_rows; - array_unshift($table,$this->_header); + if($this->_header) { + array_unshift($table,$this->_header); + } return $table; } -} + /** + * Returns the row at the given index + * + * @param integer $index The index of the row + * @return array Returns the row + * @throws Zend_Wildfire_Exception + */ + public function getRowAt($index) + { + $count = $this->getRowCount(); + + if($index < 0 || $index > $count-1) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Row index('.$index.') out of bounds('.$count.')!'); + } + + return $this->_rows[$index]; + } + /** + * Sets the row on the given index to a new row + * + * @param integer $index The index of the row + * @param array $row The new data for the row + * @throws Zend_Wildfire_Exception + */ + public function setRowAt($index, $row) + { + $count = $this->getRowCount(); + + if($index < 0 || $index > $count-1) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Row index('.$index.') out of bounds('.$count.')!'); + } + + $this->_rows[$index] = $row; + } + + /** + * Returns the number of rows + * + * @return integer + */ + public function getRowCount() + { + return count($this->_rows); + } + + /** + * Returns the last row of the table + * + * @return array Returns the last row + * @throws Zend_Wildfire_Exception + */ + public function getLastRow() + { + $count = $this->getRowCount(); + + if($count==0) { + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Cannot get last row as no rows exist!'); + } + + return $this->_rows[$count-1]; + } +} diff --git a/libs/Zend/Wildfire/Protocol/JsonStream.php b/libs/Zend/Wildfire/Protocol/JsonStream.php index 7e68d8d..9a30d2c 100644 --- a/libs/Zend/Wildfire/Protocol/JsonStream.php +++ b/libs/Zend/Wildfire/Protocol/JsonStream.php @@ -19,9 +19,6 @@ * @license http://framework.zend.com/license/new-bsd New BSD License */ -/** Zend_Wildfire_Exception */ -require_once 'Zend/Wildfire/Exception.php'; - /** Zend_Wildfire_Plugin_Interface */ require_once 'Zend/Wildfire/Plugin/Interface.php'; @@ -33,7 +30,7 @@ require_once 'Zend/Json.php'; /** * Encodes messages into the Wildfire JSON Stream Communication Protocol. - * + * * @category Zend * @package Zend_Wildfire * @subpackage Protocol @@ -58,10 +55,10 @@ class Zend_Wildfire_Protocol_JsonStream * @var array */ protected $_plugins = array(); - + /** * Register a plugin that uses this protocol - * + * * @param Zend_Wildfire_Plugin_Interface $plugin The plugin to be registered * @return boolean Returns TRUE if plugin was registered, false if it was already registered */ @@ -76,7 +73,7 @@ class Zend_Wildfire_Protocol_JsonStream /** * 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 @@ -85,40 +82,40 @@ class Zend_Wildfire_Protocol_JsonStream public function recordMessage(Zend_Wildfire_Plugin_Interface $plugin, $structure, $data) { if(!isset($this->_messages[$structure])) { - $this->_messages[$structure] = array(); + $this->_messages[$structure] = array(); } - + $uri = $plugin->getUri(); - + if(!isset($this->_messages[$structure][$uri])) { - $this->_messages[$structure][$uri] = array(); + $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]); } @@ -128,7 +125,7 @@ class Zend_Wildfire_Protocol_JsonStream /** * Get all qued messages - * + * * @return mixed Returns qued messages or FALSE if no messages are qued */ public function getMessages() @@ -152,7 +149,7 @@ class Zend_Wildfire_Protocol_JsonStream /** * 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 @@ -160,19 +157,20 @@ class Zend_Wildfire_Protocol_JsonStream 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.'); + require_once 'Zend/Wildfire/Exception.php'; + 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; @@ -181,19 +179,19 @@ class Zend_Wildfire_Protocol_JsonStream $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 ; $i 99999) { - throw new Zend_Wildfire_Exception('Maximum number (99,999) of messages reached!'); + require_once 'Zend/Wildfire/Exception.php'; + throw new Zend_Wildfire_Exception('Maximum number (99,999) of messages reached!'); } } } diff --git a/libs/Zend/XmlRpc/Client.php b/libs/Zend/XmlRpc/Client.php index f859fa8..e70025a 100644 --- a/libs/Zend/XmlRpc/Client.php +++ b/libs/Zend/XmlRpc/Client.php @@ -26,18 +26,6 @@ */ require_once 'Zend/Http/Client.php'; -/** - * Exception thrown when an HTTP error occurs - * @see Zend_XmlRpc_Client_HttpException - */ -require_once 'Zend/XmlRpc/Client/HttpException.php'; - -/** - * Exception thrown when an XML-RPC fault is returned - * @see Zend_XmlRpc_Client_FaultException - */ -require_once 'Zend/XmlRpc/Client/FaultException.php'; - /** * Enables object chaining for calling namespaced XML-RPC methods. * @see Zend_XmlRpc_Client_ServerProxy @@ -236,8 +224,8 @@ class Zend_XmlRpc_Client /** * Set skip system lookup flag - * - * @param bool $flag + * + * @param bool $flag * @return Zend_XmlRpc_Client */ public function setSkipSystemLookup($flag = true) @@ -248,7 +236,7 @@ class Zend_XmlRpc_Client /** * Skip system lookup when determining if parameter should be array or struct? - * + * * @return bool */ public function skipSystemLookup() @@ -262,6 +250,7 @@ class Zend_XmlRpc_Client * @param Zend_XmlRpc_Request $request * @param null|Zend_XmlRpc_Response $response * @return void + * @throws Zend_XmlRpc_Client_HttpException */ public function doRequest($request, $response = null) { @@ -287,6 +276,11 @@ class Zend_XmlRpc_Client $httpResponse = $http->request(Zend_Http_Client::POST); if (! $httpResponse->isSuccessful()) { + /** + * Exception thrown when an HTTP error occurs + * @see Zend_XmlRpc_Client_HttpException + */ + require_once 'Zend/XmlRpc/Client/HttpException.php'; throw new Zend_XmlRpc_Client_HttpException( $httpResponse->getMessage(), $httpResponse->getStatus()); @@ -302,9 +296,10 @@ class Zend_XmlRpc_Client /** * 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 + * @param string $method Name of the method we want to call + * @param array $params Array of parameters for the method + * @return mixed + * @throws Zend_XmlRpc_Client_FaultException */ public function call($method, $params=array()) { @@ -332,10 +327,10 @@ class Zend_XmlRpc_Client } } $params[$key] = array( - 'type' => $type, + 'type' => $type, 'value' => $param ); - } + } } } } @@ -346,6 +341,11 @@ class Zend_XmlRpc_Client if ($this->_lastResponse->isFault()) { $fault = $this->_lastResponse->getFault(); + /** + * Exception thrown when an XML-RPC fault is returned + * @see Zend_XmlRpc_Client_FaultException + */ + require_once 'Zend/XmlRpc/Client/FaultException.php'; throw new Zend_XmlRpc_Client_FaultException($fault->getMessage(), $fault->getCode()); } diff --git a/libs/Zend/XmlRpc/Client/ServerIntrospection.php b/libs/Zend/XmlRpc/Client/ServerIntrospection.php index a382ccf..b2d05c1 100644 --- a/libs/Zend/XmlRpc/Client/ServerIntrospection.php +++ b/libs/Zend/XmlRpc/Client/ServerIntrospection.php @@ -19,11 +19,6 @@ * @license http://framework.zend.com/license/new-bsd New BSD License */ - -/** Zend_XmlRpc_Client_IntrospectException */ -require_once 'Zend/XmlRpc/Client/IntrospectException.php'; - - /** * Wraps the XML-RPC system.* introspection methods * @@ -60,6 +55,7 @@ class Zend_XmlRpc_Client_ServerIntrospection { $methods = $this->listMethods(); + require_once 'Zend/XmlRpc/Client/FaultException.php'; try { $signatures = $this->getSignatureForEachMethodByMulticall($methods); } catch (Zend_XmlRpc_Client_FaultException $e) { @@ -98,11 +94,13 @@ class Zend_XmlRpc_Client_ServerIntrospection if (! is_array($serverSignatures)) { $type = gettype($serverSignatures); $error = "Multicall return is malformed. Expected array, got $type"; + require_once 'Zend/XmlRpc/Client/IntrospectException.php'; throw new Zend_XmlRpc_Client_IntrospectException($error); } if (count($serverSignatures) != count($methods)) { $error = 'Bad number of signatures received from multicall'; + require_once 'Zend/XmlRpc/Client/IntrospectException.php'; throw new Zend_XmlRpc_Client_IntrospectException($error); } diff --git a/libs/Zend/XmlRpc/Fault.php b/libs/Zend/XmlRpc/Fault.php index 336e970..3457df9 100644 --- a/libs/Zend/XmlRpc/Fault.php +++ b/libs/Zend/XmlRpc/Fault.php @@ -23,11 +23,6 @@ */ require_once 'Zend/XmlRpc/Value.php'; -/** - * Zend_XmlRpc_Exception - */ -require_once 'Zend/XmlRpc/Exception.php'; - /** * XMLRPC Faults * @@ -197,6 +192,7 @@ class Zend_XmlRpc_Fault public function loadXml($fault) { if (!is_string($fault)) { + require_once 'Zend/XmlRpc/Exception.php'; throw new Zend_XmlRpc_Exception('Invalid XML provided to fault'); } @@ -204,6 +200,7 @@ class Zend_XmlRpc_Fault $xml = @new SimpleXMLElement($fault); } catch (Exception $e) { // Not valid XML + require_once 'Zend/XmlRpc/Exception.php'; throw new Zend_XmlRpc_Exception('Failed to parse XML fault: ' . $e->getMessage(), 500); } @@ -215,6 +212,7 @@ class Zend_XmlRpc_Fault if (!$xml->fault->value->struct) { // not a proper fault + require_once 'Zend/XmlRpc/Exception.php'; throw new Zend_XmlRpc_Exception('Invalid fault structure', 500); } @@ -231,6 +229,7 @@ class Zend_XmlRpc_Fault } if (empty($code) && empty($message)) { + require_once 'Zend/XmlRpc/Exception.php'; throw new Zend_XmlRpc_Exception('Fault code and string required'); } @@ -261,6 +260,7 @@ class Zend_XmlRpc_Fault public static function isFault($xml) { $fault = new self(); + require_once 'Zend/XmlRpc/Exception.php'; try { $isFault = $fault->loadXml($xml); } catch (Zend_XmlRpc_Exception $e) { diff --git a/libs/Zend/XmlRpc/Request.php b/libs/Zend/XmlRpc/Request.php index 6e08acf..cf46849 100644 --- a/libs/Zend/XmlRpc/Request.php +++ b/libs/Zend/XmlRpc/Request.php @@ -18,11 +18,6 @@ * @license http://framework.zend.com/license/new-bsd New BSD License */ -/** - * Zend_XmlRpc_Exception - */ -require_once 'Zend/XmlRpc/Exception.php'; - /** * Zend_XmlRpc_Value */ @@ -48,7 +43,7 @@ require_once 'Zend/XmlRpc/Fault.php'; * @package Zend_XmlRpc * @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: Request.php 8997 2008-03-22 17:17:05Z matthew $ + * @version $Id: Request.php 13223 2008-12-14 11:21:31Z thomas $ */ class Zend_XmlRpc_Request { @@ -285,7 +280,7 @@ class Zend_XmlRpc_Request /** * Return parameter types - * + * * @return array */ public function getTypes() diff --git a/libs/Zend/XmlRpc/Server.php b/libs/Zend/XmlRpc/Server.php index bcb4cba..dbf8b52 100644 --- a/libs/Zend/XmlRpc/Server.php +++ b/libs/Zend/XmlRpc/Server.php @@ -17,7 +17,7 @@ * @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 - * @version $Id: Server.php 12195 2008-10-30 13:34:35Z matthew $ + * @version $Id: Server.php 13223 2008-12-14 11:21:31Z thomas $ */ /** @@ -25,11 +25,6 @@ */ require_once 'Zend/Server/Abstract.php'; -/** - * Exception this class throws - */ -require_once 'Zend/XmlRpc/Server/Exception.php'; - /** * XMLRPC Request */ @@ -190,9 +185,9 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract /** * Proxy calls to system object - * - * @param string $method - * @param array $params + * + * @param string $method + * @param array $params * @return mixed * @throws Zend_XmlRpc_Server_Exception */ @@ -200,6 +195,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract { $system = $this->getSystem(); if (!method_exists($system, $method)) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Unknown instance method called on server: ' . $method); } return call_user_func_array(array($system, $method), $params); @@ -224,6 +220,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract public function addFunction($function, $namespace = '') { if (!is_string($function) && !is_array($function)) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Unable to attach function; invalid', 611); } @@ -236,6 +233,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract $function = (array) $function; foreach ($function as $func) { if (!is_string($func) || !function_exists($func)) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Unable to attach function; invalid', 611); } $reflection = Zend_Server_Reflection::reflectFunction($func, $argv, $namespace); @@ -264,6 +262,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract { if (is_string($class) && !class_exists($class)) { if (!class_exists($class)) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Invalid method class', 610); } } @@ -294,6 +293,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract if (empty($fault)) { $fault = 'Unknown error'; } + require_once 'Zend/XmlRpc/Server/Exception.php'; $fault = new Zend_XmlRpc_Server_Exception($fault, $code); } @@ -353,6 +353,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract } else { $type = gettype($definition); } + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Unable to load server definition; must be an array or Zend_Server_Definition, received ' . $type, 612); } @@ -415,10 +416,12 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract if (is_string($request) && class_exists($request)) { $request = new $request(); if (!$request instanceof Zend_XmlRpc_Request) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Invalid request class'); } $request->setEncoding($this->getEncoding()); } elseif (!$request instanceof Zend_XmlRpc_Request) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Invalid request object'); } @@ -457,7 +460,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract /** * Retrieve current response class - * + * * @return string */ public function getResponseClass() @@ -467,7 +470,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract /** * Retrieve dispatch table - * + * * @return array */ public function getDispatchTable() @@ -490,7 +493,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract /** * Retrieve system object - * + * * @return Zend_XmlRpc_Server_System */ public function getSystem() @@ -500,8 +503,8 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract /** * Map PHP type to XML-RPC type - * - * @param string $type + * + * @param string $type * @return string */ protected function _fixType($type) @@ -527,6 +530,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract // Check for valid method if (!$this->_table->hasMethod($method)) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Method "' . $method . '" does not exist', 620); } @@ -559,6 +563,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract } } if (!$matched) { + require_once 'Zend/XmlRpc/Server/Exception.php'; throw new Zend_XmlRpc_Server_Exception('Calling parameters do not match signature', 623); } @@ -569,7 +574,7 @@ class Zend_XmlRpc_Server extends Zend_Server_Abstract /** * Register system methods with the server - * + * * @return void */ protected function _registerSystemMethods() diff --git a/libs/Zend/XmlRpc/Server/System.php b/libs/Zend/XmlRpc/Server/System.php index b1e7cb9..4090209 100644 --- a/libs/Zend/XmlRpc/Server/System.php +++ b/libs/Zend/XmlRpc/Server/System.php @@ -31,6 +31,11 @@ */ class Zend_XmlRpc_Server_System { + /** + * @var Zend_XmlRpc_Server + */ + protected $_server; + /** * Constructor * diff --git a/libs/Zend/XmlRpc/Value.php b/libs/Zend/XmlRpc/Value.php index 4439732..9cdd377 100644 --- a/libs/Zend/XmlRpc/Value.php +++ b/libs/Zend/XmlRpc/Value.php @@ -17,13 +17,9 @@ * @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 - * @version $Id: Value.php 9095 2008-03-30 18:52:31Z thomas $ + * @version $Id: Value.php 13223 2008-12-14 11:21:31Z thomas $ */ - -/** Zend_XmlRpc_Value_Exception */ -require_once 'Zend/XmlRpc/Value/Exception.php'; - /** Zend_XmlRpc_Value_Scalar */ require_once 'Zend/XmlRpc/Value/Scalar.php'; @@ -57,7 +53,6 @@ require_once 'Zend/XmlRpc/Value/Array.php'; /** Zend_XmlRpc_Value_Struct */ require_once 'Zend/XmlRpc/Value/Struct.php'; - /** * Represent a native XML-RPC value entity, used as parameters for the methods * called by the Zend_XmlRpc_Client object and as the return value for those calls. @@ -227,6 +222,7 @@ abstract class Zend_XmlRpc_Value return new Zend_XmlRpc_Value_Struct($value); default: + require_once 'Zend/XmlRpc/Value/Exception.php'; throw new Zend_XmlRpc_Value_Exception('Given type is not a '. __CLASS__ .' constant'); } } @@ -248,7 +244,7 @@ abstract class Zend_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 @@ -300,6 +296,7 @@ abstract class Zend_XmlRpc_Value $simple_xml = @new SimpleXMLElement($simple_xml); } catch (Exception $e) { // The given string is not a valid XML + require_once 'Zend/XmlRpc/Value/Exception.php'; throw new Zend_XmlRpc_Value_Exception('Failed to create XML-RPC value from XML string: '.$e->getMessage(),$e->getCode()); } } @@ -338,10 +335,11 @@ abstract class Zend_XmlRpc_Value case self::XMLRPC_TYPE_ARRAY: // If the XML is valid, $value must be an SimpleXML element and contain the tag if (!$value instanceof SimpleXMLElement) { + require_once 'Zend/XmlRpc/Value/Exception.php'; 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) + // 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) { @@ -350,8 +348,9 @@ abstract class Zend_XmlRpc_Value break; } } - + if (null === $data) { + require_once 'Zend/XmlRpc/Value/Exception.php'; 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(); @@ -365,6 +364,7 @@ abstract class Zend_XmlRpc_Value case self::XMLRPC_TYPE_STRUCT: // If the XML is valid, $value must be an SimpleXML if ((!$value instanceof SimpleXMLElement)) { + require_once 'Zend/XmlRpc/Value/Exception.php'; throw new Zend_XmlRpc_Value_Exception('XML string is invalid for XML-RPC native '. self::XMLRPC_TYPE_STRUCT .' type'); } $values = array(); @@ -373,7 +373,7 @@ abstract class Zend_XmlRpc_Value 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)) { + if ((!$member->value instanceof SimpleXMLElement)) { continue; //throw new Zend_XmlRpc_Value_Exception('Member of the '. self::XMLRPC_TYPE_STRUCT .' XML-RPC native type must contain a VALUE tag'); } @@ -382,6 +382,7 @@ abstract class Zend_XmlRpc_Value $xmlrpc_val = new Zend_XmlRpc_Value_Struct($values); break; default: + require_once 'Zend/XmlRpc/Value/Exception.php'; throw new Zend_XmlRpc_Value_Exception('Value type \''. $type .'\' parsed from the XML string is not a known XML-RPC native type'); break; } diff --git a/libs/htmlpurifier/CREDITS b/libs/htmlpurifier/CREDITS new file mode 100755 index 0000000..7921b45 --- /dev/null +++ b/libs/htmlpurifier/CREDITS @@ -0,0 +1,9 @@ + +CREDITS + +Almost everything written by Edward Z. Yang (Ambush Commander). Lots of thanks +to the DevNetwork Community for their help (see docs/ref-devnetwork.html for +more details), Feyd especially (namely IPv6 and optimization). Thanks to RSnake +for letting me package his fantastic XSS cheatsheet for a smoketest. + + vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/INSTALL b/libs/htmlpurifier/INSTALL new file mode 100755 index 0000000..8ee41e8 --- /dev/null +++ b/libs/htmlpurifier/INSTALL @@ -0,0 +1,373 @@ + +Install + How to install HTML Purifier + +HTML Purifier is designed to run out of the box, so actually using the +library is extremely easy. (Although... if you were looking for a +step-by-step installation GUI, you've downloaded the wrong software!) + +While the impatient can get going immediately with some of the sample +code at the bottom of this library, it's well worth reading this entire +document--most of the other documentation assumes that you are familiar +with these contents. + + +--------------------------------------------------------------------------- +1. Compatibility + +HTML Purifier is PHP 5 only, and is actively tested from PHP 5.0.5 and +up. It has no core dependencies with other libraries. PHP +4 support was deprecated on December 31, 2007 with HTML Purifier 3.0.0. + +These optional extensions can enhance the capabilities of HTML Purifier: + + * iconv : Converts text to and from non-UTF-8 encodings + * bcmath : Used for unit conversion and imagecrash protection + * tidy : Used for pretty-printing HTML + + +--------------------------------------------------------------------------- +2. Reconnaissance + +A big plus of HTML Purifier is its inerrant support of standards, so +your web-pages should be standards-compliant. (They should also use +semantic markup, but that's another issue altogether, one HTML Purifier +cannot fix without reading your mind.) + +HTML Purifier can process these doctypes: + +* XHTML 1.0 Transitional (default) +* XHTML 1.0 Strict +* HTML 4.01 Transitional +* HTML 4.01 Strict +* XHTML 1.1 + +...and these character encodings: + +* UTF-8 (default) +* Any encoding iconv supports (with crippled internationalization support) + +These defaults reflect what my choices would be if I were authoring an +HTML document, however, what you choose depends on the nature of your +codebase. If you don't know what doctype you are using, you can determine +the doctype from this identifier at the top of your source code: + + + +...and the character encoding from this code: + + + +If the character encoding declaration is missing, STOP NOW, and +read 'docs/enduser-utf8.html' (web accessible at +http://htmlpurifier.org/docs/enduser-utf8.html). In fact, even if it is +present, read this document anyway, as many websites specify their +document's character encoding incorrectly. + + +--------------------------------------------------------------------------- +3. Including the library + +The procedure is quite simple: + + require_once '/path/to/library/HTMLPurifier.auto.php'; + +This will setup an autoloader, so the library's files are only included +when you use them. + +Only the contents in the library/ folder are necessary, so you can remove +everything else when using HTML Purifier in a production environment. + +If you installed HTML Purifier via PEAR, all you need to do is: + + require_once 'HTMLPurifier.auto.php'; + +Please note that the usual PEAR practice of including just the classes you +want will not work with HTML Purifier's autoloading scheme. + +Advanced users, read on; other users can skip to section 4. + +Autoload compatibility +---------------------- + + HTML Purifier attempts to be as smart as possible when registering an + autoloader, but there are some cases where you will need to change + your own code to accomodate HTML Purifier. These are those cases: + + PHP VERSION IS LESS THAN 5.1.2, AND YOU'VE DEFINED __autoload + Because spl_autoload_register() doesn't exist in early versions + of PHP 5, HTML Purifier has no way of adding itself to the autoload + stack. Modify your __autoload function to test + HTMLPurifier_Bootstrap::autoload($class) + + For example, suppose your autoload function looks like this: + + function __autoload($class) { + require str_replace('_', '/', $class) . '.php'; + return true; + } + + A modified version with HTML Purifier would look like this: + + function __autoload($class) { + if (HTMLPurifier_Bootstrap::autoload($class)) return true; + require str_replace('_', '/', $class) . '.php'; + return true; + } + + Note that there *is* some custom behavior in our autoloader; the + original autoloader in our example would work for 99% of the time, + but would fail when including language files. + + AN __autoload FUNCTION IS DECLARED AFTER OUR AUTOLOADER IS REGISTERED + spl_autoload_register() has the curious behavior of disabling + the existing __autoload() handler. Users need to explicitly + spl_autoload_register('__autoload'). Because we use SPL when it + is available, __autoload() will ALWAYS be disabled. If __autoload() + is declared before HTML Purifier is loaded, this is not a problem: + HTML Purifier will register the function for you. But if it is + declared afterwards, it will mysteriously not work. This + snippet of code (after your autoloader is defined) will fix it: + + spl_autoload_register('__autoload') + + Users should also be on guard if they use a version of PHP previous + to 5.1.2 without an autoloader--HTML Purifier will define __autoload() + for you, which can collide with an autoloader that was added by *you* + later. + + +For better performance +---------------------- + + Opcode caches, which greatly speed up PHP initialization for scripts + with large amounts of code (HTML Purifier included), don't like + autoloaders. We offer an include file that includes all of HTML Purifier's + files in one go in an opcode cache friendly manner: + + // If /path/to/library isn't already in your include path, uncomment + // the below line: + // require '/path/to/library/HTMLPurifier.path.php'; + + require 'HTMLPurifier.includes.php'; + + Optional components still need to be included--you'll know if you try to + use a feature and you get a class doesn't exists error! The autoloader + can be used in conjunction with this approach to catch classes that are + missing. Simply add this afterwards: + + require 'HTMLPurifier.autoload.php'; + +Standalone version +------------------ + + HTML Purifier has a standalone distribution; you can also generate + a standalone file from the full version by running the script + maintenance/generate-standalone.php . The standalone version has the + benefit of having most of its code in one file, so parsing is much + faster and the library is easier to manage. + + If HTMLPurifier.standalone.php exists in the library directory, you + can use it like this: + + require '/path/to/HTMLPurifier.standalone.php'; + + This is equivalent to including HTMLPurifier.includes.php, except that + the contents of standalone/ will be added to your path. To override this + behavior, specify a new HTMLPURIFIER_PREFIX where standalone files can + be found (usually, this will be one directory up, the "true" library + directory in full distributions). Don't forget to set your path too! + + The autoloader can be added to the end to ensure the classes are + loaded when necessary; otherwise you can manually include them. + To use the autoloader, use this: + + require 'HTMLPurifier.autoload.php'; + +For advanced users +------------------ + + HTMLPurifier.auto.php performs a number of operations that can be done + individually. These are: + + HTMLPurifier.path.php + Puts /path/to/library in the include path. For high performance, + this should be done in php.ini. + + HTMLPurifier.autoload.php + Registers our autoload handler HTMLPurifier_Bootstrap::autoload($class). + + You can do these operations by yourself--in fact, you must modify your own + autoload handler if you are using a version of PHP earlier than PHP 5.1.2 + (See "Autoload compatibility" above). + + +--------------------------------------------------------------------------- +4. Configuration + +HTML Purifier is designed to run out-of-the-box, but occasionally HTML +Purifier needs to be told what to do. If you answer no to any of these +questions, read on; otherwise, you can skip to the next section (or, if you're +into configuring things just for the heck of it, skip to 4.3). + +* Am I using UTF-8? +* Am I using XHTML 1.0 Transitional? + +If you answered no to any of these questions, instantiate a configuration +object and read on: + + $config = HTMLPurifier_Config::createDefault(); + + +4.1. Setting a different character encoding + +You really shouldn't use any other encoding except UTF-8, especially if you +plan to support multilingual websites (read section three for more details). +However, switching to UTF-8 is not always immediately feasible, so we can +adapt. + +HTML Purifier uses iconv to support other character encodings, as such, +any encoding that iconv supports +HTML Purifier supports with this code: + + $config->set('Core', 'Encoding', /* put your encoding here */); + +An example usage for Latin-1 websites (the most common encoding for English +websites): + + $config->set('Core', 'Encoding', 'ISO-8859-1'); + +Note that HTML Purifier's support for non-Unicode encodings is crippled by the +fact that any character not supported by that encoding will be silently +dropped, EVEN if it is ampersand escaped. If you want to work around +this, you are welcome to read docs/enduser-utf8.html for a fix, +but please be cognizant of the issues the "solution" creates (for this +reason, I do not include the solution in this document). + + +4.2. Setting a different doctype + +For those of you using HTML 4.01 Transitional, you can disable +XHTML output like this: + + $config->set('HTML', 'Doctype', 'HTML 4.01 Transitional'); + +Other supported doctypes include: + + * HTML 4.01 Strict + * HTML 4.01 Transitional + * XHTML 1.0 Strict + * XHTML 1.0 Transitional + * XHTML 1.1 + + +4.3. Other settings + +There are more configuration directives which can be read about +here: They're a bit boring, +but they can help out for those of you who like to exert maximum control over +your code. Some of the more interesting ones are configurable at the +demo and are well worth looking into +for your own system. + +For example, you can fine tune allowed elements and attributes, convert +relative URLs to absolute ones, and even autoparagraph input text! These +are, respectively, %HTML.Allowed, %URI.MakeAbsolute and %URI.Base, and +%AutoFormat.AutoParagraph. The %Namespace.Directive naming convention +translates to: + + $config->set('Namespace', 'Directive', $value); + +E.g. + + $config->set('HTML', 'Allowed', 'p,b,a[href],i'); + $config->set('URI', 'Base', 'http://www.example.com'); + $config->set('URI', 'MakeAbsolute', true); + $config->set('AutoFormat', 'AutoParagraph', true); + + +--------------------------------------------------------------------------- +5. Caching + +HTML Purifier generates some cache files (generally one or two) to speed up +its execution. For maximum performance, make sure that +library/HTMLPurifier/DefinitionCache/Serializer is writeable by the webserver. + +If you are in the library/ folder of HTML Purifier, you can set the +appropriate permissions using: + + chmod -R 0755 HTMLPurifier/DefinitionCache/Serializer + +If the above command doesn't work, you may need to assign write permissions +to all. This may be necessary if your webserver runs as nobody, but is +not recommended since it means any other user can write files in the +directory. Use: + + chmod -R 0777 HTMLPurifier/DefinitionCache/Serializer + +You can also chmod files via your FTP client; this option +is usually accessible by right clicking the corresponding directory and +then selecting "chmod" or "file permissions". + +Starting with 2.0.1, HTML Purifier will generate friendly error messages +that will tell you exactly what you have to chmod the directory to, if in doubt, +follow its advice. + +If you are unable or unwilling to give write permissions to the cache +directory, you can either disable the cache (and suffer a performance +hit): + + $config->set('Core', 'DefinitionCache', null); + +Or move the cache directory somewhere else (no trailing slash): + + $config->set('Cache', 'SerializerPath', '/home/user/absolute/path'); + + +--------------------------------------------------------------------------- +6. Using the code + +The interface is mind-numbingly simple: + + $purifier = new HTMLPurifier(); + $clean_html = $purifier->purify( $dirty_html ); + +...or, if you're using the configuration object: + + $purifier = new HTMLPurifier($config); + $clean_html = $purifier->purify( $dirty_html ); + +That's it! For more examples, check out docs/examples/ (they aren't very +different though). Also, docs/enduser-slow.html gives advice on what to +do if HTML Purifier is slowing down your application. + + +--------------------------------------------------------------------------- +7. Quick install + +First, make sure library/HTMLPurifier/DefinitionCache/Serializer is +writable by the webserver (see Section 5: Caching above for details). +If your website is in UTF-8 and XHTML Transitional, use this code: + +purify($dirty_html); +?> + +If your website is in a different encoding or doctype, use this code: + +set('Core', 'Encoding', 'ISO-8859-1'); // replace with your encoding + $config->set('HTML', 'Doctype', 'HTML 4.01 Transitional'); // replace with your doctype + $purifier = new HTMLPurifier($config); + + $clean_html = $purifier->purify($dirty_html); +?> + + vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/LICENSE b/libs/htmlpurifier/LICENSE new file mode 100755 index 0000000..8c88a20 --- /dev/null +++ b/libs/htmlpurifier/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/NEWS b/libs/htmlpurifier/NEWS new file mode 100755 index 0000000..0ebf1a2 --- /dev/null +++ b/libs/htmlpurifier/NEWS @@ -0,0 +1,842 @@ +NEWS ( CHANGELOG and HISTORY ) HTMLPurifier +||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + += KEY ==================== + # Breaks back-compat + ! Feature + - Bugfix + + Sub-comment + . Internal change +========================== + +3.3.0, released 2009-02-16 +! Implement CSS property 'overflow' when %CSS.AllowTricky is true. +! Implement generic property list classess +- Fix bug with testEncodingSupportsASCII() algorithm when iconv() implementation + does not do the "right thing" with characters not supported in the output + set. +- Spellcheck UTF-8: The Secret To Character Encoding +- Fix improper removal of the contents of elements with only whitespace. Thanks + Eric Wald for reporting. +- Fix broken test suite in versions of PHP without spl_autoload_register() +- Fix degenerate case with YouTube filter involving double hyphens. + Thanks Pierre Attar for reporting. +- Fix YouTube rendering problem on certain versions of Firefox. +- Fix CSSDefinition Printer problems with decorators +- Add text parameter to unit tests, forces text output +. Add verbose mode to command line test runner, use (--verbose) +. Turn on unit tests for UnitConverter +. Fix missing version number in configuration %Attr.DefaultImageAlt (added 3.2.0) +. Fix newline errors that caused spurious failures when CRLF HTML Purifier was + tested on Linux. +. Removed trailing whitespace from all text files, see + remote-trailing-whitespace.php maintenance script. +. Convert configuration to use property list backend. + +3.2.0, released 2008-10-31 +# Using %Core.CollectErrors forces line number/column tracking on, whereas + previously you could theoretically turn it off. +# HTMLPurifier_Injector->notifyEnd() is formally deprecated. Please + use handleEnd() instead. +! %Output.AttrSort for when you need your attributes in alphabetical order to + deal with a bug in FCKEditor. Requested by frank farmer. +! Enable HTML comments when %HTML.Trusted is on. Requested by Waldo Jaquith. +! Proper support for name attribute. It is now allowed and equivalent to the id + attribute in a and img tags, and is only converted to id when %HTML.TidyLevel + is heavy (for all doctypes). +! %AutoFormat.RemoveEmpty to remove some empty tags from documents. Please don't + use on hand-written HTML. +! Add error-cases for unsupported elements in MakeWellFormed. This enables + the strategy to be used, standalone, on untrusted input. +! %Core.AggressivelyFixLt is on by default. This causes more sensible + processing of left angled brackets in smileys and other whatnot. +! Test scripts now have a 'type' parameter, which lets you say 'htmlpurifier', + 'phpt', 'vtest', etc. in order to only execute those tests. This supercedes + the --only-phpt parameter, although for backwards-compatibility the flag + will still work. +! AutoParagraph auto-formatter will now preserve double-newlines upon output. + Users who are not performing inbound filtering, this may seem a little + useless, but as a bonus, the test suite and handling of edge cases is also + improved. +! Experimental implementation of forms for %HTML.Trusted +! Track column numbers when maintain line numbers is on +! Proprietary 'background' attribute on table-related elements converted into + corresponding CSS. Thanks Fusemail for sponsoring this feature! +! Add forward(), forwardUntilEndToken(), backward() and current() to Injector + supertype. +! HTMLPurifier_Injector->handleEnd() permits modification to end tokens. The + time of operation varies slightly from notifyEnd() as *all* end tokens are + processed by the injector before they are subject to the well-formedness rules. +! %Attr.DefaultImageAlt allows overriding default behavior of setting alt to + basename of image when not present. +! %AutoFormat.DisplayLinkURI neuters tags into plain text URLs. +- Fix two bugs in %URI.MakeAbsolute; one involving empty paths in base URLs, + the other involving an undefined $is_folder error. +- Throw error when %Core.Encoding is set to a spurious value. Previously, + this errored silently and returned false. +- Redirected stderr to stdout for flush error output. +- %URI.DisableExternal will now use the host in %URI.Base if %URI.Host is not + available. +- Do not re-munge URL if the output URL has the same host as the input URL. + Requested by Chris. +- Fix error in documentation regarding %Filter.ExtractStyleBlocks +- Prevent ]]> from triggering %Core.ConvertDocumentToFragment +- Fix bug with inline elements in blockquotes conflicting with strict doctype +- Detect if HTML support is disabled for DOM by checking for loadHTML() method. +- Fix bug where dots and double-dots in absolute URLs without hostname were + not collapsed by URIFilter_MakeAbsolute. +- Fix bug with anonymous modules operating on SafeEmbed or SafeObject elements + by reordering their addition. +- Will now throw exception on many error conditions during lexer creation; also + throw an exception when MaintainLineNumbers is true, but a non-tracksLineNumbers + is being used. +- Detect if domxml extension is loaded, and use DirectLEx accordingly. +- Improve handling of big numbers with floating point arithmetic in UnitConverter. + Reported by David Morton. +. Strategy_MakeWellFormed now operates in-place, saving memory and allowing + for more interesting filter-backtracking +. New HTMLPurifier_Injector->rewind() functionality, allows injectors to rewind + index to reprocess tokens. +. StringHashParser now allows for multiline sections with "empty" content; + previously the section would remain undefined. +. Added --quick option to multitest.php, which tests only the most recent + release for each series. +. Added --distro option to multitest.php, which accepts either 'normal' or + 'standalone'. This supercedes --exclude-normal and --exclude-standalone + +3.1.1, released 2008-06-19 +# %URI.Munge now, by default, does not munge resources (for example, ) + In order to enable this again, please set %URI.MungeResources to true. +! More robust imagecrash protection with height/width CSS with %CSS.MaxImgLength, + and height/width HTML with %HTML.MaxImgLength. +! %URI.MungeSecretKey for secure URI munging. Thanks Chris + for sponsoring this feature. Check out the corresponding documentation + for details. (Att Nightly testers: The API for this feature changed before + the general release. Namely, rename your directives %URI.SecureMungeSecretKey => + %URI.MungeSecretKey and and %URI.SecureMunge => %URI.Munge) +! Implemented post URI filtering. Set member variable $post to true to set + a URIFilter as such. +! Allow modules to define injectors via $info_injector. Injectors are + automatically disabled if injector's needed elements are not found. +! Support for "safe" objects added, use %HTML.SafeObject and %HTML.SafeEmbed. + Thanks Chris for sponsoring. If you've been using ad hoc code from the + forums, PLEASE use this instead. +! Added substitutions for %e, %n, %a and %p in %URI.Munge (in order, + embedded, tag name, attribute name, CSS property name). See %URI.Munge + for more details. Requested by Jochem Blok. +- Disable percent height/width attributes for img. +- AttrValidator operations are now atomic; updates to attributes are not + manifest in token until end of operations. This prevents naughty internal + code from directly modifying CurrentToken when they're not supposed to. + This semantics change was requested by frank farmer. +- Percent encoding checks enabled for URI query and fragment +- Fix stray backslashes in font-family; CSS Unicode character escapes are + now properly resolved (although *only* in font-family). Thanks Takeshi Terada + for reporting. +- Improve parseCDATA algorithm to take into account newline normalization +- Account for browser confusion between Yen character and backslash in + Shift_JIS encoding. This fix generalizes to any other encoding which is not + a strict superset of printable ASCII. Thanks Takeshi Terada for reporting. +- Fix missing configuration parameter in Generator calls. Thanks vs for the + partial patch. +- Improved adherence to Unicode by checking for non-character codepoints. + Thanks Geoffrey Sneddon for reporting. This may result in degraded + performance for extremely large inputs. +- Allow CSS property-value pair ''text-decoration: none''. Thanks Jochem Blok + for reporting. +. Added HTMLPurifier_UnitConverter and HTMLPurifier_Length for convenient + handling of CSS-style lengths. HTMLPurifier_AttrDef_CSS_Length now uses + this class. +. API of HTMLPurifier_AttrDef_CSS_Length changed from __construct($disable_negative) + to __construct($min, $max). __construct(true) is equivalent to + __construct('0'). +. Added HTMLPurifier_AttrDef_Switch class +. Rename HTMLPurifier_HTMLModule_Tidy->construct() to setup() and bubble method + up inheritance hierarchy to HTMLPurifier_HTMLModule. All HTMLModules + get this called with the configuration object. All modules now + use this rather than __construct(), although legacy code using constructors + will still work--the new format, however, lets modules access the + configuration object for HTML namespace dependant tweaks. +. AttrDef_HTML_Pixels now takes a single construction parameter, pixels. +. ConfigSchema data-structure heavily optimized; on average it uses a third + the memory it did previously. The interface has changed accordingly, + consult changes to HTMLPurifier_Config for details. +. Variable parsing types now are magic integers instead of strings +. Added benchmark for ConfigSchema +. HTMLPurifier_Generator requires $config and $context parameters. If you + don't know what they should be, use HTMLPurifier_Config::createDefault() + and new HTMLPurifier_Context(). +. Printers now properly distinguish between output configuration, and + target configuration. This is not applicable to scripts using + the Printers for HTML Purifier related tasks. +. HTML/CSS Printers must be primed with prepareGenerator($gen_config), otherwise + fatal errors will ensue. +. URIFilter->prepare can return false in order to abort loading of the filter +. Factory for AttrDef_URI implemented, URI#embedded to indicate URI that embeds + an external resource. +. %URI.Munge functionality factored out into a post-filter class. +. Added CurrentCSSProperty context variable during CSS validation + +3.1.0, released 2008-05-18 +# Unnecessary references to objects (vestiges of PHP4) removed from method + signatures. The following methods do not need references when assigning from + them and will result in E_STRICT errors if you try: + + HTMLPurifier_Config->get*Definition() [* = HTML, CSS] + + HTMLPurifier_ConfigSchema::instance() + + HTMLPurifier_DefinitionCacheFactory::instance() + + HTMLPurifier_DefinitionCacheFactory->create() + + HTMLPurifier_DoctypeRegistry->register() + + HTMLPurifier_DoctypeRegistry->get() + + HTMLPurifier_HTMLModule->addElement() + + HTMLPurifier_HTMLModule->addBlankElement() + + HTMLPurifier_LanguageFactory::instance() +# Printer_ConfigForm's get*() functions were static-ified +# %HTML.ForbiddenAttributes requires attribute declarations to be in the + form of tag@attr, NOT tag.attr (which will throw an error and won't do + anything). This is for forwards compatibility with XML; you'd do best + to migrate an %HTML.AllowedAttributes directives to this syntax too. +! Allow index to be false for config from form creation +! Added HTMLPurifier::VERSION constant +! Commas, not dashes, used for serializer IDs. This change is forwards-compatible + and allows for version numbers like "3.1.0-dev". +! %HTML.Allowed deals gracefully with whitespace anywhere, anytime! +! HTML Purifier's URI handling is a lot more robust, with much stricter + validation checks and better percent encoding handling. Thanks Gareth Heyes + for indicating security vulnerabilities from lax percent encoding. +! Bootstrap autoloader deals more robustly with classes that don't exist, + preventing class_exists($class, true) from barfing. +- InterchangeBuilder now alphabetizes its lists +- Validation error in configdoc output fixed +- Iconv and other encoding errors muted even with custom error handlers that + do not honor error_reporting +- Add protection against imagecrash attack with CSS height/width +- HTMLPurifier::instance() created for consistency, is equivalent to getInstance() +- Fixed and revamped broken ConfigForm smoketest +- Bug with bool/null fields in Printer_ConfigForm fixed +- Bug with global forbidden attributes fixed +- Improved error messages for allowed and forbidden HTML elements and attributes +- Missing (or null) in configdoc documentation restored +- If DOM throws and exception during parsing with PH5P (occurs in newer versions + of DOM), HTML Purifier punts to DirectLex +- Fatal error with unserialization of ScriptRequired +- Created directories are now chmod'ed properly +- Fixed bug with fallback languages in LanguageFactory +- Standalone testing setup properly with autoload +. Out-of-date documentation revised +. UTF-8 encoding check optimization as suggested by Diego +. HTMLPurifier_Error removed in favor of exceptions +. More copy() function removed; should use clone instead +. More extensive unit tests for HTMLDefinition +. assertPurification moved to central harness +. HTMLPurifier_Generator accepts $config and $context parameters during + instantiation, not runtime +. Double-quotes outside of attribute values are now unescaped + +3.1.0rc1, released 2008-04-22 +# Autoload support added. Internal require_once's removed in favor of an + explicit require list or autoloading. To use HTML Purifier, + you must now either use HTMLPurifier.auto.php + or HTMLPurifier.includes.php; setting the include path and including + HTMLPurifier.php is insufficient--in such cases include HTMLPurifier.autoload.php + as well to register our autoload handler (or modify your autoload function + to check HTMLPurifier_Bootstrap::getPath($class)). You can also use + HTMLPurifier.safe-includes.php for a less performance friendly but more + user-friendly library load. +# HTMLPurifier_ConfigSchema static functions are officially deprecated. Schema + information is stored in the ConfigSchema directory, and the + maintenance/generate-schema-cache.php generates the schema.ser file, which + is now instantiated. Support for userland schema changes coming soon! +# HTMLPurifier_Config will now throw E_USER_NOTICE when you use a directive + alias; to get rid of these errors just modify your configuration to use + the new directive name. +# HTMLPurifier->addFilter is deprecated; built-in filters can now be + enabled using %Filter.$filter_name or by setting your own filters using + %Filter.Custom +# Directive-level safety properties superceded in favor of module-level + safety. Internal method HTMLModule->addElement() has changed, although + the externally visible HTMLDefinition->addElement has *not* changed. +! Extra utility classes for testing and non-library operations can + be found in extras/. Specifically, these are FSTools and ConfigDoc. + You may find a use for these in your own project, but right now they + are highly experimental and volatile. +! Integration with PHPT allows for automated smoketests +! Limited support for proprietary HTML elements, namely , sponsored + by Chris. You can enable them with %HTML.Proprietary if your client + demands them. +! Support for !important CSS cascade modifier. By default, this will be stripped + from CSS, but you can enable it using %CSS.AllowImportant +! Support for display and visibility CSS properties added, set %CSS.AllowTricky + to true to use them. +! HTML Purifier now has its own Exception hierarchy under HTMLPurifier_Exception. + Developer error (not enduser error) can cause these to be triggered. +! Experimental kses() wrapper introduced with HTMLPurifier.kses.php +! Finally %CSS.AllowedProperties for tweaking allowed CSS properties without + mucking around with HTMLPurifier_CSSDefinition +! ConfigDoc output has been enhanced with version and deprecation info. +! %HTML.ForbiddenAttributes and %HTML.ForbiddenElements implemented. +- Autoclose now operates iteratively, i.e.
    now has + both span tags closed. +- Various HTMLPurifier_Config convenience functions now accept another parameter + $schema which defines what HTMLPurifier_ConfigSchema to use besides the + global default. +- Fix bug with trusted script handling in libxml versions later than 2.6.28. +- Fix bug in ExtractStyleBlocks with comments in style tags +- Fix bug in comment parsing for DirectLex +- Flush output now displayed when in command line mode for unit tester +- Fix bug with rgb(0, 1, 2) color syntax with spaces inside shorthand syntax +- HTMLPurifier_HTMLDefinition->addAttribute can now be called multiple times + on the same element without emitting errors. +- Fixed fatal error in PH5P lexer with invalid tag names +. Plugins now get their own changelogs according to project conventions. +. Convert tokens to use instanceof, reducing memory footprint and + improving comparison speed. +. Dry runs now supported in SimpleTest; testing facilities improved +. Bootstrap class added for handling autoloading functionality +. Implemented recursive glob at FSTools->globr +. ConfigSchema now has instance methods for all corresponding define* + static methods. +. A couple of new historical maintenance scripts were added. +. HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php split into two files +. tests/index.php can now be run from any directory. +. HTMLPurifier_Token subclasses split into seperate files +. HTMLPURIFIER_PREFIX now is defined in Bootstrap.php, NOT HTMLPurifier.php +. HTMLPURIFIER_PREFIX can now be defined outside of HTML Purifier +. New --php=php flag added, allows PHP executable to be specified (command + line only!) +. htmlpurifier_add_test() preferred method to translate test files in to + classes, because it handles PHPT files too. +. Debugger class is deprecated and will be removed soon. +. Command line argument parsing for testing scripts revamped, now --opt value + format is supported. +. Smoketests now cleanup after magic quotes +. Generator now can output comments (however, comments are still stripped + from HTML Purifier output) +. HTMLPurifier_ConfigSchema->validate() deprecated in favor of + HTMLPurifier_VarParser->parse() +. Integers auto-cast into float type by VarParser. +. HTMLPURIFIER_STRICT removed; no validation is performed on runtime, only + during cache generation +. Reordered script calls in maintenance/flush.php +. Command line scripts now honor exit codes +. When --flush fails in unit testers, abort tests and print message +. Improved documentation in docs/dev-flush.html about the maintenance scripts +. copy() methods removed in favor of clone keyword + +3.0.0, released 2008-01-06 +# HTML Purifier is PHP 5 only! The 2.1.x branch will be maintained + until PHP 4 is completely deprecated, but no new features will be added + to it. + + Visibility declarations added + + Constructor methods renamed to __construct() + + PHP4 reference cruft removed (in progress) +! CSS properties are now case-insensitive +! DefinitionCacheFactory now can register new implementations +! New HTMLPurifier_Filter_ExtractStyleBlocks for extracting Some text'; + + $config = HTMLPurifier_Config::createDefault(); + $config->set('Filter', 'ExtractStyleBlocks', true); + $purifier = new HTMLPurifier($config); + + $html = $purifier->purify($dirty); + + // This implementation writes the stylesheets to the styles/ directory. + // You can also echo the styles inside the document, but it's a bit + // more difficult to make sure they get interpreted properly by + // browsers; try the usual CSS armoring techniques. + $styles = $purifier->context->get('StyleBlocks'); + $dir = 'styles/'; + if (!is_dir($dir)) mkdir($dir); + $hash = sha1($_GET['html']); + foreach ($styles as $i => $style) { + file_put_contents($name = $dir . $hash . "_$i"); + echo ''; + } +?> + + +
    + +
    + + +]]> +

    + Warning: It is possible for a user to mount an + imagecrash attack using this CSS. Counter-measures are difficult; + it is not simply enough to limit the range of CSS lengths (using + relative lengths with many nesting levels allows for large values + to be attained without actually specifying them in the stylesheet), + and the flexible nature of selectors makes it difficult to selectively + disable lengths on image tags (HTML Purifier, however, does disable + CSS width and height in inline styling). There are probably two effective + counter measures: an explicit width and height set to auto in all + images in your document (unlikely) or the disabling of width and + height (somewhat reasonable). Whether or not these measures should be + used is left to the reader. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt new file mode 100755 index 0000000..7fa6536 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt @@ -0,0 +1,11 @@ +Filter.YouTube +TYPE: bool +VERSION: 3.1.0 +DEFAULT: false +--DESCRIPTION-- +

    + This directive enables YouTube video embedding in HTML Purifier. Check + this document + on embedding videos for more information on what this filter does. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.txt new file mode 100755 index 0000000..f2d25a1 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.txt @@ -0,0 +1,3 @@ +Filter +DESCRIPTION: Directives for turning filters on and off, or specifying custom filters. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksEscaping.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksEscaping.txt new file mode 100755 index 0000000..d436ed0 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksEscaping.txt @@ -0,0 +1,14 @@ +FilterParam.ExtractStyleBlocksEscaping +TYPE: bool +VERSION: 3.0.0 +DEFAULT: true +ALIASES: Filter.ExtractStyleBlocksEscaping +--DESCRIPTION-- + +

    + Whether or not to escape the dangerous characters <, > and & + as \3C, \3E and \26, respectively. This is can be safely set to false + if the contents of StyleBlocks will be placed in an external stylesheet, + where there is no risk of it being interpreted as HTML. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksScope.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksScope.txt new file mode 100755 index 0000000..3943529 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksScope.txt @@ -0,0 +1,29 @@ +FilterParam.ExtractStyleBlocksScope +TYPE: string/null +VERSION: 3.0.0 +DEFAULT: NULL +ALIASES: Filter.ExtractStyleBlocksScope +--DESCRIPTION-- + +

    + If you would like users to be able to define external stylesheets, but + only allow them to specify CSS declarations for a specific node and + prevent them from fiddling with other elements, use this directive. + It accepts any valid CSS selector, and will prepend this to any + CSS declaration extracted from the document. For example, if this + directive is set to #user-content and a user uses the + selector a:hover, the final selector will be + #user-content a:hover. +

    +

    + The comma shorthand may be used; consider the above example, with + #user-content, #user-content2, the final selector will + be #user-content a:hover, #user-content2 a:hover. +

    +

    + Warning: It is possible for users to bypass this measure + using a naughty + selector. This is a bug in CSS Tidy 1.3, not HTML + Purifier, and I am working to get it fixed. Until then, HTML Purifier + performs a basic check to prevent this. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksTidyImpl.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksTidyImpl.txt new file mode 100755 index 0000000..cafccf8 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.ExtractStyleBlocksTidyImpl.txt @@ -0,0 +1,15 @@ +FilterParam.ExtractStyleBlocksTidyImpl +TYPE: mixed/null +VERSION: 3.1.0 +DEFAULT: NULL +--DESCRIPTION-- +

    + If left NULL, HTML Purifier will attempt to instantiate a csstidy + class to use for internal cleaning. This will usually be good enough. +

    +

    + However, for trusted user input, you can set this to false to + disable cleaning. In addition, you can supply your own concrete implementation + of Tidy's interface to use, although I don't know why you'd want to do that. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.txt new file mode 100755 index 0000000..dff9784 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/FilterParam.txt @@ -0,0 +1,3 @@ +FilterParam +DESCRIPTION: Configuration for filters. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt new file mode 100755 index 0000000..3e231d2 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt @@ -0,0 +1,22 @@ +HTML.Allowed +TYPE: itext/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + This is a convenience directive that rolls the functionality of + %HTML.AllowedElements and %HTML.AllowedAttributes into one directive. + Specify elements and attributes that are allowed using: + element1[attr1|attr2],element2.... You can also use + newlines instead of commas to separate elements. +

    +

    + Warning: + All of the constraints on the component directives are still enforced. + The syntax is a subset of TinyMCE's valid_elements + whitelist: directly copy-pasting it here will probably result in + broken whitelists. If %HTML.AllowedElements or %HTML.AllowedAttributes + are set, this directive has no effect. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt new file mode 100755 index 0000000..fcf093f --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt @@ -0,0 +1,19 @@ +HTML.AllowedAttributes +TYPE: lookup/null +VERSION: 1.3.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + If HTML Purifier's attribute set is unsatisfactory, overload it! + The syntax is "tag.attr" or "*.attr" for the global attributes + (style, id, class, dir, lang, xml:lang). +

    +

    + Warning: If another directive conflicts with the + elements here, that directive will win and override. For + example, %HTML.EnableAttrID will take precedence over *.id in this + directive. You must set that directive to true before you can use + IDs at all. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt new file mode 100755 index 0000000..888d558 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt @@ -0,0 +1,18 @@ +HTML.AllowedElements +TYPE: lookup/null +VERSION: 1.3.0 +DEFAULT: NULL +--DESCRIPTION-- +

    + If HTML Purifier's tag set is unsatisfactory for your needs, you + can overload it with your own list of tags to allow. Note that this + method is subtractive: it does its job by taking away from HTML Purifier + usual feature set, so you cannot add a tag that HTML Purifier never + supported in the first place (like embed, form or head). If you + change this, you probably also want to change %HTML.AllowedAttributes. +

    +

    + Warning: If another directive conflicts with the + elements here, that directive will win and override. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt new file mode 100755 index 0000000..5a59a55 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt @@ -0,0 +1,20 @@ +HTML.AllowedModules +TYPE: lookup/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + A doctype comes with a set of usual modules to use. Without having + to mucking about with the doctypes, you can quickly activate or + disable these modules by specifying which modules you wish to allow + with this directive. This is most useful for unit testing specific + modules, although end users may find it useful for their own ends. +

    +

    + If you specify a module that does not exist, the manager will silently + fail to use it, so be careful! User-defined modules are not affected + by this directive. Modules defined in %HTML.CoreModules are not + affected by this directive. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt new file mode 100755 index 0000000..45ae469 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt @@ -0,0 +1,18 @@ +HTML.BlockWrapper +TYPE: string +VERSION: 1.3.0 +DEFAULT: 'p' +--DESCRIPTION-- + +

    + String name of element to wrap inline elements that are inside a block + context. This only occurs in the children of blockquote in strict mode. +

    +

    + Example: by default value, + <blockquote>Foo</blockquote> would become + <blockquote><p>Foo</p></blockquote>. + The <p> tags can be replaced with whatever you desire, + as long as it is a block level element. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt new file mode 100755 index 0000000..5246188 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt @@ -0,0 +1,23 @@ +HTML.CoreModules +TYPE: lookup +VERSION: 2.0.0 +--DEFAULT-- +array ( + 'Structure' => true, + 'Text' => true, + 'Hypertext' => true, + 'List' => true, + 'NonXMLCommonAttributes' => true, + 'XMLCommonAttributes' => true, + 'CommonAttributes' => true, +) +--DESCRIPTION-- + +

    + Certain modularized doctypes (XHTML, namely), have certain modules + that must be included for the doctype to be an conforming document + type: put those modules here. By default, XHTML's core modules + are used. You can set this to a blank array to disable core module + protection, but this is not recommended. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt new file mode 100755 index 0000000..a64e3d7 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt @@ -0,0 +1,9 @@ +HTML.CustomDoctype +TYPE: string/null +VERSION: 2.0.1 +DEFAULT: NULL +--DESCRIPTION-- + +A custom doctype for power-users who defined there own document +type. This directive only applies when %HTML.Doctype is blank. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt new file mode 100755 index 0000000..103db75 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt @@ -0,0 +1,33 @@ +HTML.DefinitionID +TYPE: string/null +DEFAULT: NULL +VERSION: 2.0.0 +--DESCRIPTION-- + +

    + Unique identifier for a custom-built HTML definition. If you edit + the raw version of the HTMLDefinition, introducing changes that the + configuration object does not reflect, you must specify this variable. + If you change your custom edits, you should change this directive, or + clear your cache. Example: +

    +
    +$config = HTMLPurifier_Config::createDefault();
    +$config->set('HTML', 'DefinitionID', '1');
    +$def = $config->getHTMLDefinition();
    +$def->addAttribute('a', 'tabindex', 'Number');
    +
    +

    + In the above example, the configuration is still at the defaults, but + using the advanced API, an extra attribute has been added. The + configuration object normally has no way of knowing that this change + has taken place, so it needs an extra directive: %HTML.DefinitionID. + If someone else attempts to use the default configuration, these two + pieces of code will not clobber each other in the cache, since one has + an extra directive attached to it. +

    +

    + You must specify a value to this directive to use the + advanced API features. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt new file mode 100755 index 0000000..229ae02 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt @@ -0,0 +1,16 @@ +HTML.DefinitionRev +TYPE: int +VERSION: 2.0.0 +DEFAULT: 1 +--DESCRIPTION-- + +

    + Revision identifier for your custom definition specified in + %HTML.DefinitionID. This serves the same purpose: uniquely identifying + your custom definition, but this one does so in a chronological + context: revision 3 is more up-to-date then revision 2. Thus, when + this gets incremented, the cache handling is smart enough to clean + up any older revisions of your definition as well as flush the + cache. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt new file mode 100755 index 0000000..9dab497 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt @@ -0,0 +1,11 @@ +HTML.Doctype +TYPE: string/null +DEFAULT: NULL +--DESCRIPTION-- +Doctype to use during filtering. Technically speaking this is not actually +a doctype (as it does not identify a corresponding DTD), but we are using +this name for sake of simplicity. When non-blank, this will override any +older directives like %HTML.XHTML or %HTML.Strict. +--ALLOWED-- +'HTML 4.01 Transitional', 'HTML 4.01 Strict', 'XHTML 1.0 Transitional', 'XHTML 1.0 Strict', 'XHTML 1.1' +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt new file mode 100755 index 0000000..57358f9 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt @@ -0,0 +1,21 @@ +HTML.ForbiddenAttributes +TYPE: lookup +VERSION: 3.1.0 +DEFAULT: array() +--DESCRIPTION-- +

    + While this directive is similar to %HTML.AllowedAttributes, for + forwards-compatibility with XML, this attribute has a different syntax. Instead of + tag.attr, use tag@attr. To disallow href + attributes in a tags, set this directive to + a@href. You can also disallow an attribute globally with + attr or *@attr (either syntax is fine; the latter + is provided for consistency with %HTML.AllowedAttributes). +

    +

    + Warning: This directive complements %HTML.ForbiddenElements, + accordingly, check + out that directive for a discussion of why you + should think twice before using this directive. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt new file mode 100755 index 0000000..93a53e1 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt @@ -0,0 +1,20 @@ +HTML.ForbiddenElements +TYPE: lookup +VERSION: 3.1.0 +DEFAULT: array() +--DESCRIPTION-- +

    + This was, perhaps, the most requested feature ever in HTML + Purifier. Please don't abuse it! This is the logical inverse of + %HTML.AllowedElements, and it will override that directive, or any + other directive. +

    +

    + If possible, %HTML.Allowed is recommended over this directive, because it + can sometimes be difficult to tell whether or not you've forbidden all of + the behavior you would like to disallow. If you forbid img + with the expectation of preventing images on your site, you'll be in for + a nasty surprise when people start using the background-image + CSS property. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt new file mode 100755 index 0000000..e424c38 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt @@ -0,0 +1,14 @@ +HTML.MaxImgLength +TYPE: int/null +DEFAULT: 1200 +VERSION: 3.1.1 +--DESCRIPTION-- +

    + This directive controls the maximum number of pixels in the width and + height attributes in img tags. This is + in place to prevent imagecrash attacks, disable with null at your own risk. + This directive is similar to %CSS.MaxImgLength, and both should be + concurrently edited, although there are + subtle differences in the input format (the HTML max is an integer). +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt new file mode 100755 index 0000000..62e8e16 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt @@ -0,0 +1,12 @@ +HTML.Parent +TYPE: string +VERSION: 1.3.0 +DEFAULT: 'div' +--DESCRIPTION-- + +

    + String name of element that HTML fragment passed to library will be + inserted in. An interesting variation would be using span as the + parent element, meaning that only inline tags would be allowed. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt new file mode 100755 index 0000000..dfb7204 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt @@ -0,0 +1,12 @@ +HTML.Proprietary +TYPE: bool +VERSION: 3.1.0 +DEFAULT: false +--DESCRIPTION-- +

    + Whether or not to allow proprietary elements and attributes in your + documents, as per HTMLPurifier_HTMLModule_Proprietary. + Warning: This can cause your documents to stop + validating! +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt new file mode 100755 index 0000000..f635a68 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt @@ -0,0 +1,14 @@ +HTML.SafeEmbed +TYPE: bool +VERSION: 3.1.1 +DEFAULT: false +--DESCRIPTION-- +

    + Whether or not to permit embed tags in documents, with a number of extra + security features added to prevent script execution. This is similar to + what websites like MySpace do to embed tags. Embed is a proprietary + element and will cause your website to stop validating. You probably want + to enable this with %HTML.SafeObject. + Highly experimental. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt new file mode 100755 index 0000000..32967b8 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt @@ -0,0 +1,14 @@ +HTML.SafeObject +TYPE: bool +VERSION: 3.1.1 +DEFAULT: false +--DESCRIPTION-- +

    + Whether or not to permit object tags in documents, with a number of extra + security features added to prevent script execution. This is similar to + what websites like MySpace do to object tags. You may also want to + enable %HTML.SafeEmbed for maximum interoperability with Internet Explorer, + although embed tags will cause your website to stop validating. + Highly experimental. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt new file mode 100755 index 0000000..a8b1de5 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt @@ -0,0 +1,9 @@ +HTML.Strict +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +DEPRECATED-VERSION: 1.7.0 +DEPRECATED-USE: HTML.Doctype +--DESCRIPTION-- +Determines whether or not to use Transitional (loose) or Strict rulesets. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt new file mode 100755 index 0000000..b4c271b --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt @@ -0,0 +1,8 @@ +HTML.TidyAdd +TYPE: lookup +VERSION: 2.0.0 +DEFAULT: array() +--DESCRIPTION-- + +Fixes to add to the default set of Tidy fixes as per your level. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt new file mode 100755 index 0000000..4186ccd --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt @@ -0,0 +1,24 @@ +HTML.TidyLevel +TYPE: string +VERSION: 2.0.0 +DEFAULT: 'medium' +--DESCRIPTION-- + +

    General level of cleanliness the Tidy module should enforce. +There are four allowed values:

    +
    +
    none
    +
    No extra tidying should be done
    +
    light
    +
    Only fix elements that would be discarded otherwise due to + lack of support in doctype
    +
    medium
    +
    Enforce best practices
    +
    heavy
    +
    Transform all deprecated elements and attributes to standards + compliant equivalents
    +
    + +--ALLOWED-- +'none', 'light', 'medium', 'heavy' +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt new file mode 100755 index 0000000..996762b --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt @@ -0,0 +1,8 @@ +HTML.TidyRemove +TYPE: lookup +VERSION: 2.0.0 +DEFAULT: array() +--DESCRIPTION-- + +Fixes to remove from the default set of Tidy fixes as per your level. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt new file mode 100755 index 0000000..89133b1 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt @@ -0,0 +1,8 @@ +HTML.Trusted +TYPE: bool +VERSION: 2.0.0 +DEFAULT: false +--DESCRIPTION-- +Indicates whether or not the user input is trusted or not. If the input is +trusted, a more expansive set of allowed tags and attributes will be used. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt new file mode 100755 index 0000000..2a47e38 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt @@ -0,0 +1,11 @@ +HTML.XHTML +TYPE: bool +DEFAULT: true +VERSION: 1.1.0 +DEPRECATED-VERSION: 1.7.0 +DEPRECATED-USE: HTML.Doctype +--DESCRIPTION-- +Determines whether or not output is XHTML 1.0 or HTML 4.01 flavor. +--ALIASES-- +Core.XHTML +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.txt new file mode 100755 index 0000000..f32ceb5 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.txt @@ -0,0 +1,3 @@ +HTML +DESCRIPTION: Configuration regarding allowed HTML. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt new file mode 100755 index 0000000..08921fd --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt @@ -0,0 +1,10 @@ +Output.CommentScriptContents +TYPE: bool +VERSION: 2.0.0 +DEFAULT: true +--DESCRIPTION-- +Determines whether or not HTML Purifier should attempt to fix up the +contents of script tags for legacy browsers with comments. +--ALIASES-- +Core.CommentScriptContents +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt new file mode 100755 index 0000000..79f8ad8 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt @@ -0,0 +1,13 @@ +Output.Newline +TYPE: string/null +VERSION: 2.0.1 +DEFAULT: NULL +--DESCRIPTION-- + +

    + Newline string to format final output with. If left null, HTML Purifier + will auto-detect the default newline type of the system and use that; + you can manually override it here. Remember, \r\n is Windows, \r + is Mac, and \n is Unix. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt new file mode 100755 index 0000000..232b023 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt @@ -0,0 +1,14 @@ +Output.SortAttr +TYPE: bool +VERSION: 3.2.0 +DEFAULT: false +--DESCRIPTION-- +

    + If true, HTML Purifier will sort attributes by name before writing them back + to the document, converting a tag like: <el b="" a="" c="" /> + to <el a="" b="" c="" />. This is a workaround for + a bug in FCKeditor which causes it to swap attributes order, adding noise + to text diffs. If you're not seeing this bug, chances are, you don't need + this directive. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt new file mode 100755 index 0000000..06bab00 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt @@ -0,0 +1,25 @@ +Output.TidyFormat +TYPE: bool +VERSION: 1.1.1 +DEFAULT: false +--DESCRIPTION-- +

    + Determines whether or not to run Tidy on the final output for pretty + formatting reasons, such as indentation and wrap. +

    +

    + This can greatly improve readability for editors who are hand-editing + the HTML, but is by no means necessary as HTML Purifier has already + fixed all major errors the HTML may have had. Tidy is a non-default + extension, and this directive will silently fail if Tidy is not + available. +

    +

    + If you are looking to make the overall look of your page's source + better, I recommend running Tidy on the entire page rather than just + user-content (after all, the indentation relative to the containing + blocks will be incorrect). +

    +--ALIASES-- +Core.TidyFormat +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.txt new file mode 100755 index 0000000..7849d60 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.txt @@ -0,0 +1,3 @@ +Output +DESCRIPTION: Configuration relating to the generation of (X)HTML. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt new file mode 100755 index 0000000..071bc02 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt @@ -0,0 +1,7 @@ +Test.ForceNoIconv +TYPE: bool +DEFAULT: false +--DESCRIPTION-- +When set to true, HTMLPurifier_Encoder will act as if iconv does not exist +and use only pure PHP implementations. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.txt new file mode 100755 index 0000000..5025f9d --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.txt @@ -0,0 +1,3 @@ +Test +DESCRIPTION: Developer testing configuration for our unit tests. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt new file mode 100755 index 0000000..98fdfe9 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt @@ -0,0 +1,15 @@ +URI.AllowedSchemes +TYPE: lookup +--DEFAULT-- +array ( + 'http' => true, + 'https' => true, + 'mailto' => true, + 'ftp' => true, + 'nntp' => true, + 'news' => true, +) +--DESCRIPTION-- +Whitelist that defines the schemes that a URI is allowed to have. This +prevents XSS attacks from using pseudo-schemes like javascript or mocha. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt new file mode 100755 index 0000000..876f068 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt @@ -0,0 +1,17 @@ +URI.Base +TYPE: string/null +VERSION: 2.1.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + The base URI is the URI of the document this purified HTML will be + inserted into. This information is important if HTML Purifier needs + to calculate absolute URIs from relative URIs, such as when %URI.MakeAbsolute + is on. You may use a non-absolute URI for this value, but behavior + may vary (%URI.MakeAbsolute deals nicely with both absolute and + relative paths, but forwards-compatibility is not guaranteed). + Warning: If set, the scheme on this URI + overrides the one specified by %URI.DefaultScheme. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt new file mode 100755 index 0000000..728e378 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt @@ -0,0 +1,10 @@ +URI.DefaultScheme +TYPE: string +DEFAULT: 'http' +--DESCRIPTION-- + +

    + Defines through what scheme the output will be served, in order to + select the proper object validator when no scheme information is present. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt new file mode 100755 index 0000000..f05312b --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt @@ -0,0 +1,11 @@ +URI.DefinitionID +TYPE: string/null +VERSION: 2.1.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + Unique identifier for a custom-built URI definition. If you want + to add custom URIFilters, you must specify this value. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt new file mode 100755 index 0000000..80cfea9 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt @@ -0,0 +1,11 @@ +URI.DefinitionRev +TYPE: int +VERSION: 2.1.0 +DEFAULT: 1 +--DESCRIPTION-- + +

    + Revision identifier for your custom definition. See + %HTML.DefinitionRev for details. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt new file mode 100755 index 0000000..71ce025 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt @@ -0,0 +1,14 @@ +URI.Disable +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +--DESCRIPTION-- + +

    + Disables all URIs in all forms. Not sure why you'd want to do that + (after all, the Internet's founded on the notion of a hyperlink). +

    + +--ALIASES-- +Attr.DisableURI +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt new file mode 100755 index 0000000..13c122c --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt @@ -0,0 +1,11 @@ +URI.DisableExternal +TYPE: bool +VERSION: 1.2.0 +DEFAULT: false +--DESCRIPTION-- +Disables links to external websites. This is a highly effective anti-spam +and anti-pagerank-leech measure, but comes at a hefty price: nolinks or +images outside of your domain will be allowed. Non-linkified URIs will +still be preserved. If you want to be able to link to subdomains or use +absolute URIs, specify %URI.Host for your website. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt new file mode 100755 index 0000000..abcc1ef --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt @@ -0,0 +1,13 @@ +URI.DisableExternalResources +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +--DESCRIPTION-- +Disables the embedding of external resources, preventing users from +embedding things like images from other hosts. This prevents access +tracking (good for email viewers), bandwidth leeching, cross-site request +forging, goatse.cx posting, and other nasties, but also results in a loss +of end-user functionality (they can't directly post a pic they posted from +Flickr anymore). Use it if you don't have a robust user-content moderation +team. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt new file mode 100755 index 0000000..51e6ea9 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt @@ -0,0 +1,12 @@ +URI.DisableResources +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +--DESCRIPTION-- + +

    + Disables embedding resources, essentially meaning no pictures. You can + still link to them though. See %URI.DisableExternalResources for why + this might be a good idea. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt new file mode 100755 index 0000000..ee83b12 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt @@ -0,0 +1,19 @@ +URI.Host +TYPE: string/null +VERSION: 1.2.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + Defines the domain name of the server, so we can determine whether or + an absolute URI is from your website or not. Not strictly necessary, + as users should be using relative URIs to reference resources on your + website. It will, however, let you use absolute URIs to link to + subdomains of the domain you post here: i.e. example.com will allow + sub.example.com. However, higher up domains will still be excluded: + if you set %URI.Host to sub.example.com, example.com will be blocked. + Note: This directive overrides %URI.Base because + a given page may be on a sub-domain, but you wish HTML Purifier to be + more relaxed and allow some of the parent domains too. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt new file mode 100755 index 0000000..0b6df76 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt @@ -0,0 +1,9 @@ +URI.HostBlacklist +TYPE: list +VERSION: 1.3.0 +DEFAULT: array() +--DESCRIPTION-- +List of strings that are forbidden in the host of any URI. Use it to kill +domain names of spam, etc. Note that it will catch anything in the domain, +so moo.com will catch moo.com.example.com. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt new file mode 100755 index 0000000..4214900 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt @@ -0,0 +1,13 @@ +URI.MakeAbsolute +TYPE: bool +VERSION: 2.1.0 +DEFAULT: false +--DESCRIPTION-- + +

    + Converts all URIs into absolute forms. This is useful when the HTML + being filtered assumes a specific base path, but will actually be + viewed in a different context (and setting an alternate base URI is + not possible). %URI.Base must be set for this directive to work. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt new file mode 100755 index 0000000..58c81dc --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt @@ -0,0 +1,83 @@ +URI.Munge +TYPE: string/null +VERSION: 1.3.0 +DEFAULT: NULL +--DESCRIPTION-- + +

    + Munges all browsable (usually http, https and ftp) + absolute URIs into another URI, usually a URI redirection service. + This directive accepts a URI, formatted with a %s where + the url-encoded original URI should be inserted (sample: + http://www.google.com/url?q=%s). +

    +

    + Uses for this directive: +

    +
      +
    • + Prevent PageRank leaks, while being fairly transparent + to users (you may also want to add some client side JavaScript to + override the text in the statusbar). Notice: + Many security experts believe that this form of protection does not deter spam-bots. +
    • +
    • + Redirect users to a splash page telling them they are leaving your + website. While this is poor usability practice, it is often mandated + in corporate environments. +
    • +
    +

    + Prior to HTML Purifier 3.1.1, this directive also enabled the munging + of browsable external resources, which could break things if your redirection + script was a splash page or used meta tags. To revert to + previous behavior, please use %URI.MungeResources. +

    +

    + You may want to also use %URI.MungeSecretKey along with this directive + in order to enforce what URIs your redirector script allows. Open + redirector scripts can be a security risk and negatively affect the + reputation of your domain name. +

    +

    + Starting with HTML Purifier 3.1.1, there is also these substitutions: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KeyDescriptionExample <a href="">
    %r1 - The URI embeds a resource
    (blank) - The URI is merely a link
    %nThe name of the tag this URI came froma
    %mThe name of the attribute this URI came fromhref
    %pThe name of the CSS property this URI came from, or blank if irrelevant
    +

    + Admittedly, these letters are somewhat arbitrary; the only stipulation + was that they couldn't be a through f. r is for resource (I would have preferred + e, but you take what you can get), n is for name, m + was picked because it came after n (and I couldn't use a), p is for + property. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt new file mode 100755 index 0000000..6fce0fd --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt @@ -0,0 +1,17 @@ +URI.MungeResources +TYPE: bool +VERSION: 3.1.1 +DEFAULT: false +--DESCRIPTION-- +

    + If true, any URI munging directives like %URI.Munge + will also apply to embedded resources, such as <img src="">. + Be careful enabling this directive if you have a redirector script + that does not use the Location HTTP header; all of your images + and other embedded resources will break. +

    +

    + Warning: It is strongly advised you use this in conjunction + %URI.MungeSecretKey to mitigate the security risk of an open redirector. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt new file mode 100755 index 0000000..0d00f62 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt @@ -0,0 +1,30 @@ +URI.MungeSecretKey +TYPE: string/null +VERSION: 3.1.1 +DEFAULT: NULL +--DESCRIPTION-- +

    + This directive enables secure checksum generation along with %URI.Munge. + It should be set to a secure key that is not shared with anyone else. + The checksum can be placed in the URI using %t. Use of this checksum + affords an additional level of protection by allowing a redirector + to check if a URI has passed through HTML Purifier with this line: +

    + +
    $checksum === sha1($secret_key . ':' . $url)
    + +

    + If the output is TRUE, the redirector script should accept the URI. +

    + +

    + Please note that it would still be possible for an attacker to procure + secure hashes en-mass by abusing your website's Preview feature or the + like, but this service affords an additional level of protection + that should be combined with website blacklisting. +

    + +

    + Remember this has no effect if %URI.Munge is not on. +

    +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt new file mode 100755 index 0000000..23331a4 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt @@ -0,0 +1,9 @@ +URI.OverrideAllowedSchemes +TYPE: bool +DEFAULT: true +--DESCRIPTION-- +If this is set to true (which it is by default), you can override +%URI.AllowedSchemes by simply registering a HTMLPurifier_URIScheme to the +registry. If false, you will also have to update that directive in order +to add more schemes. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.txt b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.txt new file mode 100755 index 0000000..a13060f --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.txt @@ -0,0 +1,3 @@ +URI +DESCRIPTION: Features regarding Uniform Resource Identifiers. +--# vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini new file mode 100755 index 0000000..5de4505 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini @@ -0,0 +1,3 @@ +name = "HTML Purifier" + +; vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ContentSets.php b/libs/htmlpurifier/library/HTMLPurifier/ContentSets.php new file mode 100755 index 0000000..3b6e96f --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ContentSets.php @@ -0,0 +1,155 @@ + true) indexed by name. + * @note This is in HTMLPurifier_HTMLDefinition->info_content_sets + */ + public $lookup = array(); + + /** + * Synchronized list of defined content sets (keys of info) + */ + protected $keys = array(); + /** + * Synchronized list of defined content values (values of info) + */ + protected $values = array(); + + /** + * Merges in module's content sets, expands identifiers in the content + * sets and populates the keys, values and lookup member variables. + * @param $modules List of HTMLPurifier_HTMLModule + */ + public function __construct($modules) { + if (!is_array($modules)) $modules = array($modules); + // populate content_sets based on module hints + // sorry, no way of overloading + foreach ($modules as $module_i => $module) { + foreach ($module->content_sets as $key => $value) { + $temp = $this->convertToLookup($value); + if (isset($this->lookup[$key])) { + // add it into the existing content set + $this->lookup[$key] = array_merge($this->lookup[$key], $temp); + } else { + $this->lookup[$key] = $temp; + } + } + } + $old_lookup = false; + while ($old_lookup !== $this->lookup) { + $old_lookup = $this->lookup; + foreach ($this->lookup as $i => $set) { + $add = array(); + foreach ($set as $element => $x) { + if (isset($this->lookup[$element])) { + $add += $this->lookup[$element]; + unset($this->lookup[$i][$element]); + } + } + $this->lookup[$i] += $add; + } + } + + foreach ($this->lookup as $key => $lookup) { + $this->info[$key] = implode(' | ', array_keys($lookup)); + } + $this->keys = array_keys($this->info); + $this->values = array_values($this->info); + } + + /** + * Accepts a definition; generates and assigns a ChildDef for it + * @param $def HTMLPurifier_ElementDef reference + * @param $module Module that defined the ElementDef + */ + public function generateChildDef(&$def, $module) { + if (!empty($def->child)) return; // already done! + $content_model = $def->content_model; + if (is_string($content_model)) { + // Assume that $this->keys is alphanumeric + $def->content_model = preg_replace_callback( + '/\b(' . implode('|', $this->keys) . ')\b/', + array($this, 'generateChildDefCallback'), + $content_model + ); + //$def->content_model = str_replace( + // $this->keys, $this->values, $content_model); + } + $def->child = $this->getChildDef($def, $module); + } + + public function generateChildDefCallback($matches) { + return $this->info[$matches[0]]; + } + + /** + * Instantiates a ChildDef based on content_model and content_model_type + * member variables in HTMLPurifier_ElementDef + * @note This will also defer to modules for custom HTMLPurifier_ChildDef + * subclasses that need content set expansion + * @param $def HTMLPurifier_ElementDef to have ChildDef extracted + * @return HTMLPurifier_ChildDef corresponding to ElementDef + */ + public function getChildDef($def, $module) { + $value = $def->content_model; + if (is_object($value)) { + trigger_error( + 'Literal object child definitions should be stored in '. + 'ElementDef->child not ElementDef->content_model', + E_USER_NOTICE + ); + return $value; + } + switch ($def->content_model_type) { + case 'required': + return new HTMLPurifier_ChildDef_Required($value); + case 'optional': + return new HTMLPurifier_ChildDef_Optional($value); + case 'empty': + return new HTMLPurifier_ChildDef_Empty(); + case 'custom': + return new HTMLPurifier_ChildDef_Custom($value); + } + // defer to its module + $return = false; + if ($module->defines_child_def) { // save a func call + $return = $module->getChildDef($def); + } + if ($return !== false) return $return; + // error-out + trigger_error( + 'Could not determine which ChildDef class to instantiate', + E_USER_ERROR + ); + return false; + } + + /** + * Converts a string list of elements separated by pipes into + * a lookup array. + * @param $string List of elements + * @return Lookup array of elements + */ + protected function convertToLookup($string) { + $array = explode('|', str_replace(' ', '', $string)); + $ret = array(); + foreach ($array as $i => $k) { + $ret[$k] = true; + } + return $ret; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Context.php b/libs/htmlpurifier/library/HTMLPurifier/Context.php new file mode 100755 index 0000000..9ddf0c5 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Context.php @@ -0,0 +1,82 @@ +_storage[$name])) { + trigger_error("Name $name produces collision, cannot re-register", + E_USER_ERROR); + return; + } + $this->_storage[$name] =& $ref; + } + + /** + * Retrieves a variable reference from the context. + * @param $name String name + * @param $ignore_error Boolean whether or not to ignore error + */ + public function &get($name, $ignore_error = false) { + if (!isset($this->_storage[$name])) { + if (!$ignore_error) { + trigger_error("Attempted to retrieve non-existent variable $name", + E_USER_ERROR); + } + $var = null; // so we can return by reference + return $var; + } + return $this->_storage[$name]; + } + + /** + * Destorys a variable in the context. + * @param $name String name + */ + public function destroy($name) { + if (!isset($this->_storage[$name])) { + trigger_error("Attempted to destroy non-existent variable $name", + E_USER_ERROR); + return; + } + unset($this->_storage[$name]); + } + + /** + * Checks whether or not the variable exists. + * @param $name String name + */ + public function exists($name) { + return isset($this->_storage[$name]); + } + + /** + * Loads a series of variables from an associative array + * @param $context_array Assoc array of variables to load + */ + public function loadArray($context_array) { + foreach ($context_array as $key => $discard) { + $this->register($key, $context_array[$key]); + } + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Definition.php b/libs/htmlpurifier/library/HTMLPurifier/Definition.php new file mode 100755 index 0000000..a7408c9 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Definition.php @@ -0,0 +1,39 @@ +setup) return; + $this->setup = true; + $this->doSetup($config); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache.php b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache.php new file mode 100755 index 0000000..fa5a087 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache.php @@ -0,0 +1,108 @@ +type = $type; + } + + /** + * Generates a unique identifier for a particular configuration + * @param Instance of HTMLPurifier_Config + */ + public function generateKey($config) { + return $config->version . ',' . // possibly replace with function calls + $config->getBatchSerial($this->type) . ',' . + $config->get($this->type, 'DefinitionRev'); + } + + /** + * Tests whether or not a key is old with respect to the configuration's + * version and revision number. + * @param $key Key to test + * @param $config Instance of HTMLPurifier_Config to test against + */ + public function isOld($key, $config) { + if (substr_count($key, ',') < 2) return true; + list($version, $hash, $revision) = explode(',', $key, 3); + $compare = version_compare($version, $config->version); + // version mismatch, is always old + if ($compare != 0) return true; + // versions match, ids match, check revision number + if ( + $hash == $config->getBatchSerial($this->type) && + $revision < $config->get($this->type, 'DefinitionRev') + ) return true; + return false; + } + + /** + * Checks if a definition's type jives with the cache's type + * @note Throws an error on failure + * @param $def Definition object to check + * @return Boolean true if good, false if not + */ + public function checkDefType($def) { + if ($def->type !== $this->type) { + trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}"); + return false; + } + return true; + } + + /** + * Adds a definition object to the cache + */ + abstract public function add($def, $config); + + /** + * Unconditionally saves a definition object to the cache + */ + abstract public function set($def, $config); + + /** + * Replace an object in the cache + */ + abstract public function replace($def, $config); + + /** + * Retrieves a definition object from the cache + */ + abstract public function get($config); + + /** + * Removes a definition object to the cache + */ + abstract public function remove($config); + + /** + * Clears all objects from cache + */ + abstract public function flush($config); + + /** + * Clears all expired (older version or revision) objects from cache + * @note Be carefuly implementing this method as flush. Flush must + * not interfere with other Definition types, and cleanup() + * should not be repeatedly called by userland code. + */ + abstract public function cleanup($config); + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php new file mode 100755 index 0000000..b0fb6d0 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php @@ -0,0 +1,62 @@ +copy(); + // reference is necessary for mocks in PHP 4 + $decorator->cache =& $cache; + $decorator->type = $cache->type; + return $decorator; + } + + /** + * Cross-compatible clone substitute + */ + public function copy() { + return new HTMLPurifier_DefinitionCache_Decorator(); + } + + public function add($def, $config) { + return $this->cache->add($def, $config); + } + + public function set($def, $config) { + return $this->cache->set($def, $config); + } + + public function replace($def, $config) { + return $this->cache->replace($def, $config); + } + + public function get($config) { + return $this->cache->get($config); + } + + public function remove($config) { + return $this->cache->remove($config); + } + + public function flush($config) { + return $this->cache->flush($config); + } + + public function cleanup($config) { + return $this->cache->cleanup($config); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php new file mode 100755 index 0000000..d4cc35c --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php @@ -0,0 +1,43 @@ +definitions[$this->generateKey($config)] = $def; + return $status; + } + + public function set($def, $config) { + $status = parent::set($def, $config); + if ($status) $this->definitions[$this->generateKey($config)] = $def; + return $status; + } + + public function replace($def, $config) { + $status = parent::replace($def, $config); + if ($status) $this->definitions[$this->generateKey($config)] = $def; + return $status; + } + + public function get($config) { + $key = $this->generateKey($config); + if (isset($this->definitions[$key])) return $this->definitions[$key]; + $this->definitions[$key] = parent::get($config); + return $this->definitions[$key]; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in new file mode 100755 index 0000000..21a8fcf --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in @@ -0,0 +1,47 @@ +checkDefType($def)) return; + $file = $this->generateFilePath($config); + if (file_exists($file)) return false; + if (!$this->_prepareDir($config)) return false; + return $this->_write($file, serialize($def)); + } + + public function set($def, $config) { + if (!$this->checkDefType($def)) return; + $file = $this->generateFilePath($config); + if (!$this->_prepareDir($config)) return false; + return $this->_write($file, serialize($def)); + } + + public function replace($def, $config) { + if (!$this->checkDefType($def)) return; + $file = $this->generateFilePath($config); + if (!file_exists($file)) return false; + if (!$this->_prepareDir($config)) return false; + return $this->_write($file, serialize($def)); + } + + public function get($config) { + $file = $this->generateFilePath($config); + if (!file_exists($file)) return false; + return unserialize(file_get_contents($file)); + } + + public function remove($config) { + $file = $this->generateFilePath($config); + if (!file_exists($file)) return false; + return unlink($file); + } + + public function flush($config) { + if (!$this->_prepareDir($config)) return false; + $dir = $this->generateDirectoryPath($config); + $dh = opendir($dir); + while (false !== ($filename = readdir($dh))) { + if (empty($filename)) continue; + if ($filename[0] === '.') continue; + unlink($dir . '/' . $filename); + } + } + + public function cleanup($config) { + if (!$this->_prepareDir($config)) return false; + $dir = $this->generateDirectoryPath($config); + $dh = opendir($dir); + while (false !== ($filename = readdir($dh))) { + if (empty($filename)) continue; + if ($filename[0] === '.') continue; + $key = substr($filename, 0, strlen($filename) - 4); + if ($this->isOld($key, $config)) unlink($dir . '/' . $filename); + } + } + + /** + * Generates the file path to the serial file corresponding to + * the configuration and definition name + * @todo Make protected + */ + public function generateFilePath($config) { + $key = $this->generateKey($config); + return $this->generateDirectoryPath($config) . '/' . $key . '.ser'; + } + + /** + * Generates the path to the directory contain this cache's serial files + * @note No trailing slash + * @todo Make protected + */ + public function generateDirectoryPath($config) { + $base = $this->generateBaseDirectoryPath($config); + return $base . '/' . $this->type; + } + + /** + * Generates path to base directory that contains all definition type + * serials + * @todo Make protected + */ + public function generateBaseDirectoryPath($config) { + $base = $config->get('Cache', 'SerializerPath'); + $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base; + return $base; + } + + /** + * Convenience wrapper function for file_put_contents + * @param $file File name to write to + * @param $data Data to write into file + * @return Number of bytes written if success, or false if failure. + */ + private function _write($file, $data) { + return file_put_contents($file, $data); + } + + /** + * Prepares the directory that this type stores the serials in + * @return True if successful + */ + private function _prepareDir($config) { + $directory = $this->generateDirectoryPath($config); + if (!is_dir($directory)) { + $base = $this->generateBaseDirectoryPath($config); + if (!is_dir($base)) { + trigger_error('Base directory '.$base.' does not exist, + please create or change using %Cache.SerializerPath', + E_USER_WARNING); + return false; + } elseif (!$this->_testPermissions($base)) { + return false; + } + $old = umask(0022); // disable group and world writes + mkdir($directory); + umask($old); + } elseif (!$this->_testPermissions($directory)) { + return false; + } + return true; + } + + /** + * Tests permissions on a directory and throws out friendly + * error messages and attempts to chmod it itself if possible + */ + private function _testPermissions($dir) { + // early abort, if it is writable, everything is hunky-dory + if (is_writable($dir)) return true; + if (!is_dir($dir)) { + // generally, you'll want to handle this beforehand + // so a more specific error message can be given + trigger_error('Directory '.$dir.' does not exist', + E_USER_WARNING); + return false; + } + if (function_exists('posix_getuid')) { + // POSIX system, we can give more specific advice + if (fileowner($dir) === posix_getuid()) { + // we can chmod it ourselves + chmod($dir, 0755); + return true; + } elseif (filegroup($dir) === posix_getgid()) { + $chmod = '775'; + } else { + // PHP's probably running as nobody, so we'll + // need to give global permissions + $chmod = '777'; + } + trigger_error('Directory '.$dir.' not writable, '. + 'please chmod to ' . $chmod, + E_USER_WARNING); + } else { + // generic error message + trigger_error('Directory '.$dir.' not writable, '. + 'please alter file permissions', + E_USER_WARNING); + } + return false; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README new file mode 100755 index 0000000..2e35c1c --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README @@ -0,0 +1,3 @@ +This is a dummy file to prevent Git from ignoring this empty directory. + + vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php new file mode 100755 index 0000000..3adefbb --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php @@ -0,0 +1,91 @@ + array()); + protected $implementations = array(); + protected $decorators = array(); + + /** + * Initialize default decorators + */ + public function setup() { + $this->addDecorator('Cleanup'); + } + + /** + * Retrieves an instance of global definition cache factory. + */ + public static function instance($prototype = null) { + static $instance; + if ($prototype !== null) { + $instance = $prototype; + } elseif ($instance === null || $prototype === true) { + $instance = new HTMLPurifier_DefinitionCacheFactory(); + $instance->setup(); + } + return $instance; + } + + /** + * Registers a new definition cache object + * @param $short Short name of cache object, for reference + * @param $long Full class name of cache object, for construction + */ + public function register($short, $long) { + $this->implementations[$short] = $long; + } + + /** + * Factory method that creates a cache object based on configuration + * @param $name Name of definitions handled by cache + * @param $config Instance of HTMLPurifier_Config + */ + public function create($type, $config) { + $method = $config->get('Cache', 'DefinitionImpl'); + if ($method === null) { + return new HTMLPurifier_DefinitionCache_Null($type); + } + if (!empty($this->caches[$method][$type])) { + return $this->caches[$method][$type]; + } + if ( + isset($this->implementations[$method]) && + class_exists($class = $this->implementations[$method], false) + ) { + $cache = new $class($type); + } else { + if ($method != 'Serializer') { + trigger_error("Unrecognized DefinitionCache $method, using Serializer instead", E_USER_WARNING); + } + $cache = new HTMLPurifier_DefinitionCache_Serializer($type); + } + foreach ($this->decorators as $decorator) { + $new_cache = $decorator->decorate($cache); + // prevent infinite recursion in PHP 4 + unset($cache); + $cache = $new_cache; + } + $this->caches[$method][$type] = $cache; + return $this->caches[$method][$type]; + } + + /** + * Registers a decorator to add to all new cache objects + * @param + */ + public function addDecorator($decorator) { + if (is_string($decorator)) { + $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator"; + $decorator = new $class; + } + $this->decorators[$decorator->name] = $decorator; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Doctype.php b/libs/htmlpurifier/library/HTMLPurifier/Doctype.php new file mode 100755 index 0000000..1e3c574 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Doctype.php @@ -0,0 +1,60 @@ +renderDoctype. + * If structure changes, please update that function. + */ +class HTMLPurifier_Doctype +{ + /** + * Full name of doctype + */ + public $name; + + /** + * List of standard modules (string identifiers or literal objects) + * that this doctype uses + */ + public $modules = array(); + + /** + * List of modules to use for tidying up code + */ + public $tidyModules = array(); + + /** + * Is the language derived from XML (i.e. XHTML)? + */ + public $xml = true; + + /** + * List of aliases for this doctype + */ + public $aliases = array(); + + /** + * Public DTD identifier + */ + public $dtdPublic; + + /** + * System DTD identifier + */ + public $dtdSystem; + + public function __construct($name = null, $xml = true, $modules = array(), + $tidyModules = array(), $aliases = array(), $dtd_public = null, $dtd_system = null + ) { + $this->name = $name; + $this->xml = $xml; + $this->modules = $modules; + $this->tidyModules = $tidyModules; + $this->aliases = $aliases; + $this->dtdPublic = $dtd_public; + $this->dtdSystem = $dtd_system; + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php b/libs/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php new file mode 100755 index 0000000..d6552aa --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php @@ -0,0 +1,103 @@ +doctypes[$doctype->name] = $doctype; + $name = $doctype->name; + // hookup aliases + foreach ($doctype->aliases as $alias) { + if (isset($this->doctypes[$alias])) continue; + $this->aliases[$alias] = $name; + } + // remove old aliases + if (isset($this->aliases[$name])) unset($this->aliases[$name]); + return $doctype; + } + + /** + * Retrieves reference to a doctype of a certain name + * @note This function resolves aliases + * @note When possible, use the more fully-featured make() + * @param $doctype Name of doctype + * @return Editable doctype object + */ + public function get($doctype) { + if (isset($this->aliases[$doctype])) $doctype = $this->aliases[$doctype]; + if (!isset($this->doctypes[$doctype])) { + trigger_error('Doctype ' . htmlspecialchars($doctype) . ' does not exist', E_USER_ERROR); + $anon = new HTMLPurifier_Doctype($doctype); + return $anon; + } + return $this->doctypes[$doctype]; + } + + /** + * Creates a doctype based on a configuration object, + * will perform initialization on the doctype + * @note Use this function to get a copy of doctype that config + * can hold on to (this is necessary in order to tell + * Generator whether or not the current document is XML + * based or not). + */ + public function make($config) { + return clone $this->get($this->getDoctypeFromConfig($config)); + } + + /** + * Retrieves the doctype from the configuration object + */ + public function getDoctypeFromConfig($config) { + // recommended test + $doctype = $config->get('HTML', 'Doctype'); + if (!empty($doctype)) return $doctype; + $doctype = $config->get('HTML', 'CustomDoctype'); + if (!empty($doctype)) return $doctype; + // backwards-compatibility + if ($config->get('HTML', 'XHTML')) { + $doctype = 'XHTML 1.0'; + } else { + $doctype = 'HTML 4.01'; + } + if ($config->get('HTML', 'Strict')) { + $doctype .= ' Strict'; + } else { + $doctype .= ' Transitional'; + } + return $doctype; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ElementDef.php b/libs/htmlpurifier/library/HTMLPurifier/ElementDef.php new file mode 100755 index 0000000..b55c7bd --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ElementDef.php @@ -0,0 +1,175 @@ +setup(), this array may also + * contain an array at index 0 that indicates which attribute + * collections to load into the full array. It may also + * contain string indentifiers in lieu of HTMLPurifier_AttrDef, + * see HTMLPurifier_AttrTypes on how they are expanded during + * HTMLPurifier_HTMLDefinition->setup() processing. + */ + public $attr = array(); + + /** + * Indexed list of tag's HTMLPurifier_AttrTransform to be done before validation + */ + public $attr_transform_pre = array(); + + /** + * Indexed list of tag's HTMLPurifier_AttrTransform to be done after validation + */ + public $attr_transform_post = array(); + + /** + * HTMLPurifier_ChildDef of this tag. + */ + public $child; + + /** + * Abstract string representation of internal ChildDef rules. See + * HTMLPurifier_ContentSets for how this is parsed and then transformed + * into an HTMLPurifier_ChildDef. + * @warning This is a temporary variable that is not available after + * being processed by HTMLDefinition + */ + public $content_model; + + /** + * Value of $child->type, used to determine which ChildDef to use, + * used in combination with $content_model. + * @warning This must be lowercase + * @warning This is a temporary variable that is not available after + * being processed by HTMLDefinition + */ + public $content_model_type; + + + + /** + * Does the element have a content model (#PCDATA | Inline)*? This + * is important for chameleon ins and del processing in + * HTMLPurifier_ChildDef_Chameleon. Dynamically set: modules don't + * have to worry about this one. + */ + public $descendants_are_inline = false; + + /** + * List of the names of required attributes this element has. Dynamically + * populated by HTMLPurifier_HTMLDefinition::getElement + */ + public $required_attr = array(); + + /** + * Lookup table of tags excluded from all descendants of this tag. + * @note SGML permits exclusions for all descendants, but this is + * not possible with DTDs or XML Schemas. W3C has elected to + * use complicated compositions of content_models to simulate + * exclusion for children, but we go the simpler, SGML-style + * route of flat-out exclusions, which correctly apply to + * all descendants and not just children. Note that the XHTML + * Modularization Abstract Modules are blithely unaware of such + * distinctions. + */ + public $excludes = array(); + + /** + * This tag is explicitly auto-closed by the following tags. + */ + public $autoclose = array(); + + /** + * Whether or not this is a formatting element affected by the + * "Active Formatting Elements" algorithm. + */ + public $formatting; + + /** + * Low-level factory constructor for creating new standalone element defs + */ + public static function create($content_model, $content_model_type, $attr) { + $def = new HTMLPurifier_ElementDef(); + $def->content_model = $content_model; + $def->content_model_type = $content_model_type; + $def->attr = $attr; + return $def; + } + + /** + * Merges the values of another element definition into this one. + * Values from the new element def take precedence if a value is + * not mergeable. + */ + public function mergeIn($def) { + + // later keys takes precedence + foreach($def->attr as $k => $v) { + if ($k === 0) { + // merge in the includes + // sorry, no way to override an include + foreach ($v as $v2) { + $this->attr[0][] = $v2; + } + continue; + } + if ($v === false) { + if (isset($this->attr[$k])) unset($this->attr[$k]); + continue; + } + $this->attr[$k] = $v; + } + $this->_mergeAssocArray($this->attr_transform_pre, $def->attr_transform_pre); + $this->_mergeAssocArray($this->attr_transform_post, $def->attr_transform_post); + $this->_mergeAssocArray($this->excludes, $def->excludes); + + if(!empty($def->content_model)) { + $this->content_model .= ' | ' . $def->content_model; + $this->child = false; + } + if(!empty($def->content_model_type)) { + $this->content_model_type = $def->content_model_type; + $this->child = false; + } + if(!is_null($def->child)) $this->child = $def->child; + if(!is_null($def->formatting)) $this->formatting = $def->formatting; + if($def->descendants_are_inline) $this->descendants_are_inline = $def->descendants_are_inline; + + } + + /** + * Merges one array into another, removes values which equal false + * @param $a1 Array by reference that is merged into + * @param $a2 Array that merges into $a1 + */ + private function _mergeAssocArray(&$a1, $a2) { + foreach ($a2 as $k => $v) { + if ($v === false) { + if (isset($a1[$k])) unset($a1[$k]); + continue; + } + $a1[$k] = $v; + } + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Encoder.php b/libs/htmlpurifier/library/HTMLPurifier/Encoder.php new file mode 100755 index 0000000..79a42d2 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Encoder.php @@ -0,0 +1,426 @@ + under the + * LGPL license. Notes on what changed are inside, but in general, + * the original code transformed UTF-8 text into an array of integer + * Unicode codepoints. Understandably, transforming that back to + * a string would be somewhat expensive, so the function was modded to + * directly operate on the string. However, this discourages code + * reuse, and the logic enumerated here would be useful for any + * function that needs to be able to understand UTF-8 characters. + * As of right now, only smart lossless character encoding converters + * would need that, and I'm probably not going to implement them. + * Once again, PHP 6 should solve all our problems. + */ + public static function cleanUTF8($str, $force_php = false) { + + // UTF-8 validity is checked since PHP 4.3.5 + // This is an optimization: if the string is already valid UTF-8, no + // need to do PHP stuff. 99% of the time, this will be the case. + // The regexp matches the XML char production, as well as well as excluding + // non-SGML codepoints U+007F to U+009F + if (preg_match('/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du', $str)) { + return $str; + } + + $mState = 0; // cached expected number of octets after the current octet + // until the beginning of the next UTF8 character sequence + $mUcs4 = 0; // cached Unicode character + $mBytes = 1; // cached expected number of octets in the current sequence + + // original code involved an $out that was an array of Unicode + // codepoints. Instead of having to convert back into UTF-8, we've + // decided to directly append valid UTF-8 characters onto a string + // $out once they're done. $char accumulates raw bytes, while $mUcs4 + // turns into the Unicode code point, so there's some redundancy. + + $out = ''; + $char = ''; + + $len = strlen($str); + for($i = 0; $i < $len; $i++) { + $in = ord($str{$i}); + $char .= $str[$i]; // append byte to char + if (0 == $mState) { + // When mState is zero we expect either a US-ASCII character + // or a multi-octet sequence. + if (0 == (0x80 & ($in))) { + // US-ASCII, pass straight through. + if (($in <= 31 || $in == 127) && + !($in == 9 || $in == 13 || $in == 10) // save \r\t\n + ) { + // control characters, remove + } else { + $out .= $char; + } + // reset + $char = ''; + $mBytes = 1; + } elseif (0xC0 == (0xE0 & ($in))) { + // First octet of 2 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x1F) << 6; + $mState = 1; + $mBytes = 2; + } elseif (0xE0 == (0xF0 & ($in))) { + // First octet of 3 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x0F) << 12; + $mState = 2; + $mBytes = 3; + } elseif (0xF0 == (0xF8 & ($in))) { + // First octet of 4 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x07) << 18; + $mState = 3; + $mBytes = 4; + } elseif (0xF8 == (0xFC & ($in))) { + // First octet of 5 octet sequence. + // + // This is illegal because the encoded codepoint must be + // either: + // (a) not the shortest form or + // (b) outside the Unicode range of 0-0x10FFFF. + // Rather than trying to resynchronize, we will carry on + // until the end of the sequence and let the later error + // handling code catch it. + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x03) << 24; + $mState = 4; + $mBytes = 5; + } elseif (0xFC == (0xFE & ($in))) { + // First octet of 6 octet sequence, see comments for 5 + // octet sequence. + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 1) << 30; + $mState = 5; + $mBytes = 6; + } else { + // Current octet is neither in the US-ASCII range nor a + // legal first octet of a multi-octet sequence. + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + $char = ''; + } + } else { + // When mState is non-zero, we expect a continuation of the + // multi-octet sequence + if (0x80 == (0xC0 & ($in))) { + // Legal continuation. + $shift = ($mState - 1) * 6; + $tmp = $in; + $tmp = ($tmp & 0x0000003F) << $shift; + $mUcs4 |= $tmp; + + if (0 == --$mState) { + // End of the multi-octet sequence. mUcs4 now contains + // the final Unicode codepoint to be output + + // Check for illegal sequences and codepoints. + + // From Unicode 3.1, non-shortest form is illegal + if (((2 == $mBytes) && ($mUcs4 < 0x0080)) || + ((3 == $mBytes) && ($mUcs4 < 0x0800)) || + ((4 == $mBytes) && ($mUcs4 < 0x10000)) || + (4 < $mBytes) || + // From Unicode 3.2, surrogate characters = illegal + (($mUcs4 & 0xFFFFF800) == 0xD800) || + // Codepoints outside the Unicode range are illegal + ($mUcs4 > 0x10FFFF) + ) { + + } elseif (0xFEFF != $mUcs4 && // omit BOM + // check for valid Char unicode codepoints + ( + 0x9 == $mUcs4 || + 0xA == $mUcs4 || + 0xD == $mUcs4 || + (0x20 <= $mUcs4 && 0x7E >= $mUcs4) || + // 7F-9F is not strictly prohibited by XML, + // but it is non-SGML, and thus we don't allow it + (0xA0 <= $mUcs4 && 0xD7FF >= $mUcs4) || + (0x10000 <= $mUcs4 && 0x10FFFF >= $mUcs4) + ) + ) { + $out .= $char; + } + // initialize UTF8 cache (reset) + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + $char = ''; + } + } else { + // ((0xC0 & (*in) != 0x80) && (mState != 0)) + // Incomplete multi-octet sequence. + // used to result in complete fail, but we'll reset + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + $char =''; + } + } + } + return $out; + } + + /** + * Translates a Unicode codepoint into its corresponding UTF-8 character. + * @note Based on Feyd's function at + * , + * which is in public domain. + * @note While we're going to do code point parsing anyway, a good + * optimization would be to refuse to translate code points that + * are non-SGML characters. However, this could lead to duplication. + * @note This is very similar to the unichr function in + * maintenance/generate-entity-file.php (although this is superior, + * due to its sanity checks). + */ + + // +----------+----------+----------+----------+ + // | 33222222 | 22221111 | 111111 | | + // | 10987654 | 32109876 | 54321098 | 76543210 | bit + // +----------+----------+----------+----------+ + // | | | | 0xxxxxxx | 1 byte 0x00000000..0x0000007F + // | | | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF + // | | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF + // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF + // +----------+----------+----------+----------+ + // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF) + // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes + // +----------+----------+----------+----------+ + + public static function unichr($code) { + if($code > 1114111 or $code < 0 or + ($code >= 55296 and $code <= 57343) ) { + // bits are set outside the "valid" range as defined + // by UNICODE 4.1.0 + return ''; + } + + $x = $y = $z = $w = 0; + if ($code < 128) { + // regular ASCII character + $x = $code; + } else { + // set up bits for UTF-8 + $x = ($code & 63) | 128; + if ($code < 2048) { + $y = (($code & 2047) >> 6) | 192; + } else { + $y = (($code & 4032) >> 6) | 128; + if($code < 65536) { + $z = (($code >> 12) & 15) | 224; + } else { + $z = (($code >> 12) & 63) | 128; + $w = (($code >> 18) & 7) | 240; + } + } + } + // set up the actual character + $ret = ''; + if($w) $ret .= chr($w); + if($z) $ret .= chr($z); + if($y) $ret .= chr($y); + $ret .= chr($x); + + return $ret; + } + + /** + * Converts a string to UTF-8 based on configuration. + */ + public static function convertToUTF8($str, $config, $context) { + $encoding = $config->get('Core', 'Encoding'); + if ($encoding === 'utf-8') return $str; + static $iconv = null; + if ($iconv === null) $iconv = function_exists('iconv'); + set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler')); + if ($iconv && !$config->get('Test', 'ForceNoIconv')) { + $str = iconv($encoding, 'utf-8//IGNORE', $str); + if ($str === false) { + // $encoding is not a valid encoding + restore_error_handler(); + trigger_error('Invalid encoding ' . $encoding, E_USER_ERROR); + return ''; + } + // If the string is bjorked by Shift_JIS or a similar encoding + // that doesn't support all of ASCII, convert the naughty + // characters to their true byte-wise ASCII/UTF-8 equivalents. + $str = strtr($str, HTMLPurifier_Encoder::testEncodingSupportsASCII($encoding)); + restore_error_handler(); + return $str; + } elseif ($encoding === 'iso-8859-1') { + $str = utf8_encode($str); + restore_error_handler(); + return $str; + } + trigger_error('Encoding not supported, please install iconv', E_USER_ERROR); + } + + /** + * Converts a string from UTF-8 based on configuration. + * @note Currently, this is a lossy conversion, with unexpressable + * characters being omitted. + */ + public static function convertFromUTF8($str, $config, $context) { + $encoding = $config->get('Core', 'Encoding'); + if ($encoding === 'utf-8') return $str; + static $iconv = null; + if ($iconv === null) $iconv = function_exists('iconv'); + if ($escape = $config->get('Core', 'EscapeNonASCIICharacters')) { + $str = HTMLPurifier_Encoder::convertToASCIIDumbLossless($str); + } + set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler')); + if ($iconv && !$config->get('Test', 'ForceNoIconv')) { + // Undo our previous fix in convertToUTF8, otherwise iconv will barf + $ascii_fix = HTMLPurifier_Encoder::testEncodingSupportsASCII($encoding); + if (!$escape && !empty($ascii_fix)) { + $clear_fix = array(); + foreach ($ascii_fix as $utf8 => $native) $clear_fix[$utf8] = ''; + $str = strtr($str, $clear_fix); + } + $str = strtr($str, array_flip($ascii_fix)); + // Normal stuff + $str = iconv('utf-8', $encoding . '//IGNORE', $str); + restore_error_handler(); + return $str; + } elseif ($encoding === 'iso-8859-1') { + $str = utf8_decode($str); + restore_error_handler(); + return $str; + } + trigger_error('Encoding not supported', E_USER_ERROR); + } + + /** + * Lossless (character-wise) conversion of HTML to ASCII + * @param $str UTF-8 string to be converted to ASCII + * @returns ASCII encoded string with non-ASCII character entity-ized + * @warning Adapted from MediaWiki, claiming fair use: this is a common + * algorithm. If you disagree with this license fudgery, + * implement it yourself. + * @note Uses decimal numeric entities since they are best supported. + * @note This is a DUMB function: it has no concept of keeping + * character entities that the projected character encoding + * can allow. We could possibly implement a smart version + * but that would require it to also know which Unicode + * codepoints the charset supported (not an easy task). + * @note Sort of with cleanUTF8() but it assumes that $str is + * well-formed UTF-8 + */ + public static function convertToASCIIDumbLossless($str) { + $bytesleft = 0; + $result = ''; + $working = 0; + $len = strlen($str); + for( $i = 0; $i < $len; $i++ ) { + $bytevalue = ord( $str[$i] ); + if( $bytevalue <= 0x7F ) { //0xxx xxxx + $result .= chr( $bytevalue ); + $bytesleft = 0; + } elseif( $bytevalue <= 0xBF ) { //10xx xxxx + $working = $working << 6; + $working += ($bytevalue & 0x3F); + $bytesleft--; + if( $bytesleft <= 0 ) { + $result .= "&#" . $working . ";"; + } + } elseif( $bytevalue <= 0xDF ) { //110x xxxx + $working = $bytevalue & 0x1F; + $bytesleft = 1; + } elseif( $bytevalue <= 0xEF ) { //1110 xxxx + $working = $bytevalue & 0x0F; + $bytesleft = 2; + } else { //1111 0xxx + $working = $bytevalue & 0x07; + $bytesleft = 3; + } + } + return $result; + } + + /** + * This expensive function tests whether or not a given character + * encoding supports ASCII. 7/8-bit encodings like Shift_JIS will + * fail this test, and require special processing. Variable width + * encodings shouldn't ever fail. + * + * @param string $encoding Encoding name to test, as per iconv format + * @param bool $bypass Whether or not to bypass the precompiled arrays. + * @return Array of UTF-8 characters to their corresponding ASCII, + * which can be used to "undo" any overzealous iconv action. + */ + public static function testEncodingSupportsASCII($encoding, $bypass = false) { + static $encodings = array(); + if (!$bypass) { + if (isset($encodings[$encoding])) return $encodings[$encoding]; + $lenc = strtolower($encoding); + switch ($lenc) { + case 'shift_jis': + return array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~'); + case 'johab': + return array("\xE2\x82\xA9" => '\\'); + } + if (strpos($lenc, 'iso-8859-') === 0) return array(); + } + $ret = array(); + set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler')); + if (iconv('UTF-8', $encoding, 'a') === false) return false; + for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars + $c = chr($i); // UTF-8 char + $r = iconv('UTF-8', "$encoding//IGNORE", $c); // initial conversion + if ( + $r === '' || + // This line is needed for iconv implementations that do not + // omit characters that do not exist in the target character set + ($r === $c && iconv($encoding, 'UTF-8//IGNORE', $r) !== $c) + ) { + // Reverse engineer: what's the UTF-8 equiv of this byte + // sequence? This assumes that there's no variable width + // encoding that doesn't support ASCII. + $ret[iconv($encoding, 'UTF-8//IGNORE', $c)] = $c; + } + } + restore_error_handler(); + $encodings[$encoding] = $ret; + return $ret; + } + + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/EntityLookup.php b/libs/htmlpurifier/library/HTMLPurifier/EntityLookup.php new file mode 100755 index 0000000..b4dfce9 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/EntityLookup.php @@ -0,0 +1,44 @@ +table = unserialize(file_get_contents($file)); + } + + /** + * Retrieves sole instance of the object. + * @param Optional prototype of custom lookup table to overload with. + */ + public static function instance($prototype = false) { + // no references, since PHP doesn't copy unless modified + static $instance = null; + if ($prototype) { + $instance = $prototype; + } elseif (!$instance) { + $instance = new HTMLPurifier_EntityLookup(); + $instance->setup(); + } + return $instance; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser b/libs/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser new file mode 100755 index 0000000..f2b8b8f --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser @@ -0,0 +1 @@ +a:246:{s:4:"nbsp";s:2:" ";s:5:"iexcl";s:2:"¡";s:4:"cent";s:2:"¢";s:5:"pound";s:2:"£";s:6:"curren";s:2:"¤";s:3:"yen";s:2:"Â¥";s:6:"brvbar";s:2:"¦";s:4:"sect";s:2:"§";s:3:"uml";s:2:"¨";s:4:"copy";s:2:"©";s:4:"ordf";s:2:"ª";s:5:"laquo";s:2:"«";s:3:"not";s:2:"¬";s:3:"shy";s:2:"­";s:3:"reg";s:2:"®";s:4:"macr";s:2:"¯";s:3:"deg";s:2:"°";s:6:"plusmn";s:2:"±";s:5:"acute";s:2:"´";s:5:"micro";s:2:"µ";s:4:"para";s:2:"¶";s:6:"middot";s:2:"·";s:5:"cedil";s:2:"¸";s:4:"ordm";s:2:"º";s:5:"raquo";s:2:"»";s:6:"iquest";s:2:"¿";s:6:"Agrave";s:2:"À";s:6:"Aacute";s:2:"Ã";s:5:"Acirc";s:2:"Â";s:6:"Atilde";s:2:"Ã";s:4:"Auml";s:2:"Ä";s:5:"Aring";s:2:"Ã…";s:5:"AElig";s:2:"Æ";s:6:"Ccedil";s:2:"Ç";s:6:"Egrave";s:2:"È";s:6:"Eacute";s:2:"É";s:5:"Ecirc";s:2:"Ê";s:4:"Euml";s:2:"Ë";s:6:"Igrave";s:2:"ÃŒ";s:6:"Iacute";s:2:"Ã";s:5:"Icirc";s:2:"ÃŽ";s:4:"Iuml";s:2:"Ã";s:3:"ETH";s:2:"Ã";s:6:"Ntilde";s:2:"Ñ";s:6:"Ograve";s:2:"Ã’";s:6:"Oacute";s:2:"Ó";s:5:"Ocirc";s:2:"Ô";s:6:"Otilde";s:2:"Õ";s:4:"Ouml";s:2:"Ö";s:5:"times";s:2:"×";s:6:"Oslash";s:2:"Ø";s:6:"Ugrave";s:2:"Ù";s:6:"Uacute";s:2:"Ú";s:5:"Ucirc";s:2:"Û";s:4:"Uuml";s:2:"Ãœ";s:6:"Yacute";s:2:"Ã";s:5:"THORN";s:2:"Þ";s:5:"szlig";s:2:"ß";s:6:"agrave";s:2:"à";s:6:"aacute";s:2:"á";s:5:"acirc";s:2:"â";s:6:"atilde";s:2:"ã";s:4:"auml";s:2:"ä";s:5:"aring";s:2:"Ã¥";s:5:"aelig";s:2:"æ";s:6:"ccedil";s:2:"ç";s:6:"egrave";s:2:"è";s:6:"eacute";s:2:"é";s:5:"ecirc";s:2:"ê";s:4:"euml";s:2:"ë";s:6:"igrave";s:2:"ì";s:6:"iacute";s:2:"í";s:5:"icirc";s:2:"î";s:4:"iuml";s:2:"ï";s:3:"eth";s:2:"ð";s:6:"ntilde";s:2:"ñ";s:6:"ograve";s:2:"ò";s:6:"oacute";s:2:"ó";s:5:"ocirc";s:2:"ô";s:6:"otilde";s:2:"õ";s:4:"ouml";s:2:"ö";s:6:"divide";s:2:"÷";s:6:"oslash";s:2:"ø";s:6:"ugrave";s:2:"ù";s:6:"uacute";s:2:"ú";s:5:"ucirc";s:2:"û";s:4:"uuml";s:2:"ü";s:6:"yacute";s:2:"ý";s:5:"thorn";s:2:"þ";s:4:"yuml";s:2:"ÿ";s:4:"quot";s:1:""";s:3:"amp";s:1:"&";s:2:"lt";s:1:"<";s:2:"gt";s:1:">";s:4:"apos";s:1:"'";s:5:"OElig";s:2:"Å’";s:5:"oelig";s:2:"Å“";s:6:"Scaron";s:2:"Å ";s:6:"scaron";s:2:"Å¡";s:4:"Yuml";s:2:"Ÿ";s:4:"circ";s:2:"ˆ";s:5:"tilde";s:2:"Ëœ";s:4:"ensp";s:3:" ";s:4:"emsp";s:3:" ";s:6:"thinsp";s:3:" ";s:4:"zwnj";s:3:"‌";s:3:"zwj";s:3:"â€";s:3:"lrm";s:3:"‎";s:3:"rlm";s:3:"â€";s:5:"ndash";s:3:"–";s:5:"mdash";s:3:"—";s:5:"lsquo";s:3:"‘";s:5:"rsquo";s:3:"’";s:5:"sbquo";s:3:"‚";s:5:"ldquo";s:3:"“";s:5:"rdquo";s:3:"â€";s:5:"bdquo";s:3:"„";s:6:"dagger";s:3:"†";s:6:"Dagger";s:3:"‡";s:6:"permil";s:3:"‰";s:6:"lsaquo";s:3:"‹";s:6:"rsaquo";s:3:"›";s:4:"euro";s:3:"€";s:4:"fnof";s:2:"Æ’";s:5:"Alpha";s:2:"Α";s:4:"Beta";s:2:"Î’";s:5:"Gamma";s:2:"Γ";s:5:"Delta";s:2:"Δ";s:7:"Epsilon";s:2:"Ε";s:4:"Zeta";s:2:"Ζ";s:3:"Eta";s:2:"Η";s:5:"Theta";s:2:"Θ";s:4:"Iota";s:2:"Ι";s:5:"Kappa";s:2:"Κ";s:6:"Lambda";s:2:"Λ";s:2:"Mu";s:2:"Îœ";s:2:"Nu";s:2:"Î";s:2:"Xi";s:2:"Ξ";s:7:"Omicron";s:2:"Ο";s:2:"Pi";s:2:"Π";s:3:"Rho";s:2:"Ρ";s:5:"Sigma";s:2:"Σ";s:3:"Tau";s:2:"Τ";s:7:"Upsilon";s:2:"Î¥";s:3:"Phi";s:2:"Φ";s:3:"Chi";s:2:"Χ";s:3:"Psi";s:2:"Ψ";s:5:"Omega";s:2:"Ω";s:5:"alpha";s:2:"α";s:4:"beta";s:2:"β";s:5:"gamma";s:2:"γ";s:5:"delta";s:2:"δ";s:7:"epsilon";s:2:"ε";s:4:"zeta";s:2:"ζ";s:3:"eta";s:2:"η";s:5:"theta";s:2:"θ";s:4:"iota";s:2:"ι";s:5:"kappa";s:2:"κ";s:6:"lambda";s:2:"λ";s:2:"mu";s:2:"μ";s:2:"nu";s:2:"ν";s:2:"xi";s:2:"ξ";s:7:"omicron";s:2:"ο";s:2:"pi";s:2:"Ï€";s:3:"rho";s:2:"Ï";s:6:"sigmaf";s:2:"Ï‚";s:5:"sigma";s:2:"σ";s:3:"tau";s:2:"Ï„";s:7:"upsilon";s:2:"Ï…";s:3:"phi";s:2:"φ";s:3:"chi";s:2:"χ";s:3:"psi";s:2:"ψ";s:5:"omega";s:2:"ω";s:8:"thetasym";s:2:"Ï‘";s:5:"upsih";s:2:"Ï’";s:3:"piv";s:2:"Ï–";s:4:"bull";s:3:"•";s:6:"hellip";s:3:"…";s:5:"prime";s:3:"′";s:5:"Prime";s:3:"″";s:5:"oline";s:3:"‾";s:5:"frasl";s:3:"â„";s:6:"weierp";s:3:"℘";s:5:"image";s:3:"â„‘";s:4:"real";s:3:"â„œ";s:5:"trade";s:3:"â„¢";s:7:"alefsym";s:3:"ℵ";s:4:"larr";s:3:"â†";s:4:"uarr";s:3:"↑";s:4:"rarr";s:3:"→";s:4:"darr";s:3:"↓";s:4:"harr";s:3:"↔";s:5:"crarr";s:3:"↵";s:4:"lArr";s:3:"â‡";s:4:"uArr";s:3:"⇑";s:4:"rArr";s:3:"⇒";s:4:"dArr";s:3:"⇓";s:4:"hArr";s:3:"⇔";s:6:"forall";s:3:"∀";s:4:"part";s:3:"∂";s:5:"exist";s:3:"∃";s:5:"empty";s:3:"∅";s:5:"nabla";s:3:"∇";s:4:"isin";s:3:"∈";s:5:"notin";s:3:"∉";s:2:"ni";s:3:"∋";s:4:"prod";s:3:"âˆ";s:3:"sum";s:3:"∑";s:5:"minus";s:3:"−";s:6:"lowast";s:3:"∗";s:5:"radic";s:3:"√";s:4:"prop";s:3:"âˆ";s:5:"infin";s:3:"∞";s:3:"ang";s:3:"∠";s:3:"and";s:3:"∧";s:2:"or";s:3:"∨";s:3:"cap";s:3:"∩";s:3:"cup";s:3:"∪";s:3:"int";s:3:"∫";s:3:"sim";s:3:"∼";s:4:"cong";s:3:"≅";s:5:"asymp";s:3:"≈";s:2:"ne";s:3:"≠";s:5:"equiv";s:3:"≡";s:2:"le";s:3:"≤";s:2:"ge";s:3:"≥";s:3:"sub";s:3:"⊂";s:3:"sup";s:3:"⊃";s:4:"nsub";s:3:"⊄";s:4:"sube";s:3:"⊆";s:4:"supe";s:3:"⊇";s:5:"oplus";s:3:"⊕";s:6:"otimes";s:3:"⊗";s:4:"perp";s:3:"⊥";s:4:"sdot";s:3:"â‹…";s:5:"lceil";s:3:"⌈";s:5:"rceil";s:3:"⌉";s:6:"lfloor";s:3:"⌊";s:6:"rfloor";s:3:"⌋";s:4:"lang";s:3:"〈";s:4:"rang";s:3:"〉";s:3:"loz";s:3:"â—Š";s:6:"spades";s:3:"â™ ";s:5:"clubs";s:3:"♣";s:6:"hearts";s:3:"♥";s:5:"diams";s:3:"♦";} \ No newline at end of file diff --git a/libs/htmlpurifier/library/HTMLPurifier/EntityParser.php b/libs/htmlpurifier/library/HTMLPurifier/EntityParser.php new file mode 100755 index 0000000..8c38447 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/EntityParser.php @@ -0,0 +1,144 @@ + '"', + 38 => '&', + 39 => "'", + 60 => '<', + 62 => '>' + ); + + /** + * Stripped entity names to decimal conversion table for special entities. + */ + protected $_special_ent2dec = + array( + 'quot' => 34, + 'amp' => 38, + 'lt' => 60, + 'gt' => 62 + ); + + /** + * Substitutes non-special entities with their parsed equivalents. Since + * running this whenever you have parsed character is t3h 5uck, we run + * it before everything else. + * + * @param $string String to have non-special entities parsed. + * @returns Parsed string. + */ + public function substituteNonSpecialEntities($string) { + // it will try to detect missing semicolons, but don't rely on it + return preg_replace_callback( + $this->_substituteEntitiesRegex, + array($this, 'nonSpecialEntityCallback'), + $string + ); + } + + /** + * Callback function for substituteNonSpecialEntities() that does the work. + * + * @param $matches PCRE matches array, with 0 the entire match, and + * either index 1, 2 or 3 set with a hex value, dec value, + * or string (respectively). + * @returns Replacement string. + */ + + protected function nonSpecialEntityCallback($matches) { + // replaces all but big five + $entity = $matches[0]; + $is_num = (@$matches[0][1] === '#'); + if ($is_num) { + $is_hex = (@$entity[2] === 'x'); + $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; + + // abort for special characters + if (isset($this->_special_dec2str[$code])) return $entity; + + return HTMLPurifier_Encoder::unichr($code); + } else { + if (isset($this->_special_ent2dec[$matches[3]])) return $entity; + if (!$this->_entity_lookup) { + $this->_entity_lookup = HTMLPurifier_EntityLookup::instance(); + } + if (isset($this->_entity_lookup->table[$matches[3]])) { + return $this->_entity_lookup->table[$matches[3]]; + } else { + return $entity; + } + } + } + + /** + * Substitutes only special entities with their parsed equivalents. + * + * @notice We try to avoid calling this function because otherwise, it + * would have to be called a lot (for every parsed section). + * + * @param $string String to have non-special entities parsed. + * @returns Parsed string. + */ + public function substituteSpecialEntities($string) { + return preg_replace_callback( + $this->_substituteEntitiesRegex, + array($this, 'specialEntityCallback'), + $string); + } + + /** + * Callback function for substituteSpecialEntities() that does the work. + * + * This callback has same syntax as nonSpecialEntityCallback(). + * + * @param $matches PCRE-style matches array, with 0 the entire match, and + * either index 1, 2 or 3 set with a hex value, dec value, + * or string (respectively). + * @returns Replacement string. + */ + protected function specialEntityCallback($matches) { + $entity = $matches[0]; + $is_num = (@$matches[0][1] === '#'); + if ($is_num) { + $is_hex = (@$entity[2] === 'x'); + $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; + return isset($this->_special_dec2str[$int]) ? + $this->_special_dec2str[$int] : + $entity; + } else { + return isset($this->_special_ent2dec[$matches[3]]) ? + $this->_special_ent2dec[$matches[3]] : + $entity; + } + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ErrorCollector.php b/libs/htmlpurifier/library/HTMLPurifier/ErrorCollector.php new file mode 100755 index 0000000..6713eaf --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ErrorCollector.php @@ -0,0 +1,209 @@ +locale =& $context->get('Locale'); + $this->context = $context; + $this->_current =& $this->_stacks[0]; + $this->errors =& $this->_stacks[0]; + } + + /** + * Sends an error message to the collector for later use + * @param $severity int Error severity, PHP error style (don't use E_USER_) + * @param $msg string Error message text + * @param $subst1 string First substitution for $msg + * @param $subst2 string ... + */ + public function send($severity, $msg) { + + $args = array(); + if (func_num_args() > 2) { + $args = func_get_args(); + array_shift($args); + unset($args[0]); + } + + $token = $this->context->get('CurrentToken', true); + $line = $token ? $token->line : $this->context->get('CurrentLine', true); + $col = $token ? $token->col : $this->context->get('CurrentCol', true); + $attr = $this->context->get('CurrentAttr', true); + + // perform special substitutions, also add custom parameters + $subst = array(); + if (!is_null($token)) { + $args['CurrentToken'] = $token; + } + if (!is_null($attr)) { + $subst['$CurrentAttr.Name'] = $attr; + if (isset($token->attr[$attr])) $subst['$CurrentAttr.Value'] = $token->attr[$attr]; + } + + if (empty($args)) { + $msg = $this->locale->getMessage($msg); + } else { + $msg = $this->locale->formatMessage($msg, $args); + } + + if (!empty($subst)) $msg = strtr($msg, $subst); + + // (numerically indexed) + $error = array( + self::LINENO => $line, + self::SEVERITY => $severity, + self::MESSAGE => $msg, + self::CHILDREN => array() + ); + $this->_current[] = $error; + + + // NEW CODE BELOW ... + + $struct = null; + // Top-level errors are either: + // TOKEN type, if $value is set appropriately, or + // "syntax" type, if $value is null + $new_struct = new HTMLPurifier_ErrorStruct(); + $new_struct->type = HTMLPurifier_ErrorStruct::TOKEN; + if ($token) $new_struct->value = clone $token; + if (is_int($line) && is_int($col)) { + if (isset($this->lines[$line][$col])) { + $struct = $this->lines[$line][$col]; + } else { + $struct = $this->lines[$line][$col] = $new_struct; + } + // These ksorts may present a performance problem + ksort($this->lines[$line], SORT_NUMERIC); + } else { + if (isset($this->lines[-1])) { + $struct = $this->lines[-1]; + } else { + $struct = $this->lines[-1] = $new_struct; + } + } + ksort($this->lines, SORT_NUMERIC); + + // Now, check if we need to operate on a lower structure + if (!empty($attr)) { + $struct = $struct->getChild(HTMLPurifier_ErrorStruct::ATTR, $attr); + if (!$struct->value) { + $struct->value = array($attr, 'PUT VALUE HERE'); + } + } + if (!empty($cssprop)) { + $struct = $struct->getChild(HTMLPurifier_ErrorStruct::CSSPROP, $cssprop); + if (!$struct->value) { + // if we tokenize CSS this might be a little more difficult to do + $struct->value = array($cssprop, 'PUT VALUE HERE'); + } + } + + // Ok, structs are all setup, now time to register the error + $struct->addError($severity, $msg); + } + + /** + * Retrieves raw error data for custom formatter to use + * @param List of arrays in format of array(line of error, + * error severity, error message, + * recursive sub-errors array) + */ + public function getRaw() { + return $this->errors; + } + + /** + * Default HTML formatting implementation for error messages + * @param $config Configuration array, vital for HTML output nature + * @param $errors Errors array to display; used for recursion. + */ + public function getHTMLFormatted($config, $errors = null) { + $ret = array(); + + $this->generator = new HTMLPurifier_Generator($config, $this->context); + if ($errors === null) $errors = $this->errors; + + // 'At line' message needs to be removed + + // generation code for new structure goes here. It needs to be recursive. + foreach ($this->lines as $line => $col_array) { + if ($line == -1) continue; + foreach ($col_array as $col => $struct) { + $this->_renderStruct($ret, $struct, $line, $col); + } + } + if (isset($this->lines[-1])) { + $this->_renderStruct($ret, $this->lines[-1]); + } + + if (empty($errors)) { + return '

    ' . $this->locale->getMessage('ErrorCollector: No errors') . '

    '; + } else { + return '
    • ' . implode('
    • ', $ret) . '
    '; + } + + } + + private function _renderStruct(&$ret, $struct, $line = null, $col = null) { + $stack = array($struct); + $context_stack = array(array()); + while ($current = array_pop($stack)) { + $context = array_pop($context_stack); + foreach ($current->errors as $error) { + list($severity, $msg) = $error; + $string = ''; + $string .= '
    '; + // W3C uses an icon to indicate the severity of the error. + $error = $this->locale->getErrorName($severity); + $string .= "$error "; + if (!is_null($line) && !is_null($col)) { + $string .= "Line $line, Column $col: "; + } else { + $string .= 'End of Document: '; + } + $string .= '' . $this->generator->escape($msg) . ' '; + $string .= '
    '; + // Here, have a marker for the character on the column appropriate. + // Be sure to clip extremely long lines. + //$string .= '
    ';
    +                //$string .= '';
    +                //$string .= '
    '; + $ret[] = $string; + } + foreach ($current->children as $type => $array) { + $context[] = $current; + $stack = array_merge($stack, array_reverse($array, true)); + for ($i = count($array); $i > 0; $i--) { + $context_stack[] = $context; + } + } + } + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/ErrorStruct.php b/libs/htmlpurifier/library/HTMLPurifier/ErrorStruct.php new file mode 100755 index 0000000..9bc8996 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/ErrorStruct.php @@ -0,0 +1,60 @@ +children[$type][$id])) { + $this->children[$type][$id] = new HTMLPurifier_ErrorStruct(); + $this->children[$type][$id]->type = $type; + } + return $this->children[$type][$id]; + } + + public function addError($severity, $message) { + $this->errors[] = array($severity, $message); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Exception.php b/libs/htmlpurifier/library/HTMLPurifier/Exception.php new file mode 100755 index 0000000..be85b4c --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Exception.php @@ -0,0 +1,12 @@ +preFilter, + * 2->preFilter, 3->preFilter, purify, 3->postFilter, 2->postFilter, + * 1->postFilter. + * + * @note Methods are not declared abstract as it is perfectly legitimate + * for an implementation not to want anything to happen on a step + */ + +class HTMLPurifier_Filter +{ + + /** + * Name of the filter for identification purposes + */ + public $name; + + /** + * Pre-processor function, handles HTML before HTML Purifier + */ + public function preFilter($html, $config, $context) { + return $html; + } + + /** + * Post-processor function, handles HTML after HTML Purifier + */ + public function postFilter($html, $config, $context) { + return $html; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php b/libs/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php new file mode 100755 index 0000000..970f9e0 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php @@ -0,0 +1,135 @@ + blocks from input HTML, cleans them up + * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks') + * so they can be used elsewhere in the document. + * + * @note + * See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for + * sample usage. + * + * @note + * This filter can also be used on stylesheets not included in the + * document--something purists would probably prefer. Just directly + * call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS() + */ +class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter +{ + + public $name = 'ExtractStyleBlocks'; + private $_styleMatches = array(); + private $_tidy; + + public function __construct() { + $this->_tidy = new csstidy(); + } + + /** + * Save the contents of CSS blocks to style matches + * @param $matches preg_replace style $matches array + */ + protected function styleCallback($matches) { + $this->_styleMatches[] = $matches[1]; + } + + /** + * Removes inline #isU', array($this, 'styleCallback'), $html); + $style_blocks = $this->_styleMatches; + $this->_styleMatches = array(); // reset + $context->register('StyleBlocks', $style_blocks); // $context must not be reused + if ($this->_tidy) { + foreach ($style_blocks as &$style) { + $style = $this->cleanCSS($style, $config, $context); + } + } + return $html; + } + + /** + * Takes CSS (the stuff found in in a font-family prop). + if ($config->get('FilterParam', 'ExtractStyleBlocksEscaping')) { + $css = str_replace( + array('<', '>', '&'), + array('\3C ', '\3E ', '\26 '), + $css + ); + } + return $css; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php b/libs/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php new file mode 100755 index 0000000..aca972f --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php @@ -0,0 +1,39 @@ +]+>.+?'. + 'http://www.youtube.com/v/([A-Za-z0-9\-_]+).+?#s'; + $pre_replace = '\1'; + return preg_replace($pre_regex, $pre_replace, $html); + } + + public function postFilter($html, $config, $context) { + $post_regex = '#([A-Za-z0-9\-_]+)#'; + return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html); + } + + protected function armorUrl($url) { + return str_replace('--', '--', $url); + } + + protected function postFilterCallback($matches) { + $url = $this->armorUrl($matches[1]); + return ''. + ''. + ''. + ''; + + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Generator.php b/libs/htmlpurifier/library/HTMLPurifier/Generator.php new file mode 100755 index 0000000..a1b96b9 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Generator.php @@ -0,0 +1,183 @@ + tags + */ + private $_scriptFix = false; + + /** + * Cache of HTMLDefinition during HTML output to determine whether or + * not attributes should be minimized. + */ + private $_def; + + /** + * Cache of %Output.SortAttr + */ + private $_sortAttr; + + /** + * Configuration for the generator + */ + protected $config; + + /** + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + */ + public function __construct($config, $context) { + $this->config = $config; + $this->_scriptFix = $config->get('Output', 'CommentScriptContents'); + $this->_sortAttr = $config->get('Output', 'SortAttr'); + $this->_def = $config->getHTMLDefinition(); + $this->_xhtml = $this->_def->doctype->xml; + } + + /** + * Generates HTML from an array of tokens. + * @param $tokens Array of HTMLPurifier_Token + * @param $config HTMLPurifier_Config object + * @return Generated HTML + */ + public function generateFromTokens($tokens) { + if (!$tokens) return ''; + + // Basic algorithm + $html = ''; + for ($i = 0, $size = count($tokens); $i < $size; $i++) { + if ($this->_scriptFix && $tokens[$i]->name === 'script' + && $i + 2 < $size && $tokens[$i+2] instanceof HTMLPurifier_Token_End) { + // script special case + // the contents of the script block must be ONE token + // for this to work. + $html .= $this->generateFromToken($tokens[$i++]); + $html .= $this->generateScriptFromToken($tokens[$i++]); + } + $html .= $this->generateFromToken($tokens[$i]); + } + + // Tidy cleanup + if (extension_loaded('tidy') && $this->config->get('Output', 'TidyFormat')) { + $tidy = new Tidy; + $tidy->parseString($html, array( + 'indent'=> true, + 'output-xhtml' => $this->_xhtml, + 'show-body-only' => true, + 'indent-spaces' => 2, + 'wrap' => 68, + ), 'utf8'); + $tidy->cleanRepair(); + $html = (string) $tidy; // explicit cast necessary + } + + // Normalize newlines to system defined value + $nl = $this->config->get('Output', 'Newline'); + if ($nl === null) $nl = PHP_EOL; + if ($nl !== "\n") $html = str_replace("\n", $nl, $html); + return $html; + } + + /** + * Generates HTML from a single token. + * @param $token HTMLPurifier_Token object. + * @return Generated HTML + */ + public function generateFromToken($token) { + if (!$token instanceof HTMLPurifier_Token) { + trigger_error('Cannot generate HTML from non-HTMLPurifier_Token object', E_USER_WARNING); + return ''; + + } elseif ($token instanceof HTMLPurifier_Token_Start) { + $attr = $this->generateAttributes($token->attr, $token->name); + return '<' . $token->name . ($attr ? ' ' : '') . $attr . '>'; + + } elseif ($token instanceof HTMLPurifier_Token_End) { + return 'name . '>'; + + } elseif ($token instanceof HTMLPurifier_Token_Empty) { + $attr = $this->generateAttributes($token->attr, $token->name); + return '<' . $token->name . ($attr ? ' ' : '') . $attr . + ( $this->_xhtml ? ' /': '' ) //
    v.
    + . '>'; + + } elseif ($token instanceof HTMLPurifier_Token_Text) { + return $this->escape($token->data, ENT_NOQUOTES); + + } elseif ($token instanceof HTMLPurifier_Token_Comment) { + return ''; + } else { + return ''; + + } + } + + /** + * Special case processor for the contents of script tags + * @warning This runs into problems if there's already a literal + * --> somewhere inside the script contents. + */ + public function generateScriptFromToken($token) { + if (!$token instanceof HTMLPurifier_Token_Text) return $this->generateFromToken($token); + // Thanks + $data = preg_replace('#//\s*$#', '', $token->data); + return ''; + } + + /** + * Generates attribute declarations from attribute array. + * @note This does not include the leading or trailing space. + * @param $assoc_array_of_attributes Attribute array + * @param $element Name of element attributes are for, used to check + * attribute minimization. + * @return Generate HTML fragment for insertion. + */ + public function generateAttributes($assoc_array_of_attributes, $element = false) { + $html = ''; + if ($this->_sortAttr) ksort($assoc_array_of_attributes); + foreach ($assoc_array_of_attributes as $key => $value) { + if (!$this->_xhtml) { + // Remove namespaced attributes + if (strpos($key, ':') !== false) continue; + // Check if we should minimize the attribute: val="val" -> val + if ($element && !empty($this->_def->info[$element]->attr[$key]->minimized)) { + $html .= $key . ' '; + continue; + } + } + $html .= $key.'="'.$this->escape($value).'" '; + } + return rtrim($html); + } + + /** + * Escapes raw text data. + * @todo This really ought to be protected, but until we have a facility + * for properly generating HTML here w/o using tokens, it stays + * public. + * @param $string String data to escape for HTML. + * @param $quote Quoting style, like htmlspecialchars. ENT_NOQUOTES is + * permissible for non-attribute output. + * @return String escaped data. + */ + public function escape($string, $quote = ENT_COMPAT) { + return htmlspecialchars($string, $quote, 'UTF-8'); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php new file mode 100755 index 0000000..3368821 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php @@ -0,0 +1,420 @@ +getAnonymousModule(); + if (!isset($module->info[$element_name])) { + $element = $module->addBlankElement($element_name); + } else { + $element = $module->info[$element_name]; + } + $element->attr[$attr_name] = $def; + } + + /** + * Adds a custom element to your HTML definition + * @note See HTMLPurifier_HTMLModule::addElement for detailed + * parameter and return value descriptions. + */ + public function addElement($element_name, $type, $contents, $attr_collections, $attributes) { + $module = $this->getAnonymousModule(); + // assume that if the user is calling this, the element + // is safe. This may not be a good idea + $element = $module->addElement($element_name, $type, $contents, $attr_collections, $attributes); + return $element; + } + + /** + * Adds a blank element to your HTML definition, for overriding + * existing behavior + * @note See HTMLPurifier_HTMLModule::addBlankElement for detailed + * parameter and return value descriptions. + */ + public function addBlankElement($element_name) { + $module = $this->getAnonymousModule(); + $element = $module->addBlankElement($element_name); + return $element; + } + + /** + * Retrieves a reference to the anonymous module, so you can + * bust out advanced features without having to make your own + * module. + */ + public function getAnonymousModule() { + if (!$this->_anonModule) { + $this->_anonModule = new HTMLPurifier_HTMLModule(); + $this->_anonModule->name = 'Anonymous'; + } + return $this->_anonModule; + } + + private $_anonModule; + + + // PUBLIC BUT INTERNAL VARIABLES -------------------------------------- + + public $type = 'HTML'; + public $manager; /**< Instance of HTMLPurifier_HTMLModuleManager */ + + /** + * Performs low-cost, preliminary initialization. + */ + public function __construct() { + $this->manager = new HTMLPurifier_HTMLModuleManager(); + } + + protected function doSetup($config) { + $this->processModules($config); + $this->setupConfigStuff($config); + unset($this->manager); + + // cleanup some of the element definitions + foreach ($this->info as $k => $v) { + unset($this->info[$k]->content_model); + unset($this->info[$k]->content_model_type); + } + } + + /** + * Extract out the information from the manager + */ + protected function processModules($config) { + + if ($this->_anonModule) { + // for user specific changes + // this is late-loaded so we don't have to deal with PHP4 + // reference wonky-ness + $this->manager->addModule($this->_anonModule); + unset($this->_anonModule); + } + + $this->manager->setup($config); + $this->doctype = $this->manager->doctype; + + foreach ($this->manager->modules as $module) { + foreach($module->info_tag_transform as $k => $v) { + if ($v === false) unset($this->info_tag_transform[$k]); + else $this->info_tag_transform[$k] = $v; + } + foreach($module->info_attr_transform_pre as $k => $v) { + if ($v === false) unset($this->info_attr_transform_pre[$k]); + else $this->info_attr_transform_pre[$k] = $v; + } + foreach($module->info_attr_transform_post as $k => $v) { + if ($v === false) unset($this->info_attr_transform_post[$k]); + else $this->info_attr_transform_post[$k] = $v; + } + foreach ($module->info_injector as $k => $v) { + if ($v === false) unset($this->info_injector[$k]); + else $this->info_injector[$k] = $v; + } + } + + $this->info = $this->manager->getElements(); + $this->info_content_sets = $this->manager->contentSets->lookup; + + } + + /** + * Sets up stuff based on config. We need a better way of doing this. + */ + protected function setupConfigStuff($config) { + + $block_wrapper = $config->get('HTML', 'BlockWrapper'); + if (isset($this->info_content_sets['Block'][$block_wrapper])) { + $this->info_block_wrapper = $block_wrapper; + } else { + trigger_error('Cannot use non-block element as block wrapper', + E_USER_ERROR); + } + + $parent = $config->get('HTML', 'Parent'); + $def = $this->manager->getElement($parent, true); + if ($def) { + $this->info_parent = $parent; + $this->info_parent_def = $def; + } else { + trigger_error('Cannot use unrecognized element as parent', + E_USER_ERROR); + $this->info_parent_def = $this->manager->getElement($this->info_parent, true); + } + + // support template text + $support = "(for information on implementing this, see the ". + "support forums) "; + + // setup allowed elements ----------------------------------------- + + $allowed_elements = $config->get('HTML', 'AllowedElements'); + $allowed_attributes = $config->get('HTML', 'AllowedAttributes'); // retrieve early + + if (!is_array($allowed_elements) && !is_array($allowed_attributes)) { + $allowed = $config->get('HTML', 'Allowed'); + if (is_string($allowed)) { + list($allowed_elements, $allowed_attributes) = $this->parseTinyMCEAllowedList($allowed); + } + } + + if (is_array($allowed_elements)) { + foreach ($this->info as $name => $d) { + if(!isset($allowed_elements[$name])) unset($this->info[$name]); + unset($allowed_elements[$name]); + } + // emit errors + foreach ($allowed_elements as $element => $d) { + $element = htmlspecialchars($element); // PHP doesn't escape errors, be careful! + trigger_error("Element '$element' is not supported $support", E_USER_WARNING); + } + } + + // setup allowed attributes --------------------------------------- + + $allowed_attributes_mutable = $allowed_attributes; // by copy! + if (is_array($allowed_attributes)) { + + // This actually doesn't do anything, since we went away from + // global attributes. It's possible that userland code uses + // it, but HTMLModuleManager doesn't! + foreach ($this->info_global_attr as $attr => $x) { + $keys = array($attr, "*@$attr", "*.$attr"); + $delete = true; + foreach ($keys as $key) { + if ($delete && isset($allowed_attributes[$key])) { + $delete = false; + } + if (isset($allowed_attributes_mutable[$key])) { + unset($allowed_attributes_mutable[$key]); + } + } + if ($delete) unset($this->info_global_attr[$attr]); + } + + foreach ($this->info as $tag => $info) { + foreach ($info->attr as $attr => $x) { + $keys = array("$tag@$attr", $attr, "*@$attr", "$tag.$attr", "*.$attr"); + $delete = true; + foreach ($keys as $key) { + if ($delete && isset($allowed_attributes[$key])) { + $delete = false; + } + if (isset($allowed_attributes_mutable[$key])) { + unset($allowed_attributes_mutable[$key]); + } + } + if ($delete) unset($this->info[$tag]->attr[$attr]); + } + } + // emit errors + foreach ($allowed_attributes_mutable as $elattr => $d) { + $bits = preg_split('/[.@]/', $elattr, 2); + $c = count($bits); + switch ($c) { + case 2: + if ($bits[0] !== '*') { + $element = htmlspecialchars($bits[0]); + $attribute = htmlspecialchars($bits[1]); + if (!isset($this->info[$element])) { + trigger_error("Cannot allow attribute '$attribute' if element '$element' is not allowed/supported $support"); + } else { + trigger_error("Attribute '$attribute' in element '$element' not supported $support", + E_USER_WARNING); + } + break; + } + // otherwise fall through + case 1: + $attribute = htmlspecialchars($bits[0]); + trigger_error("Global attribute '$attribute' is not ". + "supported in any elements $support", + E_USER_WARNING); + break; + } + } + + } + + // setup forbidden elements --------------------------------------- + + $forbidden_elements = $config->get('HTML', 'ForbiddenElements'); + $forbidden_attributes = $config->get('HTML', 'ForbiddenAttributes'); + + foreach ($this->info as $tag => $info) { + if (isset($forbidden_elements[$tag])) { + unset($this->info[$tag]); + continue; + } + foreach ($info->attr as $attr => $x) { + if ( + isset($forbidden_attributes["$tag@$attr"]) || + isset($forbidden_attributes["*@$attr"]) || + isset($forbidden_attributes[$attr]) + ) { + unset($this->info[$tag]->attr[$attr]); + continue; + } // this segment might get removed eventually + elseif (isset($forbidden_attributes["$tag.$attr"])) { + // $tag.$attr are not user supplied, so no worries! + trigger_error("Error with $tag.$attr: tag.attr syntax not supported for HTML.ForbiddenAttributes; use tag@attr instead", E_USER_WARNING); + } + } + } + foreach ($forbidden_attributes as $key => $v) { + if (strlen($key) < 2) continue; + if ($key[0] != '*') continue; + if ($key[1] == '.') { + trigger_error("Error with $key: *.attr syntax not supported for HTML.ForbiddenAttributes; use attr instead", E_USER_WARNING); + } + } + + // setup injectors ----------------------------------------------------- + foreach ($this->info_injector as $i => $injector) { + if ($injector->checkNeeded($config) !== false) { + // remove injector that does not have it's required + // elements/attributes present, and is thus not needed. + unset($this->info_injector[$i]); + } + } + } + + /** + * Parses a TinyMCE-flavored Allowed Elements and Attributes list into + * separate lists for processing. Format is element[attr1|attr2],element2... + * @warning Although it's largely drawn from TinyMCE's implementation, + * it is different, and you'll probably have to modify your lists + * @param $list String list to parse + * @param array($allowed_elements, $allowed_attributes) + * @todo Give this its own class, probably static interface + */ + public function parseTinyMCEAllowedList($list) { + + $list = str_replace(array(' ', "\t"), '', $list); + + $elements = array(); + $attributes = array(); + + $chunks = preg_split('/(,|[\n\r]+)/', $list); + foreach ($chunks as $chunk) { + if (empty($chunk)) continue; + // remove TinyMCE element control characters + if (!strpos($chunk, '[')) { + $element = $chunk; + $attr = false; + } else { + list($element, $attr) = explode('[', $chunk); + } + if ($element !== '*') $elements[$element] = true; + if (!$attr) continue; + $attr = substr($attr, 0, strlen($attr) - 1); // remove trailing ] + $attr = explode('|', $attr); + foreach ($attr as $key) { + $attributes["$element.$key"] = true; + } + } + + return array($elements, $attributes); + + } + + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule.php new file mode 100755 index 0000000..072cf68 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule.php @@ -0,0 +1,244 @@ +info, since the object's data is only info, + * with extra behavior associated with it. + */ + public $attr_collections = array(); + + /** + * Associative array of deprecated tag name to HTMLPurifier_TagTransform + */ + public $info_tag_transform = array(); + + /** + * List of HTMLPurifier_AttrTransform to be performed before validation. + */ + public $info_attr_transform_pre = array(); + + /** + * List of HTMLPurifier_AttrTransform to be performed after validation. + */ + public $info_attr_transform_post = array(); + + /** + * List of HTMLPurifier_Injector to be performed during well-formedness fixing. + * An injector will only be invoked if all of it's pre-requisites are met; + * if an injector fails setup, there will be no error; it will simply be + * silently disabled. + */ + public $info_injector = array(); + + /** + * Boolean flag that indicates whether or not getChildDef is implemented. + * For optimization reasons: may save a call to a function. Be sure + * to set it if you do implement getChildDef(), otherwise it will have + * no effect! + */ + public $defines_child_def = false; + + /** + * Boolean flag whether or not this module is safe. If it is not safe, all + * of its members are unsafe. Modules are safe by default (this might be + * slightly dangerous, but it doesn't make much sense to force HTML Purifier, + * which is based off of safe HTML, to explicitly say, "This is safe," even + * though there are modules which are "unsafe") + * + * @note Previously, safety could be applied at an element level granularity. + * We've removed this ability, so in order to add "unsafe" elements + * or attributes, a dedicated module with this property set to false + * must be used. + */ + public $safe = true; + + /** + * Retrieves a proper HTMLPurifier_ChildDef subclass based on + * content_model and content_model_type member variables of + * the HTMLPurifier_ElementDef class. There is a similar function + * in HTMLPurifier_HTMLDefinition. + * @param $def HTMLPurifier_ElementDef instance + * @return HTMLPurifier_ChildDef subclass + */ + public function getChildDef($def) {return false;} + + // -- Convenience ----------------------------------------------------- + + /** + * Convenience function that sets up a new element + * @param $element Name of element to add + * @param $type What content set should element be registered to? + * Set as false to skip this step. + * @param $contents Allowed children in form of: + * "$content_model_type: $content_model" + * @param $attr_includes What attribute collections to register to + * element? + * @param $attr What unique attributes does the element define? + * @note See ElementDef for in-depth descriptions of these parameters. + * @return Created element definition object, so you + * can set advanced parameters + */ + public function addElement($element, $type, $contents, $attr_includes = array(), $attr = array()) { + $this->elements[] = $element; + // parse content_model + list($content_model_type, $content_model) = $this->parseContents($contents); + // merge in attribute inclusions + $this->mergeInAttrIncludes($attr, $attr_includes); + // add element to content sets + if ($type) $this->addElementToContentSet($element, $type); + // create element + $this->info[$element] = HTMLPurifier_ElementDef::create( + $content_model, $content_model_type, $attr + ); + // literal object $contents means direct child manipulation + if (!is_string($contents)) $this->info[$element]->child = $contents; + return $this->info[$element]; + } + + /** + * Convenience function that creates a totally blank, non-standalone + * element. + * @param $element Name of element to create + * @return Created element + */ + public function addBlankElement($element) { + if (!isset($this->info[$element])) { + $this->elements[] = $element; + $this->info[$element] = new HTMLPurifier_ElementDef(); + $this->info[$element]->standalone = false; + } else { + trigger_error("Definition for $element already exists in module, cannot redefine"); + } + return $this->info[$element]; + } + + /** + * Convenience function that registers an element to a content set + * @param Element to register + * @param Name content set (warning: case sensitive, usually upper-case + * first letter) + */ + public function addElementToContentSet($element, $type) { + if (!isset($this->content_sets[$type])) $this->content_sets[$type] = ''; + else $this->content_sets[$type] .= ' | '; + $this->content_sets[$type] .= $element; + } + + /** + * Convenience function that transforms single-string contents + * into separate content model and content model type + * @param $contents Allowed children in form of: + * "$content_model_type: $content_model" + * @note If contents is an object, an array of two nulls will be + * returned, and the callee needs to take the original $contents + * and use it directly. + */ + public function parseContents($contents) { + if (!is_string($contents)) return array(null, null); // defer + switch ($contents) { + // check for shorthand content model forms + case 'Empty': + return array('empty', ''); + case 'Inline': + return array('optional', 'Inline | #PCDATA'); + case 'Flow': + return array('optional', 'Flow | #PCDATA'); + } + list($content_model_type, $content_model) = explode(':', $contents); + $content_model_type = strtolower(trim($content_model_type)); + $content_model = trim($content_model); + return array($content_model_type, $content_model); + } + + /** + * Convenience function that merges a list of attribute includes into + * an attribute array. + * @param $attr Reference to attr array to modify + * @param $attr_includes Array of includes / string include to merge in + */ + public function mergeInAttrIncludes(&$attr, $attr_includes) { + if (!is_array($attr_includes)) { + if (empty($attr_includes)) $attr_includes = array(); + else $attr_includes = array($attr_includes); + } + $attr[0] = $attr_includes; + } + + /** + * Convenience function that generates a lookup table with boolean + * true as value. + * @param $list List of values to turn into a lookup + * @note You can also pass an arbitrary number of arguments in + * place of the regular argument + * @return Lookup array equivalent of list + */ + public function makeLookup($list) { + if (is_string($list)) $list = func_get_args(); + $ret = array(); + foreach ($list as $value) { + if (is_null($value)) continue; + $ret[$value] = true; + } + return $ret; + } + + /** + * Lazy load construction of the module after determining whether + * or not it's needed, and also when a finalized configuration object + * is available. + * @param $config Instance of HTMLPurifier_Config + */ + public function setup($config) {} + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php new file mode 100755 index 0000000..3d66f1b --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php @@ -0,0 +1,31 @@ + array('dir' => false) + ); + + public function setup($config) { + $bdo = $this->addElement( + 'bdo', 'Inline', 'Inline', array('Core', 'Lang'), + array( + 'dir' => 'Enum#ltr,rtl', // required + // The Abstract Module specification has the attribute + // inclusions wrong for bdo: bdo allows Lang + ) + ); + $bdo->attr_transform_post['required-dir'] = new HTMLPurifier_AttrTransform_BdoDir(); + + $this->attr_collections['I18N']['dir'] = 'Enum#ltr,rtl'; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php new file mode 100755 index 0000000..fdf7b32 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php @@ -0,0 +1,25 @@ + array( + 0 => array('Style'), + // 'xml:space' => false, + 'class' => 'NMTOKENS', + 'id' => 'ID', + 'title' => 'CDATA', + ), + 'Lang' => array(), + 'I18N' => array( + 0 => array('Lang'), // proprietary, for xml:lang/lang + ), + 'Common' => array( + 0 => array('Core', 'I18N') + ) + ); +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php new file mode 100755 index 0000000..ff93690 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php @@ -0,0 +1,38 @@ + 'URI', + // 'datetime' => 'Datetime', // not implemented + ); + $this->addElement('del', 'Inline', $contents, 'Common', $attr); + $this->addElement('ins', 'Inline', $contents, 'Common', $attr); + } + + // HTML 4.01 specifies that ins/del must not contain block + // elements when used in an inline context, chameleon is + // a complicated workaround to acheive this effect + + // Inline context ! Block context (exclamation mark is + // separator, see getChildDef for parsing) + + public $defines_child_def = true; + public function getChildDef($def) { + if ($def->content_model_type != 'chameleon') return false; + $value = explode('!', $def->content_model); + return new HTMLPurifier_ChildDef_Chameleon($value[0], $value[1]); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php new file mode 100755 index 0000000..44c22f6 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php @@ -0,0 +1,118 @@ + 'Form', + 'Inline' => 'Formctrl', + ); + + public function setup($config) { + $form = $this->addElement('form', 'Form', + 'Required: Heading | List | Block | fieldset', 'Common', array( + 'accept' => 'ContentTypes', + 'accept-charset' => 'Charsets', + 'action*' => 'URI', + 'method' => 'Enum#get,post', + // really ContentType, but these two are the only ones used today + 'enctype' => 'Enum#application/x-www-form-urlencoded,multipart/form-data', + )); + $form->excludes = array('form' => true); + + $input = $this->addElement('input', 'Formctrl', 'Empty', 'Common', array( + 'accept' => 'ContentTypes', + 'accesskey' => 'Character', + 'alt' => 'Text', + 'checked' => 'Bool#checked', + 'disabled' => 'Bool#disabled', + 'maxlength' => 'Number', + 'name' => 'CDATA', + 'readonly' => 'Bool#readonly', + 'size' => 'Number', + 'src' => 'URI#embeds', + 'tabindex' => 'Number', + 'type' => 'Enum#text,password,checkbox,button,radio,submit,reset,file,hidden,image', + 'value' => 'CDATA', + )); + $input->attr_transform_post[] = new HTMLPurifier_AttrTransform_Input(); + + $this->addElement('select', 'Formctrl', 'Required: optgroup | option', 'Common', array( + 'disabled' => 'Bool#disabled', + 'multiple' => 'Bool#multiple', + 'name' => 'CDATA', + 'size' => 'Number', + 'tabindex' => 'Number', + )); + + $this->addElement('option', false, 'Optional: #PCDATA', 'Common', array( + 'disabled' => 'Bool#disabled', + 'label' => 'Text', + 'selected' => 'Bool#selected', + 'value' => 'CDATA', + )); + // It's illegal for there to be more than one selected, but not + // be multiple. Also, no selected means undefined behavior. This might + // be difficult to implement; perhaps an injector, or a context variable. + + $textarea = $this->addElement('textarea', 'Formctrl', 'Optional: #PCDATA', 'Common', array( + 'accesskey' => 'Character', + 'cols*' => 'Number', + 'disabled' => 'Bool#disabled', + 'name' => 'CDATA', + 'readonly' => 'Bool#readonly', + 'rows*' => 'Number', + 'tabindex' => 'Number', + )); + $textarea->attr_transform_pre[] = new HTMLPurifier_AttrTransform_Textarea(); + + $button = $this->addElement('button', 'Formctrl', 'Optional: #PCDATA | Heading | List | Block | Inline', 'Common', array( + 'accesskey' => 'Character', + 'disabled' => 'Bool#disabled', + 'name' => 'CDATA', + 'tabindex' => 'Number', + 'type' => 'Enum#button,submit,reset', + 'value' => 'CDATA', + )); + + // For exclusions, ideally we'd specify content sets, not literal elements + $button->excludes = $this->makeLookup( + 'form', 'fieldset', // Form + 'input', 'select', 'textarea', 'label', 'button', // Formctrl + 'a' // as per HTML 4.01 spec, this is omitted by modularization + ); + + // Extra exclusion: img usemap="" is not permitted within this element. + // We'll omit this for now, since we don't have any good way of + // indicating it yet. + + // This is HIGHLY user-unfriendly; we need a custom child-def for this + $this->addElement('fieldset', 'Form', 'Custom: (#WS?,legend,(Flow|#PCDATA)*)', 'Common'); + + $label = $this->addElement('label', 'Formctrl', 'Optional: #PCDATA | Inline', 'Common', array( + 'accesskey' => 'Character', + // 'for' => 'IDREF', // IDREF not implemented, cannot allow + )); + $label->excludes = array('label' => true); + + $this->addElement('legend', false, 'Optional: #PCDATA | Inline', 'Common', array( + 'accesskey' => 'Character', + )); + + $this->addElement('optgroup', false, 'Required: option', 'Common', array( + 'disabled' => 'Bool#disabled', + 'label*' => 'Text', + )); + + // Don't forget an injector for . This one's a little complex + // because it maps to multiple elements. + + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php new file mode 100755 index 0000000..d7e9bdd --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php @@ -0,0 +1,31 @@ +addElement( + 'a', 'Inline', 'Inline', 'Common', + array( + // 'accesskey' => 'Character', + // 'charset' => 'Charset', + 'href' => 'URI', + // 'hreflang' => 'LanguageCode', + 'rel' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rel'), + 'rev' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rev'), + // 'tabindex' => 'Number', + // 'type' => 'ContentType', + ) + ); + $a->formatting = true; + $a->excludes = array('a' => true); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php new file mode 100755 index 0000000..e6ed53a --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php @@ -0,0 +1,40 @@ +get('HTML', 'MaxImgLength'); + $img = $this->addElement( + 'img', 'Inline', 'Empty', 'Common', + array( + 'alt*' => 'Text', + // According to the spec, it's Length, but percents can + // be abused, so we allow only Pixels. + 'height' => 'Pixels#' . $max, + 'width' => 'Pixels#' . $max, + 'longdesc' => 'URI', + 'src*' => new HTMLPurifier_AttrDef_URI(true), // embedded + ) + ); + if ($max === null || $config->get('HTML', 'Trusted')) { + $img->attr['height'] = + $img->attr['width'] = 'Length'; + } + + // kind of strange, but splitting things up would be inefficient + $img->attr_transform_pre[] = + $img->attr_transform_post[] = + new HTMLPurifier_AttrTransform_ImgRequired(); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php new file mode 100755 index 0000000..df33927 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php @@ -0,0 +1,143 @@ +addElement('basefont', 'Inline', 'Empty', false, array( + 'color' => 'Color', + 'face' => 'Text', // extremely broad, we should + 'size' => 'Text', // tighten it + 'id' => 'ID' + )); + $this->addElement('center', 'Block', 'Flow', 'Common'); + $this->addElement('dir', 'Block', 'Required: li', 'Common', array( + 'compact' => 'Bool#compact' + )); + $this->addElement('font', 'Inline', 'Inline', array('Core', 'I18N'), array( + 'color' => 'Color', + 'face' => 'Text', // extremely broad, we should + 'size' => 'Text', // tighten it + )); + $this->addElement('menu', 'Block', 'Required: li', 'Common', array( + 'compact' => 'Bool#compact' + )); + + $s = $this->addElement('s', 'Inline', 'Inline', 'Common'); + $s->formatting = true; + + $strike = $this->addElement('strike', 'Inline', 'Inline', 'Common'); + $strike->formatting = true; + + $u = $this->addElement('u', 'Inline', 'Inline', 'Common'); + $u->formatting = true; + + // setup modifications to old elements + + $align = 'Enum#left,right,center,justify'; + + $address = $this->addBlankElement('address'); + $address->content_model = 'Inline | #PCDATA | p'; + $address->content_model_type = 'optional'; + $address->child = false; + + $blockquote = $this->addBlankElement('blockquote'); + $blockquote->content_model = 'Flow | #PCDATA'; + $blockquote->content_model_type = 'optional'; + $blockquote->child = false; + + $br = $this->addBlankElement('br'); + $br->attr['clear'] = 'Enum#left,all,right,none'; + + $caption = $this->addBlankElement('caption'); + $caption->attr['align'] = 'Enum#top,bottom,left,right'; + + $div = $this->addBlankElement('div'); + $div->attr['align'] = $align; + + $dl = $this->addBlankElement('dl'); + $dl->attr['compact'] = 'Bool#compact'; + + for ($i = 1; $i <= 6; $i++) { + $h = $this->addBlankElement("h$i"); + $h->attr['align'] = $align; + } + + $hr = $this->addBlankElement('hr'); + $hr->attr['align'] = $align; + $hr->attr['noshade'] = 'Bool#noshade'; + $hr->attr['size'] = 'Pixels'; + $hr->attr['width'] = 'Length'; + + $img = $this->addBlankElement('img'); + $img->attr['align'] = 'Enum#top,middle,bottom,left,right'; + $img->attr['border'] = 'Pixels'; + $img->attr['hspace'] = 'Pixels'; + $img->attr['vspace'] = 'Pixels'; + + // figure out this integer business + + $li = $this->addBlankElement('li'); + $li->attr['value'] = new HTMLPurifier_AttrDef_Integer(); + $li->attr['type'] = 'Enum#s:1,i,I,a,A,disc,square,circle'; + + $ol = $this->addBlankElement('ol'); + $ol->attr['compact'] = 'Bool#compact'; + $ol->attr['start'] = new HTMLPurifier_AttrDef_Integer(); + $ol->attr['type'] = 'Enum#s:1,i,I,a,A'; + + $p = $this->addBlankElement('p'); + $p->attr['align'] = $align; + + $pre = $this->addBlankElement('pre'); + $pre->attr['width'] = 'Number'; + + // script omitted + + $table = $this->addBlankElement('table'); + $table->attr['align'] = 'Enum#left,center,right'; + $table->attr['bgcolor'] = 'Color'; + + $tr = $this->addBlankElement('tr'); + $tr->attr['bgcolor'] = 'Color'; + + $th = $this->addBlankElement('th'); + $th->attr['bgcolor'] = 'Color'; + $th->attr['height'] = 'Length'; + $th->attr['nowrap'] = 'Bool#nowrap'; + $th->attr['width'] = 'Length'; + + $td = $this->addBlankElement('td'); + $td->attr['bgcolor'] = 'Color'; + $td->attr['height'] = 'Length'; + $td->attr['nowrap'] = 'Bool#nowrap'; + $td->attr['width'] = 'Length'; + + $ul = $this->addBlankElement('ul'); + $ul->attr['compact'] = 'Bool#compact'; + $ul->attr['type'] = 'Enum#square,disc,circle'; + + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php new file mode 100755 index 0000000..1d15f27 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php @@ -0,0 +1,35 @@ + 'List'); + + public function setup($config) { + $this->addElement('ol', 'List', 'Required: li', 'Common'); + $this->addElement('ul', 'List', 'Required: li', 'Common'); + $this->addElement('dl', 'List', 'Required: dt | dd', 'Common'); + + $this->addElement('li', false, 'Flow', 'Common'); + + $this->addElement('dd', false, 'Flow', 'Common'); + $this->addElement('dt', false, 'Inline', 'Common'); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php new file mode 100755 index 0000000..d908a0a --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php @@ -0,0 +1,18 @@ +addBlankElement($name); + $element->attr['name'] = 'ID'; + } + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php new file mode 100755 index 0000000..5f1b14a --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php @@ -0,0 +1,14 @@ + array( + 'lang' => 'LanguageCode', + ) + ); +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php new file mode 100755 index 0000000..193c101 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php @@ -0,0 +1,47 @@ + to cater to legacy browsers: this + * module does not allow this sort of behavior + */ +class HTMLPurifier_HTMLModule_Object extends HTMLPurifier_HTMLModule +{ + + public $name = 'Object'; + public $safe = false; + + public function setup($config) { + + $this->addElement('object', 'Inline', 'Optional: #PCDATA | Flow | param', 'Common', + array( + 'archive' => 'URI', + 'classid' => 'URI', + 'codebase' => 'URI', + 'codetype' => 'Text', + 'data' => 'URI', + 'declare' => 'Bool#declare', + 'height' => 'Length', + 'name' => 'CDATA', + 'standby' => 'Text', + 'tabindex' => 'Number', + 'type' => 'ContentType', + 'width' => 'Length' + ) + ); + + $this->addElement('param', false, 'Empty', false, + array( + 'id' => 'ID', + 'name*' => 'Text', + 'type' => 'Text', + 'value' => 'Text', + 'valuetype' => 'Enum#data,ref,object' + ) + ); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php new file mode 100755 index 0000000..8ff0b5e --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php @@ -0,0 +1,36 @@ +addElement('hr', 'Block', 'Empty', 'Common'); + $this->addElement('sub', 'Inline', 'Inline', 'Common'); + $this->addElement('sup', 'Inline', 'Inline', 'Common'); + $b = $this->addElement('b', 'Inline', 'Inline', 'Common'); + $b->formatting = true; + $big = $this->addElement('big', 'Inline', 'Inline', 'Common'); + $big->formatting = true; + $i = $this->addElement('i', 'Inline', 'Inline', 'Common'); + $i->formatting = true; + $small = $this->addElement('small', 'Inline', 'Inline', 'Common'); + $small->formatting = true; + $tt = $this->addElement('tt', 'Inline', 'Inline', 'Common'); + $tt->formatting = true; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php new file mode 100755 index 0000000..dd36a3d --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php @@ -0,0 +1,33 @@ +addElement('marquee', 'Inline', 'Flow', 'Common', + array( + 'direction' => 'Enum#left,right,up,down', + 'behavior' => 'Enum#alternate', + 'width' => 'Length', + 'height' => 'Length', + 'scrolldelay' => 'Number', + 'scrollamount' => 'Number', + 'loop' => 'Number', + 'bgcolor' => 'Color', + 'hspace' => 'Pixels', + 'vspace' => 'Pixels', + ) + ); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php new file mode 100755 index 0000000..b26a0a3 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php @@ -0,0 +1,27 @@ +addElement('ruby', 'Inline', + 'Custom: ((rb, (rt | (rp, rt, rp))) | (rbc, rtc, rtc?))', + 'Common'); + $this->addElement('rbc', false, 'Required: rb', 'Common'); + $this->addElement('rtc', false, 'Required: rt', 'Common'); + $rb = $this->addElement('rb', false, 'Inline', 'Common'); + $rb->excludes = array('ruby' => true); + $rt = $this->addElement('rt', false, 'Inline', 'Common', array('rbspan' => 'Number')); + $rt->excludes = array('ruby' => true); + $this->addElement('rp', false, 'Optional: #PCDATA', 'Common'); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php new file mode 100755 index 0000000..635e8f2 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php @@ -0,0 +1,33 @@ +get('HTML', 'MaxImgLength'); + $embed = $this->addElement( + 'embed', 'Inline', 'Empty', 'Common', + array( + 'src*' => 'URI#embedded', + 'type' => 'Enum#application/x-shockwave-flash', + 'width' => 'Pixels#' . $max, + 'height' => 'Pixels#' . $max, + 'allowscriptaccess' => 'Enum#never', + 'allownetworking' => 'Enum#internal', + 'wmode' => 'Enum#window', + 'name' => 'ID', + ) + ); + $embed->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeEmbed(); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php new file mode 100755 index 0000000..bbda7a2 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php @@ -0,0 +1,50 @@ +get('HTML', 'MaxImgLength'); + $object = $this->addElement( + 'object', + 'Inline', + 'Optional: param | Flow | #PCDATA', + 'Common', + array( + // While technically not required by the spec, we're forcing + // it to this value. + 'type' => 'Enum#application/x-shockwave-flash', + 'width' => 'Pixels#' . $max, + 'height' => 'Pixels#' . $max, + 'data' => 'URI#embedded' + ) + ); + $object->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeObject(); + + $param = $this->addElement('param', false, 'Empty', false, + array( + 'id' => 'ID', + 'name*' => 'Text', + 'value' => 'Text' + ) + ); + $param->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeParam(); + $this->info_injector[] = 'SafeObject'; + + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php new file mode 100755 index 0000000..cecdea6 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php @@ -0,0 +1,54 @@ + 'script | noscript', 'Inline' => 'script | noscript'); + public $safe = false; + + public function setup($config) { + // TODO: create custom child-definition for noscript that + // auto-wraps stray #PCDATA in a similar manner to + // blockquote's custom definition (we would use it but + // blockquote's contents are optional while noscript's contents + // are required) + + // TODO: convert this to new syntax, main problem is getting + // both content sets working + + // In theory, this could be safe, but I don't see any reason to + // allow it. + $this->info['noscript'] = new HTMLPurifier_ElementDef(); + $this->info['noscript']->attr = array( 0 => array('Common') ); + $this->info['noscript']->content_model = 'Heading | List | Block'; + $this->info['noscript']->content_model_type = 'required'; + + $this->info['script'] = new HTMLPurifier_ElementDef(); + $this->info['script']->attr = array( + 'defer' => new HTMLPurifier_AttrDef_Enum(array('defer')), + 'src' => new HTMLPurifier_AttrDef_URI(true), + 'type' => new HTMLPurifier_AttrDef_Enum(array('text/javascript')) + ); + $this->info['script']->content_model = '#PCDATA'; + $this->info['script']->content_model_type = 'optional'; + $this->info['script']->attr_transform_pre['type'] = + $this->info['script']->attr_transform_post['type'] = + new HTMLPurifier_AttrTransform_ScriptRequired(); + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php new file mode 100755 index 0000000..eb78464 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php @@ -0,0 +1,24 @@ + array('style' => false), // see constructor + 'Core' => array(0 => array('Style')) + ); + + public function setup($config) { + $this->attr_collections['Style']['style'] = new HTMLPurifier_AttrDef_CSS(); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php new file mode 100755 index 0000000..f314ced --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php @@ -0,0 +1,66 @@ +addElement('caption', false, 'Inline', 'Common'); + + $this->addElement('table', 'Block', + new HTMLPurifier_ChildDef_Table(), 'Common', + array( + 'border' => 'Pixels', + 'cellpadding' => 'Length', + 'cellspacing' => 'Length', + 'frame' => 'Enum#void,above,below,hsides,lhs,rhs,vsides,box,border', + 'rules' => 'Enum#none,groups,rows,cols,all', + 'summary' => 'Text', + 'width' => 'Length' + ) + ); + + // common attributes + $cell_align = array( + 'align' => 'Enum#left,center,right,justify,char', + 'charoff' => 'Length', + 'valign' => 'Enum#top,middle,bottom,baseline', + ); + + $cell_t = array_merge( + array( + 'abbr' => 'Text', + 'colspan' => 'Number', + 'rowspan' => 'Number', + ), + $cell_align + ); + $this->addElement('td', false, 'Flow', 'Common', $cell_t); + $this->addElement('th', false, 'Flow', 'Common', $cell_t); + + $this->addElement('tr', false, 'Required: td | th', 'Common', $cell_align); + + $cell_col = array_merge( + array( + 'span' => 'Number', + 'width' => 'MultiLength', + ), + $cell_align + ); + $this->addElement('col', false, 'Empty', 'Common', $cell_col); + $this->addElement('colgroup', false, 'Optional: col', 'Common', $cell_col); + + $this->addElement('tbody', false, 'Required: tr', 'Common', $cell_align); + $this->addElement('thead', false, 'Required: tr', 'Common', $cell_align); + $this->addElement('tfoot', false, 'Required: tr', 'Common', $cell_align); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php new file mode 100755 index 0000000..2b844ec --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php @@ -0,0 +1,23 @@ +addBlankElement($name); + $e->attr = array( + 'target' => new HTMLPurifier_AttrDef_HTML_FrameTarget() + ); + } + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php new file mode 100755 index 0000000..ae77c71 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php @@ -0,0 +1,71 @@ + 'Heading | Block | Inline' + ); + + public function setup($config) { + + // Inline Phrasal ------------------------------------------------- + $this->addElement('abbr', 'Inline', 'Inline', 'Common'); + $this->addElement('acronym', 'Inline', 'Inline', 'Common'); + $this->addElement('cite', 'Inline', 'Inline', 'Common'); + $this->addElement('dfn', 'Inline', 'Inline', 'Common'); + $this->addElement('kbd', 'Inline', 'Inline', 'Common'); + $this->addElement('q', 'Inline', 'Inline', 'Common', array('cite' => 'URI')); + $this->addElement('samp', 'Inline', 'Inline', 'Common'); + $this->addElement('var', 'Inline', 'Inline', 'Common'); + + $em = $this->addElement('em', 'Inline', 'Inline', 'Common'); + $em->formatting = true; + + $strong = $this->addElement('strong', 'Inline', 'Inline', 'Common'); + $strong->formatting = true; + + $code = $this->addElement('code', 'Inline', 'Inline', 'Common'); + $code->formatting = true; + + // Inline Structural ---------------------------------------------- + $this->addElement('span', 'Inline', 'Inline', 'Common'); + $this->addElement('br', 'Inline', 'Empty', 'Core'); + + // Block Phrasal -------------------------------------------------- + $this->addElement('address', 'Block', 'Inline', 'Common'); + $this->addElement('blockquote', 'Block', 'Optional: Heading | Block | List', 'Common', array('cite' => 'URI') ); + $pre = $this->addElement('pre', 'Block', 'Inline', 'Common'); + $pre->excludes = $this->makeLookup( + 'img', 'big', 'small', 'object', 'applet', 'font', 'basefont' ); + $this->addElement('h1', 'Heading', 'Inline', 'Common'); + $this->addElement('h2', 'Heading', 'Inline', 'Common'); + $this->addElement('h3', 'Heading', 'Inline', 'Common'); + $this->addElement('h4', 'Heading', 'Inline', 'Common'); + $this->addElement('h5', 'Heading', 'Inline', 'Common'); + $this->addElement('h6', 'Heading', 'Inline', 'Common'); + + // Block Structural ----------------------------------------------- + $p = $this->addElement('p', 'Block', 'Inline', 'Common'); + $p->autoclose = array_flip(array("address", "blockquote", "center", "dir", "div", "dl", "fieldset", "ol", "p", "ul")); + + $this->addElement('div', 'Block', 'Flow', 'Common'); + + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php new file mode 100755 index 0000000..c9d4706 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php @@ -0,0 +1,207 @@ + 'none', 'light', 'medium', 'heavy'); + + /** + * Default level to place all fixes in. Disabled by default + */ + public $defaultLevel = null; + + /** + * Lists of fixes used by getFixesForLevel(). Format is: + * HTMLModule_Tidy->fixesForLevel[$level] = array('fix-1', 'fix-2'); + */ + public $fixesForLevel = array( + 'light' => array(), + 'medium' => array(), + 'heavy' => array() + ); + + /** + * Lazy load constructs the module by determining the necessary + * fixes to create and then delegating to the populate() function. + * @todo Wildcard matching and error reporting when an added or + * subtracted fix has no effect. + */ + public function setup($config) { + + // create fixes, initialize fixesForLevel + $fixes = $this->makeFixes(); + $this->makeFixesForLevel($fixes); + + // figure out which fixes to use + $level = $config->get('HTML', 'TidyLevel'); + $fixes_lookup = $this->getFixesForLevel($level); + + // get custom fix declarations: these need namespace processing + $add_fixes = $config->get('HTML', 'TidyAdd'); + $remove_fixes = $config->get('HTML', 'TidyRemove'); + + foreach ($fixes as $name => $fix) { + // needs to be refactored a little to implement globbing + if ( + isset($remove_fixes[$name]) || + (!isset($add_fixes[$name]) && !isset($fixes_lookup[$name])) + ) { + unset($fixes[$name]); + } + } + + // populate this module with necessary fixes + $this->populate($fixes); + + } + + /** + * Retrieves all fixes per a level, returning fixes for that specific + * level as well as all levels below it. + * @param $level String level identifier, see $levels for valid values + * @return Lookup up table of fixes + */ + public function getFixesForLevel($level) { + if ($level == $this->levels[0]) { + return array(); + } + $activated_levels = array(); + for ($i = 1, $c = count($this->levels); $i < $c; $i++) { + $activated_levels[] = $this->levels[$i]; + if ($this->levels[$i] == $level) break; + } + if ($i == $c) { + trigger_error( + 'Tidy level ' . htmlspecialchars($level) . ' not recognized', + E_USER_WARNING + ); + return array(); + } + $ret = array(); + foreach ($activated_levels as $level) { + foreach ($this->fixesForLevel[$level] as $fix) { + $ret[$fix] = true; + } + } + return $ret; + } + + /** + * Dynamically populates the $fixesForLevel member variable using + * the fixes array. It may be custom overloaded, used in conjunction + * with $defaultLevel, or not used at all. + */ + public function makeFixesForLevel($fixes) { + if (!isset($this->defaultLevel)) return; + if (!isset($this->fixesForLevel[$this->defaultLevel])) { + trigger_error( + 'Default level ' . $this->defaultLevel . ' does not exist', + E_USER_ERROR + ); + return; + } + $this->fixesForLevel[$this->defaultLevel] = array_keys($fixes); + } + + /** + * Populates the module with transforms and other special-case code + * based on a list of fixes passed to it + * @param $lookup Lookup table of fixes to activate + */ + public function populate($fixes) { + foreach ($fixes as $name => $fix) { + // determine what the fix is for + list($type, $params) = $this->getFixType($name); + switch ($type) { + case 'attr_transform_pre': + case 'attr_transform_post': + $attr = $params['attr']; + if (isset($params['element'])) { + $element = $params['element']; + if (empty($this->info[$element])) { + $e = $this->addBlankElement($element); + } else { + $e = $this->info[$element]; + } + } else { + $type = "info_$type"; + $e = $this; + } + // PHP does some weird parsing when I do + // $e->$type[$attr], so I have to assign a ref. + $f =& $e->$type; + $f[$attr] = $fix; + break; + case 'tag_transform': + $this->info_tag_transform[$params['element']] = $fix; + break; + case 'child': + case 'content_model_type': + $element = $params['element']; + if (empty($this->info[$element])) { + $e = $this->addBlankElement($element); + } else { + $e = $this->info[$element]; + } + $e->$type = $fix; + break; + default: + trigger_error("Fix type $type not supported", E_USER_ERROR); + break; + } + } + } + + /** + * Parses a fix name and determines what kind of fix it is, as well + * as other information defined by the fix + * @param $name String name of fix + * @return array(string $fix_type, array $fix_parameters) + * @note $fix_parameters is type dependant, see populate() for usage + * of these parameters + */ + public function getFixType($name) { + // parse it + $property = $attr = null; + if (strpos($name, '#') !== false) list($name, $property) = explode('#', $name); + if (strpos($name, '@') !== false) list($name, $attr) = explode('@', $name); + + // figure out the parameters + $params = array(); + if ($name !== '') $params['element'] = $name; + if (!is_null($attr)) $params['attr'] = $attr; + + // special case: attribute transform + if (!is_null($attr)) { + if (is_null($property)) $property = 'pre'; + $type = 'attr_transform_' . $property; + return array($type, $params); + } + + // special case: tag transform + if (is_null($property)) { + return array('tag_transform', $params); + } + + return array($property, $params); + + } + + /** + * Defines all fixes the module will perform in a compact + * associative array of fix name to fix implementation. + */ + public function makeFixes() {} + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php new file mode 100755 index 0000000..61ff85c --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php @@ -0,0 +1,24 @@ +content_model_type != 'strictblockquote') return parent::getChildDef($def); + return new HTMLPurifier_ChildDef_StrictBlockquote($def->content_model); + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php new file mode 100755 index 0000000..9960b1d --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php @@ -0,0 +1,9 @@ + 'text-align:left;', + 'right' => 'text-align:right;', + 'top' => 'caption-side:top;', + 'bottom' => 'caption-side:bottom;' // not supported by IE + )); + + // @align for img ------------------------------------------------- + $r['img@align'] = + new HTMLPurifier_AttrTransform_EnumToCSS('align', array( + 'left' => 'float:left;', + 'right' => 'float:right;', + 'top' => 'vertical-align:top;', + 'middle' => 'vertical-align:middle;', + 'bottom' => 'vertical-align:baseline;', + )); + + // @align for table ----------------------------------------------- + $r['table@align'] = + new HTMLPurifier_AttrTransform_EnumToCSS('align', array( + 'left' => 'float:left;', + 'center' => 'margin-left:auto;margin-right:auto;', + 'right' => 'float:right;' + )); + + // @align for hr ----------------------------------------------- + $r['hr@align'] = + new HTMLPurifier_AttrTransform_EnumToCSS('align', array( + // we use both text-align and margin because these work + // for different browsers (IE and Firefox, respectively) + // and the melange makes for a pretty cross-compatible + // solution + 'left' => 'margin-left:0;margin-right:auto;text-align:left;', + 'center' => 'margin-left:auto;margin-right:auto;text-align:center;', + 'right' => 'margin-left:auto;margin-right:0;text-align:right;' + )); + + // @align for h1, h2, h3, h4, h5, h6, p, div ---------------------- + // {{{ + $align_lookup = array(); + $align_values = array('left', 'right', 'center', 'justify'); + foreach ($align_values as $v) $align_lookup[$v] = "text-align:$v;"; + // }}} + $r['h1@align'] = + $r['h2@align'] = + $r['h3@align'] = + $r['h4@align'] = + $r['h5@align'] = + $r['h6@align'] = + $r['p@align'] = + $r['div@align'] = + new HTMLPurifier_AttrTransform_EnumToCSS('align', $align_lookup); + + // @bgcolor for table, tr, td, th --------------------------------- + $r['table@bgcolor'] = + $r['td@bgcolor'] = + $r['th@bgcolor'] = + new HTMLPurifier_AttrTransform_BgColor(); + + // @border for img ------------------------------------------------ + $r['img@border'] = new HTMLPurifier_AttrTransform_Border(); + + // @clear for br -------------------------------------------------- + $r['br@clear'] = + new HTMLPurifier_AttrTransform_EnumToCSS('clear', array( + 'left' => 'clear:left;', + 'right' => 'clear:right;', + 'all' => 'clear:both;', + 'none' => 'clear:none;', + )); + + // @height for td, th --------------------------------------------- + $r['td@height'] = + $r['th@height'] = + new HTMLPurifier_AttrTransform_Length('height'); + + // @hspace for img ------------------------------------------------ + $r['img@hspace'] = new HTMLPurifier_AttrTransform_ImgSpace('hspace'); + + // @noshade for hr ------------------------------------------------ + // this transformation is not precise but often good enough. + // different browsers use different styles to designate noshade + $r['hr@noshade'] = + new HTMLPurifier_AttrTransform_BoolToCSS( + 'noshade', + 'color:#808080;background-color:#808080;border:0;' + ); + + // @nowrap for td, th --------------------------------------------- + $r['td@nowrap'] = + $r['th@nowrap'] = + new HTMLPurifier_AttrTransform_BoolToCSS( + 'nowrap', + 'white-space:nowrap;' + ); + + // @size for hr -------------------------------------------------- + $r['hr@size'] = new HTMLPurifier_AttrTransform_Length('size', 'height'); + + // @type for li, ol, ul ------------------------------------------- + // {{{ + $ul_types = array( + 'disc' => 'list-style-type:disc;', + 'square' => 'list-style-type:square;', + 'circle' => 'list-style-type:circle;' + ); + $ol_types = array( + '1' => 'list-style-type:decimal;', + 'i' => 'list-style-type:lower-roman;', + 'I' => 'list-style-type:upper-roman;', + 'a' => 'list-style-type:lower-alpha;', + 'A' => 'list-style-type:upper-alpha;' + ); + $li_types = $ul_types + $ol_types; + // }}} + + $r['ul@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ul_types); + $r['ol@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ol_types, true); + $r['li@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $li_types, true); + + // @vspace for img ------------------------------------------------ + $r['img@vspace'] = new HTMLPurifier_AttrTransform_ImgSpace('vspace'); + + // @width for hr, td, th ------------------------------------------ + $r['td@width'] = + $r['th@width'] = + $r['hr@width'] = new HTMLPurifier_AttrTransform_Length('width'); + + return $r; + + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php new file mode 100755 index 0000000..9c0e031 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php @@ -0,0 +1,14 @@ + array( + 'xml:lang' => 'LanguageCode', + ) + ); +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php b/libs/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php new file mode 100755 index 0000000..78f3878 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php @@ -0,0 +1,403 @@ +attrTypes = new HTMLPurifier_AttrTypes(); + $this->doctypes = new HTMLPurifier_DoctypeRegistry(); + + // setup basic modules + $common = array( + 'CommonAttributes', 'Text', 'Hypertext', 'List', + 'Presentation', 'Edit', 'Bdo', 'Tables', 'Image', + 'StyleAttribute', + // Unsafe: + 'Scripting', 'Object', 'Forms', + // Sorta legacy, but present in strict: + 'Name', + ); + $transitional = array('Legacy', 'Target'); + $xml = array('XMLCommonAttributes'); + $non_xml = array('NonXMLCommonAttributes'); + + // setup basic doctypes + $this->doctypes->register( + 'HTML 4.01 Transitional', false, + array_merge($common, $transitional, $non_xml), + array('Tidy_Transitional', 'Tidy_Proprietary'), + array(), + '-//W3C//DTD HTML 4.01 Transitional//EN', + 'http://www.w3.org/TR/html4/loose.dtd' + ); + + $this->doctypes->register( + 'HTML 4.01 Strict', false, + array_merge($common, $non_xml), + array('Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'), + array(), + '-//W3C//DTD HTML 4.01//EN', + 'http://www.w3.org/TR/html4/strict.dtd' + ); + + $this->doctypes->register( + 'XHTML 1.0 Transitional', true, + array_merge($common, $transitional, $xml, $non_xml), + array('Tidy_Transitional', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Name'), + array(), + '-//W3C//DTD XHTML 1.0 Transitional//EN', + 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' + ); + + $this->doctypes->register( + 'XHTML 1.0 Strict', true, + array_merge($common, $xml, $non_xml), + array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'), + array(), + '-//W3C//DTD XHTML 1.0 Strict//EN', + 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' + ); + + $this->doctypes->register( + 'XHTML 1.1', true, + array_merge($common, $xml, array('Ruby')), + array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Strict', 'Tidy_Name'), // Tidy_XHTML1_1 + array(), + '-//W3C//DTD XHTML 1.1//EN', + 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd' + ); + + } + + /** + * Registers a module to the recognized module list, useful for + * overloading pre-existing modules. + * @param $module Mixed: string module name, with or without + * HTMLPurifier_HTMLModule prefix, or instance of + * subclass of HTMLPurifier_HTMLModule. + * @param $overload Boolean whether or not to overload previous modules. + * If this is not set, and you do overload a module, + * HTML Purifier will complain with a warning. + * @note This function will not call autoload, you must instantiate + * (and thus invoke) autoload outside the method. + * @note If a string is passed as a module name, different variants + * will be tested in this order: + * - Check for HTMLPurifier_HTMLModule_$name + * - Check all prefixes with $name in order they were added + * - Check for literal object name + * - Throw fatal error + * If your object name collides with an internal class, specify + * your module manually. All modules must have been included + * externally: registerModule will not perform inclusions for you! + */ + public function registerModule($module, $overload = false) { + if (is_string($module)) { + // attempt to load the module + $original_module = $module; + $ok = false; + foreach ($this->prefixes as $prefix) { + $module = $prefix . $original_module; + if (class_exists($module)) { + $ok = true; + break; + } + } + if (!$ok) { + $module = $original_module; + if (!class_exists($module)) { + trigger_error($original_module . ' module does not exist', + E_USER_ERROR); + return; + } + } + $module = new $module(); + } + if (empty($module->name)) { + trigger_error('Module instance of ' . get_class($module) . ' must have name'); + return; + } + if (!$overload && isset($this->registeredModules[$module->name])) { + trigger_error('Overloading ' . $module->name . ' without explicit overload parameter', E_USER_WARNING); + } + $this->registeredModules[$module->name] = $module; + } + + /** + * Adds a module to the current doctype by first registering it, + * and then tacking it on to the active doctype + */ + public function addModule($module) { + $this->registerModule($module); + if (is_object($module)) $module = $module->name; + $this->userModules[] = $module; + } + + /** + * Adds a class prefix that registerModule() will use to resolve a + * string name to a concrete class + */ + public function addPrefix($prefix) { + $this->prefixes[] = $prefix; + } + + /** + * Performs processing on modules, after being called you may + * use getElement() and getElements() + * @param $config Instance of HTMLPurifier_Config + */ + public function setup($config) { + + $this->trusted = $config->get('HTML', 'Trusted'); + + // generate + $this->doctype = $this->doctypes->make($config); + $modules = $this->doctype->modules; + + // take out the default modules that aren't allowed + $lookup = $config->get('HTML', 'AllowedModules'); + $special_cases = $config->get('HTML', 'CoreModules'); + + if (is_array($lookup)) { + foreach ($modules as $k => $m) { + if (isset($special_cases[$m])) continue; + if (!isset($lookup[$m])) unset($modules[$k]); + } + } + + // add proprietary module (this gets special treatment because + // it is completely removed from doctypes, etc.) + if ($config->get('HTML', 'Proprietary')) { + $modules[] = 'Proprietary'; + } + + // add SafeObject/Safeembed modules + if ($config->get('HTML', 'SafeObject')) { + $modules[] = 'SafeObject'; + } + if ($config->get('HTML', 'SafeEmbed')) { + $modules[] = 'SafeEmbed'; + } + + // merge in custom modules + $modules = array_merge($modules, $this->userModules); + + foreach ($modules as $module) { + $this->processModule($module); + $this->modules[$module]->setup($config); + } + + foreach ($this->doctype->tidyModules as $module) { + $this->processModule($module); + $this->modules[$module]->setup($config); + } + + // prepare any injectors + foreach ($this->modules as $module) { + $n = array(); + foreach ($module->info_injector as $i => $injector) { + if (!is_object($injector)) { + $class = "HTMLPurifier_Injector_$injector"; + $injector = new $class; + } + $n[$injector->name] = $injector; + } + $module->info_injector = $n; + } + + // setup lookup table based on all valid modules + foreach ($this->modules as $module) { + foreach ($module->info as $name => $def) { + if (!isset($this->elementLookup[$name])) { + $this->elementLookup[$name] = array(); + } + $this->elementLookup[$name][] = $module->name; + } + } + + // note the different choice + $this->contentSets = new HTMLPurifier_ContentSets( + // content set assembly deals with all possible modules, + // not just ones deemed to be "safe" + $this->modules + ); + $this->attrCollections = new HTMLPurifier_AttrCollections( + $this->attrTypes, + // there is no way to directly disable a global attribute, + // but using AllowedAttributes or simply not including + // the module in your custom doctype should be sufficient + $this->modules + ); + } + + /** + * Takes a module and adds it to the active module collection, + * registering it if necessary. + */ + public function processModule($module) { + if (!isset($this->registeredModules[$module]) || is_object($module)) { + $this->registerModule($module); + } + $this->modules[$module] = $this->registeredModules[$module]; + } + + /** + * Retrieves merged element definitions. + * @return Array of HTMLPurifier_ElementDef + */ + public function getElements() { + + $elements = array(); + foreach ($this->modules as $module) { + if (!$this->trusted && !$module->safe) continue; + foreach ($module->info as $name => $v) { + if (isset($elements[$name])) continue; + $elements[$name] = $this->getElement($name); + } + } + + // remove dud elements, this happens when an element that + // appeared to be safe actually wasn't + foreach ($elements as $n => $v) { + if ($v === false) unset($elements[$n]); + } + + return $elements; + + } + + /** + * Retrieves a single merged element definition + * @param $name Name of element + * @param $trusted Boolean trusted overriding parameter: set to true + * if you want the full version of an element + * @return Merged HTMLPurifier_ElementDef + * @note You may notice that modules are getting iterated over twice (once + * in getElements() and once here). This + * is because + */ + public function getElement($name, $trusted = null) { + + if (!isset($this->elementLookup[$name])) { + return false; + } + + // setup global state variables + $def = false; + if ($trusted === null) $trusted = $this->trusted; + + // iterate through each module that has registered itself to this + // element + foreach($this->elementLookup[$name] as $module_name) { + + $module = $this->modules[$module_name]; + + // refuse to create/merge from a module that is deemed unsafe-- + // pretend the module doesn't exist--when trusted mode is not on. + if (!$trusted && !$module->safe) { + continue; + } + + // clone is used because, ideally speaking, the original + // definition should not be modified. Usually, this will + // make no difference, but for consistency's sake + $new_def = clone $module->info[$name]; + + if (!$def && $new_def->standalone) { + $def = $new_def; + } elseif ($def) { + // This will occur even if $new_def is standalone. In practice, + // this will usually result in a full replacement. + $def->mergeIn($new_def); + } else { + // :TODO: + // non-standalone definitions that don't have a standalone + // to merge into could be deferred to the end + continue; + } + + // attribute value expansions + $this->attrCollections->performInclusions($def->attr); + $this->attrCollections->expandIdentifiers($def->attr, $this->attrTypes); + + // descendants_are_inline, for ChildDef_Chameleon + if (is_string($def->content_model) && + strpos($def->content_model, 'Inline') !== false) { + if ($name != 'del' && $name != 'ins') { + // this is for you, ins/del + $def->descendants_are_inline = true; + } + } + + $this->contentSets->generateChildDef($def, $module); + } + + // This can occur if there is a blank definition, but no base to + // mix it in with + if (!$def) return false; + + // add information on required attributes + foreach ($def->attr as $attr_name => $attr_def) { + if ($attr_def->required) { + $def->required_attr[] = $attr_name; + } + } + + return $def; + + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/IDAccumulator.php b/libs/htmlpurifier/library/HTMLPurifier/IDAccumulator.php new file mode 100755 index 0000000..d546cd7 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/IDAccumulator.php @@ -0,0 +1,53 @@ +load($config->get('Attr', 'IDBlacklist')); + return $id_accumulator; + } + + /** + * Add an ID to the lookup table. + * @param $id ID to be added. + * @return Bool status, true if success, false if there's a dupe + */ + public function add($id) { + if (isset($this->ids[$id])) return false; + return $this->ids[$id] = true; + } + + /** + * Load a list of IDs into the lookup table + * @param $array_of_ids Array of IDs to load + * @note This function doesn't care about duplicates + */ + public function load($array_of_ids) { + foreach ($array_of_ids as $id) { + $this->ids[$id] = true; + } + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector.php b/libs/htmlpurifier/library/HTMLPurifier/Injector.php new file mode 100755 index 0000000..bc093b8 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Injector.php @@ -0,0 +1,233 @@ +processToken() + * documentation. + * + * @todo Allow injectors to request a re-run on their output. This + * would help if an operation is recursive. + */ +abstract class HTMLPurifier_Injector +{ + + /** + * Advisory name of injector, this is for friendly error messages + */ + public $name; + + /** + * Instance of HTMLPurifier_HTMLDefinition + */ + protected $htmlDefinition; + + /** + * Reference to CurrentNesting variable in Context. This is an array + * list of tokens that we are currently "inside" + */ + protected $currentNesting; + + /** + * Reference to InputTokens variable in Context. This is an array + * list of the input tokens that are being processed. + */ + protected $inputTokens; + + /** + * Reference to InputIndex variable in Context. This is an integer + * array index for $this->inputTokens that indicates what token + * is currently being processed. + */ + protected $inputIndex; + + /** + * Array of elements and attributes this injector creates and therefore + * need to be allowed by the definition. Takes form of + * array('element' => array('attr', 'attr2'), 'element2') + */ + public $needed = array(); + + /** + * Index of inputTokens to rewind to. + */ + protected $rewind = false; + + /** + * Rewind to a spot to re-perform processing. This is useful if you + * deleted a node, and now need to see if this change affected any + * earlier nodes. Rewinding does not affect other injectors, and can + * result in infinite loops if not used carefully. + * @warning HTML Purifier will prevent you from fast-forwarding with this + * function. + */ + public function rewind($index) { + $this->rewind = $index; + } + + /** + * Retrieves rewind, and then unsets it. + */ + public function getRewind() { + $r = $this->rewind; + $this->rewind = false; + return $r; + } + + /** + * Prepares the injector by giving it the config and context objects: + * this allows references to important variables to be made within + * the injector. This function also checks if the HTML environment + * will work with the Injector (see checkNeeded()). + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + * @return Boolean false if success, string of missing needed element/attribute if failure + */ + public function prepare($config, $context) { + $this->htmlDefinition = $config->getHTMLDefinition(); + // Even though this might fail, some unit tests ignore this and + // still test checkNeeded, so be careful. Maybe get rid of that + // dependency. + $result = $this->checkNeeded($config); + if ($result !== false) return $result; + $this->currentNesting =& $context->get('CurrentNesting'); + $this->inputTokens =& $context->get('InputTokens'); + $this->inputIndex =& $context->get('InputIndex'); + return false; + } + + /** + * This function checks if the HTML environment + * will work with the Injector: if p tags are not allowed, the + * Auto-Paragraphing injector should not be enabled. + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + * @return Boolean false if success, string of missing needed element/attribute if failure + */ + public function checkNeeded($config) { + $def = $config->getHTMLDefinition(); + foreach ($this->needed as $element => $attributes) { + if (is_int($element)) $element = $attributes; + if (!isset($def->info[$element])) return $element; + if (!is_array($attributes)) continue; + foreach ($attributes as $name) { + if (!isset($def->info[$element]->attr[$name])) return "$element.$name"; + } + } + return false; + } + + /** + * Tests if the context node allows a certain element + * @param $name Name of element to test for + * @return True if element is allowed, false if it is not + */ + public function allowsElement($name) { + if (!empty($this->currentNesting)) { + $parent_token = array_pop($this->currentNesting); + $this->currentNesting[] = $parent_token; + $parent = $this->htmlDefinition->info[$parent_token->name]; + } else { + $parent = $this->htmlDefinition->info_parent_def; + } + if (!isset($parent->child->elements[$name]) || isset($parent->excludes[$name])) { + return false; + } + return true; + } + + /** + * Iterator function, which starts with the next token and continues until + * you reach the end of the input tokens. + * @warning Please prevent previous references from interfering with this + * functions by setting $i = null beforehand! + * @param &$i Current integer index variable for inputTokens + * @param &$current Current token variable. Do NOT use $token, as that variable is also a reference + */ + protected function forward(&$i, &$current) { + if ($i === null) $i = $this->inputIndex + 1; + else $i++; + if (!isset($this->inputTokens[$i])) return false; + $current = $this->inputTokens[$i]; + return true; + } + + /** + * Similar to _forward, but accepts a third parameter $nesting (which + * should be initialized at 0) and stops when we hit the end tag + * for the node $this->inputIndex starts in. + */ + protected function forwardUntilEndToken(&$i, &$current, &$nesting) { + $result = $this->forward($i, $current); + if (!$result) return false; + if ($nesting === null) $nesting = 0; + if ($current instanceof HTMLPurifier_Token_Start) $nesting++; + elseif ($current instanceof HTMLPurifier_Token_End) { + if ($nesting <= 0) return false; + $nesting--; + } + return true; + } + + /** + * Iterator function, starts with the previous token and continues until + * you reach the beginning of input tokens. + * @warning Please prevent previous references from interfering with this + * functions by setting $i = null beforehand! + * @param &$i Current integer index variable for inputTokens + * @param &$current Current token variable. Do NOT use $token, as that variable is also a reference + */ + protected function backward(&$i, &$current) { + if ($i === null) $i = $this->inputIndex - 1; + else $i--; + if ($i < 0) return false; + $current = $this->inputTokens[$i]; + return true; + } + + /** + * Initializes the iterator at the current position. Use in a do {} while; + * loop to force the _forward and _backward functions to start at the + * current location. + * @warning Please prevent previous references from interfering with this + * functions by setting $i = null beforehand! + * @param &$i Current integer index variable for inputTokens + * @param &$current Current token variable. Do NOT use $token, as that variable is also a reference + */ + protected function current(&$i, &$current) { + if ($i === null) $i = $this->inputIndex; + $current = $this->inputTokens[$i]; + } + + /** + * Handler that is called when a text token is processed + */ + public function handleText(&$token) {} + + /** + * Handler that is called when a start or empty token is processed + */ + public function handleElement(&$token) {} + + /** + * Handler that is called when an end token is processed + */ + public function handleEnd(&$token) { + $this->notifyEnd($token); + } + + /** + * Notifier that is called when an end token is processed + * @note This differs from handlers in that the token is read-only + * @deprecated + */ + public function notifyEnd($token) {} + + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php b/libs/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php new file mode 100755 index 0000000..8cc9525 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php @@ -0,0 +1,340 @@ +armor['MakeWellFormed_TagClosedError'] = true; + return $par; + } + + public function handleText(&$token) { + $text = $token->data; + // Does the current parent allow

    tags? + if ($this->allowsElement('p')) { + if (empty($this->currentNesting) || strpos($text, "\n\n") !== false) { + // Note that we have differing behavior when dealing with text + // in the anonymous root node, or a node inside the document. + // If the text as a double-newline, the treatment is the same; + // if it doesn't, see the next if-block if you're in the document. + + $i = $nesting = null; + if (!$this->forwardUntilEndToken($i, $current, $nesting) && $token->is_whitespace) { + // State 1.1: ... ^ (whitespace, then document end) + // ---- + // This is a degenerate case + } else { + // State 1.2: PAR1 + // ---- + + // State 1.3: PAR1\n\nPAR2 + // ------------ + + // State 1.4:

    PAR1\n\nPAR2 (see State 2) + // ------------ + $token = array($this->_pStart()); + $this->_splitText($text, $token); + } + } else { + // State 2:
    PAR1... (similar to 1.4) + // ---- + + // We're in an element that allows paragraph tags, but we're not + // sure if we're going to need them. + if ($this->_pLookAhead()) { + // State 2.1:
    PAR1PAR1\n\nPAR2 + // ---- + // Note: This will always be the first child, since any + // previous inline element would have triggered this very + // same routine, and found the double newline. One possible + // exception would be a comment. + $token = array($this->_pStart(), $token); + } else { + // State 2.2.1:
    PAR1
    + // ---- + + // State 2.2.2:
    PAR1PAR1
    + // ---- + } + } + // Is the current parent a

    tag? + } elseif ( + !empty($this->currentNesting) && + $this->currentNesting[count($this->currentNesting)-1]->name == 'p' + ) { + // State 3.1: ...

    PAR1 + // ---- + + // State 3.2: ...

    PAR1\n\nPAR2 + // ------------ + $token = array(); + $this->_splitText($text, $token); + // Abort! + } else { + // State 4.1: ...PAR1 + // ---- + + // State 4.2: ...PAR1\n\nPAR2 + // ------------ + } + } + + public function handleElement(&$token) { + // We don't have to check if we're already in a

    tag for block + // tokens, because the tag would have been autoclosed by MakeWellFormed. + if ($this->allowsElement('p')) { + if (!empty($this->currentNesting)) { + if ($this->_isInline($token)) { + // State 1:

    ... + // --- + + // Check if this token is adjacent to the parent token + // (seek backwards until token isn't whitespace) + $i = null; + $this->backward($i, $prev); + + if (!$prev instanceof HTMLPurifier_Token_Start) { + // Token wasn't adjacent + + if ( + $prev instanceof HTMLPurifier_Token_Text && + substr($prev->data, -2) === "\n\n" + ) { + // State 1.1.4:

    PAR1

    \n\n + // --- + + // Quite frankly, this should be handled by splitText + $token = array($this->_pStart(), $token); + } else { + // State 1.1.1:

    PAR1

    + // --- + + // State 1.1.2:

    + // --- + + // State 1.1.3:
    PAR + // --- + } + + } else { + // State 1.2.1:
    + // --- + + // Lookahead to see if

    is needed. + if ($this->_pLookAhead()) { + // State 1.3.1:

    PAR1\n\nPAR2 + // --- + $token = array($this->_pStart(), $token); + } else { + // State 1.3.2:
    PAR1
    + // --- + + // State 1.3.3:
    PAR1
    \n\n
    + // --- + } + } + } else { + // State 2.3: ...
    + // ----- + } + } else { + if ($this->_isInline($token)) { + // State 3.1: + // --- + // This is where the {p} tag is inserted, not reflected in + // inputTokens yet, however. + $token = array($this->_pStart(), $token); + } else { + // State 3.2:
    + // ----- + } + + $i = null; + if ($this->backward($i, $prev)) { + if ( + !$prev instanceof HTMLPurifier_Token_Text + ) { + // State 3.1.1: ...

    {p} + // --- + + // State 3.2.1: ...

    + // ----- + + if (!is_array($token)) $token = array($token); + array_unshift($token, new HTMLPurifier_Token_Text("\n\n")); + } else { + // State 3.1.2: ...

    \n\n{p} + // --- + + // State 3.2.2: ...

    \n\n
    + // ----- + + // Note: PAR cannot occur because PAR would have been + // wrapped in

    tags. + } + } + } + } else { + // State 2.2:

    • + // ---- + + // State 2.4:

      + // --- + } + } + + /** + * Splits up a text in paragraph tokens and appends them + * to the result stream that will replace the original + * @param $data String text data that will be processed + * into paragraphs + * @param $result Reference to array of tokens that the + * tags will be appended onto + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + */ + private function _splitText($data, &$result) { + $raw_paragraphs = explode("\n\n", $data); + $paragraphs = array(); // without empty paragraphs + $needs_start = false; + $needs_end = false; + + $c = count($raw_paragraphs); + if ($c == 1) { + // There were no double-newlines, abort quickly. In theory this + // should never happen. + $result[] = new HTMLPurifier_Token_Text($data); + return; + } + for ($i = 0; $i < $c; $i++) { + $par = $raw_paragraphs[$i]; + if (trim($par) !== '') { + $paragraphs[] = $par; + } else { + if ($i == 0) { + // Double newline at the front + if (empty($result)) { + // The empty result indicates that the AutoParagraph + // injector did not add any start paragraph tokens. + // This means that we have been in a paragraph for + // a while, and the newline means we should start a new one. + $result[] = new HTMLPurifier_Token_End('p'); + $result[] = new HTMLPurifier_Token_Text("\n\n"); + // However, the start token should only be added if + // there is more processing to be done (i.e. there are + // real paragraphs in here). If there are none, the + // next start paragraph tag will be handled by the + // next call to the injector + $needs_start = true; + } else { + // We just started a new paragraph! + // Reinstate a double-newline for presentation's sake, since + // it was in the source code. + array_unshift($result, new HTMLPurifier_Token_Text("\n\n")); + } + } elseif ($i + 1 == $c) { + // Double newline at the end + // There should be a trailing

      when we're finally done. + $needs_end = true; + } + } + } + + // Check if this was just a giant blob of whitespace. Move this earlier, + // perhaps? + if (empty($paragraphs)) { + return; + } + + // Add the start tag indicated by \n\n at the beginning of $data + if ($needs_start) { + $result[] = $this->_pStart(); + } + + // Append the paragraphs onto the result + foreach ($paragraphs as $par) { + $result[] = new HTMLPurifier_Token_Text($par); + $result[] = new HTMLPurifier_Token_End('p'); + $result[] = new HTMLPurifier_Token_Text("\n\n"); + $result[] = $this->_pStart(); + } + + // Remove trailing start token; Injector will handle this later if + // it was indeed needed. This prevents from needing to do a lookahead, + // at the cost of a lookbehind later. + array_pop($result); + + // If there is no need for an end tag, remove all of it and let + // MakeWellFormed close it later. + if (!$needs_end) { + array_pop($result); // removes \n\n + array_pop($result); // removes

      + } + + } + + /** + * Returns true if passed token is inline (and, ergo, allowed in + * paragraph tags) + */ + private function _isInline($token) { + return isset($this->htmlDefinition->info['p']->child->elements[$token->name]); + } + + /** + * Looks ahead in the token list and determines whether or not we need + * to insert a

      tag. + */ + private function _pLookAhead() { + $this->current($i, $current); + if ($current instanceof HTMLPurifier_Token_Start) $nesting = 1; + else $nesting = 0; + $ok = false; + while ($this->forwardUntilEndToken($i, $current, $nesting)) { + $result = $this->_checkNeedsP($current); + if ($result !== null) { + $ok = $result; + break; + } + } + return $ok; + } + + /** + * Determines if a particular token requires an earlier inline token + * to get a paragraph. This should be used with _forwardUntilEndToken + */ + private function _checkNeedsP($current) { + if ($current instanceof HTMLPurifier_Token_Start){ + if (!$this->_isInline($current)) { + //

      PAR1
      + // ---- + // Terminate early, since we hit a block element + return false; + } + } elseif ($current instanceof HTMLPurifier_Token_Text) { + if (strpos($current->data, "\n\n") !== false) { + //
      PAR1PAR1\n\nPAR2 + // ---- + return true; + } else { + //
      PAR1PAR1... + // ---- + } + } + return null; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php b/libs/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php new file mode 100755 index 0000000..9dce9bd --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php @@ -0,0 +1,26 @@ +start->attr['href'])){ + $url = $token->start->attr['href']; + unset($token->start->attr['href']); + $token = array($token, new HTMLPurifier_Token_Text(" ($url)")); + } else { + // nothing to display + } + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php b/libs/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php new file mode 100755 index 0000000..296dac2 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php @@ -0,0 +1,46 @@ + array('href')); + + public function handleText(&$token) { + if (!$this->allowsElement('a')) return; + + if (strpos($token->data, '://') === false) { + // our really quick heuristic failed, abort + // this may not work so well if we want to match things like + // "google.com", but then again, most people don't + return; + } + + // there is/are URL(s). Let's split the string: + // Note: this regex is extremely permissive + $bits = preg_split('#((?:https?|ftp)://[^\s\'"<>()]+)#S', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); + + $token = array(); + + // $i = index + // $c = count + // $l = is link + for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) { + if (!$l) { + if ($bits[$i] === '') continue; + $token[] = new HTMLPurifier_Token_Text($bits[$i]); + } else { + $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i])); + $token[] = new HTMLPurifier_Token_Text($bits[$i]); + $token[] = new HTMLPurifier_Token_End('a'); + } + } + + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php b/libs/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php new file mode 100755 index 0000000..3c706a3 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php @@ -0,0 +1,45 @@ + array('href')); + + public function prepare($config, $context) { + $this->docURL = $config->get('AutoFormatParam', 'PurifierLinkifyDocURL'); + return parent::prepare($config, $context); + } + + public function handleText(&$token) { + if (!$this->allowsElement('a')) return; + if (strpos($token->data, '%') === false) return; + + $bits = preg_split('#%([a-z0-9]+\.[a-z0-9]+)#Si', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); + $token = array(); + + // $i = index + // $c = count + // $l = is link + for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) { + if (!$l) { + if ($bits[$i] === '') continue; + $token[] = new HTMLPurifier_Token_Text($bits[$i]); + } else { + $token[] = new HTMLPurifier_Token_Start('a', + array('href' => str_replace('%s', $bits[$i], $this->docURL))); + $token[] = new HTMLPurifier_Token_Text('%' . $bits[$i]); + $token[] = new HTMLPurifier_Token_End('a'); + } + } + + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php b/libs/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php new file mode 100755 index 0000000..d85ca97 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php @@ -0,0 +1,42 @@ +config = $config; + $this->context = $context; + $this->attrValidator = new HTMLPurifier_AttrValidator(); + } + + public function handleElement(&$token) { + if (!$token instanceof HTMLPurifier_Token_Start) return; + $next = false; + for ($i = $this->inputIndex + 1, $c = count($this->inputTokens); $i < $c; $i++) { + $next = $this->inputTokens[$i]; + if ($next instanceof HTMLPurifier_Token_Text && $next->is_whitespace) continue; + break; + } + if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) { + if ($token->name == 'colgroup') return; + $this->attrValidator->validateToken($token, $this->config, $this->context); + $token->armor['ValidateAttributes'] = true; + if (isset($token->attr['id']) || isset($token->attr['name'])) return; + $token = $i - $this->inputIndex + 1; + for ($b = $this->inputIndex - 1; $b > 0; $b--) { + $prev = $this->inputTokens[$b]; + if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) continue; + break; + } + // This is safe because we removed the token that triggered this. + $this->rewind($b - 1); + return; + } + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php b/libs/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php new file mode 100755 index 0000000..3415828 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php @@ -0,0 +1,87 @@ + 'never', + 'allowNetworking' => 'internal', + ); + protected $allowedParam = array( + 'wmode' => true, + 'movie' => true, + ); + + public function prepare($config, $context) { + parent::prepare($config, $context); + } + + public function handleElement(&$token) { + if ($token->name == 'object') { + $this->objectStack[] = $token; + $this->paramStack[] = array(); + $new = array($token); + foreach ($this->addParam as $name => $value) { + $new[] = new HTMLPurifier_Token_Empty('param', array('name' => $name, 'value' => $value)); + } + $token = $new; + } elseif ($token->name == 'param') { + $nest = count($this->currentNesting) - 1; + if ($nest >= 0 && $this->currentNesting[$nest]->name === 'object') { + $i = count($this->objectStack) - 1; + if (!isset($token->attr['name'])) { + $token = false; + return; + } + $n = $token->attr['name']; + // We need this fix because YouTube doesn't supply a data + // attribute, which we need if a type is specified. This is + // *very* Flash specific. + if (!isset($this->objectStack[$i]->attr['data']) && $token->attr['name'] == 'movie') { + $this->objectStack[$i]->attr['data'] = $token->attr['value']; + } + // Check if the parameter is the correct value but has not + // already been added + if ( + !isset($this->paramStack[$i][$n]) && + isset($this->addParam[$n]) && + $token->attr['name'] === $this->addParam[$n] + ) { + // keep token, and add to param stack + $this->paramStack[$i][$n] = true; + } elseif (isset($this->allowedParam[$n])) { + // keep token, don't do anything to it + // (could possibly check for duplicates here) + } else { + $token = false; + } + } else { + // not directly inside an object, DENY! + $token = false; + } + } + } + + public function handleEnd(&$token) { + // This is the WRONG way of handling the object and param stacks; + // we should be inserting them directly on the relevant object tokens + // so that the global stack handling handles it. + if ($token->name == 'object') { + array_pop($this->objectStack); + array_pop($this->paramStack); + } + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Language.php b/libs/htmlpurifier/library/HTMLPurifier/Language.php new file mode 100755 index 0000000..3e2be03 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Language.php @@ -0,0 +1,163 @@ +config = $config; + $this->context = $context; + } + + /** + * Loads language object with necessary info from factory cache + * @note This is a lazy loader + */ + public function load() { + if ($this->_loaded) return; + $factory = HTMLPurifier_LanguageFactory::instance(); + $factory->loadLanguage($this->code); + foreach ($factory->keys as $key) { + $this->$key = $factory->cache[$this->code][$key]; + } + $this->_loaded = true; + } + + /** + * Retrieves a localised message. + * @param $key string identifier of message + * @return string localised message + */ + public function getMessage($key) { + if (!$this->_loaded) $this->load(); + if (!isset($this->messages[$key])) return "[$key]"; + return $this->messages[$key]; + } + + /** + * Retrieves a localised error name. + * @param $int integer error number, corresponding to PHP's error + * reporting + * @return string localised message + */ + public function getErrorName($int) { + if (!$this->_loaded) $this->load(); + if (!isset($this->errorNames[$int])) return "[Error: $int]"; + return $this->errorNames[$int]; + } + + /** + * Converts an array list into a string readable representation + */ + public function listify($array) { + $sep = $this->getMessage('Item separator'); + $sep_last = $this->getMessage('Item separator last'); + $ret = ''; + for ($i = 0, $c = count($array); $i < $c; $i++) { + if ($i == 0) { + } elseif ($i + 1 < $c) { + $ret .= $sep; + } else { + $ret .= $sep_last; + } + $ret .= $array[$i]; + } + return $ret; + } + + /** + * Formats a localised message with passed parameters + * @param $key string identifier of message + * @param $args Parameters to substitute in + * @return string localised message + * @todo Implement conditionals? Right now, some messages make + * reference to line numbers, but those aren't always available + */ + public function formatMessage($key, $args = array()) { + if (!$this->_loaded) $this->load(); + if (!isset($this->messages[$key])) return "[$key]"; + $raw = $this->messages[$key]; + $subst = array(); + $generator = false; + foreach ($args as $i => $value) { + if (is_object($value)) { + if ($value instanceof HTMLPurifier_Token) { + // factor this out some time + if (!$generator) $generator = $this->context->get('Generator'); + if (isset($value->name)) $subst['$'.$i.'.Name'] = $value->name; + if (isset($value->data)) $subst['$'.$i.'.Data'] = $value->data; + $subst['$'.$i.'.Compact'] = + $subst['$'.$i.'.Serialized'] = $generator->generateFromToken($value); + // a more complex algorithm for compact representation + // could be introduced for all types of tokens. This + // may need to be factored out into a dedicated class + if (!empty($value->attr)) { + $stripped_token = clone $value; + $stripped_token->attr = array(); + $subst['$'.$i.'.Compact'] = $generator->generateFromToken($stripped_token); + } + $subst['$'.$i.'.Line'] = $value->line ? $value->line : 'unknown'; + } + continue; + } elseif (is_array($value)) { + $keys = array_keys($value); + if (array_keys($keys) === $keys) { + // list + $subst['$'.$i] = $this->listify($value); + } else { + // associative array + // no $i implementation yet, sorry + $subst['$'.$i.'.Keys'] = $this->listify($keys); + $subst['$'.$i.'.Values'] = $this->listify(array_values($value)); + } + continue; + } + $subst['$' . $i] = $value; + } + return strtr($raw, $subst); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php b/libs/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php new file mode 100755 index 0000000..d52fcb7 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php @@ -0,0 +1,12 @@ + 'HTML Purifier X' +); + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php b/libs/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php new file mode 100755 index 0000000..806c83f --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php @@ -0,0 +1,12 @@ + 'HTML Purifier XNone' +); + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Language/messages/en.php b/libs/htmlpurifier/library/HTMLPurifier/Language/messages/en.php new file mode 100755 index 0000000..aab2e52 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Language/messages/en.php @@ -0,0 +1,62 @@ + 'HTML Purifier', + +// for unit testing purposes +'LanguageFactoryTest: Pizza' => 'Pizza', +'LanguageTest: List' => '$1', +'LanguageTest: Hash' => '$1.Keys; $1.Values', + +'Item separator' => ', ', +'Item separator last' => ' and ', // non-Harvard style + +'ErrorCollector: No errors' => 'No errors detected. However, because error reporting is still incomplete, there may have been errors that the error collector was not notified of; please inspect the output HTML carefully.', +'ErrorCollector: At line' => ' at line $line', +'ErrorCollector: Incidental errors' => 'Incidental errors', + +'Lexer: Unclosed comment' => 'Unclosed comment', +'Lexer: Unescaped lt' => 'Unescaped less-than sign (<) should be <', +'Lexer: Missing gt' => 'Missing greater-than sign (>), previous less-than sign (<) should be escaped', +'Lexer: Missing attribute key' => 'Attribute declaration has no key', +'Lexer: Missing end quote' => 'Attribute declaration has no end quote', + +'Strategy_RemoveForeignElements: Tag transform' => '<$1> element transformed into $CurrentToken.Serialized', +'Strategy_RemoveForeignElements: Missing required attribute' => '$CurrentToken.Compact element missing required attribute $1', +'Strategy_RemoveForeignElements: Foreign element to text' => 'Unrecognized $CurrentToken.Serialized tag converted to text', +'Strategy_RemoveForeignElements: Foreign element removed' => 'Unrecognized $CurrentToken.Serialized tag removed', +'Strategy_RemoveForeignElements: Comment removed' => 'Comment containing "$CurrentToken.Data" removed', +'Strategy_RemoveForeignElements: Foreign meta element removed' => 'Unrecognized $CurrentToken.Serialized meta tag and all descendants removed', +'Strategy_RemoveForeignElements: Token removed to end' => 'Tags and text starting from $1 element where removed to end', +'Strategy_RemoveForeignElements: Trailing hyphen in comment removed' => 'Trailing hyphen(s) in comment removed', +'Strategy_RemoveForeignElements: Hyphens in comment collapsed' => 'Double hyphens in comments are not allowed, and were collapsed into single hyphens', + +'Strategy_MakeWellFormed: Unnecessary end tag removed' => 'Unnecessary $CurrentToken.Serialized tag removed', +'Strategy_MakeWellFormed: Unnecessary end tag to text' => 'Unnecessary $CurrentToken.Serialized tag converted to text', +'Strategy_MakeWellFormed: Tag auto closed' => '$1.Compact started on line $1.Line auto-closed by $CurrentToken.Compact', +'Strategy_MakeWellFormed: Tag carryover' => '$1.Compact started on line $1.Line auto-continued into $CurrentToken.Compact', +'Strategy_MakeWellFormed: Stray end tag removed' => 'Stray $CurrentToken.Serialized tag removed', +'Strategy_MakeWellFormed: Stray end tag to text' => 'Stray $CurrentToken.Serialized tag converted to text', +'Strategy_MakeWellFormed: Tag closed by element end' => '$1.Compact tag started on line $1.Line closed by end of $CurrentToken.Serialized', +'Strategy_MakeWellFormed: Tag closed by document end' => '$1.Compact tag started on line $1.Line closed by end of document', + +'Strategy_FixNesting: Node removed' => '$CurrentToken.Compact node removed', +'Strategy_FixNesting: Node excluded' => '$CurrentToken.Compact node removed due to descendant exclusion by ancestor element', +'Strategy_FixNesting: Node reorganized' => 'Contents of $CurrentToken.Compact node reorganized to enforce its content model', +'Strategy_FixNesting: Node contents removed' => 'Contents of $CurrentToken.Compact node removed', + +'AttrValidator: Attributes transformed' => 'Attributes on $CurrentToken.Compact transformed from $1.Keys to $2.Keys', +'AttrValidator: Attribute removed' => '$CurrentAttr.Name attribute on $CurrentToken.Compact removed', + +); + +$errorNames = array( + E_ERROR => 'Error', + E_WARNING => 'Warning', + E_NOTICE => 'Notice' +); + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/LanguageFactory.php b/libs/htmlpurifier/library/HTMLPurifier/LanguageFactory.php new file mode 100755 index 0000000..baa4422 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/LanguageFactory.php @@ -0,0 +1,198 @@ +cache[$language_code][$key] = $value + * @value array map + */ + public $cache; + + /** + * Valid keys in the HTMLPurifier_Language object. Designates which + * variables to slurp out of a message file. + * @value array list + */ + public $keys = array('fallback', 'messages', 'errorNames'); + + /** + * Instance of HTMLPurifier_AttrDef_Lang to validate language codes + * @value object HTMLPurifier_AttrDef_Lang + */ + protected $validator; + + /** + * Cached copy of dirname(__FILE__), directory of current file without + * trailing slash + * @value string filename + */ + protected $dir; + + /** + * Keys whose contents are a hash map and can be merged + * @value array lookup + */ + protected $mergeable_keys_map = array('messages' => true, 'errorNames' => true); + + /** + * Keys whose contents are a list and can be merged + * @value array lookup + */ + protected $mergeable_keys_list = array(); + + /** + * Retrieve sole instance of the factory. + * @param $prototype Optional prototype to overload sole instance with, + * or bool true to reset to default factory. + */ + public static function instance($prototype = null) { + static $instance = null; + if ($prototype !== null) { + $instance = $prototype; + } elseif ($instance === null || $prototype == true) { + $instance = new HTMLPurifier_LanguageFactory(); + $instance->setup(); + } + return $instance; + } + + /** + * Sets up the singleton, much like a constructor + * @note Prevents people from getting this outside of the singleton + */ + public function setup() { + $this->validator = new HTMLPurifier_AttrDef_Lang(); + $this->dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier'; + } + + /** + * Creates a language object, handles class fallbacks + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + * @param $code Code to override configuration with. Private parameter. + */ + public function create($config, $context, $code = false) { + + // validate language code + if ($code === false) { + $code = $this->validator->validate( + $config->get('Core', 'Language'), $config, $context + ); + } else { + $code = $this->validator->validate($code, $config, $context); + } + if ($code === false) $code = 'en'; // malformed code becomes English + + $pcode = str_replace('-', '_', $code); // make valid PHP classname + static $depth = 0; // recursion protection + + if ($code == 'en') { + $lang = new HTMLPurifier_Language($config, $context); + } else { + $class = 'HTMLPurifier_Language_' . $pcode; + $file = $this->dir . '/Language/classes/' . $code . '.php'; + if (file_exists($file) || class_exists($class, false)) { + $lang = new $class($config, $context); + } else { + // Go fallback + $raw_fallback = $this->getFallbackFor($code); + $fallback = $raw_fallback ? $raw_fallback : 'en'; + $depth++; + $lang = $this->create($config, $context, $fallback); + if (!$raw_fallback) { + $lang->error = true; + } + $depth--; + } + } + + $lang->code = $code; + + return $lang; + + } + + /** + * Returns the fallback language for language + * @note Loads the original language into cache + * @param $code string language code + */ + public function getFallbackFor($code) { + $this->loadLanguage($code); + return $this->cache[$code]['fallback']; + } + + /** + * Loads language into the cache, handles message file and fallbacks + * @param $code string language code + */ + public function loadLanguage($code) { + static $languages_seen = array(); // recursion guard + + // abort if we've already loaded it + if (isset($this->cache[$code])) return; + + // generate filename + $filename = $this->dir . '/Language/messages/' . $code . '.php'; + + // default fallback : may be overwritten by the ensuing include + $fallback = ($code != 'en') ? 'en' : false; + + // load primary localisation + if (!file_exists($filename)) { + // skip the include: will rely solely on fallback + $filename = $this->dir . '/Language/messages/en.php'; + $cache = array(); + } else { + include $filename; + $cache = compact($this->keys); + } + + // load fallback localisation + if (!empty($fallback)) { + + // infinite recursion guard + if (isset($languages_seen[$code])) { + trigger_error('Circular fallback reference in language ' . + $code, E_USER_ERROR); + $fallback = 'en'; + } + $language_seen[$code] = true; + + // load the fallback recursively + $this->loadLanguage($fallback); + $fallback_cache = $this->cache[$fallback]; + + // merge fallback with current language + foreach ( $this->keys as $key ) { + if (isset($cache[$key]) && isset($fallback_cache[$key])) { + if (isset($this->mergeable_keys_map[$key])) { + $cache[$key] = $cache[$key] + $fallback_cache[$key]; + } elseif (isset($this->mergeable_keys_list[$key])) { + $cache[$key] = array_merge( $fallback_cache[$key], $cache[$key] ); + } + } else { + $cache[$key] = $fallback_cache[$key]; + } + } + + } + + // save to cache for later retrieval + $this->cache[$code] = $cache; + + return; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Length.php b/libs/htmlpurifier/library/HTMLPurifier/Length.php new file mode 100755 index 0000000..8d2a46b --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Length.php @@ -0,0 +1,115 @@ + true, 'ex' => true, 'px' => true, 'in' => true, + 'cm' => true, 'mm' => true, 'pt' => true, 'pc' => true + ); + + /** + * @param number $n Magnitude + * @param string $u Unit + */ + public function __construct($n = '0', $u = false) { + $this->n = (string) $n; + $this->unit = $u !== false ? (string) $u : false; + } + + /** + * @param string $s Unit string, like '2em' or '3.4in' + * @warning Does not perform validation. + */ + static public function make($s) { + if ($s instanceof HTMLPurifier_Length) return $s; + $n_length = strspn($s, '1234567890.+-'); + $n = substr($s, 0, $n_length); + $unit = substr($s, $n_length); + if ($unit === '') $unit = false; + return new HTMLPurifier_Length($n, $unit); + } + + /** + * Validates the number and unit. + */ + protected function validate() { + // Special case: + if ($this->n === '+0' || $this->n === '-0') $this->n = '0'; + if ($this->n === '0' && $this->unit === false) return true; + if (!ctype_lower($this->unit)) $this->unit = strtolower($this->unit); + if (!isset(HTMLPurifier_Length::$allowedUnits[$this->unit])) return false; + // Hack: + $def = new HTMLPurifier_AttrDef_CSS_Number(); + $result = $def->validate($this->n, false, false); + if ($result === false) return false; + $this->n = $result; + return true; + } + + /** + * Returns string representation of number. + */ + public function toString() { + if (!$this->isValid()) return false; + return $this->n . $this->unit; + } + + /** + * Retrieves string numeric magnitude. + */ + public function getN() {return $this->n;} + + /** + * Retrieves string unit. + */ + public function getUnit() {return $this->unit;} + + /** + * Returns true if this length unit is valid. + */ + public function isValid() { + if ($this->isValid === null) $this->isValid = $this->validate(); + return $this->isValid; + } + + /** + * Compares two lengths, and returns 1 if greater, -1 if less and 0 if equal. + * @warning If both values are too large or small, this calculation will + * not work properly + */ + public function compareTo($l) { + if ($l === false) return false; + if ($l->unit !== $this->unit) { + $converter = new HTMLPurifier_UnitConverter(); + $l = $converter->convert($l, $this->unit); + if ($l === false) return false; + } + return $this->n - $l->n; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Lexer.php b/libs/htmlpurifier/library/HTMLPurifier/Lexer.php new file mode 100755 index 0000000..9458869 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Lexer.php @@ -0,0 +1,298 @@ +get('Core', 'LexerImpl'); + } + + $needs_tracking = + $config->get('Core', 'MaintainLineNumbers') || + $config->get('Core', 'CollectErrors'); + + $inst = null; + if (is_object($lexer)) { + $inst = $lexer; + } else { + + if (is_null($lexer)) { do { + // auto-detection algorithm + + if ($needs_tracking) { + $lexer = 'DirectLex'; + break; + } + + if ( + class_exists('DOMDocument') && + method_exists('DOMDocument', 'loadHTML') && + !extension_loaded('domxml') + ) { + // check for DOM support, because while it's part of the + // core, it can be disabled compile time. Also, the PECL + // domxml extension overrides the default DOM, and is evil + // and nasty and we shan't bother to support it + $lexer = 'DOMLex'; + } else { + $lexer = 'DirectLex'; + } + + } while(0); } // do..while so we can break + + // instantiate recognized string names + switch ($lexer) { + case 'DOMLex': + $inst = new HTMLPurifier_Lexer_DOMLex(); + break; + case 'DirectLex': + $inst = new HTMLPurifier_Lexer_DirectLex(); + break; + case 'PH5P': + $inst = new HTMLPurifier_Lexer_PH5P(); + break; + default: + throw new HTMLPurifier_Exception("Cannot instantiate unrecognized Lexer type " . htmlspecialchars($lexer)); + } + } + + if (!$inst) throw new HTMLPurifier_Exception('No lexer was instantiated'); + + // once PHP DOM implements native line numbers, or we + // hack out something using XSLT, remove this stipulation + if ($needs_tracking && !$inst->tracksLineNumbers) { + throw new HTMLPurifier_Exception('Cannot use lexer that does not support line numbers with Core.MaintainLineNumbers or Core.CollectErrors (use DirectLex instead)'); + } + + return $inst; + + } + + // -- CONVENIENCE MEMBERS --------------------------------------------- + + public function __construct() { + $this->_entity_parser = new HTMLPurifier_EntityParser(); + } + + /** + * Most common entity to raw value conversion table for special entities. + */ + protected $_special_entity2str = + array( + '"' => '"', + '&' => '&', + '<' => '<', + '>' => '>', + ''' => "'", + ''' => "'", + ''' => "'" + ); + + /** + * Parses special entities into the proper characters. + * + * This string will translate escaped versions of the special characters + * into the correct ones. + * + * @warning + * You should be able to treat the output of this function as + * completely parsed, but that's only because all other entities should + * have been handled previously in substituteNonSpecialEntities() + * + * @param $string String character data to be parsed. + * @returns Parsed character data. + */ + public function parseData($string) { + + // following functions require at least one character + if ($string === '') return ''; + + // subtracts amps that cannot possibly be escaped + $num_amp = substr_count($string, '&') - substr_count($string, '& ') - + ($string[strlen($string)-1] === '&' ? 1 : 0); + + if (!$num_amp) return $string; // abort if no entities + $num_esc_amp = substr_count($string, '&'); + $string = strtr($string, $this->_special_entity2str); + + // code duplication for sake of optimization, see above + $num_amp_2 = substr_count($string, '&') - substr_count($string, '& ') - + ($string[strlen($string)-1] === '&' ? 1 : 0); + + if ($num_amp_2 <= $num_esc_amp) return $string; + + // hmm... now we have some uncommon entities. Use the callback. + $string = $this->_entity_parser->substituteSpecialEntities($string); + return $string; + } + + /** + * Lexes an HTML string into tokens. + * + * @param $string String HTML. + * @return HTMLPurifier_Token array representation of HTML. + */ + public function tokenizeHTML($string, $config, $context) { + trigger_error('Call to abstract class', E_USER_ERROR); + } + + /** + * Translates CDATA sections into regular sections (through escaping). + * + * @param $string HTML string to process. + * @returns HTML with CDATA sections escaped. + */ + protected static function escapeCDATA($string) { + return preg_replace_callback( + '//s', + array('HTMLPurifier_Lexer', 'CDATACallback'), + $string + ); + } + + /** + * Special CDATA case that is especially convoluted for )#si', + array($this, 'scriptCallback'), $html); + } + + $html = $this->normalize($html, $config, $context); + + $cursor = 0; // our location in the text + $inside_tag = false; // whether or not we're parsing the inside of a tag + $array = array(); // result array + + // This is also treated to mean maintain *column* numbers too + $maintain_line_numbers = $config->get('Core', 'MaintainLineNumbers'); + + if ($maintain_line_numbers === null) { + // automatically determine line numbering by checking + // if error collection is on + $maintain_line_numbers = $config->get('Core', 'CollectErrors'); + } + + if ($maintain_line_numbers) { + $current_line = 1; + $current_col = 0; + $length = strlen($html); + } else { + $current_line = false; + $current_col = false; + $length = false; + } + $context->register('CurrentLine', $current_line); + $context->register('CurrentCol', $current_col); + $nl = "\n"; + // how often to manually recalculate. This will ALWAYS be right, + // but it's pretty wasteful. Set to 0 to turn off + $synchronize_interval = $config->get('Core', 'DirectLexLineNumberSyncInterval'); + + $e = false; + if ($config->get('Core', 'CollectErrors')) { + $e =& $context->get('ErrorCollector'); + } + + // for testing synchronization + $loops = 0; + + while(++$loops) { + + // $cursor is either at the start of a token, or inside of + // a tag (i.e. there was a < immediately before it), as indicated + // by $inside_tag + + if ($maintain_line_numbers) { + + // $rcursor, however, is always at the start of a token. + $rcursor = $cursor - (int) $inside_tag; + + // Column number is cheap, so we calculate it every round. + // We're interested at the *end* of the newline string, so + // we need to add strlen($nl) == 1 to $nl_pos before subtracting it + // from our "rcursor" position. + $nl_pos = strrpos($html, $nl, $rcursor - $length); + $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1); + + // recalculate lines + if ( + $synchronize_interval && // synchronization is on + $cursor > 0 && // cursor is further than zero + $loops % $synchronize_interval === 0 // time to synchronize! + ) { + $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor); + } + + } + + $position_next_lt = strpos($html, '<', $cursor); + $position_next_gt = strpos($html, '>', $cursor); + + // triggers on "asdf" but not "asdf " + // special case to set up context + if ($position_next_lt === $cursor) { + $inside_tag = true; + $cursor++; + } + + if (!$inside_tag && $position_next_lt !== false) { + // We are not inside tag and there still is another tag to parse + $token = new + HTMLPurifier_Token_Text( + $this->parseData( + substr( + $html, $cursor, $position_next_lt - $cursor + ) + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor); + } + $array[] = $token; + $cursor = $position_next_lt + 1; + $inside_tag = true; + continue; + } elseif (!$inside_tag) { + // We are not inside tag but there are no more tags + // If we're already at the end, break + if ($cursor === strlen($html)) break; + // Create Text of rest of string + $token = new + HTMLPurifier_Token_Text( + $this->parseData( + substr( + $html, $cursor + ) + ) + ); + if ($maintain_line_numbers) $token->rawPosition($current_line, $current_col); + $array[] = $token; + break; + } elseif ($inside_tag && $position_next_gt !== false) { + // We are in tag and it is well formed + // Grab the internals of the tag + $strlen_segment = $position_next_gt - $cursor; + + if ($strlen_segment < 1) { + // there's nothing to process! + $token = new HTMLPurifier_Token_Text('<'); + $cursor++; + continue; + } + + $segment = substr($html, $cursor, $strlen_segment); + + if ($segment === false) { + // somehow, we attempted to access beyond the end of + // the string, defense-in-depth, reported by Nate Abele + break; + } + + // Check if it's a comment + if ( + substr($segment, 0, 3) === '!--' + ) { + // re-determine segment length, looking for --> + $position_comment_end = strpos($html, '-->', $cursor); + if ($position_comment_end === false) { + // uh oh, we have a comment that extends to + // infinity. Can't be helped: set comment + // end position to end of string + if ($e) $e->send(E_WARNING, 'Lexer: Unclosed comment'); + $position_comment_end = strlen($html); + $end = true; + } else { + $end = false; + } + $strlen_segment = $position_comment_end - $cursor; + $segment = substr($html, $cursor, $strlen_segment); + $token = new + HTMLPurifier_Token_Comment( + substr( + $segment, 3, $strlen_segment - 3 + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment); + } + $array[] = $token; + $cursor = $end ? $position_comment_end : $position_comment_end + 3; + $inside_tag = false; + continue; + } + + // Check if it's an end tag + $is_end_tag = (strpos($segment,'/') === 0); + if ($is_end_tag) { + $type = substr($segment, 1); + $token = new HTMLPurifier_Token_End($type); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $inside_tag = false; + $cursor = $position_next_gt + 1; + continue; + } + + // Check leading character is alnum, if not, we may + // have accidently grabbed an emoticon. Translate into + // text and go our merry way + if (!ctype_alpha($segment[0])) { + // XML: $segment[0] !== '_' && $segment[0] !== ':' + if ($e) $e->send(E_NOTICE, 'Lexer: Unescaped lt'); + $token = new HTMLPurifier_Token_Text('<'); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $inside_tag = false; + continue; + } + + // Check if it is explicitly self closing, if so, remove + // trailing slash. Remember, we could have a tag like
      , so + // any later token processing scripts must convert improperly + // classified EmptyTags from StartTags. + $is_self_closing = (strrpos($segment,'/') === $strlen_segment-1); + if ($is_self_closing) { + $strlen_segment--; + $segment = substr($segment, 0, $strlen_segment); + } + + // Check if there are any attributes + $position_first_space = strcspn($segment, $this->_whitespace); + + if ($position_first_space >= $strlen_segment) { + if ($is_self_closing) { + $token = new HTMLPurifier_Token_Empty($segment); + } else { + $token = new HTMLPurifier_Token_Start($segment); + } + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $inside_tag = false; + $cursor = $position_next_gt + 1; + continue; + } + + // Grab out all the data + $type = substr($segment, 0, $position_first_space); + $attribute_string = + trim( + substr( + $segment, $position_first_space + ) + ); + if ($attribute_string) { + $attr = $this->parseAttributeString( + $attribute_string + , $config, $context + ); + } else { + $attr = array(); + } + + if ($is_self_closing) { + $token = new HTMLPurifier_Token_Empty($type, $attr); + } else { + $token = new HTMLPurifier_Token_Start($type, $attr); + } + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $cursor = $position_next_gt + 1; + $inside_tag = false; + continue; + } else { + // inside tag, but there's no ending > sign + if ($e) $e->send(E_WARNING, 'Lexer: Missing gt'); + $token = new + HTMLPurifier_Token_Text( + '<' . + $this->parseData( + substr($html, $cursor) + ) + ); + if ($maintain_line_numbers) $token->rawPosition($current_line, $current_col); + // no cursor scroll? Hmm... + $array[] = $token; + break; + } + break; + } + + $context->destroy('CurrentLine'); + $context->destroy('CurrentCol'); + return $array; + } + + /** + * PHP 5.0.x compatible substr_count that implements offset and length + */ + protected function substrCount($haystack, $needle, $offset, $length) { + static $oldVersion; + if ($oldVersion === null) { + $oldVersion = version_compare(PHP_VERSION, '5.1', '<'); + } + if ($oldVersion) { + $haystack = substr($haystack, $offset, $length); + return substr_count($haystack, $needle); + } else { + return substr_count($haystack, $needle, $offset, $length); + } + } + + /** + * Takes the inside of an HTML tag and makes an assoc array of attributes. + * + * @param $string Inside of tag excluding name. + * @returns Assoc array of attributes. + */ + public function parseAttributeString($string, $config, $context) { + $string = (string) $string; // quick typecast + + if ($string == '') return array(); // no attributes + + $e = false; + if ($config->get('Core', 'CollectErrors')) { + $e =& $context->get('ErrorCollector'); + } + + // let's see if we can abort as quickly as possible + // one equal sign, no spaces => one attribute + $num_equal = substr_count($string, '='); + $has_space = strpos($string, ' '); + if ($num_equal === 0 && !$has_space) { + // bool attribute + return array($string => $string); + } elseif ($num_equal === 1 && !$has_space) { + // only one attribute + list($key, $quoted_value) = explode('=', $string); + $quoted_value = trim($quoted_value); + if (!$key) { + if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); + return array(); + } + if (!$quoted_value) return array($key => ''); + $first_char = @$quoted_value[0]; + $last_char = @$quoted_value[strlen($quoted_value)-1]; + + $same_quote = ($first_char == $last_char); + $open_quote = ($first_char == '"' || $first_char == "'"); + + if ( $same_quote && $open_quote) { + // well behaved + $value = substr($quoted_value, 1, strlen($quoted_value) - 2); + } else { + // not well behaved + if ($open_quote) { + if ($e) $e->send(E_ERROR, 'Lexer: Missing end quote'); + $value = substr($quoted_value, 1); + } else { + $value = $quoted_value; + } + } + if ($value === false) $value = ''; + return array($key => $value); + } + + // setup loop environment + $array = array(); // return assoc array of attributes + $cursor = 0; // current position in string (moves forward) + $size = strlen($string); // size of the string (stays the same) + + // if we have unquoted attributes, the parser expects a terminating + // space, so let's guarantee that there's always a terminating space. + $string .= ' '; + + while(true) { + + if ($cursor >= $size) { + break; + } + + $cursor += ($value = strspn($string, $this->_whitespace, $cursor)); + // grab the key + + $key_begin = $cursor; //we're currently at the start of the key + + // scroll past all characters that are the key (not whitespace or =) + $cursor += strcspn($string, $this->_whitespace . '=', $cursor); + + $key_end = $cursor; // now at the end of the key + + $key = substr($string, $key_begin, $key_end - $key_begin); + + if (!$key) { + if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); + $cursor += strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop + continue; // empty key + } + + // scroll past all whitespace + $cursor += strspn($string, $this->_whitespace, $cursor); + + if ($cursor >= $size) { + $array[$key] = $key; + break; + } + + // if the next character is an equal sign, we've got a regular + // pair, otherwise, it's a bool attribute + $first_char = @$string[$cursor]; + + if ($first_char == '=') { + // key="value" + + $cursor++; + $cursor += strspn($string, $this->_whitespace, $cursor); + + if ($cursor === false) { + $array[$key] = ''; + break; + } + + // we might be in front of a quote right now + + $char = @$string[$cursor]; + + if ($char == '"' || $char == "'") { + // it's quoted, end bound is $char + $cursor++; + $value_begin = $cursor; + $cursor = strpos($string, $char, $cursor); + $value_end = $cursor; + } else { + // it's not quoted, end bound is whitespace + $value_begin = $cursor; + $cursor += strcspn($string, $this->_whitespace, $cursor); + $value_end = $cursor; + } + + // we reached a premature end + if ($cursor === false) { + $cursor = $size; + $value_end = $cursor; + } + + $value = substr($string, $value_begin, $value_end - $value_begin); + if ($value === false) $value = ''; + $array[$key] = $this->parseData($value); + $cursor++; + + } else { + // boolattr + if ($key !== '') { + $array[$key] = $key; + } else { + // purely theoretical + if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); + } + + } + } + return $array; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Lexer/PEARSax3.php b/libs/htmlpurifier/library/HTMLPurifier/Lexer/PEARSax3.php new file mode 100755 index 0000000..57cffa8 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Lexer/PEARSax3.php @@ -0,0 +1,106 @@ +tokens = array(); + + $string = $this->normalize($string, $config, $context); + + $parser = new XML_HTMLSax3(); + $parser->set_object($this); + $parser->set_element_handler('openHandler','closeHandler'); + $parser->set_data_handler('dataHandler'); + $parser->set_escape_handler('escapeHandler'); + + // doesn't seem to work correctly for attributes + $parser->set_option('XML_OPTION_ENTITIES_PARSED', 1); + + $parser->parse($string); + + return $this->tokens; + + } + + /** + * Open tag event handler, interface is defined by PEAR package. + */ + public function openHandler(&$parser, $name, $attrs, $closed) { + // entities are not resolved in attrs + foreach ($attrs as $key => $attr) { + $attrs[$key] = $this->parseData($attr); + } + if ($closed) { + $this->tokens[] = new HTMLPurifier_Token_Empty($name, $attrs); + } else { + $this->tokens[] = new HTMLPurifier_Token_Start($name, $attrs); + } + return true; + } + + /** + * Close tag event handler, interface is defined by PEAR package. + */ + public function closeHandler(&$parser, $name) { + // HTMLSax3 seems to always send empty tags an extra close tag + // check and ignore if you see it: + // [TESTME] to make sure it doesn't overreach + if ($this->tokens[count($this->tokens)-1] instanceof HTMLPurifier_Token_Empty) { + return true; + } + $this->tokens[] = new HTMLPurifier_Token_End($name); + return true; + } + + /** + * Data event handler, interface is defined by PEAR package. + */ + public function dataHandler(&$parser, $data) { + $this->tokens[] = new HTMLPurifier_Token_Text($data); + return true; + } + + /** + * Escaped text handler, interface is defined by PEAR package. + */ + public function escapeHandler(&$parser, $data) { + if (strpos($data, '--') === 0) { + $this->tokens[] = new HTMLPurifier_Token_Comment($data); + } + // CDATA is handled elsewhere, but if it was handled here: + //if (strpos($data, '[CDATA[') === 0) { + // $this->tokens[] = new HTMLPurifier_Token_Text( + // substr($data, 7, strlen($data) - 9) ); + //} + return true; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php b/libs/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php new file mode 100755 index 0000000..fa1bf97 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php @@ -0,0 +1,3906 @@ +normalize($html, $config, $context); + $new_html = $this->wrapHTML($new_html, $config, $context); + try { + $parser = new HTML5($new_html); + $doc = $parser->save(); + } catch (DOMException $e) { + // Uh oh, it failed. Punt to DirectLex. + $lexer = new HTMLPurifier_Lexer_DirectLex(); + $context->register('PH5PError', $e); // save the error, so we can detect it + return $lexer->tokenizeHTML($html, $config, $context); // use original HTML + } + $tokens = array(); + $this->tokenizeDOM( + $doc->getElementsByTagName('html')->item(0)-> // + getElementsByTagName('body')->item(0)-> // + getElementsByTagName('div')->item(0) //
      + , $tokens); + return $tokens; + } + +} + +/* + +Copyright 2007 Jeroen van der Meer + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +class HTML5 { + private $data; + private $char; + private $EOF; + private $state; + private $tree; + private $token; + private $content_model; + private $escape = false; + private $entities = array('AElig;','AElig','AMP;','AMP','Aacute;','Aacute', + 'Acirc;','Acirc','Agrave;','Agrave','Alpha;','Aring;','Aring','Atilde;', + 'Atilde','Auml;','Auml','Beta;','COPY;','COPY','Ccedil;','Ccedil','Chi;', + 'Dagger;','Delta;','ETH;','ETH','Eacute;','Eacute','Ecirc;','Ecirc','Egrave;', + 'Egrave','Epsilon;','Eta;','Euml;','Euml','GT;','GT','Gamma;','Iacute;', + 'Iacute','Icirc;','Icirc','Igrave;','Igrave','Iota;','Iuml;','Iuml','Kappa;', + 'LT;','LT','Lambda;','Mu;','Ntilde;','Ntilde','Nu;','OElig;','Oacute;', + 'Oacute','Ocirc;','Ocirc','Ograve;','Ograve','Omega;','Omicron;','Oslash;', + 'Oslash','Otilde;','Otilde','Ouml;','Ouml','Phi;','Pi;','Prime;','Psi;', + 'QUOT;','QUOT','REG;','REG','Rho;','Scaron;','Sigma;','THORN;','THORN', + 'TRADE;','Tau;','Theta;','Uacute;','Uacute','Ucirc;','Ucirc','Ugrave;', + 'Ugrave','Upsilon;','Uuml;','Uuml','Xi;','Yacute;','Yacute','Yuml;','Zeta;', + 'aacute;','aacute','acirc;','acirc','acute;','acute','aelig;','aelig', + 'agrave;','agrave','alefsym;','alpha;','amp;','amp','and;','ang;','apos;', + 'aring;','aring','asymp;','atilde;','atilde','auml;','auml','bdquo;','beta;', + 'brvbar;','brvbar','bull;','cap;','ccedil;','ccedil','cedil;','cedil', + 'cent;','cent','chi;','circ;','clubs;','cong;','copy;','copy','crarr;', + 'cup;','curren;','curren','dArr;','dagger;','darr;','deg;','deg','delta;', + 'diams;','divide;','divide','eacute;','eacute','ecirc;','ecirc','egrave;', + 'egrave','empty;','emsp;','ensp;','epsilon;','equiv;','eta;','eth;','eth', + 'euml;','euml','euro;','exist;','fnof;','forall;','frac12;','frac12', + 'frac14;','frac14','frac34;','frac34','frasl;','gamma;','ge;','gt;','gt', + 'hArr;','harr;','hearts;','hellip;','iacute;','iacute','icirc;','icirc', + 'iexcl;','iexcl','igrave;','igrave','image;','infin;','int;','iota;', + 'iquest;','iquest','isin;','iuml;','iuml','kappa;','lArr;','lambda;','lang;', + 'laquo;','laquo','larr;','lceil;','ldquo;','le;','lfloor;','lowast;','loz;', + 'lrm;','lsaquo;','lsquo;','lt;','lt','macr;','macr','mdash;','micro;','micro', + 'middot;','middot','minus;','mu;','nabla;','nbsp;','nbsp','ndash;','ne;', + 'ni;','not;','not','notin;','nsub;','ntilde;','ntilde','nu;','oacute;', + 'oacute','ocirc;','ocirc','oelig;','ograve;','ograve','oline;','omega;', + 'omicron;','oplus;','or;','ordf;','ordf','ordm;','ordm','oslash;','oslash', + 'otilde;','otilde','otimes;','ouml;','ouml','para;','para','part;','permil;', + 'perp;','phi;','pi;','piv;','plusmn;','plusmn','pound;','pound','prime;', + 'prod;','prop;','psi;','quot;','quot','rArr;','radic;','rang;','raquo;', + 'raquo','rarr;','rceil;','rdquo;','real;','reg;','reg','rfloor;','rho;', + 'rlm;','rsaquo;','rsquo;','sbquo;','scaron;','sdot;','sect;','sect','shy;', + 'shy','sigma;','sigmaf;','sim;','spades;','sub;','sube;','sum;','sup1;', + 'sup1','sup2;','sup2','sup3;','sup3','sup;','supe;','szlig;','szlig','tau;', + 'there4;','theta;','thetasym;','thinsp;','thorn;','thorn','tilde;','times;', + 'times','trade;','uArr;','uacute;','uacute','uarr;','ucirc;','ucirc', + 'ugrave;','ugrave','uml;','uml','upsih;','upsilon;','uuml;','uuml','weierp;', + 'xi;','yacute;','yacute','yen;','yen','yuml;','yuml','zeta;','zwj;','zwnj;'); + + const PCDATA = 0; + const RCDATA = 1; + const CDATA = 2; + const PLAINTEXT = 3; + + const DOCTYPE = 0; + const STARTTAG = 1; + const ENDTAG = 2; + const COMMENT = 3; + const CHARACTR = 4; + const EOF = 5; + + public function __construct($data) { + $data = str_replace("\r\n", "\n", $data); + $data = str_replace("\r", null, $data); + + $this->data = $data; + $this->char = -1; + $this->EOF = strlen($data); + $this->tree = new HTML5TreeConstructer; + $this->content_model = self::PCDATA; + + $this->state = 'data'; + + while($this->state !== null) { + $this->{$this->state.'State'}(); + } + } + + public function save() { + return $this->tree->save(); + } + + private function char() { + return ($this->char < $this->EOF) + ? $this->data[$this->char] + : false; + } + + private function character($s, $l = 0) { + if($s + $l < $this->EOF) { + if($l === 0) { + return $this->data[$s]; + } else { + return substr($this->data, $s, $l); + } + } + } + + private function characters($char_class, $start) { + return preg_replace('#^(['.$char_class.']+).*#s', '\\1', substr($this->data, $start)); + } + + private function dataState() { + // Consume the next input character + $this->char++; + $char = $this->char(); + + if($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) { + /* U+0026 AMPERSAND (&) + When the content model flag is set to one of the PCDATA or RCDATA + states: switch to the entity data state. Otherwise: treat it as per + the "anything else" entry below. */ + $this->state = 'entityData'; + + } elseif($char === '-') { + /* If the content model flag is set to either the RCDATA state or + the CDATA state, and the escape flag is false, and there are at + least three characters before this one in the input stream, and the + last four characters in the input stream, including this one, are + U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS, + and U+002D HYPHEN-MINUS (""), + set the escape flag to false. */ + if(($this->content_model === self::RCDATA || + $this->content_model === self::CDATA) && $this->escape === true && + $this->character($this->char, 3) === '-->') { + $this->escape = false; + } + + /* In any case, emit the input character as a character token. + Stay in the data state. */ + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => $char + )); + + } elseif($this->char === $this->EOF) { + /* EOF + Emit an end-of-file token. */ + $this->EOF(); + + } elseif($this->content_model === self::PLAINTEXT) { + /* When the content model flag is set to the PLAINTEXT state + THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of + the text and emit it as a character token. */ + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => substr($this->data, $this->char) + )); + + $this->EOF(); + + } else { + /* Anything else + THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that + otherwise would also be treated as a character token and emit it + as a single character token. Stay in the data state. */ + $len = strcspn($this->data, '<&', $this->char); + $char = substr($this->data, $this->char, $len); + $this->char += $len - 1; + + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => $char + )); + + $this->state = 'data'; + } + } + + private function entityDataState() { + // Attempt to consume an entity. + $entity = $this->entity(); + + // If nothing is returned, emit a U+0026 AMPERSAND character token. + // Otherwise, emit the character token that was returned. + $char = (!$entity) ? '&' : $entity; + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => $char + )); + + // Finally, switch to the data state. + $this->state = 'data'; + } + + private function tagOpenState() { + switch($this->content_model) { + case self::RCDATA: + case self::CDATA: + /* If the next input character is a U+002F SOLIDUS (/) character, + consume it and switch to the close tag open state. If the next + input character is not a U+002F SOLIDUS (/) character, emit a + U+003C LESS-THAN SIGN character token and switch to the data + state to process the next input character. */ + if($this->character($this->char + 1) === '/') { + $this->char++; + $this->state = 'closeTagOpen'; + + } else { + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => '<' + )); + + $this->state = 'data'; + } + break; + + case self::PCDATA: + // If the content model flag is set to the PCDATA state + // Consume the next input character: + $this->char++; + $char = $this->char(); + + if($char === '!') { + /* U+0021 EXCLAMATION MARK (!) + Switch to the markup declaration open state. */ + $this->state = 'markupDeclarationOpen'; + + } elseif($char === '/') { + /* U+002F SOLIDUS (/) + Switch to the close tag open state. */ + $this->state = 'closeTagOpen'; + + } elseif(preg_match('/^[A-Za-z]$/', $char)) { + /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z + Create a new start tag token, set its tag name to the lowercase + version of the input character (add 0x0020 to the character's code + point), then switch to the tag name state. (Don't emit the token + yet; further details will be filled in before it is emitted.) */ + $this->token = array( + 'name' => strtolower($char), + 'type' => self::STARTTAG, + 'attr' => array() + ); + + $this->state = 'tagName'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Parse error. Emit a U+003C LESS-THAN SIGN character token and a + U+003E GREATER-THAN SIGN character token. Switch to the data state. */ + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => '<>' + )); + + $this->state = 'data'; + + } elseif($char === '?') { + /* U+003F QUESTION MARK (?) + Parse error. Switch to the bogus comment state. */ + $this->state = 'bogusComment'; + + } else { + /* Anything else + Parse error. Emit a U+003C LESS-THAN SIGN character token and + reconsume the current input character in the data state. */ + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => '<' + )); + + $this->char--; + $this->state = 'data'; + } + break; + } + } + + private function closeTagOpenState() { + $next_node = strtolower($this->characters('A-Za-z', $this->char + 1)); + $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName; + + if(($this->content_model === self::RCDATA || $this->content_model === self::CDATA) && + (!$the_same || ($the_same && (!preg_match('/[\t\n\x0b\x0c >\/]/', + $this->character($this->char + 1 + strlen($next_node))) || $this->EOF === $this->char)))) { + /* If the content model flag is set to the RCDATA or CDATA states then + examine the next few characters. If they do not match the tag name of + the last start tag token emitted (case insensitively), or if they do but + they are not immediately followed by one of the following characters: + * U+0009 CHARACTER TABULATION + * U+000A LINE FEED (LF) + * U+000B LINE TABULATION + * U+000C FORM FEED (FF) + * U+0020 SPACE + * U+003E GREATER-THAN SIGN (>) + * U+002F SOLIDUS (/) + * EOF + ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character + token, a U+002F SOLIDUS character token, and switch to the data state + to process the next input character. */ + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => 'state = 'data'; + + } else { + /* Otherwise, if the content model flag is set to the PCDATA state, + or if the next few characters do match that tag name, consume the + next input character: */ + $this->char++; + $char = $this->char(); + + if(preg_match('/^[A-Za-z]$/', $char)) { + /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z + Create a new end tag token, set its tag name to the lowercase version + of the input character (add 0x0020 to the character's code point), then + switch to the tag name state. (Don't emit the token yet; further details + will be filled in before it is emitted.) */ + $this->token = array( + 'name' => strtolower($char), + 'type' => self::ENDTAG + ); + + $this->state = 'tagName'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Parse error. Switch to the data state. */ + $this->state = 'data'; + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F + SOLIDUS character token. Reconsume the EOF character in the data state. */ + $this->emitToken(array( + 'type' => self::CHARACTR, + 'data' => 'char--; + $this->state = 'data'; + + } else { + /* Parse error. Switch to the bogus comment state. */ + $this->state = 'bogusComment'; + } + } + } + + private function tagNameState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } elseif($char === '/') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } else { + /* Anything else + Append the current input character to the current tag token's tag name. + Stay in the tag name state. */ + $this->token['name'] .= strtolower($char); + $this->state = 'tagName'; + } + } + + private function beforeAttributeNameState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($char === '/') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Stay in the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Start a new attribute in the current tag token. Set that attribute's + name to the current input character, and its value to the empty string. + Switch to the attribute name state. */ + $this->token['attr'][] = array( + 'name' => strtolower($char), + 'value' => null + ); + + $this->state = 'attributeName'; + } + } + + private function attributeNameState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute name state. */ + $this->state = 'afterAttributeName'; + + } elseif($char === '=') { + /* U+003D EQUALS SIGN (=) + Switch to the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($char === '/' && $this->character($this->char + 1) !== '>') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's name. + Stay in the attribute name state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['name'] .= strtolower($char); + + $this->state = 'attributeName'; + } + } + + private function afterAttributeNameState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the after attribute name state. */ + $this->state = 'afterAttributeName'; + + } elseif($char === '=') { + /* U+003D EQUALS SIGN (=) + Switch to the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($char === '/' && $this->character($this->char + 1) !== '>') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the + before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Start a new attribute in the current tag token. Set that attribute's + name to the current input character, and its value to the empty string. + Switch to the attribute name state. */ + $this->token['attr'][] = array( + 'name' => strtolower($char), + 'value' => null + ); + + $this->state = 'attributeName'; + } + } + + private function beforeAttributeValueState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif($char === '"') { + /* U+0022 QUOTATION MARK (") + Switch to the attribute value (double-quoted) state. */ + $this->state = 'attributeValueDoubleQuoted'; + + } elseif($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the attribute value (unquoted) state and reconsume + this input character. */ + $this->char--; + $this->state = 'attributeValueUnquoted'; + + } elseif($char === '\'') { + /* U+0027 APOSTROPHE (') + Switch to the attribute value (single-quoted) state. */ + $this->state = 'attributeValueSingleQuoted'; + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Switch to the attribute value (unquoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueUnquoted'; + } + } + + private function attributeValueDoubleQuotedState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if($char === '"') { + /* U+0022 QUOTATION MARK (") + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState('double'); + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the character + in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (double-quoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueDoubleQuoted'; + } + } + + private function attributeValueSingleQuotedState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if($char === '\'') { + /* U+0022 QUOTATION MARK (') + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState('single'); + + } elseif($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the character + in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (single-quoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueSingleQuoted'; + } + } + + private function attributeValueUnquotedState() { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState(); + + } elseif($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (unquoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueUnquoted'; + } + } + + private function entityInAttributeValueState() { + // Attempt to consume an entity. + $entity = $this->entity(); + + // If nothing is returned, append a U+0026 AMPERSAND character to the + // current attribute's value. Otherwise, emit the character token that + // was returned. + $char = (!$entity) + ? '&' + : $entity; + + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + } + + private function bogusCommentState() { + /* Consume every character up to the first U+003E GREATER-THAN SIGN + character (>) or the end of the file (EOF), whichever comes first. Emit + a comment token whose data is the concatenation of all the characters + starting from and including the character that caused the state machine + to switch into the bogus comment state, up to and including the last + consumed character before the U+003E character, if any, or up to the + end of the file otherwise. (If the comment was started by the end of + the file (EOF), the token is empty.) */ + $data = $this->characters('^>', $this->char); + $this->emitToken(array( + 'data' => $data, + 'type' => self::COMMENT + )); + + $this->char += strlen($data); + + /* Switch to the data state. */ + $this->state = 'data'; + + /* If the end of the file was reached, reconsume the EOF character. */ + if($this->char === $this->EOF) { + $this->char = $this->EOF - 1; + } + } + + private function markupDeclarationOpenState() { + /* If the next two characters are both U+002D HYPHEN-MINUS (-) + characters, consume those two characters, create a comment token whose + data is the empty string, and switch to the comment state. */ + if($this->character($this->char + 1, 2) === '--') { + $this->char += 2; + $this->state = 'comment'; + $this->token = array( + 'data' => null, + 'type' => self::COMMENT + ); + + /* Otherwise if the next seven chacacters are a case-insensitive match + for the word "DOCTYPE", then consume those characters and switch to the + DOCTYPE state. */ + } elseif(strtolower($this->character($this->char + 1, 7)) === 'doctype') { + $this->char += 7; + $this->state = 'doctype'; + + /* Otherwise, is is a parse error. Switch to the bogus comment state. + The next character that is consumed, if any, is the first character + that will be in the comment. */ + } else { + $this->char++; + $this->state = 'bogusComment'; + } + } + + private function commentState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + /* U+002D HYPHEN-MINUS (-) */ + if($char === '-') { + /* Switch to the comment dash state */ + $this->state = 'commentDash'; + + /* EOF */ + } elseif($this->char === $this->EOF) { + /* Parse error. Emit the comment token. Reconsume the EOF character + in the data state. */ + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + /* Anything else */ + } else { + /* Append the input character to the comment token's data. Stay in + the comment state. */ + $this->token['data'] .= $char; + } + } + + private function commentDashState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + /* U+002D HYPHEN-MINUS (-) */ + if($char === '-') { + /* Switch to the comment end state */ + $this->state = 'commentEnd'; + + /* EOF */ + } elseif($this->char === $this->EOF) { + /* Parse error. Emit the comment token. Reconsume the EOF character + in the data state. */ + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + /* Anything else */ + } else { + /* Append a U+002D HYPHEN-MINUS (-) character and the input + character to the comment token's data. Switch to the comment state. */ + $this->token['data'] .= '-'.$char; + $this->state = 'comment'; + } + } + + private function commentEndState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($char === '-') { + $this->token['data'] .= '-'; + + } elseif($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['data'] .= '--'.$char; + $this->state = 'comment'; + } + } + + private function doctypeState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + $this->state = 'beforeDoctypeName'; + + } else { + $this->char--; + $this->state = 'beforeDoctypeName'; + } + } + + private function beforeDoctypeNameState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + // Stay in the before DOCTYPE name state. + + } elseif(preg_match('/^[a-z]$/', $char)) { + $this->token = array( + 'name' => strtoupper($char), + 'type' => self::DOCTYPE, + 'error' => true + ); + + $this->state = 'doctypeName'; + + } elseif($char === '>') { + $this->emitToken(array( + 'name' => null, + 'type' => self::DOCTYPE, + 'error' => true + )); + + $this->state = 'data'; + + } elseif($this->char === $this->EOF) { + $this->emitToken(array( + 'name' => null, + 'type' => self::DOCTYPE, + 'error' => true + )); + + $this->char--; + $this->state = 'data'; + + } else { + $this->token = array( + 'name' => $char, + 'type' => self::DOCTYPE, + 'error' => true + ); + + $this->state = 'doctypeName'; + } + } + + private function doctypeNameState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + $this->state = 'AfterDoctypeName'; + + } elseif($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif(preg_match('/^[a-z]$/', $char)) { + $this->token['name'] .= strtoupper($char); + + } elseif($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['name'] .= $char; + } + + $this->token['error'] = ($this->token['name'] === 'HTML') + ? false + : true; + } + + private function afterDoctypeNameState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + // Stay in the DOCTYPE name state. + + } elseif($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['error'] = true; + $this->state = 'bogusDoctype'; + } + } + + private function bogusDoctypeState() { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + // Stay in the bogus DOCTYPE state. + } + } + + private function entity() { + $start = $this->char; + + // This section defines how to consume an entity. This definition is + // used when parsing entities in text and in attributes. + + // The behaviour depends on the identity of the next character (the + // one immediately after the U+0026 AMPERSAND character): + + switch($this->character($this->char + 1)) { + // U+0023 NUMBER SIGN (#) + case '#': + + // The behaviour further depends on the character after the + // U+0023 NUMBER SIGN: + switch($this->character($this->char + 1)) { + // U+0078 LATIN SMALL LETTER X + // U+0058 LATIN CAPITAL LETTER X + case 'x': + case 'X': + // Follow the steps below, but using the range of + // characters U+0030 DIGIT ZERO through to U+0039 DIGIT + // NINE, U+0061 LATIN SMALL LETTER A through to U+0066 + // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER + // A, through to U+0046 LATIN CAPITAL LETTER F (in other + // words, 0-9, A-F, a-f). + $char = 1; + $char_class = '0-9A-Fa-f'; + break; + + // Anything else + default: + // Follow the steps below, but using the range of + // characters U+0030 DIGIT ZERO through to U+0039 DIGIT + // NINE (i.e. just 0-9). + $char = 0; + $char_class = '0-9'; + break; + } + + // Consume as many characters as match the range of characters + // given above. + $this->char++; + $e_name = $this->characters($char_class, $this->char + $char + 1); + $entity = $this->character($start, $this->char); + $cond = strlen($e_name) > 0; + + // The rest of the parsing happens bellow. + break; + + // Anything else + default: + // Consume the maximum number of characters possible, with the + // consumed characters case-sensitively matching one of the + // identifiers in the first column of the entities table. + $e_name = $this->characters('0-9A-Za-z;', $this->char + 1); + $len = strlen($e_name); + + for($c = 1; $c <= $len; $c++) { + $id = substr($e_name, 0, $c); + $this->char++; + + if(in_array($id, $this->entities)) { + if ($e_name[$c-1] !== ';') { + if ($c < $len && $e_name[$c] == ';') { + $this->char++; // consume extra semicolon + } + } + $entity = $id; + break; + } + } + + $cond = isset($entity); + // The rest of the parsing happens bellow. + break; + } + + if(!$cond) { + // If no match can be made, then this is a parse error. No + // characters are consumed, and nothing is returned. + $this->char = $start; + return false; + } + + // Return a character token for the character corresponding to the + // entity name (as given by the second column of the entities table). + return html_entity_decode('&'.$entity.';', ENT_QUOTES, 'UTF-8'); + } + + private function emitToken($token) { + $emit = $this->tree->emitToken($token); + + if(is_int($emit)) { + $this->content_model = $emit; + + } elseif($token['type'] === self::ENDTAG) { + $this->content_model = self::PCDATA; + } + } + + private function EOF() { + $this->state = null; + $this->tree->emitToken(array( + 'type' => self::EOF + )); + } +} + +class HTML5TreeConstructer { + public $stack = array(); + + private $phase; + private $mode; + private $dom; + private $foster_parent = null; + private $a_formatting = array(); + + private $head_pointer = null; + private $form_pointer = null; + + private $scoping = array('button','caption','html','marquee','object','table','td','th'); + private $formatting = array('a','b','big','em','font','i','nobr','s','small','strike','strong','tt','u'); + private $special = array('address','area','base','basefont','bgsound', + 'blockquote','body','br','center','col','colgroup','dd','dir','div','dl', + 'dt','embed','fieldset','form','frame','frameset','h1','h2','h3','h4','h5', + 'h6','head','hr','iframe','image','img','input','isindex','li','link', + 'listing','menu','meta','noembed','noframes','noscript','ol','optgroup', + 'option','p','param','plaintext','pre','script','select','spacer','style', + 'tbody','textarea','tfoot','thead','title','tr','ul','wbr'); + + // The different phases. + const INIT_PHASE = 0; + const ROOT_PHASE = 1; + const MAIN_PHASE = 2; + const END_PHASE = 3; + + // The different insertion modes for the main phase. + const BEFOR_HEAD = 0; + const IN_HEAD = 1; + const AFTER_HEAD = 2; + const IN_BODY = 3; + const IN_TABLE = 4; + const IN_CAPTION = 5; + const IN_CGROUP = 6; + const IN_TBODY = 7; + const IN_ROW = 8; + const IN_CELL = 9; + const IN_SELECT = 10; + const AFTER_BODY = 11; + const IN_FRAME = 12; + const AFTR_FRAME = 13; + + // The different types of elements. + const SPECIAL = 0; + const SCOPING = 1; + const FORMATTING = 2; + const PHRASING = 3; + + const MARKER = 0; + + public function __construct() { + $this->phase = self::INIT_PHASE; + $this->mode = self::BEFOR_HEAD; + $this->dom = new DOMDocument; + + $this->dom->encoding = 'UTF-8'; + $this->dom->preserveWhiteSpace = true; + $this->dom->substituteEntities = true; + $this->dom->strictErrorChecking = false; + } + + // Process tag tokens + public function emitToken($token) { + switch($this->phase) { + case self::INIT_PHASE: return $this->initPhase($token); break; + case self::ROOT_PHASE: return $this->rootElementPhase($token); break; + case self::MAIN_PHASE: return $this->mainPhase($token); break; + case self::END_PHASE : return $this->trailingEndPhase($token); break; + } + } + + private function initPhase($token) { + /* Initially, the tree construction stage must handle each token + emitted from the tokenisation stage as follows: */ + + /* A DOCTYPE token that is marked as being in error + A comment token + A start tag token + An end tag token + A character token that is not one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE + An end-of-file token */ + if((isset($token['error']) && $token['error']) || + $token['type'] === HTML5::COMMENT || + $token['type'] === HTML5::STARTTAG || + $token['type'] === HTML5::ENDTAG || + $token['type'] === HTML5::EOF || + ($token['type'] === HTML5::CHARACTR && isset($token['data']) && + !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))) { + /* This specification does not define how to handle this case. In + particular, user agents may ignore the entirety of this specification + altogether for such documents, and instead invoke special parse modes + with a greater emphasis on backwards compatibility. */ + + $this->phase = self::ROOT_PHASE; + return $this->rootElementPhase($token); + + /* A DOCTYPE token marked as being correct */ + } elseif(isset($token['error']) && !$token['error']) { + /* Append a DocumentType node to the Document node, with the name + attribute set to the name given in the DOCTYPE token (which will be + "HTML"), and the other attributes specific to DocumentType objects + set to null, empty lists, or the empty string as appropriate. */ + $doctype = new DOMDocumentType(null, null, 'HTML'); + + /* Then, switch to the root element phase of the tree construction + stage. */ + $this->phase = self::ROOT_PHASE; + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif(isset($token['data']) && preg_match('/^[\t\n\x0b\x0c ]+$/', + $token['data'])) { + /* Append that character to the Document node. */ + $text = $this->dom->createTextNode($token['data']); + $this->dom->appendChild($text); + } + } + + private function rootElementPhase($token) { + /* After the initial phase, as each token is emitted from the tokenisation + stage, it must be processed as described in this section. */ + + /* A DOCTYPE token */ + if($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the Document object with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->dom->appendChild($comment); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append that character to the Document node. */ + $text = $this->dom->createTextNode($token['data']); + $this->dom->appendChild($text); + + /* A character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED + (FF), or U+0020 SPACE + A start tag token + An end tag token + An end-of-file token */ + } elseif(($token['type'] === HTML5::CHARACTR && + !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || + $token['type'] === HTML5::STARTTAG || + $token['type'] === HTML5::ENDTAG || + $token['type'] === HTML5::EOF) { + /* Create an HTMLElement node with the tag name html, in the HTML + namespace. Append it to the Document object. Switch to the main + phase and reprocess the current token. */ + $html = $this->dom->createElement('html'); + $this->dom->appendChild($html); + $this->stack[] = $html; + + $this->phase = self::MAIN_PHASE; + return $this->mainPhase($token); + } + } + + private function mainPhase($token) { + /* Tokens in the main phase must be handled as follows: */ + + /* A DOCTYPE token */ + if($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A start tag token with the tag name "html" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') { + /* If this start tag token was not the first start tag token, then + it is a parse error. */ + + /* For each attribute on the token, check to see if the attribute + is already present on the top element of the stack of open elements. + If it is not, add the attribute and its corresponding value to that + element. */ + foreach($token['attr'] as $attr) { + if(!$this->stack[0]->hasAttribute($attr['name'])) { + $this->stack[0]->setAttribute($attr['name'], $attr['value']); + } + } + + /* An end-of-file token */ + } elseif($token['type'] === HTML5::EOF) { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Anything else. */ + } else { + /* Depends on the insertion mode: */ + switch($this->mode) { + case self::BEFOR_HEAD: return $this->beforeHead($token); break; + case self::IN_HEAD: return $this->inHead($token); break; + case self::AFTER_HEAD: return $this->afterHead($token); break; + case self::IN_BODY: return $this->inBody($token); break; + case self::IN_TABLE: return $this->inTable($token); break; + case self::IN_CAPTION: return $this->inCaption($token); break; + case self::IN_CGROUP: return $this->inColumnGroup($token); break; + case self::IN_TBODY: return $this->inTableBody($token); break; + case self::IN_ROW: return $this->inRow($token); break; + case self::IN_CELL: return $this->inCell($token); break; + case self::IN_SELECT: return $this->inSelect($token); break; + case self::AFTER_BODY: return $this->afterBody($token); break; + case self::IN_FRAME: return $this->inFrameset($token); break; + case self::AFTR_FRAME: return $this->afterFrameset($token); break; + case self::END_PHASE: return $this->trailingEndPhase($token); break; + } + } + } + + private function beforeHead($token) { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token with the tag name "head" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') { + /* Create an element for the token, append the new element to the + current node and push it onto the stack of open elements. */ + $element = $this->insertElement($token); + + /* Set the head element pointer to this new element node. */ + $this->head_pointer = $element; + + /* Change the insertion mode to "in head". */ + $this->mode = self::IN_HEAD; + + /* A start tag token whose tag name is one of: "base", "link", "meta", + "script", "style", "title". Or an end tag with the tag name "html". + Or a character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. Or any other start tag token */ + } elseif($token['type'] === HTML5::STARTTAG || + ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') || + ($token['type'] === HTML5::CHARACTR && !preg_match('/^[\t\n\x0b\x0c ]$/', + $token['data']))) { + /* Act as if a start tag token with the tag name "head" and no + attributes had been seen, then reprocess the current token. */ + $this->beforeHead(array( + 'name' => 'head', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + return $this->inHead($token); + + /* Any other end tag */ + } elseif($token['type'] === HTML5::ENDTAG) { + /* Parse error. Ignore the token. */ + } + } + + private function inHead($token) { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. + + THIS DIFFERS FROM THE SPEC: If the current node is either a title, style + or script element, append the character to the current node regardless + of its content. */ + if(($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || ( + $token['type'] === HTML5::CHARACTR && in_array(end($this->stack)->nodeName, + array('title', 'style', 'script')))) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + } elseif($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('title', 'style', 'script'))) { + array_pop($this->stack); + return HTML5::PCDATA; + + /* A start tag with the tag name "title" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + } else { + $element = $this->insertElement($token); + } + + /* Switch the tokeniser's content model flag to the RCDATA state. */ + return HTML5::RCDATA; + + /* A start tag with the tag name "style" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + } else { + $this->insertElement($token); + } + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + + /* A start tag with the tag name "script" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') { + /* Create an element for the token. */ + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + + /* A start tag with the tag name "base", "link", or "meta" */ + } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('base', 'link', 'meta'))) { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + array_pop($this->stack); + + } else { + $this->insertElement($token); + } + + /* An end tag with the tag name "head" */ + } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') { + /* If the current node is a head element, pop the current node off + the stack of open elements. */ + if($this->head_pointer->isSameNode(end($this->stack))) { + array_pop($this->stack); + + /* Otherwise, this is a parse error. */ + } else { + // k + } + + /* Change the insertion mode to "after head". */ + $this->mode = self::AFTER_HEAD; + + /* A start tag with the tag name "head" or an end tag except "html". */ + } elseif(($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') || + ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* If the current node is a head element, act as if an end tag + token with the tag name "head" had been seen. */ + if($this->head_pointer->isSameNode(end($this->stack))) { + $this->inHead(array( + 'name' => 'head', + 'type' => HTML5::ENDTAG + )); + + /* Otherwise, change the insertion mode to "after head". */ + } else { + $this->mode = self::AFTER_HEAD; + } + + /* Then, reprocess the current token. */ + return $this->afterHead($token); + } + } + + private function afterHead($token) { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token with the tag name "body" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') { + /* Insert a body element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in body". */ + $this->mode = self::IN_BODY; + + /* A start tag token with the tag name "frameset" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') { + /* Insert a frameset element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in frameset". */ + $this->mode = self::IN_FRAME; + + /* A start tag token whose tag name is one of: "base", "link", "meta", + "script", "style", "title" */ + } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('base', 'link', 'meta', 'script', 'style', 'title'))) { + /* Parse error. Switch the insertion mode back to "in head" and + reprocess the token. */ + $this->mode = self::IN_HEAD; + return $this->inHead($token); + + /* Anything else */ + } else { + /* Act as if a start tag token with the tag name "body" and no + attributes had been seen, and then reprocess the current token. */ + $this->afterHead(array( + 'name' => 'body', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + return $this->inBody($token); + } + } + + private function inBody($token) { + /* Handle the token as follows: */ + + switch($token['type']) { + /* A character token */ + case HTML5::CHARACTR: + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Append the token's character to the current node. */ + $this->insertText($token['data']); + break; + + /* A comment token */ + case HTML5::COMMENT: + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + break; + + case HTML5::STARTTAG: + switch($token['name']) { + /* A start tag token whose tag name is one of: "script", + "style" */ + case 'script': case 'style': + /* Process the token as if the insertion mode had been "in + head". */ + return $this->inHead($token); + break; + + /* A start tag token whose tag name is one of: "base", "link", + "meta", "title" */ + case 'base': case 'link': case 'meta': case 'title': + /* Parse error. Process the token as if the insertion mode + had been "in head". */ + return $this->inHead($token); + break; + + /* A start tag token with the tag name "body" */ + case 'body': + /* Parse error. If the second element on the stack of open + elements is not a body element, or, if the stack of open + elements has only one node on it, then ignore the token. + (innerHTML case) */ + if(count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') { + // Ignore + + /* Otherwise, for each attribute on the token, check to see + if the attribute is already present on the body element (the + second element) on the stack of open elements. If it is not, + add the attribute and its corresponding value to that + element. */ + } else { + foreach($token['attr'] as $attr) { + if(!$this->stack[1]->hasAttribute($attr['name'])) { + $this->stack[1]->setAttribute($attr['name'], $attr['value']); + } + } + } + break; + + /* A start tag whose tag name is one of: "address", + "blockquote", "center", "dir", "div", "dl", "fieldset", + "listing", "menu", "ol", "p", "ul" */ + case 'address': case 'blockquote': case 'center': case 'dir': + case 'div': case 'dl': case 'fieldset': case 'listing': + case 'menu': case 'ol': case 'p': case 'ul': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + break; + + /* A start tag whose tag name is "form" */ + case 'form': + /* If the form element pointer is not null, ignore the + token with a parse error. */ + if($this->form_pointer !== null) { + // Ignore. + + /* Otherwise: */ + } else { + /* If the stack of open elements has a p element in + scope, then act as if an end tag with the tag name p + had been seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token, and set the + form element pointer to point to the element created. */ + $element = $this->insertElement($token); + $this->form_pointer = $element; + } + break; + + /* A start tag whose tag name is "li", "dd" or "dt" */ + case 'li': case 'dd': case 'dt': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + $stack_length = count($this->stack) - 1; + + for($n = $stack_length; 0 <= $n; $n--) { + /* 1. Initialise node to be the current node (the + bottommost node of the stack). */ + $stop = false; + $node = $this->stack[$n]; + $cat = $this->getElementCategory($node->tagName); + + /* 2. If node is an li, dd or dt element, then pop all + the nodes from the current node up to node, including + node, then stop this algorithm. */ + if($token['name'] === $node->tagName || ($token['name'] !== 'li' + && ($node->tagName === 'dd' || $node->tagName === 'dt'))) { + for($x = $stack_length; $x >= $n ; $x--) { + array_pop($this->stack); + } + + break; + } + + /* 3. If node is not in the formatting category, and is + not in the phrasing category, and is not an address or + div element, then stop this algorithm. */ + if($cat !== self::FORMATTING && $cat !== self::PHRASING && + $node->tagName !== 'address' && $node->tagName !== 'div') { + break; + } + } + + /* Finally, insert an HTML element with the same tag + name as the token's. */ + $this->insertElement($token); + break; + + /* A start tag token whose tag name is "plaintext" */ + case 'plaintext': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + return HTML5::PLAINTEXT; + break; + + /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4", + "h5", "h6" */ + case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + /* If the stack of open elements has in scope an element whose + tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then + this is a parse error; pop elements from the stack until an + element with one of those tag names has been popped from the + stack. */ + while($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) { + array_pop($this->stack); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + break; + + /* A start tag whose tag name is "a" */ + case 'a': + /* If the list of active formatting elements contains + an element whose tag name is "a" between the end of the + list and the last marker on the list (or the start of + the list if there is no marker on the list), then this + is a parse error; act as if an end tag with the tag name + "a" had been seen, then remove that element from the list + of active formatting elements and the stack of open + elements if the end tag didn't already remove it (it + might not have if the element is not in table scope). */ + $leng = count($this->a_formatting); + + for($n = $leng - 1; $n >= 0; $n--) { + if($this->a_formatting[$n] === self::MARKER) { + break; + + } elseif($this->a_formatting[$n]->nodeName === 'a') { + $this->emitToken(array( + 'name' => 'a', + 'type' => HTML5::ENDTAG + )); + break; + } + } + + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $el = $this->insertElement($token); + + /* Add that element to the list of active formatting + elements. */ + $this->a_formatting[] = $el; + break; + + /* A start tag whose tag name is one of: "b", "big", "em", "font", + "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ + case 'b': case 'big': case 'em': case 'font': case 'i': + case 'nobr': case 's': case 'small': case 'strike': + case 'strong': case 'tt': case 'u': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $el = $this->insertElement($token); + + /* Add that element to the list of active formatting + elements. */ + $this->a_formatting[] = $el; + break; + + /* A start tag token whose tag name is "button" */ + case 'button': + /* If the stack of open elements has a button element in scope, + then this is a parse error; act as if an end tag with the tag + name "button" had been seen, then reprocess the token. (We don't + do that. Unnecessary.) */ + if($this->elementInScope('button')) { + $this->inBody(array( + 'name' => 'button', + 'type' => HTML5::ENDTAG + )); + } + + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + break; + + /* A start tag token whose tag name is one of: "marquee", "object" */ + case 'marquee': case 'object': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + break; + + /* A start tag token whose tag name is "xmp" */ + case 'xmp': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Switch the content model flag to the CDATA state. */ + return HTML5::CDATA; + break; + + /* A start tag whose tag name is "table" */ + case 'table': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in table". */ + $this->mode = self::IN_TABLE; + break; + + /* A start tag whose tag name is one of: "area", "basefont", + "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */ + case 'area': case 'basefont': case 'bgsound': case 'br': + case 'embed': case 'img': case 'param': case 'spacer': + case 'wbr': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "hr" */ + case 'hr': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if($this->elementInScope('p')) { + $this->emitToken(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "image" */ + case 'image': + /* Parse error. Change the token's tag name to "img" and + reprocess it. (Don't ask.) */ + $token['name'] = 'img'; + return $this->inBody($token); + break; + + /* A start tag whose tag name is "input" */ + case 'input': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an input element for the token. */ + $element = $this->insertElement($token, false); + + /* If the form element pointer is not null, then associate the + input element with the form element pointed to by the form + element pointer. */ + $this->form_pointer !== null + ? $this->form_pointer->appendChild($element) + : end($this->stack)->appendChild($element); + + /* Pop that input element off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "isindex" */ + case 'isindex': + /* Parse error. */ + // w/e + + /* If the form element pointer is not null, + then ignore the token. */ + if($this->form_pointer === null) { + /* Act as if a start tag token with the tag name "form" had + been seen. */ + $this->inBody(array( + 'name' => 'body', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + /* Act as if a start tag token with the tag name "hr" had + been seen. */ + $this->inBody(array( + 'name' => 'hr', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + /* Act as if a start tag token with the tag name "p" had + been seen. */ + $this->inBody(array( + 'name' => 'p', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + /* Act as if a start tag token with the tag name "label" + had been seen. */ + $this->inBody(array( + 'name' => 'label', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + /* Act as if a stream of character tokens had been seen. */ + $this->insertText('This is a searchable index. '. + 'Insert your search keywords here: '); + + /* Act as if a start tag token with the tag name "input" + had been seen, with all the attributes from the "isindex" + token, except with the "name" attribute set to the value + "isindex" (ignoring any explicit "name" attribute). */ + $attr = $token['attr']; + $attr[] = array('name' => 'name', 'value' => 'isindex'); + + $this->inBody(array( + 'name' => 'input', + 'type' => HTML5::STARTTAG, + 'attr' => $attr + )); + + /* Act as if a stream of character tokens had been seen + (see below for what they should say). */ + $this->insertText('This is a searchable index. '. + 'Insert your search keywords here: '); + + /* Act as if an end tag token with the tag name "label" + had been seen. */ + $this->inBody(array( + 'name' => 'label', + 'type' => HTML5::ENDTAG + )); + + /* Act as if an end tag token with the tag name "p" had + been seen. */ + $this->inBody(array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + )); + + /* Act as if a start tag token with the tag name "hr" had + been seen. */ + $this->inBody(array( + 'name' => 'hr', + 'type' => HTML5::ENDTAG + )); + + /* Act as if an end tag token with the tag name "form" had + been seen. */ + $this->inBody(array( + 'name' => 'form', + 'type' => HTML5::ENDTAG + )); + } + break; + + /* A start tag whose tag name is "textarea" */ + case 'textarea': + $this->insertElement($token); + + /* Switch the tokeniser's content model flag to the + RCDATA state. */ + return HTML5::RCDATA; + break; + + /* A start tag whose tag name is one of: "iframe", "noembed", + "noframes" */ + case 'iframe': case 'noembed': case 'noframes': + $this->insertElement($token); + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + break; + + /* A start tag whose tag name is "select" */ + case 'select': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in select". */ + $this->mode = self::IN_SELECT; + break; + + /* A start or end tag whose tag name is one of: "caption", "col", + "colgroup", "frame", "frameset", "head", "option", "optgroup", + "tbody", "td", "tfoot", "th", "thead", "tr". */ + case 'caption': case 'col': case 'colgroup': case 'frame': + case 'frameset': case 'head': case 'option': case 'optgroup': + case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead': + case 'tr': + // Parse error. Ignore the token. + break; + + /* A start or end tag whose tag name is one of: "event-source", + "section", "nav", "article", "aside", "header", "footer", + "datagrid", "command" */ + case 'event-source': case 'section': case 'nav': case 'article': + case 'aside': case 'header': case 'footer': case 'datagrid': + case 'command': + // Work in progress! + break; + + /* A start tag token not covered by the previous entries */ + default: + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + $this->insertElement($token, true, true); + break; + } + break; + + case HTML5::ENDTAG: + switch($token['name']) { + /* An end tag with the tag name "body" */ + case 'body': + /* If the second element in the stack of open elements is + not a body element, this is a parse error. Ignore the token. + (innerHTML case) */ + if(count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') { + // Ignore. + + /* If the current node is not the body element, then this + is a parse error. */ + } elseif(end($this->stack)->nodeName !== 'body') { + // Parse error. + } + + /* Change the insertion mode to "after body". */ + $this->mode = self::AFTER_BODY; + break; + + /* An end tag with the tag name "html" */ + case 'html': + /* Act as if an end tag with tag name "body" had been seen, + then, if that token wasn't ignored, reprocess the current + token. */ + $this->inBody(array( + 'name' => 'body', + 'type' => HTML5::ENDTAG + )); + + return $this->afterBody($token); + break; + + /* An end tag whose tag name is one of: "address", "blockquote", + "center", "dir", "div", "dl", "fieldset", "listing", "menu", + "ol", "pre", "ul" */ + case 'address': case 'blockquote': case 'center': case 'dir': + case 'div': case 'dl': case 'fieldset': case 'listing': + case 'menu': case 'ol': case 'pre': case 'ul': + /* If the stack of open elements has an element in scope + with the same tag name as that of the token, then generate + implied end tags. */ + if($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with + the same tag name as that of the token, then this + is a parse error. */ + // w/e + + /* If the stack of open elements has an element in + scope with the same tag name as that of the token, + then pop elements from this stack until an element + with that tag name has been popped from the stack. */ + for($n = count($this->stack) - 1; $n >= 0; $n--) { + if($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is "form" */ + case 'form': + /* If the stack of open elements has an element in scope + with the same tag name as that of the token, then generate + implied end tags. */ + if($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + } + + if(end($this->stack)->nodeName !== $token['name']) { + /* Now, if the current node is not an element with the + same tag name as that of the token, then this is a parse + error. */ + // w/e + + } else { + /* Otherwise, if the current node is an element with + the same tag name as that of the token pop that element + from the stack. */ + array_pop($this->stack); + } + + /* In any case, set the form element pointer to null. */ + $this->form_pointer = null; + break; + + /* An end tag whose tag name is "p" */ + case 'p': + /* If the stack of open elements has a p element in scope, + then generate implied end tags, except for p elements. */ + if($this->elementInScope('p')) { + $this->generateImpliedEndTags(array('p')); + + /* If the current node is not a p element, then this is + a parse error. */ + // k + + /* If the stack of open elements has a p element in + scope, then pop elements from this stack until the stack + no longer has a p element in scope. */ + for($n = count($this->stack) - 1; $n >= 0; $n--) { + if($this->elementInScope('p')) { + array_pop($this->stack); + + } else { + break; + } + } + } + break; + + /* An end tag whose tag name is "dd", "dt", or "li" */ + case 'dd': case 'dt': case 'li': + /* If the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then + generate implied end tags, except for elements with the + same tag name as the token. */ + if($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(array($token['name'])); + + /* If the current node is not an element with the same + tag name as the token, then this is a parse error. */ + // w/e + + /* If the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then + pop elements from this stack until an element with that + tag name has been popped from the stack. */ + for($n = count($this->stack) - 1; $n >= 0; $n--) { + if($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4", + "h5", "h6" */ + case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': + $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); + + /* If the stack of open elements has in scope an element whose + tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then + generate implied end tags. */ + if($this->elementInScope($elements)) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with the same + tag name as that of the token, then this is a parse error. */ + // w/e + + /* If the stack of open elements has in scope an element + whose tag name is one of "h1", "h2", "h3", "h4", "h5", or + "h6", then pop elements from the stack until an element + with one of those tag names has been popped from the stack. */ + while($this->elementInScope($elements)) { + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is one of: "a", "b", "big", "em", + "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ + case 'a': case 'b': case 'big': case 'em': case 'font': + case 'i': case 'nobr': case 's': case 'small': case 'strike': + case 'strong': case 'tt': case 'u': + /* 1. Let the formatting element be the last element in + the list of active formatting elements that: + * is between the end of the list and the last scope + marker in the list, if any, or the start of the list + otherwise, and + * has the same tag name as the token. + */ + while(true) { + for($a = count($this->a_formatting) - 1; $a >= 0; $a--) { + if($this->a_formatting[$a] === self::MARKER) { + break; + + } elseif($this->a_formatting[$a]->tagName === $token['name']) { + $formatting_element = $this->a_formatting[$a]; + $in_stack = in_array($formatting_element, $this->stack, true); + $fe_af_pos = $a; + break; + } + } + + /* If there is no such node, or, if that node is + also in the stack of open elements but the element + is not in scope, then this is a parse error. Abort + these steps. The token is ignored. */ + if(!isset($formatting_element) || ($in_stack && + !$this->elementInScope($token['name']))) { + break; + + /* Otherwise, if there is such a node, but that node + is not in the stack of open elements, then this is a + parse error; remove the element from the list, and + abort these steps. */ + } elseif(isset($formatting_element) && !$in_stack) { + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + break; + } + + /* 2. Let the furthest block be the topmost node in the + stack of open elements that is lower in the stack + than the formatting element, and is not an element in + the phrasing or formatting categories. There might + not be one. */ + $fe_s_pos = array_search($formatting_element, $this->stack, true); + $length = count($this->stack); + + for($s = $fe_s_pos + 1; $s < $length; $s++) { + $category = $this->getElementCategory($this->stack[$s]->nodeName); + + if($category !== self::PHRASING && $category !== self::FORMATTING) { + $furthest_block = $this->stack[$s]; + } + } + + /* 3. If there is no furthest block, then the UA must + skip the subsequent steps and instead just pop all + the nodes from the bottom of the stack of open + elements, from the current node up to the formatting + element, and remove the formatting element from the + list of active formatting elements. */ + if(!isset($furthest_block)) { + for($n = $length - 1; $n >= $fe_s_pos; $n--) { + array_pop($this->stack); + } + + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + break; + } + + /* 4. Let the common ancestor be the element + immediately above the formatting element in the stack + of open elements. */ + $common_ancestor = $this->stack[$fe_s_pos - 1]; + + /* 5. If the furthest block has a parent node, then + remove the furthest block from its parent node. */ + if($furthest_block->parentNode !== null) { + $furthest_block->parentNode->removeChild($furthest_block); + } + + /* 6. Let a bookmark note the position of the + formatting element in the list of active formatting + elements relative to the elements on either side + of it in the list. */ + $bookmark = $fe_af_pos; + + /* 7. Let node and last node be the furthest block. + Follow these steps: */ + $node = $furthest_block; + $last_node = $furthest_block; + + while(true) { + for($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) { + /* 7.1 Let node be the element immediately + prior to node in the stack of open elements. */ + $node = $this->stack[$n]; + + /* 7.2 If node is not in the list of active + formatting elements, then remove node from + the stack of open elements and then go back + to step 1. */ + if(!in_array($node, $this->a_formatting, true)) { + unset($this->stack[$n]); + $this->stack = array_merge($this->stack); + + } else { + break; + } + } + + /* 7.3 Otherwise, if node is the formatting + element, then go to the next step in the overall + algorithm. */ + if($node === $formatting_element) { + break; + + /* 7.4 Otherwise, if last node is the furthest + block, then move the aforementioned bookmark to + be immediately after the node in the list of + active formatting elements. */ + } elseif($last_node === $furthest_block) { + $bookmark = array_search($node, $this->a_formatting, true) + 1; + } + + /* 7.5 If node has any children, perform a + shallow clone of node, replace the entry for + node in the list of active formatting elements + with an entry for the clone, replace the entry + for node in the stack of open elements with an + entry for the clone, and let node be the clone. */ + if($node->hasChildNodes()) { + $clone = $node->cloneNode(); + $s_pos = array_search($node, $this->stack, true); + $a_pos = array_search($node, $this->a_formatting, true); + + $this->stack[$s_pos] = $clone; + $this->a_formatting[$a_pos] = $clone; + $node = $clone; + } + + /* 7.6 Insert last node into node, first removing + it from its previous parent node if any. */ + if($last_node->parentNode !== null) { + $last_node->parentNode->removeChild($last_node); + } + + $node->appendChild($last_node); + + /* 7.7 Let last node be node. */ + $last_node = $node; + } + + /* 8. Insert whatever last node ended up being in + the previous step into the common ancestor node, + first removing it from its previous parent node if + any. */ + if($last_node->parentNode !== null) { + $last_node->parentNode->removeChild($last_node); + } + + $common_ancestor->appendChild($last_node); + + /* 9. Perform a shallow clone of the formatting + element. */ + $clone = $formatting_element->cloneNode(); + + /* 10. Take all of the child nodes of the furthest + block and append them to the clone created in the + last step. */ + while($furthest_block->hasChildNodes()) { + $child = $furthest_block->firstChild; + $furthest_block->removeChild($child); + $clone->appendChild($child); + } + + /* 11. Append that clone to the furthest block. */ + $furthest_block->appendChild($clone); + + /* 12. Remove the formatting element from the list + of active formatting elements, and insert the clone + into the list of active formatting elements at the + position of the aforementioned bookmark. */ + $fe_af_pos = array_search($formatting_element, $this->a_formatting, true); + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + + $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1); + $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting)); + $this->a_formatting = array_merge($af_part1, array($clone), $af_part2); + + /* 13. Remove the formatting element from the stack + of open elements, and insert the clone into the stack + of open elements immediately after (i.e. in a more + deeply nested position than) the position of the + furthest block in that stack. */ + $fe_s_pos = array_search($formatting_element, $this->stack, true); + $fb_s_pos = array_search($furthest_block, $this->stack, true); + unset($this->stack[$fe_s_pos]); + + $s_part1 = array_slice($this->stack, 0, $fb_s_pos); + $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack)); + $this->stack = array_merge($s_part1, array($clone), $s_part2); + + /* 14. Jump back to step 1 in this series of steps. */ + unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block); + } + break; + + /* An end tag token whose tag name is one of: "button", + "marquee", "object" */ + case 'button': case 'marquee': case 'object': + /* If the stack of open elements has an element in scope whose + tag name matches the tag name of the token, then generate implied + tags. */ + if($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with the same + tag name as the token, then this is a parse error. */ + // k + + /* Now, if the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then pop + elements from the stack until that element has been popped from + the stack, and clear the list of active formatting elements up + to the last marker. */ + for($n = count($this->stack) - 1; $n >= 0; $n--) { + if($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + + $marker = end(array_keys($this->a_formatting, self::MARKER, true)); + + for($n = count($this->a_formatting) - 1; $n > $marker; $n--) { + array_pop($this->a_formatting); + } + } + break; + + /* Or an end tag whose tag name is one of: "area", "basefont", + "bgsound", "br", "embed", "hr", "iframe", "image", "img", + "input", "isindex", "noembed", "noframes", "param", "select", + "spacer", "table", "textarea", "wbr" */ + case 'area': case 'basefont': case 'bgsound': case 'br': + case 'embed': case 'hr': case 'iframe': case 'image': + case 'img': case 'input': case 'isindex': case 'noembed': + case 'noframes': case 'param': case 'select': case 'spacer': + case 'table': case 'textarea': case 'wbr': + // Parse error. Ignore the token. + break; + + /* An end tag token not covered by the previous entries */ + default: + for($n = count($this->stack) - 1; $n >= 0; $n--) { + /* Initialise node to be the current node (the bottommost + node of the stack). */ + $node = end($this->stack); + + /* If node has the same tag name as the end tag token, + then: */ + if($token['name'] === $node->nodeName) { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* If the tag name of the end tag token does not + match the tag name of the current node, this is a + parse error. */ + // k + + /* Pop all the nodes from the current node up to + node, including node, then stop this algorithm. */ + for($x = count($this->stack) - $n; $x >= $n; $x--) { + array_pop($this->stack); + } + + } else { + $category = $this->getElementCategory($node); + + if($category !== self::SPECIAL && $category !== self::SCOPING) { + /* Otherwise, if node is in neither the formatting + category nor the phrasing category, then this is a + parse error. Stop this algorithm. The end tag token + is ignored. */ + return false; + } + } + } + break; + } + break; + } + } + + private function inTable($token) { + $clear = array('html', 'table'); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append the character to the current node. */ + $text = $this->dom->createTextNode($token['data']); + end($this->stack)->appendChild($text); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + end($this->stack)->appendChild($comment); + + /* A start tag whose tag name is "caption" */ + } elseif($token['type'] === HTML5::STARTTAG && + $token['name'] === 'caption') { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + + /* Insert an HTML element for the token, then switch the + insertion mode to "in caption". */ + $this->insertElement($token); + $this->mode = self::IN_CAPTION; + + /* A start tag whose tag name is "colgroup" */ + } elseif($token['type'] === HTML5::STARTTAG && + $token['name'] === 'colgroup') { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the + insertion mode to "in column group". */ + $this->insertElement($token); + $this->mode = self::IN_CGROUP; + + /* A start tag whose tag name is "col" */ + } elseif($token['type'] === HTML5::STARTTAG && + $token['name'] === 'col') { + $this->inTable(array( + 'name' => 'colgroup', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + $this->inColumnGroup($token); + + /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('tbody', 'tfoot', 'thead'))) { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the insertion + mode to "in table body". */ + $this->insertElement($token); + $this->mode = self::IN_TBODY; + + /* A start tag whose tag name is one of: "td", "th", "tr" */ + } elseif($token['type'] === HTML5::STARTTAG && + in_array($token['name'], array('td', 'th', 'tr'))) { + /* Act as if a start tag token with the tag name "tbody" had been + seen, then reprocess the current token. */ + $this->inTable(array( + 'name' => 'tbody', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + return $this->inTableBody($token); + + /* A start tag whose tag name is "table" */ + } elseif($token['type'] === HTML5::STARTTAG && + $token['name'] === 'table') { + /* Parse error. Act as if an end tag token with the tag name "table" + had been seen, then, if that token wasn't ignored, reprocess the + current token. */ + $this->inTable(array( + 'name' => 'table', + 'type' => HTML5::ENDTAG + )); + + return $this->mainPhase($token); + + /* An end tag whose tag name is "table" */ + } elseif($token['type'] === HTML5::ENDTAG && + $token['name'] === 'table') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if(!$this->elementInScope($token['name'], true)) { + return false; + + /* Otherwise: */ + } else { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Now, if the current node is not a table element, then this + is a parse error. */ + // w/e + + /* Pop elements from this stack until a table element has been + popped from the stack. */ + while(true) { + $current = end($this->stack)->nodeName; + array_pop($this->stack); + + if($current === 'table') { + break; + } + } + + /* Reset the insertion mode appropriately. */ + $this->resetInsertionMode(); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], + array('body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td', + 'tfoot', 'th', 'thead', 'tr'))) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* Parse error. Process the token as if the insertion mode was "in + body", with the following exception: */ + + /* If the current node is a table, tbody, tfoot, thead, or tr + element, then, whenever a node would be inserted into the current + node, it must instead be inserted into the foster parent element. */ + if(in_array(end($this->stack)->nodeName, + array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { + /* The foster parent element is the parent element of the last + table element in the stack of open elements, if there is a + table element and it has such a parent element. If there is no + table element in the stack of open elements (innerHTML case), + then the foster parent element is the first element in the + stack of open elements (the html element). Otherwise, if there + is a table element in the stack of open elements, but the last + table element in the stack of open elements has no parent, or + its parent node is not an element, then the foster parent + element is the element before the last table element in the + stack of open elements. */ + for($n = count($this->stack) - 1; $n >= 0; $n--) { + if($this->stack[$n]->nodeName === 'table') { + $table = $this->stack[$n]; + break; + } + } + + if(isset($table) && $table->parentNode !== null) { + $this->foster_parent = $table->parentNode; + + } elseif(!isset($table)) { + $this->foster_parent = $this->stack[0]; + + } elseif(isset($table) && ($table->parentNode === null || + $table->parentNode->nodeType !== XML_ELEMENT_NODE)) { + $this->foster_parent = $this->stack[$n - 1]; + } + } + + $this->inBody($token); + } + } + + private function inCaption($token) { + /* An end tag whose tag name is "caption" */ + if($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if(!$this->elementInScope($token['name'], true)) { + // Ignore + + /* Otherwise: */ + } else { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Now, if the current node is not a caption element, then this + is a parse error. */ + // w/e + + /* Pop elements from this stack until a caption element has + been popped from the stack. */ + while(true) { + $node = end($this->stack)->nodeName; + array_pop($this->stack); + + if($node === 'caption') { + break; + } + } + + /* Clear the list of active formatting elements up to the last + marker. */ + $this->clearTheActiveFormattingElementsUpToTheLastMarker(); + + /* Switch the insertion mode to "in table". */ + $this->mode = self::IN_TABLE; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag + name is "table" */ + } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', + 'thead', 'tr'))) || ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'table')) { + /* Parse error. Act as if an end tag with the tag name "caption" + had been seen, then, if that token wasn't ignored, reprocess the + current token. */ + $this->inCaption(array( + 'name' => 'caption', + 'type' => HTML5::ENDTAG + )); + + return $this->inTable($token); + + /* An end tag whose tag name is one of: "body", "col", "colgroup", + "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], + array('body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th', + 'thead', 'tr'))) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in body". */ + $this->inBody($token); + } + } + + private function inColumnGroup($token) { + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append the character to the current node. */ + $text = $this->dom->createTextNode($token['data']); + end($this->stack)->appendChild($text); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + end($this->stack)->appendChild($comment); + + /* A start tag whose tag name is "col" */ + } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') { + /* Insert a col element for the token. Immediately pop the current + node off the stack of open elements. */ + $this->insertElement($token); + array_pop($this->stack); + + /* An end tag whose tag name is "colgroup" */ + } elseif($token['type'] === HTML5::ENDTAG && + $token['name'] === 'colgroup') { + /* If the current node is the root html element, then this is a + parse error, ignore the token. (innerHTML case) */ + if(end($this->stack)->nodeName === 'html') { + // Ignore + + /* Otherwise, pop the current node (which will be a colgroup + element) from the stack of open elements. Switch the insertion + mode to "in table". */ + } else { + array_pop($this->stack); + $this->mode = self::IN_TABLE; + } + + /* An end tag whose tag name is "col" */ + } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Act as if an end tag with the tag name "colgroup" had been seen, + and then, if that token wasn't ignored, reprocess the current token. */ + $this->inColumnGroup(array( + 'name' => 'colgroup', + 'type' => HTML5::ENDTAG + )); + + return $this->inTable($token); + } + } + + private function inTableBody($token) { + $clear = array('tbody', 'tfoot', 'thead', 'html'); + + /* A start tag whose tag name is "tr" */ + if($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Insert a tr element for the token, then switch the insertion + mode to "in row". */ + $this->insertElement($token); + $this->mode = self::IN_ROW; + + /* A start tag whose tag name is one of: "th", "td" */ + } elseif($token['type'] === HTML5::STARTTAG && + ($token['name'] === 'th' || $token['name'] === 'td')) { + /* Parse error. Act as if a start tag with the tag name "tr" had + been seen, then reprocess the current token. */ + $this->inTableBody(array( + 'name' => 'tr', + 'type' => HTML5::STARTTAG, + 'attr' => array() + )); + + return $this->inRow($token); + + /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. */ + if(!$this->elementInScope($token['name'], true)) { + // Ignore + + /* Otherwise: */ + } else { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Pop the current node from the stack of open elements. Switch + the insertion mode to "in table". */ + array_pop($this->stack); + $this->mode = self::IN_TABLE; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */ + } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead'))) || + ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')) { + /* If the stack of open elements does not have a tbody, thead, or + tfoot element in table scope, this is a parse error. Ignore the + token. (innerHTML case) */ + if(!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Act as if an end tag with the same tag name as the current + node ("tbody", "tfoot", or "thead") had been seen, then + reprocess the current token. */ + $this->inTableBody(array( + 'name' => end($this->stack)->nodeName, + 'type' => HTML5::ENDTAG + )); + + return $this->mainPhase($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "td", "th", "tr" */ + } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], + array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in table". */ + $this->inTable($token); + } + } + + private function inRow($token) { + $clear = array('tr', 'html'); + + /* A start tag whose tag name is one of: "th", "td" */ + if($token['type'] === HTML5::STARTTAG && + ($token['name'] === 'th' || $token['name'] === 'td')) { + /* Clear the stack back to a table row context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the insertion + mode to "in cell". */ + $this->insertElement($token); + $this->mode = self::IN_CELL; + + /* Insert a marker at the end of the list of active formatting + elements. */ + $this->a_formatting[] = self::MARKER; + + /* An end tag whose tag name is "tr" */ + } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if(!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Clear the stack back to a table row context. */ + $this->clearStackToTableContext($clear); + + /* Pop the current node (which will be a tr element) from the + stack of open elements. Switch the insertion mode to "in table + body". */ + array_pop($this->stack); + $this->mode = self::IN_TBODY; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */ + } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'))) { + /* Act as if an end tag with the tag name "tr" had been seen, then, + if that token wasn't ignored, reprocess the current token. */ + $this->inRow(array( + 'name' => 'tr', + 'type' => HTML5::ENDTAG + )); + + return $this->inCell($token); + + /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. */ + if(!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Otherwise, act as if an end tag with the tag name "tr" had + been seen, then reprocess the current token. */ + $this->inRow(array( + 'name' => 'tr', + 'type' => HTML5::ENDTAG + )); + + return $this->inCell($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "td", "th" */ + } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], + array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in table". */ + $this->inTable($token); + } + } + + private function inCell($token) { + /* An end tag whose tag name is one of: "td", "th" */ + if($token['type'] === HTML5::ENDTAG && + ($token['name'] === 'td' || $token['name'] === 'th')) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as that of the token, then this is a + parse error and the token must be ignored. */ + if(!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Generate implied end tags, except for elements with the same + tag name as the token. */ + $this->generateImpliedEndTags(array($token['name'])); + + /* Now, if the current node is not an element with the same tag + name as the token, then this is a parse error. */ + // k + + /* Pop elements from this stack until an element with the same + tag name as the token has been popped from the stack. */ + while(true) { + $node = end($this->stack)->nodeName; + array_pop($this->stack); + + if($node === $token['name']) { + break; + } + } + + /* Clear the list of active formatting elements up to the last + marker. */ + $this->clearTheActiveFormattingElementsUpToTheLastMarker(); + + /* Switch the insertion mode to "in row". (The current node + will be a tr element at this point.) */ + $this->mode = self::IN_ROW; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', + 'thead', 'tr'))) { + /* If the stack of open elements does not have a td or th element + in table scope, then this is a parse error; ignore the token. + (innerHTML case) */ + if(!$this->elementInScope(array('td', 'th'), true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', + 'thead', 'tr'))) { + /* If the stack of open elements does not have a td or th element + in table scope, then this is a parse error; ignore the token. + (innerHTML case) */ + if(!$this->elementInScope(array('td', 'th'), true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html" */ + } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], + array('body', 'caption', 'col', 'colgroup', 'html'))) { + /* Parse error. Ignore the token. */ + + /* An end tag whose tag name is one of: "table", "tbody", "tfoot", + "thead", "tr" */ + } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], + array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as that of the token (which can only + happen for "tbody", "tfoot" and "thead", or, in the innerHTML case), + then this is a parse error and the token must be ignored. */ + if(!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in body". */ + $this->inBody($token); + } + } + + private function inSelect($token) { + /* Handle the token as follows: */ + + /* A character token */ + if($token['type'] === HTML5::CHARACTR) { + /* Append the token's character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token whose tag name is "option" */ + } elseif($token['type'] === HTML5::STARTTAG && + $token['name'] === 'option') { + /* If the current node is an option element, act as if an end tag + with the tag name "option" had been seen. */ + if(end($this->stack)->nodeName === 'option') { + $this->inSelect(array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* A start tag token whose tag name is "optgroup" */ + } elseif($token['type'] === HTML5::STARTTAG && + $token['name'] === 'optgroup') { + /* If the current node is an option element, act as if an end tag + with the tag name "option" had been seen. */ + if(end($this->stack)->nodeName === 'option') { + $this->inSelect(array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + )); + } + + /* If the current node is an optgroup element, act as if an end tag + with the tag name "optgroup" had been seen. */ + if(end($this->stack)->nodeName === 'optgroup') { + $this->inSelect(array( + 'name' => 'optgroup', + 'type' => HTML5::ENDTAG + )); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* An end tag token whose tag name is "optgroup" */ + } elseif($token['type'] === HTML5::ENDTAG && + $token['name'] === 'optgroup') { + /* First, if the current node is an option element, and the node + immediately before it in the stack of open elements is an optgroup + element, then act as if an end tag with the tag name "option" had + been seen. */ + $elements_in_stack = count($this->stack); + + if($this->stack[$elements_in_stack - 1]->nodeName === 'option' && + $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup') { + $this->inSelect(array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + )); + } + + /* If the current node is an optgroup element, then pop that node + from the stack of open elements. Otherwise, this is a parse error, + ignore the token. */ + if($this->stack[$elements_in_stack - 1] === 'optgroup') { + array_pop($this->stack); + } + + /* An end tag token whose tag name is "option" */ + } elseif($token['type'] === HTML5::ENDTAG && + $token['name'] === 'option') { + /* If the current node is an option element, then pop that node + from the stack of open elements. Otherwise, this is a parse error, + ignore the token. */ + if(end($this->stack)->nodeName === 'option') { + array_pop($this->stack); + } + + /* An end tag whose tag name is "select" */ + } elseif($token['type'] === HTML5::ENDTAG && + $token['name'] === 'select') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if(!$this->elementInScope($token['name'], true)) { + // w/e + + /* Otherwise: */ + } else { + /* Pop elements from the stack of open elements until a select + element has been popped from the stack. */ + while(true) { + $current = end($this->stack)->nodeName; + array_pop($this->stack); + + if($current === 'select') { + break; + } + } + + /* Reset the insertion mode appropriately. */ + $this->resetInsertionMode(); + } + + /* A start tag whose tag name is "select" */ + } elseif($token['name'] === 'select' && + $token['type'] === HTML5::STARTTAG) { + /* Parse error. Act as if the token had been an end tag with the + tag name "select" instead. */ + $this->inSelect(array( + 'name' => 'select', + 'type' => HTML5::ENDTAG + )); + + /* An end tag whose tag name is one of: "caption", "table", "tbody", + "tfoot", "thead", "tr", "td", "th" */ + } elseif(in_array($token['name'], array('caption', 'table', 'tbody', + 'tfoot', 'thead', 'tr', 'td', 'th')) && $token['type'] === HTML5::ENDTAG) { + /* Parse error. */ + // w/e + + /* If the stack of open elements has an element in table scope with + the same tag name as that of the token, then act as if an end tag + with the tag name "select" had been seen, and reprocess the token. + Otherwise, ignore the token. */ + if($this->elementInScope($token['name'], true)) { + $this->inSelect(array( + 'name' => 'select', + 'type' => HTML5::ENDTAG + )); + + $this->mainPhase($token); + } + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function afterBody($token) { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Process the token as it would be processed if the insertion mode + was "in body". */ + $this->inBody($token); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the first element in the stack of open + elements (the html element), with the data attribute set to the + data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->stack[0]->appendChild($comment); + + /* An end tag with the tag name "html" */ + } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') { + /* If the parser was originally created in order to handle the + setting of an element's innerHTML attribute, this is a parse error; + ignore the token. (The element will be an html element in this + case.) (innerHTML case) */ + + /* Otherwise, switch to the trailing end phase. */ + $this->phase = self::END_PHASE; + + /* Anything else */ + } else { + /* Parse error. Set the insertion mode to "in body" and reprocess + the token. */ + $this->mode = self::IN_BODY; + return $this->inBody($token); + } + } + + private function inFrameset($token) { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag with the tag name "frameset" */ + } elseif($token['name'] === 'frameset' && + $token['type'] === HTML5::STARTTAG) { + $this->insertElement($token); + + /* An end tag with the tag name "frameset" */ + } elseif($token['name'] === 'frameset' && + $token['type'] === HTML5::ENDTAG) { + /* If the current node is the root html element, then this is a + parse error; ignore the token. (innerHTML case) */ + if(end($this->stack)->nodeName === 'html') { + // Ignore + + } else { + /* Otherwise, pop the current node from the stack of open + elements. */ + array_pop($this->stack); + + /* If the parser was not originally created in order to handle + the setting of an element's innerHTML attribute (innerHTML case), + and the current node is no longer a frameset element, then change + the insertion mode to "after frameset". */ + $this->mode = self::AFTR_FRAME; + } + + /* A start tag with the tag name "frame" */ + } elseif($token['name'] === 'frame' && + $token['type'] === HTML5::STARTTAG) { + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + + /* A start tag with the tag name "noframes" */ + } elseif($token['name'] === 'noframes' && + $token['type'] === HTML5::STARTTAG) { + /* Process the token as if the insertion mode had been "in body". */ + $this->inBody($token); + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function afterFrameset($token) { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ + if($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* An end tag with the tag name "html" */ + } elseif($token['name'] === 'html' && + $token['type'] === HTML5::ENDTAG) { + /* Switch to the trailing end phase. */ + $this->phase = self::END_PHASE; + + /* A start tag with the tag name "noframes" */ + } elseif($token['name'] === 'noframes' && + $token['type'] === HTML5::STARTTAG) { + /* Process the token as if the insertion mode had been "in body". */ + $this->inBody($token); + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function trailingEndPhase($token) { + /* After the main phase, as each token is emitted from the tokenisation + stage, it must be processed as described in this section. */ + + /* A DOCTYPE token */ + if($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A comment token */ + } elseif($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the Document object with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->dom->appendChild($comment); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { + /* Process the token as it would be processed in the main phase. */ + $this->mainPhase($token); + + /* A character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. Or a start tag token. Or an end tag token. */ + } elseif(($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || + $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG) { + /* Parse error. Switch back to the main phase and reprocess the + token. */ + $this->phase = self::MAIN_PHASE; + return $this->mainPhase($token); + + /* An end-of-file token */ + } elseif($token['type'] === HTML5::EOF) { + /* OMG DONE!! */ + } + } + + private function insertElement($token, $append = true, $check = false) { + // Proprietary workaround for libxml2's limitations with tag names + if ($check) { + // Slightly modified HTML5 tag-name modification, + // removing anything that's not an ASCII letter, digit, or hyphen + $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']); + // Remove leading hyphens and numbers + $token['name'] = ltrim($token['name'], '-0..9'); + // In theory, this should ever be needed, but just in case + if ($token['name'] === '') $token['name'] = 'span'; // arbitrary generic choice + } + + $el = $this->dom->createElement($token['name']); + + foreach($token['attr'] as $attr) { + if(!$el->hasAttribute($attr['name'])) { + $el->setAttribute($attr['name'], $attr['value']); + } + } + + $this->appendToRealParent($el); + $this->stack[] = $el; + + return $el; + } + + private function insertText($data) { + $text = $this->dom->createTextNode($data); + $this->appendToRealParent($text); + } + + private function insertComment($data) { + $comment = $this->dom->createComment($data); + $this->appendToRealParent($comment); + } + + private function appendToRealParent($node) { + if($this->foster_parent === null) { + end($this->stack)->appendChild($node); + + } elseif($this->foster_parent !== null) { + /* If the foster parent element is the parent element of the + last table element in the stack of open elements, then the new + node must be inserted immediately before the last table element + in the stack of open elements in the foster parent element; + otherwise, the new node must be appended to the foster parent + element. */ + for($n = count($this->stack) - 1; $n >= 0; $n--) { + if($this->stack[$n]->nodeName === 'table' && + $this->stack[$n]->parentNode !== null) { + $table = $this->stack[$n]; + break; + } + } + + if(isset($table) && $this->foster_parent->isSameNode($table->parentNode)) + $this->foster_parent->insertBefore($node, $table); + else + $this->foster_parent->appendChild($node); + + $this->foster_parent = null; + } + } + + private function elementInScope($el, $table = false) { + if(is_array($el)) { + foreach($el as $element) { + if($this->elementInScope($element, $table)) { + return true; + } + } + + return false; + } + + $leng = count($this->stack); + + for($n = 0; $n < $leng; $n++) { + /* 1. Initialise node to be the current node (the bottommost node of + the stack). */ + $node = $this->stack[$leng - 1 - $n]; + + if($node->tagName === $el) { + /* 2. If node is the target node, terminate in a match state. */ + return true; + + } elseif($node->tagName === 'table') { + /* 3. Otherwise, if node is a table element, terminate in a failure + state. */ + return false; + + } elseif($table === true && in_array($node->tagName, array('caption', 'td', + 'th', 'button', 'marquee', 'object'))) { + /* 4. Otherwise, if the algorithm is the "has an element in scope" + variant (rather than the "has an element in table scope" variant), + and node is one of the following, terminate in a failure state. */ + return false; + + } elseif($node === $node->ownerDocument->documentElement) { + /* 5. Otherwise, if node is an html element (root element), terminate + in a failure state. (This can only happen if the node is the topmost + node of the stack of open elements, and prevents the next step from + being invoked if there are no more elements in the stack.) */ + return false; + } + + /* Otherwise, set node to the previous entry in the stack of open + elements and return to step 2. (This will never fail, since the loop + will always terminate in the previous step if the top of the stack + is reached.) */ + } + } + + private function reconstructActiveFormattingElements() { + /* 1. If there are no entries in the list of active formatting elements, + then there is nothing to reconstruct; stop this algorithm. */ + $formatting_elements = count($this->a_formatting); + + if($formatting_elements === 0) { + return false; + } + + /* 3. Let entry be the last (most recently added) element in the list + of active formatting elements. */ + $entry = end($this->a_formatting); + + /* 2. If the last (most recently added) entry in the list of active + formatting elements is a marker, or if it is an element that is in the + stack of open elements, then there is nothing to reconstruct; stop this + algorithm. */ + if($entry === self::MARKER || in_array($entry, $this->stack, true)) { + return false; + } + + for($a = $formatting_elements - 1; $a >= 0; true) { + /* 4. If there are no entries before entry in the list of active + formatting elements, then jump to step 8. */ + if($a === 0) { + $step_seven = false; + break; + } + + /* 5. Let entry be the entry one earlier than entry in the list of + active formatting elements. */ + $a--; + $entry = $this->a_formatting[$a]; + + /* 6. If entry is neither a marker nor an element that is also in + thetack of open elements, go to step 4. */ + if($entry === self::MARKER || in_array($entry, $this->stack, true)) { + break; + } + } + + while(true) { + /* 7. Let entry be the element one later than entry in the list of + active formatting elements. */ + if(isset($step_seven) && $step_seven === true) { + $a++; + $entry = $this->a_formatting[$a]; + } + + /* 8. Perform a shallow clone of the element entry to obtain clone. */ + $clone = $entry->cloneNode(); + + /* 9. Append clone to the current node and push it onto the stack + of open elements so that it is the new current node. */ + end($this->stack)->appendChild($clone); + $this->stack[] = $clone; + + /* 10. Replace the entry for entry in the list with an entry for + clone. */ + $this->a_formatting[$a] = $clone; + + /* 11. If the entry for clone in the list of active formatting + elements is not the last entry in the list, return to step 7. */ + if(end($this->a_formatting) !== $clone) { + $step_seven = true; + } else { + break; + } + } + } + + private function clearTheActiveFormattingElementsUpToTheLastMarker() { + /* When the steps below require the UA to clear the list of active + formatting elements up to the last marker, the UA must perform the + following steps: */ + + while(true) { + /* 1. Let entry be the last (most recently added) entry in the list + of active formatting elements. */ + $entry = end($this->a_formatting); + + /* 2. Remove entry from the list of active formatting elements. */ + array_pop($this->a_formatting); + + /* 3. If entry was a marker, then stop the algorithm at this point. + The list has been cleared up to the last marker. */ + if($entry === self::MARKER) { + break; + } + } + } + + private function generateImpliedEndTags($exclude = array()) { + /* When the steps below require the UA to generate implied end tags, + then, if the current node is a dd element, a dt element, an li element, + a p element, a td element, a th element, or a tr element, the UA must + act as if an end tag with the respective tag name had been seen and + then generate implied end tags again. */ + $node = end($this->stack); + $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude); + + while(in_array(end($this->stack)->nodeName, $elements)) { + array_pop($this->stack); + } + } + + private function getElementCategory($node) { + $name = $node->tagName; + if(in_array($name, $this->special)) + return self::SPECIAL; + + elseif(in_array($name, $this->scoping)) + return self::SCOPING; + + elseif(in_array($name, $this->formatting)) + return self::FORMATTING; + + else + return self::PHRASING; + } + + private function clearStackToTableContext($elements) { + /* When the steps above require the UA to clear the stack back to a + table context, it means that the UA must, while the current node is not + a table element or an html element, pop elements from the stack of open + elements. If this causes any elements to be popped from the stack, then + this is a parse error. */ + while(true) { + $node = end($this->stack)->nodeName; + + if(in_array($node, $elements)) { + break; + } else { + array_pop($this->stack); + } + } + } + + private function resetInsertionMode() { + /* 1. Let last be false. */ + $last = false; + $leng = count($this->stack); + + for($n = $leng - 1; $n >= 0; $n--) { + /* 2. Let node be the last node in the stack of open elements. */ + $node = $this->stack[$n]; + + /* 3. If node is the first node in the stack of open elements, then + set last to true. If the element whose innerHTML attribute is being + set is neither a td element nor a th element, then set node to the + element whose innerHTML attribute is being set. (innerHTML case) */ + if($this->stack[0]->isSameNode($node)) { + $last = true; + } + + /* 4. If node is a select element, then switch the insertion mode to + "in select" and abort these steps. (innerHTML case) */ + if($node->nodeName === 'select') { + $this->mode = self::IN_SELECT; + break; + + /* 5. If node is a td or th element, then switch the insertion mode + to "in cell" and abort these steps. */ + } elseif($node->nodeName === 'td' || $node->nodeName === 'th') { + $this->mode = self::IN_CELL; + break; + + /* 6. If node is a tr element, then switch the insertion mode to + "in row" and abort these steps. */ + } elseif($node->nodeName === 'tr') { + $this->mode = self::IN_ROW; + break; + + /* 7. If node is a tbody, thead, or tfoot element, then switch the + insertion mode to "in table body" and abort these steps. */ + } elseif(in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) { + $this->mode = self::IN_TBODY; + break; + + /* 8. If node is a caption element, then switch the insertion mode + to "in caption" and abort these steps. */ + } elseif($node->nodeName === 'caption') { + $this->mode = self::IN_CAPTION; + break; + + /* 9. If node is a colgroup element, then switch the insertion mode + to "in column group" and abort these steps. (innerHTML case) */ + } elseif($node->nodeName === 'colgroup') { + $this->mode = self::IN_CGROUP; + break; + + /* 10. If node is a table element, then switch the insertion mode + to "in table" and abort these steps. */ + } elseif($node->nodeName === 'table') { + $this->mode = self::IN_TABLE; + break; + + /* 11. If node is a head element, then switch the insertion mode + to "in body" ("in body"! not "in head"!) and abort these steps. + (innerHTML case) */ + } elseif($node->nodeName === 'head') { + $this->mode = self::IN_BODY; + break; + + /* 12. If node is a body element, then switch the insertion mode to + "in body" and abort these steps. */ + } elseif($node->nodeName === 'body') { + $this->mode = self::IN_BODY; + break; + + /* 13. If node is a frameset element, then switch the insertion + mode to "in frameset" and abort these steps. (innerHTML case) */ + } elseif($node->nodeName === 'frameset') { + $this->mode = self::IN_FRAME; + break; + + /* 14. If node is an html element, then: if the head element + pointer is null, switch the insertion mode to "before head", + otherwise, switch the insertion mode to "after head". In either + case, abort these steps. (innerHTML case) */ + } elseif($node->nodeName === 'html') { + $this->mode = ($this->head_pointer === null) + ? self::BEFOR_HEAD + : self::AFTER_HEAD; + + break; + + /* 15. If last is true, then set the insertion mode to "in body" + and abort these steps. (innerHTML case) */ + } elseif($last) { + $this->mode = self::IN_BODY; + break; + } + } + } + + private function closeCell() { + /* If the stack of open elements has a td or th element in table scope, + then act as if an end tag token with that tag name had been seen. */ + foreach(array('td', 'th') as $cell) { + if($this->elementInScope($cell, true)) { + $this->inCell(array( + 'name' => $cell, + 'type' => HTML5::ENDTAG + )); + + break; + } + } + } + + public function save() { + return $this->dom; + } +} +?> diff --git a/libs/htmlpurifier/library/HTMLPurifier/PercentEncoder.php b/libs/htmlpurifier/library/HTMLPurifier/PercentEncoder.php new file mode 100755 index 0000000..a43c44f --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/PercentEncoder.php @@ -0,0 +1,98 @@ +preserve[$i] = true; // digits + for ($i = 65; $i <= 90; $i++) $this->preserve[$i] = true; // upper-case + for ($i = 97; $i <= 122; $i++) $this->preserve[$i] = true; // lower-case + $this->preserve[45] = true; // Dash - + $this->preserve[46] = true; // Period . + $this->preserve[95] = true; // Underscore _ + $this->preserve[126]= true; // Tilde ~ + + // extra letters not to escape + if ($preserve !== false) { + for ($i = 0, $c = strlen($preserve); $i < $c; $i++) { + $this->preserve[ord($preserve[$i])] = true; + } + } + } + + /** + * Our replacement for urlencode, it encodes all non-reserved characters, + * as well as any extra characters that were instructed to be preserved. + * @note + * Assumes that the string has already been normalized, making any + * and all percent escape sequences valid. Percents will not be + * re-escaped, regardless of their status in $preserve + * @param $string String to be encoded + * @return Encoded string. + */ + public function encode($string) { + $ret = ''; + for ($i = 0, $c = strlen($string); $i < $c; $i++) { + if ($string[$i] !== '%' && !isset($this->preserve[$int = ord($string[$i])]) ) { + $ret .= '%' . sprintf('%02X', $int); + } else { + $ret .= $string[$i]; + } + } + return $ret; + } + + /** + * Fix up percent-encoding by decoding unreserved characters and normalizing. + * @warning This function is affected by $preserve, even though the + * usual desired behavior is for this not to preserve those + * characters. Be careful when reusing instances of PercentEncoder! + * @param $string String to normalize + */ + public function normalize($string) { + if ($string == '') return ''; + $parts = explode('%', $string); + $ret = array_shift($parts); + foreach ($parts as $part) { + $length = strlen($part); + if ($length < 2) { + $ret .= '%25' . $part; + continue; + } + $encoding = substr($part, 0, 2); + $text = substr($part, 2); + if (!ctype_xdigit($encoding)) { + $ret .= '%25' . $part; + continue; + } + $int = hexdec($encoding); + if (isset($this->preserve[$int])) { + $ret .= chr($int) . $text; + continue; + } + $encoding = strtoupper($encoding); + $ret .= '%' . $encoding . $text; + } + return $ret; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Printer.php b/libs/htmlpurifier/library/HTMLPurifier/Printer.php new file mode 100755 index 0000000..e7eb82e --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Printer.php @@ -0,0 +1,176 @@ +getAll(); + $context = new HTMLPurifier_Context(); + $this->generator = new HTMLPurifier_Generator($config, $context); + } + + /** + * Main function that renders object or aspect of that object + * @note Parameters vary depending on printer + */ + // function render() {} + + /** + * Returns a start tag + * @param $tag Tag name + * @param $attr Attribute array + */ + protected function start($tag, $attr = array()) { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_Start($tag, $attr ? $attr : array()) + ); + } + + /** + * Returns an end teg + * @param $tag Tag name + */ + protected function end($tag) { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_End($tag) + ); + } + + /** + * Prints a complete element with content inside + * @param $tag Tag name + * @param $contents Element contents + * @param $attr Tag attributes + * @param $escape Bool whether or not to escape contents + */ + protected function element($tag, $contents, $attr = array(), $escape = true) { + return $this->start($tag, $attr) . + ($escape ? $this->escape($contents) : $contents) . + $this->end($tag); + } + + protected function elementEmpty($tag, $attr = array()) { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_Empty($tag, $attr) + ); + } + + protected function text($text) { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_Text($text) + ); + } + + /** + * Prints a simple key/value row in a table. + * @param $name Key + * @param $value Value + */ + protected function row($name, $value) { + if (is_bool($value)) $value = $value ? 'On' : 'Off'; + return + $this->start('tr') . "\n" . + $this->element('th', $name) . "\n" . + $this->element('td', $value) . "\n" . + $this->end('tr') + ; + } + + /** + * Escapes a string for HTML output. + * @param $string String to escape + */ + protected function escape($string) { + $string = HTMLPurifier_Encoder::cleanUTF8($string); + $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); + return $string; + } + + /** + * Takes a list of strings and turns them into a single list + * @param $array List of strings + * @param $polite Bool whether or not to add an end before the last + */ + protected function listify($array, $polite = false) { + if (empty($array)) return 'None'; + $ret = ''; + $i = count($array); + foreach ($array as $value) { + $i--; + $ret .= $value; + if ($i > 0 && !($polite && $i == 1)) $ret .= ', '; + if ($polite && $i == 1) $ret .= 'and '; + } + return $ret; + } + + /** + * Retrieves the class of an object without prefixes, as well as metadata + * @param $obj Object to determine class of + * @param $prefix Further prefix to remove + */ + protected function getClass($obj, $sec_prefix = '') { + static $five = null; + if ($five === null) $five = version_compare(PHP_VERSION, '5', '>='); + $prefix = 'HTMLPurifier_' . $sec_prefix; + if (!$five) $prefix = strtolower($prefix); + $class = str_replace($prefix, '', get_class($obj)); + $lclass = strtolower($class); + $class .= '('; + switch ($lclass) { + case 'enum': + $values = array(); + foreach ($obj->valid_values as $value => $bool) { + $values[] = $value; + } + $class .= implode(', ', $values); + break; + case 'css_composite': + $values = array(); + foreach ($obj->defs as $def) { + $values[] = $this->getClass($def, $sec_prefix); + } + $class .= implode(', ', $values); + break; + case 'css_multiple': + $class .= $this->getClass($obj->single, $sec_prefix) . ', '; + $class .= $obj->max; + break; + case 'css_denyelementdecorator': + $class .= $this->getClass($obj->def, $sec_prefix) . ', '; + $class .= $obj->element; + break; + case 'css_importantdecorator': + $class .= $this->getClass($obj->def, $sec_prefix); + if ($obj->allow) $class .= ', !important'; + break; + } + $class .= ')'; + return $class; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php b/libs/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php new file mode 100755 index 0000000..81f9865 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php @@ -0,0 +1,38 @@ +def = $config->getCSSDefinition(); + $ret = ''; + + $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); + $ret .= $this->start('table'); + + $ret .= $this->element('caption', 'Properties ($info)'); + + $ret .= $this->start('thead'); + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Property', array('class' => 'heavy')); + $ret .= $this->element('th', 'Definition', array('class' => 'heavy', 'style' => 'width:auto;')); + $ret .= $this->end('tr'); + $ret .= $this->end('thead'); + + ksort($this->def->info); + foreach ($this->def->info as $property => $obj) { + $name = $this->getClass($obj, 'AttrDef_'); + $ret .= $this->row($property, $name); + } + + $ret .= $this->end('table'); + $ret .= $this->end('div'); + + return $ret; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css b/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css new file mode 100755 index 0000000..3ff1a88 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css @@ -0,0 +1,10 @@ + +.hp-config {} + +.hp-config tbody th {text-align:right; padding-right:0.5em;} +.hp-config thead, .hp-config .namespace {background:#3C578C; color:#FFF;} +.hp-config .namespace th {text-align:center;} +.hp-config .verbose {display:none;} +.hp-config .controls {text-align:center;} + +/* vim: et sw=4 sts=4 */ diff --git a/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js b/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js new file mode 100755 index 0000000..cba00c9 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js @@ -0,0 +1,5 @@ +function toggleWriteability(id_of_patient, checked) { + document.getElementById(id_of_patient).disabled = checked; +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php b/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php new file mode 100755 index 0000000..744dec6 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php @@ -0,0 +1,368 @@ +docURL = $doc_url; + $this->name = $name; + $this->compress = $compress; + // initialize sub-printers + $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default(); + $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool(); + } + + /** + * Sets default column and row size for textareas in sub-printers + * @param $cols Integer columns of textarea, null to use default + * @param $rows Integer rows of textarea, null to use default + */ + public function setTextareaDimensions($cols = null, $rows = null) { + if ($cols) $this->fields['default']->cols = $cols; + if ($rows) $this->fields['default']->rows = $rows; + } + + /** + * Retrieves styling, in case it is not accessible by webserver + */ + public static function getCSS() { + return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css'); + } + + /** + * Retrieves JavaScript, in case it is not accessible by webserver + */ + public static function getJavaScript() { + return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js'); + } + + /** + * Returns HTML output for a configuration form + * @param $config Configuration object of current form state, or an array + * where [0] has an HTML namespace and [1] is being rendered. + * @param $allowed Optional namespace(s) and directives to restrict form to. + */ + public function render($config, $allowed = true, $render_controls = true) { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + + $this->config = $config; + $this->genConfig = $gen_config; + $this->prepareGenerator($gen_config); + + $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def); + $all = array(); + foreach ($allowed as $key) { + list($ns, $directive) = $key; + $all[$ns][$directive] = $config->get($ns, $directive); + } + + $ret = ''; + $ret .= $this->start('table', array('class' => 'hp-config')); + $ret .= $this->start('thead'); + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive')); + $ret .= $this->element('th', 'Value', array('class' => 'hp-value')); + $ret .= $this->end('tr'); + $ret .= $this->end('thead'); + foreach ($all as $ns => $directives) { + $ret .= $this->renderNamespace($ns, $directives); + } + if ($render_controls) { + $ret .= $this->start('tbody'); + $ret .= $this->start('tr'); + $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls')); + $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit')); + $ret .= '[Reset]'; + $ret .= $this->end('td'); + $ret .= $this->end('tr'); + $ret .= $this->end('tbody'); + } + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders a single namespace + * @param $ns String namespace name + * @param $directive Associative array of directives to values + */ + protected function renderNamespace($ns, $directives) { + $ret = ''; + $ret .= $this->start('tbody', array('class' => 'namespace')); + $ret .= $this->start('tr'); + $ret .= $this->element('th', $ns, array('colspan' => 2)); + $ret .= $this->end('tr'); + $ret .= $this->end('tbody'); + $ret .= $this->start('tbody'); + foreach ($directives as $directive => $value) { + $ret .= $this->start('tr'); + $ret .= $this->start('th'); + if ($this->docURL) { + $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL); + $ret .= $this->start('a', array('href' => $url)); + } + $attr = array('for' => "{$this->name}:$ns.$directive"); + + // crop directive name if it's too long + if (!$this->compress || (strlen($directive) < $this->compress)) { + $directive_disp = $directive; + } else { + $directive_disp = substr($directive, 0, $this->compress - 2) . '...'; + $attr['title'] = $directive; + } + + $ret .= $this->element( + 'label', + $directive_disp, + // component printers must create an element with this id + $attr + ); + if ($this->docURL) $ret .= $this->end('a'); + $ret .= $this->end('th'); + + $ret .= $this->start('td'); + $def = $this->config->def->info[$ns][$directive]; + if (is_int($def)) { + $allow_null = $def < 0; + $type = abs($def); + } else { + $type = $def->type; + $allow_null = isset($def->allow_null); + } + if (!isset($this->fields[$type])) $type = 0; // default + $type_obj = $this->fields[$type]; + if ($allow_null) { + $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj); + } + $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config)); + $ret .= $this->end('td'); + $ret .= $this->end('tr'); + } + $ret .= $this->end('tbody'); + return $ret; + } + +} + +/** + * Printer decorator for directives that accept null + */ +class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer { + /** + * Printer being decorated + */ + protected $obj; + /** + * @param $obj Printer to decorate + */ + public function __construct($obj) { + parent::__construct(); + $this->obj = $obj; + } + public function render($ns, $directive, $value, $name, $config) { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + $this->prepareGenerator($gen_config); + + $ret = ''; + $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive")); + $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); + $ret .= $this->text(' Null/Disabled'); + $ret .= $this->end('label'); + $attr = array( + 'type' => 'checkbox', + 'value' => '1', + 'class' => 'null-toggle', + 'name' => "$name"."[Null_$ns.$directive]", + 'id' => "$name:Null_$ns.$directive", + 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!! + ); + if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) { + // modify inline javascript slightly + $attr['onclick'] = "toggleWriteability('$name:Yes_$ns.$directive',checked);toggleWriteability('$name:No_$ns.$directive',checked)"; + } + if ($value === null) $attr['checked'] = 'checked'; + $ret .= $this->elementEmpty('input', $attr); + $ret .= $this->text(' or '); + $ret .= $this->elementEmpty('br'); + $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config)); + return $ret; + } +} + +/** + * Swiss-army knife configuration form field printer + */ +class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer { + public $cols = 18; + public $rows = 5; + public function render($ns, $directive, $value, $name, $config) { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + $this->prepareGenerator($gen_config); + // this should probably be split up a little + $ret = ''; + $def = $config->def->info[$ns][$directive]; + if (is_int($def)) { + $type = abs($def); + } else { + $type = $def->type; + } + if (is_array($value)) { + switch ($type) { + case HTMLPurifier_VarParser::LOOKUP: + $array = $value; + $value = array(); + foreach ($array as $val => $b) { + $value[] = $val; + } + case HTMLPurifier_VarParser::ALIST: + $value = implode(PHP_EOL, $value); + break; + case HTMLPurifier_VarParser::HASH: + $nvalue = ''; + foreach ($value as $i => $v) { + $nvalue .= "$i:$v" . PHP_EOL; + } + $value = $nvalue; + break; + default: + $value = ''; + } + } + if ($type === HTMLPurifier_VarParser::MIXED) { + return 'Not supported'; + $value = serialize($value); + } + $attr = array( + 'name' => "$name"."[$ns.$directive]", + 'id' => "$name:$ns.$directive" + ); + if ($value === null) $attr['disabled'] = 'disabled'; + if (isset($def->allowed)) { + $ret .= $this->start('select', $attr); + foreach ($def->allowed as $val => $b) { + $attr = array(); + if ($value == $val) $attr['selected'] = 'selected'; + $ret .= $this->element('option', $val, $attr); + } + $ret .= $this->end('select'); + } elseif ( + $type === HTMLPurifier_VarParser::TEXT || + $type === HTMLPurifier_VarParser::ITEXT || + $type === HTMLPurifier_VarParser::ALIST || + $type === HTMLPurifier_VarParser::HASH || + $type === HTMLPurifier_VarParser::LOOKUP + ) { + $attr['cols'] = $this->cols; + $attr['rows'] = $this->rows; + $ret .= $this->start('textarea', $attr); + $ret .= $this->text($value); + $ret .= $this->end('textarea'); + } else { + $attr['value'] = $value; + $attr['type'] = 'text'; + $ret .= $this->elementEmpty('input', $attr); + } + return $ret; + } +} + +/** + * Bool form field printer + */ +class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer { + public function render($ns, $directive, $value, $name, $config) { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + $this->prepareGenerator($gen_config); + $ret = ''; + $ret .= $this->start('div', array('id' => "$name:$ns.$directive")); + + $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive")); + $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); + $ret .= $this->text(' Yes'); + $ret .= $this->end('label'); + + $attr = array( + 'type' => 'radio', + 'name' => "$name"."[$ns.$directive]", + 'id' => "$name:Yes_$ns.$directive", + 'value' => '1' + ); + if ($value === true) $attr['checked'] = 'checked'; + if ($value === null) $attr['disabled'] = 'disabled'; + $ret .= $this->elementEmpty('input', $attr); + + $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive")); + $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); + $ret .= $this->text(' No'); + $ret .= $this->end('label'); + + $attr = array( + 'type' => 'radio', + 'name' => "$name"."[$ns.$directive]", + 'id' => "$name:No_$ns.$directive", + 'value' => '0' + ); + if ($value === false) $attr['checked'] = 'checked'; + if ($value === null) $attr['disabled'] = 'disabled'; + $ret .= $this->elementEmpty('input', $attr); + + $ret .= $this->end('div'); + + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php b/libs/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php new file mode 100755 index 0000000..8a8f126 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php @@ -0,0 +1,272 @@ +config =& $config; + + $this->def = $config->getHTMLDefinition(); + + $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); + + $ret .= $this->renderDoctype(); + $ret .= $this->renderEnvironment(); + $ret .= $this->renderContentSets(); + $ret .= $this->renderInfo(); + + $ret .= $this->end('div'); + + return $ret; + } + + /** + * Renders the Doctype table + */ + protected function renderDoctype() { + $doctype = $this->def->doctype; + $ret = ''; + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Doctype'); + $ret .= $this->row('Name', $doctype->name); + $ret .= $this->row('XML', $doctype->xml ? 'Yes' : 'No'); + $ret .= $this->row('Default Modules', implode($doctype->modules, ', ')); + $ret .= $this->row('Default Tidy Modules', implode($doctype->tidyModules, ', ')); + $ret .= $this->end('table'); + return $ret; + } + + + /** + * Renders environment table, which is miscellaneous info + */ + protected function renderEnvironment() { + $def = $this->def; + + $ret = ''; + + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Environment'); + + $ret .= $this->row('Parent of fragment', $def->info_parent); + $ret .= $this->renderChildren($def->info_parent_def->child); + $ret .= $this->row('Block wrap name', $def->info_block_wrapper); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Global attributes'); + $ret .= $this->element('td', $this->listifyAttr($def->info_global_attr),0,0); + $ret .= $this->end('tr'); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Tag transforms'); + $list = array(); + foreach ($def->info_tag_transform as $old => $new) { + $new = $this->getClass($new, 'TagTransform_'); + $list[] = "<$old> with $new"; + } + $ret .= $this->element('td', $this->listify($list)); + $ret .= $this->end('tr'); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Pre-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre)); + $ret .= $this->end('tr'); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Post-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post)); + $ret .= $this->end('tr'); + + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders the Content Sets table + */ + protected function renderContentSets() { + $ret = ''; + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Content Sets'); + foreach ($this->def->info_content_sets as $name => $lookup) { + $ret .= $this->heavyHeader($name); + $ret .= $this->start('tr'); + $ret .= $this->element('td', $this->listifyTagLookup($lookup)); + $ret .= $this->end('tr'); + } + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders the Elements ($info) table + */ + protected function renderInfo() { + $ret = ''; + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Elements ($info)'); + ksort($this->def->info); + $ret .= $this->heavyHeader('Allowed tags', 2); + $ret .= $this->start('tr'); + $ret .= $this->element('td', $this->listifyTagLookup($this->def->info), array('colspan' => 2)); + $ret .= $this->end('tr'); + foreach ($this->def->info as $name => $def) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', "<$name>", array('class'=>'heavy', 'colspan' => 2)); + $ret .= $this->end('tr'); + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Inline content'); + $ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No'); + $ret .= $this->end('tr'); + if (!empty($def->excludes)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Excludes'); + $ret .= $this->element('td', $this->listifyTagLookup($def->excludes)); + $ret .= $this->end('tr'); + } + if (!empty($def->attr_transform_pre)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Pre-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre)); + $ret .= $this->end('tr'); + } + if (!empty($def->attr_transform_post)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Post-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post)); + $ret .= $this->end('tr'); + } + if (!empty($def->auto_close)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Auto closed by'); + $ret .= $this->element('td', $this->listifyTagLookup($def->auto_close)); + $ret .= $this->end('tr'); + } + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Allowed attributes'); + $ret .= $this->element('td',$this->listifyAttr($def->attr), array(), 0); + $ret .= $this->end('tr'); + + if (!empty($def->required_attr)) { + $ret .= $this->row('Required attributes', $this->listify($def->required_attr)); + } + + $ret .= $this->renderChildren($def->child); + } + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders a row describing the allowed children of an element + * @param $def HTMLPurifier_ChildDef of pertinent element + */ + protected function renderChildren($def) { + $context = new HTMLPurifier_Context(); + $ret = ''; + $ret .= $this->start('tr'); + $elements = array(); + $attr = array(); + if (isset($def->elements)) { + if ($def->type == 'strictblockquote') { + $def->validateChildren(array(), $this->config, $context); + } + $elements = $def->elements; + } + if ($def->type == 'chameleon') { + $attr['rowspan'] = 2; + } elseif ($def->type == 'empty') { + $elements = array(); + } elseif ($def->type == 'table') { + $elements = array_flip(array('col', 'caption', 'colgroup', 'thead', + 'tfoot', 'tbody', 'tr')); + } + $ret .= $this->element('th', 'Allowed children', $attr); + + if ($def->type == 'chameleon') { + + $ret .= $this->element('td', + 'Block: ' . + $this->escape($this->listifyTagLookup($def->block->elements)),0,0); + $ret .= $this->end('tr'); + $ret .= $this->start('tr'); + $ret .= $this->element('td', + 'Inline: ' . + $this->escape($this->listifyTagLookup($def->inline->elements)),0,0); + + } elseif ($def->type == 'custom') { + + $ret .= $this->element('td', ''.ucfirst($def->type).': ' . + $def->dtd_regex); + + } else { + $ret .= $this->element('td', + ''.ucfirst($def->type).': ' . + $this->escape($this->listifyTagLookup($elements)),0,0); + } + $ret .= $this->end('tr'); + return $ret; + } + + /** + * Listifies a tag lookup table. + * @param $array Tag lookup array in form of array('tagname' => true) + */ + protected function listifyTagLookup($array) { + ksort($array); + $list = array(); + foreach ($array as $name => $discard) { + if ($name !== '#PCDATA' && !isset($this->def->info[$name])) continue; + $list[] = $name; + } + return $this->listify($list); + } + + /** + * Listifies a list of objects by retrieving class names and internal state + * @param $array List of objects + * @todo Also add information about internal state + */ + protected function listifyObjectList($array) { + ksort($array); + $list = array(); + foreach ($array as $discard => $obj) { + $list[] = $this->getClass($obj, 'AttrTransform_'); + } + return $this->listify($list); + } + + /** + * Listifies a hash of attributes to AttrDef classes + * @param $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef) + */ + protected function listifyAttr($array) { + ksort($array); + $list = array(); + foreach ($array as $name => $obj) { + if ($obj === false) continue; + $list[] = "$name = " . $this->getClass($obj, 'AttrDef_') . ''; + } + return $this->listify($list); + } + + /** + * Creates a heavy header row + */ + protected function heavyHeader($text, $num = 1) { + $ret = ''; + $ret .= $this->start('tr'); + $ret .= $this->element('th', $text, array('colspan' => $num, 'class' => 'heavy')); + $ret .= $this->end('tr'); + return $ret; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/PropertyList.php b/libs/htmlpurifier/library/HTMLPurifier/PropertyList.php new file mode 100755 index 0000000..2b99fb7 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/PropertyList.php @@ -0,0 +1,86 @@ +parent = $parent; + } + + /** + * Recursively retrieves the value for a key + */ + public function get($name) { + if ($this->has($name)) return $this->data[$name]; + // possible performance bottleneck, convert to iterative if necessary + if ($this->parent) return $this->parent->get($name); + throw new HTMLPurifier_Exception("Key '$name' not found"); + } + + /** + * Sets the value of a key, for this plist + */ + public function set($name, $value) { + $this->data[$name] = $value; + } + + /** + * Returns true if a given key exists + */ + public function has($name) { + return array_key_exists($name, $this->data); + } + + /** + * Resets a value to the value of it's parent, usually the default. If + * no value is specified, the entire plist is reset. + */ + public function reset($name = null) { + if ($name == null) $this->data = array(); + else unset($this->data[$name]); + } + + /** + * Squashes this property list and all of its property lists into a single + * array, and returns the array. This value is cached by default. + * @param $force If true, ignores the cache and regenerates the array. + */ + public function squash($force = false) { + if ($this->cache !== null && !$force) return $this->cache; + if ($this->parent) { + return $this->cache = array_merge($this->parent->squash($force), $this->data); + } else { + return $this->cache = $this->data; + } + } + + /** + * Returns the parent plist. + */ + public function getParent() { + return $this->parent; + } + + /** + * Sets the parent plist. + */ + public function setParent($plist) { + $this->parent = $plist; + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php b/libs/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php new file mode 100755 index 0000000..8f25044 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php @@ -0,0 +1,32 @@ +l = strlen($filter); + $this->filter = $filter; + } + + public function accept() { + $key = $this->getInnerIterator()->key(); + if( strncmp($key, $this->filter, $this->l) !== 0 ) { + return false; + } + return true; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy.php new file mode 100755 index 0000000..2462865 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Strategy.php @@ -0,0 +1,26 @@ +strategies as $strategy) { + $tokens = $strategy->execute($tokens, $config, $context); + } + return $tokens; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy/Core.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy/Core.php new file mode 100755 index 0000000..d90e158 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Strategy/Core.php @@ -0,0 +1,18 @@ +strategies[] = new HTMLPurifier_Strategy_RemoveForeignElements(); + $this->strategies[] = new HTMLPurifier_Strategy_MakeWellFormed(); + $this->strategies[] = new HTMLPurifier_Strategy_FixNesting(); + $this->strategies[] = new HTMLPurifier_Strategy_ValidateAttributes(); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php new file mode 100755 index 0000000..f818023 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php @@ -0,0 +1,328 @@ +getHTMLDefinition(); + + // insert implicit "parent" node, will be removed at end. + // DEFINITION CALL + $parent_name = $definition->info_parent; + array_unshift($tokens, new HTMLPurifier_Token_Start($parent_name)); + $tokens[] = new HTMLPurifier_Token_End($parent_name); + + // setup the context variable 'IsInline', for chameleon processing + // is 'false' when we are not inline, 'true' when it must always + // be inline, and an integer when it is inline for a certain + // branch of the document tree + $is_inline = $definition->info_parent_def->descendants_are_inline; + $context->register('IsInline', $is_inline); + + // setup error collector + $e =& $context->get('ErrorCollector', true); + + //####################################################################// + // Loop initialization + + // stack that contains the indexes of all parents, + // $stack[count($stack)-1] being the current parent + $stack = array(); + + // stack that contains all elements that are excluded + // it is organized by parent elements, similar to $stack, + // but it is only populated when an element with exclusions is + // processed, i.e. there won't be empty exclusions. + $exclude_stack = array(); + + // variable that contains the start token while we are processing + // nodes. This enables error reporting to do its job + $start_token = false; + $context->register('CurrentToken', $start_token); + + //####################################################################// + // Loop + + // iterate through all start nodes. Determining the start node + // is complicated so it has been omitted from the loop construct + for ($i = 0, $size = count($tokens) ; $i < $size; ) { + + //################################################################// + // Gather information on children + + // child token accumulator + $child_tokens = array(); + + // scroll to the end of this node, report number, and collect + // all children + for ($j = $i, $depth = 0; ; $j++) { + if ($tokens[$j] instanceof HTMLPurifier_Token_Start) { + $depth++; + // skip token assignment on first iteration, this is the + // token we currently are on + if ($depth == 1) continue; + } elseif ($tokens[$j] instanceof HTMLPurifier_Token_End) { + $depth--; + // skip token assignment on last iteration, this is the + // end token of the token we're currently on + if ($depth == 0) break; + } + $child_tokens[] = $tokens[$j]; + } + + // $i is index of start token + // $j is index of end token + + $start_token = $tokens[$i]; // to make token available via CurrentToken + + //################################################################// + // Gather information on parent + + // calculate parent information + if ($count = count($stack)) { + $parent_index = $stack[$count-1]; + $parent_name = $tokens[$parent_index]->name; + if ($parent_index == 0) { + $parent_def = $definition->info_parent_def; + } else { + $parent_def = $definition->info[$parent_name]; + } + } else { + // processing as if the parent were the "root" node + // unknown info, it won't be used anyway, in the future, + // we may want to enforce one element only (this is + // necessary for HTML Purifier to clean entire documents + $parent_index = $parent_name = $parent_def = null; + } + + // calculate context + if ($is_inline === false) { + // check if conditions make it inline + if (!empty($parent_def) && $parent_def->descendants_are_inline) { + $is_inline = $count - 1; + } + } else { + // check if we're out of inline + if ($count === $is_inline) { + $is_inline = false; + } + } + + //################################################################// + // Determine whether element is explicitly excluded SGML-style + + // determine whether or not element is excluded by checking all + // parent exclusions. The array should not be very large, two + // elements at most. + $excluded = false; + if (!empty($exclude_stack)) { + foreach ($exclude_stack as $lookup) { + if (isset($lookup[$tokens[$i]->name])) { + $excluded = true; + // no need to continue processing + break; + } + } + } + + //################################################################// + // Perform child validation + + if ($excluded) { + // there is an exclusion, remove the entire node + $result = false; + $excludes = array(); // not used, but good to initialize anyway + } else { + // DEFINITION CALL + if ($i === 0) { + // special processing for the first node + $def = $definition->info_parent_def; + } else { + $def = $definition->info[$tokens[$i]->name]; + + } + + if (!empty($def->child)) { + // have DTD child def validate children + $result = $def->child->validateChildren( + $child_tokens, $config, $context); + } else { + // weird, no child definition, get rid of everything + $result = false; + } + + // determine whether or not this element has any exclusions + $excludes = $def->excludes; + } + + // $result is now a bool or array + + //################################################################// + // Process result by interpreting $result + + if ($result === true || $child_tokens === $result) { + // leave the node as is + + // register start token as a parental node start + $stack[] = $i; + + // register exclusions if there are any + if (!empty($excludes)) $exclude_stack[] = $excludes; + + // move cursor to next possible start node + $i++; + + } elseif($result === false) { + // remove entire node + + if ($e) { + if ($excluded) { + $e->send(E_ERROR, 'Strategy_FixNesting: Node excluded'); + } else { + $e->send(E_ERROR, 'Strategy_FixNesting: Node removed'); + } + } + + // calculate length of inner tokens and current tokens + $length = $j - $i + 1; + + // perform removal + array_splice($tokens, $i, $length); + + // update size + $size -= $length; + + // there is no start token to register, + // current node is now the next possible start node + // unless it turns out that we need to do a double-check + + // this is a rought heuristic that covers 100% of HTML's + // cases and 99% of all other cases. A child definition + // that would be tricked by this would be something like: + // ( | a b c) where it's all or nothing. Fortunately, + // our current implementation claims that that case would + // not allow empty, even if it did + if (!$parent_def->child->allow_empty) { + // we need to do a double-check + $i = $parent_index; + array_pop($stack); + } + + // PROJECTED OPTIMIZATION: Process all children elements before + // reprocessing parent node. + + } else { + // replace node with $result + + // calculate length of inner tokens + $length = $j - $i - 1; + + if ($e) { + if (empty($result) && $length) { + $e->send(E_ERROR, 'Strategy_FixNesting: Node contents removed'); + } else { + $e->send(E_WARNING, 'Strategy_FixNesting: Node reorganized'); + } + } + + // perform replacement + array_splice($tokens, $i + 1, $length, $result); + + // update size + $size -= $length; + $size += count($result); + + // register start token as a parental node start + $stack[] = $i; + + // register exclusions if there are any + if (!empty($excludes)) $exclude_stack[] = $excludes; + + // move cursor to next possible start node + $i++; + + } + + //################################################################// + // Scroll to next start node + + // We assume, at this point, that $i is the index of the token + // that is the first possible new start point for a node. + + // Test if the token indeed is a start tag, if not, move forward + // and test again. + $size = count($tokens); + while ($i < $size and !$tokens[$i] instanceof HTMLPurifier_Token_Start) { + if ($tokens[$i] instanceof HTMLPurifier_Token_End) { + // pop a token index off the stack if we ended a node + array_pop($stack); + // pop an exclusion lookup off exclusion stack if + // we ended node and that node had exclusions + if ($i == 0 || $i == $size - 1) { + // use specialized var if it's the super-parent + $s_excludes = $definition->info_parent_def->excludes; + } else { + $s_excludes = $definition->info[$tokens[$i]->name]->excludes; + } + if ($s_excludes) { + array_pop($exclude_stack); + } + } + $i++; + } + + } + + //####################################################################// + // Post-processing + + // remove implicit parent tokens at the beginning and end + array_shift($tokens); + array_pop($tokens); + + // remove context variables + $context->destroy('IsInline'); + $context->destroy('CurrentToken'); + + //####################################################################// + // Return + + return $tokens; + + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php new file mode 100755 index 0000000..0ec811f --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php @@ -0,0 +1,455 @@ +getHTMLDefinition(); + + // local variables + $generator = new HTMLPurifier_Generator($config, $context); + $escape_invalid_tags = $config->get('Core', 'EscapeInvalidTags'); + $e = $context->get('ErrorCollector', true); + $t = false; // token index + $i = false; // injector index + $token = false; // the current token + $reprocess = false; // whether or not to reprocess the same token + $stack = array(); + + // member variables + $this->stack =& $stack; + $this->t =& $t; + $this->tokens =& $tokens; + $this->config = $config; + $this->context = $context; + + // context variables + $context->register('CurrentNesting', $stack); + $context->register('InputIndex', $t); + $context->register('InputTokens', $tokens); + $context->register('CurrentToken', $token); + + // -- begin INJECTOR -- + + $this->injectors = array(); + + $injectors = $config->getBatch('AutoFormat'); + $def_injectors = $definition->info_injector; + $custom_injectors = $injectors['Custom']; + unset($injectors['Custom']); // special case + foreach ($injectors as $injector => $b) { + $injector = "HTMLPurifier_Injector_$injector"; + if (!$b) continue; + $this->injectors[] = new $injector; + } + foreach ($def_injectors as $injector) { + // assumed to be objects + $this->injectors[] = $injector; + } + foreach ($custom_injectors as $injector) { + if (is_string($injector)) { + $injector = "HTMLPurifier_Injector_$injector"; + $injector = new $injector; + } + $this->injectors[] = $injector; + } + + // give the injectors references to the definition and context + // variables for performance reasons + foreach ($this->injectors as $ix => $injector) { + $error = $injector->prepare($config, $context); + if (!$error) continue; + array_splice($this->injectors, $ix, 1); // rm the injector + trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING); + } + + // -- end INJECTOR -- + + // a note on punting: + // In order to reduce code duplication, whenever some code needs + // to make HTML changes in order to make things "correct", the + // new HTML gets sent through the purifier, regardless of its + // status. This means that if we add a start token, because it + // was totally necessary, we don't have to update nesting; we just + // punt ($reprocess = true; continue;) and it does that for us. + + // isset is in loop because $tokens size changes during loop exec + for ( + $t = 0; + $t == 0 || isset($tokens[$t - 1]); + // only increment if we don't need to reprocess + $reprocess ? $reprocess = false : $t++ + ) { + + // check for a rewind + if (is_int($i) && $i >= 0) { + // possibility: disable rewinding if the current token has a + // rewind set on it already. This would offer protection from + // infinite loop, but might hinder some advanced rewinding. + $rewind_to = $this->injectors[$i]->getRewind(); + if (is_int($rewind_to) && $rewind_to < $t) { + if ($rewind_to < 0) $rewind_to = 0; + while ($t > $rewind_to) { + $t--; + $prev = $tokens[$t]; + // indicate that other injectors should not process this token, + // but we need to reprocess it + unset($prev->skip[$i]); + $prev->rewind = $i; + if ($prev instanceof HTMLPurifier_Token_Start) array_pop($this->stack); + elseif ($prev instanceof HTMLPurifier_Token_End) $this->stack[] = $prev->start; + } + } + $i = false; + } + + // handle case of document end + if (!isset($tokens[$t])) { + // kill processing if stack is empty + if (empty($this->stack)) break; + + // peek + $top_nesting = array_pop($this->stack); + $this->stack[] = $top_nesting; + + // send error + if ($e && !isset($top_nesting->armor['MakeWellFormed_TagClosedError'])) { + $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $top_nesting); + } + + // append, don't splice, since this is the end + $tokens[] = new HTMLPurifier_Token_End($top_nesting->name); + + // punt! + $reprocess = true; + continue; + } + + $token = $tokens[$t]; + + //echo '
      '; printTokens($tokens, $t); printTokens($this->stack); + + // quick-check: if it's not a tag, no need to process + if (empty($token->is_tag)) { + if ($token instanceof HTMLPurifier_Token_Text) { + foreach ($this->injectors as $i => $injector) { + if (isset($token->skip[$i])) continue; + if ($token->rewind !== null && $token->rewind !== $i) continue; + $injector->handleText($token); + $this->processToken($token, $i); + $reprocess = true; + break; + } + } + // another possibility is a comment + continue; + } + + if (isset($definition->info[$token->name])) { + $type = $definition->info[$token->name]->child->type; + } else { + $type = false; // Type is unknown, treat accordingly + } + + // quick tag checks: anything that's *not* an end tag + $ok = false; + if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) { + // claims to be a start tag but is empty + $token = new HTMLPurifier_Token_Empty($token->name, $token->attr); + $ok = true; + } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) { + // claims to be empty but really is a start tag + $this->swap(new HTMLPurifier_Token_End($token->name)); + $this->insertBefore(new HTMLPurifier_Token_Start($token->name, $token->attr)); + // punt (since we had to modify the input stream in a non-trivial way) + $reprocess = true; + continue; + } elseif ($token instanceof HTMLPurifier_Token_Empty) { + // real empty token + $ok = true; + } elseif ($token instanceof HTMLPurifier_Token_Start) { + // start tag + + // ...unless they also have to close their parent + if (!empty($this->stack)) { + + $parent = array_pop($this->stack); + $this->stack[] = $parent; + + if (isset($definition->info[$parent->name])) { + $elements = $definition->info[$parent->name]->child->getAllowedElements($config); + $autoclose = !isset($elements[$token->name]); + } else { + $autoclose = false; + } + + $carryover = false; + if ($autoclose && $definition->info[$parent->name]->formatting) { + $carryover = true; + } + + if ($autoclose) { + // errors need to be updated + $new_token = new HTMLPurifier_Token_End($parent->name); + $new_token->start = $parent; + if ($carryover) { + $element = clone $parent; + $element->armor['MakeWellFormed_TagClosedError'] = true; + $element->carryover = true; + $this->processToken(array($new_token, $token, $element)); + } else { + $this->insertBefore($new_token); + } + if ($e && !isset($parent->armor['MakeWellFormed_TagClosedError'])) { + if (!$carryover) { + $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', $parent); + } else { + $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $parent); + } + } + $reprocess = true; + continue; + } + + } + $ok = true; + } + + if ($ok) { + foreach ($this->injectors as $i => $injector) { + if (isset($token->skip[$i])) continue; + if ($token->rewind !== null && $token->rewind !== $i) continue; + $injector->handleElement($token); + $this->processToken($token, $i); + $reprocess = true; + break; + } + if (!$reprocess) { + // ah, nothing interesting happened; do normal processing + $this->swap($token); + if ($token instanceof HTMLPurifier_Token_Start) { + $this->stack[] = $token; + } elseif ($token instanceof HTMLPurifier_Token_End) { + throw new HTMLPurifier_Exception('Improper handling of end tag in start code; possible error in MakeWellFormed'); + } + } + continue; + } + + // sanity check: we should be dealing with a closing tag + if (!$token instanceof HTMLPurifier_Token_End) { + throw new HTMLPurifier_Exception('Unaccounted for tag token in input stream, bug in HTML Purifier'); + } + + // make sure that we have something open + if (empty($this->stack)) { + if ($escape_invalid_tags) { + if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text'); + $this->swap(new HTMLPurifier_Token_Text( + $generator->generateFromToken($token) + )); + } else { + $this->remove(); + if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed'); + } + $reprocess = true; + continue; + } + + // first, check for the simplest case: everything closes neatly. + // Eventually, everything passes through here; if there are problems + // we modify the input stream accordingly and then punt, so that + // the tokens get processed again. + $current_parent = array_pop($this->stack); + if ($current_parent->name == $token->name) { + $token->start = $current_parent; + foreach ($this->injectors as $i => $injector) { + if (isset($token->skip[$i])) continue; + if ($token->rewind !== null && $token->rewind !== $i) continue; + $injector->handleEnd($token); + $this->processToken($token, $i); + $this->stack[] = $current_parent; + $reprocess = true; + break; + } + continue; + } + + // okay, so we're trying to close the wrong tag + + // undo the pop previous pop + $this->stack[] = $current_parent; + + // scroll back the entire nest, trying to find our tag. + // (feature could be to specify how far you'd like to go) + $size = count($this->stack); + // -2 because -1 is the last element, but we already checked that + $skipped_tags = false; + for ($j = $size - 2; $j >= 0; $j--) { + if ($this->stack[$j]->name == $token->name) { + $skipped_tags = array_slice($this->stack, $j); + break; + } + } + + // we didn't find the tag, so remove + if ($skipped_tags === false) { + if ($escape_invalid_tags) { + $this->swap(new HTMLPurifier_Token_Text( + $generator->generateFromToken($token) + )); + if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text'); + } else { + $this->remove(); + if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed'); + } + $reprocess = true; + continue; + } + + // do errors, in REVERSE $j order: a,b,c with
      + $c = count($skipped_tags); + if ($e) { + for ($j = $c - 1; $j > 0; $j--) { + // notice we exclude $j == 0, i.e. the current ending tag, from + // the errors... + if (!isset($skipped_tags[$j]->armor['MakeWellFormed_TagClosedError'])) { + $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', $skipped_tags[$j]); + } + } + } + + // insert tags, in FORWARD $j order: c,b,a with
      + $replace = array($token); + for ($j = 1; $j < $c; $j++) { + // ...as well as from the insertions + $new_token = new HTMLPurifier_Token_End($skipped_tags[$j]->name); + $new_token->start = $skipped_tags[$j]; + array_unshift($replace, $new_token); + if (isset($definition->info[$new_token->name]) && $definition->info[$new_token->name]->formatting) { + $element = clone $skipped_tags[$j]; + $element->carryover = true; + $element->armor['MakeWellFormed_TagClosedError'] = true; + $replace[] = $element; + } + } + $this->processToken($replace); + $reprocess = true; + continue; + } + + $context->destroy('CurrentNesting'); + $context->destroy('InputTokens'); + $context->destroy('InputIndex'); + $context->destroy('CurrentToken'); + + unset($this->injectors, $this->stack, $this->tokens, $this->t); + return $tokens; + } + + /** + * Processes arbitrary token values for complicated substitution patterns. + * In general: + * + * If $token is an array, it is a list of tokens to substitute for the + * current token. These tokens then get individually processed. If there + * is a leading integer in the list, that integer determines how many + * tokens from the stream should be removed. + * + * If $token is a regular token, it is swapped with the current token. + * + * If $token is false, the current token is deleted. + * + * If $token is an integer, that number of tokens (with the first token + * being the current one) will be deleted. + * + * @param $token Token substitution value + * @param $injector Injector that performed the substitution; default is if + * this is not an injector related operation. + */ + protected function processToken($token, $injector = -1) { + + // normalize forms of token + if (is_object($token)) $token = array(1, $token); + if (is_int($token)) $token = array($token); + if ($token === false) $token = array(1); + if (!is_array($token)) throw new HTMLPurifier_Exception('Invalid token type from injector'); + if (!is_int($token[0])) array_unshift($token, 1); + if ($token[0] === 0) throw new HTMLPurifier_Exception('Deleting zero tokens is not valid'); + + // $token is now an array with the following form: + // array(number nodes to delete, new node 1, new node 2, ...) + + $delete = array_shift($token); + $old = array_splice($this->tokens, $this->t, $delete, $token); + + if ($injector > -1) { + // determine appropriate skips + $oldskip = isset($old[0]) ? $old[0]->skip : array(); + foreach ($token as $object) { + $object->skip = $oldskip; + $object->skip[$injector] = true; + } + } + + } + + /** + * Inserts a token before the current token. Cursor now points to this token + */ + private function insertBefore($token) { + array_splice($this->tokens, $this->t, 0, array($token)); + } + + /** + * Removes current token. Cursor now points to new token occupying previously + * occupied space. + */ + private function remove() { + array_splice($this->tokens, $this->t, 1); + } + + /** + * Swap current token with new token. Cursor points to new token (no change). + */ + private function swap($token) { + $this->tokens[$this->t] = $token; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php new file mode 100755 index 0000000..d30e456 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php @@ -0,0 +1,171 @@ +getHTMLDefinition(); + $generator = new HTMLPurifier_Generator($config, $context); + $result = array(); + + $escape_invalid_tags = $config->get('Core', 'EscapeInvalidTags'); + $remove_invalid_img = $config->get('Core', 'RemoveInvalidImg'); + + // currently only used to determine if comments should be kept + $trusted = $config->get('HTML', 'Trusted'); + + $remove_script_contents = $config->get('Core', 'RemoveScriptContents'); + $hidden_elements = $config->get('Core', 'HiddenElements'); + + // remove script contents compatibility + if ($remove_script_contents === true) { + $hidden_elements['script'] = true; + } elseif ($remove_script_contents === false && isset($hidden_elements['script'])) { + unset($hidden_elements['script']); + } + + $attr_validator = new HTMLPurifier_AttrValidator(); + + // removes tokens until it reaches a closing tag with its value + $remove_until = false; + + // converts comments into text tokens when this is equal to a tag name + $textify_comments = false; + + $token = false; + $context->register('CurrentToken', $token); + + $e = false; + if ($config->get('Core', 'CollectErrors')) { + $e =& $context->get('ErrorCollector'); + } + + foreach($tokens as $token) { + if ($remove_until) { + if (empty($token->is_tag) || $token->name !== $remove_until) { + continue; + } + } + if (!empty( $token->is_tag )) { + // DEFINITION CALL + + // before any processing, try to transform the element + if ( + isset($definition->info_tag_transform[$token->name]) + ) { + $original_name = $token->name; + // there is a transformation for this tag + // DEFINITION CALL + $token = $definition-> + info_tag_transform[$token->name]-> + transform($token, $config, $context); + if ($e) $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', $original_name); + } + + if (isset($definition->info[$token->name])) { + + // mostly everything's good, but + // we need to make sure required attributes are in order + if ( + ($token instanceof HTMLPurifier_Token_Start || $token instanceof HTMLPurifier_Token_Empty) && + $definition->info[$token->name]->required_attr && + ($token->name != 'img' || $remove_invalid_img) // ensure config option still works + ) { + $attr_validator->validateToken($token, $config, $context); + $ok = true; + foreach ($definition->info[$token->name]->required_attr as $name) { + if (!isset($token->attr[$name])) { + $ok = false; + break; + } + } + if (!$ok) { + if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Missing required attribute', $name); + continue; + } + $token->armor['ValidateAttributes'] = true; + } + + if (isset($hidden_elements[$token->name]) && $token instanceof HTMLPurifier_Token_Start) { + $textify_comments = $token->name; + } elseif ($token->name === $textify_comments && $token instanceof HTMLPurifier_Token_End) { + $textify_comments = false; + } + + } elseif ($escape_invalid_tags) { + // invalid tag, generate HTML representation and insert in + if ($e) $e->send(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text'); + $token = new HTMLPurifier_Token_Text( + $generator->generateFromToken($token) + ); + } else { + // check if we need to destroy all of the tag's children + // CAN BE GENERICIZED + if (isset($hidden_elements[$token->name])) { + if ($token instanceof HTMLPurifier_Token_Start) { + $remove_until = $token->name; + } elseif ($token instanceof HTMLPurifier_Token_Empty) { + // do nothing: we're still looking + } else { + $remove_until = false; + } + if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed'); + } else { + if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed'); + } + continue; + } + } elseif ($token instanceof HTMLPurifier_Token_Comment) { + // textify comments in script tags when they are allowed + if ($textify_comments !== false) { + $data = $token->data; + $token = new HTMLPurifier_Token_Text($data); + } elseif ($trusted) { + // keep, but perform comment cleaning + if ($e) { + // perform check whether or not there's a trailing hyphen + if (substr($token->data, -1) == '-') { + $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed'); + } + } + $token->data = rtrim($token->data, '-'); + $found_double_hyphen = false; + while (strpos($token->data, '--') !== false) { + if ($e && !$found_double_hyphen) { + $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Hyphens in comment collapsed'); + } + $found_double_hyphen = true; // prevent double-erroring + $token->data = str_replace('--', '-', $token->data); + } + } else { + // strip comments + if ($e) $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed'); + continue; + } + } elseif ($token instanceof HTMLPurifier_Token_Text) { + } else { + continue; + } + $result[] = $token; + } + if ($remove_until && $e) { + // we removed tokens until the end, throw error + $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Token removed to end', $remove_until); + } + + $context->destroy('CurrentToken'); + + return $result; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php b/libs/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php new file mode 100755 index 0000000..c3328a9 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php @@ -0,0 +1,39 @@ +register('CurrentToken', $token); + + foreach ($tokens as $key => $token) { + + // only process tokens that have attributes, + // namely start and empty tags + if (!$token instanceof HTMLPurifier_Token_Start && !$token instanceof HTMLPurifier_Token_Empty) continue; + + // skip tokens that are armored + if (!empty($token->armor['ValidateAttributes'])) continue; + + // note that we have no facilities here for removing tokens + $validator->validateToken($token, $config, $context); + + $tokens[$key] = $token; // for PHP 4 + } + $context->destroy('CurrentToken'); + + return $tokens; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/StringHash.php b/libs/htmlpurifier/library/HTMLPurifier/StringHash.php new file mode 100755 index 0000000..62085c5 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/StringHash.php @@ -0,0 +1,39 @@ +accessed[$index] = true; + return parent::offsetGet($index); + } + + /** + * Returns a lookup array of all array indexes that have been accessed. + * @return Array in form array($index => true). + */ + public function getAccessed() { + return $this->accessed; + } + + /** + * Resets the access array. + */ + public function resetAccessed() { + $this->accessed = array(); + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/StringHashParser.php b/libs/htmlpurifier/library/HTMLPurifier/StringHashParser.php new file mode 100755 index 0000000..f3e70c7 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/StringHashParser.php @@ -0,0 +1,110 @@ + 'DefaultKeyValue', + * 'KEY' => 'Value', + * 'KEY2' => 'Value2', + * 'MULTILINE-KEY' => "Multiline\nvalue.\n", + * ) + * + * We use this as an easy to use file-format for configuration schema + * files, but the class itself is usage agnostic. + * + * You can use ---- to forcibly terminate parsing of a single string-hash; + * this marker is used in multi string-hashes to delimit boundaries. + */ +class HTMLPurifier_StringHashParser +{ + + public $default = 'ID'; + + /** + * Parses a file that contains a single string-hash. + */ + public function parseFile($file) { + if (!file_exists($file)) return false; + $fh = fopen($file, 'r'); + if (!$fh) return false; + $ret = $this->parseHandle($fh); + fclose($fh); + return $ret; + } + + /** + * Parses a file that contains multiple string-hashes delimited by '----' + */ + public function parseMultiFile($file) { + if (!file_exists($file)) return false; + $ret = array(); + $fh = fopen($file, 'r'); + if (!$fh) return false; + while (!feof($fh)) { + $ret[] = $this->parseHandle($fh); + } + fclose($fh); + return $ret; + } + + /** + * Internal parser that acepts a file handle. + * @note While it's possible to simulate in-memory parsing by using + * custom stream wrappers, if such a use-case arises we should + * factor out the file handle into its own class. + * @param $fh File handle with pointer at start of valid string-hash + * block. + */ + protected function parseHandle($fh) { + $state = false; + $single = false; + $ret = array(); + do { + $line = fgets($fh); + if ($line === false) break; + $line = rtrim($line, "\n\r"); + if (!$state && $line === '') continue; + if ($line === '----') break; + if (strncmp('--#', $line, 3) === 0) { + // Comment + continue; + } elseif (strncmp('--', $line, 2) === 0) { + // Multiline declaration + $state = trim($line, '- '); + if (!isset($ret[$state])) $ret[$state] = ''; + continue; + } elseif (!$state) { + $single = true; + if (strpos($line, ':') !== false) { + // Single-line declaration + list($state, $line) = explode(':', $line, 2); + $line = trim($line); + } else { + // Use default declaration + $state = $this->default; + } + } + if ($single) { + $ret[$state] = $line; + $single = false; + $state = false; + } else { + $ret[$state] .= "$line\n"; + } + } while (!feof($fh)); + return $ret; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/TagTransform.php b/libs/htmlpurifier/library/HTMLPurifier/TagTransform.php new file mode 100755 index 0000000..210a447 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/TagTransform.php @@ -0,0 +1,36 @@ + 'xx-small', + '1' => 'xx-small', + '2' => 'small', + '3' => 'medium', + '4' => 'large', + '5' => 'x-large', + '6' => 'xx-large', + '7' => '300%', + '-1' => 'smaller', + '-2' => '60%', + '+1' => 'larger', + '+2' => '150%', + '+3' => '200%', + '+4' => '300%' + ); + + public function transform($tag, $config, $context) { + + if ($tag instanceof HTMLPurifier_Token_End) { + $new_tag = clone $tag; + $new_tag->name = $this->transform_to; + return $new_tag; + } + + $attr = $tag->attr; + $prepend_style = ''; + + // handle color transform + if (isset($attr['color'])) { + $prepend_style .= 'color:' . $attr['color'] . ';'; + unset($attr['color']); + } + + // handle face transform + if (isset($attr['face'])) { + $prepend_style .= 'font-family:' . $attr['face'] . ';'; + unset($attr['face']); + } + + // handle size transform + if (isset($attr['size'])) { + // normalize large numbers + if ($attr['size']{0} == '+' || $attr['size']{0} == '-') { + $size = (int) $attr['size']; + if ($size < -2) $attr['size'] = '-2'; + if ($size > 4) $attr['size'] = '+4'; + } else { + $size = (int) $attr['size']; + if ($size > 7) $attr['size'] = '7'; + } + if (isset($this->_size_lookup[$attr['size']])) { + $prepend_style .= 'font-size:' . + $this->_size_lookup[$attr['size']] . ';'; + } + unset($attr['size']); + } + + if ($prepend_style) { + $attr['style'] = isset($attr['style']) ? + $prepend_style . $attr['style'] : + $prepend_style; + } + + $new_tag = clone $tag; + $new_tag->name = $this->transform_to; + $new_tag->attr = $attr; + + return $new_tag; + + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php b/libs/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php new file mode 100755 index 0000000..0e36130 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php @@ -0,0 +1,35 @@ +transform_to = $transform_to; + $this->style = $style; + } + + public function transform($tag, $config, $context) { + $new_tag = clone $tag; + $new_tag->name = $this->transform_to; + if (!is_null($this->style) && + ($new_tag instanceof HTMLPurifier_Token_Start || $new_tag instanceof HTMLPurifier_Token_Empty) + ) { + $this->prependCSS($new_tag->attr, $this->style); + } + return $new_tag; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Token.php b/libs/htmlpurifier/library/HTMLPurifier/Token.php new file mode 100755 index 0000000..7900e6c --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Token.php @@ -0,0 +1,57 @@ +line = $l; + $this->col = $c; + } + + /** + * Convenience function for DirectLex settings line/col position. + */ + public function rawPosition($l, $c) { + if ($c === -1) $l++; + $this->line = $l; + $this->col = $c; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Token/Comment.php b/libs/htmlpurifier/library/HTMLPurifier/Token/Comment.php new file mode 100755 index 0000000..dc6bdca --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Token/Comment.php @@ -0,0 +1,22 @@ +data = $data; + $this->line = $line; + $this->col = $col; + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Token/Empty.php b/libs/htmlpurifier/library/HTMLPurifier/Token/Empty.php new file mode 100755 index 0000000..2a82b47 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Token/Empty.php @@ -0,0 +1,11 @@ +!empty($obj->is_tag) + * without having to use a function call is_a(). + */ + public $is_tag = true; + + /** + * The lower-case name of the tag, like 'a', 'b' or 'blockquote'. + * + * @note Strictly speaking, XML tags are case sensitive, so we shouldn't + * be lower-casing them, but these tokens cater to HTML tags, which are + * insensitive. + */ + public $name; + + /** + * Associative array of the tag's attributes. + */ + public $attr = array(); + + /** + * Non-overloaded constructor, which lower-cases passed tag name. + * + * @param $name String name. + * @param $attr Associative array of attributes. + */ + public function __construct($name, $attr = array(), $line = null, $col = null) { + $this->name = ctype_lower($name) ? $name : strtolower($name); + foreach ($attr as $key => $value) { + // normalization only necessary when key is not lowercase + if (!ctype_lower($key)) { + $new_key = strtolower($key); + if (!isset($attr[$new_key])) { + $attr[$new_key] = $attr[$key]; + } + if ($new_key !== $key) { + unset($attr[$key]); + } + } + } + $this->attr = $attr; + $this->line = $line; + $this->col = $col; + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/Token/Text.php b/libs/htmlpurifier/library/HTMLPurifier/Token/Text.php new file mode 100755 index 0000000..82efd82 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/Token/Text.php @@ -0,0 +1,33 @@ +data = $data; + $this->is_whitespace = ctype_space($data); + $this->line = $line; + $this->col = $col; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/TokenFactory.php b/libs/htmlpurifier/library/HTMLPurifier/TokenFactory.php new file mode 100755 index 0000000..7cf48fb --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/TokenFactory.php @@ -0,0 +1,94 @@ +p_start = new HTMLPurifier_Token_Start('', array()); + $this->p_end = new HTMLPurifier_Token_End(''); + $this->p_empty = new HTMLPurifier_Token_Empty('', array()); + $this->p_text = new HTMLPurifier_Token_Text(''); + $this->p_comment= new HTMLPurifier_Token_Comment(''); + } + + /** + * Creates a HTMLPurifier_Token_Start. + * @param $name Tag name + * @param $attr Associative array of attributes + * @return Generated HTMLPurifier_Token_Start + */ + public function createStart($name, $attr = array()) { + $p = clone $this->p_start; + $p->__construct($name, $attr); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_End. + * @param $name Tag name + * @return Generated HTMLPurifier_Token_End + */ + public function createEnd($name) { + $p = clone $this->p_end; + $p->__construct($name); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_Empty. + * @param $name Tag name + * @param $attr Associative array of attributes + * @return Generated HTMLPurifier_Token_Empty + */ + public function createEmpty($name, $attr = array()) { + $p = clone $this->p_empty; + $p->__construct($name, $attr); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_Text. + * @param $data Data of text token + * @return Generated HTMLPurifier_Token_Text + */ + public function createText($data) { + $p = clone $this->p_text; + $p->__construct($data); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_Comment. + * @param $data Data of comment token + * @return Generated HTMLPurifier_Token_Comment + */ + public function createComment($data) { + $p = clone $this->p_comment; + $p->__construct($data); + return $p; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URI.php b/libs/htmlpurifier/library/HTMLPurifier/URI.php new file mode 100755 index 0000000..8b50d0d --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URI.php @@ -0,0 +1,173 @@ +scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme); + $this->userinfo = $userinfo; + $this->host = $host; + $this->port = is_null($port) ? $port : (int) $port; + $this->path = $path; + $this->query = $query; + $this->fragment = $fragment; + } + + /** + * Retrieves a scheme object corresponding to the URI's scheme/default + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + * @return Scheme object appropriate for validating this URI + */ + public function getSchemeObj($config, $context) { + $registry = HTMLPurifier_URISchemeRegistry::instance(); + if ($this->scheme !== null) { + $scheme_obj = $registry->getScheme($this->scheme, $config, $context); + if (!$scheme_obj) return false; // invalid scheme, clean it out + } else { + // no scheme: retrieve the default one + $def = $config->getDefinition('URI'); + $scheme_obj = $registry->getScheme($def->defaultScheme, $config, $context); + if (!$scheme_obj) { + // something funky happened to the default scheme object + trigger_error( + 'Default scheme object "' . $def->defaultScheme . '" was not readable', + E_USER_WARNING + ); + return false; + } + } + return $scheme_obj; + } + + /** + * Generic validation method applicable for all schemes. May modify + * this URI in order to get it into a compliant form. + * @param $config Instance of HTMLPurifier_Config + * @param $context Instance of HTMLPurifier_Context + * @return True if validation/filtering succeeds, false if failure + */ + public function validate($config, $context) { + + // ABNF definitions from RFC 3986 + $chars_sub_delims = '!$&\'()*+,;='; + $chars_gen_delims = ':/?#[]@'; + $chars_pchar = $chars_sub_delims . ':@'; + + // validate scheme (MUST BE FIRST!) + if (!is_null($this->scheme) && is_null($this->host)) { + $def = $config->getDefinition('URI'); + if ($def->defaultScheme === $this->scheme) { + $this->scheme = null; + } + } + + // validate host + if (!is_null($this->host)) { + $host_def = new HTMLPurifier_AttrDef_URI_Host(); + $this->host = $host_def->validate($this->host, $config, $context); + if ($this->host === false) $this->host = null; + } + + // validate username + if (!is_null($this->userinfo)) { + $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':'); + $this->userinfo = $encoder->encode($this->userinfo); + } + + // validate port + if (!is_null($this->port)) { + if ($this->port < 1 || $this->port > 65535) $this->port = null; + } + + // validate path + $path_parts = array(); + $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/'); + if (!is_null($this->host)) { + // path-abempty (hier and relative) + $this->path = $segments_encoder->encode($this->path); + } elseif ($this->path !== '' && $this->path[0] === '/') { + // path-absolute (hier and relative) + if (strlen($this->path) >= 2 && $this->path[1] === '/') { + // This shouldn't ever happen! + $this->path = ''; + } else { + $this->path = $segments_encoder->encode($this->path); + } + } elseif (!is_null($this->scheme) && $this->path !== '') { + // path-rootless (hier) + // Short circuit evaluation means we don't need to check nz + $this->path = $segments_encoder->encode($this->path); + } elseif (is_null($this->scheme) && $this->path !== '') { + // path-noscheme (relative) + // (once again, not checking nz) + $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@'); + $c = strpos($this->path, '/'); + if ($c !== false) { + $this->path = + $segment_nc_encoder->encode(substr($this->path, 0, $c)) . + $segments_encoder->encode(substr($this->path, $c)); + } else { + $this->path = $segment_nc_encoder->encode($this->path); + } + } else { + // path-empty (hier and relative) + $this->path = ''; // just to be safe + } + + // qf = query and fragment + $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?'); + + if (!is_null($this->query)) { + $this->query = $qf_encoder->encode($this->query); + } + + if (!is_null($this->fragment)) { + $this->fragment = $qf_encoder->encode($this->fragment); + } + + return true; + + } + + /** + * Convert URI back to string + * @return String URI appropriate for output + */ + public function toString() { + // reconstruct authority + $authority = null; + if (!is_null($this->host)) { + $authority = ''; + if(!is_null($this->userinfo)) $authority .= $this->userinfo . '@'; + $authority .= $this->host; + if(!is_null($this->port)) $authority .= ':' . $this->port; + } + + // reconstruct the result + $result = ''; + if (!is_null($this->scheme)) $result .= $this->scheme . ':'; + if (!is_null($authority)) $result .= '//' . $authority; + $result .= $this->path; + if (!is_null($this->query)) $result .= '?' . $this->query; + if (!is_null($this->fragment)) $result .= '#' . $this->fragment; + + return $result; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIDefinition.php b/libs/htmlpurifier/library/HTMLPurifier/URIDefinition.php new file mode 100755 index 0000000..183fcfc --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIDefinition.php @@ -0,0 +1,93 @@ +registerFilter(new HTMLPurifier_URIFilter_DisableExternal()); + $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternalResources()); + $this->registerFilter(new HTMLPurifier_URIFilter_HostBlacklist()); + $this->registerFilter(new HTMLPurifier_URIFilter_MakeAbsolute()); + $this->registerFilter(new HTMLPurifier_URIFilter_Munge()); + } + + public function registerFilter($filter) { + $this->registeredFilters[$filter->name] = $filter; + } + + public function addFilter($filter, $config) { + $r = $filter->prepare($config); + if ($r === false) return; // null is ok, for backwards compat + if ($filter->post) { + $this->postFilters[$filter->name] = $filter; + } else { + $this->filters[$filter->name] = $filter; + } + } + + protected function doSetup($config) { + $this->setupMemberVariables($config); + $this->setupFilters($config); + } + + protected function setupFilters($config) { + foreach ($this->registeredFilters as $name => $filter) { + $conf = $config->get('URI', $name); + if ($conf !== false && $conf !== null) { + $this->addFilter($filter, $config); + } + } + unset($this->registeredFilters); + } + + protected function setupMemberVariables($config) { + $this->host = $config->get('URI', 'Host'); + $base_uri = $config->get('URI', 'Base'); + if (!is_null($base_uri)) { + $parser = new HTMLPurifier_URIParser(); + $this->base = $parser->parse($base_uri); + $this->defaultScheme = $this->base->scheme; + if (is_null($this->host)) $this->host = $this->base->host; + } + if (is_null($this->defaultScheme)) $this->defaultScheme = $config->get('URI', 'DefaultScheme'); + } + + public function filter(&$uri, $config, $context) { + foreach ($this->filters as $name => $f) { + $result = $f->filter($uri, $config, $context); + if (!$result) return false; + } + return true; + } + + public function postFilter(&$uri, $config, $context) { + foreach ($this->postFilters as $name => $f) { + $result = $f->filter($uri, $config, $context); + if (!$result) return false; + } + return true; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIFilter.php b/libs/htmlpurifier/library/HTMLPurifier/URIFilter.php new file mode 100755 index 0000000..c116f93 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIFilter.php @@ -0,0 +1,45 @@ +getDefinition('URI')->host; + if ($our_host !== null) $this->ourHostParts = array_reverse(explode('.', $our_host)); + } + public function filter(&$uri, $config, $context) { + if (is_null($uri->host)) return true; + if ($this->ourHostParts === false) return false; + $host_parts = array_reverse(explode('.', $uri->host)); + foreach ($this->ourHostParts as $i => $x) { + if (!isset($host_parts[$i])) return false; + if ($host_parts[$i] != $this->ourHostParts[$i]) return false; + } + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php new file mode 100755 index 0000000..881abc4 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php @@ -0,0 +1,12 @@ +get('EmbeddedURI', true)) return true; + return parent::filter($uri, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php new file mode 100755 index 0000000..bac56e8 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php @@ -0,0 +1,21 @@ +blacklist = $config->get('URI', 'HostBlacklist'); + return true; + } + public function filter(&$uri, $config, $context) { + foreach($this->blacklist as $blacklisted_host_fragment) { + if (strpos($uri->host, $blacklisted_host_fragment) !== false) { + return false; + } + } + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php new file mode 100755 index 0000000..f46ab26 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php @@ -0,0 +1,114 @@ +getDefinition('URI'); + $this->base = $def->base; + if (is_null($this->base)) { + trigger_error('URI.MakeAbsolute is being ignored due to lack of value for URI.Base configuration', E_USER_WARNING); + return false; + } + $this->base->fragment = null; // fragment is invalid for base URI + $stack = explode('/', $this->base->path); + array_pop($stack); // discard last segment + $stack = $this->_collapseStack($stack); // do pre-parsing + $this->basePathStack = $stack; + return true; + } + public function filter(&$uri, $config, $context) { + if (is_null($this->base)) return true; // abort early + if ( + $uri->path === '' && is_null($uri->scheme) && + is_null($uri->host) && is_null($uri->query) && is_null($uri->fragment) + ) { + // reference to current document + $uri = clone $this->base; + return true; + } + if (!is_null($uri->scheme)) { + // absolute URI already: don't change + if (!is_null($uri->host)) return true; + $scheme_obj = $uri->getSchemeObj($config, $context); + if (!$scheme_obj) { + // scheme not recognized + return false; + } + if (!$scheme_obj->hierarchical) { + // non-hierarchal URI with explicit scheme, don't change + return true; + } + // special case: had a scheme but always is hierarchical and had no authority + } + if (!is_null($uri->host)) { + // network path, don't bother + return true; + } + if ($uri->path === '') { + $uri->path = $this->base->path; + } elseif ($uri->path[0] !== '/') { + // relative path, needs more complicated processing + $stack = explode('/', $uri->path); + $new_stack = array_merge($this->basePathStack, $stack); + if ($new_stack[0] !== '' && !is_null($this->base->host)) { + array_unshift($new_stack, ''); + } + $new_stack = $this->_collapseStack($new_stack); + $uri->path = implode('/', $new_stack); + } else { + // absolute path, but still we should collapse + $uri->path = implode('/', $this->_collapseStack(explode('/', $uri->path))); + } + // re-combine + $uri->scheme = $this->base->scheme; + if (is_null($uri->userinfo)) $uri->userinfo = $this->base->userinfo; + if (is_null($uri->host)) $uri->host = $this->base->host; + if (is_null($uri->port)) $uri->port = $this->base->port; + return true; + } + + /** + * Resolve dots and double-dots in a path stack + */ + private function _collapseStack($stack) { + $result = array(); + $is_folder = false; + for ($i = 0; isset($stack[$i]); $i++) { + $is_folder = false; + // absorb an internally duplicated slash + if ($stack[$i] == '' && $i && isset($stack[$i+1])) continue; + if ($stack[$i] == '..') { + if (!empty($result)) { + $segment = array_pop($result); + if ($segment === '' && empty($result)) { + // error case: attempted to back out too far: + // restore the leading slash + $result[] = ''; + } elseif ($segment === '..') { + $result[] = '..'; // cannot remove .. with .. + } + } else { + // relative path, preserve the double-dots + $result[] = '..'; + } + $is_folder = true; + continue; + } + if ($stack[$i] == '.') { + // silently absorb + $is_folder = true; + continue; + } + $result[] = $stack[$i]; + } + if ($is_folder) $result[] = ''; + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php new file mode 100755 index 0000000..29ed0ed --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php @@ -0,0 +1,54 @@ +target = $config->get('URI', $this->name); + $this->parser = new HTMLPurifier_URIParser(); + $this->doEmbed = $config->get('URI', 'MungeResources'); + $this->secretKey = $config->get('URI', 'MungeSecretKey'); + return true; + } + public function filter(&$uri, $config, $context) { + if ($context->get('EmbeddedURI', true) && !$this->doEmbed) return true; + + $scheme_obj = $uri->getSchemeObj($config, $context); + if (!$scheme_obj) return true; // ignore unknown schemes, maybe another postfilter did it + if (is_null($uri->host) || empty($scheme_obj->browsable)) { + return true; + } + + $this->makeReplace($uri, $config, $context); + $this->replace = array_map('rawurlencode', $this->replace); + + $new_uri = strtr($this->target, $this->replace); + $new_uri = $this->parser->parse($new_uri); + // don't redirect if the target host is the same as the + // starting host + if ($uri->host === $new_uri->host) return true; + $uri = $new_uri; // overwrite + return true; + } + + protected function makeReplace($uri, $config, $context) { + $string = $uri->toString(); + // always available + $this->replace['%s'] = $string; + $this->replace['%r'] = $context->get('EmbeddedURI', true); + $token = $context->get('CurrentToken', true); + $this->replace['%n'] = $token ? $token->name : null; + $this->replace['%m'] = $context->get('CurrentAttr', true); + $this->replace['%p'] = $context->get('CurrentCSSProperty', true); + // not always available + if ($this->secretKey) $this->replace['%t'] = sha1($this->secretKey . ':' . $string); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIParser.php b/libs/htmlpurifier/library/HTMLPurifier/URIParser.php new file mode 100755 index 0000000..7179e4a --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIParser.php @@ -0,0 +1,70 @@ +percentEncoder = new HTMLPurifier_PercentEncoder(); + } + + /** + * Parses a URI. + * @param $uri string URI to parse + * @return HTMLPurifier_URI representation of URI. This representation has + * not been validated yet and may not conform to RFC. + */ + public function parse($uri) { + + $uri = $this->percentEncoder->normalize($uri); + + // Regexp is as per Appendix B. + // Note that ["<>] are an addition to the RFC's recommended + // characters, because they represent external delimeters. + $r_URI = '!'. + '(([^:/?#"<>]+):)?'. // 2. Scheme + '(//([^/?#"<>]*))?'. // 4. Authority + '([^?#"<>]*)'. // 5. Path + '(\?([^#"<>]*))?'. // 7. Query + '(#([^"<>]*))?'. // 8. Fragment + '!'; + + $matches = array(); + $result = preg_match($r_URI, $uri, $matches); + + if (!$result) return false; // *really* invalid URI + + // seperate out parts + $scheme = !empty($matches[1]) ? $matches[2] : null; + $authority = !empty($matches[3]) ? $matches[4] : null; + $path = $matches[5]; // always present, can be empty + $query = !empty($matches[6]) ? $matches[7] : null; + $fragment = !empty($matches[8]) ? $matches[9] : null; + + // further parse authority + if ($authority !== null) { + $r_authority = "/^((.+?)@)?(\[[^\]]+\]|[^:]*)(:(\d*))?/"; + $matches = array(); + preg_match($r_authority, $authority, $matches); + $userinfo = !empty($matches[1]) ? $matches[2] : null; + $host = !empty($matches[3]) ? $matches[3] : ''; + $port = !empty($matches[4]) ? (int) $matches[5] : null; + } else { + $port = $host = $userinfo = null; + } + + return new HTMLPurifier_URI( + $scheme, $userinfo, $host, $port, $path, $query, $fragment); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme.php new file mode 100755 index 0000000..039710f --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIScheme.php @@ -0,0 +1,42 @@ +, resolves edge cases + * with making relative URIs absolute + */ + public $hierarchical = false; + + /** + * Validates the components of a URI + * @note This implementation should be called by children if they define + * a default port, as it does port processing. + * @param $uri Instance of HTMLPurifier_URI + * @param $config HTMLPurifier_Config object + * @param $context HTMLPurifier_Context object + * @return Bool success or failure + */ + public function validate(&$uri, $config, $context) { + if ($this->default_port == $uri->port) $uri->port = null; + return true; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php new file mode 100755 index 0000000..5849bf7 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php @@ -0,0 +1,43 @@ +query = null; + + // typecode check + $semicolon_pos = strrpos($uri->path, ';'); // reverse + if ($semicolon_pos !== false) { + $type = substr($uri->path, $semicolon_pos + 1); // no semicolon + $uri->path = substr($uri->path, 0, $semicolon_pos); + $type_ret = ''; + if (strpos($type, '=') !== false) { + // figure out whether or not the declaration is correct + list($key, $typecode) = explode('=', $type, 2); + if ($key !== 'type') { + // invalid key, tack it back on encoded + $uri->path .= '%3B' . $type; + } elseif ($typecode === 'a' || $typecode === 'i' || $typecode === 'd') { + $type_ret = ";type=$typecode"; + } + } else { + $uri->path .= '%3B' . $type; + } + $uri->path = str_replace(';', '%3B', $uri->path); + $uri->path .= $type_ret; + } + + return true; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme/http.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/http.php new file mode 100755 index 0000000..b097a31 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/http.php @@ -0,0 +1,20 @@ +userinfo = null; + return true; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme/https.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/https.php new file mode 100755 index 0000000..29e3809 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/https.php @@ -0,0 +1,12 @@ +userinfo = null; + $uri->host = null; + $uri->port = null; + // we need to validate path against RFC 2368's addr-spec + return true; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme/news.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/news.php new file mode 100755 index 0000000..f5f54f4 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/news.php @@ -0,0 +1,22 @@ +userinfo = null; + $uri->host = null; + $uri->port = null; + $uri->query = null; + // typecode check needed on path + return true; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php new file mode 100755 index 0000000..5bf93ea --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php @@ -0,0 +1,20 @@ +userinfo = null; + $uri->query = null; + return true; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php b/libs/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php new file mode 100755 index 0000000..d24732c --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php @@ -0,0 +1,69 @@ +get('URI', 'AllowedSchemes'); + if (!$config->get('URI', 'OverrideAllowedSchemes') && + !isset($allowed_schemes[$scheme]) + ) { + return $null; + } + + if (isset($this->schemes[$scheme])) return $this->schemes[$scheme]; + if (!isset($allowed_schemes[$scheme])) return $null; + + $class = 'HTMLPurifier_URIScheme_' . $scheme; + if (!class_exists($class)) return $null; + $this->schemes[$scheme] = new $class(); + return $this->schemes[$scheme]; + } + + /** + * Registers a custom scheme to the cache, bypassing reflection. + * @param $scheme Scheme name + * @param $scheme_obj HTMLPurifier_URIScheme object + */ + public function register($scheme, $scheme_obj) { + $this->schemes[$scheme] = $scheme_obj; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/UnitConverter.php b/libs/htmlpurifier/library/HTMLPurifier/UnitConverter.php new file mode 100755 index 0000000..545d426 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/UnitConverter.php @@ -0,0 +1,254 @@ + array( + 'px' => 3, // This is as per CSS 2.1 and Firefox. Your mileage may vary + 'pt' => 4, + 'pc' => 48, + 'in' => 288, + self::METRIC => array('pt', '0.352777778', 'mm'), + ), + self::METRIC => array( + 'mm' => 1, + 'cm' => 10, + self::ENGLISH => array('mm', '2.83464567', 'pt'), + ), + ); + + /** + * Minimum bcmath precision for output. + */ + protected $outputPrecision; + + /** + * Bcmath precision for internal calculations. + */ + protected $internalPrecision; + + /** + * Whether or not BCMath is available + */ + private $bcmath; + + public function __construct($output_precision = 4, $internal_precision = 10, $force_no_bcmath = false) { + $this->outputPrecision = $output_precision; + $this->internalPrecision = $internal_precision; + $this->bcmath = !$force_no_bcmath && function_exists('bcmul'); + } + + /** + * Converts a length object of one unit into another unit. + * @param HTMLPurifier_Length $length + * Instance of HTMLPurifier_Length to convert. You must validate() + * it before passing it here! + * @param string $to_unit + * Unit to convert to. + * @note + * About precision: This conversion function pays very special + * attention to the incoming precision of values and attempts + * to maintain a number of significant figure. Results are + * fairly accurate up to nine digits. Some caveats: + * - If a number is zero-padded as a result of this significant + * figure tracking, the zeroes will be eliminated. + * - If a number contains less than four sigfigs ($outputPrecision) + * and this causes some decimals to be excluded, those + * decimals will be added on. + */ + public function convert($length, $to_unit) { + + if (!$length->isValid()) return false; + + $n = $length->getN(); + $unit = $length->getUnit(); + + if ($n === '0' || $unit === false) { + return new HTMLPurifier_Length('0', false); + } + + $state = $dest_state = false; + foreach (self::$units as $k => $x) { + if (isset($x[$unit])) $state = $k; + if (isset($x[$to_unit])) $dest_state = $k; + } + if (!$state || !$dest_state) return false; + + // Some calculations about the initial precision of the number; + // this will be useful when we need to do final rounding. + $sigfigs = $this->getSigFigs($n); + if ($sigfigs < $this->outputPrecision) $sigfigs = $this->outputPrecision; + + // BCMath's internal precision deals only with decimals. Use + // our default if the initial number has no decimals, or increase + // it by how ever many decimals, thus, the number of guard digits + // will always be greater than or equal to internalPrecision. + $log = (int) floor(log(abs($n), 10)); + $cp = ($log < 0) ? $this->internalPrecision - $log : $this->internalPrecision; // internal precision + + for ($i = 0; $i < 2; $i++) { + + // Determine what unit IN THIS SYSTEM we need to convert to + if ($dest_state === $state) { + // Simple conversion + $dest_unit = $to_unit; + } else { + // Convert to the smallest unit, pending a system shift + $dest_unit = self::$units[$state][$dest_state][0]; + } + + // Do the conversion if necessary + if ($dest_unit !== $unit) { + $factor = $this->div(self::$units[$state][$unit], self::$units[$state][$dest_unit], $cp); + $n = $this->mul($n, $factor, $cp); + $unit = $dest_unit; + } + + // Output was zero, so bail out early. Shouldn't ever happen. + if ($n === '') { + $n = '0'; + $unit = $to_unit; + break; + } + + // It was a simple conversion, so bail out + if ($dest_state === $state) { + break; + } + + if ($i !== 0) { + // Conversion failed! Apparently, the system we forwarded + // to didn't have this unit. This should never happen! + return false; + } + + // Pre-condition: $i == 0 + + // Perform conversion to next system of units + $n = $this->mul($n, self::$units[$state][$dest_state][1], $cp); + $unit = self::$units[$state][$dest_state][2]; + $state = $dest_state; + + // One more loop around to convert the unit in the new system. + + } + + // Post-condition: $unit == $to_unit + if ($unit !== $to_unit) return false; + + // Useful for debugging: + //echo "
      n";
      +        //echo "$n\nsigfigs = $sigfigs\nnew_log = $new_log\nlog = $log\nrp = $rp\n
      \n"; + + $n = $this->round($n, $sigfigs); + if (strpos($n, '.') !== false) $n = rtrim($n, '0'); + $n = rtrim($n, '.'); + + return new HTMLPurifier_Length($n, $unit); + } + + /** + * Returns the number of significant figures in a string number. + * @param string $n Decimal number + * @return int number of sigfigs + */ + public function getSigFigs($n) { + $n = ltrim($n, '0+-'); + $dp = strpos($n, '.'); // decimal position + if ($dp === false) { + $sigfigs = strlen(rtrim($n, '0')); + } else { + $sigfigs = strlen(ltrim($n, '0.')); // eliminate extra decimal character + if ($dp !== 0) $sigfigs--; + } + return $sigfigs; + } + + /** + * Adds two numbers, using arbitrary precision when available. + */ + private function add($s1, $s2, $scale) { + if ($this->bcmath) return bcadd($s1, $s2, $scale); + else return $this->scale($s1 + $s2, $scale); + } + + /** + * Multiples two numbers, using arbitrary precision when available. + */ + private function mul($s1, $s2, $scale) { + if ($this->bcmath) return bcmul($s1, $s2, $scale); + else return $this->scale($s1 * $s2, $scale); + } + + /** + * Divides two numbers, using arbitrary precision when available. + */ + private function div($s1, $s2, $scale) { + if ($this->bcmath) return bcdiv($s1, $s2, $scale); + else return $this->scale($s1 / $s2, $scale); + } + + /** + * Rounds a number according to the number of sigfigs it should have, + * using arbitrary precision when available. + */ + private function round($n, $sigfigs) { + $new_log = (int) floor(log(abs($n), 10)); // Number of digits left of decimal - 1 + $rp = $sigfigs - $new_log - 1; // Number of decimal places needed + $neg = $n < 0 ? '-' : ''; // Negative sign + if ($this->bcmath) { + if ($rp >= 0) { + $n = bcadd($n, $neg . '0.' . str_repeat('0', $rp) . '5', $rp + 1); + $n = bcdiv($n, '1', $rp); + } else { + // This algorithm partially depends on the standardized + // form of numbers that comes out of bcmath. + $n = bcadd($n, $neg . '5' . str_repeat('0', $new_log - $sigfigs), 0); + $n = substr($n, 0, $sigfigs + strlen($neg)) . str_repeat('0', $new_log - $sigfigs + 1); + } + return $n; + } else { + return $this->scale(round($n, $sigfigs - $new_log - 1), $rp + 1); + } + } + + /** + * Scales a float to $scale digits right of decimal point, like BCMath. + */ + private function scale($r, $scale) { + if ($scale < 0) { + // The f sprintf type doesn't support negative numbers, so we + // need to cludge things manually. First get the string. + $r = sprintf('%.0f', (float) $r); + // Due to floating point precision loss, $r will more than likely + // look something like 4652999999999.9234. We grab one more digit + // than we need to precise from $r and then use that to round + // appropriately. + $precise = (string) round(substr($r, 0, strlen($r) + $scale), -1); + // Now we return it, truncating the zero that was rounded off. + return substr($precise, 0, -1) . str_repeat('0', -$scale + 1); + } + return sprintf('%.' . $scale . 'f', (float) $r); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/VarParser.php b/libs/htmlpurifier/library/HTMLPurifier/VarParser.php new file mode 100755 index 0000000..68e72ae --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/VarParser.php @@ -0,0 +1,154 @@ + self::STRING, + 'istring' => self::ISTRING, + 'text' => self::TEXT, + 'itext' => self::ITEXT, + 'int' => self::INT, + 'float' => self::FLOAT, + 'bool' => self::BOOL, + 'lookup' => self::LOOKUP, + 'list' => self::ALIST, + 'hash' => self::HASH, + 'mixed' => self::MIXED + ); + + /** + * Lookup table of types that are string, and can have aliases or + * allowed value lists. + */ + static public $stringTypes = array( + self::STRING => true, + self::ISTRING => true, + self::TEXT => true, + self::ITEXT => true, + ); + + /** + * Validate a variable according to type. Throws + * HTMLPurifier_VarParserException if invalid. + * It may return NULL as a valid type if $allow_null is true. + * + * @param $var Variable to validate + * @param $type Type of variable, see HTMLPurifier_VarParser->types + * @param $allow_null Whether or not to permit null as a value + * @return Validated and type-coerced variable + */ + final public function parse($var, $type, $allow_null = false) { + if (is_string($type)) { + if (!isset(HTMLPurifier_VarParser::$types[$type])) { + throw new HTMLPurifier_VarParserException("Invalid type '$type'"); + } else { + $type = HTMLPurifier_VarParser::$types[$type]; + } + } + $var = $this->parseImplementation($var, $type, $allow_null); + if ($allow_null && $var === null) return null; + // These are basic checks, to make sure nothing horribly wrong + // happened in our implementations. + switch ($type) { + case (self::STRING): + case (self::ISTRING): + case (self::TEXT): + case (self::ITEXT): + if (!is_string($var)) break; + if ($type == self::ISTRING || $type == self::ITEXT) $var = strtolower($var); + return $var; + case (self::INT): + if (!is_int($var)) break; + return $var; + case (self::FLOAT): + if (!is_float($var)) break; + return $var; + case (self::BOOL): + if (!is_bool($var)) break; + return $var; + case (self::LOOKUP): + case (self::ALIST): + case (self::HASH): + if (!is_array($var)) break; + if ($type === self::LOOKUP) { + foreach ($var as $k) if ($k !== true) $this->error('Lookup table contains value other than true'); + } elseif ($type === self::ALIST) { + $keys = array_keys($var); + if (array_keys($keys) !== $keys) $this->error('Indices for list are not uniform'); + } + return $var; + case (self::MIXED): + return $var; + default: + $this->errorInconsistent(get_class($this), $type); + } + $this->errorGeneric($var, $type); + } + + /** + * Actually implements the parsing. Base implementation is to not + * do anything to $var. Subclasses should overload this! + */ + protected function parseImplementation($var, $type, $allow_null) { + return $var; + } + + /** + * Throws an exception. + */ + protected function error($msg) { + throw new HTMLPurifier_VarParserException($msg); + } + + /** + * Throws an inconsistency exception. + * @note This should not ever be called. It would be called if we + * extend the allowed values of HTMLPurifier_VarParser without + * updating subclasses. + */ + protected function errorInconsistent($class, $type) { + throw new HTMLPurifier_Exception("Inconsistency in $class: ".HTMLPurifier_VarParser::getTypeName($type)." not implemented"); + } + + /** + * Generic error for if a type didn't work. + */ + protected function errorGeneric($var, $type) { + $vtype = gettype($var); + $this->error("Expected type ".HTMLPurifier_VarParser::getTypeName($type).", got $vtype"); + } + + static public function getTypeName($type) { + static $lookup; + if (!$lookup) { + // Lazy load the alternative lookup table + $lookup = array_flip(HTMLPurifier_VarParser::$types); + } + if (!isset($lookup[$type])) return 'unknown'; + return $lookup[$type]; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php b/libs/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php new file mode 100755 index 0000000..c954250 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php @@ -0,0 +1,96 @@ + $j) $var[$i] = trim($j); + if ($type === self::HASH) { + // key:value,key2:value2 + $nvar = array(); + foreach ($var as $keypair) { + $c = explode(':', $keypair, 2); + if (!isset($c[1])) continue; + $nvar[$c[0]] = $c[1]; + } + $var = $nvar; + } + } + if (!is_array($var)) break; + $keys = array_keys($var); + if ($keys === array_keys($keys)) { + if ($type == self::ALIST) return $var; + elseif ($type == self::LOOKUP) { + $new = array(); + foreach ($var as $key) { + $new[$key] = true; + } + return $new; + } else break; + } + if ($type === self::LOOKUP) { + foreach ($var as $key => $value) { + $var[$key] = true; + } + } + return $var; + default: + $this->errorInconsistent(__CLASS__, $type); + } + $this->errorGeneric($var, $type); + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/VarParser/Native.php b/libs/htmlpurifier/library/HTMLPurifier/VarParser/Native.php new file mode 100755 index 0000000..b02a6de --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/VarParser/Native.php @@ -0,0 +1,26 @@ +evalExpression($var); + } + + protected function evalExpression($expr) { + $var = null; + $result = eval("\$var = $expr;"); + if ($result === false) { + throw new HTMLPurifier_VarParserException("Fatal error in evaluated code"); + } + return $var; + } + +} + +// vim: et sw=4 sts=4 diff --git a/libs/htmlpurifier/library/HTMLPurifier/VarParserException.php b/libs/htmlpurifier/library/HTMLPurifier/VarParserException.php new file mode 100755 index 0000000..5df3414 --- /dev/null +++ b/libs/htmlpurifier/library/HTMLPurifier/VarParserException.php @@ -0,0 +1,11 @@ +view->version = Application::VERSION; + + try { + $feed = Zend_Feed::import('http://source.keyboard-monkeys.org/projects/communityid/news?format=atom'); + } 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++ >= self::NEWS_NUM_ITEMS) { + break; + } + + // ATOM uses , while RSS uses foo + $item->link = $item->link['href']? $item->link['href'] : $item->link; + + 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; + } + + $this->_helper->actionStack('index', 'login', 'users'); + } +} diff --git a/modules/default/controllers/FeedbackController.php b/modules/default/controllers/FeedbackController.php index 429ef87..683aaa4 100644 --- a/modules/default/controllers/FeedbackController.php +++ b/modules/default/controllers/FeedbackController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class FeedbackController extends Monkeys_Controller_Action +class FeedbackController extends CommunityID_Controller_Action { protected $_numCols = 1; @@ -17,7 +17,7 @@ class FeedbackController extends Monkeys_Controller_Action { parent::init(); - if ($this->user->role != User::ROLE_ADMIN && $this->underMaintenance) { + if ($this->user->role != Users_Model_User::ROLE_ADMIN && $this->underMaintenance) { return $this->_redirectForMaintenance(); } } @@ -29,14 +29,14 @@ class FeedbackController extends Monkeys_Controller_Action $form = $appSession->feedbackForm; unset($appSession->feedbackForm); } else { - $form = new FeedbackForm(null, $this->view->base); + $form = new Form_Feedback(null, $this->view->base); } $this->view->form = $form; } public function sendAction() { - $form = new FeedbackForm(null, $this->view->base); + $form = new Form_Feedback(null, $this->view->base); $formData = $this->_request->getPost(); $form->populate($formData); @@ -102,7 +102,7 @@ Feedback: $feedback EOD ); - $mail->setFrom($this->_config->email->supportemail); + $mail->setFrom($configEmail->supportemail); $mail->addTo($configEmail->supportemail); $mail->setSubject('Community-ID feedback form'); diff --git a/modules/default/controllers/HistoryController.php b/modules/default/controllers/HistoryController.php index 39dd875..f38e62e 100755 --- a/modules/default/controllers/HistoryController.php +++ b/modules/default/controllers/HistoryController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class HistoryController extends Monkeys_Controller_Action +class HistoryController extends CommunityID_Controller_Action { public function indexAction() { @@ -20,11 +20,13 @@ class HistoryController extends Monkeys_Controller_Action { $this->_helper->viewRenderer->setNeverRender(true); - $histories = new Histories(); + $histories = new Model_Histories(); $historiesRows = $histories->get( $this->user, $this->_getParam('startIndex'), - $this->_getParam('results') + $this->_getParam('results'), + $this->_getParam('sort', 'date'), + $this->_getParam('dir', Model_Histories::DIR_DESC) ); $jsonObj = new StdClass(); @@ -53,7 +55,7 @@ class HistoryController extends Monkeys_Controller_Action { $this->_helper->viewRenderer->setNeverRender(true); - $histories = new Histories(); + $histories = new Model_Histories(); $histories->clear($this->user); $json = new StdClass(); diff --git a/modules/default/controllers/IdentityController.php b/modules/default/controllers/IdentityController.php index e7ff598..f2ff613 100644 --- a/modules/default/controllers/IdentityController.php +++ b/modules/default/controllers/IdentityController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class IdentityController extends Monkeys_Controller_Action +class IdentityController extends CommunityID_Controller_Action { protected $_numCols = 1; @@ -20,39 +20,15 @@ class IdentityController extends Monkeys_Controller_Action public function idAction() { - $currentUrl = Zend_OpenId::selfURL(); + $this->view->headLink()->headLink(array( + 'rel' => 'openid.server', + 'href' => $this->_helper->ProviderUrl($this->_config) + )); + $this->view->headLink()->headLink(array( + 'rel' => 'openid2.provider', + 'href' => $this->_helper->ProviderUrl($this->_config) + )); - 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; + $this->view->idUrl = urldecode(Zend_OpenId::selfURL()); } } diff --git a/modules/default/controllers/IndexController.php b/modules/default/controllers/IndexController.php index 4a77a6a..9c6a128 100644 --- a/modules/default/controllers/IndexController.php +++ b/modules/default/controllers/IndexController.php @@ -9,9 +9,9 @@ * @packager Keyboard Monkeys */ -class IndexController extends Monkeys_Controller_Action +class IndexController extends CommunityID_Controller_Action { - const NEWS_CONTENT_MAX_LENGTH = 100; + const NEWS_NUMBER = 4; public function indexAction() { @@ -41,31 +41,8 @@ class IndexController extends Monkeys_Controller_Action $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; - } + $news = new News_Model_News(); + $this->view->news = $news->getLatest(self::NEWS_NUMBER, $this->user); $view = false; foreach ($scriptsDir as $scriptDir) { diff --git a/modules/default/controllers/LearnmoreController.php b/modules/default/controllers/LearnmoreController.php index 6b1f2a3..d7b7596 100644 --- a/modules/default/controllers/LearnmoreController.php +++ b/modules/default/controllers/LearnmoreController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class LearnmoreController extends Monkeys_Controller_Action +class LearnmoreController extends CommunityID_Controller_Action { protected $_numCols = 1; diff --git a/modules/default/controllers/MaintenancemodeController.php b/modules/default/controllers/MaintenancemodeController.php index d535a54..4d242e0 100644 --- a/modules/default/controllers/MaintenancemodeController.php +++ b/modules/default/controllers/MaintenancemodeController.php @@ -9,26 +9,18 @@ * @packager Keyboard Monkeys */ -class MaintenancemodeController extends Monkeys_Controller_Action +class MaintenancemodeController extends CommunityID_Controller_Action { - private $_settings; - - public function init() - { - parent::init(); - $this->_settings = new Settings(); - } - public function enableAction() { - $this->_settings->set(Settings::MAINTENANCE_MODE, 1); + $this->_settings->set(Model_Settings::MAINTENANCE_MODE, 1); $this->_redirect(''); } public function disableAction() { - $this->_settings->set(Settings::MAINTENANCE_MODE, 0); + $this->_settings->set(Model_Settings::MAINTENANCE_MODE, 0); $this->_redirect(''); } diff --git a/modules/default/controllers/MessageusersController.php b/modules/default/controllers/MessageusersController.php index 77ceb5d..5664a94 100644 --- a/modules/default/controllers/MessageusersController.php +++ b/modules/default/controllers/MessageusersController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class MessageusersController extends Monkeys_Controller_Action +class MessageusersController extends CommunityID_Controller_Action { public function indexAction() { @@ -18,7 +18,7 @@ class MessageusersController extends Monkeys_Controller_Action $this->view->messageUsersForm = $appSession->messageUsersForm; unset($appSession->messageUsersForm); } else { - $this->view->messageUsersForm = new MessageUsersForm(); + $this->view->messageUsersForm = new Form_MessageUsers(); } $this->_helper->actionStack('index', 'login', 'users'); @@ -26,7 +26,7 @@ class MessageusersController extends Monkeys_Controller_Action public function sendAction() { - $form = new MessageUsersForm(); + $form = new Form_MessageUsers(); $formData = $this->_request->getPost(); $form->populate($formData); @@ -35,13 +35,13 @@ class MessageusersController extends Monkeys_Controller_Action } $cc = $form->getValue('cc'); - $ccArr = array(); + $bccArr = 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])) { + $bccArr = explode(',', $cc); + for ($i = 0; $i < count($bccArr); $i++) { + $bccArr[$i] = trim($bccArr[$i]); + if (!$validator->isValid($bccArr[$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); @@ -65,13 +65,17 @@ class MessageusersController extends Monkeys_Controller_Action $mail->setBodyHtml($form->getValue('bodyHTML')); } - $users = new Users(); + $users = new Users_Model_Users(); foreach ($users->getUsers() as $user) { - $mail->addTo($user->email); + if ($user->role == ROLE_ADMIN) { + continue; + } + + $mail->addBcc($user->email); } - foreach ($ccArr as $cc) { - $mail->addCC($cc); + foreach ($bccArr as $bcc) { + $mail->addBcc($bcc); } try { @@ -122,7 +126,10 @@ class MessageusersController extends Monkeys_Controller_Action } $mail = new Zend_Mail('UTF-8'); - $mail->setFrom($this->_config->email->supportemail); + $mail->setFrom($configEmail->supportemail); + + // all recipients will be in BCC, but I need at least one in the To header + $mail->addTo($configEmail->supportemail); return $mail; } diff --git a/modules/default/controllers/OpenidController.php b/modules/default/controllers/OpenidController.php index f936fe1..f43169b 100644 --- a/modules/default/controllers/OpenidController.php +++ b/modules/default/controllers/OpenidController.php @@ -9,167 +9,292 @@ * @packager Keyboard Monkeys */ -class OpenidController extends Monkeys_Controller_Action +class OpenidController extends CommunityID_Controller_Action { + protected $_numCols = 1; + public function providerAction() { - if (isset($_POST['action']) && $_POST['action'] == 'proceed') { - return $this->_proceed(); - } else { - Zend_OpenId::$exitOnRedirect = false; + $server = $this->_getOpenIdProvider(); + $request = $server->decodeRequest(); + $sites = new Model_Sites(); - $this->_helper->layout->disableLayout(); + if (!$request) { $this->_helper->viewRenderer->setNeverRender(true); + header('HTTP/1.0 403 Forbidden'); + Zend_Registry::get('logger')->log("OpenIdController::providerAction: FORBIDDEN", Zend_Log::DEBUG); + echo 'Forbidden'; + return; + } - $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')) + // association and other transactions, handled automatically by the framework + if (!in_array($request->mode, array('checkid_immediate', 'checkid_setup'))) { + return $this->_sendResponse($server, $server->handleRequest($request)); + } - { - $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); + // can't process immediate requests if user is not logged in + if ($request->immediate && $this->user->role == Users_Model_User::ROLE_GUEST) { + return $this->_sendResponse($server, $request->answer(false)); + } + + if ($request->idSelect()) { + if ($this->user->role == Users_Model_User::ROLE_GUEST) { + $this->_forward('login'); + } else { + if ($sites->isTrusted($this->user, $request->trust_root)) { + $this->_forward('proceed', null, null, array('allow' => true)); + } elseif ($sites->isNeverTrusted($this->user, $request->trust_root)) { + $this->_forward('proceed', null, null, array('allow' => false)); + } else { + if ($request->immediate) { + return $this->_sendResponse($server, $request->answer(false)); + } + + $this->_forward('trust'); + } + } + } else { + if (!$request->identity) { + die('No identifier sent by OpenID relay'); + } + + if ($this->user->role == Users_Model_User::ROLE_GUEST) { + $this->_forward('login'); + } else { + // user is logged-in already. Check the requested identity is his + if ($this->user->openid != $request->identity) { + Zend_Auth::getInstance()->clearIdentity(); + if ($this->immediate) { + return $this->_sendResponse($server, $request->answer(false)); + } + + $this->_forward('login'); + } else { + if ($sites->isTrusted($this->user, $request->trust_root)) { + $this->_forward('proceed', null, null, array('allow' => true)); + } elseif ($sites->isNeverTrusted($this->user, $request->trust_root)) { + $this->_forward('proceed', null, null, array('deny' => true)); } else { - $this->_saveHistory($server, History::AUTHORIZED); + $this->_forward('trust'); } } } } } + /** + * We don't use the session with the login form to simplify the dynamic appearance of the captcha + */ 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'])); + $server = $this->_getOpenIdProvider(); + $request = $server->decodeRequest(); - $this->view->queryString = $_SERVER['QUERY_STRING']; + $authAttempts = new Users_Model_AuthAttempts(); + $attempt = $authAttempts->get(); + $this->view->useCaptcha = $attempt && $attempt->surpassedMaxAllowed(); + $this->view->form = new Form_OpenidLogin(null, $this->view->base, $attempt && $attempt->surpassedMaxAllowed()); + + if (!$request->idSelect()) { + $this->view->form->openIdIdentity->setValue(htmlspecialchars($request->identity)); + } + + $this->view->queryString = $this->_queryString(); } public function authenticateAction() { - $form = new OpenidLoginForm(); + $server = $this->_getOpenIdProvider(); + $request = $server->decodeRequest(); + + $authAttempts = new Users_Model_AuthAttempts(); + $attempt = $authAttempts->get(); + + $form = new Form_OpenidLogin(null, $this->view->base, $attempt && $attempt->surpassedMaxAllowed()); $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); + $this->_forward('login'); + return; } - $server = $this->_getOpenIdProvider(); - $server->login($form->getValue('openIdIdentity'), $form->getValue('password')); + $users = new Users_Model_Users(); + $result = $users->authenticate($form->getValue('openIdIdentity'), + $form->getValue('password'), true); - // needed for unit tests - $this->_helper->layout->disableLayout(); - $this->_helper->viewRenderer->setNeverRender(true); - - Zend_OpenId::redirect($this->view->base . '/openid/provider', $_GET); + if ($result) { + if ($attempt) { + $attempt->delete(); + } + $sites = new Model_Sites(); + if ($sites->isTrusted($users->getUser(), $request->trust_root)) { + $this->_forward('proceed', null, null, array('allow' => true)); + } elseif ($sites->isNeverTrusted($users->getUser(), $request->trust_root)) { + $this->_forward('proceed', null, null, array('deny' => true)); + } else { + $this->_forward('trust'); + } + } else { + if (!$attempt) { + $authAttempts->create(); + } else { + $attempt->addFailure(); + $attempt->save(); + } + $this->_forward('login'); + } } public function trustAction() { $server = $this->_getOpenIdProvider(); - $this->view->siteRoot = $server->getSiteRoot($_GET); - $this->view->identityUrl = $server->getLoggedInUser($_GET); - $this->view->queryString = $_SERVER['QUERY_STRING']; + $request = $server->decodeRequest(); - $sreg = new Zend_OpenId_Extension_Sreg(); - $sreg->parseRequest($_GET); + $this->view->siteRoot = $request->trust_root; + $this->view->identityUrl = $this->user->openid; + $this->view->queryString = $this->_queryString(); $this->view->fields = array(); $this->view->policyUrl = false; - $props = $sreg->getProperties(); + // The class Auth_OpenID_SRegRequest is included in the following file + require 'libs/Auth/OpenID/SReg.php'; + + $sregRequest = Auth_OpenID_SRegRequest::fromOpenIDRequest($request); + $props = $sregRequest->allRequestedFields(); + $args = $sregRequest->getExtensionArgs(); + if (isset($args['required'])) { + $required = explode(',', $args['required']); + } else { + $required = false; + } + if (is_array($props) && count($props) > 0) { - $personalInfoForm = new PersonalInfoForm(null, $this->user, $props); + $sregProps = array(); + foreach ($props as $field) { + $sregProps[$field] = $required && in_array($field, $required); + } + + $personalInfoForm = new Users_Form_PersonalInfo(null, $this->user, $sregProps); $this->view->fields = $personalInfoForm->getElements(); - $policy = $sreg->getPolicyUrl(); - if (!empty($policy)) { - $this->view->policyUrl = $policy; + if (isset($args['policy_url'])) { + $this->view->policyUrl = $args['policy_url']; } } } - private function _proceed() + public function proceedAction() { - if ($this->user->role == User::ROLE_GUEST) { - throw new Monkeys_AccessDeniedException(); - } - // needed for unit tests $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNeverRender(true); $server = $this->_getOpenIdProvider(); + $request = $server->decodeRequest(); - $sreg = new Zend_OpenId_Extension_Sreg(); - $sreg->parseRequest($_GET); - $props = $sreg->getProperties(); + if ($request->idSelect()) { + $id = $this->user->openid; + } else { + $id = null; + } - $personalInfoForm = new PersonalInfoForm(null, $this->user, $props); - $formData = $this->_request->getPost(); - $personalInfoForm->populate($formData); + $response = $request->answer(true, null, $id); - // not planning on validating stuff here yet, but I call this - // for the date element to be filled properly - $personalInfoForm->isValid($formData); + // The class Auth_OpenID_SRegRequest is included in the following file + require 'libs/Auth/OpenID/SReg.php'; - $sreg->parseResponse($personalInfoForm->getValues()); - if (isset($_POST['allow'])) { - if (isset($_POST['forever'])) { - $server->allowSite($server->getSiteRoot($_GET), $sreg); - } - unset($_GET['openid_action']); + $sregRequest = Auth_OpenID_SRegRequest::fromOpenIDRequest($request); + $props = $sregRequest->allRequestedFields(); + $args = $sregRequest->getExtensionArgs(); + if (isset($args['required'])) { + $required = explode(',', $args['required']); + } else { + $required = false; + } - $this->_saveHistory($server, History::AUTHORIZED); - - $server->respondToConsumer($_GET, $sreg); - } else if (isset($_POST['deny'])) { - if (isset($_POST['forever'])) { - $server->denySite($server->getSiteRoot($_GET)); + if (is_array($props) && count($props) > 0) { + $sregProps = array(); + foreach ($props as $field) { + $sregProps[$field] = $required && in_array($field, $required); } - $this->_saveHistory($server, History::DENIED); + $personalInfoForm = new Users_Form_PersonalInfo(null, $this->user, $sregProps); + $formData = $this->_request->getPost(); + $personalInfoForm->populate($formData); - Zend_OpenId::redirect($_GET['openid_return_to'], array('openid.mode'=>'cancel')); + // not planning on validating stuff here yet, but I call this + // for the date element to be filled properly + $personalInfoForm->isValid($formData); + + $sregResponse = Auth_OpenID_SRegResponse::extractResponse($sregRequest, + $personalInfoForm->getUnqualifiedValues()); + $sregResponse->toMessage($response->fields); + } + + if ($this->_getParam('allow')) { + if ($this->_getParam('forever')) { + + $sites = new Model_Sites(); + $sites->deleteForUserSite($this->user, $request->trust_root); + + $siteObj = $sites->createRow(); + $siteObj->user_id = $this->user->id; + $siteObj->site = $request->trust_root; + $siteObj->creation_date = date('Y-m-d'); + + if (isset($personalInfoForm)) { + $trusted = array(); + // using this key name for BC pre 1.1 when we used Zend_OpenId + $trusted['Zend_OpenId_Extension_Sreg'] = $personalInfoForm->getUnqualifiedValues(); + } else { + $trusted = true; + } + $siteObj->trusted = serialize($trusted); + + $siteObj->save(); + } + + $this->_saveHistory($request->trust_root, Model_History::AUTHORIZED); + + $webresponse = $server->encodeResponse($response); + + foreach ($webresponse->headers as $k => $v) { + header("$k: $v"); + } + + header('Connection: close'); + echo $webresponse->body; + } elseif ($this->_getParam('deny')) { + if ($this->_getParam('forever')) { + $sites = new Model_Sites(); + $sites->deleteForUserSite($this->user, $request->trust_root); + + $siteObj = $sites->createRow(); + $siteObj->user_id = $this->user->id; + $siteObj->site = $request->trust_root; + $siteObj->creation_date = date('Y-m-d'); + $siteObj->trusted = serialize(false); + $siteObj->save(); + } + + $this->_saveHistory($request->trust_root, Model_History::DENIED); + + header('HTTP/1.1 302 Found'); + header('Content-Type: text/plain; charset=us-ascii'); + header('Connection: close'); + header('Location: ' . $request->getCancelUrl()); } } - private function _saveHistory(Zend_OpenId_Provider $server, $result) - { - // only log if user exists - if ($this->user->role == User::ROLE_GUEST) { - return; - } - $histories = new Histories(); + private function _saveHistory($site, $result) + { + $histories = new Model_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->site = $site; $history->ip = $_SERVER['REMOTE_ADDR']; $history->result = $result; $history->save(); @@ -177,11 +302,64 @@ class OpenidController extends Monkeys_Controller_Action 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()); + $connection = new CommunityID_OpenId_DatabaseConnection(Zend_Registry::get('db')); + $store = new Auth_OpenID_MySQLStore($connection, 'associations', 'nonces'); + $server = new Auth_OpenID_Server($store, $this->_helper->ProviderUrl($this->_config)); return $server; } + + private function _sendResponse(Auth_OpenID_Server $server, Auth_OpenID_ServerResponse $response) + { + $this->_helper->layout->disableLayout(); + $this->_helper->viewRenderer->setNeverRender(true); + + $webresponse = $server->encodeResponse($response); + + if ($webresponse->code != AUTH_OPENID_HTTP_OK) { + header(sprintf("HTTP/1.1 %d ", $webresponse->code), true, $webresponse->code); + } + + foreach ($webresponse->headers as $k => $v) { + header("$k: $v"); + } + + header('Connection: close'); + + echo $webresponse->body; + } + + + /** + * Circumvent PHP's automatic replacement of dots by underscore in var names in $_GET and $_POST + */ + private function _queryString() + { + $unfilteredVars = array_merge($_GET, $_POST); + $varsTemp = array(); + $vars = array(); + $extensions = array(); + foreach ($unfilteredVars as $key => $value) { + if (substr($key, 0, 10) == 'openid_ns_') { + $extensions[] = substr($key, 10); + $varsTemp[str_replace('openid_ns_', 'openid.ns.', $key)] = $value; + } else { + $varsTemp[str_replace('openid_', 'openid.', $key)] = $value; + } + } + foreach ($extensions as $extension) { + foreach ($varsTemp as $key => $value) { + if (strpos($key, "openid.$extension") === 0) { + $prefix = "openid.$extension."; + $key = $prefix . substr($key, strlen($prefix)); + } + $vars[$key] = $value; + } + } + if (!$extensions) { + $vars = $varsTemp; + } + + return '?' . http_build_query($vars); + } } diff --git a/modules/default/controllers/PrivacyController.php b/modules/default/controllers/PrivacyController.php index 3a2f64c..7df8534 100644 --- a/modules/default/controllers/PrivacyController.php +++ b/modules/default/controllers/PrivacyController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class PrivacyController extends Monkeys_Controller_Action +class PrivacyController extends CommunityID_Controller_Action { protected $_numCols = 1; diff --git a/modules/default/controllers/SitesController.php b/modules/default/controllers/SitesController.php index 362fc21..cae9b12 100644 --- a/modules/default/controllers/SitesController.php +++ b/modules/default/controllers/SitesController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class SitesController extends Monkeys_Controller_Action +class SitesController extends CommunityID_Controller_Action { public function indexAction() { @@ -20,8 +20,8 @@ class SitesController extends Monkeys_Controller_Action { $this->_helper->viewRenderer->setNeverRender(true); - $fields = new Fields(); - $sites = new Sites(); + $fields = new Model_Fields(); + $sites = new Model_Sites(); $sitesRows = $sites->get( $this->user, $this->_getParam('startIndex'), @@ -67,7 +67,7 @@ class SitesController extends Monkeys_Controller_Action { $this->_helper->viewRenderer->setNeverRender(true); - $sites = new Sites(); + $sites = new Model_Sites(); $site = $sites->getRowInstance($this->_getParam('id')); if ($site->user_id != $this->user->id) { throw new Monkeys_AccessDeniedException(); @@ -86,7 +86,7 @@ class SitesController extends Monkeys_Controller_Action { $this->_helper->viewRenderer->setNeverRender(true); - $sites = new Sites(); + $sites = new Model_Sites(); $site = $sites->getRowInstance($this->_getParam('id')); if ($site->user_id != $this->user->id) { throw new Monkeys_AccessDeniedException(); @@ -105,7 +105,7 @@ class SitesController extends Monkeys_Controller_Action { $this->_helper->viewRenderer->setNeverRender(true); - $sites = new Sites(); + $sites = new Model_Sites(); $site = $sites->getRowInstance($this->_getParam('id')); if ($site->user_id != $this->user->id) { throw new Monkeys_AccessDeniedException(); diff --git a/modules/default/forms/ErrorMessages.php b/modules/default/forms/ErrorMessages.php index a7db5b9..e7d9994 100644 --- a/modules/default/forms/ErrorMessages.php +++ b/modules/default/forms/ErrorMessages.php @@ -4,8 +4,8 @@ * @copyright Copyright (C) 2005-2009 Keyboard Monkeys Ltd. http://www.kb-m.com * @license http://creativecommons.org/licenses/BSD/ BSD License * @author Keyboard Monkeys Ltd. -* @since Textroller 0.9 -* @package TextRoller +* @since CommunityID 0.9 +* @package CommunityID * @packager Keyboard Monkeys */ @@ -13,7 +13,7 @@ * This class is never called. It's only a placeholder for form error messages wrapped in translate(), * so that Poedit (or any other message catalogs editor) can catalog these messages for translation */ -class ErrorMessages +class Form_ErrorMessages { private function _messages() { @@ -24,5 +24,6 @@ class ErrorMessages translate('\'%value%\' appears to be a local network name but local network names are not allowed'); translate('Captcha value is wrong'); translate('Password confirmation does not match'); + translate('Username can only contain US-ASCII alphanumeric characters, plus any of the symbols $-_.+!*\'(), and "'); } } diff --git a/modules/default/forms/Feedback.php b/modules/default/forms/Feedback.php new file mode 100644 index 0000000..8036eb4 --- /dev/null +++ b/modules/default/forms/Feedback.php @@ -0,0 +1,61 @@ +_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/MessageUsers.php b/modules/default/forms/MessageUsers.php new file mode 100644 index 0000000..46ae60e --- /dev/null +++ b/modules/default/forms/MessageUsers.php @@ -0,0 +1,34 @@ +setLabel('Subject') + ->setRequired(true); + + $cc = new Monkeys_Form_Element_Text('cc'); + translate('CC:'); + $cc->setLabel('CC'); + + $bodyPlain = new Monkeys_Form_Element_Textarea('bodyPlain'); + $bodyPlain->setDecoratorOptions(array('separateLine' => true)); + + $bodyHTML= new Monkeys_Form_Element_Richtextarea('bodyHTML'); + $bodyHTML->setDecoratorOptions(array('separateLine' => true)) + ->setAttrib('width', '510px'); + + $this->addElements(array($subject, $cc, $bodyPlain, $bodyHTML)); + } +} diff --git a/modules/default/forms/OpenidLogin.php b/modules/default/forms/OpenidLogin.php new file mode 100644 index 0000000..f1f0bff --- /dev/null +++ b/modules/default/forms/OpenidLogin.php @@ -0,0 +1,63 @@ +_baseWebDir = $baseWebDir; + $this->_useCaptcha = $useCaptcha; + parent::__construct($options); + } + + public function init() + { + $openIdIdentity = new Monkeys_Form_Element_Text('openIdIdentity'); + translate('OpenID URL'); + $openIdIdentity->setLabel('OpenID URL') + ->setDecoratorOptions(array('dontMarkRequired' => true)) + ->setAttrib('style', 'width:300px') + ->setRequired(true); + + $password = new Monkeys_Form_Element_Password('password'); + translate('Password'); + $password->setLabel('Password') + ->setDecoratorOptions(array('dontMarkRequired' => true)) + ->setAttrib('style', 'width:300px') + ->setRequired(true); + + $this->addElements(array($openIdIdentity, $password)); + + if ($this->_useCaptcha) { + $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, + ) + )); + $captcha->setDecoratorOptions(array( + 'dontMarkRequired' => true, + )); + + $this->addElement($captcha); + } + } +} diff --git a/modules/default/models/Association.php b/modules/default/models/Association.php index fa6bf89..ed848ea 100644 --- a/modules/default/models/Association.php +++ b/modules/default/models/Association.php @@ -10,6 +10,6 @@ */ -class Association extends Zend_Db_Table_Row_Abstract +class Model_Association extends Zend_Db_Table_Row_Abstract { } diff --git a/modules/default/models/Associations.php b/modules/default/models/Associations.php index 103ae15..b215a8d 100644 --- a/modules/default/models/Associations.php +++ b/modules/default/models/Associations.php @@ -10,11 +10,11 @@ */ -class Associations extends Monkeys_Db_Table_Gateway +class Model_Associations extends Monkeys_Db_Table_Gateway { protected $_name = 'associations'; protected $_primary = 'handle'; - protected $_rowClass = 'Association'; + protected $_rowClass = 'Model_Association'; public function getAssociationGivenHandle($handle) { diff --git a/modules/default/models/Field.php b/modules/default/models/Field.php index 6f1a993..b592709 100644 --- a/modules/default/models/Field.php +++ b/modules/default/models/Field.php @@ -10,7 +10,7 @@ */ -class Field extends Zend_Db_Table_Row_Abstract +class Model_Field extends Zend_Db_Table_Row_Abstract { const TYPE_TEXT = 1; const TYPE_DATE = 2; diff --git a/modules/default/models/Fields.php b/modules/default/models/Fields.php index f0df667..5cd36fd 100644 --- a/modules/default/models/Fields.php +++ b/modules/default/models/Fields.php @@ -10,15 +10,15 @@ */ -class Fields extends Monkeys_Db_Table_Gateway +class Model_Fields extends Monkeys_Db_Table_Gateway { protected $_name = 'fields'; protected $_primary = 'id'; - protected $_rowClass = 'Field'; + protected $_rowClass = 'Model_Field'; private $_fieldsNames= array(); - public function getValues(User $user) + public function getValues(Users_Model_User $user) { $userId = (int)$user->id; $select = $this->select() diff --git a/modules/default/models/FieldsValue.php b/modules/default/models/FieldsValue.php index 7874701..4d3ee63 100644 --- a/modules/default/models/FieldsValue.php +++ b/modules/default/models/FieldsValue.php @@ -10,6 +10,6 @@ */ -class FieldsValue extends Zend_Db_Table_Row_Abstract +class Model_FieldsValue extends Zend_Db_Table_Row_Abstract { } diff --git a/modules/default/models/FieldsValues.php b/modules/default/models/FieldsValues.php index 2e04dde..7900748 100644 --- a/modules/default/models/FieldsValues.php +++ b/modules/default/models/FieldsValues.php @@ -10,13 +10,13 @@ */ -class FieldsValues extends Monkeys_Db_Table_Gateway +class Model_FieldsValues extends Monkeys_Db_Table_Gateway { protected $_name = 'fields_values'; protected $_primary = array('user_id', 'field_id'); - protected $_rowClass = 'FieldsValue'; + protected $_rowClass = 'Model_FieldsValue'; - public function deleteForUser(User $user) + public function deleteForUser(Users_Model_User $user) { $where = $this->getAdapter()->quoteInto('user_id=?', $user->id); $this->delete($where); diff --git a/modules/default/models/Histories.php b/modules/default/models/Histories.php index 43774b6..2131b3c 100755 --- a/modules/default/models/Histories.php +++ b/modules/default/models/Histories.php @@ -10,17 +10,37 @@ */ -class Histories extends Monkeys_Db_Table_Gateway +class Model_Histories extends Monkeys_Db_Table_Gateway { + const DIR_ASC = 0; + const DIR_DESC = 1; + + private $_sortFields = array( + 'date' => array('date', 'site', 'ip', 'result'), + 'site' => array('site', 'date', 'ip', 'result'), + 'ip' => array('ip', 'date', 'site', 'result'), + 'result' => array('result', 'date', 'site', 'ip'), + ); + protected $_name = 'history'; protected $_primary = 'id'; - protected $_rowClass = 'History'; + protected $_rowClass = 'Model_History'; - public function get(User $user, $startIndex, $results) + public function get(Users_Model_User $user, $startIndex = false, $results = false, $sort = false, $dir = false) { $select = $this->select() ->where('user_id=?', $user->id); + 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 ($startIndex !== false && $results !== false) { $select = $select->limit($results, $startIndex); } @@ -28,14 +48,14 @@ class Histories extends Monkeys_Db_Table_Gateway return $this->fetchAll($select); } - public function getNumHistories(User $user) + public function getNumHistories(Users_Model_User $user) { - $sites = $this->get($user, false, false); + $sites = $this->get($user); return count($sites); } - public function clear(User $user) + public function clear(Users_Model_User $user) { $where = $this->getAdapter()->quoteInto('user_id=?', $user->id); $this->delete($where); diff --git a/modules/default/models/History.php b/modules/default/models/History.php index d4b3f7c..4a4c29e 100755 --- a/modules/default/models/History.php +++ b/modules/default/models/History.php @@ -10,7 +10,7 @@ */ -class History extends Zend_Db_Table_Row_Abstract +class Model_History extends Zend_Db_Table_Row_Abstract { const DENIED = 0; const AUTHORIZED = 1; diff --git a/modules/default/models/Settings.php b/modules/default/models/Settings.php index cc93784..c356912 100644 --- a/modules/default/models/Settings.php +++ b/modules/default/models/Settings.php @@ -9,12 +9,13 @@ * @packager Keyboard Monkeys */ -class Settings extends Monkeys_Db_Table_Gateway +class Model_Settings extends Monkeys_Db_Table_Gateway { protected $_name = 'settings'; protected $_primary = 'name'; const MAINTENANCE_MODE = 'maintenance_mode'; + const VERSION = 'version'; public function get($name) { @@ -23,6 +24,10 @@ class Settings extends Monkeys_Db_Table_Gateway $row = $this->fetchRow($select); + if (!$row) { + return null; + } + return $row->value; } @@ -35,4 +40,9 @@ class Settings extends Monkeys_Db_Table_Gateway { return $this->get(self::MAINTENANCE_MODE); } + + public function getVersion() + { + return $this->get(self::VERSION); + } } diff --git a/modules/default/models/Site.php b/modules/default/models/Site.php index 7f26b25..413468f 100644 --- a/modules/default/models/Site.php +++ b/modules/default/models/Site.php @@ -10,6 +10,6 @@ */ -class Site extends Zend_Db_Table_Row_Abstract +class Model_Site extends Zend_Db_Table_Row_Abstract { } diff --git a/modules/default/models/Sites.php b/modules/default/models/Sites.php index 544521a..be9b1a7 100644 --- a/modules/default/models/Sites.php +++ b/modules/default/models/Sites.php @@ -10,20 +10,34 @@ */ -class Sites extends Monkeys_Db_Table_Gateway +class Model_Sites extends Monkeys_Db_Table_Gateway { protected $_name = 'sites'; protected $_primary = 'id'; - protected $_rowClass = 'Site'; + protected $_rowClass = 'Model_Site'; - public function deleteForUserSite(User $user, $site) + private $_userSites = array(); + + public function deleteForUserSite(Users_Model_User $user, $site) { $where1 = $this->getAdapter()->quoteInto('user_id=?',$user->id); $where2 = $this->getAdapter()->quoteInto('site=?', $site); $this->delete("$where1 AND $where2"); } - public function get(User $user, $startIndex, $results) + public function getSites(Users_Model_User $user) + { + if (!isset($this->_userSites[$user->username])) { + $select = $this->select() + ->where('user_id=?', $user->id); + + $this->_userSites[$user->username] = $this->fetchAll($select); + } + + return $this->_userSites[$user->username]; + } + + public function get(Users_Model_User $user, $startIndex, $results) { $select = $this->select() ->where('user_id=?', $user->id); @@ -35,18 +49,32 @@ class Sites extends Monkeys_Db_Table_Gateway return $this->fetchAll($select); } - public function getNumSites(User $user) + public function getNumSites(Users_Model_User $user) { $sites = $this->get($user, false, false); return count($sites); } - public function getTrusted(User $user) + public function isTrusted(Users_Model_User $user, $site) { - $select = $this->select() - ->where('user_id=?', $user->id); + foreach ($this->getSites($user) as $userSite) { + if ($userSite->site == $site && $userSite->trusted != 'b:0;') { + return true; + } + } - return $this->fetchAll($select); + return false; + } + + public function isNeverTrusted(Users_Model_User $user, $site) + { + foreach ($this->getSites($user) as $userSite) { + if ($userSite->site == $site && $userSite->trusted == 'b:0;') { + return true; + } + } + + return false; } } diff --git a/modules/default/views/scripts/cid/index.phtml b/modules/default/views/scripts/cid/index.phtml new file mode 100644 index 0000000..97d6bc0 --- /dev/null +++ b/modules/default/views/scripts/cid/index.phtml @@ -0,0 +1,22 @@ +

      translate('About Community-id') ?>

      +
      + + version ?> +
      +
      + +
      +
        + news as $item): ?> +
      • +
        + title ?> +
        +
        + content ?> +
        +
      • + +
      diff --git a/modules/default/views/scripts/error/error.phtml b/modules/default/views/scripts/error/error.phtml index 511707b..901cfc3 100755 --- a/modules/default/views/scripts/error/error.phtml +++ b/modules/default/views/scripts/error/error.phtml @@ -6,13 +6,13 @@

      An error occurred

      - message ?> - trace): ?> + message ?> + trace): ?>
       Stack Trace:
      -trace ?>
      +trace ?>
           
      - + diff --git a/modules/default/views/scripts/feedback/index.phtml b/modules/default/views/scripts/feedback/index.phtml index b261dec..87c4b80 100644 --- a/modules/default/views/scripts/feedback/index.phtml +++ b/modules/default/views/scripts/feedback/index.phtml @@ -1,10 +1,10 @@ -

      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 ?> - +

      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 index c7c677b..0c3e23f 100755 --- a/modules/default/views/scripts/history/index.phtml +++ b/modules/default/views/scripts/history/index.phtml @@ -10,7 +10,7 @@ YAHOO.util.Event.onDOMReady(function () {
      - + diff --git a/modules/default/views/scripts/openid/login.phtml b/modules/default/views/scripts/openid/login.phtml index d5079c8..9a3c3ab 100644 --- a/modules/default/views/scripts/openid/login.phtml +++ b/modules/default/views/scripts/openid/login.phtml @@ -1,10 +1,16 @@ -
      -
      - form->openIdIdentity ?> - form->password ?> - - -
      -
      +
      + form->openIdIdentity ?> + form->password ?> + useCaptcha): ?> + form->captcha ?> + +
      +
      + + +
      +
       
      +
      +
      diff --git a/modules/default/views/scripts/openid/trust.phtml b/modules/default/views/scripts/openid/trust.phtml index 939d109..679cdd7 100644 --- a/modules/default/views/scripts/openid/trust.phtml +++ b/modules/default/views/scripts/openid/trust.phtml @@ -1,31 +1,31 @@
      - translate('A site identifying as %s has asked for confirmation that %s is your identity URL.', '' . $this->siteRoot . '', '' . $this->identityUrl . '') ?> + translate('A site identifying as %s has asked for confirmation that %s is your identity URL.', '' . $this->siteRoot . '', '' . $this->identityUrl . '') ?>
      -
      + - fields): ?> + 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.') ?> + 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', + fields as $field): ?> + + + policyUrl): ?> + translate('The private policy can be found at %s', ''.$this->policyUrl.''); ?>

      - - + +
      - translate('Forever') ?> + translate('Forever') ?>
      - - + + diff --git a/modules/install/views/scripts/credentials/index.phtml b/modules/install/views/scripts/credentials/index.phtml index 7f1fc32..2abd870 100644 --- a/modules/install/views/scripts/credentials/index.phtml +++ b/modules/install/views/scripts/credentials/index.phtml @@ -1,15 +1,15 @@

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

      - +
      - form->hostname ?> - form->dbname ?> - form->dbusername ?> - form->dbpassword ?> - form->supportemail ?> + 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 index 6e97e30..d68b1c0 100644 --- a/modules/install/views/scripts/index/index.phtml +++ b/modules/install/views/scripts/index/index.phtml @@ -1,13 +1,13 @@

      - translate('This Community-ID instance hasn\'t been installed yet') ?> + 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 index b2766bb..10a9db8 100644 --- a/modules/install/views/scripts/permissions/index.phtml +++ b/modules/install/views/scripts/permissions/index.phtml @@ -1,18 +1,18 @@

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

        - errors as $error): ?> -
      • - + errors as $error): ?> +
      • +
      - + diff --git a/modules/install/views/scripts/upgrade/index.phtml b/modules/install/views/scripts/upgrade/index.phtml new file mode 100644 index 0000000..d85052a --- /dev/null +++ b/modules/install/views/scripts/upgrade/index.phtml @@ -0,0 +1,15 @@ +

      translate('New version detected') ?>

      +
      + translate('Enter the administrator credentials to proceed with the upgrade:') ?> +
      +
      + translate('Make sure you make a copy of the database before, just in case') ?> +
      + + loginForm->username ?> + loginForm->password ?> + + + diff --git a/modules/news/controllers/EditController.php b/modules/news/controllers/EditController.php new file mode 100644 index 0000000..93225d3 --- /dev/null +++ b/modules/news/controllers/EditController.php @@ -0,0 +1,98 @@ +articleForm)) { + $this->view->articleForm = $appSession->articleForm; + unset($appSession->articleForm); + } else { + $this->view->articleForm = new News_Form_Article(); + $news = new News_Model_News(); + if ($this->_getParam('id') && ($article = $news->getRowInstance($this->_getParam('id')))) { + $this->view->articleForm->populate(array( + 'title' => $article->title, + 'date' => $article->date, + 'excerpt' => $article->excerpt, + 'content' => $article->content, + )); + $this->view->articleId = $article->id; + } + } + + $this->_helper->actionStack('index', 'login', 'users'); + } + + public function addAction() + { + $this->_forward('index'); + } + + public function saveAction() + { + $form = new News_Form_Article(); + $formData = $this->_request->getPost(); + $form->populate($formData); + + if (!$form->isValid($formData)) { + $appSession = Zend_Registry::get('appSession'); + $appSession->articleForm = $form; + $this->_forward('index'); + return; + } + + $news = new News_Model_News(); + if ($this->_getParam('id')) { + if (!$article = $news->getRowInstance($this->_getParam('id'))) { + $this->_helper->FlashMessenger->addMessage('Article doesn\'t exist.'); + $this->_redirect('/news'); + return; + } + } else { + $article = $news->createRow(); + } + + + require_once 'htmlpurifier/library/HTMLPurifier.auto.php'; + + $config = HTMLPurifier_Config::createDefault(); + $purifier = new HTMLPurifier($config); + $cleanHtml = $purifier->purify($form->getValue('content')); + + $article->title = $form->getValue('title'); + $article->date = $form->getValue('date'); + $article->excerpt = $form->getValue('excerpt'); + $article->content = $cleanHtml; + $article->save(); + + $this->_helper->FlashMessenger->addMessage('The article has been saved.'); + + $this->_redirect('/news'); + } + + public function deleteAction() + { + $news = new News_Model_News(); + if (!$article = $news->getRowInstance($this->_getParam('id'))) { + $this->_helper->FlashMessenger->addMessage('The article doesn\'t exist.'); + } else { + $article->delete(); + $this->_helper->FlashMessenger->addMessage('The article has been deleted.'); + } + + $this->_redirect('/news'); + } +} diff --git a/modules/news/controllers/IndexController.php b/modules/news/controllers/IndexController.php new file mode 100644 index 0000000..12b7cad --- /dev/null +++ b/modules/news/controllers/IndexController.php @@ -0,0 +1,23 @@ +view->paginator = $news->getArticlesPaginator(News_Model_News::RECORDS_PER_PAGE, + $this->_getParam('page', 0), $this->user); + + $this->_helper->actionStack('index', 'login', 'users'); + } +} diff --git a/modules/news/controllers/ViewController.php b/modules/news/controllers/ViewController.php new file mode 100644 index 0000000..4441f8d --- /dev/null +++ b/modules/news/controllers/ViewController.php @@ -0,0 +1,25 @@ +view->article = $news->getRowInstance($this->_getParam('id')); + + if ($this->view->article->date > date('Y-m-d H:i:s') && $this->user->role != Users_Model_User::ROLE_ADMIN) { + throw new Monkeys_AccessDeniedException(); + } + + $this->_helper->actionStack('index', 'login', 'users'); + } +} diff --git a/modules/news/forms/Article.php b/modules/news/forms/Article.php new file mode 100644 index 0000000..fc01991 --- /dev/null +++ b/modules/news/forms/Article.php @@ -0,0 +1,44 @@ +setLabel('Title') + ->setRequired(true) + ->setAttrib('style', 'width:350px'); + + $date = new Monkeys_Form_Element_DateTime('date'); + translate('Publication date'); + $date->setLabel('Publication date') + ->setShowEmptyValues(false) + ->setStartEndYear(1900, date('Y') + 1) + ->setReverseYears(true) + ->setValue(date('Y-m-d H:i')); + + $excerpt = new Monkeys_Form_Element_Textarea('excerpt'); + translate('Excerpt'); + $excerpt->setLabel('Excerpt') + ->setAttrib('style', 'width:350px') + ->setAttrib('rows', 4); + + $content = new Monkeys_Form_Element_Richtextarea('content'); + $content->setDecoratorOptions(array('separateLine' => true)) + ->setAttrib('width', '510px') + ->setRequired(true); + + $this->addElements(array($title, $date, $excerpt, $content)); + } +} diff --git a/modules/news/models/News.php b/modules/news/models/News.php new file mode 100644 index 0000000..22035d2 --- /dev/null +++ b/modules/news/models/News.php @@ -0,0 +1,58 @@ + array('date', 'title'), + 'title' => array('title', 'date') + ); + + public function getArticlesPaginator($limit = self::RECORDS_PER_PAGE, $page = 0, Users_Model_User $user) + { + $select = $this->select()->order('date DESC'); + + if ($user->role != Users_Model_User::ROLE_ADMIN) { + $select = $select->where('date <= ?', date('Y-m-d H:i:s')); + } + + $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbTableSelect($select)); + $paginator->setItemCountPerPage($limit); + $paginator->setCurrentPageNumber($page); + + return $paginator; + } + + public function getLatest($numItems, Users_Model_User $user) + { + $select = $this->select() + ->order('date DESC') + ->limit($numItems); + + if ($user->role != Users_Model_User::ROLE_ADMIN) { + $select = $select->where('date <= ?', date('Y-m-d H:i:s')); + } + + return $this->fetchAll($select); + } + + public function deleteTestEntries() + { + $this->delete('test=1'); + } +} diff --git a/modules/news/models/NewsArticle.php b/modules/news/models/NewsArticle.php new file mode 100644 index 0000000..3b47b42 --- /dev/null +++ b/modules/news/models/NewsArticle.php @@ -0,0 +1,14 @@ +base ?>/news/edit/save" class="formGrid"> + + articleForm->title ?> + articleForm->excerpt ?> + articleForm->date ?> + articleForm->content ?> +
      + + + +
      + diff --git a/modules/news/views/scripts/index/index.phtml b/modules/news/views/scripts/index/index.phtml new file mode 100644 index 0000000..40df280 --- /dev/null +++ b/modules/news/views/scripts/index/index.phtml @@ -0,0 +1,34 @@ +user->role == Users_Model_User::ROLE_ADMIN): ?> +
      +

      translate('Latest News') ?>

      + +
      + +paginator) == 0): ?> +
      translate('There are no news articles yet') ?>
      + + paginator as $article): ?> +
      +

      title ?>

      + +

      excerpt ?>

      +

      + + translate('read more') ?> + +

      +
      + + +paginator->count() > 1): ?> + paginationControl($this->paginator, + 'Sliding', + 'index/pagination.phtml', + array( + 'base' => $this->base + )) ?> + diff --git a/modules/news/views/scripts/index/pagination.phtml b/modules/news/views/scripts/index/pagination.phtml new file mode 100644 index 0000000..d014993 --- /dev/null +++ b/modules/news/views/scripts/index/pagination.phtml @@ -0,0 +1,36 @@ + + +pageCount): ?> +
      + +previous)): ?> + + < translate('Previous') ?> + | + + < translate('Previous') ?> | + + + +pagesInRange as $page): ?> + current): ?> + + + | + + | + + + + +next)): ?> + + translate('Next') ?> > + + + translate('Next') ?> > + +
      + diff --git a/modules/news/views/scripts/view/index.phtml b/modules/news/views/scripts/view/index.phtml new file mode 100644 index 0000000..a15758e --- /dev/null +++ b/modules/news/views/scripts/view/index.phtml @@ -0,0 +1,15 @@ +

      escape($this->article->title) ?>

      + +

      escape($this->article->excerpt) ?>

      +
      +
      + article->content ?> +
      diff --git a/modules/stats/controllers/AuthorizationsController.php b/modules/stats/controllers/AuthorizationsController.php index 1b7cec4..e7e5cff 100644 --- a/modules/stats/controllers/AuthorizationsController.php +++ b/modules/stats/controllers/AuthorizationsController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class Stats_AuthorizationsController extends Monkeys_Controller_Action +class Stats_AuthorizationsController extends CommunityID_Controller_Action { public function indexAction() { @@ -71,13 +71,13 @@ class Stats_AuthorizationsController extends Monkeys_Controller_Action private function _populateWeekData(&$labelsy, &$datay) { - $stats = new Stats(); + $stats = new Stats_Model_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)]; + $labelsy[] = Stats_Model_Stats::$weekDays[date('w', $time)]; if (isset($authorizations[$date])) { $datay[] = $authorizations[$date]['entry']; } else { @@ -88,14 +88,14 @@ class Stats_AuthorizationsController extends Monkeys_Controller_Action private function _populateYearData(&$labelsy, &$datay) { - $stats = new Stats(); + $stats = new Stats_Model_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]; + $labelsy[] = Stats_Model_Stats::$months[$monthNumber]; if (isset($authorizations[$monthNumber])) { $datay[] = $authorizations[$monthNumber]['entry']; } else { diff --git a/modules/stats/controllers/IndexController.php b/modules/stats/controllers/IndexController.php index 8bfea0a..a704ae1 100644 --- a/modules/stats/controllers/IndexController.php +++ b/modules/stats/controllers/IndexController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class Stats_IndexController extends Monkeys_Controller_Action +class Stats_IndexController extends CommunityID_Controller_Action { protected $_numCols = 1; diff --git a/modules/stats/controllers/RegistrationsController.php b/modules/stats/controllers/RegistrationsController.php index d3c3c0c..dd3843d 100644 --- a/modules/stats/controllers/RegistrationsController.php +++ b/modules/stats/controllers/RegistrationsController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class Stats_RegistrationsController extends Monkeys_Controller_Action +class Stats_RegistrationsController extends CommunityID_Controller_Action { public function indexAction() { @@ -78,13 +78,13 @@ class Stats_RegistrationsController extends Monkeys_Controller_Action private function _populateWeekData(&$labelsy, &$datay) { - $stats = new Stats(); + $stats = new Stats_Model_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)]; + $labelsy[] = Stats_Model_Stats::$weekDays[date('w', $time)]; if (isset($registeredUsers[$date])) { $datay[] = $registeredUsers[$date]['users']; } else { @@ -95,7 +95,7 @@ class Stats_RegistrationsController extends Monkeys_Controller_Action private function _populateMonthData(&$labelsy, &$datay) { - $stats = new Stats(); + $stats = new Stats_Model_Stats(); $registeredUsers = $stats->getNumRegisteredUsersDays(strtotime('-30 days'), strtotime('-1 week')); for ($i = -30; $i < -7; $i++) { @@ -112,14 +112,14 @@ class Stats_RegistrationsController extends Monkeys_Controller_Action private function _populateYearData(&$labelsy, &$datay) { - $stats = new Stats(); + $stats = new Stats_Model_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]; + $labelsy[] = Stats_Model_Stats::$months[$monthNumber]; if (isset($registeredUsers[$monthNumber])) { $datay[] = $registeredUsers[$monthNumber]['users']; } else { diff --git a/modules/stats/controllers/SitesController.php b/modules/stats/controllers/SitesController.php index 44f29f6..e8ba5e3 100644 --- a/modules/stats/controllers/SitesController.php +++ b/modules/stats/controllers/SitesController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class Stats_SitesController extends Monkeys_Controller_Action +class Stats_SitesController extends CommunityID_Controller_Action { public function indexAction() { @@ -85,7 +85,7 @@ class Stats_SitesController extends Monkeys_Controller_Action private function _populateWeekData(&$labelsy, &$datay, &$datay2) { - $stats = new Stats(); + $stats = new Stats_Model_Stats(); $initialTrustedSites = $stats->getNumTrustedSites(strtotime('-1 week')); $initialRegisteredUsers = $stats->getNumRegisteredUsers(strtotime('-1 week')); @@ -95,7 +95,7 @@ class Stats_SitesController extends Monkeys_Controller_Action for ($i = -7; $i < 0; $i++) { $time = strtotime("$i days"); $date = date('Y-m-d', $time); - $labelsy[] = Stats::$weekDays[date('w', $time)]; + $labelsy[] = Stats_Model_Stats::$weekDays[date('w', $time)]; if (isset($sites[$date])) { $sitesPeriod = $sites[$date]['site']; @@ -125,7 +125,7 @@ class Stats_SitesController extends Monkeys_Controller_Action private function _populateYearData(&$labelsy, &$datay, &$datay2) { - $stats = new Stats(); + $stats = new Stats_Model_Stats(); $initialTrustedSites = $stats->getNumTrustedSites(strtotime('-1 week')); $initialRegisteredUsers = $stats->getNumRegisteredUsers(strtotime('-1 week')); @@ -137,7 +137,7 @@ class Stats_SitesController extends Monkeys_Controller_Action for ($i = -11; $i <= 0; $i++) { $time = strtotime("$i months"); $monthNumber = date('n', $time); - $labelsy[] = Stats::$months[$monthNumber]; + $labelsy[] = Stats_Model_Stats::$months[$monthNumber]; if (isset($sites[$monthNumber])) { $sitesPeriod = $sites[$monthNumber]['site']; diff --git a/modules/stats/controllers/TopController.php b/modules/stats/controllers/TopController.php index a15d663..ec30579 100644 --- a/modules/stats/controllers/TopController.php +++ b/modules/stats/controllers/TopController.php @@ -9,11 +9,11 @@ * @packager Keyboard Monkeys */ -class Stats_TopController extends Monkeys_Controller_Action +class Stats_TopController extends CommunityID_Controller_Action { public function indexAction() { - $stats = new Stats(); + $stats = new Stats_Model_Stats(); $this->view->sites = $stats->getTopTenSites(); } } diff --git a/modules/stats/models/Stats.php b/modules/stats/models/Stats.php index 0bbda10..6c556ef 100644 --- a/modules/stats/models/Stats.php +++ b/modules/stats/models/Stats.php @@ -4,13 +4,13 @@ * @copyright Copyright (C) 2005-2009 Keyboard Monkeys Ltd. http://www.kb-m.com * @license http://creativecommons.org/licenses/BSD/ BSD License * @author Keyboard Monkeys Ltd. -* @since Textroller 0.9 -* @package TextRoller +* @since CommunityID 0.9 +* @package CommunityID * @packager Keyboard Monkeys */ -class Stats +class Stats_Model_Stats { private $_db; diff --git a/modules/stats/views/scripts/authorizations/index.phtml b/modules/stats/views/scripts/authorizations/index.phtml index ae55dba..2c55dee 100644 --- a/modules/stats/views/scripts/authorizations/index.phtml +++ b/modules/stats/views/scripts/authorizations/index.phtml @@ -1,10 +1,10 @@ -

      translate('Authorizations per day') ?>

      +

      translate('Authorizations per day') ?>

      - translate('Select view') ?>: + translate('Select view') ?>:
      - + diff --git a/modules/stats/views/scripts/registrations/index.phtml b/modules/stats/views/scripts/registrations/index.phtml index 9785dca..ca011d2 100644 --- a/modules/stats/views/scripts/registrations/index.phtml +++ b/modules/stats/views/scripts/registrations/index.phtml @@ -1,10 +1,10 @@ -

      translate('Registrations per day') ?>

      +

      translate('Registrations per day') ?>

      - translate('Select view') ?>: + translate('Select view') ?>:
      - + diff --git a/modules/stats/views/scripts/sites/index.phtml b/modules/stats/views/scripts/sites/index.phtml index 5f74840..e3d7750 100644 --- a/modules/stats/views/scripts/sites/index.phtml +++ b/modules/stats/views/scripts/sites/index.phtml @@ -1,9 +1,9 @@ -

      translate('Trusted Sites') ?>

      +

      translate('Trusted Sites') ?>

      - translate('Select view') ?>: + translate('Select view') ?>:
      - + diff --git a/modules/stats/views/scripts/top/index.phtml b/modules/stats/views/scripts/top/index.phtml index f223cd4..b020614 100644 --- a/modules/stats/views/scripts/top/index.phtml +++ b/modules/stats/views/scripts/top/index.phtml @@ -1,10 +1,10 @@ -

      translate('Top 10 Trusted Sites') ?>

      +

      translate('Top 10 Trusted Sites') ?>

      - sites as $num => $siteInfo): ?> + sites as $num => $siteInfo): ?> - - - + + + - +
      (translate('%s users', $siteInfo['num']) ?>)(translate('%s users', $siteInfo['num']) ?>)
      diff --git a/modules/users/controllers/LoginController.php b/modules/users/controllers/LoginController.php index 8940772..af5954b 100755 --- a/modules/users/controllers/LoginController.php +++ b/modules/users/controllers/LoginController.php @@ -9,20 +9,20 @@ * @packager Keyboard Monkeys */ -class Users_LoginController extends Monkeys_Controller_Action +/** +* We don't use the session with the login form to simplify the dynamic appearance of the captcha +*/ +class Users_LoginController extends CommunityID_Controller_Action { public function indexAction() { - $settings = new Settings(); + $settings = new Model_Settings(); $this->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(); - } + $authAttempts = new Users_Model_AuthAttempts(); + $attempt = $authAttempts->get(); + $this->view->useCaptcha = $attempt && $attempt->surpassedMaxAllowed(); + $this->view->loginForm = new Users_Form_Login(null, $this->view->base, $this->view->useCaptcha); if ($this->_config->SSL->enable_mixed_mode) { $this->view->loginTargetBase = 'https://' . $_SERVER['HTTP_HOST'] . $this->view->base; @@ -35,46 +35,43 @@ class Users_LoginController extends Monkeys_Controller_Action public function authenticateAction() { - $auth = Zend_Auth::getInstance(); + $authAttempts = new Users_Model_AuthAttempts(); + $attempt = $authAttempts->get(); - $form = new LoginForm(); + $form = new Users_Form_Login(null, $this->view->base, $attempt && $attempt->surpassedMaxAllowed()); $formData = $this->_request->getPost(); $form->populate($formData); - $appSession = Zend_Registry::get('appSession'); if (!$form->isValid($formData)) { - $appSession->loginForm = $form; + $this->_helper->FlashMessenger->addMessage($this->view->translate('Invalid credentials')); $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')); + $users = new Users_Model_Users(); + $result = $users->authenticate($this->_request->getPost('username'), + $this->_request->getPost('password')); - $result = $auth->authenticate($authAdapter); + if ($result) { + $user = $users->getUser(); - 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) { + if ($attempt) { + $attempt = $authAttempts->delete(); + } + + if ($user->role != Users_Model_User::ROLE_ADMIN && $this->underMaintenance) { 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); - } + return $this->_redirectForMaintenance(true); } } else { - $this->_helper->FlashMessenger->addMessage('Invalid credentials'); - $appSession->loginForm = $form; + if (!$attempt) { + $authAttempts->create(); + } else { + $attempt->addFailure(); + $attempt->save(); + } + + $this->_helper->FlashMessenger->addMessage($this->view->translate('Invalid credentials')); } $this->_redirectToNormalConnection(''); diff --git a/modules/users/controllers/ManageusersController.php b/modules/users/controllers/ManageusersController.php index 3171208..9b6b24d 100644 --- a/modules/users/controllers/ManageusersController.php +++ b/modules/users/controllers/ManageusersController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class Users_ManageusersController extends Monkeys_Controller_Action +class Users_ManageusersController extends CommunityID_Controller_Action { public function indexAction() { @@ -27,7 +27,76 @@ class Users_ManageusersController extends Monkeys_Controller_Action public function deleteunconfirmedAction() { - $users = new Users(); - $users->deleteUnconfirmed(); + $this->_helper->viewRenderer->setNeverRender(true); + + $users = new Users_Model_Users(); + $users->deleteUnconfirmed($this->_getParam('olderthan')); + } + + public function sendreminderAction() + { + $this->_helper->viewRenderer->setNeverRender(true); + + $users = new Users_Model_Users(); + foreach ($users->getUnconfirmedUsers($this->_getParam('olderthan')) as $user) { + $mail = self::getMail($user, $this->view->translate('Community-ID registration reminder')); + try { + $mail->send(); + } catch (Zend_Mail_Protocol_Exception $e) { + Zend_Registry::get('logger')->log($e->getMessage(), Zend_Log::ERR); + } + } + } + + /** + * @return Zend_Mail + * @throws Zend_Mail_Protocol_Exception + */ + public static function getMail(User $user, $subject) + { + $locale = Zend_Registry::get('Zend_Locale'); + $localeElements = explode('_', $locale); + if (file_exists(APP_DIR . "/resources/$locale/reminder_mail.txt")) { + $file = APP_DIR . "/resources/$locale/reminder_mail.txt"; + } else if (count($localeElements == 2) + && file_exists(APP_DIR . "/resources/".$localeElements[0]."/reminder_mail.txt")) { + $file = APP_DIR . "/resources/".$localeElements[0]."/reminder_mail.txt"; + } else { + $file = APP_DIR . "/resources/en/reminder_mail.txt"; + } + + $emailTemplate = file_get_contents($file); + $emailTemplate = str_replace('{userName}', $user->getFullName(), $emailTemplate); + + $currentUrl = Zend_OpenId::selfURL(); + preg_match('#(.*)/manageusers/sendreminder#', $currentUrl, $matches); + $emailTemplate = str_replace('{registrationURL}', $matches[1] . '/register/eula?token=' . $user->token, $emailTemplate); + + // can't use $this-_config 'cause it's a static function + $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->setBodyText($emailTemplate); + $mail->setFrom($configEmail->supportemail); + $mail->addTo($user->email); + $mail->setSubject($subject); + + return $mail; } } diff --git a/modules/users/controllers/PersonalinfoController.php b/modules/users/controllers/PersonalinfoController.php index 220a2d7..fe58f13 100644 --- a/modules/users/controllers/PersonalinfoController.php +++ b/modules/users/controllers/PersonalinfoController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class Users_PersonalinfoController extends Monkeys_Controller_Action +class Users_PersonalinfoController extends CommunityID_Controller_Action { public function indexAction() { @@ -18,7 +18,7 @@ class Users_PersonalinfoController extends Monkeys_Controller_Action public function showAction() { - $fields = new Fields(); + $fields = new Model_Fields(); $this->view->fields = $fields->getValues($this->user); } @@ -29,14 +29,14 @@ class Users_PersonalinfoController extends Monkeys_Controller_Action $this->view->fields = $appSession->personalInfoForm->getElements(); unset($appSession->personalInfoForm); } else { - $personalInfoForm = new PersonalInfoForm(null, $this->user); + $personalInfoForm = new Users_Form_PersonalInfo(null, $this->user); $this->view->fields = $personalInfoForm->getElements(); } } public function saveAction() { - $form = new PersonalInfoForm(null, $this->user); + $form = new Users_Form_PersonalInfo(null, $this->user); $formData = $this->_request->getPost(); $form->populate($formData); @@ -47,7 +47,7 @@ class Users_PersonalinfoController extends Monkeys_Controller_Action return; } - $fieldsValues = new FieldsValues(); + $fieldsValues = new Model_FieldsValues(); $fieldsValues->deleteForUser($this->user); foreach ($form->getValues() as $fieldName => $fieldValue) { diff --git a/modules/users/controllers/ProfileController.php b/modules/users/controllers/ProfileController.php index fb6121b..8632320 100755 --- a/modules/users/controllers/ProfileController.php +++ b/modules/users/controllers/ProfileController.php @@ -9,11 +9,11 @@ * @packager Keyboard Monkeys */ -class Users_ProfileController extends Monkeys_Controller_Action +class Users_ProfileController extends CommunityID_Controller_Action { public function indexAction() { - if (!$this->targetUser->id && $this->user->role != User::ROLE_ADMIN) { + if (!$this->targetUser->id && $this->user->role != Users_Model_User::ROLE_ADMIN) { throw new Monkeys_AccessDeniedException(); } diff --git a/modules/users/controllers/ProfilegeneralController.php b/modules/users/controllers/ProfilegeneralController.php index 56ada1b..db2f712 100644 --- a/modules/users/controllers/ProfilegeneralController.php +++ b/modules/users/controllers/ProfilegeneralController.php @@ -9,13 +9,13 @@ * @packager Keyboard Monkeys */ -class Users_ProfilegeneralController extends Monkeys_Controller_Action +class Users_ProfilegeneralController extends CommunityID_Controller_Action { private $_users; public function preDispatch() { - if ($this->user->role != User::ROLE_ADMIN + if ($this->user->role != Users_Model_User::ROLE_ADMIN && $this->targetUser->id != $this->user->id) { throw new Monkeys_AccessDeniedException(); @@ -30,7 +30,7 @@ class Users_ProfilegeneralController extends Monkeys_Controller_Action { 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)) + && ($this->targetUser->id != 0 || $this->user->role != Users_Model_User::ROLE_ADMIN)) { throw new Monkeys_AccessDeniedException(); } @@ -40,7 +40,7 @@ class Users_ProfilegeneralController extends Monkeys_Controller_Action $this->view->accountInfoForm = $appSession->accountInfoForm; unset($appSession->accountInfoForm); } else { - $this->view->accountInfoForm = new AccountInfoForm(null, $this->targetUser); + $this->view->accountInfoForm = new Users_Form_AccountInfo(null, $this->targetUser); $this->view->accountInfoForm->populate(array( 'username' => $this->targetUser->username, 'firstname' => $this->targetUser->firstname, @@ -59,7 +59,7 @@ class Users_ProfilegeneralController extends Monkeys_Controller_Action throw new Monkeys_AccessDeniedException(); } - $form = new AccountInfoForm(null, $this->targetUser); + $form = new Users_Form_AccountInfo(null, $this->targetUser); $formData = $this->_request->getPost(); $form->populate($formData); @@ -98,7 +98,7 @@ class Users_ProfilegeneralController extends Monkeys_Controller_Action $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->role = Users_Model_User::ROLE_REGISTERED; $this->targetUser->setClearPassword($form->getValue('password1')); } $this->targetUser->save(); @@ -115,7 +115,7 @@ class Users_ProfilegeneralController extends Monkeys_Controller_Action private function _usernameAlreadyExists($username) { $users = $this->_getUsers(); - return $users->getUser($username); + return $users->getUserWithUsername($username); } private function _emailAlreadyExists($email) @@ -154,7 +154,7 @@ class Users_ProfilegeneralController extends Monkeys_Controller_Action $this->view->changePasswordForm = $appSession->changePasswordForm; unset($appSession->changePasswordForm); } else { - $this->view->changePasswordForm = new ChangePasswordForm(); + $this->view->changePasswordForm = new Users_Form_ChangePassword(); } } @@ -165,7 +165,7 @@ class Users_ProfilegeneralController extends Monkeys_Controller_Action throw new Monkeys_AccessDeniedException(); } - $form = new ChangePasswordForm(); + $form = new Users_Form_ChangePassword(); $formData = $this->_request->getPost(); $form->populate($formData); if (!$form->isValid($formData)) { @@ -252,7 +252,7 @@ EOT; } if ($this->_config->subdomain->enabled) { - $openid = $this->_getProtocol() . '://' . $username . '.' . $this->_config->subdomain->hostname; + $openid = $this->getProtocol() . '://' . $username . '.' . $this->_config->subdomain->hostname; } else { $openid = $matches[1] . "/identity/$username"; } @@ -299,7 +299,7 @@ EOT; private function _getUsers() { if (!isset($this->_users)) { - $this->_users = new Users(); + $this->_users = new Users_Model_Users(); } return $this->_users; diff --git a/modules/users/controllers/RecoverpasswordController.php b/modules/users/controllers/RecoverpasswordController.php index 613e77b..c99a8ba 100755 --- a/modules/users/controllers/RecoverpasswordController.php +++ b/modules/users/controllers/RecoverpasswordController.php @@ -9,13 +9,13 @@ * @packager Keyboard Monkeys */ -class Users_RecoverpasswordController extends Monkeys_Controller_Action +class Users_RecoverpasswordController extends CommunityID_Controller_Action { public function init() { parent::init(); - if ($this->user->role != User::ROLE_ADMIN && $this->underMaintenance) { + if ($this->user->role != Users_Model_User::ROLE_ADMIN && $this->underMaintenance) { return $this->_redirectForMaintenance(); } } @@ -27,7 +27,7 @@ class Users_RecoverpasswordController extends Monkeys_Controller_Action $this->view->form = $appSession->recoverPasswordForm; unset($appSession->recoverPasswordForm); } else { - $this->view->form = new RecoverPasswordForm(); + $this->view->form = new Users_Form_RecoverPassword(); } $this->_helper->actionStack('index', 'login', 'users'); @@ -35,7 +35,7 @@ class Users_RecoverpasswordController extends Monkeys_Controller_Action public function sendAction() { - $form = new RecoverPasswordForm(); + $form = new Users_Form_RecoverPassword(); $formData = $this->_request->getPost(); $form->populate($formData); @@ -45,7 +45,7 @@ class Users_RecoverpasswordController extends Monkeys_Controller_Action return $this->_forward('index'); } - $users = new Users(); + $users = new Users_Model_Users(); $user = $users->getUserWithEmail($form->getValue('email')); if (!$user) { $form->email->addError($this->view->translate('This E-mail is not registered in the system')); @@ -54,7 +54,7 @@ class Users_RecoverpasswordController extends Monkeys_Controller_Action return $this->_forward('index'); } - $user->token = User::generateToken(); + $user->token = Users_Model_User::generateToken(); $user->save(); $locale = Zend_Registry::get('Zend_Locale'); @@ -87,7 +87,7 @@ class Users_RecoverpasswordController extends Monkeys_Controller_Action public function resetAction() { - $users = new Users(); + $users = new Users_Model_Users(); $user = $users->getUserWithToken($this->_getParam('token')); if (!$user) { $this->_helper->FlashMessenger->addMessage('Wrong Token'); @@ -99,7 +99,7 @@ class Users_RecoverpasswordController extends Monkeys_Controller_Action $user->setClearPassword($newPassword); // reset token - $user->token = User::generateToken(); + $user->token = Users_Model_User::generateToken(); $user->save(); diff --git a/modules/users/controllers/RegisterController.php b/modules/users/controllers/RegisterController.php index 781f6c2..f0bbcba 100755 --- a/modules/users/controllers/RegisterController.php +++ b/modules/users/controllers/RegisterController.php @@ -9,7 +9,7 @@ * @packager Keyboard Monkeys */ -class Users_RegisterController extends Monkeys_Controller_Action +class Users_RegisterController extends CommunityID_Controller_Action { protected $_numCols = 1; @@ -17,7 +17,7 @@ class Users_RegisterController extends Monkeys_Controller_Action { parent::init(); - if ($this->user->role != User::ROLE_ADMIN && $this->underMaintenance) { + if ($this->user->role != Users_Model_User::ROLE_ADMIN && $this->underMaintenance) { return $this->_redirectForMaintenance(); } @@ -36,14 +36,14 @@ class Users_RegisterController extends Monkeys_Controller_Action $form = $appSession->registerForm; unset($appSession->registerForm); } else { - $form = new RegisterForm(null, $this->view->base); + $form = new Users_Form_Register(null, $this->view->base); } $this->view->form = $form; } public function saveAction() { - $form = new RegisterForm(null, $this->view->base); + $form = new Users_Form_Register(null, $this->view->base); $formData = $this->_request->getPost(); $form->populate($formData); @@ -53,9 +53,9 @@ class Users_RegisterController extends Monkeys_Controller_Action return $this->_forward('index', null, null); } - $users = new Users(); + $users = new Users_Model_Users(); - if ($users->getUser($form->getValue('username'))) { + if ($users->getUserWithUsername($form->getValue('username'))) { $form->username->addError($this->view->translate('This username is already in use')); $appSession = Zend_Registry::get('appSession'); $appSession->registerForm = $form; @@ -79,7 +79,7 @@ class Users_RegisterController extends Monkeys_Controller_Action $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; + $openid = $this->getProtocol() . '://' . $user->username . '.' . $this->_config->subdomain->hostname; } else { $openid = $matches[1] . '/identity/' . $user->username; } @@ -91,14 +91,14 @@ class Users_RegisterController extends Monkeys_Controller_Action $user->openid = $openid; $user->setClearPassword($form->getValue('password1')); - $user->role = User::ROLE_GUEST; - $registrationToken = User::generateToken(); + $user->role = Users_Model_User::ROLE_GUEST; + $registrationToken = Users_Model_User::generateToken(); $user->token = $registrationToken; $user->accepted_eula = 0; $user->registration_date = date('Y-m-d'); $user->save(); - $mail = $this->getMail($user); + $mail = self::getMail($user, $this->view->translate('Community-ID registration confirmation')); try { $mail->send(); $this->_helper->FlashMessenger->addMessage($this->view->translate('Thank you.')); @@ -115,7 +115,7 @@ class Users_RegisterController extends Monkeys_Controller_Action public function eulaAction() { - $users = new Users(); + $users = new Users_Model_Users(); if ($this->_request->getParam('token') == '' || !($user = $users->getUserWithToken($this->_request->getParam('token')))) { $this->_helper->FlashMessenger->addMessage($this->view->translate('Invalid token')); @@ -141,7 +141,7 @@ class Users_RegisterController extends Monkeys_Controller_Action public function declineeulaAction() { - $users = new Users(); + $users = new Users_Model_Users(); if ($this->_request->getParam('token') == '' || !($user = $users->getUserWithToken($this->_request->getParam('token')))) { @@ -157,14 +157,14 @@ class Users_RegisterController extends Monkeys_Controller_Action public function accepteulaAction() { - $users = new Users(); + $users = new Users_Model_Users(); if ($this->_request->getParam('token') == '' || !($user = $users->getUserWithToken($this->_request->getParam('token')))) { $this->_helper->FlashMessenger->addMessage($this->view->translate('Invalid token')); $this->_redirect(''); } - $user->role = User::ROLE_REGISTERED; + $user->role = Users_Model_User::ROLE_REGISTERED; $user->accepted_eula = 1; $user->registration_date = date('Y-m-d'); $user->token = ''; @@ -180,7 +180,7 @@ class Users_RegisterController extends Monkeys_Controller_Action * @return Zend_Mail * @throws Zend_Mail_Protocol_Exception */ - public function getMail(User $user) + public static function getMail(Users_Model_User $user, $subject) { $locale = Zend_Registry::get('Zend_Locale'); $localeElements = explode('_', $locale); @@ -221,9 +221,9 @@ class Users_RegisterController extends Monkeys_Controller_Action $mail = new Zend_Mail('UTF-8'); $mail->setBodyText($emailTemplate); - $mail->setFrom($this->_config->email->supportemail); + $mail->setFrom($configEmail->supportemail); $mail->addTo($user->email); - $mail->setSubject($this->view->translate('Community-ID registration confirmation')); + $mail->setSubject($subject); return $mail; } diff --git a/modules/users/controllers/UserslistController.php b/modules/users/controllers/UserslistController.php index 85d1ebc..99dab6a 100755 --- a/modules/users/controllers/UserslistController.php +++ b/modules/users/controllers/UserslistController.php @@ -9,20 +9,20 @@ * @packager Keyboard Monkeys */ -class Users_UserslistController extends Monkeys_Controller_Action +class Users_UserslistController extends CommunityID_Controller_Action { public function indexAction() { $this->_helper->viewRenderer->setNeverRender(true); - $users = new Users(); + $users = new Users_Model_Users(); switch($this->_getParam('filter')) { case 'confirmed': - $where = "accepted_eula=1 AND role != '".User::ROLE_ADMIN."'"; + $where = "accepted_eula=1 AND role != '".Users_Model_User::ROLE_ADMIN."'"; break; case 'unconfirmed': - $where = "accepted_eula=0 AND role != '".User::ROLE_ADMIN."'"; + $where = "accepted_eula=0 AND role != '".Users_Model_User::ROLE_ADMIN."'"; break; default: $where = false; @@ -33,20 +33,22 @@ class Users_UserslistController extends Monkeys_Controller_Action $this->_getParam('startIndex'), $this->_getParam('results'), $this->_getParam('sort', 'registration'), - $this->_getParam('dir', Users::DIR_DESC), - $where); + $this->_getParam('dir', Users_Model_Users::DIR_DESC), + $where, + trim($this->_getParam('search'))); $jsonObj = new StdClass(); $jsonObj->recordsReturned = count($usersRows); - $jsonObj->totalRecords = $users->getNumUsers(); + $jsonObj->totalRecords = $users->getNumUsers($where, trim($this->_getParam('search'))); + $jsonObj->totalUsers = $users->getNumUsers(); $jsonObj->totalUnconfirmedUsers = $users->getNumUnconfirmedUsers(); - $jsonObj->startIndex = $_GET['startIndex']; + $jsonObj->startIndex = $this->_getParam('startIndex'); $jsonObj->sort = $this->_getParam('sort'); $jsonObj->dir = $this->_getParam('dir'); $jsonObj->records = array(); foreach ($usersRows as $user) { - if ($user->role == User::ROLE_ADMIN) { + if ($user->role == Users_Model_User::ROLE_ADMIN) { $status = $this->view->translate('admin'); } else if ($user->accepted_eula) { $status = $this->view->translate('confirmed'); diff --git a/modules/users/forms/AccountInfo.php b/modules/users/forms/AccountInfo.php new file mode 100644 index 0000000..18cd4fd --- /dev/null +++ b/modules/users/forms/AccountInfo.php @@ -0,0 +1,65 @@ +_targetUser = $user; + parent::__construct($options); + } + + public function init() + { + $username = new Monkeys_Form_Element_Text('username'); + translate('Username'); + $username->setLabel('Username') + ->addValidator(new Monkeys_Validate_Username()) + ->setRequired(true); + + $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/ChangePassword.php b/modules/users/forms/ChangePassword.php new file mode 100644 index 0000000..1d0be99 --- /dev/null +++ b/modules/users/forms/ChangePassword.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/Login.php b/modules/users/forms/Login.php new file mode 100755 index 0000000..f23d956 --- /dev/null +++ b/modules/users/forms/Login.php @@ -0,0 +1,62 @@ +_baseWebDir = $baseWebDir; + $this->_useCaptcha = $useCaptcha; + parent::__construct($options); + } + + public function init() + { + $username = new Monkeys_Form_Element_Text('username'); + translate('USERNAME'); + $username->setLabel('USERNAME') + ->setDecoratorOptions(array( + 'separateLine' => true, + 'dontMarkRequired' => true, + )) + ->setRequired(true); + + $password = new Monkeys_Form_Element_Password('password'); + translate('PASSWORD'); + $password->setLabel('PASSWORD') + ->setDecoratorOptions(array( + 'separateLine' => true, + 'dontMarkRequired' => true, + )) + ->setRequired(true); + + $rememberme = new Monkeys_Form_Element_Checkbox('rememberme'); + $rememberme->setLabel('Remember me'); + + $this->addElements(array($username, $password, $rememberme)); + + if ($this->_useCaptcha) { + $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, + ) + )); + $captcha->setDecoratorOptions(array( + 'separateLine' => true, + 'dontMarkRequired' => true, + )); + + $this->addElement($captcha); + } + } +} diff --git a/modules/users/forms/PersonalInfo.php b/modules/users/forms/PersonalInfo.php new file mode 100644 index 0000000..8492112 --- /dev/null +++ b/modules/users/forms/PersonalInfo.php @@ -0,0 +1,78 @@ +_sregProps = $sregProps; + + $fields = new Model_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']); + } + } + } + + /** + * This removes the "openid_sreg_" prefix from the field names + */ + public function getUnqualifiedValues() + { + $values = array(); + foreach ($this->getValues() as $key => $value) { + $values[substr($key, 12)] = $value; + } + + return $values; + } +} diff --git a/modules/users/forms/RecoverPassword.php b/modules/users/forms/RecoverPassword.php new file mode 100644 index 0000000..343c8b1 --- /dev/null +++ b/modules/users/forms/RecoverPassword.php @@ -0,0 +1,25 @@ +setLabel('') + ->addFilter('StringToLower') + ->setRequired(true) + ->addValidator('EmailAddress'); + + $this->addElement($email); + } +} diff --git a/modules/users/forms/Register.php b/modules/users/forms/Register.php new file mode 100755 index 0000000..165a64b --- /dev/null +++ b/modules/users/forms/Register.php @@ -0,0 +1,77 @@ +_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') + ->addValidator(new Monkeys_Validate_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/AuthAttempt.php b/modules/users/models/AuthAttempt.php new file mode 100644 index 0000000..79ed29a --- /dev/null +++ b/modules/users/models/AuthAttempt.php @@ -0,0 +1,29 @@ +failed_attempts++; + $this->last_attempt = date('Y-m-d H:i:s'); + } + + public function surpassedMaxAllowed() + { + return ($this->failed_attempts >= self::MAX_ATTEMPTS_ALLOWED) + && $this->last_attempt > date('Y-m-d H:i:s', time() - self::MIN_MINUTES_BETWEEN_ATTEMPTS * 60); + } +} diff --git a/modules/users/models/AuthAttempts.php b/modules/users/models/AuthAttempts.php new file mode 100644 index 0000000..eb9c336 --- /dev/null +++ b/modules/users/models/AuthAttempts.php @@ -0,0 +1,51 @@ +select() + ->where('session_id=?', session_id()); + + $row = $this->fetchRow($select); + if ($row) { + return $row; + } + + $select = $select->where('IP=?', $ip); + + return $this->fetchRow($select); + } + + public function create() + { + $ip = @$_SERVER['REMOTE_ADDR']; + + $attempt = $this->createRow(); + $attempt->IP = $ip; + $attempt->session_id = session_id(); + $attempt->failed_attempts = 1; + $attempt->last_attempt = date('Y-m-d H:i:s'); + $attempt->save(); + } +} diff --git a/modules/users/models/User.php b/modules/users/models/User.php index 9ae36f2..e33d41a 100755 --- a/modules/users/models/User.php +++ b/modules/users/models/User.php @@ -4,13 +4,13 @@ * @copyright Copyright (C) 2005-2009 Keyboard Monkeys Ltd. http://www.kb-m.com * @license http://creativecommons.org/licenses/BSD/ BSD License * @author Keyboard Monkeys Ltd. -* @since Textroller 0.9 -* @package TextRoller +* @since CommunityID 0.9 +* @package CommunityID * @packager Keyboard Monkeys */ -class User extends Zend_Db_Table_Row_Abstract +class Users_Model_User extends Zend_Db_Table_Row_Abstract { const ROLE_GUEST = 'guest'; const ROLE_REGISTERED = 'registered'; diff --git a/modules/users/models/Users.php b/modules/users/models/Users.php index 99b49c0..0f26585 100755 --- a/modules/users/models/Users.php +++ b/modules/users/models/Users.php @@ -4,21 +4,23 @@ * @copyright Copyright (C) 2005-2009 Keyboard Monkeys Ltd. http://www.kb-m.com * @license http://creativecommons.org/licenses/BSD/ BSD License * @author Keyboard Monkeys Ltd. -* @since Textroller 0.9 -* @package TextRoller +* @since CommunityID 0.9 +* @package CommunityID * @packager Keyboard Monkeys */ -class Users extends Monkeys_Db_Table_Gateway +class Users_Model_Users extends Monkeys_Db_Table_Gateway { - protected $_name = 'users'; - protected $_primary = 'id'; - protected $_rowClass = 'User'; - const DIR_ASC = 0; const DIR_DESC = 1; + protected $_name = 'users'; + protected $_primary = 'id'; + protected $_rowClass = 'Users_Model_User'; + + private $_user; + private $_sortFields = array( 'name' => array('firstname', 'lastname'), 'registration' => array('registration_date', 'firstname', 'lastname'), @@ -30,12 +32,74 @@ class Users extends Monkeys_Db_Table_Gateway return parent::createRow(array( 'openid' => '', 'password_changed' => '0000-00-00', - 'role' => User::ROLE_GUEST, + 'role' => Users_Model_User::ROLE_GUEST, 'passwordreset_token' => '', )); } - public function getUsers($startIndex = false, $results = false, $sort = false, $dir = false, $where = false) + /** + * In CID we chose from the beginning not to use SET NAMES, and instead leave the charset encodings configurations + * to remain in the database server side (my.cnf). + * + * CID's strings are UTF8. If character_set_client is not UTF8 but latin1 for example (unfortunatly that's the common case), non-latin1 + * characters will appear garbled when manually browsing the db, but they should show OK in CID's web pages. + * + * When authenticating below, we use MySQL's MD5 function. From my tests, it looks like the argument of this function + * gets automatically converted to the charset of that field. Sorta like if we had implicitly MD5(CONVERT(arg using charset)). + * When the tables are build during setup, the charset of string fields are set accordingly to the my.cnf directives + * character-set-server and collation-server. + * If those directives don't match character_set_client, the conversion inside MD5 will in fact transform the string, and we'll + * get the MD5 of a different string than what we had intended (well, only if the string contains non-latin1 characters). + * For this reason we have to override that conversion, converting to the charset specified in character_set_client, as shown below. + * + * @return Zend_Auth_Result + */ + public function authenticate($identity, $password, $isOpenId = false) + { + $auth = Zend_Auth::getInstance(); + $db = $this->getAdapter(); + + $result = $db->query("SHOW VARIABLES LIKE 'character_set_client'")->fetch(); + $clientCharset = $result['Value']; + if ($isOpenId) { + if (!Zend_OpenId::normalize($identity)) { + return false; + } + + $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'users', 'openid', 'password', + 'MD5(CONCAT(CONVERT(openid using ' . $clientCharset . '), CONVERT(? using ' . $clientCharset . ')))'); + } else { + $authAdapter = new Zend_Auth_Adapter_DbTable($db, 'users', 'username', 'password', + 'MD5(CONCAT(CONVERT(openid using ' . $clientCharset . '), CONVERT(? using ' . $clientCharset . ')))'); + } + + $authAdapter->setIdentity($identity); + $authAdapter->setCredential($password); + + $result = $auth->authenticate($authAdapter); + + if ($result->isValid()) { + if ($isOpenId) { + $this->_user = $this->getUserWithOpenId($identity); + } else { + $this->_user = $this->getUserWithUsername($identity); + } + + $auth->getStorage()->write($this->_user); + Zend_Registry::set('user', $this->_user); + + return true; + } + + return false; + } + + public function getUser() + { + return $this->_user; + } + + public function getUsers($startIndex = false, $results = false, $sort = false, $dir = false, $where = false, $search = false) { $select = $this->select(); @@ -57,19 +121,23 @@ class Users extends Monkeys_Db_Table_Gateway $select = $select->where($where); } + if ($search) { + $select = $select->where('firstname LIKE ? OR lastname LIKE ?', "%$search%", "%$search%"); + } + return $this->fetchAll($select); } - public function getNumUsers($where = false) + public function getNumUsers($where = false, $search = false) { - $users = $this->getUsers(false, false, false, false, $where); + $users = $this->getUsers(false, false, false, false, $where, $search); return count($users); } public function getNumUnconfirmedUsers() { - $users = $this->getUsers(false, false, false, false, "accepted_eula=0 AND role != '".User::ROLE_ADMIN."'"); + $users = $this->getUsers(false, false, false, false, "accepted_eula=0 AND role != '".Users_Model_User::ROLE_ADMIN."'"); return count($users); } @@ -90,6 +158,14 @@ class Users extends Monkeys_Db_Table_Gateway return $this->fetchRow($select); } + public function getUserWithUsername($username) + { + $select = $this->select() + ->where('username=?', $username); + + return $this->fetchRow($select); + } + public function getUserWithOpenId($openid) { $select = $this->select() @@ -98,11 +174,14 @@ class Users extends Monkeys_Db_Table_Gateway return $this->fetchRow($select); } - public function getUser($identity) + public function getUnconfirmedUsers($olderThanDays) { - $select = $this->select()->where('username=?', $identity); + $date = date('Y-m-d', strtotime("$olderThanDays days ago")); + $select = $this->select() + ->where('accepted_eula=0') + ->where('registration_date < ?', $date); - return $this->fetchRow($select); + return $this->fetchAll($select); } public function deleteUser(User $user) @@ -116,9 +195,11 @@ class Users extends Monkeys_Db_Table_Gateway $this->delete('test=1'); } - public function deleteUnconfirmed() + public function deleteUnconfirmed($olderThanDays) { - $this->delete("accepted_eula=0 AND role = '".User::ROLE_GUEST."'"); + $olderThanDays = (int) $olderThanDays; + $date = date('Y-m-d', strtotime("$olderThanDays days ago")); + $this->delete("accepted_eula=0 AND role = '".Users_Model_User::ROLE_GUEST."' AND registration_date < '$date'"); } protected $_metadata = array( diff --git a/modules/users/views/scripts/login/index.phtml b/modules/users/views/scripts/login/index.phtml index c45988a..84b46dc 100755 --- a/modules/users/views/scripts/login/index.phtml +++ b/modules/users/views/scripts/login/index.phtml @@ -1,79 +1,85 @@ -user->role != User::ROLE_GUEST ): ?> +user->role != Users_Model_User::ROLE_GUEST ): ?>

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

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

      translate('Admin options') ?>

      +

      translate('Admin options') ?>

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

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


      - translate('You don\'t have an account?') ?> + 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 index 9dfb4f2..d15f8d2 100644 --- a/modules/users/views/scripts/manageusers/index.phtml +++ b/modules/users/views/scripts/manageusers/index.phtml @@ -6,29 +6,37 @@ YAHOO.util.Event.onDOMReady(function () { ); }); -
    • ";H="
    • ";F=1;}while (D&&D!=A.FCK.EditorDocument.body){if (D.tagName.toLowerCase()=='p'){F=1;break;};D=D.parentNode;};for (var i=0;i0) return A[A.length-1];return null;};FCKTools.GetDocumentPosition=function(w,A){var x=0;var y=0;var B=A;var C=null;var D=FCKTools.GetElementWindow(B);while (B&&!(D==w&&(B==w.document.body||B==w.document.documentElement))){x+=B.offsetLeft-B.scrollLeft;y+=B.offsetTop-B.scrollTop;if (!FCKBrowserInfo.IsOpera){var E=C;while (E&&E!=B){x-=E.scrollLeft;y-=E.scrollTop;E=E.parentNode;}};C=B;if (B.offsetParent) B=B.offsetParent;else{if (D!=w){B=D.frameElement;C=null;if (B) D=B.contentWindow.parent;}else B=null;}};if (FCKDomTools.GetCurrentElementStyle(w.document.body,'position')!='static'||(FCKBrowserInfo.IsIE&&FCKDomTools.GetPositionedAncestor(A)==null)){x+=w.document.body.offsetLeft;y+=w.document.body.offsetTop;};return { "x":x,"y":y };};FCKTools.GetWindowPosition=function(w,A){var B=this.GetDocumentPosition(w,A);var C=FCKTools.GetScrollPosition(w);B.x-=C.X;B.y-=C.Y;return B;};FCKTools.ProtectFormStyles=function(A){if (!A||A.nodeType!=1||A.tagName.toLowerCase()!='form') return [];var B=[];var C=['style','className'];for (var i=0;i0){for (var i=B.length-1;i>=0;i--){var C=B[i][0];var D=B[i][1];if (D) A.insertBefore(C,D);else A.appendChild(C);}}};FCKTools.GetNextNode=function(A,B){if (A.firstChild) return A.firstChild;else if (A.nextSibling) return A.nextSibling;else{var C=A.parentNode;while (C){if (C==B) return null;if (C.nextSibling) return C.nextSibling;else C=C.parentNode;}};return null;};FCKTools.GetNextTextNode=function(A,B,C){node=this.GetNextNode(A,B);if (C&&node&&C(node)) return null;while (node&&node.nodeType!=3){node=this.GetNextNode(node,B);if (C&&node&&C(node)) return null;};return node;};FCKTools.Merge=function(){var A=arguments;var o=A[0];for (var i=1;i');document.domain = '"+FCK_RUNTIME_DOMAIN+"';document.close();}() ) ;";if (FCKBrowserInfo.IsIE){if (FCKBrowserInfo.IsIE7||!FCKBrowserInfo.IsIE6) return "";else return "javascript: '';";};return "javascript: void(0);";};FCKTools.ResetStyles=function(A){A.style.cssText='margin:0;padding:0;border:0;background-color:transparent;background-image:none;';}; +FCKTools.CancelEvent=function(e){return false;};FCKTools._AppendStyleSheet=function(A,B){return A.createStyleSheet(B).owningElement;};FCKTools.AppendStyleString=function(A,B){if (!B) return null;var s=A.createStyleSheet("");s.cssText=B;return s;};FCKTools.ClearElementAttributes=function(A){A.clearAttributes();};FCKTools.GetAllChildrenIds=function(A){var B=[];for (var i=0;i0) B[B.length]=C;};return B;};FCKTools.RemoveOuterTags=function(e){e.insertAdjacentHTML('beforeBegin',e.innerHTML);e.parentNode.removeChild(e);};FCKTools.CreateXmlObject=function(A){var B;switch (A){case 'XmlHttp':if (document.location.protocol!='file:') try { return new XMLHttpRequest();} catch (e) {};B=['MSXML2.XmlHttp','Microsoft.XmlHttp'];break;case 'DOMDocument':B=['MSXML2.DOMDocument','Microsoft.XmlDom'];break;};for (var i=0;i<2;i++){try { return new ActiveXObject(B[i]);}catch (e){}};if (FCKLang.NoActiveX){alert(FCKLang.NoActiveX);FCKLang.NoActiveX=null;};return null;};FCKTools.DisableSelection=function(A){A.unselectable='on';var e,i=0;while ((e=A.all[i++])){switch (e.tagName){case 'IFRAME':case 'TEXTAREA':case 'INPUT':case 'SELECT':break;default:e.unselectable='on';}}};FCKTools.GetScrollPosition=function(A){var B=A.document;var C={ X:B.documentElement.scrollLeft,Y:B.documentElement.scrollTop };if (C.X>0||C.Y>0) return C;return { X:B.body.scrollLeft,Y:B.body.scrollTop };};FCKTools.AddEventListener=function(A,B,C){A.attachEvent('on'+B,C);};FCKTools.RemoveEventListener=function(A,B,C){A.detachEvent('on'+B,C);};FCKTools.AddEventListenerEx=function(A,B,C,D){var o={};o.Source=A;o.Params=D||[];o.Listener=function(ev){return C.apply(o.Source,[ev].concat(o.Params));};if (FCK.IECleanup) FCK.IECleanup.AddItem(null,function() { o.Source=null;o.Params=null;});A.attachEvent('on'+B,o.Listener);A=null;D=null;};FCKTools.GetViewPaneSize=function(A){var B;var C=A.document.documentElement;if (C&&C.clientWidth) B=C;else B=A.document.body;if (B) return { Width:B.clientWidth,Height:B.clientHeight };else return { Width:0,Height:0 };};FCKTools.SaveStyles=function(A){var B=FCKTools.ProtectFormStyles(A);var C={};if (A.className.length>0){C.Class=A.className;A.className='';};var D=A.style.cssText;if (D.length>0){C.Inline=D;A.style.cssText='';};FCKTools.RestoreFormStyles(A,B);return C;};FCKTools.RestoreStyles=function(A,B){var C=FCKTools.ProtectFormStyles(A);A.className=B.Class||'';A.style.cssText=B.Inline||'';FCKTools.RestoreFormStyles(A,C);};FCKTools.RegisterDollarFunction=function(A){A.$=A.document.getElementById;};FCKTools.AppendElement=function(A,B){return A.appendChild(this.GetElementDocument(A).createElement(B));};FCKTools.ToLowerCase=function(A){return A.toLowerCase();}; +var FCKeditorAPI;function InitializeAPI(){var A=window.parent;if (!(FCKeditorAPI=A.FCKeditorAPI)){var B='window.FCKeditorAPI = {Version : "2.6.4.1",VersionBuild : "23187",Instances : window.FCKeditorAPI && window.FCKeditorAPI.Instances || {},GetInstance : function( name ){return this.Instances[ name ];},_FormSubmit : function(){for ( var name in FCKeditorAPI.Instances ){var oEditor = FCKeditorAPI.Instances[ name ] ;if ( oEditor.GetParentForm && oEditor.GetParentForm() == this )oEditor.UpdateLinkedField() ;}this._FCKOriginalSubmit() ;},_FunctionQueue : window.FCKeditorAPI && window.FCKeditorAPI._FunctionQueue || {Functions : new Array(),IsRunning : false,Add : function( f ){this.Functions.push( f );if ( !this.IsRunning )this.StartNext();},StartNext : function(){var aQueue = this.Functions ;if ( aQueue.length > 0 ){this.IsRunning = true;aQueue[0].call();}else this.IsRunning = false;},Remove : function( f ){var aQueue = this.Functions;var i = 0, fFunc;while( (fFunc = aQueue[ i ]) ){if ( fFunc == f )aQueue.splice( i,1 );i++ ;}this.StartNext();}}}';if (A.execScript) A.execScript(B,'JavaScript');else{if (FCKBrowserInfo.IsGecko10){eval.call(A,B);}else if(FCKBrowserInfo.IsAIR){FCKAdobeAIR.FCKeditorAPI_Evaluate(A,B);}else if (FCKBrowserInfo.IsSafari){var C=A.document;var D=C.createElement('script');D.appendChild(C.createTextNode(B));C.documentElement.appendChild(D);}else A.eval(B);};FCKeditorAPI=A.FCKeditorAPI;FCKeditorAPI.__Instances=FCKeditorAPI.Instances;};FCKeditorAPI.Instances[FCK.Name]=FCK;};function _AttachFormSubmitToAPI(){var A=FCK.GetParentForm();if (A){FCKTools.AddEventListener(A,'submit',FCK.UpdateLinkedField);if (!A._FCKOriginalSubmit&&(typeof(A.submit)=='function'||(!A.submit.tagName&&!A.submit.length))){A._FCKOriginalSubmit=A.submit;A.submit=FCKeditorAPI._FormSubmit;}}};function FCKeditorAPI_Cleanup(){if (window.FCKConfig&&FCKConfig.MsWebBrowserControlCompat&&!window.FCKUnloadFlag) return;delete FCKeditorAPI.Instances[FCK.Name];};function FCKeditorAPI_ConfirmCleanup(){if (window.FCKConfig&&FCKConfig.MsWebBrowserControlCompat) window.FCKUnloadFlag=true;};FCKTools.AddEventListener(window,'unload',FCKeditorAPI_Cleanup);FCKTools.AddEventListener(window,'beforeunload',FCKeditorAPI_ConfirmCleanup); +var FCKImagePreloader=function(){this._Images=[];};FCKImagePreloader.prototype={AddImages:function(A){if (typeof(A)=='string') A=A.split(';');this._Images=this._Images.concat(A);},Start:function(){var A=this._Images;this._PreloadCount=A.length;for (var i=0;i]*\>)/i,AfterBody:/(\<\/body\>[\s\S]*$)/i,ToReplace:/___fcktoreplace:([\w]+)/ig,MetaHttpEquiv:/http-equiv\s*=\s*["']?([^"' ]+)/i,HasBaseTag:/]/i,HtmlOpener:/]*>/i,HeadOpener:/]*>/i,HeadCloser:/<\/head\s*>/i,FCK_Class:/\s*FCK__[^ ]*(?=\s+|$)/,ElementName:/(^[a-z_:][\w.\-:]*\w$)|(^[a-z_]$)/,ForceSimpleAmpersand:/___FCKAmp___/g,SpaceNoClose:/\/>/g,EmptyParagraph:/^<(p|div|address|h\d|center)(?=[ >])[^>]*>\s*(<\/\1>)?$/,EmptyOutParagraph:/^<(p|div|address|h\d|center)(?=[ >])[^>]*>(?:\s*| )(<\/\1>)?$/,TagBody:/>]+))/gi,ProtectUrlsA:/]+))/gi,ProtectUrlsArea:/]+))/gi,Html4DocType:/HTML 4\.0 Transitional/i,DocTypeTag:/]*>/i,HtmlDocType:/DTD HTML/,TagsWithEvent:/<[^\>]+ on\w+[\s\r\n]*=[\s\r\n]*?('|")[\s\S]+?\>/g,EventAttributes:/\s(on\w+)[\s\r\n]*=[\s\r\n]*?('|")([\s\S]*?)\2/g,ProtectedEvents:/\s\w+_fckprotectedatt="([^"]+)"/g,StyleProperties:/\S+\s*:/g,InvalidSelfCloseTags:/(<(?!base|meta|link|hr|br|param|img|area|input)([a-zA-Z0-9:]+)[^>]*)\/>/gi,StyleVariableAttName:/#\(\s*("|')(.+?)\1[^\)]*\s*\)/g,RegExp:/^\/(.*)\/([gim]*)$/,HtmlTag:/<[^\s<>](?:"[^"]*"|'[^']*'|[^<])*>/}; +var FCKListsLib={BlockElements:{ address:1,blockquote:1,center:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,marquee:1,noscript:1,ol:1,p:1,pre:1,script:1,table:1,ul:1 },NonEmptyBlockElements:{ p:1,div:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,address:1,pre:1,ol:1,ul:1,li:1,td:1,th:1 },InlineChildReqElements:{ abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 },InlineNonEmptyElements:{ a:1,abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 },EmptyElements:{ base:1,col:1,meta:1,link:1,hr:1,br:1,param:1,img:1,area:1,input:1 },PathBlockElements:{ address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,de:1 },PathBlockLimitElements:{ body:1,div:1,td:1,th:1,caption:1,form:1 },StyleBlockElements:{ address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1 },StyleObjectElements:{ img:1,hr:1,li:1,table:1,tr:1,td:1,embed:1,object:1,ol:1,ul:1 },NonEditableElements:{ button:1,option:1,script:1,iframe:1,textarea:1,object:1,embed:1,map:1,applet:1 },BlockBoundaries:{ p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,address:1,pre:1,ol:1,ul:1,li:1,dt:1,de:1,table:1,thead:1,tbody:1,tfoot:1,tr:1,th:1,td:1,caption:1,col:1,colgroup:1,blockquote:1,body:1 },ListBoundaries:{ p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,address:1,pre:1,ol:1,ul:1,li:1,dt:1,de:1,table:1,thead:1,tbody:1,tfoot:1,tr:1,th:1,td:1,caption:1,col:1,colgroup:1,blockquote:1,body:1,br:1 }}; +var FCKLanguageManager=FCK.Language={AvailableLanguages:{af:'Afrikaans',ar:'Arabic',bg:'Bulgarian',bn:'Bengali/Bangla',bs:'Bosnian',ca:'Catalan',cs:'Czech',da:'Danish',de:'German',el:'Greek',en:'English','en-au':'English (Australia)','en-ca':'English (Canadian)','en-uk':'English (United Kingdom)',eo:'Esperanto',es:'Spanish',et:'Estonian',eu:'Basque',fa:'Persian',fi:'Finnish',fo:'Faroese',fr:'French','fr-ca':'French (Canada)',gl:'Galician',gu:'Gujarati',he:'Hebrew',hi:'Hindi',hr:'Croatian',hu:'Hungarian',is:'Icelandic',it:'Italian',ja:'Japanese',km:'Khmer',ko:'Korean',lt:'Lithuanian',lv:'Latvian',mn:'Mongolian',ms:'Malay',nb:'Norwegian Bokmal',nl:'Dutch',no:'Norwegian',pl:'Polish',pt:'Portuguese (Portugal)','pt-br':'Portuguese (Brazil)',ro:'Romanian',ru:'Russian',sk:'Slovak',sl:'Slovenian',sr:'Serbian (Cyrillic)','sr-latn':'Serbian (Latin)',sv:'Swedish',th:'Thai',tr:'Turkish',uk:'Ukrainian',vi:'Vietnamese',zh:'Chinese Traditional','zh-cn':'Chinese Simplified'},GetActiveLanguage:function(){if (FCKConfig.AutoDetectLanguage){var A;if (navigator.userLanguage) A=navigator.userLanguage.toLowerCase();else if (navigator.language) A=navigator.language.toLowerCase();else{return FCKConfig.DefaultLanguage;};if (A.length>=5){A=A.substr(0,5);if (this.AvailableLanguages[A]) return A;};if (A.length>=2){A=A.substr(0,2);if (this.AvailableLanguages[A]) return A;}};return this.DefaultLanguage;},TranslateElements:function(A,B,C,D){var e=A.getElementsByTagName(B);var E,s;for (var i=0;i':'gt','ˆ':'circ','Ëœ':'tilde',' ':'ensp',' ':'emsp',' ':'thinsp','‌':'zwnj','â€':'zwj','‎':'lrm','â€':'rlm','–':'ndash','—':'mdash','‘':'lsquo','’':'rsquo','‚':'sbquo','“':'ldquo','â€':'rdquo','„':'bdquo','†':'dagger','‡':'Dagger','‰':'permil','‹':'lsaquo','›':'rsaquo','€':'euro'};for (e in FCKXHtmlEntities.Entities) A+=e;if (FCKConfig.IncludeLatinEntities){B={'À':'Agrave','Ã':'Aacute','Â':'Acirc','Ã':'Atilde','Ä':'Auml','Ã…':'Aring','Æ':'AElig','Ç':'Ccedil','È':'Egrave','É':'Eacute','Ê':'Ecirc','Ë':'Euml','ÃŒ':'Igrave','Ã':'Iacute','ÃŽ':'Icirc','Ã':'Iuml','Ã':'ETH','Ñ':'Ntilde','Ã’':'Ograve','Ó':'Oacute','Ô':'Ocirc','Õ':'Otilde','Ö':'Ouml','Ø':'Oslash','Ù':'Ugrave','Ú':'Uacute','Û':'Ucirc','Ãœ':'Uuml','Ã':'Yacute','Þ':'THORN','ß':'szlig','à':'agrave','á':'aacute','â':'acirc','ã':'atilde','ä':'auml','Ã¥':'aring','æ':'aelig','ç':'ccedil','è':'egrave','é':'eacute','ê':'ecirc','ë':'euml','ì':'igrave','í':'iacute','î':'icirc','ï':'iuml','ð':'eth','ñ':'ntilde','ò':'ograve','ó':'oacute','ô':'ocirc','õ':'otilde','ö':'ouml','ø':'oslash','ù':'ugrave','ú':'uacute','û':'ucirc','ü':'uuml','ý':'yacute','þ':'thorn','ÿ':'yuml','Å’':'OElig','Å“':'oelig','Å ':'Scaron','Å¡':'scaron','Ÿ':'Yuml'};for (e in B){FCKXHtmlEntities.Entities[e]=B[e];A+=e;};B=null;};if (FCKConfig.IncludeGreekEntities){B={'Α':'Alpha','Î’':'Beta','Γ':'Gamma','Δ':'Delta','Ε':'Epsilon','Ζ':'Zeta','Η':'Eta','Θ':'Theta','Ι':'Iota','Κ':'Kappa','Λ':'Lambda','Îœ':'Mu','Î':'Nu','Ξ':'Xi','Ο':'Omicron','Π':'Pi','Ρ':'Rho','Σ':'Sigma','Τ':'Tau','Î¥':'Upsilon','Φ':'Phi','Χ':'Chi','Ψ':'Psi','Ω':'Omega','α':'alpha','β':'beta','γ':'gamma','δ':'delta','ε':'epsilon','ζ':'zeta','η':'eta','θ':'theta','ι':'iota','κ':'kappa','λ':'lambda','μ':'mu','ν':'nu','ξ':'xi','ο':'omicron','Ï€':'pi','Ï':'rho','Ï‚':'sigmaf','σ':'sigma','Ï„':'tau','Ï…':'upsilon','φ':'phi','χ':'chi','ψ':'psi','ω':'omega','\u03d1':'thetasym','\u03d2':'upsih','\u03d6':'piv'};for (e in B){FCKXHtmlEntities.Entities[e]=B[e];A+=e;};B=null;}}else{FCKXHtmlEntities.Entities={'>':'gt'};A='>';A+=' ';};var C='['+A+']';if (FCKConfig.ProcessNumericEntities) C='[^ -~]|'+C;var D=FCKConfig.AdditionalNumericEntities;if (D&&D.length>0) C+='|'+FCKConfig.AdditionalNumericEntities;FCKXHtmlEntities.EntitiesRegex=new RegExp(C,'g');}; +var FCKXHtml={};FCKXHtml.CurrentJobNum=0;FCKXHtml.GetXHTML=function(A,B,C){FCKDomTools.CheckAndRemovePaddingNode(FCKTools.GetElementDocument(A),FCKConfig.EnterMode);FCKXHtmlEntities.Initialize();this._NbspEntity=(FCKConfig.ProcessHTMLEntities?'nbsp':'#160');var D=FCK.IsDirty();FCKXHtml.SpecialBlocks=[];this.XML=FCKTools.CreateXmlObject('DOMDocument');this.MainNode=this.XML.appendChild(this.XML.createElement('xhtml'));FCKXHtml.CurrentJobNum++;if (B) this._AppendNode(this.MainNode,A);else this._AppendChildNodes(this.MainNode,A,false);var E=this._GetMainXmlString();this.XML=null;if (FCKBrowserInfo.IsSafari) E=E.replace(/^/,'');E=E.substr(7,E.length-15).Trim();if (FCKConfig.DocType.length>0&&FCKRegexLib.HtmlDocType.test(FCKConfig.DocType)) E=E.replace(FCKRegexLib.SpaceNoClose,'>');else E=E.replace(FCKRegexLib.SpaceNoClose,' />');if (FCKConfig.ForceSimpleAmpersand) E=E.replace(FCKRegexLib.ForceSimpleAmpersand,'&');if (C) E=FCKCodeFormatter.Format(E);for (var i=0;i0;if (C) A.appendChild(this.XML.createTextNode(B.replace(FCKXHtmlEntities.EntitiesRegex,FCKXHtml_GetEntity)));return C;};function FCKXHtml_GetEntity(A){var B=FCKXHtmlEntities.Entities[A]||('#'+A.charCodeAt(0));return '#?-:'+B+';';};FCKXHtml.TagProcessors={a:function(A,B){if (B.innerHTML.Trim().length==0&&!B.name) return false;var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);};A=FCKXHtml._AppendChildNodes(A,B,false);return A;},area:function(A,B){var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (!A.attributes.getNamedItem('coords')){var D=B.getAttribute('coords',2);if (D&&D!='0,0,0') FCKXHtml._AppendAttribute(A,'coords',D);};if (!A.attributes.getNamedItem('shape')){var E=B.getAttribute('shape',2);if (E&&E.length>0) FCKXHtml._AppendAttribute(A,'shape',E.toLowerCase());}};return A;},body:function(A,B){A=FCKXHtml._AppendChildNodes(A,B,false);A.removeAttribute('spellcheck');return A;},iframe:function(A,B){var C=B.innerHTML;if (FCKBrowserInfo.IsGecko) C=FCKTools.HTMLDecode(C);C=C.replace(/\s_fcksavedurl="[^"]*"/g,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},img:function(A,B){if (!A.attributes.getNamedItem('alt')) FCKXHtml._AppendAttribute(A,'alt','');var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'src',C);if (B.style.width) A.removeAttribute('width');if (B.style.height) A.removeAttribute('height');return A;},li:function(A,B,C){if (C.nodeName.IEquals(['ul','ol'])) return FCKXHtml._AppendChildNodes(A,B,true);var D=FCKXHtml.XML.createElement('ul');B._fckxhtmljob=null;do{FCKXHtml._AppendNode(D,B);do{B=FCKDomTools.GetNextSibling(B);} while (B&&B.nodeType==3&&B.nodeValue.Trim().length==0)} while (B&&B.nodeName.toLowerCase()=='li') return D;},ol:function(A,B,C){if (B.innerHTML.Trim().length==0) return false;var D=C.lastChild;if (D&&D.nodeType==3) D=D.previousSibling;if (D&&D.nodeName.toUpperCase()=='LI'){B._fckxhtmljob=null;FCKXHtml._AppendNode(D,B);return false;};A=FCKXHtml._AppendChildNodes(A,B);return A;},pre:function (A,B){var C=B.firstChild;if (C&&C.nodeType==3) A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem('\r\n')));FCKXHtml._AppendChildNodes(A,B,true);return A;},script:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/javascript');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(B.text)));return A;},span:function(A,B){if (B.innerHTML.length==0) return false;A=FCKXHtml._AppendChildNodes(A,B,false);return A;},style:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/css');var C=B.innerHTML;if (FCKBrowserInfo.IsIE) C=C.replace(/^(\r\n|\n|\r)/,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},title:function(A,B){A.appendChild(FCKXHtml.XML.createTextNode(FCK.EditorDocument.title));return A;}};FCKXHtml.TagProcessors.ul=FCKXHtml.TagProcessors.ol; +FCKXHtml._GetMainXmlString=function(){return this.MainNode.xml;};FCKXHtml._AppendAttributes=function(A,B,C,D){var E=B.attributes,bHasStyle;for (var n=0;n0){var I=FCKTools.ProtectFormStyles(B);var J=B.style.cssText.replace(FCKRegexLib.StyleProperties,FCKTools.ToLowerCase);FCKTools.RestoreFormStyles(B,I);this._AppendAttribute(C,'style',J);}};FCKXHtml.TagProcessors['div']=function(A,B){if (B.align.length>0) FCKXHtml._AppendAttribute(A,'align',B.align);A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['font']=function(A,B){if (A.attributes.length==0) A=FCKXHtml.XML.createDocumentFragment();A=FCKXHtml._AppendChildNodes(A,B);return A;};FCKXHtml.TagProcessors['form']=function(A,B){if (B.acceptCharset&&B.acceptCharset.length>0&&B.acceptCharset!='UNKNOWN') FCKXHtml._AppendAttribute(A,'accept-charset',B.acceptCharset);var C=B.attributes['name'];if (C&&C.value.length>0) FCKXHtml._AppendAttribute(A,'name',C.value);A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['input']=function(A,B){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);if (B.value&&!A.attributes.getNamedItem('value')) FCKXHtml._AppendAttribute(A,'value',B.value);if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text');return A;};FCKXHtml.TagProcessors['label']=function(A,B){if (B.htmlFor.length>0) FCKXHtml._AppendAttribute(A,'for',B.htmlFor);A=FCKXHtml._AppendChildNodes(A,B);return A;};FCKXHtml.TagProcessors['map']=function(A,B){if (!A.attributes.getNamedItem('name')){var C=B.name;if (C) FCKXHtml._AppendAttribute(A,'name',C);};A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['meta']=function(A,B){var C=A.attributes.getNamedItem('http-equiv');if (C==null||C.value.length==0){var D=B.outerHTML.match(FCKRegexLib.MetaHttpEquiv);if (D){D=D[1];FCKXHtml._AppendAttribute(A,'http-equiv',D);}};return A;};FCKXHtml.TagProcessors['option']=function(A,B){if (B.selected&&!A.attributes.getNamedItem('selected')) FCKXHtml._AppendAttribute(A,'selected','selected');A=FCKXHtml._AppendChildNodes(A,B);return A;};FCKXHtml.TagProcessors['textarea']=FCKXHtml.TagProcessors['select']=function(A,B){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);A=FCKXHtml._AppendChildNodes(A,B);return A;}; +var FCKCodeFormatter={};FCKCodeFormatter.Init=function(){var A=this.Regex={};A.BlocksOpener=/\<(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DL|DT|DD|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi;A.BlocksCloser=/\<\/(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DL|DT|DD|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi;A.NewLineTags=/\<(BR|HR)[^\>]*\>/gi;A.MainTags=/\<\/?(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR)[^\>]*\>/gi;A.LineSplitter=/\s*\n+\s*/g;A.IncreaseIndent=/^\<(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL|DL)[ \/\>]/i;A.DecreaseIndent=/^\<\/(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL|DL)[ \>]/i;A.FormatIndentatorRemove=new RegExp('^'+FCKConfig.FormatIndentator);A.ProtectedTags=/(]*>)([\s\S]*?)(<\/PRE>)/gi;};FCKCodeFormatter._ProtectData=function(A,B,C,D){return B+'___FCKpd___'+(FCKCodeFormatter.ProtectedData.push(C)-1)+D;};FCKCodeFormatter.Format=function(A){if (!this.Regex) this.Init();FCKCodeFormatter.ProtectedData=[];var B=A.replace(this.Regex.ProtectedTags,FCKCodeFormatter._ProtectData);B=B.replace(this.Regex.BlocksOpener,'\n$&');B=B.replace(this.Regex.BlocksCloser,'$&\n');B=B.replace(this.Regex.NewLineTags,'$&\n');B=B.replace(this.Regex.MainTags,'\n$&\n');var C='';var D=B.split(this.Regex.LineSplitter);B='';for (var i=0;iB[i]) return 1;};if (A.lengthB.length) return 1;return 0;};FCKUndo._CheckIsBookmarksEqual=function(A,B){if (!(A&&B)) return false;if (FCKBrowserInfo.IsIE){var C=A[1].search(A[0].StartId);var D=B[1].search(B[0].StartId);var E=A[1].search(A[0].EndId);var F=B[1].search(B[0].EndId);return C==D&&E==F;}else{return this._CompareCursors(A.Start,B.Start)==0&&this._CompareCursors(A.End,B.End)==0;}};FCKUndo.SaveUndoStep=function(){if (FCK.EditMode!=0||this.SaveLocked) return;if (this.SavedData.length) this.Changed=true;var A=FCK.EditorDocument.body.innerHTML;var B=this._GetBookmark();this.SavedData=this.SavedData.slice(0,this.CurrentIndex+1);if (this.CurrentIndex>0&&A==this.SavedData[this.CurrentIndex][0]&&this._CheckIsBookmarksEqual(B,this.SavedData[this.CurrentIndex][1])) return;else if (this.CurrentIndex==0&&this.SavedData.length&&A==this.SavedData[0][0]){this.SavedData[0][1]=B;return;};if (this.CurrentIndex+1>=FCKConfig.MaxUndoLevels) this.SavedData.shift();else this.CurrentIndex++;this.SavedData[this.CurrentIndex]=[A,B];FCK.Events.FireEvent("OnSelectionChange");};FCKUndo.CheckUndoState=function(){return (this.Changed||this.CurrentIndex>0);};FCKUndo.CheckRedoState=function(){return (this.CurrentIndex<(this.SavedData.length-1));};FCKUndo.Undo=function(){if (this.CheckUndoState()){if (this.CurrentIndex==(this.SavedData.length-1)){this.SaveUndoStep();};this._ApplyUndoLevel(--this.CurrentIndex);FCK.Events.FireEvent("OnSelectionChange");}};FCKUndo.Redo=function(){if (this.CheckRedoState()){this._ApplyUndoLevel(++this.CurrentIndex);FCK.Events.FireEvent("OnSelectionChange");}};FCKUndo._ApplyUndoLevel=function(A){var B=this.SavedData[A];if (!B) return;if (FCKBrowserInfo.IsIE){if (B[1]&&B[1][1]) FCK.SetInnerHtml(B[1][1]);else FCK.SetInnerHtml(B[0]);}else FCK.EditorDocument.body.innerHTML=B[0];this._SelectBookmark(B[1]);this.TypesCount=0;this.Changed=false;this.Typing=false;}; +var FCKEditingArea=function(A){this.TargetElement=A;this.Mode=0;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKEditingArea_Cleanup);};FCKEditingArea.prototype.Start=function(A,B){var C=this.TargetElement;var D=FCKTools.GetElementDocument(C);while(C.firstChild) C.removeChild(C.firstChild);if (this.Mode==0){if (FCK_IS_CUSTOM_DOMAIN) A=''+A;if (FCKBrowserInfo.IsIE) A=A.replace(/(]*?)\s*\/?>(?!\s*<\/base>)/gi,'$1>');else if (!B){var E=A.match(FCKRegexLib.BeforeBody);var F=A.match(FCKRegexLib.AfterBody);if (E&&F){var G=A.substr(E[1].length,A.length-E[1].length-F[1].length);A=E[1]+' '+F[1];if (FCKBrowserInfo.IsGecko&&(G.length==0||FCKRegexLib.EmptyParagraph.test(G))) G='
      ';this._BodyHTML=G;}else this._BodyHTML=A;};var H=this.IFrame=D.createElement('iframe');var I='';H.frameBorder=0;H.style.width=H.style.height='100%';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=A.replace(//i,''+I);H.src='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.parent._FCKHtmlToLoad );document.close() ;window.parent._FCKHtmlToLoad = null ;})() )';}else if (!FCKBrowserInfo.IsGecko){H.src='javascript:void(0)';};C.appendChild(H);this.Window=H.contentWindow;if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){var J=this.Window.document;J.open();J.write(A.replace(//i,''+I));J.close();};if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.EditingArea_Start(J,A);if (FCKBrowserInfo.IsGecko10&&!B){this.Start(A,true);return;};if (H.readyState&&H.readyState!='completed'){var K=this;setTimeout(function(){try{K.Window.document.documentElement.doScroll("left");}catch(e){setTimeout(arguments.callee,0);return;};K.Window._FCKEditingArea=K;FCKEditingArea_CompleteStart.call(K.Window);},0);}else{this.Window._FCKEditingArea=this;if (FCKBrowserInfo.IsGecko10) this.Window.setTimeout(FCKEditingArea_CompleteStart,500);else FCKEditingArea_CompleteStart.call(this.Window);}}else{var L=this.Textarea=D.createElement('textarea');L.className='SourceField';L.dir='ltr';FCKDomTools.SetElementStyles(L,{width:'100%',height:'100%',border:'none',resize:'none',outline:'none'});C.appendChild(L);L.value=A;FCKTools.RunFunction(this.OnLoad);}};function FCKEditingArea_CompleteStart(){if (!this.document.body){this.setTimeout(FCKEditingArea_CompleteStart,50);return;};var A=this._FCKEditingArea;A.Document=A.Window.document;A.MakeEditable();FCKTools.RunFunction(A.OnLoad);};FCKEditingArea.prototype.MakeEditable=function(){var A=this.Document;if (FCKBrowserInfo.IsIE){A.body.disabled=true;A.body.contentEditable=true;A.body.removeAttribute("disabled");}else{try{A.body.spellcheck=(this.FFSpellChecker!==false);if (this._BodyHTML){A.body.innerHTML=this._BodyHTML;A.body.offsetLeft;this._BodyHTML=null;};A.designMode='on';A.execCommand('enableObjectResizing',false,!FCKConfig.DisableObjectResizing);A.execCommand('enableInlineTableEditing',false,!FCKConfig.DisableFFTableHandles);}catch (e){FCKTools.AddEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);}}};function FCKEditingArea_Document_AttributeNodeModified(A){var B=A.currentTarget.contentWindow._FCKEditingArea;if (B._timer) window.clearTimeout(B._timer);B._timer=FCKTools.SetTimeout(FCKEditingArea_MakeEditableByMutation,1000,B);};function FCKEditingArea_MakeEditableByMutation(){delete this._timer;FCKTools.RemoveEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);this.MakeEditable();};FCKEditingArea.prototype.Focus=function(){try{if (this.Mode==0){if (FCKBrowserInfo.IsIE) this._FocusIE();else this.Window.focus();}else{var A=FCKTools.GetElementDocument(this.Textarea);if ((!A.hasFocus||A.hasFocus())&&A.activeElement==this.Textarea) return;this.Textarea.focus();}}catch(e) {}};FCKEditingArea.prototype._FocusIE=function(){this.Document.body.setActive();this.Window.focus();var A=this.Document.selection.createRange();var B=A.parentElement();var C=B.nodeName.toLowerCase();if (B.childNodes.length>0||!(FCKListsLib.BlockElements[C]||FCKListsLib.NonEmptyBlockElements[C])){return;};A=new FCKDomRange(this.Window);A.MoveToElementEditStart(B);A.Select();};function FCKEditingArea_Cleanup(){if (this.Document) this.Document.body.innerHTML="";this.TargetElement=null;this.IFrame=null;this.Document=null;this.Textarea=null;if (this.Window){this.Window._FCKEditingArea=null;this.Window=null;}}; +var FCKKeystrokeHandler=function(A){this.Keystrokes={};this.CancelCtrlDefaults=(A!==false);};FCKKeystrokeHandler.prototype.AttachToElement=function(A){FCKTools.AddEventListenerEx(A,'keydown',_FCKKeystrokeHandler_OnKeyDown,this);if (FCKBrowserInfo.IsGecko10||FCKBrowserInfo.IsOpera||(FCKBrowserInfo.IsGecko&&FCKBrowserInfo.IsMac)) FCKTools.AddEventListenerEx(A,'keypress',_FCKKeystrokeHandler_OnKeyPress,this);};FCKKeystrokeHandler.prototype.SetKeystrokes=function(){for (var i=0;i40))){B._CancelIt=true;if (A.preventDefault) return A.preventDefault();A.returnValue=false;A.cancelBubble=true;return false;};return true;};function _FCKKeystrokeHandler_OnKeyPress(A,B){if (B._CancelIt){if (A.preventDefault) return A.preventDefault();return false;};return true;}; +FCK.DTD=(function(){var X=FCKTools.Merge;var A,L,J,M,N,O,D,H,P,K,Q,F,G,C,B,E,I;A={isindex:1,fieldset:1};B={input:1,button:1,select:1,textarea:1,label:1};C=X({a:1},B);D=X({iframe:1},C);E={hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1};F={ins:1,del:1,script:1};G=X({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1},F);H=X({sub:1,img:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1},G);I=X({p:1},H);J=X({iframe:1},H,B);K={img:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1};L=X({a:1},J);M={tr:1};N={'#':1};O=X({param:1},K);P=X({form:1},A,D,E,I);Q={li:1};return {col:{},tr:{td:1,th:1},img:{},colgroup:{col:1},noscript:P,td:P,br:{},th:P,center:P,kbd:L,button:X(I,E),basefont:{},h5:L,h4:L,samp:L,h6:L,ol:Q,h1:L,h3:L,option:N,h2:L,form:X(A,D,E,I),select:{optgroup:1,option:1},font:J,ins:P,menu:Q,abbr:L,label:L,table:{thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1},code:L,script:N,tfoot:M,cite:L,li:P,input:{},iframe:P,strong:J,textarea:N,noframes:P,big:J,small:J,span:J,hr:{},dt:L,sub:J,optgroup:{option:1},param:{},bdo:L,'var':J,div:P,object:O,sup:J,dd:P,strike:J,area:{},dir:Q,map:X({area:1,form:1,p:1},A,F,E),applet:O,dl:{dt:1,dd:1},del:P,isindex:{},fieldset:X({legend:1},K),thead:M,ul:Q,acronym:L,b:J,a:J,blockquote:P,caption:L,i:J,u:J,tbody:M,s:L,address:X(D,I),tt:J,legend:L,q:L,pre:X(G,C),p:L,em:J,dfn:L};})(); +var FCKStyle=function(A){this.Element=(A.Element||'span').toLowerCase();this._StyleDesc=A;};FCKStyle.prototype={GetType:function(){var A=this.GetType_$;if (A!=undefined) return A;var B=this.Element;if (B=='#'||FCKListsLib.StyleBlockElements[B]) A=0;else if (FCKListsLib.StyleObjectElements[B]) A=2;else A=1;return (this.GetType_$=A);},ApplyToSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.ApplyToRange(B,true);},ApplyToRange:function(A,B,C){switch (this.GetType()){case 0:this.ApplyToRange=this._ApplyBlockStyle;break;case 1:this.ApplyToRange=this._ApplyInlineStyle;break;default:return;};this.ApplyToRange(A,B,C);},ApplyToObject:function(A){if (!A) return;this.BuildElement(null,A);},RemoveFromSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.RemoveFromRange(B,true);},RemoveFromRange:function(A,B,C){var D;var E=this._GetAttribsForComparison();var F=this._GetOverridesForComparison();if (A.CheckIsCollapsed()){var D=A.CreateBookmark(true);var H=A.GetBookmarkNode(D,true);var I=new FCKElementPath(H.parentNode);var J=[];var K=!FCKDomTools.GetNextSibling(H);var L=K||!FCKDomTools.GetPreviousSibling(H);var M;var N=-1;for (var i=0;i=0;i--){var E=D[i];for (var F in B){if (FCKDomTools.HasAttribute(E,F)){switch (F){case 'style':this._RemoveStylesFromElement(E);break;case 'class':if (FCKDomTools.GetAttributeValue(E,F)!=this.GetFinalAttributeValue(F)) continue;default:FCKDomTools.RemoveAttribute(E,F);}}};this._RemoveOverrides(E,C[this.Element]);this._RemoveNoAttribElement(E);};for (var G in C){if (G!=this.Element){D=A.getElementsByTagName(G);for (var i=D.length-1;i>=0;i--){var E=D[i];this._RemoveOverrides(E,C[G]);this._RemoveNoAttribElement(E);}}}},_RemoveStylesFromElement:function(A){var B=A.style.cssText;var C=this.GetFinalStyleValue();if (B.length>0&&C.length==0) return;C='(^|;)\\s*('+C.replace(/\s*([^ ]+):.*?(;|$)/g,'$1|').replace(/\|$/,'')+'):[^;]+';var D=new RegExp(C,'gi');B=B.replace(D,'').Trim();if (B.length==0||B==';') FCKDomTools.RemoveAttribute(A,'style');else A.style.cssText=B.replace(D,'');},_RemoveOverrides:function(A,B){var C=B&&B.Attributes;if (C){for (var i=0;i0) C.style.cssText=this.GetFinalStyleValue();return C;},_CompareAttributeValues:function(A,B,C){if (A=='style'&&B&&C){B=B.replace(/;$/,'').toLowerCase();C=C.replace(/;$/,'').toLowerCase();};return (B==C||((B===null||B==='')&&(C===null||C==='')))},GetFinalAttributeValue:function(A){var B=this._StyleDesc.Attributes;var B=B?B[A]:null;if (!B&&A=='style') return this.GetFinalStyleValue();if (B&&this._Variables) B=B.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);return B;},GetFinalStyleValue:function(){var A=this._GetStyleText();if (A.length>0&&this._Variables){A=A.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);A=FCKTools.NormalizeCssText(A);};return A;},_GetVariableReplace:function(){return this._Variables[arguments[2]]||arguments[0];},SetVariable:function(A,B){var C=this._Variables;if (!C) C=this._Variables={};this._Variables[A]=B;},_FromPre:function(A,B,C){var D=B.innerHTML;D=D.replace(/(\r\n|\r)/g,'\n');D=D.replace(/^[ \t]*\n/,'');D=D.replace(/\n$/,'');D=D.replace(/^[ \t]+|[ \t]+$/g,function(match,offset,s){if (match.length==1) return ' ';else if (offset==0) return new Array(match.length).join(' ')+' ';else return ' '+new Array(match.length).join(' ');});var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag){value=value.replace(/\n/g,'
      ');value=value.replace(/[ \t]{2,}/g,function (match){return new Array(match.length).join(' ')+' ';});};F.push(value);});C.innerHTML=F.join('');return C;},_ToPre:function(A,B,C){var D=B.innerHTML.Trim();D=D.replace(/[ \t\r\n]*(]*>)[ \t\r\n]*/gi,'
      ');var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag) value=value.replace(/([ \t\n\r]+| )/g,' ');else if (isTag&&value=='
      ') value='\n';F.push(value);});if (FCKBrowserInfo.IsIE){var G=A.createElement('div');G.appendChild(C);C.outerHTML='
      \n'+F.join('')+'
      ';C=G.removeChild(G.firstChild);}else C.innerHTML=F.join('');return C;},_CheckAndMergePre:function(A,B){if (A!=FCKDomTools.GetPreviousSourceElement(B,true)) return;var C=A.innerHTML.replace(/\n$/,'')+'\n\n'+B.innerHTML.replace(/^\n/,'');if (FCKBrowserInfo.IsIE) B.outerHTML='
      '+C+'
      ';else B.innerHTML=C;FCKDomTools.RemoveNode(A);},_CheckAndSplitPre:function(A){var B;var C=A.firstChild;C=C&&C.nextSibling;while (C){var D=C.nextSibling;if (D&&D.nextSibling&&C.nodeName.IEquals('br')&&D.nodeName.IEquals('br')){FCKDomTools.RemoveNode(C);C=D.nextSibling;FCKDomTools.RemoveNode(D);B=FCKDomTools.InsertAfterNode(B||A,FCKDomTools.CloneElement(A));continue;};if (B){C=C.previousSibling;FCKDomTools.MoveNode(C.nextSibling,B);};C=C.nextSibling;}},_ApplyBlockStyle:function(A,B,C){var D;if (B) D=A.CreateBookmark();var E=new FCKDomRangeIterator(A);E.EnforceRealBlocks=true;var F;var G=A.Window.document;var H;while((F=E.GetNextParagraph())){var I=this.BuildElement(G);var J=I.nodeName.IEquals('pre');var K=F.nodeName.IEquals('pre');var L=J&&!K;var M=!J&&K;if (L) I=this._ToPre(G,F,I);else if (M) I=this._FromPre(G,F,I);else FCKDomTools.MoveChildren(F,I);F.parentNode.insertBefore(I,F);FCKDomTools.RemoveNode(F);if (J){if (H) this._CheckAndMergePre(H,I);H=I;}else if (M) this._CheckAndSplitPre(I);};if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);},_ApplyInlineStyle:function(A,B,C){var D=A.Window.document;if (A.CheckIsCollapsed()){var E=this.BuildElement(D);A.InsertNode(E);A.MoveToPosition(E,2);A.Select();return;};var F=this.Element;var G=FCK.DTD[F]||FCK.DTD.span;var H=this._GetAttribsForComparison();var I;A.Expand('inline_elements');var J=A.CreateBookmark(true);var K=A.GetBookmarkNode(J,true);var L=A.GetBookmarkNode(J,false);A.Release(true);var M=FCKDomTools.GetNextSourceNode(K,true);while (M){var N=false;var O=M.nodeType;var P=O==1?M.nodeName.toLowerCase():null;if (!P||G[P]){if ((FCK.DTD[M.parentNode.nodeName.toLowerCase()]||FCK.DTD.span)[F]||!FCK.DTD[F]){if (!A.CheckHasRange()) A.SetStart(M,3);if (O!=1||M.childNodes.length==0){var Q=M;var R=Q.parentNode;while (Q==R.lastChild&&G[R.nodeName.toLowerCase()]){Q=R;};A.SetEnd(Q,4);if (Q==Q.parentNode.lastChild&&!G[Q.parentNode.nodeName.toLowerCase()]) N=true;}else{A.SetEnd(M,3);}}else N=true;}else N=true;M=FCKDomTools.GetNextSourceNode(M);if (M==L){M=null;N=true;};if (N&&A.CheckHasRange()&&!A.CheckIsCollapsed()){I=this.BuildElement(D);A.ExtractContents().AppendTo(I);if (I.innerHTML.RTrim().length>0){A.InsertNode(I);this.RemoveFromElement(I);this._MergeSiblings(I,this._GetAttribsForComparison());if (!FCKBrowserInfo.IsIE) I.normalize();};A.Release(true);}};this._FixBookmarkStart(K);if (B) A.SelectBookmark(J);if (C) A.MoveToBookmark(J);},_FixBookmarkStart:function(A){var B;while ((B=A.nextSibling)){if (B.nodeType==1&&FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){if (!B.firstChild) FCKDomTools.RemoveNode(B);else FCKDomTools.MoveNode(A,B,true);continue;};if (B.nodeType==3&&B.length==0){FCKDomTools.RemoveNode(B);continue;};break;}},_MergeSiblings:function(A,B){if (!A||A.nodeType!=1||!FCKListsLib.InlineNonEmptyElements[A.nodeName.toLowerCase()]) return;this._MergeNextSibling(A,B);this._MergePreviousSibling(A,B);},_MergeNextSibling:function(A,B){var C=A.nextSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.nextSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.lastChild;if (D) FCKDomTools.MoveNode(A.nextSibling,A);FCKDomTools.MoveChildren(C,A);FCKDomTools.RemoveNode(C);if (E) this._MergeNextSibling(E);}}},_MergePreviousSibling:function(A,B){var C=A.previousSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.previousSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.firstChild;if (D) FCKDomTools.MoveNode(A.previousSibling,A,true);FCKDomTools.MoveChildren(C,A,true);FCKDomTools.RemoveNode(C);if (E) this._MergePreviousSibling(E);}}},_GetStyleText:function(){var A=this._StyleDesc.Styles;var B=(this._StyleDesc.Attributes?this._StyleDesc.Attributes['style']||'':'');if (B.length>0) B+=';';for (var C in A) B+=C+':'+A[C]+';';if (B.length>0&&!(/#\(/.test(B))){B=FCKTools.NormalizeCssText(B);};return (this._GetStyleText=function() { return B;})();},_GetAttribsForComparison:function(){var A=this._GetAttribsForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Attributes;if (B){for (var C in B){A[C.toLowerCase()]=B[C].toLowerCase();}};if (this._GetStyleText().length>0){A['style']=this._GetStyleText().toLowerCase();};FCKTools.AppendLengthProperty(A,'_length');return (this._GetAttribsForComparison_$=A);},_GetOverridesForComparison:function(){var A=this._GetOverridesForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Overrides;if (B){if (!FCKTools.IsArray(B)) B=[B];for (var i=0;i0) return true;};B=B.nextSibling;};return false;}}; +var FCKElementPath=function(A){var B=null;var C=null;var D=[];var e=A;while (e){if (e.nodeType==1){if (!this.LastElement) this.LastElement=e;var E=e.nodeName.toLowerCase();if (FCKBrowserInfo.IsIE&&e.scopeName!='HTML') E=e.scopeName.toLowerCase()+':'+E;if (!C){if (!B&&FCKListsLib.PathBlockElements[E]!=null) B=e;if (FCKListsLib.PathBlockLimitElements[E]!=null){if (!B&&E=='div'&&!FCKElementPath._CheckHasBlock(e)) B=e;else C=e;}};D.push(e);if (E=='body') break;};e=e.parentNode;};this.Block=B;this.BlockLimit=C;this.Elements=D;};FCKElementPath._CheckHasBlock=function(A){var B=A.childNodes;for (var i=0,count=B.length;i0){if (D.nodeType==3){var G=D.nodeValue.substr(0,E).Trim();if (G.length!=0) return A.IsStartOfBlock=false;}else F=D.childNodes[E-1];};if (!F) F=FCKDomTools.GetPreviousSourceNode(D,true,null,C);while (F){switch (F.nodeType){case 1:if (!FCKListsLib.InlineChildReqElements[F.nodeName.toLowerCase()]) return A.IsStartOfBlock=false;break;case 3:if (F.nodeValue.Trim().length>0) return A.IsStartOfBlock=false;};F=FCKDomTools.GetPreviousSourceNode(F,false,null,C);};return A.IsStartOfBlock=true;},CheckEndOfBlock:function(A){var B=this._Cache.IsEndOfBlock;if (B!=undefined) return B;var C=this.EndBlock||this.EndBlockLimit;var D=this._Range.endContainer;var E=this._Range.endOffset;var F;if (D.nodeType==3){var G=D.nodeValue;if (E0) return this._Cache.IsEndOfBlock=false;};F=FCKDomTools.GetNextSourceNode(F,false,null,C);};if (A) this.Select();return this._Cache.IsEndOfBlock=true;},CreateBookmark:function(A){var B={StartId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'S',EndId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'E'};var C=this.Window.document;var D;var E;var F;if (!this.CheckIsCollapsed()){E=C.createElement('span');E.style.display='none';E.id=B.EndId;E.setAttribute('_fck_bookmark',true);E.innerHTML=' ';F=this.Clone();F.Collapse(false);F.InsertNode(E);};D=C.createElement('span');D.style.display='none';D.id=B.StartId;D.setAttribute('_fck_bookmark',true);D.innerHTML=' ';F=this.Clone();F.Collapse(true);F.InsertNode(D);if (A){B.StartNode=D;B.EndNode=E;};if (E){this.SetStart(D,4);this.SetEnd(E,3);}else this.MoveToPosition(D,4);return B;},GetBookmarkNode:function(A,B){var C=this.Window.document;if (B) return A.StartNode||C.getElementById(A.StartId);else return A.EndNode||C.getElementById(A.EndId);},MoveToBookmark:function(A,B){var C=this.GetBookmarkNode(A,true);var D=this.GetBookmarkNode(A,false);this.SetStart(C,3);if (!B) FCKDomTools.RemoveNode(C);if (D){this.SetEnd(D,3);if (!B) FCKDomTools.RemoveNode(D);}else this.Collapse(true);this._UpdateElementInfo();},CreateBookmark2:function(){if (!this._Range) return { "Start":0,"End":0 };var A={"Start":[this._Range.startOffset],"End":[this._Range.endOffset]};var B=this._Range.startContainer.previousSibling;var C=this._Range.endContainer.previousSibling;var D=this._Range.startContainer;var E=this._Range.endContainer;while (B&&B.nodeType==3&&D.nodeType==3){A.Start[0]+=B.length;D=B;B=B.previousSibling;}while (C&&C.nodeType==3&&E.nodeType==3){A.End[0]+=C.length;E=C;C=C.previousSibling;};if (D.nodeType==1&&D.childNodes[A.Start[0]]&&D.childNodes[A.Start[0]].nodeType==3){var F=D.childNodes[A.Start[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};D=F;A.Start[0]=G;};if (E.nodeType==1&&E.childNodes[A.End[0]]&&E.childNodes[A.End[0]].nodeType==3){var F=E.childNodes[A.End[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};E=F;A.End[0]=G;};A.Start=FCKDomTools.GetNodeAddress(D,true).concat(A.Start);A.End=FCKDomTools.GetNodeAddress(E,true).concat(A.End);return A;},MoveToBookmark2:function(A){var B=FCKDomTools.GetNodeFromAddress(this.Window.document,A.Start.slice(0,-1),true);var C=FCKDomTools.GetNodeFromAddress(this.Window.document,A.End.slice(0,-1),true);this.Release(true);this._Range=new FCKW3CRange(this.Window.document);var D=A.Start[A.Start.length-1];var E=A.End[A.End.length-1];while (B.nodeType==3&&D>B.length){if (!B.nextSibling||B.nextSibling.nodeType!=3) break;D-=B.length;B=B.nextSibling;}while (C.nodeType==3&&E>C.length){if (!C.nextSibling||C.nextSibling.nodeType!=3) break;E-=C.length;C=C.nextSibling;};this._Range.setStart(B,D);this._Range.setEnd(C,E);this._UpdateElementInfo();},MoveToPosition:function(A,B){this.SetStart(A,B);this.Collapse(true);},SetStart:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setStart(A,0);break;case 2:D.setStart(A,A.childNodes.length);break;case 3:D.setStartBefore(A);break;case 4:D.setStartAfter(A);};if (!C) this._UpdateElementInfo();},SetEnd:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setEnd(A,0);break;case 2:D.setEnd(A,A.childNodes.length);break;case 3:D.setEndBefore(A);break;case 4:D.setEndAfter(A);};if (!C) this._UpdateElementInfo();},Expand:function(A){var B,oSibling;switch (A){case 'inline_elements':if (this._Range.startOffset==0){B=this._Range.startContainer;if (B.nodeType!=1) B=B.previousSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setStartBefore(B);if (B!=B.parentNode.firstChild) break;B=B.parentNode;}}};B=this._Range.endContainer;var C=this._Range.endOffset;if ((B.nodeType==3&&C>=B.nodeValue.length)||(B.nodeType==1&&C>=B.childNodes.length)||(B.nodeType!=1&&B.nodeType!=3)){if (B.nodeType!=1) B=B.nextSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setEndAfter(B);if (B!=B.parentNode.lastChild) break;B=B.parentNode;}}};break;case 'block_contents':case 'list_contents':var D=FCKListsLib.BlockBoundaries;if (A=='list_contents'||FCKConfig.EnterMode=='br') D=FCKListsLib.ListBoundaries;if (this.StartBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents') this.SetStart(this.StartBlock,1);else{B=this._Range.startContainer;if (B.nodeType==1){var E=B.childNodes[this._Range.startOffset];if (E) B=FCKDomTools.GetPreviousSourceNode(E,true);else B=B.lastChild||B;}while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setStartBefore(B);B=B.previousSibling||B.parentNode;}};if (this.EndBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents'&&this.EndBlock.nodeName.toLowerCase()!='li') this.SetEnd(this.EndBlock,2);else{B=this._Range.endContainer;if (B.nodeType==1) B=B.childNodes[this._Range.endOffset]||B.lastChild;while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setEndAfter(B);B=B.nextSibling||B.parentNode;};if (B&&B.nodeName.toLowerCase()=='br') this._Range.setEndAfter(B);};this._UpdateElementInfo();}},SplitBlock:function(A){var B=A||FCKConfig.EnterMode;if (!this._Range) this.MoveToSelection();if (this.StartBlockLimit==this.EndBlockLimit){var C=this.StartBlock;var D=this.EndBlock;var E=null;if (B!='br'){if (!C){C=this.FixBlock(true,B);D=this.EndBlock;};if (!D) D=this.FixBlock(false,B);};var F=(C!=null&&this.CheckStartOfBlock());var G=(D!=null&&this.CheckEndOfBlock());if (!this.CheckIsEmpty()) this.DeleteContents();if (C&&D&&C==D){if (G){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(D,4);D=null;}else if (F){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(C,3);C=null;}else{this.SetEnd(C,2);var H=this.ExtractContents();D=C.cloneNode(false);D.removeAttribute('id',false);H.AppendTo(D);FCKDomTools.InsertAfterNode(C,D);this.MoveToPosition(C,4);if (FCKBrowserInfo.IsGecko&&!C.nodeName.IEquals(['ul','ol'])) FCKTools.AppendBogusBr(C);}};return {PreviousBlock:C,NextBlock:D,WasStartOfBlock:F,WasEndOfBlock:G,ElementPath:E};};return null;},FixBlock:function(A,B){var C=this.CreateBookmark();this.Collapse(A);this.Expand('block_contents');var D=this.Window.document.createElement(B);this.ExtractContents().AppendTo(D);FCKDomTools.TrimNode(D);if (FCKDomTools.CheckIsEmptyElement(D,function(element) { return element.getAttribute('_fck_bookmark')!='true';})&&FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);this.InsertNode(D);this.MoveToBookmark(C);return D;},Release:function(A){if (!A) this.Window=null;this.StartNode=null;this.StartContainer=null;this.StartBlock=null;this.StartBlockLimit=null;this.EndNode=null;this.EndContainer=null;this.EndBlock=null;this.EndBlockLimit=null;this._Range=null;this._Cache=null;},CheckHasRange:function(){return!!this._Range;},GetTouchedStartNode:function(){var A=this._Range;var B=A.startContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.startOffset]||B;},GetTouchedEndNode:function(){var A=this._Range;var B=A.endContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.endOffset-1]||B;}}; +FCKDomRange.prototype.MoveToSelection=function(){this.Release(true);this._Range=new FCKW3CRange(this.Window.document);var A=this.Window.document.selection;if (A.type!='Control'){var B=this._GetSelectionMarkerTag(true);var C=this._GetSelectionMarkerTag(false);if (!B&&!C){this._Range.setStart(this.Window.document.body,0);this._UpdateElementInfo();return;};this._Range.setStart(B.parentNode,FCKDomTools.GetIndexOf(B));B.parentNode.removeChild(B);this._Range.setEnd(C.parentNode,FCKDomTools.GetIndexOf(C));C.parentNode.removeChild(C);this._UpdateElementInfo();}else{var D=A.createRange().item(0);if (D){this._Range.setStartBefore(D);this._Range.setEndAfter(D);this._UpdateElementInfo();}}};FCKDomRange.prototype.Select=function(A){if (this._Range) this.SelectBookmark(this.CreateBookmark(true),A);};FCKDomRange.prototype.SelectBookmark=function(A,B){var C=this.CheckIsCollapsed();var D;var E;var F=this.GetBookmarkNode(A,true);if (!F) return;var G;if (!C) G=this.GetBookmarkNode(A,false);var H=this.Window.document.body.createTextRange();H.moveToElementText(F);H.moveStart('character',1);if (G){var I=this.Window.document.body.createTextRange();I.moveToElementText(G);H.setEndPoint('EndToEnd',I);H.moveEnd('character',-1);}else{D=(B||!F.previousSibling||F.previousSibling.nodeName.toLowerCase()=='br')&&!F.nextSibing;E=this.Window.document.createElement('span');E.innerHTML='';F.parentNode.insertBefore(E,F);if (D){F.parentNode.insertBefore(this.Window.document.createTextNode('\ufeff'),F);}};if (!this._Range) this._Range=this.CreateRange();this._Range.setStartBefore(F);F.parentNode.removeChild(F);if (C){if (D){H.moveStart('character',-1);H.select();this.Window.document.selection.clear();}else H.select();FCKDomTools.RemoveNode(E);}else{this._Range.setEndBefore(G);G.parentNode.removeChild(G);H.select();}};FCKDomRange.prototype._GetSelectionMarkerTag=function(A){var B=this.Window.document;var C=B.selection;var D;try{D=C.createRange();}catch (e){return null;};if (D.parentElement().document!=B) return null;D.collapse(A===true);var E='fck_dom_range_temp_'+(new Date()).valueOf()+'_'+Math.floor(Math.random()*1000);D.pasteHTML('');return B.getElementById(E);}; +var FCKDomRangeIterator=function(A){this.Range=A;this.ForceBrBreak=false;this.EnforceRealBlocks=false;};FCKDomRangeIterator.CreateFromSelection=function(A){var B=new FCKDomRange(A);B.MoveToSelection();return new FCKDomRangeIterator(B);};FCKDomRangeIterator.prototype={GetNextParagraph:function(){var A;var B;var C;var D;var E;var F=this.ForceBrBreak?FCKListsLib.ListBoundaries:FCKListsLib.BlockBoundaries;if (!this._LastNode){var B=this.Range.Clone();B.Expand(this.ForceBrBreak?'list_contents':'block_contents');this._NextNode=B.GetTouchedStartNode();this._LastNode=B.GetTouchedEndNode();B=null;};var H=this._NextNode;var I=this._LastNode;this._NextNode=null;while (H){var J=false;var K=(H.nodeType!=1);var L=false;if (!K){var M=H.nodeName.toLowerCase();if (F[M]&&(!FCKBrowserInfo.IsIE||H.scopeName=='HTML')){if (M=='br') K=true;else if (!B&&H.childNodes.length==0&&M!='hr'){A=H;C=H==I;break;};if (B){B.SetEnd(H,3,true);if (M!='br') this._NextNode=FCKDomTools.GetNextSourceNode(H,true,null,I)||H;};J=true;}else{if (H.firstChild){if (!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};H=H.firstChild;continue;};K=true;}}else if (H.nodeType==3){if (/^[\r\n\t ]+$/.test(H.nodeValue)) K=false;};if (K&&!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};C=((!J||K)&&H==I);if (B&&!J){while (!H.nextSibling&&!C){var N=H.parentNode;if (F[N.nodeName.toLowerCase()]){J=true;C=C||(N==I);break;};H=N;K=true;C=(H==I);L=true;}};if (K) B.SetEnd(H,4,true);if ((J||C)&&B){B._UpdateElementInfo();if (B.StartNode==B.EndNode&&B.StartNode.parentNode==B.StartBlockLimit&&B.StartNode.getAttribute&&B.StartNode.getAttribute('_fck_bookmark')) B=null;else break;};if (C) break;H=FCKDomTools.GetNextSourceNode(H,L,null,I);};if (!A){if (!B){this._NextNode=null;return null;};A=B.StartBlock;if (!A&&!this.EnforceRealBlocks&&B.StartBlockLimit.nodeName.IEquals('DIV','TH','TD')&&B.CheckStartOfBlock()&&B.CheckEndOfBlock()){A=B.StartBlockLimit;}else if (!A||(this.EnforceRealBlocks&&A.nodeName.toLowerCase()=='li')){A=this.Range.Window.document.createElement(FCKConfig.EnterMode=='p'?'p':'div');B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);B.InsertNode(A);D=true;E=true;}else if (A.nodeName.toLowerCase()!='li'){if (!B.CheckStartOfBlock()||!B.CheckEndOfBlock()){A=A.cloneNode(false);B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);var O=B.SplitBlock();D=!O.WasStartOfBlock;E=!O.WasEndOfBlock;B.InsertNode(A);}}else if (!C){this._NextNode=A==I?null:FCKDomTools.GetNextSourceNode(B.EndNode,true,null,I);return A;}};if (D){var P=A.previousSibling;if (P&&P.nodeType==1){if (P.nodeName.toLowerCase()=='br') P.parentNode.removeChild(P);else if (P.lastChild&&P.lastChild.nodeName.IEquals('br')) P.removeChild(P.lastChild);}};if (E){var Q=A.lastChild;if (Q&&Q.nodeType==1&&Q.nodeName.toLowerCase()=='br') A.removeChild(Q);};if (!this._NextNode) this._NextNode=(C||A==I)?null:FCKDomTools.GetNextSourceNode(A,true,null,I);return A;}}; +var FCKDocumentFragment=function(A){this._Document=A;this.RootNode=A.createElement('div');};FCKDocumentFragment.prototype={AppendTo:function(A){FCKDomTools.MoveChildren(this.RootNode,A);},AppendHtml:function(A){var B=this._Document.createElement('div');B.innerHTML=A;FCKDomTools.MoveChildren(B,this.RootNode);},InsertAfterNode:function(A){var B=this.RootNode;var C;while((C=B.lastChild)) FCKDomTools.InsertAfterNode(A,B.removeChild(C));}}; +var FCKW3CRange=function(A){this._Document=A;this.startContainer=null;this.startOffset=null;this.endContainer=null;this.endOffset=null;this.collapsed=true;};FCKW3CRange.CreateRange=function(A){return new FCKW3CRange(A);};FCKW3CRange.CreateFromRange=function(A,B){var C=FCKW3CRange.CreateRange(A);C.setStart(B.startContainer,B.startOffset);C.setEnd(B.endContainer,B.endOffset);return C;};FCKW3CRange.prototype={_UpdateCollapsed:function(){this.collapsed=(this.startContainer==this.endContainer&&this.startOffset==this.endOffset);},setStart:function(A,B){this.startContainer=A;this.startOffset=B;if (!this.endContainer){this.endContainer=A;this.endOffset=B;};this._UpdateCollapsed();},setEnd:function(A,B){this.endContainer=A;this.endOffset=B;if (!this.startContainer){this.startContainer=A;this.startOffset=B;};this._UpdateCollapsed();},setStartAfter:function(A){this.setStart(A.parentNode,FCKDomTools.GetIndexOf(A)+1);},setStartBefore:function(A){this.setStart(A.parentNode,FCKDomTools.GetIndexOf(A));},setEndAfter:function(A){this.setEnd(A.parentNode,FCKDomTools.GetIndexOf(A)+1);},setEndBefore:function(A){this.setEnd(A.parentNode,FCKDomTools.GetIndexOf(A));},collapse:function(A){if (A){this.endContainer=this.startContainer;this.endOffset=this.startOffset;}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset;};this.collapsed=true;},selectNodeContents:function(A){this.setStart(A,0);this.setEnd(A,A.nodeType==3?A.data.length:A.childNodes.length);},insertNode:function(A){var B=this.startContainer;var C=this.startOffset;if (B.nodeType==3){B.splitText(C);if (B==this.endContainer) this.setEnd(B.nextSibling,this.endOffset-this.startOffset);FCKDomTools.InsertAfterNode(B,A);return;}else{B.insertBefore(A,B.childNodes[C]||null);if (B==this.endContainer){this.endOffset++;this.collapsed=false;}}},deleteContents:function(){if (this.collapsed) return;this._ExecContentsAction(0);},extractContents:function(){var A=new FCKDocumentFragment(this._Document);if (!this.collapsed) this._ExecContentsAction(1,A);return A;},cloneContents:function(){var A=new FCKDocumentFragment(this._Document);if (!this.collapsed) this._ExecContentsAction(2,A);return A;},_ExecContentsAction:function(A,B){var C=this.startContainer;var D=this.endContainer;var E=this.startOffset;var F=this.endOffset;var G=false;var H=false;if (D.nodeType==3) D=D.splitText(F);else{if (D.childNodes.length>0){if (F>D.childNodes.length-1){D=FCKDomTools.InsertAfterNode(D.lastChild,this._Document.createTextNode(''));H=true;}else D=D.childNodes[F];}};if (C.nodeType==3){C.splitText(E);if (C==D) D=C.nextSibling;}else{if (E==0){C=C.insertBefore(this._Document.createTextNode(''),C.firstChild);G=true;}else if (E>C.childNodes.length-1){C=C.appendChild(this._Document.createTextNode(''));G=true;}else C=C.childNodes[E].previousSibling;};var I=FCKDomTools.GetParents(C);var J=FCKDomTools.GetParents(D);var i,topStart,topEnd;for (i=0;i0&&levelStartNode!=D) levelClone=K.appendChild(levelStartNode.cloneNode(levelStartNode==D));if (!I[k]||levelStartNode.parentNode!=I[k].parentNode){currentNode=levelStartNode.previousSibling;while(currentNode){if (currentNode==I[k]||currentNode==C) break;currentSibling=currentNode.previousSibling;if (A==2) K.insertBefore(currentNode.cloneNode(true),K.firstChild);else{currentNode.parentNode.removeChild(currentNode);if (A==1) K.insertBefore(currentNode,K.firstChild);};currentNode=currentSibling;}};if (K) K=levelClone;};if (A==2){var L=this.startContainer;if (L.nodeType==3){L.data+=L.nextSibling.data;L.parentNode.removeChild(L.nextSibling);};var M=this.endContainer;if (M.nodeType==3&&M.nextSibling){M.data+=M.nextSibling.data;M.parentNode.removeChild(M.nextSibling);}}else{if (topStart&&topEnd&&(C.parentNode!=topStart.parentNode||D.parentNode!=topEnd.parentNode)){var N=FCKDomTools.GetIndexOf(topEnd);if (G&&topEnd.parentNode==C.parentNode) N--;this.setStart(topEnd.parentNode,N);};this.collapse(true);};if(G) C.parentNode.removeChild(C);if(H&&D.parentNode) D.parentNode.removeChild(D);},cloneRange:function(){return FCKW3CRange.CreateFromRange(this._Document,this);}}; +var FCKEnterKey=function(A,B,C,D){this.Window=A;this.EnterMode=B||'p';this.ShiftEnterMode=C||'br';var E=new FCKKeystrokeHandler(false);E._EnterKey=this;E.OnKeystroke=FCKEnterKey_OnKeystroke;E.SetKeystrokes([[13,'Enter'],[SHIFT+13,'ShiftEnter'],[8,'Backspace'],[CTRL+8,'CtrlBackspace'],[46,'Delete']]);this.TabText='';if (D>0||FCKBrowserInfo.IsSafari){while (D--) this.TabText+='\xa0';E.SetKeystrokes([9,'Tab']);};E.AttachToElement(A.document);};function FCKEnterKey_OnKeystroke(A,B){var C=this._EnterKey;try{switch (B){case 'Enter':return C.DoEnter();break;case 'ShiftEnter':return C.DoShiftEnter();break;case 'Backspace':return C.DoBackspace();break;case 'Delete':return C.DoDelete();break;case 'Tab':return C.DoTab();break;case 'CtrlBackspace':return C.DoCtrlBackspace();break;}}catch (e){};return false;};FCKEnterKey.prototype.DoEnter=function(A,B){FCKUndo.SaveUndoStep();this._HasShift=(B===true);var C=FCKSelection.GetParentElement();var D=new FCKElementPath(C);var E=A||this.EnterMode;if (E=='br'||D.Block&&D.Block.tagName.toLowerCase()=='pre') return this._ExecuteEnterBr();else return this._ExecuteEnterBlock(E);};FCKEnterKey.prototype.DoShiftEnter=function(){return this.DoEnter(this.ShiftEnterMode,true);};FCKEnterKey.prototype.DoBackspace=function(){var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};var C=B.CheckIsCollapsed();if (!C){if (FCKBrowserInfo.IsIE&&this.Window.document.selection.type.toLowerCase()=="control"){var D=this.Window.document.selection.createRange();for (var i=D.length-1;i>=0;i--){var E=D.item(i);E.parentNode.removeChild(E);};return true;};return false;};if (FCKBrowserInfo.IsIE){var F=FCKDomTools.GetPreviousSourceElement(B.StartNode,true);if (F&&F.nodeName.toLowerCase()=='br'){var G=B.Clone();G.SetStart(F,4);if (G.CheckIsEmpty()){F.parentNode.removeChild(F);return true;}}};var H=B.StartBlock;var I=B.EndBlock;if (B.StartBlockLimit==B.EndBlockLimit&&H&&I){if (!C){var J=B.CheckEndOfBlock();B.DeleteContents();if (H!=I){B.SetStart(I,1);B.SetEnd(I,1);};B.Select();A=(H==I);};if (B.CheckStartOfBlock()){var K=B.StartBlock;var L=FCKDomTools.GetPreviousSourceElement(K,true,['BODY',B.StartBlockLimit.nodeName],['UL','OL']);A=this._ExecuteBackspace(B,L,K);}else if (FCKBrowserInfo.IsGeckoLike){B.Select();}};B.Release();return A;};FCKEnterKey.prototype.DoCtrlBackspace=function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(this.Window);A.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(A,this.Window.document.body)){this._FixIESelectAllBug(A);return true;};return false;};FCKEnterKey.prototype._ExecuteBackspace=function(A,B,C){var D=false;if (!B&&C&&C.nodeName.IEquals('LI')&&C.parentNode.parentNode.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};if (B&&B.nodeName.IEquals('LI')){var E=FCKDomTools.GetLastChild(B,['UL','OL']);while (E){B=FCKDomTools.GetLastChild(E,'LI');E=FCKDomTools.GetLastChild(B,['UL','OL']);}};if (B&&C){if (C.nodeName.IEquals('LI')&&!B.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};var F=C.parentNode;var G=B.nodeName.toLowerCase();if (FCKListsLib.EmptyElements[G]!=null||G=='table'){FCKDomTools.RemoveNode(B);D=true;}else{FCKDomTools.RemoveNode(C);while (F.innerHTML.Trim().length==0){var H=F.parentNode;H.removeChild(F);F=H;};FCKDomTools.LTrimNode(C);FCKDomTools.RTrimNode(B);A.SetStart(B,2,true);A.Collapse(true);var I=A.CreateBookmark(true);if (!C.tagName.IEquals(['TABLE'])) FCKDomTools.MoveChildren(C,B);A.SelectBookmark(I);D=true;}};return D;};FCKEnterKey.prototype.DoDelete=function(){FCKUndo.SaveUndoStep();var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};if (B.CheckIsCollapsed()&&B.CheckEndOfBlock(FCKBrowserInfo.IsGeckoLike)){var C=B.StartBlock;var D=FCKTools.GetElementAscensor(C,'td');var E=FCKDomTools.GetNextSourceElement(C,true,[B.StartBlockLimit.nodeName],['UL','OL','TR'],true);if (D){var F=FCKTools.GetElementAscensor(E,'td');if (F!=D) return true;};A=this._ExecuteBackspace(B,C,E);};B.Release();return A;};FCKEnterKey.prototype.DoTab=function(){var A=new FCKDomRange(this.Window);A.MoveToSelection();var B=A._Range.startContainer;while (B){if (B.nodeType==1){var C=B.tagName.toLowerCase();if (C=="tr"||C=="td"||C=="th"||C=="tbody"||C=="table") return false;else break;};B=B.parentNode;};if (this.TabText){A.DeleteContents();A.InsertNode(this.Window.document.createTextNode(this.TabText));A.Collapse(false);A.Select();};return true;};FCKEnterKey.prototype._ExecuteEnterBlock=function(A,B){var C=B||new FCKDomRange(this.Window);var D=C.SplitBlock(A);if (D){var E=D.PreviousBlock;var F=D.NextBlock;var G=D.WasStartOfBlock;var H=D.WasEndOfBlock;if (F){if (F.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(F,F.parentNode);FCKDomTools.MoveNode(F,F.nextSibling,true);}}else if (E&&E.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(E,E.parentNode);C.MoveToElementEditStart(E.nextSibling);FCKDomTools.MoveNode(E,E.previousSibling);};if (!G&&!H){if (F.nodeName.IEquals('li')&&F.firstChild&&F.firstChild.nodeName.IEquals(['ul','ol'])) F.insertBefore(FCKTools.GetElementDocument(F).createTextNode('\xa0'),F.firstChild);if (F) C.MoveToElementEditStart(F);}else{if (G&&H&&E.tagName.toUpperCase()=='LI'){C.MoveToElementStart(E);this._OutdentWithSelection(E,C);C.Release();return true;};var I;if (E){var J=E.tagName.toUpperCase();if (!this._HasShift&&!(/^H[1-6]$/).test(J)){I=FCKDomTools.CloneElement(E);}}else if (F) I=FCKDomTools.CloneElement(F);if (!I) I=this.Window.document.createElement(A);var K=D.ElementPath;if (K){for (var i=0,len=K.Elements.length;i=0&&(C=B[i--])){if (C.name.length>0){if (C.innerHTML!==''){if (FCKBrowserInfo.IsIE) C.className+=' FCK__AnchorC';}else{var D=FCKDocumentProcessor_CreateFakeImage('FCK__Anchor',C.cloneNode(true));D.setAttribute('_fckanchor','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}}}};var FCKPageBreaksProcessor=FCKDocumentProcessor.AppendNew();FCKPageBreaksProcessor.ProcessDocument=function(A){var B=A.getElementsByTagName('DIV');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.style.pageBreakAfter=='always'&&C.childNodes.length==1&&C.childNodes[0].style&&C.childNodes[0].style.display=='none'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',C.cloneNode(true));C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};var FCKEmbedAndObjectProcessor=(function(){var A=[];var B=function(el){var C=el.cloneNode(true);var D;var E=D=FCKDocumentProcessor_CreateFakeImage('FCK__UnknownObject',C);FCKEmbedAndObjectProcessor.RefreshView(E,el);for (var i=0;i=0;i--) B(G[i]);};var H=function(doc){F('object',doc);F('embed',doc);};return FCKTools.Merge(FCKDocumentProcessor.AppendNew(),{ProcessDocument:function(doc){if (FCKBrowserInfo.IsGecko) FCKTools.RunFunction(H,this,[doc]);else H(doc);},RefreshView:function(placeHolder,original){if (original.getAttribute('width')>0) placeHolder.style.width=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('width'));if (original.getAttribute('height')>0) placeHolder.style.height=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('height'));},AddCustomHandler:function(func){A.push(func);}});})();FCK.GetRealElement=function(A){var e=FCKTempBin.Elements[A.getAttribute('_fckrealelement')];if (A.getAttribute('_fckflash')){if (A.style.width.length>0) e.width=FCKTools.ConvertStyleSizeToHtml(A.style.width);if (A.style.height.length>0) e.height=FCKTools.ConvertStyleSizeToHtml(A.style.height);};return e;};if (FCKBrowserInfo.IsIE){FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('HR');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){var D=A.createElement('hr');D.mergeAttributes(C,true);FCKDomTools.InsertAfterNode(C,D);C.parentNode.removeChild(C);}}};FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('INPUT');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.type=='hidden'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__InputHidden',C.cloneNode(true));D.setAttribute('_fckinputhidden','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor.AddCustomHandler(function(A,B){if (!(A.nodeName.IEquals('embed')&&(A.type=='application/x-shockwave-flash'||/\.swf($|#|\?)/i.test(A.src)))) return;B.className='FCK__Flash';B.setAttribute('_fckflash','true',0);});if (FCKBrowserInfo.IsSafari){FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByClassName?A.getElementsByClassName('Apple-style-span'):Array.prototype.filter.call(A.getElementsByTagName('span'),function(item){ return item.className=='Apple-style-span';});for (var i=B.length-1;i>=0;i--) FCKDomTools.RemoveNode(B[i],true);}}; +var FCKSelection=FCK.Selection={GetParentBlock:function(){var A=this.GetParentElement();while (A){if (FCKListsLib.BlockBoundaries[A.nodeName.toLowerCase()]) break;A=A.parentNode;};return A;},ApplyStyle:function(A){FCKStyles.ApplyStyle(new FCKStyle(A));}}; +FCKSelection.GetType=function(){try{var A=FCKSelection.GetSelection().type;if (A=='Control'||A=='Text') return A;if (this.GetSelection().createRange().parentElement) return 'Text';}catch(e){};return 'None';};FCKSelection.GetSelectedElement=function(){if (this.GetType()=='Control'){var A=this.GetSelection().createRange();if (A&&A.item) return this.GetSelection().createRange().item(0);};return null;};FCKSelection.GetParentElement=function(){switch (this.GetType()){case 'Control':var A=FCKSelection.GetSelectedElement();return A?A.parentElement:null;case 'None':return null;default:return this.GetSelection().createRange().parentElement();}};FCKSelection.GetBoundaryParentElement=function(A){switch (this.GetType()){case 'Control':var B=FCKSelection.GetSelectedElement();return B?B.parentElement:null;case 'None':return null;default:var C=FCK.EditorDocument;var D=C.selection.createRange();D.collapse(A!==false);var B=D.parentElement();return FCKTools.GetElementDocument(B)==C?B:null;}};FCKSelection.SelectNode=function(A){FCK.Focus();this.GetSelection().empty();var B;try{B=FCK.EditorDocument.body.createControlRange();B.addElement(A);}catch(e){B=FCK.EditorDocument.body.createTextRange();B.moveToElementText(A);};B.select();};FCKSelection.Collapse=function(A){FCK.Focus();if (this.GetType()=='Text'){var B=this.GetSelection().createRange();B.collapse(A==null||A===true);B.select();}};FCKSelection.HasAncestorNode=function(A){var B;if (this.GetSelection().type=="Control"){B=this.GetSelectedElement();}else{var C=this.GetSelection().createRange();B=C.parentElement();}while (B){if (B.nodeName.IEquals(A)) return true;B=B.parentNode;};return false;};FCKSelection.MoveToAncestorNode=function(A){var B,oRange;if (!FCK.EditorDocument) return null;if (this.GetSelection().type=="Control"){oRange=this.GetSelection().createRange();for (i=0;i=0;i--){if (C[i]) FCKTableHandler.DeleteRows(C[i]);};return;};var E=FCKTools.GetElementAscensor(A,'TABLE');if (E.rows.length==1){FCKTableHandler.DeleteTable(E);return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteTable=function(A){if (!A){A=FCKSelection.GetSelectedElement();if (!A||A.tagName!='TABLE') A=FCKSelection.MoveToAncestorNode('TABLE');};if (!A) return;FCKSelection.SelectNode(A);FCKSelection.Collapse();if (A.parentNode.childNodes.length==1) A.parentNode.parentNode.removeChild(A.parentNode);else A.parentNode.removeChild(A);};FCKTableHandler.InsertColumn=function(A){var B=null;var C=this.GetSelectedCells();if (C&&C.length) B=C[A?0:(C.length-1)];if (!B) return;var D=FCKTools.GetElementAscensor(B,'TABLE');var E=B.cellIndex;for (var i=0;i=0;i--){if (B[i]) FCKTableHandler.DeleteColumns(B[i]);};return;};if (!A) return;var C=FCKTools.GetElementAscensor(A,'TABLE');var D=A.cellIndex;for (var i=C.rows.length-1;i>=0;i--){var E=C.rows[i];if (D==0&&E.cells.length==1){FCKTableHandler.DeleteRows(E);continue;};if (E.cells[D]) E.removeChild(E.cells[D]);}};FCKTableHandler.InsertCell=function(A,B){var C=null;var D=this.GetSelectedCells();if (D&&D.length) C=D[B?0:(D.length-1)];if (!C) return null;var E=FCK.EditorDocument.createElement('TD');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(E);if (!B&&C.cellIndex==C.parentNode.cells.length-1) C.parentNode.appendChild(E);else C.parentNode.insertBefore(E,B?C:C.nextSibling);return E;};FCKTableHandler.DeleteCell=function(A){if (A.parentNode.cells.length==1){FCKTableHandler.DeleteRows(A.parentNode);return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteCells=function(){var A=FCKTableHandler.GetSelectedCells();for (var i=A.length-1;i>=0;i--){FCKTableHandler.DeleteCell(A[i]);}};FCKTableHandler._MarkCells=function(A,B){for (var i=0;i=E.height){for (D=F;D0){var L=K.removeChild(K.firstChild);if (L.nodeType!=1||(L.getAttribute('type',2)!='_moz'&&L.getAttribute('_moz_dirty')!=null)){I.appendChild(L);J++;}}};if (J>0) I.appendChild(FCK.EditorDocument.createElement('br'));};this._ReplaceCellsByMarker(C,'_SelectedCells',B);this._UnmarkCells(A,'_SelectedCells');this._InstallTableMap(C,B.parentNode.parentNode.parentNode);B.appendChild(I);if (FCKBrowserInfo.IsGeckoLike&&(!B.firstChild)) FCKTools.AppendBogusBr(B);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeRight=function(){var A=this.GetMergeRightTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCK.EditorDocument.createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));D.parentNode.removeChild(D);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeDown=function(){var A=this.GetMergeDownTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCKTools.GetElementDocument(B).createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));if (E.firstChild) E.insertBefore(FCK.EditorDocument.createElement('br'),E.firstChild);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.HorizontalSplitCell=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length!=1) return;var B=A[0];var C=this._CreateTableMap(B);var D=B.parentNode.rowIndex;var E=FCKTableHandler._GetCellIndexSpan(C,D,B);var F=isNaN(B.colSpan)?1:B.colSpan;if (F>1){var G=Math.ceil(F/2);var H=FCK.EditorDocument.createElement(B.nodeName);if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H);var I=E+G;var J=E+F;var K=isNaN(B.rowSpan)?1:B.rowSpan;for (var r=D;r1){B.rowSpan=Math.ceil(G/2);var H=D+Math.ceil(G/2);var I=C[H];var J=null;for (var i=E+1;i1) K.colSpan=F;if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(K);B.parentNode.parentNode.parentNode.rows[H].insertBefore(K,J);}else{var L=B.parentNode.sectionRowIndex+1;var M=FCK.EditorDocument.createElement('tr');var N=B.parentNode.parentNode;if (N.rows.length>L) N.insertBefore(M,N.rows[L]);else N.appendChild(M);for (var i=0;i1) K.colSpan=F;if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(K);M.appendChild(K);}};FCKTableHandler._GetCellIndexSpan=function(A,B,C){if (A.lengthE) E=j;if (D._colScanned===true) continue;if (A[i][j-1]==D) D.colSpan++;if (A[i][j+1]!=D) D._colScanned=true;}};for (var i=0;i<=E;i++){for (var j=0;j=0&&C.compareEndPoints('StartToEnd',E)<=0)||(C.compareEndPoints('EndToStart',E)>=0&&C.compareEndPoints('EndToEnd',E)<=0)){B[B.length]=D.cells[i];}}}};return B;}; +var FCKXml=function(){this.Error=false;};FCKXml.GetAttribute=function(A,B,C){var D=A.attributes.getNamedItem(B);return D?D.value:C;};FCKXml.TransformToObject=function(A){if (!A) return null;var B={};var C=A.attributes;for (var i=0;i ';var A=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',e);var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.SplitBlock();B.InsertNode(A);FCK.Events.FireEvent('OnSelectionChange');};FCKPageBreakCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKUnlinkCommand=function(){this.Name='Unlink';};FCKUnlinkCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();if (FCKBrowserInfo.IsGeckoLike){var A=FCK.Selection.MoveToAncestorNode('A');if (A) FCKTools.RemoveOuterTags(A);return;};FCK.ExecuteNamedCommand(this.Name);};FCKUnlinkCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;var A=FCK.GetNamedCommandState(this.Name);if (A==0&&FCK.EditMode==0){var B=FCKSelection.MoveToAncestorNode('A');var C=(B&&B.name.length>0&&B.href.length==0);if (C) A=-1;};return A;};var FCKVisitLinkCommand=function(){this.Name='VisitLink';};FCKVisitLinkCommand.prototype={GetState:function(){if (FCK.EditMode!=0) return -1;var A=FCK.GetNamedCommandState('Unlink');if (A==0){var B=FCKSelection.MoveToAncestorNode('A');if (!B.href) A=-1;};return A;},Execute:function(){var A=FCKSelection.MoveToAncestorNode('A');var B=A.getAttribute('_fcksavedurl')||A.getAttribute('href',2);if (!/:\/\//.test(B)){var C=FCKConfig.BaseHref;var D=FCK.GetInstanceObject('parent');if (!C){C=D.document.location.href;C=C.substring(0,C.lastIndexOf('/')+1);};if (/^\//.test(B)){try{C=C.match(/^.*:\/\/+[^\/]+/)[0];}catch (e){C=D.document.location.protocol+'://'+D.parent.document.location.host;}};B=C+B;};if (!window.open(B,'_blank')) alert(FCKLang.VisitLinkBlocked);}};var FCKSelectAllCommand=function(){this.Name='SelectAll';};FCKSelectAllCommand.prototype.Execute=function(){if (FCK.EditMode==0){FCK.ExecuteNamedCommand('SelectAll');}else{var A=FCK.EditingArea.Textarea;if (FCKBrowserInfo.IsIE){A.createTextRange().execCommand('SelectAll');}else{A.selectionStart=0;A.selectionEnd=A.value.length;};A.focus();}};FCKSelectAllCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKPasteCommand=function(){this.Name='Paste';};FCKPasteCommand.prototype={Execute:function(){if (FCKBrowserInfo.IsIE) FCK.Paste();else FCK.ExecuteNamedCommand('Paste');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Paste');}};var FCKRuleCommand=function(){this.Name='Rule';};FCKRuleCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();FCK.InsertElement('hr');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('InsertHorizontalRule');}};var FCKCutCopyCommand=function(A){this.Name=A?'Cut':'Copy';};FCKCutCopyCommand.prototype={Execute:function(){var A=false;if (FCKBrowserInfo.IsIE){var B=function(){A=true;};var C='on'+this.Name.toLowerCase();FCK.EditorDocument.body.attachEvent(C,B);FCK.ExecuteNamedCommand(this.Name);FCK.EditorDocument.body.detachEvent(C,B);}else{try{FCK.ExecuteNamedCommand(this.Name);A=true;}catch(e){}};if (!A) alert(FCKLang['PasteError'+this.Name]);},GetState:function(){return FCK.EditMode!=0?-1:FCK.GetNamedCommandState('Cut');}};var FCKAnchorDeleteCommand=function(){this.Name='AnchorDelete';};FCKAnchorDeleteCommand.prototype={Execute:function(){if (FCK.Selection.GetType()=='Control'){FCK.Selection.Delete();}else{var A=FCK.Selection.GetSelectedElement();if (A){if (A.tagName=='IMG'&&A.getAttribute('_fckanchor')) oAnchor=FCK.GetRealElement(A);else A=null;};if (!A){oAnchor=FCK.Selection.MoveToAncestorNode('A');if (oAnchor) FCK.Selection.SelectNode(oAnchor);};if (oAnchor.href.length!=0){oAnchor.removeAttribute('name');if (FCKBrowserInfo.IsIE) oAnchor.className=oAnchor.className.replace(FCKRegexLib.FCK_Class,'');return;};if (A){A.parentNode.removeChild(A);return;};if (oAnchor.innerHTML.length==0){oAnchor.parentNode.removeChild(oAnchor);return;};FCKTools.RemoveOuterTags(oAnchor);};if (FCKBrowserInfo.IsGecko) FCK.Selection.Collapse(true);},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Unlink');}};var FCKDeleteDivCommand=function(){};FCKDeleteDivCommand.prototype={GetState:function(){if (FCK.EditMode!=0) return -1;var A=FCKSelection.GetParentElement();var B=new FCKElementPath(A);return B.BlockLimit&&B.BlockLimit.nodeName.IEquals('div')?0:-1;},Execute:function(){FCKUndo.SaveUndoStep();var A=FCKDomTools.GetSelectedDivContainers();var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.CreateBookmark();for (var i=0;i\n \n
      \n '+FCKLang.ColorAutomatic+'\n \n ';FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_AutoOnClick,this);if (!FCKBrowserInfo.IsIE) C.style.width='96%';var G=FCKConfig.FontColors.toString().split(',');var H=0;while (H
    ';if (H>=G.length) C.style.visibility='hidden';else FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_OnClick,[this,L]);}};if (FCKConfig.EnableMoreFontColors){E=D.insertRow(-1).insertCell(-1);E.colSpan=8;C=E.appendChild(CreateSelectionDiv());C.innerHTML='
    '+FCKLang.ColorMoreColors+'
    ';FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_MoreOnClick,this);};if (!FCKBrowserInfo.IsIE) C.style.width='96%';}; +var FCKPastePlainTextCommand=function(){this.Name='PasteText';};FCKPastePlainTextCommand.prototype.Execute=function(){FCK.PasteAsPlainText();};FCKPastePlainTextCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Paste');}; +var FCKPasteWordCommand=function(){this.Name='PasteWord';};FCKPasteWordCommand.prototype.Execute=function(){FCK.PasteFromWord();};FCKPasteWordCommand.prototype.GetState=function(){if (FCK.EditMode!=0||FCKConfig.ForcePasteAsPlainText) return -1;else return FCK.GetNamedCommandState('Paste');}; +var FCKTableCommand=function(A){this.Name=A;};FCKTableCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();if (!FCKBrowserInfo.IsGecko){switch (this.Name){case 'TableMergeRight':return FCKTableHandler.MergeRight();case 'TableMergeDown':return FCKTableHandler.MergeDown();}};switch (this.Name){case 'TableInsertRowAfter':return FCKTableHandler.InsertRow(false);case 'TableInsertRowBefore':return FCKTableHandler.InsertRow(true);case 'TableDeleteRows':return FCKTableHandler.DeleteRows();case 'TableInsertColumnAfter':return FCKTableHandler.InsertColumn(false);case 'TableInsertColumnBefore':return FCKTableHandler.InsertColumn(true);case 'TableDeleteColumns':return FCKTableHandler.DeleteColumns();case 'TableInsertCellAfter':return FCKTableHandler.InsertCell(null,false);case 'TableInsertCellBefore':return FCKTableHandler.InsertCell(null,true);case 'TableDeleteCells':return FCKTableHandler.DeleteCells();case 'TableMergeCells':return FCKTableHandler.MergeCells();case 'TableHorizontalSplitCell':return FCKTableHandler.HorizontalSplitCell();case 'TableVerticalSplitCell':return FCKTableHandler.VerticalSplitCell();case 'TableDelete':return FCKTableHandler.DeleteTable();default:return alert(FCKLang.UnknownCommand.replace(/%1/g,this.Name));}};FCKTableCommand.prototype.GetState=function(){if (FCK.EditorDocument!=null&&FCKSelection.HasAncestorNode('TABLE')){switch (this.Name){case 'TableHorizontalSplitCell':case 'TableVerticalSplitCell':if (FCKTableHandler.GetSelectedCells().length==1) return 0;else return -1;case 'TableMergeCells':if (FCKTableHandler.CheckIsSelectionRectangular()&&FCKTableHandler.GetSelectedCells().length>1) return 0;else return -1;case 'TableMergeRight':return FCKTableHandler.GetMergeRightTarget()?0:-1;case 'TableMergeDown':return FCKTableHandler.GetMergeDownTarget()?0:-1;default:return 0;}}else return -1;}; +var FCKFitWindow=function(){this.Name='FitWindow';};FCKFitWindow.prototype.Execute=function(){var A=window.frameElement;var B=A.style;var C=parent;var D=C.document.documentElement;var E=C.document.body;var F=E.style;var G;var H,oEditorScrollPos;if (FCK.EditMode==0){H=new FCKDomRange(FCK.EditorWindow);H.MoveToSelection();oEditorScrollPos=FCKTools.GetScrollPosition(FCK.EditorWindow);}else{var I=FCK.EditingArea.Textarea;H=!FCKBrowserInfo.IsIE&&[I.selectionStart,I.selectionEnd];oEditorScrollPos=[I.scrollLeft,I.scrollTop];};if (!this.IsMaximized){if(FCKBrowserInfo.IsIE) C.attachEvent('onresize',FCKFitWindow_Resize);else C.addEventListener('resize',FCKFitWindow_Resize,true);this._ScrollPos=FCKTools.GetScrollPosition(C);G=A;while((G=G.parentNode)){if (G.nodeType==1){G._fckSavedStyles=FCKTools.SaveStyles(G);G.style.zIndex=FCKConfig.FloatingPanelsZIndex-1;}};if (FCKBrowserInfo.IsIE){this.documentElementOverflow=D.style.overflow;D.style.overflow='hidden';F.overflow='hidden';}else{F.overflow='hidden';F.width='0px';F.height='0px';};this._EditorFrameStyles=FCKTools.SaveStyles(A);var J=FCKTools.GetViewPaneSize(C);B.position="absolute";A.offsetLeft;B.zIndex=FCKConfig.FloatingPanelsZIndex-1;B.left="0px";B.top="0px";B.width=J.Width+"px";B.height=J.Height+"px";if (!FCKBrowserInfo.IsIE){B.borderRight=B.borderBottom="9999px solid white";B.backgroundColor="white";};C.scrollTo(0,0);var K=FCKTools.GetWindowPosition(C,A);if (K.x!=0) B.left=(-1*K.x)+"px";if (K.y!=0) B.top=(-1*K.y)+"px";this.IsMaximized=true;}else{if(FCKBrowserInfo.IsIE) C.detachEvent("onresize",FCKFitWindow_Resize);else C.removeEventListener("resize",FCKFitWindow_Resize,true);G=A;while((G=G.parentNode)){if (G._fckSavedStyles){FCKTools.RestoreStyles(G,G._fckSavedStyles);G._fckSavedStyles=null;}};if (FCKBrowserInfo.IsIE) D.style.overflow=this.documentElementOverflow;FCKTools.RestoreStyles(A,this._EditorFrameStyles);C.scrollTo(this._ScrollPos.X,this._ScrollPos.Y);this.IsMaximized=false;};FCKToolbarItems.GetItem('FitWindow').RefreshState();if (FCK.EditMode==0) FCK.EditingArea.MakeEditable();FCK.Focus();if (FCK.EditMode==0){H.Select();FCK.EditorWindow.scrollTo(oEditorScrollPos.X,oEditorScrollPos.Y);}else{if (!FCKBrowserInfo.IsIE){I.selectionStart=H[0];I.selectionEnd=H[1];};I.scrollLeft=oEditorScrollPos[0];I.scrollTop=oEditorScrollPos[1];}};FCKFitWindow.prototype.GetState=function(){if (FCKConfig.ToolbarLocation!='In') return -1;else return (this.IsMaximized?1:0);};function FCKFitWindow_Resize(){var A=FCKTools.GetViewPaneSize(parent);var B=window.frameElement.style;B.width=A.Width+'px';B.height=A.Height+'px';}; +var FCKListCommand=function(A,B){this.Name=A;this.TagName=B;};FCKListCommand.prototype={GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=FCKSelection.GetBoundaryParentElement(true);var B=A;while (B){if (B.nodeName.IEquals(['ul','ol'])) break;B=B.parentNode;};if (B&&B.nodeName.IEquals(this.TagName)) return 1;else return 0;},Execute:function(){FCKUndo.SaveUndoStep();var A=FCK.EditorDocument;var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=this.GetState();if (C==0){FCKDomTools.TrimNode(A.body);if (!A.body.firstChild){var D=A.createElement('p');A.body.appendChild(D);B.MoveToNodeContents(D);}};var E=B.CreateBookmark();var F=[];var G={};var H=new FCKDomRangeIterator(B);var I;H.ForceBrBreak=(C==0);var J=true;var K=null;while (J){while ((I=H.GetNextParagraph())){var L=new FCKElementPath(I);var M=null;var N=false;var O=L.BlockLimit;for (var i=L.Elements.length-1;i>=0;i--){var P=L.Elements[i];if (P.nodeName.IEquals(['ol','ul'])){if (O._FCK_ListGroupObject) O._FCK_ListGroupObject=null;var Q=P._FCK_ListGroupObject;if (Q) Q.contents.push(I);else{Q={ 'root':P,'contents':[I] };F.push(Q);FCKDomTools.SetElementMarker(G,P,'_FCK_ListGroupObject',Q);};N=true;break;}};if (N) continue;var R=O;if (R._FCK_ListGroupObject) R._FCK_ListGroupObject.contents.push(I);else{var Q={ 'root':R,'contents':[I] };FCKDomTools.SetElementMarker(G,R,'_FCK_ListGroupObject',Q);F.push(Q);}};if (FCKBrowserInfo.IsIE) J=false;else{if (K==null){K=[];var T=FCKSelection.GetSelection();if (T&&F.length==0) K.push(T.getRangeAt(0));for (var i=1;T&&i0){var Q=F.shift();if (C==0){if (Q.root.nodeName.IEquals(['ul','ol'])) this._ChangeListType(Q,G,W);else this._CreateList(Q,W);}else if (C==1&&Q.root.nodeName.IEquals(['ul','ol'])) this._RemoveList(Q,G);};for (var i=0;iC[i-1].indent+1){var H=C[i-1].indent+1-C[i].indent;var I=C[i].indent;while (C[i]&&C[i].indent>=I){C[i].indent+=H;i++;};i--;}};var J=FCKDomTools.ArrayToList(C,B);if (A.root.nextSibling==null||A.root.nextSibling.nodeName.IEquals('br')){if (J.listNode.lastChild.nodeName.IEquals('br')) J.listNode.removeChild(J.listNode.lastChild);};A.root.parentNode.replaceChild(J.listNode,A.root);}}; +var FCKJustifyCommand=function(A){this.AlignValue=A;var B=FCKConfig.ContentLangDirection.toLowerCase();this.IsDefaultAlign=(A=='left'&&B=='ltr')||(A=='right'&&B=='rtl');var C=this._CssClassName=(function(){var D=FCKConfig.JustifyClasses;if (D){switch (A){case 'left':return D[0]||null;case 'center':return D[1]||null;case 'right':return D[2]||null;case 'justify':return D[3]||null;}};return null;})();if (C&&C.length>0) this._CssClassRegex=new RegExp('(?:^|\\s+)'+C+'(?=$|\\s)');};FCKJustifyCommand._GetClassNameRegex=function(){var A=FCKJustifyCommand._ClassRegex;if (A!=undefined) return A;var B=[];var C=FCKConfig.JustifyClasses;if (C){for (var i=0;i<4;i++){var D=C[i];if (D&&D.length>0) B.push(D);}};if (B.length>0) A=new RegExp('(?:^|\\s+)(?:'+B.join('|')+')(?=$|\\s)');else A=null;return FCKJustifyCommand._ClassRegex=A;};FCKJustifyCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(FCK.EditorWindow);A.MoveToSelection();var B=this.GetState();if (B==-1) return;var C=A.CreateBookmark();var D=this._CssClassName;var E=new FCKDomRangeIterator(A);var F;while ((F=E.GetNextParagraph())){F.removeAttribute('align');if (D){var G=F.className.replace(FCKJustifyCommand._GetClassNameRegex(),'');if (B==0){if (G.length>0) G+=' ';F.className=G+D;}else if (G.length==0) FCKDomTools.RemoveAttribute(F,'class');}else{var H=F.style;if (B==0) H.textAlign=this.AlignValue;else{H.textAlign='';if (H.cssText.length==0) F.removeAttribute('style');}}};A.MoveToBookmark(C);A.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=new FCKElementPath(FCKSelection.GetBoundaryParentElement(true));var B=A.Block||A.BlockLimit;if (!B||B.nodeName.toLowerCase()=='body') return 0;var C;if (FCKBrowserInfo.IsIE) C=B.currentStyle.textAlign;else C=FCK.EditorWindow.getComputedStyle(B,'').getPropertyValue('text-align');C=C.replace(/(-moz-|-webkit-|start|auto)/i,'');if ((!C&&this.IsDefaultAlign)||C==this.AlignValue) return 1;return 0;}}; +var FCKIndentCommand=function(A,B){this.Name=A;this.Offset=B;this.IndentCSSProperty=FCKConfig.ContentLangDirection.IEquals('ltr')?'marginLeft':'marginRight';};FCKIndentCommand._InitIndentModeParameters=function(){if (FCKConfig.IndentClasses&&FCKConfig.IndentClasses.length>0){this._UseIndentClasses=true;this._IndentClassMap={};for (var i=0;i0?H+' ':'')+FCKConfig.IndentClasses[G-1];}else{var I=parseInt(E.style[this.IndentCSSProperty],10);if (isNaN(I)) I=0;I+=this.Offset;I=Math.max(I,0);I=Math.ceil(I/this.Offset)*this.Offset;E.style[this.IndentCSSProperty]=I?I+FCKConfig.IndentUnit:'';if (E.getAttribute('style')=='') E.removeAttribute('style');}}},_IndentList:function(A,B){var C=A.StartContainer;var D=A.EndContainer;while (C&&C.parentNode!=B) C=C.parentNode;while (D&&D.parentNode!=B) D=D.parentNode;if (!C||!D) return;var E=C;var F=[];var G=false;while (G==false){if (E==D) G=true;F.push(E);E=E.nextSibling;};if (F.length<1) return;var H=FCKDomTools.GetParents(B);for (var i=0;iN;i++) M[i].indent+=I;var O=FCKDomTools.ArrayToList(M);if (O) B.parentNode.replaceChild(O.listNode,B);FCKDomTools.ClearAllMarkers(L);}}; +var FCKBlockQuoteCommand=function(){};FCKBlockQuoteCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();var A=this.GetState();var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.CreateBookmark();if (FCKBrowserInfo.IsIE){var D=B.GetBookmarkNode(C,true);var E=B.GetBookmarkNode(C,false);var F;if (D&&D.parentNode.nodeName.IEquals('blockquote')&&!D.previousSibling){F=D;while ((F=F.nextSibling)){if (FCKListsLib.BlockElements[F.nodeName.toLowerCase()]) FCKDomTools.MoveNode(D,F,true);}};if (E&&E.parentNode.nodeName.IEquals('blockquote')&&!E.previousSibling){F=E;while ((F=F.nextSibling)){if (FCKListsLib.BlockElements[F.nodeName.toLowerCase()]){if (F.firstChild==D) FCKDomTools.InsertAfterNode(D,E);else FCKDomTools.MoveNode(E,F,true);}}}};var G=new FCKDomRangeIterator(B);var H;if (A==0){var I=[];while ((H=G.GetNextParagraph())) I.push(H);if (I.length<1){para=B.Window.document.createElement(FCKConfig.EnterMode.IEquals('p')?'p':'div');B.InsertNode(para);para.appendChild(B.Window.document.createTextNode('\ufeff'));B.MoveToBookmark(C);B.MoveToNodeContents(para);B.Collapse(true);C=B.CreateBookmark();I.push(para);};var J=I[0].parentNode;var K=[];for (var i=0;i0){H=I.shift();while (H.parentNode!=J) H=H.parentNode;if (H!=L) K.push(H);L=H;}while (K.length>0){H=K.shift();if (H.nodeName.IEquals('blockquote')){var M=FCKTools.GetElementDocument(H).createDocumentFragment();while (H.firstChild){M.appendChild(H.removeChild(H.firstChild));I.push(M.lastChild);};H.parentNode.replaceChild(M,H);}else I.push(H);};var N=B.Window.document.createElement('blockquote');J.insertBefore(N,I[0]);while (I.length>0){H=I.shift();N.appendChild(H);}}else if (A==1){var O=[];var P={};while ((H=G.GetNextParagraph())){var Q=null;var R=null;while (H.parentNode){if (H.parentNode.nodeName.IEquals('blockquote')){Q=H.parentNode;R=H;break;};H=H.parentNode;};if (Q&&R&&!R._fckblockquotemoveout){O.push(R);FCKDomTools.SetElementMarker(P,R,'_fckblockquotemoveout',true);}};FCKDomTools.ClearAllMarkers(P);var S=[];var T=[],P={};var U=function(N){for (var i=0;i0){var W=O.shift();var N=W.parentNode;if (W==W.parentNode.firstChild) N.parentNode.insertBefore(N.removeChild(W),N);else if (W==W.parentNode.lastChild) N.parentNode.insertBefore(N.removeChild(W),N.nextSibling);else FCKDomTools.BreakParent(W,W.parentNode,B);if (!N._fckbqprocessed){T.push(N);FCKDomTools.SetElementMarker(P,N,'_fckbqprocessed',true);};S.push(W);};for (var i=T.length-1;i>=0;i--){var N=T[i];if (U(N)) FCKDomTools.RemoveNode(N);};FCKDomTools.ClearAllMarkers(P);if (FCKConfig.EnterMode.IEquals('br')){while (S.length){var W=S.shift();var a=true;if (W.nodeName.IEquals('div')){var M=FCKTools.GetElementDocument(W).createDocumentFragment();var c=a&&W.previousSibling&&!FCKListsLib.BlockBoundaries[W.previousSibling.nodeName.toLowerCase()];if (a&&c) M.appendChild(FCKTools.GetElementDocument(W).createElement('br'));var d=W.nextSibling&&!FCKListsLib.BlockBoundaries[W.nextSibling.nodeName.toLowerCase()];while (W.firstChild) M.appendChild(W.removeChild(W.firstChild));if (d) M.appendChild(FCKTools.GetElementDocument(W).createElement('br'));W.parentNode.replaceChild(M,W);a=false;}}}};B.MoveToBookmark(C);B.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=new FCKElementPath(FCKSelection.GetBoundaryParentElement(true));var B=A.Block||A.BlockLimit;if (!B||B.nodeName.toLowerCase()=='body') return 0;for (var i=0;i';B.open();B.write(''+F+'<\/head><\/body><\/html>');B.close();if(FCKBrowserInfo.IsAIR) FCKAdobeAIR.Panel_Contructor(B,window.document.location);FCKTools.AddEventListenerEx(E,'focus',FCKPanel_Window_OnFocus,this);FCKTools.AddEventListenerEx(E,'blur',FCKPanel_Window_OnBlur,this);};B.dir=FCKLang.Dir;FCKTools.AddEventListener(B,'contextmenu',FCKTools.CancelEvent);this.MainNode=B.body.appendChild(B.createElement('DIV'));this.MainNode.style.cssFloat=this.IsRTL?'right':'left';};FCKPanel.prototype.AppendStyleSheet=function(A){FCKTools.AppendStyleSheet(this.Document,A);};FCKPanel.prototype.Preload=function(x,y,A){if (this._Popup) this._Popup.show(x,y,0,0,A);};FCKPanel.prototype.ResizeForSubpanel=function(A,B,C){if (!FCKBrowserInfo.IsIE7) return false;if (!this._Popup.isOpen){this.Subpanel=null;return false;};if (B==0&&C==0){if (this.Subpanel!==A) return false;this.Subpanel=null;this.IncreasedX=0;}else{this.Subpanel=A;if ((this.IncreasedX>=B)&&(this.IncreasedY>=C)) return false;this.IncreasedX=Math.max(this.IncreasedX,B);this.IncreasedY=Math.max(this.IncreasedY,C);};var x=this.ShowRect.x;var w=this.IncreasedX;if (this.IsRTL) x=x-w;var D=this.ShowRect.w+w;var E=Math.max(this.ShowRect.h,this.IncreasedY);if (this.ParentPanel) this.ParentPanel.ResizeForSubpanel(this,D,E);this._Popup.show(x,this.ShowRect.y,D,E,this.RelativeElement);return this.IsRTL;};FCKPanel.prototype.Show=function(x,y,A,B,C){var D;var E=this.MainNode;if (this._Popup){this._Popup.show(x,y,0,0,A);FCKDomTools.SetElementStyles(E,{B:B?B+'px':'',C:C?C+'px':''});D=E.offsetWidth;if (FCKBrowserInfo.IsIE7){if (this.ParentPanel&&this.ParentPanel.ResizeForSubpanel(this,D,E.offsetHeight)){FCKTools.RunFunction(this.Show,this,[x,y,A]);return;}};if (this.IsRTL){if (this.IsContextMenu) x=x-D+1;else if (A) x=(x*-1)+A.offsetWidth-D;};if (FCKBrowserInfo.IsIE7){this.ShowRect={x:x,y:y,w:D,h:E.offsetHeight};this.IncreasedX=0;this.IncreasedY=0;this.RelativeElement=A;};this._Popup.show(x,y,D,E.offsetHeight,A);if (this.OnHide){if (this._Timer) CheckPopupOnHide.call(this,true);this._Timer=FCKTools.SetInterval(CheckPopupOnHide,100,this);}}else{if (typeof(FCK.ToolbarSet.CurrentInstance.FocusManager)!='undefined') FCK.ToolbarSet.CurrentInstance.FocusManager.Lock();if (this.ParentPanel){this.ParentPanel.Lock();FCKPanel_Window_OnBlur(null,this.ParentPanel);};if (FCKBrowserInfo.IsGecko&&FCKBrowserInfo.IsMac){this._IFrame.scrolling='';FCKTools.RunFunction(function(){ this._IFrame.scrolling='no';},this);};if (FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel&&FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel!=this) FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel.Hide(false,true);FCKDomTools.SetElementStyles(E,{B:B?B+'px':'',C:C?C+'px':''});D=E.offsetWidth;if (!B) this._IFrame.width=1;if (!C) this._IFrame.height=1;D=E.offsetWidth||E.firstChild.offsetWidth;var F=FCKTools.GetDocumentPosition(this._Window,A.nodeType==9?(FCKTools.IsStrictMode(A)?A.documentElement:A.body):A);var G=FCKDomTools.GetPositionedAncestor(this._IFrame.parentNode);if (G){var H=FCKTools.GetDocumentPosition(FCKTools.GetElementWindow(G),G);F.x-=H.x;F.y-=H.y;};if (this.IsRTL&&!this.IsContextMenu) x=(x*-1);x+=F.x;y+=F.y;if (this.IsRTL){if (this.IsContextMenu) x=x-D+1;else if (A) x=x+A.offsetWidth-D;}else{var I=FCKTools.GetViewPaneSize(this._Window);var J=FCKTools.GetScrollPosition(this._Window);var K=I.Height+J.Y;var L=I.Width+J.X;if ((x+D)>L) x-=x+D-L;if ((y+E.offsetHeight)>K) y-=y+E.offsetHeight-K;};FCKDomTools.SetElementStyles(this._IFrame,{left:x+'px',top:y+'px'});this._IFrame.contentWindow.focus();this._IsOpened=true;var M=this;this._resizeTimer=setTimeout(function(){var N=E.offsetWidth||E.firstChild.offsetWidth;var O=E.offsetHeight;M._IFrame.style.width=N+'px';M._IFrame.style.height=O+'px';},0);FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel=this;};FCKTools.RunFunction(this.OnShow,this);};FCKPanel.prototype.Hide=function(A,B){if (this._Popup) this._Popup.hide();else{if (!this._IsOpened||this._LockCounter>0) return;if (typeof(FCKFocusManager)!='undefined'&&!B) FCKFocusManager.Unlock();this._IFrame.style.width=this._IFrame.style.height='0px';this._IsOpened=false;if (this._resizeTimer){clearTimeout(this._resizeTimer);this._resizeTimer=null;};if (this.ParentPanel) this.ParentPanel.Unlock();if (!A) FCKTools.RunFunction(this.OnHide,this);}};FCKPanel.prototype.CheckIsOpened=function(){if (this._Popup) return this._Popup.isOpen;else return this._IsOpened;};FCKPanel.prototype.CreateChildPanel=function(){var A=this._Popup?FCKTools.GetDocumentWindow(this.Document):this._Window;var B=new FCKPanel(A);B.ParentPanel=this;return B;};FCKPanel.prototype.Lock=function(){this._LockCounter++;};FCKPanel.prototype.Unlock=function(){if (--this._LockCounter==0&&!this.HasFocus) this.Hide();};function FCKPanel_Window_OnFocus(e,A){A.HasFocus=true;};function FCKPanel_Window_OnBlur(e,A){A.HasFocus=false;if (A._LockCounter==0) FCKTools.RunFunction(A.Hide,A);};function CheckPopupOnHide(A){if (A||!this._Popup.isOpen){window.clearInterval(this._Timer);this._Timer=null;if (this._Popup&&this.ParentPanel&&!A) this.ParentPanel.ResizeForSubpanel(this,0,0);FCKTools.RunFunction(this.OnHide,this);}};function FCKPanel_Cleanup(){this._Popup=null;this._Window=null;this.Document=null;this.MainNode=null;this.RelativeElement=null;}; +var FCKIcon=function(A){var B=A?typeof(A):'undefined';switch (B){case 'number':this.Path=FCKConfig.SkinPath+'fck_strip.gif';this.Size=16;this.Position=A;break;case 'undefined':this.Path=FCK_SPACER_PATH;break;case 'string':this.Path=A;break;default:this.Path=A[0];this.Size=A[1];this.Position=A[2];}};FCKIcon.prototype.CreateIconElement=function(A){var B,eIconImage;if (this.Position){var C='-'+((this.Position-1)*this.Size)+'px';if (FCKBrowserInfo.IsIE){B=A.createElement('DIV');eIconImage=B.appendChild(A.createElement('IMG'));eIconImage.src=this.Path;eIconImage.style.top=C;}else{B=A.createElement('IMG');B.src=FCK_SPACER_PATH;B.style.backgroundPosition='0px '+C;B.style.backgroundImage='url("'+this.Path+'")';}}else{if (FCKBrowserInfo.IsIE){B=A.createElement('DIV');eIconImage=B.appendChild(A.createElement('IMG'));eIconImage.src=this.Path?this.Path:FCK_SPACER_PATH;}else{B=A.createElement('IMG');B.src=this.Path?this.Path:FCK_SPACER_PATH;}};B.className='TB_Button_Image';return B;}; +var FCKToolbarButtonUI=function(A,B,C,D,E,F){this.Name=A;this.Label=B||A;this.Tooltip=C||this.Label;this.Style=E||0;this.State=F||0;this.Icon=new FCKIcon(D);if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKToolbarButtonUI_Cleanup);};FCKToolbarButtonUI.prototype._CreatePaddingElement=function(A){var B=A.createElement('IMG');B.className='TB_Button_Padding';B.src=FCK_SPACER_PATH;return B;};FCKToolbarButtonUI.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A);var C=this.MainElement=B.createElement('DIV');C.title=this.Tooltip;if (FCKBrowserInfo.IsGecko) C.onmousedown=FCKTools.CancelEvent;FCKTools.AddEventListenerEx(C,'mouseover',FCKToolbarButtonUI_OnMouseOver,this);FCKTools.AddEventListenerEx(C,'mouseout',FCKToolbarButtonUI_OnMouseOut,this);FCKTools.AddEventListenerEx(C,'click',FCKToolbarButtonUI_OnClick,this);this.ChangeState(this.State,true);if (this.Style==0&&!this.ShowArrow){C.appendChild(this.Icon.CreateIconElement(B));}else{var D=C.appendChild(B.createElement('TABLE'));D.cellPadding=0;D.cellSpacing=0;var E=D.insertRow(-1);var F=E.insertCell(-1);if (this.Style==0||this.Style==2) F.appendChild(this.Icon.CreateIconElement(B));else F.appendChild(this._CreatePaddingElement(B));if (this.Style==1||this.Style==2){F=E.insertCell(-1);F.className='TB_Button_Text';F.noWrap=true;F.appendChild(B.createTextNode(this.Label));};if (this.ShowArrow){if (this.Style!=0){E.insertCell(-1).appendChild(this._CreatePaddingElement(B));};F=E.insertCell(-1);var G=F.appendChild(B.createElement('IMG'));G.src=FCKConfig.SkinPath+'images/toolbar.buttonarrow.gif';G.width=5;G.height=3;};F=E.insertCell(-1);F.appendChild(this._CreatePaddingElement(B));};A.appendChild(C);};FCKToolbarButtonUI.prototype.ChangeState=function(A,B){if (!B&&this.State==A) return;var e=this.MainElement;if (!e) return;switch (parseInt(A,10)){case 0:e.className='TB_Button_Off';break;case 1:e.className='TB_Button_On';break;case -1:e.className='TB_Button_Disabled';break;};this.State=A;};function FCKToolbarButtonUI_OnMouseOver(A,B){if (B.State==0) this.className='TB_Button_Off_Over';else if (B.State==1) this.className='TB_Button_On_Over';};function FCKToolbarButtonUI_OnMouseOut(A,B){if (B.State==0) this.className='TB_Button_Off';else if (B.State==1) this.className='TB_Button_On';};function FCKToolbarButtonUI_OnClick(A,B){if (B.OnClick&&B.State!=-1) B.OnClick(B);};function FCKToolbarButtonUI_Cleanup(){this.MainElement=null;}; +var FCKToolbarButton=function(A,B,C,D,E,F,G){this.CommandName=A;this.Label=B;this.Tooltip=C;this.Style=D;this.SourceView=E?true:false;this.ContextSensitive=F?true:false;if (G==null) this.IconPath=FCKConfig.SkinPath+'toolbar/'+A.toLowerCase()+'.gif';else if (typeof(G)=='number') this.IconPath=[FCKConfig.SkinPath+'fck_strip.gif',16,G];else this.IconPath=G;};FCKToolbarButton.prototype.Create=function(A){this._UIButton=new FCKToolbarButtonUI(this.CommandName,this.Label,this.Tooltip,this.IconPath,this.Style);this._UIButton.OnClick=this.Click;this._UIButton._ToolbarButton=this;this._UIButton.Create(A);};FCKToolbarButton.prototype.RefreshState=function(){var A=this._UIButton;if (!A) return;var B=FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName).GetState();if (B==A.State) return;A.ChangeState(B);};FCKToolbarButton.prototype.Click=function(){var A=this._ToolbarButton||this;FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(A.CommandName).Execute();};FCKToolbarButton.prototype.Enable=function(){this.RefreshState();};FCKToolbarButton.prototype.Disable=function(){this._UIButton.ChangeState(-1);}; +var FCKSpecialCombo=function(A,B,C,D,E){this.FieldWidth=B||100;this.PanelWidth=C||150;this.PanelMaxHeight=D||150;this.Label=' ';this.Caption=A;this.Tooltip=A;this.Style=2;this.Enabled=true;this.Items={};this._Panel=new FCKPanel(E||window);this._Panel.AppendStyleSheet(FCKConfig.SkinEditorCSS);this._PanelBox=this._Panel.MainNode.appendChild(this._Panel.Document.createElement('DIV'));this._PanelBox.className='SC_Panel';this._PanelBox.style.width=this.PanelWidth+'px';this._PanelBox.innerHTML='
    ';this._ItemsHolderEl=this._PanelBox.getElementsByTagName('TD')[0];if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKSpecialCombo_Cleanup);};function FCKSpecialCombo_ItemOnMouseOver(){this.className+=' SC_ItemOver';};function FCKSpecialCombo_ItemOnMouseOut(){this.className=this.originalClass;};function FCKSpecialCombo_ItemOnClick(A,B,C){this.className=this.originalClass;B._Panel.Hide();B.SetLabel(this.FCKItemLabel);if (typeof(B.OnSelect)=='function') B.OnSelect(C,this);};FCKSpecialCombo.prototype.ClearItems=function (){if (this.Items) this.Items={};var A=this._ItemsHolderEl;while (A.firstChild) A.removeChild(A.firstChild);};FCKSpecialCombo.prototype.AddItem=function(A,B,C,D){var E=this._ItemsHolderEl.appendChild(this._Panel.Document.createElement('DIV'));E.className=E.originalClass='SC_Item';E.innerHTML=B;E.FCKItemLabel=C||A;E.Selected=false;if (FCKBrowserInfo.IsIE) E.style.width='100%';if (D) E.style.backgroundColor=D;FCKTools.AddEventListenerEx(E,'mouseover',FCKSpecialCombo_ItemOnMouseOver);FCKTools.AddEventListenerEx(E,'mouseout',FCKSpecialCombo_ItemOnMouseOut);FCKTools.AddEventListenerEx(E,'click',FCKSpecialCombo_ItemOnClick,[this,A]);this.Items[A.toString().toLowerCase()]=E;return E;};FCKSpecialCombo.prototype.SelectItem=function(A){if (typeof A=='string') A=this.Items[A.toString().toLowerCase()];if (A){A.className=A.originalClass='SC_ItemSelected';A.Selected=true;}};FCKSpecialCombo.prototype.SelectItemByLabel=function(A,B){for (var C in this.Items){var D=this.Items[C];if (D.FCKItemLabel==A){D.className=D.originalClass='SC_ItemSelected';D.Selected=true;if (B) this.SetLabel(A);}}};FCKSpecialCombo.prototype.DeselectAll=function(A){for (var i in this.Items){if (!this.Items[i]) continue;this.Items[i].className=this.Items[i].originalClass='SC_Item';this.Items[i].Selected=false;};if (A) this.SetLabel('');};FCKSpecialCombo.prototype.SetLabelById=function(A){A=A?A.toString().toLowerCase():'';var B=this.Items[A];this.SetLabel(B?B.FCKItemLabel:'');};FCKSpecialCombo.prototype.SetLabel=function(A){A=(!A||A.length==0)?' ':A;if (A==this.Label) return;this.Label=A;var B=this._LabelEl;if (B){B.innerHTML=A;FCKTools.DisableSelection(B);}};FCKSpecialCombo.prototype.SetEnabled=function(A){this.Enabled=A;if (this._OuterTable) this._OuterTable.className=A?'':'SC_FieldDisabled';};FCKSpecialCombo.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A);var C=this._OuterTable=A.appendChild(B.createElement('TABLE'));C.cellPadding=0;C.cellSpacing=0;C.insertRow(-1);var D;var E;switch (this.Style){case 0:D='TB_ButtonType_Icon';E=false;break;case 1:D='TB_ButtonType_Text';E=false;break;case 2:E=true;break;};if (this.Caption&&this.Caption.length>0&&E){var F=C.rows[0].insertCell(-1);F.innerHTML=this.Caption;F.className='SC_FieldCaption';};var G=FCKTools.AppendElement(C.rows[0].insertCell(-1),'div');if (E){G.className='SC_Field';G.style.width=this.FieldWidth+'px';G.innerHTML='
     
    ';this._LabelEl=G.getElementsByTagName('label')[0];this._LabelEl.innerHTML=this.Label;}else{G.className='TB_Button_Off';G.innerHTML='
    '+this.Caption+'
    ';};FCKTools.AddEventListenerEx(G,'mouseover',FCKSpecialCombo_OnMouseOver,this);FCKTools.AddEventListenerEx(G,'mouseout',FCKSpecialCombo_OnMouseOut,this);FCKTools.AddEventListenerEx(G,'click',FCKSpecialCombo_OnClick,this);FCKTools.DisableSelection(this._Panel.Document.body);};function FCKSpecialCombo_Cleanup(){this._LabelEl=null;this._OuterTable=null;this._ItemsHolderEl=null;this._PanelBox=null;if (this.Items){for (var A in this.Items) this.Items[A]=null;}};function FCKSpecialCombo_OnMouseOver(A,B){if (B.Enabled){switch (B.Style){case 0:this.className='TB_Button_On_Over';break;case 1:this.className='TB_Button_On_Over';break;case 2:this.className='SC_Field SC_FieldOver';break;}}};function FCKSpecialCombo_OnMouseOut(A,B){switch (B.Style){case 0:this.className='TB_Button_Off';break;case 1:this.className='TB_Button_Off';break;case 2:this.className='SC_Field';break;}};function FCKSpecialCombo_OnClick(e,A){if (A.Enabled){var B=A._Panel;var C=A._PanelBox;var D=A._ItemsHolderEl;var E=A.PanelMaxHeight;if (A.OnBeforeClick) A.OnBeforeClick(A);if (FCKBrowserInfo.IsIE) B.Preload(0,this.offsetHeight,this);if (D.offsetHeight>E) C.style.height=E+'px';else C.style.height='';B.Show(0,this.offsetHeight,this);}}; +var FCKToolbarSpecialCombo=function(){this.SourceView=false;this.ContextSensitive=true;this.FieldWidth=null;this.PanelWidth=null;this.PanelMaxHeight=null;};FCKToolbarSpecialCombo.prototype.DefaultLabel='';function FCKToolbarSpecialCombo_OnSelect(A,B){FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName).Execute(A,B);};FCKToolbarSpecialCombo.prototype.Create=function(A){this._Combo=new FCKSpecialCombo(this.GetLabel(),this.FieldWidth,this.PanelWidth,this.PanelMaxHeight,FCKBrowserInfo.IsIE?window:FCKTools.GetElementWindow(A).parent);this._Combo.Tooltip=this.Tooltip;this._Combo.Style=this.Style;this.CreateItems(this._Combo);this._Combo.Create(A);this._Combo.CommandName=this.CommandName;this._Combo.OnSelect=FCKToolbarSpecialCombo_OnSelect;};function FCKToolbarSpecialCombo_RefreshActiveItems(A,B){A.DeselectAll();A.SelectItem(B);A.SetLabelById(B);};FCKToolbarSpecialCombo.prototype.RefreshState=function(){var A;var B=FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName).GetState();if (B!=-1){A=1;if (this.RefreshActiveItems) this.RefreshActiveItems(this._Combo,B);else{if (this._LastValue!==B){this._LastValue=B;if (!B||B.length==0){this._Combo.DeselectAll();this._Combo.SetLabel(this.DefaultLabel);}else FCKToolbarSpecialCombo_RefreshActiveItems(this._Combo,B);}}}else A=-1;if (A==this.State) return;if (A==-1){this._Combo.DeselectAll();this._Combo.SetLabel('');};this.State=A;this._Combo.SetEnabled(A!=-1);};FCKToolbarSpecialCombo.prototype.Enable=function(){this.RefreshState();};FCKToolbarSpecialCombo.prototype.Disable=function(){this.State=-1;this._Combo.DeselectAll();this._Combo.SetLabel('');this._Combo.SetEnabled(false);}; +var FCKToolbarStyleCombo=function(A,B){if (A===false) return;this.CommandName='Style';this.Label=this.GetLabel();this.Tooltip=A?A:this.Label;this.Style=B?B:2;this.DefaultLabel=FCKConfig.DefaultStyleLabel||'';};FCKToolbarStyleCombo.prototype=new FCKToolbarSpecialCombo;FCKToolbarStyleCombo.prototype.GetLabel=function(){return FCKLang.Style;};FCKToolbarStyleCombo.prototype.GetStyles=function(){var A={};var B=FCK.ToolbarSet.CurrentInstance.Styles.GetStyles();for (var C in B){var D=B[C];if (!D.IsCore) A[C]=D;};return A;};FCKToolbarStyleCombo.prototype.CreateItems=function(A){var B=A._Panel.Document;FCKTools.AppendStyleSheet(B,FCKConfig.ToolbarComboPreviewCSS);FCKTools.AppendStyleString(B,FCKConfig.EditorAreaStyles);B.body.className+=' ForceBaseFont';FCKConfig.ApplyBodyAttributes(B.body);var C=this.GetStyles();for (var D in C){var E=C[D];var F=E.GetType()==2?D:FCKToolbarStyleCombo_BuildPreview(E,E.Label||D);var G=A.AddItem(D,F);G.Style=E;};A.OnBeforeClick=this.StyleCombo_OnBeforeClick;};FCKToolbarStyleCombo.prototype.RefreshActiveItems=function(A){var B=FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement(true);if (B){var C=new FCKElementPath(B);var D=C.Elements;for (var e=0;e');var E=A.Element;if (E=='bdo') E='span';D=['<',E];var F=A._StyleDesc.Attributes;if (F){for (var G in F){D.push(' ',G,'="',A.GetFinalAttributeValue(G),'"');}};if (A._GetStyleText().length>0) D.push(' style="',A.GetFinalStyleValue(),'"');D.push('>',B,'');if (C==0) D.push('
    ');return D.join('');}; +var FCKToolbarFontFormatCombo=function(A,B){if (A===false) return;this.CommandName='FontFormat';this.Label=this.GetLabel();this.Tooltip=A?A:this.Label;this.Style=B?B:2;this.NormalLabel='Normal';this.PanelWidth=190;this.DefaultLabel=FCKConfig.DefaultFontFormatLabel||'';};FCKToolbarFontFormatCombo.prototype=new FCKToolbarStyleCombo(false);FCKToolbarFontFormatCombo.prototype.GetLabel=function(){return FCKLang.FontFormat;};FCKToolbarFontFormatCombo.prototype.GetStyles=function(){var A={};var B=FCKLang['FontFormats'].split(';');var C={p:B[0],pre:B[1],address:B[2],h1:B[3],h2:B[4],h3:B[5],h4:B[6],h5:B[7],h6:B[8],div:B[9]||(B[0]+' (DIV)')};var D=FCKConfig.FontFormats.split(';');for (var i=0;i';G.open();G.write(''+H+''+document.getElementById('xToolbarSpace').innerHTML+'');G.close();if(FCKBrowserInfo.IsAIR) FCKAdobeAIR.ToolbarSet_InitOutFrame(G);FCKTools.AddEventListener(G,'contextmenu',FCKTools.CancelEvent);FCKTools.AppendStyleSheet(G,FCKConfig.SkinEditorCSS);B=D.__FCKToolbarSet=new FCKToolbarSet(G);B._IFrame=F;if (FCK.IECleanup) FCK.IECleanup.AddItem(D,FCKToolbarSet_Target_Cleanup);};B.CurrentInstance=FCK;if (!B.ToolbarItems) B.ToolbarItems=FCKToolbarItems;FCK.AttachToOnSelectionChange(B.RefreshItemsState);return B;};function FCK_OnBlur(A){var B=A.ToolbarSet;if (B.CurrentInstance==A) B.Disable();};function FCK_OnFocus(A){var B=A.ToolbarSet;var C=A||FCK;B.CurrentInstance.FocusManager.RemoveWindow(B._IFrame.contentWindow);B.CurrentInstance=C;C.FocusManager.AddWindow(B._IFrame.contentWindow,true);B.Enable();};function FCKToolbarSet_Cleanup(){this._TargetElement=null;this._IFrame=null;};function FCKToolbarSet_Target_Cleanup(){this.__FCKToolbarSet=null;};var FCKToolbarSet=function(A){this._Document=A;this._TargetElement=A.getElementById('xToolbar');var B=A.getElementById('xExpandHandle');var C=A.getElementById('xCollapseHandle');B.title=FCKLang.ToolbarExpand;FCKTools.AddEventListener(B,'click',FCKToolbarSet_Expand_OnClick);C.title=FCKLang.ToolbarCollapse;FCKTools.AddEventListener(C,'click',FCKToolbarSet_Collapse_OnClick);if (!FCKConfig.ToolbarCanCollapse||FCKConfig.ToolbarStartExpanded) this.Expand();else this.Collapse();C.style.display=FCKConfig.ToolbarCanCollapse?'':'none';if (FCKConfig.ToolbarCanCollapse) C.style.display='';else A.getElementById('xTBLeftBorder').style.display='';this.Toolbars=[];this.IsLoaded=false;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKToolbarSet_Cleanup);};function FCKToolbarSet_Expand_OnClick(){FCK.ToolbarSet.Expand();};function FCKToolbarSet_Collapse_OnClick(){FCK.ToolbarSet.Collapse();};FCKToolbarSet.prototype.Expand=function(){this._ChangeVisibility(false);};FCKToolbarSet.prototype.Collapse=function(){this._ChangeVisibility(true);};FCKToolbarSet.prototype._ChangeVisibility=function(A){this._Document.getElementById('xCollapsed').style.display=A?'':'none';this._Document.getElementById('xExpanded').style.display=A?'none':'';if (FCKBrowserInfo.IsGecko){FCKTools.RunFunction(window.onresize);}};FCKToolbarSet.prototype.Load=function(A){this.Name=A;this.Items=[];this.ItemsWysiwygOnly=[];this.ItemsContextSensitive=[];this._TargetElement.innerHTML='';var B=FCKConfig.ToolbarSets[A];if (!B){alert(FCKLang.UnknownToolbarSet.replace(/%1/g,A));return;};this.Toolbars=[];for (var x=0;x0) break;}catch (e){break;};D=D.parent;};var E=D.document;var F=function(){if (!B) B=FCKConfig.FloatingPanelsZIndex+999;return++B;};var G=function(){if (!C) return;var H=FCKTools.IsStrictMode(E)?E.documentElement:E.body;FCKDomTools.SetElementStyles(C,{'width':Math.max(H.scrollWidth,H.clientWidth,E.scrollWidth||0)-1+'px','height':Math.max(H.scrollHeight,H.clientHeight,E.scrollHeight||0)-1+'px'});};return {OpenDialog:function(dialogName,dialogTitle,dialogPage,width,height,customValue,parentWindow,resizable){if (!A) this.DisplayMainCover();var I={Title:dialogTitle,Page:dialogPage,Editor:window,CustomValue:customValue,TopWindow:D};FCK.ToolbarSet.CurrentInstance.Selection.Save(true);var J=FCKTools.GetViewPaneSize(D);var K={ 'X':0,'Y':0 };var L=FCKBrowserInfo.IsIE&&(!FCKBrowserInfo.IsIE7||!FCKTools.IsStrictMode(D.document));if (L) K=FCKTools.GetScrollPosition(D);var M=Math.max(K.Y+(J.Height-height-20)/2,0);var N=Math.max(K.X+(J.Width-width-20)/2,0);var O=E.createElement('iframe');FCKTools.ResetStyles(O);O.src=FCKConfig.BasePath+'fckdialog.html';O.frameBorder=0;O.allowTransparency=true;FCKDomTools.SetElementStyles(O,{'position':(L)?'absolute':'fixed','top':M+'px','left':N+'px','width':width+'px','height':height+'px','zIndex':F()});O._DialogArguments=I;E.body.appendChild(O);O._ParentDialog=A;A=O;},OnDialogClose:function(dialogWindow){var O=dialogWindow.frameElement;FCKDomTools.RemoveNode(O);if (O._ParentDialog){A=O._ParentDialog;O._ParentDialog.contentWindow.SetEnabled(true);}else{if (!FCKBrowserInfo.IsIE) FCK.Focus();this.HideMainCover();setTimeout(function(){ A=null;},0);FCK.ToolbarSet.CurrentInstance.Selection.Release();}},DisplayMainCover:function(){C=E.createElement('div');FCKTools.ResetStyles(C);FCKDomTools.SetElementStyles(C,{'position':'absolute','zIndex':F(),'top':'0px','left':'0px','backgroundColor':FCKConfig.BackgroundBlockerColor});FCKDomTools.SetOpacity(C,FCKConfig.BackgroundBlockerOpacity);if (FCKBrowserInfo.IsIE&&!FCKBrowserInfo.IsIE7){var Q=E.createElement('iframe');FCKTools.ResetStyles(Q);Q.hideFocus=true;Q.frameBorder=0;Q.src=FCKTools.GetVoidUrl();FCKDomTools.SetElementStyles(Q,{'width':'100%','height':'100%','position':'absolute','left':'0px','top':'0px','filter':'progid:DXImageTransform.Microsoft.Alpha(opacity=0)'});C.appendChild(Q);};FCKTools.AddEventListener(D,'resize',G);G();E.body.appendChild(C);FCKFocusManager.Lock();var R=FCK.ToolbarSet.CurrentInstance.GetInstanceObject('frameElement');R._fck_originalTabIndex=R.tabIndex;R.tabIndex=-1;},HideMainCover:function(){FCKDomTools.RemoveNode(C);FCKFocusManager.Unlock();var R=FCK.ToolbarSet.CurrentInstance.GetInstanceObject('frameElement');R.tabIndex=R._fck_originalTabIndex;FCKDomTools.ClearElementJSProperty(R,'_fck_originalTabIndex');},GetCover:function(){return C;}};})(); +var FCKMenuItem=function(A,B,C,D,E,F){this.Name=B;this.Label=C||B;this.IsDisabled=E;this.Icon=new FCKIcon(D);this.SubMenu=new FCKMenuBlockPanel();this.SubMenu.Parent=A;this.SubMenu.OnClick=FCKTools.CreateEventListener(FCKMenuItem_SubMenu_OnClick,this);this.CustomData=F;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKMenuItem_Cleanup);};FCKMenuItem.prototype.AddItem=function(A,B,C,D,E){this.HasSubMenu=true;return this.SubMenu.AddItem(A,B,C,D,E);};FCKMenuItem.prototype.AddSeparator=function(){this.SubMenu.AddSeparator();};FCKMenuItem.prototype.Create=function(A){var B=this.HasSubMenu;var C=FCKTools.GetElementDocument(A);var r=this.MainElement=A.insertRow(-1);r.className=this.IsDisabled?'MN_Item_Disabled':'MN_Item';if (!this.IsDisabled){FCKTools.AddEventListenerEx(r,'mouseover',FCKMenuItem_OnMouseOver,[this]);FCKTools.AddEventListenerEx(r,'click',FCKMenuItem_OnClick,[this]);if (!B) FCKTools.AddEventListenerEx(r,'mouseout',FCKMenuItem_OnMouseOut,[this]);};var D=r.insertCell(-1);D.className='MN_Icon';D.appendChild(this.Icon.CreateIconElement(C));D=r.insertCell(-1);D.className='MN_Label';D.noWrap=true;D.appendChild(C.createTextNode(this.Label));D=r.insertCell(-1);if (B){D.className='MN_Arrow';var E=D.appendChild(C.createElement('IMG'));E.src=FCK_IMAGES_PATH+'arrow_'+FCKLang.Dir+'.gif';E.width=4;E.height=7;this.SubMenu.Create();this.SubMenu.Panel.OnHide=FCKTools.CreateEventListener(FCKMenuItem_SubMenu_OnHide,this);}};FCKMenuItem.prototype.Activate=function(){this.MainElement.className='MN_Item_Over';if (this.HasSubMenu){this.SubMenu.Show(this.MainElement.offsetWidth+2,-2,this.MainElement);};FCKTools.RunFunction(this.OnActivate,this);};FCKMenuItem.prototype.Deactivate=function(){this.MainElement.className='MN_Item';if (this.HasSubMenu) this.SubMenu.Hide();};function FCKMenuItem_SubMenu_OnClick(A,B){FCKTools.RunFunction(B.OnClick,B,[A]);};function FCKMenuItem_SubMenu_OnHide(A){A.Deactivate();};function FCKMenuItem_OnClick(A,B){if (B.HasSubMenu) B.Activate();else{B.Deactivate();FCKTools.RunFunction(B.OnClick,B,[B]);}};function FCKMenuItem_OnMouseOver(A,B){B.Activate();};function FCKMenuItem_OnMouseOut(A,B){B.Deactivate();};function FCKMenuItem_Cleanup(){this.MainElement=null;}; +var FCKMenuBlock=function(){this._Items=[];};FCKMenuBlock.prototype.Count=function(){return this._Items.length;};FCKMenuBlock.prototype.AddItem=function(A,B,C,D,E){var F=new FCKMenuItem(this,A,B,C,D,E);F.OnClick=FCKTools.CreateEventListener(FCKMenuBlock_Item_OnClick,this);F.OnActivate=FCKTools.CreateEventListener(FCKMenuBlock_Item_OnActivate,this);this._Items.push(F);return F;};FCKMenuBlock.prototype.AddSeparator=function(){this._Items.push(new FCKMenuSeparator());};FCKMenuBlock.prototype.RemoveAllItems=function(){this._Items=[];var A=this._ItemsTable;if (A){while (A.rows.length>0) A.deleteRow(0);}};FCKMenuBlock.prototype.Create=function(A){if (!this._ItemsTable){if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKMenuBlock_Cleanup);this._Window=FCKTools.GetElementWindow(A);var B=FCKTools.GetElementDocument(A);var C=A.appendChild(B.createElement('table'));C.cellPadding=0;C.cellSpacing=0;FCKTools.DisableSelection(C);var D=C.insertRow(-1).insertCell(-1);D.className='MN_Menu';var E=this._ItemsTable=D.appendChild(B.createElement('table'));E.cellPadding=0;E.cellSpacing=0;};for (var i=0;i0&&F.href.length==0);if (G) return;menu.AddSeparator();menu.AddItem('VisitLink',FCKLang.VisitLink);menu.AddSeparator();if (E) menu.AddItem('Link',FCKLang.EditLink,34);menu.AddItem('Unlink',FCKLang.RemoveLink,35);}}};case 'Image':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&!tag.getAttribute('_fckfakelement')){menu.AddSeparator();menu.AddItem('Image',FCKLang.ImageProperties,37);}}};case 'Anchor':return {AddItems:function(menu,tag,tagName){var F=FCKSelection.MoveToAncestorNode('A');var G=(F&&F.name.length>0);if (G||(tagName=='IMG'&&tag.getAttribute('_fckanchor'))){menu.AddSeparator();menu.AddItem('Anchor',FCKLang.AnchorProp,36);menu.AddItem('AnchorDelete',FCKLang.AnchorDelete);}}};case 'Flash':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckflash')){menu.AddSeparator();menu.AddItem('Flash',FCKLang.FlashProperties,38);}}};case 'Form':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('FORM')){menu.AddSeparator();menu.AddItem('Form',FCKLang.FormProp,48);}}};case 'Checkbox':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='checkbox'){menu.AddSeparator();menu.AddItem('Checkbox',FCKLang.CheckboxProp,49);}}};case 'Radio':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='radio'){menu.AddSeparator();menu.AddItem('Radio',FCKLang.RadioButtonProp,50);}}};case 'TextField':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='text'||tag.type=='password')){menu.AddSeparator();menu.AddItem('TextField',FCKLang.TextFieldProp,51);}}};case 'HiddenField':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckinputhidden')){menu.AddSeparator();menu.AddItem('HiddenField',FCKLang.HiddenFieldProp,56);}}};case 'ImageButton':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='image'){menu.AddSeparator();menu.AddItem('ImageButton',FCKLang.ImageButtonProp,55);}}};case 'Button':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='button'||tag.type=='submit'||tag.type=='reset')){menu.AddSeparator();menu.AddItem('Button',FCKLang.ButtonProp,54);}}};case 'Select':return {AddItems:function(menu,tag,tagName){if (tagName=='SELECT'){menu.AddSeparator();menu.AddItem('Select',FCKLang.SelectionFieldProp,53);}}};case 'Textarea':return {AddItems:function(menu,tag,tagName){if (tagName=='TEXTAREA'){menu.AddSeparator();menu.AddItem('Textarea',FCKLang.TextareaProp,52);}}};case 'BulletedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('UL')){menu.AddSeparator();menu.AddItem('BulletedList',FCKLang.BulletedListProp,27);}}};case 'NumberedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('OL')){menu.AddSeparator();menu.AddItem('NumberedList',FCKLang.NumberedListProp,26);}}};case 'DivContainer':return {AddItems:function(menu,tag,tagName){var J=FCKDomTools.GetSelectedDivContainers();if (J.length>0){menu.AddSeparator();menu.AddItem('EditDiv',FCKLang.EditDiv,75);menu.AddItem('DeleteDiv',FCKLang.DeleteDiv,76);}}};};return null;};function FCK_ContextMenu_OnBeforeOpen(){FCK.Events.FireEvent('OnSelectionChange');var A,sTagName;if ((A=FCKSelection.GetSelectedElement())) sTagName=A.tagName;var B=FCK.ContextMenu._InnerContextMenu;B.RemoveAllItems();var C=FCK.ContextMenu.Listeners;for (var i=0;i0){D=A.substr(0,B.index);this._sourceHtml=A.substr(B.index);}else{C=true;D=B[0];this._sourceHtml=A.substr(B[0].length);}}else{D=A;this._sourceHtml=null;};return { 'isTag':C,'value':D };},Each:function(A){var B;while ((B=this.Next())) A(B.isTag,B.value);}};var FCKHtmlIterator=function(A){this._sourceHtml=A;};FCKHtmlIterator.prototype={Next:function(){var A=this._sourceHtml;if (A==null) return null;var B=FCKRegexLib.HtmlTag.exec(A);var C=false;var D="";if (B){if (B.index>0){D=A.substr(0,B.index);this._sourceHtml=A.substr(B.index);}else{C=true;D=B[0];this._sourceHtml=A.substr(B[0].length);}}else{D=A;this._sourceHtml=null;};return { 'isTag':C,'value':D };},Each:function(A){var B;while ((B=this.Next())) A(B.isTag,B.value);}}; +var FCKPlugin=function(A,B,C){this.Name=A;this.BasePath=C?C:FCKConfig.PluginsPath;this.Path=this.BasePath+A+'/';if (!B||B.length==0) this.AvailableLangs=[];else this.AvailableLangs=B.split(',');};FCKPlugin.prototype.Load=function(){if (this.AvailableLangs.length>0){var A;if (this.AvailableLangs.IndexOf(FCKLanguageManager.ActiveLanguage.Code)>=0) A=FCKLanguageManager.ActiveLanguage.Code;else A=this.AvailableLangs[0];LoadScript(this.Path+'lang/'+A+'.js');};LoadScript(this.Path+'fckplugin.js');}; +var FCKPlugins=FCK.Plugins={};FCKPlugins.ItemsCount=0;FCKPlugins.Items={};FCKPlugins.Load=function(){var A=FCKPlugins.Items;for (var i=0;i", +DlgInfoTab : "Info", +DlgAlertUrl : "Voeg asseblief die URL in", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Taal rigting", +DlgGenLangDirLtr : "Links na regs (LTR)", +DlgGenLangDirRtl : "Regs na links (RTL)", +DlgGenLangCode : "Taal kode", +DlgGenAccessKey : "Toegang sleutel", +DlgGenName : "Naam", +DlgGenTabIndex : "Tab Index", +DlgGenLongDescr : "Lang beskreiwing URL", +DlgGenClass : "Skakel Tiepe", +DlgGenTitle : "Voorbeveelings Titel", +DlgGenContType : "Voorbeveelings inhoud soort", +DlgGenLinkCharset : "Geskakelde voorbeeld karakterstel", +DlgGenStyle : "Styl", + +// Image Dialog +DlgImgTitle : "Beeld eienskappe", +DlgImgInfoTab : "Beeld informasie", +DlgImgBtnUpload : "Stuur dit na die Server", +DlgImgURL : "URL", +DlgImgUpload : "Uplaai", +DlgImgAlt : "Alternatiewe beskrywing", +DlgImgWidth : "Weidte", +DlgImgHeight : "Hoogde", +DlgImgLockRatio : "Behou preporsie", +DlgBtnResetSize : "Herstel groote", +DlgImgBorder : "Kant", +DlgImgHSpace : "HSpasie", +DlgImgVSpace : "VSpasie", +DlgImgAlign : "Paradeer", +DlgImgAlignLeft : "Links", +DlgImgAlignAbsBottom: "Abs Onder", +DlgImgAlignAbsMiddle: "Abs Middel", +DlgImgAlignBaseline : "Baseline", +DlgImgAlignBottom : "Onder", +DlgImgAlignMiddle : "Middel", +DlgImgAlignRight : "Regs", +DlgImgAlignTextTop : "Text Bo", +DlgImgAlignTop : "Bo", +DlgImgPreview : "Voorskou", +DlgImgAlertUrl : "Voeg asseblief Beeld URL in.", +DlgImgLinkTab : "Skakel", + +// Flash Dialog +DlgFlashTitle : "Flash eienskappe", +DlgFlashChkPlay : "Automaties Speel", +DlgFlashChkLoop : "Herhaling", +DlgFlashChkMenu : "Laat Flash Menu toe", +DlgFlashScale : "Scale", +DlgFlashScaleAll : "Wys alles", +DlgFlashScaleNoBorder : "Geen kante", +DlgFlashScaleFit : "Presiese pas", + +// Link Dialog +DlgLnkWindowTitle : "Skakel", +DlgLnkInfoTab : "Skakel informasie", +DlgLnkTargetTab : "Mikpunt", + +DlgLnkType : "Skakel soort", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Skakel na plekhouers in text", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protokol", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Kies 'n plekhouer", +DlgLnkAnchorByName : "Volgens plekhouer naam", +DlgLnkAnchorById : "Volgens element Id", +DlgLnkNoAnchors : "(Geen plekhouers beskikbaar in dokument}", +DlgLnkEMail : "E-Mail Adres", +DlgLnkEMailSubject : "Boodskap Opskrif", +DlgLnkEMailBody : "Boodskap Inhoud", +DlgLnkUpload : "Oplaai", +DlgLnkBtnUpload : "Stuur na Server", + +DlgLnkTarget : "Mikpunt", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Nuwe Venster (_blank)", +DlgLnkTargetParent : "Vorige Venster (_parent)", +DlgLnkTargetSelf : "Selfde Venster (_self)", +DlgLnkTargetTop : "Boonste Venster (_top)", +DlgLnkTargetFrameName : "Mikpunt Venster Naam", +DlgLnkPopWinName : "Popup Venster Naam", +DlgLnkPopWinFeat : "Popup Venster Geaartheid", +DlgLnkPopResize : "Verstelbare Groote", +DlgLnkPopLocation : "Adres Balk", +DlgLnkPopMenu : "Menu Balk", +DlgLnkPopScroll : "Gleibalkstuk", +DlgLnkPopStatus : "Status Balk", +DlgLnkPopToolbar : "Gereedskap Balk", +DlgLnkPopFullScrn : "Voll Skerm (IE)", +DlgLnkPopDependent : "Afhanklik (Netscape)", +DlgLnkPopWidth : "Weite", +DlgLnkPopHeight : "Hoogde", +DlgLnkPopLeft : "Links Posisie", +DlgLnkPopTop : "Bo Posisie", + +DlnLnkMsgNoUrl : "Voeg asseblief die URL in", +DlnLnkMsgNoEMail : "Voeg asseblief die e-mail adres in", +DlnLnkMsgNoAnchor : "Kies asseblief 'n plekhouer", +DlnLnkMsgInvPopName : "Die popup naam moet begin met alphabetiese karakters sonder spasies.", + +// Color Dialog +DlgColorTitle : "Kies Kleur", +DlgColorBtnClear : "Maak skoon", +DlgColorHighlight : "Highlight", +DlgColorSelected : "Geselekteer", + +// Smiley Dialog +DlgSmileyTitle : "Voeg Smiley by", + +// Special Character Dialog +DlgSpecialCharTitle : "Kies spesiale karakter", + +// Table Dialog +DlgTableTitle : "Tabel eienskappe", +DlgTableRows : "Reie", +DlgTableColumns : "Kolome", +DlgTableBorder : "Kant groote", +DlgTableAlign : "Parideering", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Links", +DlgTableAlignCenter : "Middel", +DlgTableAlignRight : "Regs", +DlgTableWidth : "Weite", +DlgTableWidthPx : "pixels", +DlgTableWidthPc : "percent", +DlgTableHeight : "Hoogde", +DlgTableCellSpace : "Cell spasieering", +DlgTableCellPad : "Cell buffer", +DlgTableCaption : "Beskreiwing", +DlgTableSummary : "Opsomming", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Cell eienskappe", +DlgCellWidth : "Weite", +DlgCellWidthPx : "pixels", +DlgCellWidthPc : "percent", +DlgCellHeight : "Hoogde", +DlgCellWordWrap : "Woord Wrap", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Ja", +DlgCellWordWrapNo : "Nee", +DlgCellHorAlign : "Horisontale rigting", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Links", +DlgCellHorAlignCenter : "Middel", +DlgCellHorAlignRight: "Regs", +DlgCellVerAlign : "Vertikale rigting", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Bo", +DlgCellVerAlignMiddle : "Middel", +DlgCellVerAlignBottom : "Onder", +DlgCellVerAlignBaseline : "Baseline", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Rei strekking", +DlgCellCollSpan : "Kolom strekking", +DlgCellBackColor : "Agtergrond Kleur", +DlgCellBorderColor : "Kant Kleur", +DlgCellBtnSelect : "Keuse...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", //MISSING + +// Find Dialog +DlgFindTitle : "Vind", +DlgFindFindBtn : "Vind", +DlgFindNotFoundMsg : "Die gespesifiseerde karakters word nie gevind nie.", + +// Replace Dialog +DlgReplaceTitle : "Vervang", +DlgReplaceFindLbl : "Soek wat:", +DlgReplaceReplaceLbl : "Vervang met:", +DlgReplaceCaseChk : "Vergelyk karakter skryfweise", +DlgReplaceReplaceBtn : "Vervang", +DlgReplaceReplAllBtn : "Vervang alles", +DlgReplaceWordChk : "Vergelyk komplete woord", + +// Paste Operations / Dialog +PasteErrorCut : "U browser se sekuriteit instelling behinder die uitsny aksie. Gebruik asseblief die sleutel kombenasie(Ctrl+X).", +PasteErrorCopy : "U browser se sekuriteit instelling behinder die kopieerings aksie. Gebruik asseblief die sleutel kombenasie(Ctrl+C).", + +PasteAsText : "Voeg slegs karakters by", +PasteFromWord : "Byvoeging uit Word", + +DlgPasteMsg2 : "Voeg asseblief die inhoud in die gegewe box by met sleutel kombenasie(Ctrl+V) en druk OK.", +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", //MISSING +DlgPasteIgnoreFont : "Ignoreer karakter soort defenisies", +DlgPasteRemoveStyles : "Verweider Styl defenisies", + +// Color Picker +ColorAutomatic : "Automaties", +ColorMoreColors : "Meer Kleure...", + +// Document Properties +DocProps : "Dokument Eienskappe", + +// Anchor Dialog +DlgAnchorTitle : "Plekhouer Eienskappe", +DlgAnchorName : "Plekhouer Naam", +DlgAnchorErrorName : "Voltooi die plekhouer naam asseblief", + +// Speller Pages Dialog +DlgSpellNotInDic : "Nie in woordeboek nie", +DlgSpellChangeTo : "Verander na", +DlgSpellBtnIgnore : "Ignoreer", +DlgSpellBtnIgnoreAll : "Ignoreer na-volgende", +DlgSpellBtnReplace : "Vervang", +DlgSpellBtnReplaceAll : "vervang na-volgende", +DlgSpellBtnUndo : "Ont-skep", +DlgSpellNoSuggestions : "- Geen voorstel -", +DlgSpellProgress : "Spelling word beproef...", +DlgSpellNoMispell : "Spellproef kompleet: Geen foute", +DlgSpellNoChanges : "Spellproef kompleet: Geen woord veranderings", +DlgSpellOneChange : "Spellproef kompleet: Een woord verander", +DlgSpellManyChanges : "Spellproef kompleet: %1 woorde verander", + +IeSpellDownload : "Geen Spellproefer geinstaleer nie. Wil U dit aflaai?", + +// Button Dialog +DlgButtonText : "Karakters (Waarde)", +DlgButtonType : "Soort", +DlgButtonTypeBtn : "Knop", +DlgButtonTypeSbm : "Indien", +DlgButtonTypeRst : "Reset", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Naam", +DlgCheckboxValue : "Waarde", +DlgCheckboxSelected : "Uitgekies", + +// Form Dialog +DlgFormName : "Naam", +DlgFormAction : "Aksie", +DlgFormMethod : "Metode", + +// Select Field Dialog +DlgSelectName : "Naam", +DlgSelectValue : "Waarde", +DlgSelectSize : "Grote", +DlgSelectLines : "lyne", +DlgSelectChkMulti : "Laat meerere keuses toe", +DlgSelectOpAvail : "Beskikbare Opsies", +DlgSelectOpText : "Karakters", +DlgSelectOpValue : "Waarde", +DlgSelectBtnAdd : "Byvoeg", +DlgSelectBtnModify : "Verander", +DlgSelectBtnUp : "Op", +DlgSelectBtnDown : "Af", +DlgSelectBtnSetValue : "Stel as uitgekiesde waarde", +DlgSelectBtnDelete : "Verweider", + +// Textarea Dialog +DlgTextareaName : "Naam", +DlgTextareaCols : "Kolom", +DlgTextareaRows : "Reie", + +// Text Field Dialog +DlgTextName : "Naam", +DlgTextValue : "Waarde", +DlgTextCharWidth : "Karakter weite", +DlgTextMaxChars : "Maximale karakters", +DlgTextType : "Soort", +DlgTextTypeText : "Karakters", +DlgTextTypePass : "Wagwoord", + +// Hidden Field Dialog +DlgHiddenName : "Naam", +DlgHiddenValue : "Waarde", + +// Bulleted List Dialog +BulletedListProp : "Gepunkte lys eienskappe", +NumberedListProp : "Genommerde lys eienskappe", +DlgLstStart : "Begin", +DlgLstType : "Soort", +DlgLstTypeCircle : "Sirkel", +DlgLstTypeDisc : "Skyf", +DlgLstTypeSquare : "Vierkant", +DlgLstTypeNumbers : "Nommer (1, 2, 3)", +DlgLstTypeLCase : "Klein Letters (a, b, c)", +DlgLstTypeUCase : "Hoof Letters (A, B, C)", +DlgLstTypeSRoman : "Klein Romeinse nommers (i, ii, iii)", +DlgLstTypeLRoman : "Groot Romeinse nommers (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Algemeen", +DlgDocBackTab : "Agtergrond", +DlgDocColorsTab : "Kleure en Rante", +DlgDocMetaTab : "Meta Data", + +DlgDocPageTitle : "Bladsy Opskrif", +DlgDocLangDir : "Taal rigting", +DlgDocLangDirLTR : "Link na Regs (LTR)", +DlgDocLangDirRTL : "Regs na Links (RTL)", +DlgDocLangCode : "Taal Kode", +DlgDocCharSet : "Karakterstel Kodeering", +DlgDocCharSetCE : "Sentraal Europa", +DlgDocCharSetCT : "Chinees Traditioneel (Big5)", +DlgDocCharSetCR : "Cyrillic", +DlgDocCharSetGR : "Grieks", +DlgDocCharSetJP : "Japanees", +DlgDocCharSetKR : "Koreans", +DlgDocCharSetTR : "Turks", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Western European", +DlgDocCharSetOther : "Ander Karakterstel Kodeering", + +DlgDocDocType : "Dokument Opskrif Soort", +DlgDocDocTypeOther : "Ander Dokument Opskrif Soort", +DlgDocIncXHTML : "Voeg XHTML verklaring by", +DlgDocBgColor : "Agtergrond kleur", +DlgDocBgImage : "Agtergrond Beeld URL", +DlgDocBgNoScroll : "Vasgeklemde Agtergrond", +DlgDocCText : "Karakters", +DlgDocCLink : "Skakel", +DlgDocCVisited : "Besoekte Skakel", +DlgDocCActive : "Aktiewe Skakel", +DlgDocMargins : "Bladsy Rante", +DlgDocMaTop : "Bo", +DlgDocMaLeft : "Links", +DlgDocMaRight : "Regs", +DlgDocMaBottom : "Onder", +DlgDocMeIndex : "Dokument Index Sleutelwoorde(comma verdeelt)", +DlgDocMeDescr : "Dokument Beskrywing", +DlgDocMeAuthor : "Skrywer", +DlgDocMeCopy : "Kopiereg", +DlgDocPreview : "Voorskou", + +// Templates Dialog +Templates : "Templates", +DlgTemplatesTitle : "Inhoud Templates", +DlgTemplatesSelMsg : "Kies die template om te gebruik in die editor
    (Inhoud word vervang!):", +DlgTemplatesLoading : "Templates word gelaai. U geduld asseblief...", +DlgTemplatesNoTpl : "(Geen templates gedefinieerd)", +DlgTemplatesReplace : "Vervang bestaande inhoud", + +// About Dialog +DlgAboutAboutTab : "Meer oor", +DlgAboutBrowserInfoTab : "Blaai Informasie deur", +DlgAboutLicenseTab : "Lesensie", +DlgAboutVersion : "weergawe", +DlgAboutInfo : "Vir meer informasie gaan na ", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/ar.js b/webdir/fckeditor/editor/lang/ar.js new file mode 100644 index 0000000..5efa4ee --- /dev/null +++ b/webdir/fckeditor/editor/lang/ar.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Arabic language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "rtl", + +ToolbarCollapse : "ضم شريط الأدوات", +ToolbarExpand : "تمدد شريط الأدوات", + +// Toolbar Items and Context Menu +Save : "Ø­Ùظ", +NewPage : "صÙحة جديدة", +Preview : "معاينة الصÙحة", +Cut : "قص", +Copy : "نسخ", +Paste : "لصق", +PasteText : "لصق كنص بسيط", +PasteWord : "لصق من وورد", +Print : "طباعة", +SelectAll : "تحديد الكل", +RemoveFormat : "إزالة التنسيقات", +InsertLinkLbl : "رابط", +InsertLink : "إدراج/تحرير رابط", +RemoveLink : "إزالة رابط", +VisitLink : "اÙتح الرابط", +Anchor : "إدراج/تحرير إشارة مرجعية", +AnchorDelete : "إزالة إشارة مرجعية", +InsertImageLbl : "صورة", +InsertImage : "إدراج/تحرير صورة", +InsertFlashLbl : "Ùلاش", +InsertFlash : "إدراج/تحرير Ùيلم Ùلاش", +InsertTableLbl : "جدول", +InsertTable : "إدراج/تحرير جدول", +InsertLineLbl : "خط Ùاصل", +InsertLine : "إدراج خط Ùاصل", +InsertSpecialCharLbl: "رموز", +InsertSpecialChar : "إدراج رموز..Ù", +InsertSmileyLbl : "ابتسامات", +InsertSmiley : "إدراج ابتسامات", +About : "حول FCKeditor", +Bold : "غامق", +Italic : "مائل", +Underline : "تسطير", +StrikeThrough : "يتوسطه خط", +Subscript : "منخÙض", +Superscript : "مرتÙع", +LeftJustify : "محاذاة إلى اليسار", +CenterJustify : "توسيط", +RightJustify : "محاذاة إلى اليمين", +BlockJustify : "ضبط", +DecreaseIndent : "إنقاص المساÙØ© البادئة", +IncreaseIndent : "زيادة المساÙØ© البادئة", +Blockquote : "اقتباس", +CreateDiv : "إنشاء حاوية Div", +EditDiv : "تعديل حاوية Div", +DeleteDiv : "إزالة حاوية Div", +Undo : "تراجع", +Redo : "إعادة", +NumberedListLbl : "تعداد رقمي", +NumberedList : "إدراج/إلغاء تعداد رقمي", +BulletedListLbl : "تعداد نقطي", +BulletedList : "إدراج/إلغاء تعداد نقطي", +ShowTableBorders : "معاينة حدود الجداول", +ShowDetails : "معاينة التÙاصيل", +Style : "نمط", +FontFormat : "تنسيق", +Font : "خط", +FontSize : "حجم الخط", +TextColor : "لون النص", +BGColor : "لون الخلÙية", +Source : "Ø´Ùرة المصدر", +Find : "بحث", +Replace : "إستبدال", +SpellCheck : "تدقيق إملائي", +UniversalKeyboard : "لوحة المÙاتيح العالمية", +PageBreakLbl : "Ùصل الصÙحة", +PageBreak : "إدخال صÙحة جديدة", + +Form : "نموذج", +Checkbox : "خانة إختيار", +RadioButton : "زر خيار", +TextField : "مربع نص", +Textarea : "ناحية نص", +HiddenField : "إدراج حقل Ø®ÙÙŠ", +Button : "زر ضغط", +SelectionField : "قائمة منسدلة", +ImageButton : "زر صورة", + +FitWindow : "تكبير حجم المحرر", +ShowBlocks : "مخطط تÙصيلي", + +// Context Menu +EditLink : "تحرير رابط", +CellCM : "خلية", +RowCM : "صÙ", +ColumnCM : "عمود", +InsertRowAfter : "إدراج ص٠بعد", +InsertRowBefore : "إدراج ص٠قبل", +DeleteRows : "حذ٠صÙÙˆÙ", +InsertColumnAfter : "إدراج عمود بعد", +InsertColumnBefore : "إدراج عمود قبل", +DeleteColumns : "حذ٠أعمدة", +InsertCellAfter : "إدراج خلية بعد", +InsertCellBefore : "إدراج خلية قبل", +DeleteCells : "حذ٠خلايا", +MergeCells : "دمج خلايا", +MergeRight : "دمج لليمين", +MergeDown : "دمج للأسÙÙ„", +HorizontalSplitCell : "تقسيم الخلية Ø£Ùقياً", +VerticalSplitCell : "تقسيم الخلية عمودياً", +TableDelete : "حذ٠الجدول", +CellProperties : "خصائص الخلية", +TableProperties : "خصائص الجدول", +ImageProperties : "خصائص الصورة", +FlashProperties : "خصائص Ùيلم الÙلاش", + +AnchorProp : "خصائص الإشارة المرجعية", +ButtonProp : "خصائص زر الضغط", +CheckboxProp : "خصائص خانة الإختيار", +HiddenFieldProp : "خصائص الحقل الخÙÙŠ", +RadioButtonProp : "خصائص زر الخيار", +ImageButtonProp : "خصائص زر الصورة", +TextFieldProp : "خصائص مربع النص", +SelectionFieldProp : "خصائص القائمة المنسدلة", +TextareaProp : "خصائص ناحية النص", +FormProp : "خصائص النموذج", + +FontFormats : "عادي;منسّق;دوس;العنوان 1;العنوان 2;العنوان 3;العنوان 4;العنوان 5;العنوان 6", + +// Alerts and Messages +ProcessingXHTML : "إنتظر قليلاً ريثما تتم معالَجة†XHTML. لن يستغرق طويلاً...", +Done : "تم", +PasteWordConfirm : "يبدو أن النص المراد لصقه منسوخ من برنامج وورد. هل تود تنظيÙÙ‡ قبل الشروع ÙÙŠ عملية اللصق؟", +NotCompatiblePaste : "هذه الميزة تحتاج لمتصÙØ­ من النوعInternet Explorer إصدار 5.5 Ùما Ùوق. هل تود اللصق دون تنظي٠الكود؟", +UnknownToolbarItem : "عنصر شريط أدوات غير معرو٠\"%1\"", +UnknownCommand : "أمر غير معرو٠\"%1\"", +NotImplemented : "لم يتم دعم هذا الأمر", +UnknownToolbarSet : "لم أتمكن من العثور على طقم الأدوات \"%1\" ", +NoActiveX : "لتأمين متصÙحك يجب أن تحدد بعض مميزات المحرر. يتوجب عليك تمكين الخيار \"Run ActiveX controls and plug-ins\". قد تواجة أخطاء وتلاحظ مميزات Ù…Ùقودة", +BrowseServerBlocked : "لايمكن Ùتح مصدر المتصÙØ­. Ùضلا يجب التأكد بأن جميع موانع النواÙØ° المنبثقة معطلة", +DialogBlocked : "لايمكن Ùتح ناÙذة الحوار . Ùضلا تأكد من أن مانع النواÙØ° المنبثة معطل .", +VisitLinkBlocked : "لا يمكن Ùتح ناÙذة جديدة. تأكد من إيقا٠كل مانعي Ùتح النواÙØ° من العمل.", + +// Dialogs +DlgBtnOK : "مواÙÙ‚", +DlgBtnCancel : "إلغاء الأمر", +DlgBtnClose : "إغلاق", +DlgBtnBrowseServer : "تصÙØ­ الخادم", +DlgAdvancedTag : "متقدم", +DlgOpOther : "<أخرى>", +DlgInfoTab : "معلومات", +DlgAlertUrl : "الرجاء كتابة عنوان الإنترنت", + +// General Dialogs Labels +DlgGenNotSet : "<بدون تحديد>", +DlgGenId : "الرقم", +DlgGenLangDir : "إتجاه النص", +DlgGenLangDirLtr : "اليسار لليمين (LTR)", +DlgGenLangDirRtl : "اليمين لليسار (RTL)", +DlgGenLangCode : "رمز اللغة", +DlgGenAccessKey : "Ù…Ùاتيح الإختصار", +DlgGenName : "الاسم", +DlgGenTabIndex : "الترتيب", +DlgGenLongDescr : "عنوان الوص٠المÙصّل", +DlgGenClass : "Ùئات التنسيق", +DlgGenTitle : "تلميح الشاشة", +DlgGenContType : "نوع التلميح", +DlgGenLinkCharset : "ترميز المادة المطلوبة", +DlgGenStyle : "نمط", + +// Image Dialog +DlgImgTitle : "خصائص الصورة", +DlgImgInfoTab : "معلومات الصورة", +DlgImgBtnUpload : "أرسلها للخادم", +DlgImgURL : "موقع الصورة", +DlgImgUpload : "رÙع", +DlgImgAlt : "الوصÙ", +DlgImgWidth : "العرض", +DlgImgHeight : "الإرتÙاع", +DlgImgLockRatio : "تناسق الحجم", +DlgBtnResetSize : "إستعادة الحجم الأصلي", +DlgImgBorder : "سمك الحدود", +DlgImgHSpace : "تباعد Ø£Ùقي", +DlgImgVSpace : "تباعد عمودي", +DlgImgAlign : "محاذاة", +DlgImgAlignLeft : "يسار", +DlgImgAlignAbsBottom: "أسÙÙ„ النص", +DlgImgAlignAbsMiddle: "وسط السطر", +DlgImgAlignBaseline : "على السطر", +DlgImgAlignBottom : "أسÙÙ„", +DlgImgAlignMiddle : "وسط", +DlgImgAlignRight : "يمين", +DlgImgAlignTextTop : "أعلى النص", +DlgImgAlignTop : "أعلى", +DlgImgPreview : "معاينة", +DlgImgAlertUrl : "Ùضلاً أكتب الموقع الذي توجد عليه هذه الصورة.", +DlgImgLinkTab : "الرابط", + +// Flash Dialog +DlgFlashTitle : "خصائص Ùيلم الÙلاش", +DlgFlashChkPlay : "تشغيل تلقائي", +DlgFlashChkLoop : "تكرار", +DlgFlashChkMenu : "تمكين قائمة Ùيلم الÙلاش", +DlgFlashScale : "الحجم", +DlgFlashScaleAll : "إظهار الكل", +DlgFlashScaleNoBorder : "بلا حدود", +DlgFlashScaleFit : "ضبط تام", + +// Link Dialog +DlgLnkWindowTitle : "إرتباط تشعبي", +DlgLnkInfoTab : "معلومات الرابط", +DlgLnkTargetTab : "الهدÙ", + +DlgLnkType : "نوع الربط", +DlgLnkTypeURL : "العنوان", +DlgLnkTypeAnchor : "مكان ÙÙŠ هذا المستند", +DlgLnkTypeEMail : "بريد إلكتروني", +DlgLnkProto : "البروتوكول", +DlgLnkProtoOther : "<أخرى>", +DlgLnkURL : "الموقع", +DlgLnkAnchorSel : "اختر علامة مرجعية", +DlgLnkAnchorByName : "حسب اسم العلامة", +DlgLnkAnchorById : "حسب تعري٠العنصر", +DlgLnkNoAnchors : "(لا يوجد علامات مرجعية ÙÙŠ هذا المستند)", +DlgLnkEMail : "عنوان بريد إلكتروني", +DlgLnkEMailSubject : "موضوع الرسالة", +DlgLnkEMailBody : "محتوى الرسالة", +DlgLnkUpload : "رÙع", +DlgLnkBtnUpload : "أرسلها للخادم", + +DlgLnkTarget : "الهدÙ", +DlgLnkTargetFrame : "<إطار>", +DlgLnkTargetPopup : "<ناÙذة منبثقة>", +DlgLnkTargetBlank : "إطار جديد (_blank)", +DlgLnkTargetParent : "الإطار الأصل (_parent)", +DlgLnkTargetSelf : "Ù†Ùس الإطار (_self)", +DlgLnkTargetTop : "صÙحة كاملة (_top)", +DlgLnkTargetFrameName : "اسم الإطار الهدÙ", +DlgLnkPopWinName : "تسمية الناÙذة المنبثقة", +DlgLnkPopWinFeat : "خصائص الناÙذة المنبثقة", +DlgLnkPopResize : "قابلة للتحجيم", +DlgLnkPopLocation : "شريط العنوان", +DlgLnkPopMenu : "القوائم الرئيسية", +DlgLnkPopScroll : "أشرطة التمرير", +DlgLnkPopStatus : "شريط الحالة السÙلي", +DlgLnkPopToolbar : "شريط الأدوات", +DlgLnkPopFullScrn : "ملئ الشاشة (IE)", +DlgLnkPopDependent : "تابع (Netscape)", +DlgLnkPopWidth : "العرض", +DlgLnkPopHeight : "الإرتÙاع", +DlgLnkPopLeft : "التمركز لليسار", +DlgLnkPopTop : "التمركز للأعلى", + +DlnLnkMsgNoUrl : "Ùضلاً أدخل عنوان الموقع الذي يشير إليه الرابط", +DlnLnkMsgNoEMail : "Ùضلاً أدخل عنوان البريد الإلكتروني", +DlnLnkMsgNoAnchor : "Ùضلاً حدد العلامة المرجعية المرغوبة", +DlnLnkMsgInvPopName : "اسم الناÙذة المنبثقة يجب أن يبدأ بحر٠أبجدي دون مساÙات", + +// Color Dialog +DlgColorTitle : "اختر لوناً", +DlgColorBtnClear : "مسح", +DlgColorHighlight : "تحديد", +DlgColorSelected : "إختيار", + +// Smiley Dialog +DlgSmileyTitle : "إدراج إبتسامات ", + +// Special Character Dialog +DlgSpecialCharTitle : "إدراج رمز", + +// Table Dialog +DlgTableTitle : "إدراج جدول", +DlgTableRows : "صÙÙˆÙ", +DlgTableColumns : "أعمدة", +DlgTableBorder : "سمك الحدود", +DlgTableAlign : "المحاذاة", +DlgTableAlignNotSet : "<بدون تحديد>", +DlgTableAlignLeft : "يسار", +DlgTableAlignCenter : "وسط", +DlgTableAlignRight : "يمين", +DlgTableWidth : "العرض", +DlgTableWidthPx : "بكسل", +DlgTableWidthPc : "بالمئة", +DlgTableHeight : "الإرتÙاع", +DlgTableCellSpace : "تباعد الخلايا", +DlgTableCellPad : "المساÙØ© البادئة", +DlgTableCaption : "الوصÙ", +DlgTableSummary : "الخلاصة", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "خصائص الخلية", +DlgCellWidth : "العرض", +DlgCellWidthPx : "بكسل", +DlgCellWidthPc : "بالمئة", +DlgCellHeight : "الإرتÙاع", +DlgCellWordWrap : "التÙا٠النص", +DlgCellWordWrapNotSet : "<بدون تحديد>", +DlgCellWordWrapYes : "نعم", +DlgCellWordWrapNo : "لا", +DlgCellHorAlign : "المحاذاة الأÙقية", +DlgCellHorAlignNotSet : "<بدون تحديد>", +DlgCellHorAlignLeft : "يسار", +DlgCellHorAlignCenter : "وسط", +DlgCellHorAlignRight: "يمين", +DlgCellVerAlign : "المحاذاة العمودية", +DlgCellVerAlignNotSet : "<بدون تحديد>", +DlgCellVerAlignTop : "أعلى", +DlgCellVerAlignMiddle : "وسط", +DlgCellVerAlignBottom : "أسÙÙ„", +DlgCellVerAlignBaseline : "على السطر", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "إمتداد الصÙÙˆÙ", +DlgCellCollSpan : "إمتداد الأعمدة", +DlgCellBackColor : "لون الخلÙية", +DlgCellBorderColor : "لون الحدود", +DlgCellBtnSelect : "حدّد...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "بحث واستبدال", + +// Find Dialog +DlgFindTitle : "بحث", +DlgFindFindBtn : "ابحث", +DlgFindNotFoundMsg : "لم يتم العثور على النص المحدد.", + +// Replace Dialog +DlgReplaceTitle : "إستبدال", +DlgReplaceFindLbl : "البحث عن:", +DlgReplaceReplaceLbl : "إستبدال بـ:", +DlgReplaceCaseChk : "مطابقة حالة الأحرÙ", +DlgReplaceReplaceBtn : "إستبدال", +DlgReplaceReplAllBtn : "إستبدال الكل", +DlgReplaceWordChk : "الكلمة بالكامل Ùقط", + +// Paste Operations / Dialog +PasteErrorCut : "الإعدادات الأمنية للمتصÙØ­ الذي تستخدمه تمنع القص التلقائي. Ùضلاً إستخدم لوحة المÙاتيح Ù„Ùعل ذلك (Ctrl+X).", +PasteErrorCopy : "الإعدادات الأمنية للمتصÙØ­ الذي تستخدمه تمنع النسخ التلقائي. Ùضلاً إستخدم لوحة المÙاتيح Ù„Ùعل ذلك (Ctrl+C).", + +PasteAsText : "لصق كنص بسيط", +PasteFromWord : "لصق من وورد", + +DlgPasteMsg2 : "الصق داخل الصندوق بإستخدام زرّي (Ctrl+V) ÙÙŠ لوحة المÙاتيح، ثم اضغط زر مواÙÙ‚.", +DlgPasteSec : "نظراً لإعدادات الأمان الخاصة بمتصÙحك، لن يتمكن هذا المحرر من الوصول لمحتوى حاÙظتك، لذا وجب عليك لصق المحتوى مرة أخرى ÙÙŠ هذه الناÙذة.", +DlgPasteIgnoreFont : "تجاهل تعريÙات أسماء الخطوط", +DlgPasteRemoveStyles : "إزالة تعريÙات الأنماط", + +// Color Picker +ColorAutomatic : "تلقائي", +ColorMoreColors : "ألوان إضاÙية...", + +// Document Properties +DocProps : "خصائص الصÙحة", + +// Anchor Dialog +DlgAnchorTitle : "خصائص إشارة مرجعية", +DlgAnchorName : "اسم الإشارة المرجعية", +DlgAnchorErrorName : "الرجاء كتابة اسم الإشارة المرجعية", + +// Speller Pages Dialog +DlgSpellNotInDic : "ليست ÙÙŠ القاموس", +DlgSpellChangeTo : "التغيير إلى", +DlgSpellBtnIgnore : "تجاهل", +DlgSpellBtnIgnoreAll : "تجاهل الكل", +DlgSpellBtnReplace : "تغيير", +DlgSpellBtnReplaceAll : "تغيير الكل", +DlgSpellBtnUndo : "تراجع", +DlgSpellNoSuggestions : "- لا توجد إقتراحات -", +DlgSpellProgress : "جاري التدقيق إملائياً", +DlgSpellNoMispell : "تم إكمال التدقيق الإملائي: لم يتم العثور على أي أخطاء إملائية", +DlgSpellNoChanges : "تم إكمال التدقيق الإملائي: لم يتم تغيير أي كلمة", +DlgSpellOneChange : "تم إكمال التدقيق الإملائي: تم تغيير كلمة واحدة Ùقط", +DlgSpellManyChanges : "تم إكمال التدقيق الإملائي: تم تغيير %1 كلمات\كلمة", + +IeSpellDownload : "المدقق الإملائي (الإنجليزي) غير مثبّت. هل تود تحميله الآن؟", + +// Button Dialog +DlgButtonText : "القيمة/التسمية", +DlgButtonType : "نوع الزر", +DlgButtonTypeBtn : "زر", +DlgButtonTypeSbm : "إرسال", +DlgButtonTypeRst : "إعادة تعيين", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "الاسم", +DlgCheckboxValue : "القيمة", +DlgCheckboxSelected : "محدد", + +// Form Dialog +DlgFormName : "الاسم", +DlgFormAction : "اسم الملÙ", +DlgFormMethod : "الأسلوب", + +// Select Field Dialog +DlgSelectName : "الاسم", +DlgSelectValue : "القيمة", +DlgSelectSize : "الحجم", +DlgSelectLines : "الأسطر", +DlgSelectChkMulti : "السماح بتحديدات متعددة", +DlgSelectOpAvail : "الخيارات المتاحة", +DlgSelectOpText : "النص", +DlgSelectOpValue : "القيمة", +DlgSelectBtnAdd : "إضاÙØ©", +DlgSelectBtnModify : "تعديل", +DlgSelectBtnUp : "تحريك لأعلى", +DlgSelectBtnDown : "تحريك لأسÙÙ„", +DlgSelectBtnSetValue : "إجعلها محددة", +DlgSelectBtnDelete : "إزالة", + +// Textarea Dialog +DlgTextareaName : "الاسم", +DlgTextareaCols : "الأعمدة", +DlgTextareaRows : "الصÙÙˆÙ", + +// Text Field Dialog +DlgTextName : "الاسم", +DlgTextValue : "القيمة", +DlgTextCharWidth : "العرض بالأحرÙ", +DlgTextMaxChars : "عدد الحرو٠الأقصى", +DlgTextType : "نوع المحتوى", +DlgTextTypeText : "نص", +DlgTextTypePass : "كلمة مرور", + +// Hidden Field Dialog +DlgHiddenName : "الاسم", +DlgHiddenValue : "القيمة", + +// Bulleted List Dialog +BulletedListProp : "خصائص التعداد النقطي", +NumberedListProp : "خصائص التعداد الرقمي", +DlgLstStart : "البدء عند", +DlgLstType : "النوع", +DlgLstTypeCircle : "دائرة", +DlgLstTypeDisc : "قرص", +DlgLstTypeSquare : "مربع", +DlgLstTypeNumbers : "أرقام (1ØŒ 2ØŒ 3)ÙŽ", +DlgLstTypeLCase : "حرو٠صغيرة (a, b, c)ÙŽ", +DlgLstTypeUCase : "حرو٠كبيرة (A, B, C)ÙŽ", +DlgLstTypeSRoman : "ترقيم روماني صغير (i, ii, iii)ÙŽ", +DlgLstTypeLRoman : "ترقيم روماني كبير (I, II, III)ÙŽ", + +// Document Properties Dialog +DlgDocGeneralTab : "عام", +DlgDocBackTab : "الخلÙية", +DlgDocColorsTab : "الألوان والهوامش", +DlgDocMetaTab : "المعرّÙات الرأسية", + +DlgDocPageTitle : "عنوان الصÙحة", +DlgDocLangDir : "إتجاه اللغة", +DlgDocLangDirLTR : "اليسار لليمين (LTR)", +DlgDocLangDirRTL : "اليمين لليسار (RTL)", +DlgDocLangCode : "رمز اللغة", +DlgDocCharSet : "ترميز الحروÙ", +DlgDocCharSetCE : "أوروبا الوسطى", +DlgDocCharSetCT : "الصينية التقليدية (Big5)", +DlgDocCharSetCR : "السيريلية", +DlgDocCharSetGR : "اليونانية", +DlgDocCharSetJP : "اليابانية", +DlgDocCharSetKR : "الكورية", +DlgDocCharSetTR : "التركية", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "أوروبا الغربية", +DlgDocCharSetOther : "ترميز آخر", + +DlgDocDocType : "ترويسة نوع الصÙحة", +DlgDocDocTypeOther : "ترويسة نوع صÙحة أخرى", +DlgDocIncXHTML : "تضمين إعلانات†لغة XHTMLÙŽ", +DlgDocBgColor : "لون الخلÙية", +DlgDocBgImage : "رابط الصورة الخلÙية", +DlgDocBgNoScroll : "جعلها علامة مائية", +DlgDocCText : "النص", +DlgDocCLink : "الروابط", +DlgDocCVisited : "المزارة", +DlgDocCActive : "النشطة", +DlgDocMargins : "هوامش الصÙحة", +DlgDocMaTop : "علوي", +DlgDocMaLeft : "أيسر", +DlgDocMaRight : "أيمن", +DlgDocMaBottom : "سÙلي", +DlgDocMeIndex : "الكلمات الأساسية (Ù…Ùصولة بÙواصل)ÙŽ", +DlgDocMeDescr : "وص٠الصÙحة", +DlgDocMeAuthor : "الكاتب", +DlgDocMeCopy : "المالك", +DlgDocPreview : "معاينة", + +// Templates Dialog +Templates : "القوالب", +DlgTemplatesTitle : "قوالب المحتوى", +DlgTemplatesSelMsg : "اختر القالب الذي تود وضعه ÙÙŠ المحرر
    (سيتم Ùقدان المحتوى الحالي):", +DlgTemplatesLoading : "جاري تحميل قائمة القوالب، الرجاء الإنتظار...", +DlgTemplatesNoTpl : "(لم يتم تعري٠أي قالب)", +DlgTemplatesReplace : "استبدال المحتوى", + +// About Dialog +DlgAboutAboutTab : "نبذة", +DlgAboutBrowserInfoTab : "معلومات متصÙحك", +DlgAboutLicenseTab : "الترخيص", +DlgAboutVersion : "الإصدار", +DlgAboutInfo : "لمزيد من المعلومات تÙضل بزيارة", + +// Div Dialog +DlgDivGeneralTab : "عام", +DlgDivAdvancedTab : "متقدم", +DlgDivStyle : "المظهر", +DlgDivInlineStyle : "المظهر المضمن" +}; diff --git a/webdir/fckeditor/editor/lang/bg.js b/webdir/fckeditor/editor/lang/bg.js new file mode 100644 index 0000000..923e31f --- /dev/null +++ b/webdir/fckeditor/editor/lang/bg.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Bulgarian language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Скрий панела Ñ Ð¸Ð½Ñтрументите", +ToolbarExpand : "Покажи панела Ñ Ð¸Ð½Ñтрументите", + +// Toolbar Items and Context Menu +Save : "Запази", +NewPage : "Ðова Ñтраница", +Preview : "Предварителен изглед", +Cut : "Изрежи", +Copy : "Запамети", +Paste : "Вмъкни", +PasteText : "Вмъкни Ñамо текÑÑ‚", +PasteWord : "Вмъкни от MS Word", +Print : "Печат", +SelectAll : "Селектирай вÑичко", +RemoveFormat : "Изтрий форматирането", +InsertLinkLbl : "Връзка", +InsertLink : "Добави/Редактирай връзка", +RemoveLink : "Изтрий връзка", +VisitLink : "Open Link", //MISSING +Anchor : "Добави/Редактирай котва", +AnchorDelete : "Remove Anchor", //MISSING +InsertImageLbl : "Изображение", +InsertImage : "Добави/Редактирай изображение", +InsertFlashLbl : "Flash", +InsertFlash : "Добави/Редактиай Flash обект", +InsertTableLbl : "Таблица", +InsertTable : "Добави/Редактирай таблица", +InsertLineLbl : "ЛиниÑ", +InsertLine : "Вмъкни хоризонтална линиÑ", +InsertSpecialCharLbl: "Специален Ñимвол", +InsertSpecialChar : "Вмъкни Ñпециален Ñимвол", +InsertSmileyLbl : "УÑмивка", +InsertSmiley : "Добави уÑмивка", +About : "За FCKeditor", +Bold : "Удебелен", +Italic : "КурÑив", +Underline : "Подчертан", +StrikeThrough : "Зачертан", +Subscript : "Ð˜Ð½Ð´ÐµÐºÑ Ð·Ð° база", +Superscript : "Ð˜Ð½Ð´ÐµÐºÑ Ð·Ð° Ñтепен", +LeftJustify : "ПодравнÑване в лÑво", +CenterJustify : "ПодравнÑвне в Ñредата", +RightJustify : "ПодравнÑване в дÑÑно", +BlockJustify : "ДвуÑтранно подравнÑване", +DecreaseIndent : "Ðамали отÑтъпа", +IncreaseIndent : "Увеличи отÑтъпа", +Blockquote : "Blockquote", //MISSING +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "Отмени", +Redo : "Повтори", +NumberedListLbl : "Ðумериран ÑпиÑък", +NumberedList : "Добави/Изтрий нумериран ÑпиÑък", +BulletedListLbl : "Ðенумериран ÑпиÑък", +BulletedList : "Добави/Изтрий ненумериран ÑпиÑък", +ShowTableBorders : "Покажи рамките на таблицата", +ShowDetails : "Покажи подробноÑти", +Style : "Стил", +FontFormat : "Формат", +Font : "Шрифт", +FontSize : "Размер", +TextColor : "ЦвÑÑ‚ на текÑта", +BGColor : "ЦвÑÑ‚ на фона", +Source : "Код", +Find : "ТърÑи", +Replace : "ЗамеÑти", +SpellCheck : "Провери правопиÑа", +UniversalKeyboard : "УниверÑална клавиатура", +PageBreakLbl : "Ðов ред", +PageBreak : "Вмъкни нов ред", + +Form : "ФормулÑÑ€", +Checkbox : "Поле за отметка", +RadioButton : "Поле за опциÑ", +TextField : "ТекÑтово поле", +Textarea : "ТекÑтова облаÑÑ‚", +HiddenField : "Скрито поле", +Button : "Бутон", +SelectionField : "Падащо меню Ñ Ð¾Ð¿Ñ†Ð¸Ð¸", +ImageButton : "Бутон-изображение", + +FitWindow : "Maximize the editor size", //MISSING +ShowBlocks : "Show Blocks", //MISSING + +// Context Menu +EditLink : "Редактирай връзка", +CellCM : "Cell", //MISSING +RowCM : "Row", //MISSING +ColumnCM : "Column", //MISSING +InsertRowAfter : "Insert Row After", //MISSING +InsertRowBefore : "Insert Row Before", //MISSING +DeleteRows : "Изтрий редовете", +InsertColumnAfter : "Insert Column After", //MISSING +InsertColumnBefore : "Insert Column Before", //MISSING +DeleteColumns : "Изтрий колоните", +InsertCellAfter : "Insert Cell After", //MISSING +InsertCellBefore : "Insert Cell Before", //MISSING +DeleteCells : "Изтрий клетките", +MergeCells : "Обедини клетките", +MergeRight : "Merge Right", //MISSING +MergeDown : "Merge Down", //MISSING +HorizontalSplitCell : "Split Cell Horizontally", //MISSING +VerticalSplitCell : "Split Cell Vertically", //MISSING +TableDelete : "Изтрий таблицата", +CellProperties : "Параметри на клетката", +TableProperties : "Параметри на таблицата", +ImageProperties : "Параметри на изображението", +FlashProperties : "Параметри на Flash обекта", + +AnchorProp : "Параметри на котвата", +ButtonProp : "Параметри на бутона", +CheckboxProp : "Параметри на полето за отметка", +HiddenFieldProp : "Параметри на Ñкритото поле", +RadioButtonProp : "Параметри на полето за опциÑ", +ImageButtonProp : "Параметри на бутона-изображение", +TextFieldProp : "Параметри на текÑтовото-поле", +SelectionFieldProp : "Параметри на падащото меню Ñ Ð¾Ð¿Ñ†Ð¸Ð¸", +TextareaProp : "Параметри на текÑтовата облаÑÑ‚", +FormProp : "Параметри на формулÑра", + +FontFormats : "Ðормален;Форматиран;ÐдреÑ;Заглавие 1;Заглавие 2;Заглавие 3;Заглавие 4;Заглавие 5;Заглавие 6;Параграф (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Обработка на XHTML. ÐœÐ¾Ð»Ñ Ð¸Ð·Ñ‡Ð°ÐºÐ°Ð¹Ñ‚Ðµ...", +Done : "Готово", +PasteWordConfirm : "ТекÑÑ‚ÑŠÑ‚, който иÑкате да вмъкнете е копиран от MS Word. Желаете ли да бъде изчиÑтен преди вмъкването?", +NotCompatiblePaste : "Тази Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¸Ñква MS Internet Explorer верÑÐ¸Ñ 5.5 или по-виÑока. Желаете ли да вмъкнете запаметеното без изчиÑтване?", +UnknownToolbarItem : "Ðепознат инÑтрумент \"%1\"", +UnknownCommand : "Ðепозната команда \"%1\"", +NotImplemented : "Командата не е имплементирана", +UnknownToolbarSet : "Панелът \"%1\" не ÑъщеÑтвува", +NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", //MISSING +BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", //MISSING +DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", //MISSING +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "ОК", +DlgBtnCancel : "Отказ", +DlgBtnClose : "Затвори", +DlgBtnBrowseServer : "Разгледай Ñървъра", +DlgAdvancedTag : "ПодробноÑти...", +DlgOpOther : "<Друго>", +DlgInfoTab : "ИнформациÑ", +DlgAlertUrl : "МолÑ, въведете Ð¿ÑŠÐ»Ð½Ð¸Ñ Ð¿ÑŠÑ‚ (URL)", + +// General Dialogs Labels +DlgGenNotSet : "<не е наÑтроен>", +DlgGenId : "Идентификатор", +DlgGenLangDir : "поÑока на речта", +DlgGenLangDirLtr : "От лÑво на дÑÑно", +DlgGenLangDirRtl : "От дÑÑно на лÑво", +DlgGenLangCode : "Код на езика", +DlgGenAccessKey : "Бърз клавиш", +DlgGenName : "Име", +DlgGenTabIndex : "Ред на доÑтъп", +DlgGenLongDescr : "ОпиÑание на връзката", +DlgGenClass : "ÐšÐ»Ð°Ñ Ð¾Ñ‚ Ñтиловите таблици", +DlgGenTitle : "Препоръчително заглавие", +DlgGenContType : "Препоръчителен тип на Ñъдържанието", +DlgGenLinkCharset : "Тип на ÑÐ²ÑŠÑ€Ð·Ð°Ð½Ð¸Ñ Ñ€ÐµÑурÑ", +DlgGenStyle : "Стил", + +// Image Dialog +DlgImgTitle : "Параметри на изображението", +DlgImgInfoTab : "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° изображението", +DlgImgBtnUpload : "Прати към Ñървъра", +DlgImgURL : "Пълен път (URL)", +DlgImgUpload : "Качи", +DlgImgAlt : "Ðлтернативен текÑÑ‚", +DlgImgWidth : "Ширина", +DlgImgHeight : "ВиÑочина", +DlgImgLockRatio : "Запази пропорциÑта", +DlgBtnResetSize : "ВъзÑтанови размера", +DlgImgBorder : "Рамка", +DlgImgHSpace : "Хоризонтален отÑтъп", +DlgImgVSpace : "Вертикален отÑтъп", +DlgImgAlign : "ПодравнÑване", +DlgImgAlignLeft : "ЛÑво", +DlgImgAlignAbsBottom: "Ðай-долу", +DlgImgAlignAbsMiddle: "Точно по Ñредата", +DlgImgAlignBaseline : "По базовата линиÑ", +DlgImgAlignBottom : "Долу", +DlgImgAlignMiddle : "По Ñредата", +DlgImgAlignRight : "ДÑÑно", +DlgImgAlignTextTop : "Върху текÑта", +DlgImgAlignTop : "Отгоре", +DlgImgPreview : "Изглед", +DlgImgAlertUrl : "МолÑ, въведете Ð¿ÑŠÐ»Ð½Ð¸Ñ Ð¿ÑŠÑ‚ до изображението", +DlgImgLinkTab : "Връзка", + +// Flash Dialog +DlgFlashTitle : "Параметри на Flash обекта", +DlgFlashChkPlay : "Ðвтоматично Ñтартиране", +DlgFlashChkLoop : "Ðово Ñтартиране Ñлед завършването", +DlgFlashChkMenu : "Разрешено Flash меню", +DlgFlashScale : "ОразмерÑване", +DlgFlashScaleAll : "Покажи Ñ†ÐµÐ»Ð¸Ñ Ð¾Ð±ÐµÐºÑ‚", +DlgFlashScaleNoBorder : "Без рамка", +DlgFlashScaleFit : "Според мÑÑтото", + +// Link Dialog +DlgLnkWindowTitle : "Връзка", +DlgLnkInfoTab : "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° връзката", +DlgLnkTargetTab : "Цел", + +DlgLnkType : "Вид на връзката", +DlgLnkTypeURL : "Пълен път (URL)", +DlgLnkTypeAnchor : "Котва в текущата Ñтраница", +DlgLnkTypeEMail : "Е-поща", +DlgLnkProto : "Протокол", +DlgLnkProtoOther : "<друго>", +DlgLnkURL : "Пълен път (URL)", +DlgLnkAnchorSel : "Изберете котва", +DlgLnkAnchorByName : "По име на котвата", +DlgLnkAnchorById : "По идентификатор на елемент", +DlgLnkNoAnchors : "(ÐÑма котви в Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚)", +DlgLnkEMail : "ÐÐ´Ñ€ÐµÑ Ð·Ð° е-поща", +DlgLnkEMailSubject : "Тема на пиÑмото", +DlgLnkEMailBody : "ТекÑÑ‚ на пиÑмото", +DlgLnkUpload : "Качи", +DlgLnkBtnUpload : "Прати на Ñървъра", + +DlgLnkTarget : "Цел", +DlgLnkTargetFrame : "<рамка>", +DlgLnkTargetPopup : "<дъщерен прозорец>", +DlgLnkTargetBlank : "Ðов прозорец (_blank)", +DlgLnkTargetParent : "РодителÑки прозорец (_parent)", +DlgLnkTargetSelf : "ÐÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ† (_self)", +DlgLnkTargetTop : "Ð¦ÐµÐ»Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ† (_top)", +DlgLnkTargetFrameName : "Име на Ñ†ÐµÐ»ÐµÐ²Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†", +DlgLnkPopWinName : "Име на Ð´ÑŠÑ‰ÐµÑ€Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†", +DlgLnkPopWinFeat : "Параметри на Ð´ÑŠÑ‰ÐµÑ€Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†", +DlgLnkPopResize : "С променливи размери", +DlgLnkPopLocation : "Поле за адреÑ", +DlgLnkPopMenu : "Меню", +DlgLnkPopScroll : "Плъзгач", +DlgLnkPopStatus : "Поле за ÑтатуÑ", +DlgLnkPopToolbar : "Панел Ñ Ð±ÑƒÑ‚Ð¾Ð½Ð¸", +DlgLnkPopFullScrn : "ГолÑм екран (MS IE)", +DlgLnkPopDependent : "ЗавиÑим (Netscape)", +DlgLnkPopWidth : "Ширина", +DlgLnkPopHeight : "ВиÑочина", +DlgLnkPopLeft : "Координати - X", +DlgLnkPopTop : "Координати - Y", + +DlnLnkMsgNoUrl : "МолÑ, напишете Ð¿ÑŠÐ»Ð½Ð¸Ñ Ð¿ÑŠÑ‚ (URL)", +DlnLnkMsgNoEMail : "МолÑ, напишете адреÑа за е-поща", +DlnLnkMsgNoAnchor : "МолÑ, изберете котва", +DlnLnkMsgInvPopName : "The popup name must begin with an alphabetic character and must not contain spaces", //MISSING + +// Color Dialog +DlgColorTitle : "Изберете цвÑÑ‚", +DlgColorBtnClear : "ИзчиÑти", +DlgColorHighlight : "Текущ", +DlgColorSelected : "Избран", + +// Smiley Dialog +DlgSmileyTitle : "Добави уÑмивка", + +// Special Character Dialog +DlgSpecialCharTitle : "Изберете Ñпециален Ñимвол", + +// Table Dialog +DlgTableTitle : "Параметри на таблицата", +DlgTableRows : "Редове", +DlgTableColumns : "Колони", +DlgTableBorder : "Размер на рамката", +DlgTableAlign : "ПодравнÑване", +DlgTableAlignNotSet : "<Ðе е избрано>", +DlgTableAlignLeft : "ЛÑво", +DlgTableAlignCenter : "Център", +DlgTableAlignRight : "ДÑÑно", +DlgTableWidth : "Ширина", +DlgTableWidthPx : "пикÑели", +DlgTableWidthPc : "проценти", +DlgTableHeight : "ВиÑочина", +DlgTableCellSpace : "РазÑтоÑние между клетките", +DlgTableCellPad : "ОтÑтъп на Ñъдържанието в клетките", +DlgTableCaption : "Заглавие", +DlgTableSummary : "Резюме", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Параметри на клетката", +DlgCellWidth : "Ширина", +DlgCellWidthPx : "пикÑели", +DlgCellWidthPc : "проценти", +DlgCellHeight : "ВиÑочина", +DlgCellWordWrap : "пренаÑÑне на нов ред", +DlgCellWordWrapNotSet : "<Ðе е наÑтроено>", +DlgCellWordWrapYes : "Да", +DlgCellWordWrapNo : "не", +DlgCellHorAlign : "Хоризонтално подравнÑване", +DlgCellHorAlignNotSet : "<Ðе е наÑтроено>", +DlgCellHorAlignLeft : "ЛÑво", +DlgCellHorAlignCenter : "Център", +DlgCellHorAlignRight: "ДÑÑно", +DlgCellVerAlign : "Вертикално подравнÑване", +DlgCellVerAlignNotSet : "<Ðе е наÑтроено>", +DlgCellVerAlignTop : "Горе", +DlgCellVerAlignMiddle : "По Ñредата", +DlgCellVerAlignBottom : "Долу", +DlgCellVerAlignBaseline : "По базовата линиÑ", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "повече от един ред", +DlgCellCollSpan : "повече от една колона", +DlgCellBackColor : "фонов цвÑÑ‚", +DlgCellBorderColor : "цвÑÑ‚ на рамката", +DlgCellBtnSelect : "Изберете...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", //MISSING + +// Find Dialog +DlgFindTitle : "ТърÑи", +DlgFindFindBtn : "ТърÑи", +DlgFindNotFoundMsg : "Ð£ÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑÑ‚ не беше намерен.", + +// Replace Dialog +DlgReplaceTitle : "ЗамеÑти", +DlgReplaceFindLbl : "ТърÑи:", +DlgReplaceReplaceLbl : "ЗамеÑти Ñ:", +DlgReplaceCaseChk : "Ð¡ÑŠÑ ÑÑŠÑ‰Ð¸Ñ Ñ€ÐµÐ³Ð¸ÑÑ‚ÑŠÑ€", +DlgReplaceReplaceBtn : "ЗамеÑти", +DlgReplaceReplAllBtn : "ЗамеÑти вÑички", +DlgReplaceWordChk : "ТърÑи Ñъщата дума", + +// Paste Operations / Dialog +PasteErrorCut : "ÐаÑтройките за ÑигурноÑÑ‚ на Ð²Ð°ÑˆÐ¸Ñ Ð±Ñ€Ð°Ð·ÑƒÑŠÑ€ не разрешават на редактора да изпълни изрÑзването. За целта използвайте клавиатурата (Ctrl+X).", +PasteErrorCopy : "ÐаÑтройките за ÑигурноÑÑ‚ на Ð²Ð°ÑˆÐ¸Ñ Ð±Ñ€Ð°Ð·ÑƒÑŠÑ€ не разрешават на редактора да изпълни запаметÑването. За целта използвайте клавиатурата (Ctrl+C).", + +PasteAsText : "Вмъкни като чиÑÑ‚ текÑÑ‚", +PasteFromWord : "Вмъкни от MS Word", + +DlgPasteMsg2 : "Вмъкнете тук Ñъдъжанието Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÐ°Ñ€Ð°Ñ‚Ð° (Ctrl+V) и натиÑнете OK.", +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", //MISSING +DlgPasteIgnoreFont : "Игнорирай шрифтовите дефиниции", +DlgPasteRemoveStyles : "Изтрий Ñтиловите дефиниции", + +// Color Picker +ColorAutomatic : "По подразбиране", +ColorMoreColors : "Други цветове...", + +// Document Properties +DocProps : "Параметри на документа", + +// Anchor Dialog +DlgAnchorTitle : "Параметри на котвата", +DlgAnchorName : "Име на котвата", +DlgAnchorErrorName : "МолÑ, въведете име на котвата", + +// Speller Pages Dialog +DlgSpellNotInDic : "ЛипÑва в речника", +DlgSpellChangeTo : "Промени на", +DlgSpellBtnIgnore : "Игнорирай", +DlgSpellBtnIgnoreAll : "Игнорирай вÑички", +DlgSpellBtnReplace : "ЗамеÑти", +DlgSpellBtnReplaceAll : "ЗамеÑти вÑички", +DlgSpellBtnUndo : "Отмени", +DlgSpellNoSuggestions : "- ÐÑма Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ -", +DlgSpellProgress : "Извършване на проверката за правопиÑ...", +DlgSpellNoMispell : "Проверката за Ð¿Ñ€Ð°Ð²Ð¾Ð¿Ð¸Ñ Ð·Ð°Ð²ÑŠÑ€ÑˆÐµÐ½Ð°: не Ñа открити правопиÑни грешки", +DlgSpellNoChanges : "Проверката за Ð¿Ñ€Ð°Ð²Ð¾Ð¿Ð¸Ñ Ð·Ð°Ð²ÑŠÑ€ÑˆÐµÐ½Ð°: нÑма променени думи", +DlgSpellOneChange : "Проверката за Ð¿Ñ€Ð°Ð²Ð¾Ð¿Ð¸Ñ Ð·Ð°Ð²ÑŠÑ€ÑˆÐµÐ½Ð°: една дума е променена", +DlgSpellManyChanges : "Проверката за Ð¿Ñ€Ð°Ð²Ð¾Ð¿Ð¸Ñ Ð·Ð°Ð²ÑŠÑ€ÑˆÐµÐ½Ð°: %1 думи Ñа променени", + +IeSpellDownload : "ИнÑтрументът за проверка на Ð¿Ñ€Ð°Ð²Ð¾Ð¿Ð¸Ñ Ð½Ðµ е инÑталиран. Желаете ли да го инÑталирате ?", + +// Button Dialog +DlgButtonText : "ТекÑÑ‚ (СтойноÑÑ‚)", +DlgButtonType : "Тип", +DlgButtonTypeBtn : "Button", //MISSING +DlgButtonTypeSbm : "Submit", //MISSING +DlgButtonTypeRst : "Reset", //MISSING + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Име", +DlgCheckboxValue : "СтойноÑÑ‚", +DlgCheckboxSelected : "Отметнато", + +// Form Dialog +DlgFormName : "Име", +DlgFormAction : "ДейÑтвие", +DlgFormMethod : "Метод", + +// Select Field Dialog +DlgSelectName : "Име", +DlgSelectValue : "СтойноÑÑ‚", +DlgSelectSize : "Размер", +DlgSelectLines : "линии", +DlgSelectChkMulti : "Разрешено множеÑтвено Ñелектиране", +DlgSelectOpAvail : "Възможни опции", +DlgSelectOpText : "ТекÑÑ‚", +DlgSelectOpValue : "СтойноÑÑ‚", +DlgSelectBtnAdd : "Добави", +DlgSelectBtnModify : "Промени", +DlgSelectBtnUp : "Ðагоре", +DlgSelectBtnDown : "Ðадолу", +DlgSelectBtnSetValue : "ÐаÑтрой като избрана ÑтойноÑÑ‚", +DlgSelectBtnDelete : "Изтрий", + +// Textarea Dialog +DlgTextareaName : "Име", +DlgTextareaCols : "Колони", +DlgTextareaRows : "Редове", + +// Text Field Dialog +DlgTextName : "Име", +DlgTextValue : "СтойноÑÑ‚", +DlgTextCharWidth : "Ширина на Ñимволите", +DlgTextMaxChars : "МакÑимум Ñимволи", +DlgTextType : "Тип", +DlgTextTypeText : "ТекÑÑ‚", +DlgTextTypePass : "Парола", + +// Hidden Field Dialog +DlgHiddenName : "Име", +DlgHiddenValue : "СтойноÑÑ‚", + +// Bulleted List Dialog +BulletedListProp : "Параметри на Ð½ÐµÐ½ÑƒÐ¼ÐµÑ€Ð¸Ñ€Ð°Ð½Ð¸Ñ ÑпиÑък", +NumberedListProp : "Параметри на Ð½ÑƒÐ¼ÐµÑ€Ð¸Ñ€Ð°Ð½Ð¸Ñ ÑпиÑък", +DlgLstStart : "Start", //MISSING +DlgLstType : "Тип", +DlgLstTypeCircle : "ОкръжноÑÑ‚", +DlgLstTypeDisc : "Кръг", +DlgLstTypeSquare : "Квадрат", +DlgLstTypeNumbers : "ЧиÑла (1, 2, 3)", +DlgLstTypeLCase : "Малки букви (a, b, c)", +DlgLstTypeUCase : "Големи букви (A, B, C)", +DlgLstTypeSRoman : "Малки римÑки чиÑла (i, ii, iii)", +DlgLstTypeLRoman : "Големи римÑки чиÑла (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Общи", +DlgDocBackTab : "Фон", +DlgDocColorsTab : "Цветове и отÑтъпи", +DlgDocMetaTab : "Мета данни", + +DlgDocPageTitle : "Заглавие на Ñтраницата", +DlgDocLangDir : "ПоÑока на речта", +DlgDocLangDirLTR : "От лÑво на дÑÑно", +DlgDocLangDirRTL : "От дÑÑно на лÑво", +DlgDocLangCode : "Код на езика", +DlgDocCharSet : "Кодиране на Ñимволите", +DlgDocCharSetCE : "Central European", //MISSING +DlgDocCharSetCT : "Chinese Traditional (Big5)", //MISSING +DlgDocCharSetCR : "Cyrillic", //MISSING +DlgDocCharSetGR : "Greek", //MISSING +DlgDocCharSetJP : "Japanese", //MISSING +DlgDocCharSetKR : "Korean", //MISSING +DlgDocCharSetTR : "Turkish", //MISSING +DlgDocCharSetUN : "Unicode (UTF-8)", //MISSING +DlgDocCharSetWE : "Western European", //MISSING +DlgDocCharSetOther : "Друго кодиране на Ñимволите", + +DlgDocDocType : "Тип на документа", +DlgDocDocTypeOther : "Друг тип на документа", +DlgDocIncXHTML : "Включи XHTML декларациÑ", +DlgDocBgColor : "ЦвÑÑ‚ на фона", +DlgDocBgImage : "Пълен път до фоновото изображение", +DlgDocBgNoScroll : "Ðе-повтарÑщо Ñе фоново изображение", +DlgDocCText : "ТекÑÑ‚", +DlgDocCLink : "Връзка", +DlgDocCVisited : "ПоÑетена връзка", +DlgDocCActive : "Ðктивна връзка", +DlgDocMargins : "ОтÑтъпи на Ñтраницата", +DlgDocMaTop : "Горе", +DlgDocMaLeft : "ЛÑво", +DlgDocMaRight : "ДÑÑно", +DlgDocMaBottom : "Долу", +DlgDocMeIndex : "Ключови думи за документа (разделени ÑÑŠÑ Ð·Ð°Ð¿ÐµÑ‚Ð°Ð¸)", +DlgDocMeDescr : "ОпиÑание на документа", +DlgDocMeAuthor : "Ðвтор", +DlgDocMeCopy : "ÐвторÑки права", +DlgDocPreview : "Изглед", + +// Templates Dialog +Templates : "Шаблони", +DlgTemplatesTitle : "Шаблони", +DlgTemplatesSelMsg : "Изберете шаблон
    (текущото Ñъдържание на редактора ще бъде загубено):", +DlgTemplatesLoading : "Зареждане на ÑпиÑъка Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¸Ñ‚Ðµ. ÐœÐ¾Ð»Ñ Ð¸Ð·Ñ‡Ð°ÐºÐ°Ð¹Ñ‚Ðµ...", +DlgTemplatesNoTpl : "(ÐÑма дефинирани шаблони)", +DlgTemplatesReplace : "Replace actual contents", //MISSING + +// About Dialog +DlgAboutAboutTab : "За", +DlgAboutBrowserInfoTab : "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° браузъра", +DlgAboutLicenseTab : "License", //MISSING +DlgAboutVersion : "верÑиÑ", +DlgAboutInfo : "За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ñетете", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/bn.js b/webdir/fckeditor/editor/lang/bn.js new file mode 100644 index 0000000..6382546 --- /dev/null +++ b/webdir/fckeditor/editor/lang/bn.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Bengali/Bangla language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "টূলবার গà§à¦Ÿà¦¿à§Ÿà§‡ দাও", +ToolbarExpand : "টূলবার ছড়িয়ে দাও", + +// Toolbar Items and Context Menu +Save : "সংরকà§à¦·à¦¨ কর", +NewPage : "নতà§à¦¨ পেজ", +Preview : "পà§à¦°à¦¿à¦­à¦¿à¦‰", +Cut : "কাট", +Copy : "কপি", +Paste : "পেসà§à¦Ÿ", +PasteText : "পেসà§à¦Ÿ (সাদা টেকà§à¦¸à¦Ÿ)", +PasteWord : "পেসà§à¦Ÿ (শবà§à¦¦)", +Print : "পà§à¦°à¦¿à¦¨à§à¦Ÿ", +SelectAll : "সব সিলেকà§à¦Ÿ কর", +RemoveFormat : "ফরমেট সরাও", +InsertLinkLbl : "লিংকের যà§à¦•à§à¦¤ করার লেবেল", +InsertLink : "লিংক যà§à¦•à§à¦¤ কর", +RemoveLink : "লিংক সরাও", +VisitLink : "Open Link", //MISSING +Anchor : "নোঙà§à¦—র", +AnchorDelete : "Remove Anchor", //MISSING +InsertImageLbl : "ছবির লেবেল যà§à¦•à§à¦¤ কর", +InsertImage : "ছবি যà§à¦•à§à¦¤ কর", +InsertFlashLbl : "ফà§à¦²à¦¾à¦¶ লেবেল যà§à¦•à§à¦¤ কর", +InsertFlash : "ফà§à¦²à¦¾à¦¶ যà§à¦•à§à¦¤ কর", +InsertTableLbl : "টেবিলের লেবেল যà§à¦•à§à¦¤ কর", +InsertTable : "টেবিল যà§à¦•à§à¦¤ কর", +InsertLineLbl : "রেখা যà§à¦•à§à¦¤ কর", +InsertLine : "রেখা যà§à¦•à§à¦¤ কর", +InsertSpecialCharLbl: "বিশেষ অকà§à¦·à¦°à§‡à¦° লেবেল যà§à¦•à§à¦¤ কর", +InsertSpecialChar : "বিশেষ অকà§à¦·à¦° যà§à¦•à§à¦¤ কর", +InsertSmileyLbl : "সà§à¦®à¦¾à¦‡à¦²à§€", +InsertSmiley : "সà§à¦®à¦¾à¦‡à¦²à§€ যà§à¦•à§à¦¤ কর", +About : "FCKeditor কে বানিয়েছে", +Bold : "বোলà§à¦¡", +Italic : "ইটালিক", +Underline : "আনà§à¦¡à¦¾à¦°à¦²à¦¾à¦‡à¦¨", +StrikeThrough : "সà§à¦Ÿà§à¦°à¦¾à¦‡à¦• থà§à¦°à§", +Subscript : "অধোলেখ", +Superscript : "অভিলেখ", +LeftJustify : "বা দিকে ঘেà¦à¦·à¦¾", +CenterJustify : "মাঠবরাবর ঘেষা", +RightJustify : "ডান দিকে ঘেà¦à¦·à¦¾", +BlockJustify : "বà§à¦²à¦• জাসà§à¦Ÿà¦¿à¦«à¦¾à¦‡", +DecreaseIndent : "ইনডেনà§à¦Ÿ কমাও", +IncreaseIndent : "ইনডেনà§à¦Ÿ বাড়াও", +Blockquote : "Blockquote", //MISSING +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "আনডà§", +Redo : "রি-ডà§", +NumberedListLbl : "সাংখà§à¦¯à¦¿à¦• লিসà§à¦Ÿà§‡à¦° লেবেল", +NumberedList : "সাংখà§à¦¯à¦¿à¦• লিসà§à¦Ÿ", +BulletedListLbl : "বà§à¦²à§‡à¦Ÿ লিসà§à¦Ÿ লেবেল", +BulletedList : "বà§à¦²à§‡à¦Ÿà§‡à¦¡ লিসà§à¦Ÿ", +ShowTableBorders : "টেবিল বরà§à¦¡à¦¾à¦°", +ShowDetails : "সবটà§à¦•à§ দেখাও", +Style : "সà§à¦Ÿà¦¾à¦‡à¦²", +FontFormat : "ফনà§à¦Ÿ ফরমেট", +Font : "ফনà§à¦Ÿ", +FontSize : "সাইজ", +TextColor : "টেকà§à¦¸à§à¦Ÿ রং", +BGColor : "বেকগà§à¦°à¦¾à¦‰à¦¨à§à¦¡ রং", +Source : "সোরà§à¦¸", +Find : "খোজো", +Replace : "রিপà§à¦²à§‡à¦¸", +SpellCheck : "বানান চেক", +UniversalKeyboard : "সারà§à¦¬à¦œà¦¨à§€à¦¨ কিবোরà§à¦¡", +PageBreakLbl : "পেজ বà§à¦°à§‡à¦• লেবেল", +PageBreak : "পেজ বà§à¦°à§‡à¦•", + +Form : "ফরà§à¦®", +Checkbox : "চেক বাকà§à¦¸", +RadioButton : "রেডিও বাটন", +TextField : "টেকà§à¦¸à¦Ÿ ফীলà§à¦¡", +Textarea : "টেকà§à¦¸à¦Ÿ à¦à¦°à¦¿à§Ÿà¦¾", +HiddenField : "গà§à¦ªà§à¦¤ ফীলà§à¦¡", +Button : "বাটন", +SelectionField : "বাছাই ফীলà§à¦¡", +ImageButton : "ছবির বাটন", + +FitWindow : "উইনà§à¦¡à§‹ ফিট কর", +ShowBlocks : "Show Blocks", //MISSING + +// Context Menu +EditLink : "লিংক সমà§à¦ªà¦¾à¦¦à¦¨", +CellCM : "সেল", +RowCM : "রো", +ColumnCM : "কলাম", +InsertRowAfter : "Insert Row After", //MISSING +InsertRowBefore : "Insert Row Before", //MISSING +DeleteRows : "রো মà§à¦›à§‡ দাও", +InsertColumnAfter : "Insert Column After", //MISSING +InsertColumnBefore : "Insert Column Before", //MISSING +DeleteColumns : "কলাম মà§à¦›à§‡ দাও", +InsertCellAfter : "Insert Cell After", //MISSING +InsertCellBefore : "Insert Cell Before", //MISSING +DeleteCells : "সেল মà§à¦›à§‡ দাও", +MergeCells : "সেল জোড়া দাও", +MergeRight : "Merge Right", //MISSING +MergeDown : "Merge Down", //MISSING +HorizontalSplitCell : "Split Cell Horizontally", //MISSING +VerticalSplitCell : "Split Cell Vertically", //MISSING +TableDelete : "টেবিল ডিলীট কর", +CellProperties : "সেলের পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿à¦œ", +TableProperties : "টেবিল পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +ImageProperties : "ছবি পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +FlashProperties : "ফà§à¦²à¦¾à¦¶ পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", + +AnchorProp : "নোঙর পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +ButtonProp : "বাটন পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +CheckboxProp : "চেক বকà§à¦¸ পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +HiddenFieldProp : "গà§à¦ªà§à¦¤ ফীলà§à¦¡ পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +RadioButtonProp : "রেডিও বাটন পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +ImageButtonProp : "ছবি বাটন পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +TextFieldProp : "টেকà§à¦¸à¦Ÿ ফীলà§à¦¡ পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +SelectionFieldProp : "বাছাই ফীলà§à¦¡ পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +TextareaProp : "টেকà§à¦¸à¦Ÿ à¦à¦°à¦¿à§Ÿà¦¾ পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +FormProp : "ফরà§à¦® পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", + +FontFormats : "সাধারণ;ফরà§à¦®à§‡à¦Ÿà§‡à¦¡;ঠিকানা;শীরà§à¦·à¦• ১;শীরà§à¦·à¦• ২;শীরà§à¦·à¦• ৩;শীরà§à¦·à¦• ৪;শীরà§à¦·à¦• ৫;শীরà§à¦·à¦• ৬;শীরà§à¦·à¦• (DIV)", + +// Alerts and Messages +ProcessingXHTML : "XHTML পà§à¦°à¦¸à§‡à¦¸ করা হচà§à¦›à§‡", +Done : "শেষ হয়েছে", +PasteWordConfirm : "যে টেকসà§à¦Ÿà¦Ÿà¦¿ আপনি পেসà§à¦Ÿ করতে চাচà§à¦›à§‡à¦¨ মনে হচà§à¦›à§‡ সেটি ওয়ারà§à¦¡ থেকে কপি করা। আপনি কি পেসà§à¦Ÿ করার আগে à¦à¦•à§‡ পরিষà§à¦•à¦¾à¦° করতে চান?", +NotCompatiblePaste : "à¦à¦‡ কমানà§à¦¡à¦Ÿà¦¿ শà§à¦§à§à¦®à¦¾à¦¤à§à¦° ইনà§à¦Ÿà¦¾à¦°à¦¨à§‡à¦Ÿ à¦à¦•à§à¦¸à¦ªà§à¦²à§‹à¦°à¦¾à¦° ৫.০ বা তার পরের ভারà§à¦¸à¦¨à§‡ পাওয়া সমà§à¦­à¦¬à¥¤ আপনি কি পরিষà§à¦•à¦¾à¦° না করেই পেসà§à¦Ÿ করতে চান?", +UnknownToolbarItem : "অজানা টà§à¦²à¦¬à¦¾à¦° আইটেম \"%1\"", +UnknownCommand : "অজানা কমানà§à¦¡ \"%1\"", +NotImplemented : "কমানà§à¦¡ ইমপà§à¦²à¦¿à¦®à§‡à¦¨à§à¦Ÿ করা হয়নি", +UnknownToolbarSet : "টà§à¦²à¦¬à¦¾à¦° সেট \"%1\" à¦à¦° অসà§à¦¤à¦¿à¦¤à§à¦¬ নেই", +NoActiveX : "আপনার বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡à¦° সà§à¦°à¦•à§à¦·à¦¾ সেটিংস কারনে à¦à¦¡à¦¿à¦Ÿà¦°à§‡à¦° কিছৠফিচার পাওয়া নাও যেতে পারে। আপনাকে অবশà§à¦¯à¦‡ \"Run ActiveX controls and plug-ins\" à¦à¦¨à¦¾à¦¬à§‡à¦² করে নিতে হবে। আপনি ভà§à¦²à¦­à§à¦°à¦¾à¦¨à§à¦¤à¦¿ কিছৠকিছৠফিচারের অনà§à¦ªà¦¸à§à¦¥à¦¿à¦¤à¦¿ উপলবà§à¦§à¦¿ করতে পারেন।", +BrowseServerBlocked : "রিসোরà§à¦¸ বà§à¦°à¦¾à¦‰à¦œà¦¾à¦° খোলা গেল না। নিশà§à¦šà¦¿à¦¤ করà§à¦¨ যে সব পপআপ বà§à¦²à¦•à¦¾à¦° বনà§à¦§ করা আছে।", +DialogBlocked : "ডায়ালগ ইউনà§à¦¡à§‹ খোলা গেল না। নিশà§à¦šà¦¿à¦¤ করà§à¦¨ যে সব পপআপ বà§à¦²à¦•à¦¾à¦° বনà§à¦§ করা আছে।", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "ওকে", +DlgBtnCancel : "বাতিল", +DlgBtnClose : "বনà§à¦§ কর", +DlgBtnBrowseServer : "বà§à¦°à¦¾à¦‰à¦œ সারà§à¦­à¦¾à¦°", +DlgAdvancedTag : "à¦à¦¡à¦­à¦¾à¦¨à§à¦¸à¦¡", +DlgOpOther : "<অনà§à¦¯>", +DlgInfoTab : "তথà§à¦¯", +DlgAlertUrl : "দয়া করে URL যà§à¦•à§à¦¤ করà§à¦¨", + +// General Dialogs Labels +DlgGenNotSet : "<সেট নেই>", +DlgGenId : "আইডি", +DlgGenLangDir : "ভাষা লেখার দিক", +DlgGenLangDirLtr : "বাম থেকে ডান (LTR)", +DlgGenLangDirRtl : "ডান থেকে বাম (RTL)", +DlgGenLangCode : "ভাষা কোড", +DlgGenAccessKey : "à¦à¦•à§à¦¸à§‡à¦¸ কী", +DlgGenName : "নাম", +DlgGenTabIndex : "টà§à¦¯à¦¾à¦¬ ইনà§à¦¡à§‡à¦•à§à¦¸", +DlgGenLongDescr : "URL à¦à¦° লমà§à¦¬à¦¾ বরà§à¦£à¦¨à¦¾", +DlgGenClass : "সà§à¦Ÿà¦¾à¦‡à¦²-শীট কà§à¦²à¦¾à¦¸", +DlgGenTitle : "পরামরà§à¦¶ শীরà§à¦·à¦•", +DlgGenContType : "পরামরà§à¦¶ কনà§à¦Ÿà§‡à¦¨à§à¦Ÿà§‡à¦° পà§à¦°à¦•à¦¾à¦°", +DlgGenLinkCharset : "লিংক রিসোরà§à¦¸ কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦° সেট", +DlgGenStyle : "সà§à¦Ÿà¦¾à¦‡à¦²", + +// Image Dialog +DlgImgTitle : "ছবির পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +DlgImgInfoTab : "ছবির তথà§à¦¯", +DlgImgBtnUpload : "ইহাকে সারà§à¦­à¦¾à¦°à§‡ পà§à¦°à§‡à¦°à¦¨ কর", +DlgImgURL : "URL", +DlgImgUpload : "আপলোড", +DlgImgAlt : "বিকলà§à¦ª টেকà§à¦¸à¦Ÿ", +DlgImgWidth : "পà§à¦°à¦¸à§à¦¥", +DlgImgHeight : "দৈরà§à¦˜à§à¦¯", +DlgImgLockRatio : "অনà§à¦ªà¦¾à¦¤ লক কর", +DlgBtnResetSize : "সাইজ পূরà§à¦¬à¦¾à¦¬à¦¸à§à¦¥à¦¾à§Ÿ ফিরিয়ে দাও", +DlgImgBorder : "বরà§à¦¡à¦¾à¦°", +DlgImgHSpace : "হরাইজনà§à¦Ÿà¦¾à¦² সà§à¦ªà§‡à¦¸", +DlgImgVSpace : "ভারà§à¦Ÿà¦¿à¦•à§‡à¦² সà§à¦ªà§‡à¦¸", +DlgImgAlign : "à¦à¦²à¦¾à¦‡à¦¨", +DlgImgAlignLeft : "বামে", +DlgImgAlignAbsBottom: "Abs নীচে", +DlgImgAlignAbsMiddle: "Abs উপর", +DlgImgAlignBaseline : "মূল রেখা", +DlgImgAlignBottom : "নীচে", +DlgImgAlignMiddle : "মধà§à¦¯", +DlgImgAlignRight : "ডানে", +DlgImgAlignTextTop : "টেকà§à¦¸à¦Ÿ উপর", +DlgImgAlignTop : "উপর", +DlgImgPreview : "পà§à¦°à§€à¦­à¦¿à¦‰", +DlgImgAlertUrl : "অনà§à¦—à§à¦°à¦¹à¦• করে ছবির URL টাইপ করà§à¦¨", +DlgImgLinkTab : "লিংক", + +// Flash Dialog +DlgFlashTitle : "ফà§à¦²à§à¦¯à¦¾à¦¶ পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +DlgFlashChkPlay : "অটো পà§à¦²à§‡", +DlgFlashChkLoop : "লূপ", +DlgFlashChkMenu : "ফà§à¦²à§à¦¯à¦¾à¦¶ মেনৠà¦à¦¨à¦¾à¦¬à¦² কর", +DlgFlashScale : "সà§à¦•à§‡à¦²", +DlgFlashScaleAll : "সব দেখাও", +DlgFlashScaleNoBorder : "কোনো বরà§à¦¡à¦¾à¦° নেই", +DlgFlashScaleFit : "নিখà§à¦à¦¤ ফিট", + +// Link Dialog +DlgLnkWindowTitle : "লিংক", +DlgLnkInfoTab : "লিংক তথà§à¦¯", +DlgLnkTargetTab : "টারà§à¦—েট", + +DlgLnkType : "লিংক পà§à¦°à¦•à¦¾à¦°", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "à¦à¦‡ পেজে নোঙর কর", +DlgLnkTypeEMail : "ইমেইল", +DlgLnkProto : "পà§à¦°à§‹à¦Ÿà§‹à¦•à¦²", +DlgLnkProtoOther : "<অনà§à¦¯>", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "নোঙর বাছাই", +DlgLnkAnchorByName : "নোঙরের নাম দিয়ে", +DlgLnkAnchorById : "নোঙরের আইডি দিয়ে", +DlgLnkNoAnchors : "(No anchors available in the document)", //MISSING +DlgLnkEMail : "ইমেইল ঠিকানা", +DlgLnkEMailSubject : "মেসেজের বিষয়", +DlgLnkEMailBody : "মেসেজের দেহ", +DlgLnkUpload : "আপলোড", +DlgLnkBtnUpload : "à¦à¦•à§‡ সারà§à¦­à¦¾à¦°à§‡ পাঠাও", + +DlgLnkTarget : "টারà§à¦—েট", +DlgLnkTargetFrame : "<ফà§à¦°à§‡à¦®>", +DlgLnkTargetPopup : "<পপআপ উইনà§à¦¡à§‹>", +DlgLnkTargetBlank : "নতà§à¦¨ উইনà§à¦¡à§‹ (_blank)", +DlgLnkTargetParent : "মূল উইনà§à¦¡à§‹ (_parent)", +DlgLnkTargetSelf : "à¦à¦‡ উইনà§à¦¡à§‹ (_self)", +DlgLnkTargetTop : "শীরà§à¦· উইনà§à¦¡à§‹ (_top)", +DlgLnkTargetFrameName : "টারà§à¦—েট ফà§à¦°à§‡à¦®à§‡à¦° নাম", +DlgLnkPopWinName : "পপআপ উইনà§à¦¡à§‹à¦° নাম", +DlgLnkPopWinFeat : "পপআপ উইনà§à¦¡à§‹ ফীচার সমূহ", +DlgLnkPopResize : "রিসাইজ করা সমà§à¦­à¦¬", +DlgLnkPopLocation : "লোকেশন বার", +DlgLnkPopMenu : "মেনà§à¦¯à§ বার", +DlgLnkPopScroll : "সà§à¦•à§à¦°à¦² বার", +DlgLnkPopStatus : "সà§à¦Ÿà§à¦¯à¦¾à¦Ÿà¦¾à¦¸ বার", +DlgLnkPopToolbar : "টà§à¦² বার", +DlgLnkPopFullScrn : "পূরà§à¦£ পরà§à¦¦à¦¾ জà§à§œà§‡ (IE)", +DlgLnkPopDependent : "ডিপেনà§à¦¡à§‡à¦¨à§à¦Ÿ (Netscape)", +DlgLnkPopWidth : "পà§à¦°à¦¸à§à¦¥", +DlgLnkPopHeight : "দৈরà§à¦˜à§à¦¯", +DlgLnkPopLeft : "বামের পজিশন", +DlgLnkPopTop : "ডানের পজিশন", + +DlnLnkMsgNoUrl : "অনà§à¦—à§à¦°à¦¹ করে URL লিংক টাইপ করà§à¦¨", +DlnLnkMsgNoEMail : "অনà§à¦—à§à¦°à¦¹ করে ইমেইল à¦à¦¡à§à¦°à§‡à¦¸ টাইপ করà§à¦¨", +DlnLnkMsgNoAnchor : "অনà§à¦—à§à¦°à¦¹ করে নোঙর বাছাই করà§à¦¨", +DlnLnkMsgInvPopName : "The popup name must begin with an alphabetic character and must not contain spaces", //MISSING + +// Color Dialog +DlgColorTitle : "রং বাছাই কর", +DlgColorBtnClear : "পরিষà§à¦•à¦¾à¦° কর", +DlgColorHighlight : "হাইলাইট", +DlgColorSelected : "সিলেকà§à¦Ÿà§‡à¦¡", + +// Smiley Dialog +DlgSmileyTitle : "সà§à¦®à¦¾à¦‡à¦²à§€ যà§à¦•à§à¦¤ কর", + +// Special Character Dialog +DlgSpecialCharTitle : "বিশেষ কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦¾à¦° বাছাই কর", + +// Table Dialog +DlgTableTitle : "টেবিল পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +DlgTableRows : "রো", +DlgTableColumns : "কলাম", +DlgTableBorder : "বরà§à¦¡à¦¾à¦° সাইজ", +DlgTableAlign : "à¦à¦²à¦¾à¦‡à¦¨à¦®à§‡à¦¨à§à¦Ÿ", +DlgTableAlignNotSet : "<সেট নেই>", +DlgTableAlignLeft : "বামে", +DlgTableAlignCenter : "মাà¦à¦–ানে", +DlgTableAlignRight : "ডানে", +DlgTableWidth : "পà§à¦°à¦¸à§à¦¥", +DlgTableWidthPx : "পিকà§à¦¸à§‡à¦²", +DlgTableWidthPc : "শতকরা", +DlgTableHeight : "দৈরà§à¦˜à§à¦¯", +DlgTableCellSpace : "সেল সà§à¦ªà§‡à¦¸", +DlgTableCellPad : "সেল পà§à¦¯à¦¾à¦¡à¦¿à¦‚", +DlgTableCaption : "শীরà§à¦·à¦•", +DlgTableSummary : "সারাংশ", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "সেল পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +DlgCellWidth : "পà§à¦°à¦¸à§à¦¥", +DlgCellWidthPx : "পিকà§à¦¸à§‡à¦²", +DlgCellWidthPc : "শতকরা", +DlgCellHeight : "দৈরà§à¦˜à§à¦¯", +DlgCellWordWrap : "ওয়ারà§à¦¡ রেপ", +DlgCellWordWrapNotSet : "<সেট নেই>", +DlgCellWordWrapYes : "হাà¦", +DlgCellWordWrapNo : "না", +DlgCellHorAlign : "হরাইজনà§à¦Ÿà¦¾à¦² à¦à¦²à¦¾à¦‡à¦¨à¦®à§‡à¦¨à§à¦Ÿ", +DlgCellHorAlignNotSet : "<সেট নেই>", +DlgCellHorAlignLeft : "বামে", +DlgCellHorAlignCenter : "মাà¦à¦–ানে", +DlgCellHorAlignRight: "ডানে", +DlgCellVerAlign : "ভারà§à¦Ÿà¦¿à¦•à§à¦¯à¦¾à¦² à¦à¦²à¦¾à¦‡à¦¨à¦®à§‡à¦¨à§à¦Ÿ", +DlgCellVerAlignNotSet : "<সেট নেই>", +DlgCellVerAlignTop : "উপর", +DlgCellVerAlignMiddle : "মধà§à¦¯", +DlgCellVerAlignBottom : "নীচে", +DlgCellVerAlignBaseline : "মূলরেখা", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "রো সà§à¦ªà§à¦¯à¦¾à¦¨", +DlgCellCollSpan : "কলাম সà§à¦ªà§à¦¯à¦¾à¦¨", +DlgCellBackColor : "বà§à¦¯à¦¾à¦•à¦—à§à¦°à¦¾à¦‰à¦¨à§à¦¡ রং", +DlgCellBorderColor : "বরà§à¦¡à¦¾à¦°à§‡à¦° রং", +DlgCellBtnSelect : "বাছাই কর", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", //MISSING + +// Find Dialog +DlgFindTitle : "খোà¦à¦œà§‹", +DlgFindFindBtn : "খোà¦à¦œà§‹", +DlgFindNotFoundMsg : "আপনার উলà§à¦²à§‡à¦–িত টেকসà§à¦Ÿ পাওয়া যায়নি", + +// Replace Dialog +DlgReplaceTitle : "বদলে দাও", +DlgReplaceFindLbl : "যা খà§à¦à¦œà¦¤à§‡ হবে:", +DlgReplaceReplaceLbl : "যার সাথে বদলাতে হবে:", +DlgReplaceCaseChk : "কেস মিলাও", +DlgReplaceReplaceBtn : "বদলে দাও", +DlgReplaceReplAllBtn : "সব বদলে দাও", +DlgReplaceWordChk : "পà§à¦°à¦¾ শবà§à¦¦ মেলাও", + +// Paste Operations / Dialog +PasteErrorCut : "আপনার বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡à¦° সà§à¦°à¦•à§à¦·à¦¾ সেটিংস à¦à¦¡à¦¿à¦Ÿà¦°à¦•à§‡ অটোমেটিক কাট করার অনà§à¦®à¦¤à¦¿ দেয়নি। দয়া করে à¦à¦‡ কাজের জনà§à¦¯ কিবোরà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨ (Ctrl+X)।", +PasteErrorCopy : "আপনার বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡à¦° সà§à¦°à¦•à§à¦·à¦¾ সেটিংস à¦à¦¡à¦¿à¦Ÿà¦°à¦•à§‡ অটোমেটিক কপি করার অনà§à¦®à¦¤à¦¿ দেয়নি। দয়া করে à¦à¦‡ কাজের জনà§à¦¯ কিবোরà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨ (Ctrl+C)।", + +PasteAsText : "সাদা টেকà§à¦¸à¦Ÿ হিসেবে পেসà§à¦Ÿ কর", +PasteFromWord : "ওয়ারà§à¦¡ থেকে পেসà§à¦Ÿ কর", + +DlgPasteMsg2 : "অনà§à¦—à§à¦°à¦¹ করে নীচের বাকà§à¦¸à§‡ কিবোরà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে (Ctrl+V) পেসà§à¦Ÿ করà§à¦¨ à¦à¦¬à¦‚ OK চাপ দিন", +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", //MISSING +DlgPasteIgnoreFont : "ফনà§à¦Ÿ ফেস ডেফিনেশন ইগনোর করà§à¦¨", +DlgPasteRemoveStyles : "সà§à¦Ÿà¦¾à¦‡à¦² ডেফিনেশন সরিয়ে দিন", + +// Color Picker +ColorAutomatic : "অটোমেটিক", +ColorMoreColors : "আরও রং...", + +// Document Properties +DocProps : "ডকà§à¦¯à§à¦®à§‡à¦¨à§à¦Ÿ পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", + +// Anchor Dialog +DlgAnchorTitle : "নোঙরের পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +DlgAnchorName : "নোঙরের নাম", +DlgAnchorErrorName : "নোঙরের নাম টাইপ করà§à¦¨", + +// Speller Pages Dialog +DlgSpellNotInDic : "শবà§à¦¦à¦•à§‹à¦·à§‡ নেই", +DlgSpellChangeTo : "à¦à¦¤à§‡ বদলাও", +DlgSpellBtnIgnore : "ইগনোর কর", +DlgSpellBtnIgnoreAll : "সব ইগনোর কর", +DlgSpellBtnReplace : "বদলে দাও", +DlgSpellBtnReplaceAll : "সব বদলে দাও", +DlgSpellBtnUndo : "আনà§à¦¡à§", +DlgSpellNoSuggestions : "- কোন সাজেশন নেই -", +DlgSpellProgress : "বানান পরীকà§à¦·à¦¾ চলছে...", +DlgSpellNoMispell : "বানান পরীকà§à¦·à¦¾ শেষ: কোন ভà§à¦² বানান পাওয়া যায়নি", +DlgSpellNoChanges : "বানান পরীকà§à¦·à¦¾ শেষ: কোন শবà§à¦¦ পরিবরà§à¦¤à¦¨ করা হয়নি", +DlgSpellOneChange : "বানান পরীকà§à¦·à¦¾ শেষ: à¦à¦•à¦Ÿà¦¿ মাতà§à¦° শবà§à¦¦ পরিবরà§à¦¤à¦¨ করা হয়েছে", +DlgSpellManyChanges : "বানান পরীকà§à¦·à¦¾ শেষ: %1 গà§à¦²à§‹ শবà§à¦¦ বদলে গà§à¦¯à¦¾à¦›à§‡", + +IeSpellDownload : "বানান পরীকà§à¦·à¦• ইনসà§à¦Ÿà¦² করা নেই। আপনি কি à¦à¦–নই à¦à¦Ÿà¦¾ ডাউনলোড করতে চান?", + +// Button Dialog +DlgButtonText : "টেকà§à¦¸à¦Ÿ (ভà§à¦¯à¦¾à¦²à§)", +DlgButtonType : "পà§à¦°à¦•à¦¾à¦°", +DlgButtonTypeBtn : "Button", //MISSING +DlgButtonTypeSbm : "Submit", //MISSING +DlgButtonTypeRst : "Reset", //MISSING + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "নাম", +DlgCheckboxValue : "ভà§à¦¯à¦¾à¦²à§", +DlgCheckboxSelected : "সিলেকà§à¦Ÿà§‡à¦¡", + +// Form Dialog +DlgFormName : "নাম", +DlgFormAction : "à¦à¦•à¦¶à§à¦¯à¦¨", +DlgFormMethod : "পদà§à¦§à¦¤à¦¿", + +// Select Field Dialog +DlgSelectName : "নাম", +DlgSelectValue : "ভà§à¦¯à¦¾à¦²à§", +DlgSelectSize : "সাইজ", +DlgSelectLines : "লাইন সমূহ", +DlgSelectChkMulti : "à¦à¦•à¦¾à¦§à¦¿à¦• সিলেকশন à¦à¦²à¦¾à¦‰ কর", +DlgSelectOpAvail : "অনà§à¦¯à¦¾à¦¨à§à¦¯ বিকলà§à¦ª", +DlgSelectOpText : "টেকà§à¦¸à¦Ÿ", +DlgSelectOpValue : "ভà§à¦¯à¦¾à¦²à§", +DlgSelectBtnAdd : "যà§à¦•à§à¦¤", +DlgSelectBtnModify : "বদলে দাও", +DlgSelectBtnUp : "উপর", +DlgSelectBtnDown : "নীচে", +DlgSelectBtnSetValue : "বাছাই করা ভà§à¦¯à¦¾à¦²à§ হিসেবে সেট কর", +DlgSelectBtnDelete : "ডিলীট", + +// Textarea Dialog +DlgTextareaName : "নাম", +DlgTextareaCols : "কলাম", +DlgTextareaRows : "রো", + +// Text Field Dialog +DlgTextName : "নাম", +DlgTextValue : "ভà§à¦¯à¦¾à¦²à§", +DlgTextCharWidth : "কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦¾à¦° পà§à¦°à¦¶à¦¸à§à¦¤à¦¤à¦¾", +DlgTextMaxChars : "সরà§à¦¬à¦¾à¦§à¦¿à¦• কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦¾à¦°", +DlgTextType : "টাইপ", +DlgTextTypeText : "টেকà§à¦¸à¦Ÿ", +DlgTextTypePass : "পাসওয়ারà§à¦¡", + +// Hidden Field Dialog +DlgHiddenName : "নাম", +DlgHiddenValue : "ভà§à¦¯à¦¾à¦²à§", + +// Bulleted List Dialog +BulletedListProp : "বà§à¦²à§‡à¦Ÿà§‡à¦¡ সূচী পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +NumberedListProp : "সাংখà§à¦¯à¦¿à¦• সূচী পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿", +DlgLstStart : "Start", //MISSING +DlgLstType : "পà§à¦°à¦•à¦¾à¦°", +DlgLstTypeCircle : "গোল", +DlgLstTypeDisc : "ডিসà§à¦•", +DlgLstTypeSquare : "চৌকোণা", +DlgLstTypeNumbers : "সংখà§à¦¯à¦¾ (1, 2, 3)", +DlgLstTypeLCase : "ছোট অকà§à¦·à¦° (a, b, c)", +DlgLstTypeUCase : "বড় অকà§à¦·à¦° (A, B, C)", +DlgLstTypeSRoman : "ছোট রোমান সংখà§à¦¯à¦¾ (i, ii, iii)", +DlgLstTypeLRoman : "বড় রোমান সংখà§à¦¯à¦¾ (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "সাধারন", +DlgDocBackTab : "বà§à¦¯à¦¾à¦•à¦—à§à¦°à¦¾à¦‰à¦¨à§à¦¡", +DlgDocColorsTab : "রং à¦à¦¬à¦‚ মারà§à¦œà¦¿à¦¨", +DlgDocMetaTab : "মেটাডেটা", + +DlgDocPageTitle : "পেজ শীরà§à¦·à¦•", +DlgDocLangDir : "ভাষা লিখার দিক", +DlgDocLangDirLTR : "বাম থেকে ডানে (LTR)", +DlgDocLangDirRTL : "ডান থেকে বামে (RTL)", +DlgDocLangCode : "ভাষা কোড", +DlgDocCharSet : "কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦¾à¦° সেট à¦à¦¨à¦•à§‹à¦¡à¦¿à¦‚", +DlgDocCharSetCE : "Central European", //MISSING +DlgDocCharSetCT : "Chinese Traditional (Big5)", //MISSING +DlgDocCharSetCR : "Cyrillic", //MISSING +DlgDocCharSetGR : "Greek", //MISSING +DlgDocCharSetJP : "Japanese", //MISSING +DlgDocCharSetKR : "Korean", //MISSING +DlgDocCharSetTR : "Turkish", //MISSING +DlgDocCharSetUN : "Unicode (UTF-8)", //MISSING +DlgDocCharSetWE : "Western European", //MISSING +DlgDocCharSetOther : "অনà§à¦¯ কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦¾à¦° সেট à¦à¦¨à¦•à§‹à¦¡à¦¿à¦‚", + +DlgDocDocType : "ডকà§à¦¯à§à¦®à§‡à¦¨à§à¦Ÿ টাইপ হেডিং", +DlgDocDocTypeOther : "অনà§à¦¯ ডকà§à¦¯à§à¦®à§‡à¦¨à§à¦Ÿ টাইপ হেডিং", +DlgDocIncXHTML : "XHTML ডেকà§à¦²à¦¾à¦°à§‡à¦¶à¦¨ যà§à¦•à§à¦¤ কর", +DlgDocBgColor : "বà§à¦¯à¦¾à¦•à¦—à§à¦°à¦¾à¦‰à¦¨à§à¦¡ রং", +DlgDocBgImage : "বà§à¦¯à¦¾à¦•à¦—à§à¦°à¦¾à¦‰à¦¨à§à¦¡ ছবির URL", +DlgDocBgNoScroll : "সà§à¦•à§à¦°à¦²à¦¹à§€à¦¨ বà§à¦¯à¦¾à¦•à¦—à§à¦°à¦¾à¦‰à¦¨à§à¦¡", +DlgDocCText : "টেকà§à¦¸à¦Ÿ", +DlgDocCLink : "লিংক", +DlgDocCVisited : "ভিজিট করা লিংক", +DlgDocCActive : "সকà§à¦°à¦¿à§Ÿ লিংক", +DlgDocMargins : "পেজ মারà§à¦œà¦¿à¦¨", +DlgDocMaTop : "উপর", +DlgDocMaLeft : "বামে", +DlgDocMaRight : "ডানে", +DlgDocMaBottom : "নীচে", +DlgDocMeIndex : "ডকà§à¦¯à§à¦®à§‡à¦¨à§à¦Ÿ ইনà§à¦¡à§‡à¦•à§à¦¸ কিওয়ারà§à¦¡ (কমা দà§à¦¬à¦¾à¦°à¦¾ বিচà§à¦›à¦¿à¦¨à§à¦¨)", +DlgDocMeDescr : "ডকà§à¦¯à§‚মেনà§à¦Ÿ বরà§à¦£à¦¨à¦¾", +DlgDocMeAuthor : "লেখক", +DlgDocMeCopy : "কপীরাইট", +DlgDocPreview : "পà§à¦°à§€à¦­à¦¿à¦‰", + +// Templates Dialog +Templates : "টেমপà§à¦²à§‡à¦Ÿ", +DlgTemplatesTitle : "কনটেনà§à¦Ÿ টেমপà§à¦²à§‡à¦Ÿ", +DlgTemplatesSelMsg : "অনà§à¦—à§à¦°à¦¹ করে à¦à¦¡à¦¿à¦Ÿà¦°à§‡ ওপেন করার জনà§à¦¯ টেমপà§à¦²à§‡à¦Ÿ বাছাই করà§à¦¨
    (আসল কনটেনà§à¦Ÿ হারিয়ে যাবে):", +DlgTemplatesLoading : "টেমপà§à¦²à§‡à¦Ÿ লিসà§à¦Ÿ হারিয়ে যাবে। অনà§à¦—à§à¦°à¦¹ করে অপেকà§à¦·à¦¾ করà§à¦¨...", +DlgTemplatesNoTpl : "(কোন টেমপà§à¦²à§‡à¦Ÿ ডিফাইন করা নেই)", +DlgTemplatesReplace : "Replace actual contents", //MISSING + +// About Dialog +DlgAboutAboutTab : "কে বানিয়েছে", +DlgAboutBrowserInfoTab : "বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡à¦° বà§à¦¯à¦¾à¦ªà¦¾à¦°à§‡ তথà§à¦¯", +DlgAboutLicenseTab : "লাইসেনà§à¦¸", +DlgAboutVersion : "ভারà§à¦¸à¦¨", +DlgAboutInfo : "আরও তথà§à¦¯à§‡à¦° জনà§à¦¯ যান", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/bs.js b/webdir/fckeditor/editor/lang/bs.js new file mode 100644 index 0000000..1040901 --- /dev/null +++ b/webdir/fckeditor/editor/lang/bs.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Bosnian language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Skupi trake sa alatima", +ToolbarExpand : "Otvori trake sa alatima", + +// Toolbar Items and Context Menu +Save : "Snimi", +NewPage : "Novi dokument", +Preview : "Prikaži", +Cut : "Izreži", +Copy : "Kopiraj", +Paste : "Zalijepi", +PasteText : "Zalijepi kao obièan tekst", +PasteWord : "Zalijepi iz Word-a", +Print : "Å tampaj", +SelectAll : "Selektuj sve", +RemoveFormat : "PoniÅ¡ti format", +InsertLinkLbl : "Link", +InsertLink : "Ubaci/Izmjeni link", +RemoveLink : "IzbriÅ¡i link", +VisitLink : "Open Link", //MISSING +Anchor : "Insert/Edit Anchor", //MISSING +AnchorDelete : "Remove Anchor", //MISSING +InsertImageLbl : "Slika", +InsertImage : "Ubaci/Izmjeni sliku", +InsertFlashLbl : "Flash", //MISSING +InsertFlash : "Insert/Edit Flash", //MISSING +InsertTableLbl : "Tabela", +InsertTable : "Ubaci/Izmjeni tabelu", +InsertLineLbl : "Linija", +InsertLine : "Ubaci horizontalnu liniju", +InsertSpecialCharLbl: "Specijalni karakter", +InsertSpecialChar : "Ubaci specijalni karater", +InsertSmileyLbl : "SmjeÅ¡ko", +InsertSmiley : "Ubaci smjeÅ¡ka", +About : "O FCKeditor-u", +Bold : "Boldiraj", +Italic : "Ukosi", +Underline : "Podvuci", +StrikeThrough : "Precrtaj", +Subscript : "Subscript", +Superscript : "Superscript", +LeftJustify : "Lijevo poravnanje", +CenterJustify : "Centralno poravnanje", +RightJustify : "Desno poravnanje", +BlockJustify : "Puno poravnanje", +DecreaseIndent : "Smanji uvod", +IncreaseIndent : "Poveæaj uvod", +Blockquote : "Blockquote", //MISSING +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "Vrati", +Redo : "Ponovi", +NumberedListLbl : "Numerisana lista", +NumberedList : "Ubaci/Izmjeni numerisanu listu", +BulletedListLbl : "Lista", +BulletedList : "Ubaci/Izmjeni listu", +ShowTableBorders : "Pokaži okvire tabela", +ShowDetails : "Pokaži detalje", +Style : "Stil", +FontFormat : "Format", +Font : "Font", +FontSize : "Velièina", +TextColor : "Boja teksta", +BGColor : "Boja pozadine", +Source : "HTML kôd", +Find : "Naði", +Replace : "Zamjeni", +SpellCheck : "Check Spelling", //MISSING +UniversalKeyboard : "Universal Keyboard", //MISSING +PageBreakLbl : "Page Break", //MISSING +PageBreak : "Insert Page Break", //MISSING + +Form : "Form", //MISSING +Checkbox : "Checkbox", //MISSING +RadioButton : "Radio Button", //MISSING +TextField : "Text Field", //MISSING +Textarea : "Textarea", //MISSING +HiddenField : "Hidden Field", //MISSING +Button : "Button", //MISSING +SelectionField : "Selection Field", //MISSING +ImageButton : "Image Button", //MISSING + +FitWindow : "Maximize the editor size", //MISSING +ShowBlocks : "Show Blocks", //MISSING + +// Context Menu +EditLink : "Izmjeni link", +CellCM : "Cell", //MISSING +RowCM : "Row", //MISSING +ColumnCM : "Column", //MISSING +InsertRowAfter : "Insert Row After", //MISSING +InsertRowBefore : "Insert Row Before", //MISSING +DeleteRows : "BriÅ¡i redove", +InsertColumnAfter : "Insert Column After", //MISSING +InsertColumnBefore : "Insert Column Before", //MISSING +DeleteColumns : "BriÅ¡i kolone", +InsertCellAfter : "Insert Cell After", //MISSING +InsertCellBefore : "Insert Cell Before", //MISSING +DeleteCells : "BriÅ¡i æelije", +MergeCells : "Spoji æelije", +MergeRight : "Merge Right", //MISSING +MergeDown : "Merge Down", //MISSING +HorizontalSplitCell : "Split Cell Horizontally", //MISSING +VerticalSplitCell : "Split Cell Vertically", //MISSING +TableDelete : "Delete Table", //MISSING +CellProperties : "Svojstva æelije", +TableProperties : "Svojstva tabele", +ImageProperties : "Svojstva slike", +FlashProperties : "Flash Properties", //MISSING + +AnchorProp : "Anchor Properties", //MISSING +ButtonProp : "Button Properties", //MISSING +CheckboxProp : "Checkbox Properties", //MISSING +HiddenFieldProp : "Hidden Field Properties", //MISSING +RadioButtonProp : "Radio Button Properties", //MISSING +ImageButtonProp : "Image Button Properties", //MISSING +TextFieldProp : "Text Field Properties", //MISSING +SelectionFieldProp : "Selection Field Properties", //MISSING +TextareaProp : "Textarea Properties", //MISSING +FormProp : "Form Properties", //MISSING + +FontFormats : "Normal;Formatted;Address;Heading 1;Heading 2;Heading 3;Heading 4;Heading 5;Heading 6", + +// Alerts and Messages +ProcessingXHTML : "Procesiram XHTML. Molim saèekajte...", +Done : "Gotovo", +PasteWordConfirm : "Tekst koji želite zalijepiti èini se da je kopiran iz Worda. Da li želite da se prvo oèisti?", +NotCompatiblePaste : "Ova komanda je podržana u Internet Explorer-u verzijama 5.5 ili novijim. Da li želite da izvrÅ¡ite lijepljenje teksta bez èišæenja?", +UnknownToolbarItem : "Nepoznata stavka sa trake sa alatima \"%1\"", +UnknownCommand : "Nepoznata komanda \"%1\"", +NotImplemented : "Komanda nije implementirana", +UnknownToolbarSet : "Traka sa alatima \"%1\" ne postoji", +NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", //MISSING +BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", //MISSING +DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", //MISSING +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Odustani", +DlgBtnClose : "Zatvori", +DlgBtnBrowseServer : "Browse Server", //MISSING +DlgAdvancedTag : "Naprednije", +DlgOpOther : "", //MISSING +DlgInfoTab : "Info", //MISSING +DlgAlertUrl : "Please insert the URL", //MISSING + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Smjer pisanja", +DlgGenLangDirLtr : "S lijeva na desno (LTR)", +DlgGenLangDirRtl : "S desna na lijevo (RTL)", +DlgGenLangCode : "Jezièni kôd", +DlgGenAccessKey : "Pristupna tipka", +DlgGenName : "Naziv", +DlgGenTabIndex : "Tab indeks", +DlgGenLongDescr : "Dugaèki opis URL-a", +DlgGenClass : "Klase CSS stilova", +DlgGenTitle : "Advisory title", +DlgGenContType : "Advisory vrsta sadržaja", +DlgGenLinkCharset : "Linked Resource Charset", +DlgGenStyle : "Stil", + +// Image Dialog +DlgImgTitle : "Svojstva slike", +DlgImgInfoTab : "Info slike", +DlgImgBtnUpload : "Å alji na server", +DlgImgURL : "URL", +DlgImgUpload : "Å alji", +DlgImgAlt : "Tekst na slici", +DlgImgWidth : "Å irina", +DlgImgHeight : "Visina", +DlgImgLockRatio : "Zakljuèaj odnos", +DlgBtnResetSize : "Resetuj dimenzije", +DlgImgBorder : "Okvir", +DlgImgHSpace : "HSpace", +DlgImgVSpace : "VSpace", +DlgImgAlign : "Poravnanje", +DlgImgAlignLeft : "Lijevo", +DlgImgAlignAbsBottom: "Abs dole", +DlgImgAlignAbsMiddle: "Abs sredina", +DlgImgAlignBaseline : "Bazno", +DlgImgAlignBottom : "Dno", +DlgImgAlignMiddle : "Sredina", +DlgImgAlignRight : "Desno", +DlgImgAlignTextTop : "Vrh teksta", +DlgImgAlignTop : "Vrh", +DlgImgPreview : "Prikaz", +DlgImgAlertUrl : "Molimo ukucajte URL od slike.", +DlgImgLinkTab : "Link", //MISSING + +// Flash Dialog +DlgFlashTitle : "Flash Properties", //MISSING +DlgFlashChkPlay : "Auto Play", //MISSING +DlgFlashChkLoop : "Loop", //MISSING +DlgFlashChkMenu : "Enable Flash Menu", //MISSING +DlgFlashScale : "Scale", //MISSING +DlgFlashScaleAll : "Show all", //MISSING +DlgFlashScaleNoBorder : "No Border", //MISSING +DlgFlashScaleFit : "Exact Fit", //MISSING + +// Link Dialog +DlgLnkWindowTitle : "Link", +DlgLnkInfoTab : "Link info", +DlgLnkTargetTab : "Prozor", + +DlgLnkType : "Tip linka", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Sidro na ovoj stranici", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protokol", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Izaberi sidro", +DlgLnkAnchorByName : "Po nazivu sidra", +DlgLnkAnchorById : "Po Id-u elementa", +DlgLnkNoAnchors : "(Nema dostupnih sidra na stranici)", +DlgLnkEMail : "E-Mail Adresa", +DlgLnkEMailSubject : "Subjekt poruke", +DlgLnkEMailBody : "Poruka", +DlgLnkUpload : "Å alji", +DlgLnkBtnUpload : "Å alji na server", + +DlgLnkTarget : "Prozor", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Novi prozor (_blank)", +DlgLnkTargetParent : "Glavni prozor (_parent)", +DlgLnkTargetSelf : "Isti prozor (_self)", +DlgLnkTargetTop : "Najgornji prozor (_top)", +DlgLnkTargetFrameName : "Target Frame Name", //MISSING +DlgLnkPopWinName : "Naziv popup prozora", +DlgLnkPopWinFeat : "Moguænosti popup prozora", +DlgLnkPopResize : "Promjenljive velièine", +DlgLnkPopLocation : "Traka za lokaciju", +DlgLnkPopMenu : "Izborna traka", +DlgLnkPopScroll : "Scroll traka", +DlgLnkPopStatus : "Statusna traka", +DlgLnkPopToolbar : "Traka sa alatima", +DlgLnkPopFullScrn : "Cijeli ekran (IE)", +DlgLnkPopDependent : "Ovisno (Netscape)", +DlgLnkPopWidth : "Å irina", +DlgLnkPopHeight : "Visina", +DlgLnkPopLeft : "Lijeva pozicija", +DlgLnkPopTop : "Gornja pozicija", + +DlnLnkMsgNoUrl : "Molimo ukucajte URL link", +DlnLnkMsgNoEMail : "Molimo ukucajte e-mail adresu", +DlnLnkMsgNoAnchor : "Molimo izaberite sidro", +DlnLnkMsgInvPopName : "The popup name must begin with an alphabetic character and must not contain spaces", //MISSING + +// Color Dialog +DlgColorTitle : "Izaberi boju", +DlgColorBtnClear : "Oèisti", +DlgColorHighlight : "Igled", +DlgColorSelected : "Selektovana", + +// Smiley Dialog +DlgSmileyTitle : "Ubaci smjeÅ¡ka", + +// Special Character Dialog +DlgSpecialCharTitle : "Izaberi specijalni karakter", + +// Table Dialog +DlgTableTitle : "Svojstva tabele", +DlgTableRows : "Redova", +DlgTableColumns : "Kolona", +DlgTableBorder : "Okvir", +DlgTableAlign : "Poravnanje", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Lijevo", +DlgTableAlignCenter : "Centar", +DlgTableAlignRight : "Desno", +DlgTableWidth : "Å irina", +DlgTableWidthPx : "piksela", +DlgTableWidthPc : "posto", +DlgTableHeight : "Visina", +DlgTableCellSpace : "Razmak æelija", +DlgTableCellPad : "Uvod æelija", +DlgTableCaption : "Naslov", +DlgTableSummary : "Summary", //MISSING +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Svojstva æelije", +DlgCellWidth : "Å irina", +DlgCellWidthPx : "piksela", +DlgCellWidthPc : "posto", +DlgCellHeight : "Visina", +DlgCellWordWrap : "Vrapuj tekst", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Da", +DlgCellWordWrapNo : "Ne", +DlgCellHorAlign : "Horizontalno poravnanje", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Lijevo", +DlgCellHorAlignCenter : "Centar", +DlgCellHorAlignRight: "Desno", +DlgCellVerAlign : "Vertikalno poravnanje", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Gore", +DlgCellVerAlignMiddle : "Sredina", +DlgCellVerAlignBottom : "Dno", +DlgCellVerAlignBaseline : "Bazno", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Spajanje æelija", +DlgCellCollSpan : "Spajanje kolona", +DlgCellBackColor : "Boja pozadine", +DlgCellBorderColor : "Boja okvira", +DlgCellBtnSelect : "Selektuj...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", //MISSING + +// Find Dialog +DlgFindTitle : "Naði", +DlgFindFindBtn : "Naði", +DlgFindNotFoundMsg : "Traženi tekst nije pronaðen.", + +// Replace Dialog +DlgReplaceTitle : "Zamjeni", +DlgReplaceFindLbl : "Naði Å¡ta:", +DlgReplaceReplaceLbl : "Zamjeni sa:", +DlgReplaceCaseChk : "Uporeðuj velika/mala slova", +DlgReplaceReplaceBtn : "Zamjeni", +DlgReplaceReplAllBtn : "Zamjeni sve", +DlgReplaceWordChk : "Uporeðuj samo cijelu rijeè", + +// Paste Operations / Dialog +PasteErrorCut : "Sigurnosne postavke vaÅ¡eg pretraživaèa ne dozvoljavaju operacije automatskog rezanja. Molimo koristite kraticu na tastaturi (Ctrl+X).", +PasteErrorCopy : "Sigurnosne postavke VaÅ¡eg pretraživaèa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tastaturi (Ctrl+C).", + +PasteAsText : "Zalijepi kao obièan tekst", +PasteFromWord : "Zalijepi iz Word-a", + +DlgPasteMsg2 : "Please paste inside the following box using the keyboard (Ctrl+V) and hit OK.", //MISSING +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", //MISSING +DlgPasteIgnoreFont : "Ignore Font Face definitions", //MISSING +DlgPasteRemoveStyles : "Remove Styles definitions", //MISSING + +// Color Picker +ColorAutomatic : "Automatska", +ColorMoreColors : "ViÅ¡e boja...", + +// Document Properties +DocProps : "Document Properties", //MISSING + +// Anchor Dialog +DlgAnchorTitle : "Anchor Properties", //MISSING +DlgAnchorName : "Anchor Name", //MISSING +DlgAnchorErrorName : "Please type the anchor name", //MISSING + +// Speller Pages Dialog +DlgSpellNotInDic : "Not in dictionary", //MISSING +DlgSpellChangeTo : "Change to", //MISSING +DlgSpellBtnIgnore : "Ignore", //MISSING +DlgSpellBtnIgnoreAll : "Ignore All", //MISSING +DlgSpellBtnReplace : "Replace", //MISSING +DlgSpellBtnReplaceAll : "Replace All", //MISSING +DlgSpellBtnUndo : "Undo", //MISSING +DlgSpellNoSuggestions : "- No suggestions -", //MISSING +DlgSpellProgress : "Spell check in progress...", //MISSING +DlgSpellNoMispell : "Spell check complete: No misspellings found", //MISSING +DlgSpellNoChanges : "Spell check complete: No words changed", //MISSING +DlgSpellOneChange : "Spell check complete: One word changed", //MISSING +DlgSpellManyChanges : "Spell check complete: %1 words changed", //MISSING + +IeSpellDownload : "Spell checker not installed. Do you want to download it now?", //MISSING + +// Button Dialog +DlgButtonText : "Text (Value)", //MISSING +DlgButtonType : "Type", //MISSING +DlgButtonTypeBtn : "Button", //MISSING +DlgButtonTypeSbm : "Submit", //MISSING +DlgButtonTypeRst : "Reset", //MISSING + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Name", //MISSING +DlgCheckboxValue : "Value", //MISSING +DlgCheckboxSelected : "Selected", //MISSING + +// Form Dialog +DlgFormName : "Name", //MISSING +DlgFormAction : "Action", //MISSING +DlgFormMethod : "Method", //MISSING + +// Select Field Dialog +DlgSelectName : "Name", //MISSING +DlgSelectValue : "Value", //MISSING +DlgSelectSize : "Size", //MISSING +DlgSelectLines : "lines", //MISSING +DlgSelectChkMulti : "Allow multiple selections", //MISSING +DlgSelectOpAvail : "Available Options", //MISSING +DlgSelectOpText : "Text", //MISSING +DlgSelectOpValue : "Value", //MISSING +DlgSelectBtnAdd : "Add", //MISSING +DlgSelectBtnModify : "Modify", //MISSING +DlgSelectBtnUp : "Up", //MISSING +DlgSelectBtnDown : "Down", //MISSING +DlgSelectBtnSetValue : "Set as selected value", //MISSING +DlgSelectBtnDelete : "Delete", //MISSING + +// Textarea Dialog +DlgTextareaName : "Name", //MISSING +DlgTextareaCols : "Columns", //MISSING +DlgTextareaRows : "Rows", //MISSING + +// Text Field Dialog +DlgTextName : "Name", //MISSING +DlgTextValue : "Value", //MISSING +DlgTextCharWidth : "Character Width", //MISSING +DlgTextMaxChars : "Maximum Characters", //MISSING +DlgTextType : "Type", //MISSING +DlgTextTypeText : "Text", //MISSING +DlgTextTypePass : "Password", //MISSING + +// Hidden Field Dialog +DlgHiddenName : "Name", //MISSING +DlgHiddenValue : "Value", //MISSING + +// Bulleted List Dialog +BulletedListProp : "Bulleted List Properties", //MISSING +NumberedListProp : "Numbered List Properties", //MISSING +DlgLstStart : "Start", //MISSING +DlgLstType : "Type", //MISSING +DlgLstTypeCircle : "Circle", //MISSING +DlgLstTypeDisc : "Disc", //MISSING +DlgLstTypeSquare : "Square", //MISSING +DlgLstTypeNumbers : "Numbers (1, 2, 3)", //MISSING +DlgLstTypeLCase : "Lowercase Letters (a, b, c)", //MISSING +DlgLstTypeUCase : "Uppercase Letters (A, B, C)", //MISSING +DlgLstTypeSRoman : "Small Roman Numerals (i, ii, iii)", //MISSING +DlgLstTypeLRoman : "Large Roman Numerals (I, II, III)", //MISSING + +// Document Properties Dialog +DlgDocGeneralTab : "General", //MISSING +DlgDocBackTab : "Background", //MISSING +DlgDocColorsTab : "Colors and Margins", //MISSING +DlgDocMetaTab : "Meta Data", //MISSING + +DlgDocPageTitle : "Page Title", //MISSING +DlgDocLangDir : "Language Direction", //MISSING +DlgDocLangDirLTR : "Left to Right (LTR)", //MISSING +DlgDocLangDirRTL : "Right to Left (RTL)", //MISSING +DlgDocLangCode : "Language Code", //MISSING +DlgDocCharSet : "Character Set Encoding", //MISSING +DlgDocCharSetCE : "Central European", //MISSING +DlgDocCharSetCT : "Chinese Traditional (Big5)", //MISSING +DlgDocCharSetCR : "Cyrillic", //MISSING +DlgDocCharSetGR : "Greek", //MISSING +DlgDocCharSetJP : "Japanese", //MISSING +DlgDocCharSetKR : "Korean", //MISSING +DlgDocCharSetTR : "Turkish", //MISSING +DlgDocCharSetUN : "Unicode (UTF-8)", //MISSING +DlgDocCharSetWE : "Western European", //MISSING +DlgDocCharSetOther : "Other Character Set Encoding", //MISSING + +DlgDocDocType : "Document Type Heading", //MISSING +DlgDocDocTypeOther : "Other Document Type Heading", //MISSING +DlgDocIncXHTML : "Include XHTML Declarations", //MISSING +DlgDocBgColor : "Background Color", //MISSING +DlgDocBgImage : "Background Image URL", //MISSING +DlgDocBgNoScroll : "Nonscrolling Background", //MISSING +DlgDocCText : "Text", //MISSING +DlgDocCLink : "Link", //MISSING +DlgDocCVisited : "Visited Link", //MISSING +DlgDocCActive : "Active Link", //MISSING +DlgDocMargins : "Page Margins", //MISSING +DlgDocMaTop : "Top", //MISSING +DlgDocMaLeft : "Left", //MISSING +DlgDocMaRight : "Right", //MISSING +DlgDocMaBottom : "Bottom", //MISSING +DlgDocMeIndex : "Document Indexing Keywords (comma separated)", //MISSING +DlgDocMeDescr : "Document Description", //MISSING +DlgDocMeAuthor : "Author", //MISSING +DlgDocMeCopy : "Copyright", //MISSING +DlgDocPreview : "Preview", //MISSING + +// Templates Dialog +Templates : "Templates", //MISSING +DlgTemplatesTitle : "Content Templates", //MISSING +DlgTemplatesSelMsg : "Please select the template to open in the editor
    (the actual contents will be lost):", //MISSING +DlgTemplatesLoading : "Loading templates list. Please wait...", //MISSING +DlgTemplatesNoTpl : "(No templates defined)", //MISSING +DlgTemplatesReplace : "Replace actual contents", //MISSING + +// About Dialog +DlgAboutAboutTab : "About", //MISSING +DlgAboutBrowserInfoTab : "Browser Info", //MISSING +DlgAboutLicenseTab : "License", //MISSING +DlgAboutVersion : "verzija", +DlgAboutInfo : "Za više informacija posjetite", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/ca.js b/webdir/fckeditor/editor/lang/ca.js new file mode 100644 index 0000000..7cce7fc --- /dev/null +++ b/webdir/fckeditor/editor/lang/ca.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Catalan language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Redueix la barra d'eines", +ToolbarExpand : "Amplia la barra d'eines", + +// Toolbar Items and Context Menu +Save : "Desa", +NewPage : "Nova Pàgina", +Preview : "Visualització prèvia", +Cut : "Retalla", +Copy : "Copia", +Paste : "Enganxa", +PasteText : "Enganxa com a text no formatat", +PasteWord : "Enganxa des del Word", +Print : "Imprimeix", +SelectAll : "Selecciona-ho tot", +RemoveFormat : "Elimina Format", +InsertLinkLbl : "Enllaç", +InsertLink : "Insereix/Edita enllaç", +RemoveLink : "Elimina l'enllaç", +VisitLink : "Obre l'enllaç", +Anchor : "Insereix/Edita àncora", +AnchorDelete : "Elimina àncora", +InsertImageLbl : "Imatge", +InsertImage : "Insereix/Edita imatge", +InsertFlashLbl : "Flash", +InsertFlash : "Insereix/Edita Flash", +InsertTableLbl : "Taula", +InsertTable : "Insereix/Edita taula", +InsertLineLbl : "Línia", +InsertLine : "Insereix línia horitzontal", +InsertSpecialCharLbl: "Caràcter Especial", +InsertSpecialChar : "Insereix caràcter especial", +InsertSmileyLbl : "Icona", +InsertSmiley : "Insereix icona", +About : "Quant a l'FCKeditor", +Bold : "Negreta", +Italic : "Cursiva", +Underline : "Subratllat", +StrikeThrough : "Barrat", +Subscript : "Subíndex", +Superscript : "Superíndex", +LeftJustify : "Alinia a l'esquerra", +CenterJustify : "Centrat", +RightJustify : "Alinia a la dreta", +BlockJustify : "Justificat", +DecreaseIndent : "Redueix el sagnat", +IncreaseIndent : "Augmenta el sagnat", +Blockquote : "Bloc de cita", +CreateDiv : "Crea un contenidor Div", +EditDiv : "Edita el contenidor Div", +DeleteDiv : "Elimina el contenidor Div", +Undo : "Desfés", +Redo : "Refés", +NumberedListLbl : "Llista numerada", +NumberedList : "Numeració activada/desactivada", +BulletedListLbl : "Llista de pics", +BulletedList : "Pics activats/descativats", +ShowTableBorders : "Mostra les vores de les taules", +ShowDetails : "Mostra detalls", +Style : "Estil", +FontFormat : "Format", +Font : "Tipus de lletra", +FontSize : "Mida", +TextColor : "Color de Text", +BGColor : "Color de Fons", +Source : "Codi font", +Find : "Cerca", +Replace : "Reemplaça", +SpellCheck : "Revisa l'ortografia", +UniversalKeyboard : "Teclat universal", +PageBreakLbl : "Salt de pàgina", +PageBreak : "Insereix salt de pàgina", + +Form : "Formulari", +Checkbox : "Casella de verificació", +RadioButton : "Botó d'opció", +TextField : "Camp de text", +Textarea : "Àrea de text", +HiddenField : "Camp ocult", +Button : "Botó", +SelectionField : "Camp de selecció", +ImageButton : "Botó d'imatge", + +FitWindow : "Maximiza la mida de l'editor", +ShowBlocks : "Mostra els blocs", + +// Context Menu +EditLink : "Edita l'enllaç", +CellCM : "Cel·la", +RowCM : "Fila", +ColumnCM : "Columna", +InsertRowAfter : "Insereix fila darrera", +InsertRowBefore : "Insereix fila abans de", +DeleteRows : "Suprimeix una fila", +InsertColumnAfter : "Insereix columna darrera", +InsertColumnBefore : "Insereix columna abans de", +DeleteColumns : "Suprimeix una columna", +InsertCellAfter : "Insereix cel·la darrera", +InsertCellBefore : "Insereix cel·la abans de", +DeleteCells : "Suprimeix les cel·les", +MergeCells : "Fusiona les cel·les", +MergeRight : "Fusiona cap a la dreta", +MergeDown : "Fusiona cap avall", +HorizontalSplitCell : "Divideix la cel·la horitzontalment", +VerticalSplitCell : "Divideix la cel·la verticalment", +TableDelete : "Suprimeix la taula", +CellProperties : "Propietats de la cel·la", +TableProperties : "Propietats de la taula", +ImageProperties : "Propietats de la imatge", +FlashProperties : "Propietats del Flash", + +AnchorProp : "Propietats de l'àncora", +ButtonProp : "Propietats del botó", +CheckboxProp : "Propietats de la casella de verificació", +HiddenFieldProp : "Propietats del camp ocult", +RadioButtonProp : "Propietats del botó d'opció", +ImageButtonProp : "Propietats del botó d'imatge", +TextFieldProp : "Propietats del camp de text", +SelectionFieldProp : "Propietats del camp de selecció", +TextareaProp : "Propietats de l'àrea de text", +FormProp : "Propietats del formulari", + +FontFormats : "Normal;Formatejat;Adreça;Encapçalament 1;Encapçalament 2;Encapçalament 3;Encapçalament 4;Encapçalament 5;Encapçalament 6;Normal (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Processant XHTML. Si us plau esperi...", +Done : "Fet", +PasteWordConfirm : "El text que voleu enganxar sembla provenir de Word. Voleu netejar aquest text abans que sigui enganxat?", +NotCompatiblePaste : "Aquesta funció és disponible per a Internet Explorer versió 5.5 o superior. Voleu enganxar sense netejar?", +UnknownToolbarItem : "Element de la barra d'eines desconegut \"%1\"", +UnknownCommand : "Nom de comanda desconegut \"%1\"", +NotImplemented : "Mètode no implementat", +UnknownToolbarSet : "Conjunt de barra d'eines \"%1\" inexistent", +NoActiveX : "Les preferències del navegador poden limitar algunes funcions d'aquest editor. Cal habilitar l'opció \"Executa controls ActiveX i plug-ins\". Poden sorgir errors i poden faltar algunes funcions.", +BrowseServerBlocked : "El visualitzador de recursos no s'ha pogut obrir. Assegura't de que els bloquejos de finestres emergents estan desactivats.", +DialogBlocked : "No ha estat possible obrir una finestra de diàleg. Assegureu-vos que els bloquejos de finestres emergents estan desactivats.", +VisitLinkBlocked : "No ha estat possible obrir una nova finestra. Assegureu-vos que els bloquejos de finestres emergents estan desactivats.", + +// Dialogs +DlgBtnOK : "D'acord", +DlgBtnCancel : "Cancel·la", +DlgBtnClose : "Tanca", +DlgBtnBrowseServer : "Veure servidor", +DlgAdvancedTag : "Avançat", +DlgOpOther : "Altres", +DlgInfoTab : "Info", +DlgAlertUrl : "Si us plau, afegiu la URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Direcció de l'idioma", +DlgGenLangDirLtr : "D'esquerra a dreta (LTR)", +DlgGenLangDirRtl : "De dreta a esquerra (RTL)", +DlgGenLangCode : "Codi d'idioma", +DlgGenAccessKey : "Clau d'accés", +DlgGenName : "Nom", +DlgGenTabIndex : "Index de Tab", +DlgGenLongDescr : "Descripció llarga de la URL", +DlgGenClass : "Classes del full d'estil", +DlgGenTitle : "Títol consultiu", +DlgGenContType : "Tipus de contingut consultiu", +DlgGenLinkCharset : "Conjunt de caràcters font enllaçat", +DlgGenStyle : "Estil", + +// Image Dialog +DlgImgTitle : "Propietats de la imatge", +DlgImgInfoTab : "Informació de la imatge", +DlgImgBtnUpload : "Envia-la al servidor", +DlgImgURL : "URL", +DlgImgUpload : "Puja", +DlgImgAlt : "Text alternatiu", +DlgImgWidth : "Amplada", +DlgImgHeight : "Alçada", +DlgImgLockRatio : "Bloqueja les proporcions", +DlgBtnResetSize : "Restaura la mida", +DlgImgBorder : "Vora", +DlgImgHSpace : "Espaiat horit.", +DlgImgVSpace : "Espaiat vert.", +DlgImgAlign : "Alineació", +DlgImgAlignLeft : "Ajusta a l'esquerra", +DlgImgAlignAbsBottom: "Abs Bottom", +DlgImgAlignAbsMiddle: "Abs Middle", +DlgImgAlignBaseline : "Baseline", +DlgImgAlignBottom : "Bottom", +DlgImgAlignMiddle : "Middle", +DlgImgAlignRight : "Ajusta a la dreta", +DlgImgAlignTextTop : "Text Top", +DlgImgAlignTop : "Top", +DlgImgPreview : "Vista prèvia", +DlgImgAlertUrl : "Si us plau, escriviu la URL de la imatge", +DlgImgLinkTab : "Enllaç", + +// Flash Dialog +DlgFlashTitle : "Propietats del Flash", +DlgFlashChkPlay : "Reprodució automàtica", +DlgFlashChkLoop : "Bucle", +DlgFlashChkMenu : "Habilita menú Flash", +DlgFlashScale : "Escala", +DlgFlashScaleAll : "Mostra-ho tot", +DlgFlashScaleNoBorder : "Sense vores", +DlgFlashScaleFit : "Mida exacta", + +// Link Dialog +DlgLnkWindowTitle : "Enllaç", +DlgLnkInfoTab : "Informació de l'enllaç", +DlgLnkTargetTab : "Destí", + +DlgLnkType : "Tipus d'enllaç", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Àncora en aquesta pàgina", +DlgLnkTypeEMail : "Correu electrònic", +DlgLnkProto : "Protocol", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Selecciona una àncora", +DlgLnkAnchorByName : "Per nom d'àncora", +DlgLnkAnchorById : "Per Id d'element", +DlgLnkNoAnchors : "(No hi ha àncores disponibles en aquest document)", +DlgLnkEMail : "Adreça de correu electrònic", +DlgLnkEMailSubject : "Assumpte del missatge", +DlgLnkEMailBody : "Cos del missatge", +DlgLnkUpload : "Puja", +DlgLnkBtnUpload : "Envia al servidor", + +DlgLnkTarget : "Destí", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Nova finestra (_blank)", +DlgLnkTargetParent : "Finestra pare (_parent)", +DlgLnkTargetSelf : "Mateixa finestra (_self)", +DlgLnkTargetTop : "Finestra Major (_top)", +DlgLnkTargetFrameName : "Nom del marc de destí", +DlgLnkPopWinName : "Nom finestra popup", +DlgLnkPopWinFeat : "Característiques finestra popup", +DlgLnkPopResize : "Redimensionable", +DlgLnkPopLocation : "Barra d'adreça", +DlgLnkPopMenu : "Barra de menú", +DlgLnkPopScroll : "Barres d'scroll", +DlgLnkPopStatus : "Barra d'estat", +DlgLnkPopToolbar : "Barra d'eines", +DlgLnkPopFullScrn : "Pantalla completa (IE)", +DlgLnkPopDependent : "Depenent (Netscape)", +DlgLnkPopWidth : "Amplada", +DlgLnkPopHeight : "Alçada", +DlgLnkPopLeft : "Posició esquerra", +DlgLnkPopTop : "Posició dalt", + +DlnLnkMsgNoUrl : "Si us plau, escrigui l'enllaç URL", +DlnLnkMsgNoEMail : "Si us plau, escrigui l'adreça correu electrònic", +DlnLnkMsgNoAnchor : "Si us plau, escrigui l'àncora", +DlnLnkMsgInvPopName : "El nom de la finestra emergent ha de començar amb una lletra i no pot tenir espais", + +// Color Dialog +DlgColorTitle : "Selecciona el color", +DlgColorBtnClear : "Neteja", +DlgColorHighlight : "Realça", +DlgColorSelected : "Selecciona", + +// Smiley Dialog +DlgSmileyTitle : "Insereix una icona", + +// Special Character Dialog +DlgSpecialCharTitle : "Selecciona el caràcter especial", + +// Table Dialog +DlgTableTitle : "Propietats de la taula", +DlgTableRows : "Files", +DlgTableColumns : "Columnes", +DlgTableBorder : "Mida vora", +DlgTableAlign : "Alineació", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Esquerra", +DlgTableAlignCenter : "Centre", +DlgTableAlignRight : "Dreta", +DlgTableWidth : "Amplada", +DlgTableWidthPx : "píxels", +DlgTableWidthPc : "percentatge", +DlgTableHeight : "Alçada", +DlgTableCellSpace : "Espaiat de cel·les", +DlgTableCellPad : "Encoixinament de cel·les", +DlgTableCaption : "Títol", +DlgTableSummary : "Resum", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Propietats de la cel·la", +DlgCellWidth : "Amplada", +DlgCellWidthPx : "píxels", +DlgCellWidthPc : "percentatge", +DlgCellHeight : "Alçada", +DlgCellWordWrap : "Ajust de paraula", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Si", +DlgCellWordWrapNo : "No", +DlgCellHorAlign : "Alineació horitzontal", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Esquerra", +DlgCellHorAlignCenter : "Centre", +DlgCellHorAlignRight: "Dreta", +DlgCellVerAlign : "Alineació vertical", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Top", +DlgCellVerAlignMiddle : "Middle", +DlgCellVerAlignBottom : "Bottom", +DlgCellVerAlignBaseline : "Baseline", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Rows Span", +DlgCellCollSpan : "Columns Span", +DlgCellBackColor : "Color de fons", +DlgCellBorderColor : "Color de la vora", +DlgCellBtnSelect : "Seleccioneu...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Cerca i reemplaça", + +// Find Dialog +DlgFindTitle : "Cerca", +DlgFindFindBtn : "Cerca", +DlgFindNotFoundMsg : "El text especificat no s'ha trobat.", + +// Replace Dialog +DlgReplaceTitle : "Reemplaça", +DlgReplaceFindLbl : "Cerca:", +DlgReplaceReplaceLbl : "Remplaça amb:", +DlgReplaceCaseChk : "Distingeix majúscules/minúscules", +DlgReplaceReplaceBtn : "Reemplaça", +DlgReplaceReplAllBtn : "Reemplaça-ho tot", +DlgReplaceWordChk : "Només paraules completes", + +// Paste Operations / Dialog +PasteErrorCut : "La seguretat del vostre navegador no permet executar automàticament les operacions de retallar. Si us plau, utilitzeu el teclat (Ctrl+X).", +PasteErrorCopy : "La seguretat del vostre navegador no permet executar automàticament les operacions de copiar. Si us plau, utilitzeu el teclat (Ctrl+C).", + +PasteAsText : "Enganxa com a text no formatat", +PasteFromWord : "Enganxa com a Word", + +DlgPasteMsg2 : "Si us plau, enganxeu dins del següent camp utilitzant el teclat (Ctrl+V) i premeu OK.", +DlgPasteSec : "A causa de la configuració de seguretat del vostre navegador, l'editor no pot accedir al porta-retalls directament. Enganxeu-ho un altre cop en aquesta finestra.", +DlgPasteIgnoreFont : "Ignora definicions de font", +DlgPasteRemoveStyles : "Elimina definicions d'estil", + +// Color Picker +ColorAutomatic : "Automàtic", +ColorMoreColors : "Més colors...", + +// Document Properties +DocProps : "Propietats del document", + +// Anchor Dialog +DlgAnchorTitle : "Propietats de l'àncora", +DlgAnchorName : "Nom de l'àncora", +DlgAnchorErrorName : "Si us plau, escriviu el nom de l'ancora", + +// Speller Pages Dialog +DlgSpellNotInDic : "No és al diccionari", +DlgSpellChangeTo : "Reemplaça amb", +DlgSpellBtnIgnore : "Ignora", +DlgSpellBtnIgnoreAll : "Ignora-les totes", +DlgSpellBtnReplace : "Canvia", +DlgSpellBtnReplaceAll : "Canvia-les totes", +DlgSpellBtnUndo : "Desfés", +DlgSpellNoSuggestions : "Cap suggeriment", +DlgSpellProgress : "Verificació ortogràfica en curs...", +DlgSpellNoMispell : "Verificació ortogràfica acabada: no hi ha cap paraula mal escrita", +DlgSpellNoChanges : "Verificació ortogràfica: no s'ha canviat cap paraula", +DlgSpellOneChange : "Verificació ortogràfica: s'ha canviat una paraula", +DlgSpellManyChanges : "Verificació ortogràfica: s'han canviat %1 paraules", + +IeSpellDownload : "Verificació ortogràfica no instal·lada. Voleu descarregar-ho ara?", + +// Button Dialog +DlgButtonText : "Text (Valor)", +DlgButtonType : "Tipus", +DlgButtonTypeBtn : "Botó", +DlgButtonTypeSbm : "Transmet formulari", +DlgButtonTypeRst : "Reinicia formulari", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Nom", +DlgCheckboxValue : "Valor", +DlgCheckboxSelected : "Seleccionat", + +// Form Dialog +DlgFormName : "Nom", +DlgFormAction : "Acció", +DlgFormMethod : "Mètode", + +// Select Field Dialog +DlgSelectName : "Nom", +DlgSelectValue : "Valor", +DlgSelectSize : "Mida", +DlgSelectLines : "Línies", +DlgSelectChkMulti : "Permet múltiples seleccions", +DlgSelectOpAvail : "Opcions disponibles", +DlgSelectOpText : "Text", +DlgSelectOpValue : "Valor", +DlgSelectBtnAdd : "Afegeix", +DlgSelectBtnModify : "Modifica", +DlgSelectBtnUp : "Amunt", +DlgSelectBtnDown : "Avall", +DlgSelectBtnSetValue : "Selecciona per defecte", +DlgSelectBtnDelete : "Elimina", + +// Textarea Dialog +DlgTextareaName : "Nom", +DlgTextareaCols : "Columnes", +DlgTextareaRows : "Files", + +// Text Field Dialog +DlgTextName : "Nom", +DlgTextValue : "Valor", +DlgTextCharWidth : "Amplada", +DlgTextMaxChars : "Nombre màxim de caràcters", +DlgTextType : "Tipus", +DlgTextTypeText : "Text", +DlgTextTypePass : "Contrasenya", + +// Hidden Field Dialog +DlgHiddenName : "Nom", +DlgHiddenValue : "Valor", + +// Bulleted List Dialog +BulletedListProp : "Propietats de la llista de pics", +NumberedListProp : "Propietats de llista numerada", +DlgLstStart : "Inici", +DlgLstType : "Tipus", +DlgLstTypeCircle : "Cercle", +DlgLstTypeDisc : "Disc", +DlgLstTypeSquare : "Quadrat", +DlgLstTypeNumbers : "Números (1, 2, 3)", +DlgLstTypeLCase : "Lletres minúscules (a, b, c)", +DlgLstTypeUCase : "Lletres majúscules (A, B, C)", +DlgLstTypeSRoman : "Números romans en minúscules (i, ii, iii)", +DlgLstTypeLRoman : "Números romans en majúscules (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "General", +DlgDocBackTab : "Fons", +DlgDocColorsTab : "Colors i marges", +DlgDocMetaTab : "Metadades", + +DlgDocPageTitle : "Títol de la pàgina", +DlgDocLangDir : "Direcció idioma", +DlgDocLangDirLTR : "Esquerra a dreta (LTR)", +DlgDocLangDirRTL : "Dreta a esquerra (RTL)", +DlgDocLangCode : "Codi d'idioma", +DlgDocCharSet : "Codificació de conjunt de caràcters", +DlgDocCharSetCE : "Centreeuropeu", +DlgDocCharSetCT : "Xinès tradicional (Big5)", +DlgDocCharSetCR : "Ciríl·lic", +DlgDocCharSetGR : "Grec", +DlgDocCharSetJP : "Japonès", +DlgDocCharSetKR : "Coreà", +DlgDocCharSetTR : "Turc", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Europeu occidental", +DlgDocCharSetOther : "Una altra codificació de caràcters", + +DlgDocDocType : "Capçalera de tipus de document", +DlgDocDocTypeOther : "Un altra capçalera de tipus de document", +DlgDocIncXHTML : "Incloure declaracions XHTML", +DlgDocBgColor : "Color de fons", +DlgDocBgImage : "URL de la imatge de fons", +DlgDocBgNoScroll : "Fons fixe", +DlgDocCText : "Text", +DlgDocCLink : "Enllaç", +DlgDocCVisited : "Enllaç visitat", +DlgDocCActive : "Enllaç actiu", +DlgDocMargins : "Marges de pàgina", +DlgDocMaTop : "Cap", +DlgDocMaLeft : "Esquerra", +DlgDocMaRight : "Dreta", +DlgDocMaBottom : "Peu", +DlgDocMeIndex : "Mots clau per a indexació (separats per coma)", +DlgDocMeDescr : "Descripció del document", +DlgDocMeAuthor : "Autor", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Vista prèvia", + +// Templates Dialog +Templates : "Plantilles", +DlgTemplatesTitle : "Contingut plantilles", +DlgTemplatesSelMsg : "Si us plau, seleccioneu la plantilla per obrir a l'editor
    (el contingut actual no serà enregistrat):", +DlgTemplatesLoading : "Carregant la llista de plantilles. Si us plau, espereu...", +DlgTemplatesNoTpl : "(No hi ha plantilles definides)", +DlgTemplatesReplace : "Reemplaça el contingut actual", + +// About Dialog +DlgAboutAboutTab : "Quant a", +DlgAboutBrowserInfoTab : "Informació del navegador", +DlgAboutLicenseTab : "Llicència", +DlgAboutVersion : "versió", +DlgAboutInfo : "Per a més informació aneu a", + +// Div Dialog +DlgDivGeneralTab : "General", +DlgDivAdvancedTab : "Avançat", +DlgDivStyle : "Estil", +DlgDivInlineStyle : "Estil en línia" +}; diff --git a/webdir/fckeditor/editor/lang/cs.js b/webdir/fckeditor/editor/lang/cs.js new file mode 100644 index 0000000..1f3181a --- /dev/null +++ b/webdir/fckeditor/editor/lang/cs.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Czech language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Skrýt panel nástrojů", +ToolbarExpand : "Zobrazit panel nástrojů", + +// Toolbar Items and Context Menu +Save : "Uložit", +NewPage : "Nová stránka", +Preview : "Náhled", +Cut : "Vyjmout", +Copy : "Kopírovat", +Paste : "Vložit", +PasteText : "Vložit jako Äistý text", +PasteWord : "Vložit z Wordu", +Print : "Tisk", +SelectAll : "Vybrat vÅ¡e", +RemoveFormat : "Odstranit formátování", +InsertLinkLbl : "Odkaz", +InsertLink : "Vložit/zmÄ›nit odkaz", +RemoveLink : "Odstranit odkaz", +VisitLink : "Otevřít odkaz", +Anchor : "Vložít/zmÄ›nit záložku", +AnchorDelete : "Odstranit kotvu", +InsertImageLbl : "Obrázek", +InsertImage : "Vložit/zmÄ›nit obrázek", +InsertFlashLbl : "Flash", +InsertFlash : "Vložit/Upravit Flash", +InsertTableLbl : "Tabulka", +InsertTable : "Vložit/zmÄ›nit tabulku", +InsertLineLbl : "Linka", +InsertLine : "Vložit vodorovnou linku", +InsertSpecialCharLbl: "Speciální znaky", +InsertSpecialChar : "Vložit speciální znaky", +InsertSmileyLbl : "Smajlíky", +InsertSmiley : "Vložit smajlík", +About : "O aplikaci FCKeditor", +Bold : "TuÄné", +Italic : "Kurzíva", +Underline : "Podtržené", +StrikeThrough : "PÅ™eÅ¡krtnuté", +Subscript : "Dolní index", +Superscript : "Horní index", +LeftJustify : "Zarovnat vlevo", +CenterJustify : "Zarovnat na stÅ™ed", +RightJustify : "Zarovnat vpravo", +BlockJustify : "Zarovnat do bloku", +DecreaseIndent : "ZmenÅ¡it odsazení", +IncreaseIndent : "ZvÄ›tÅ¡it odsazení", +Blockquote : "Citace", +CreateDiv : "VytvoÅ™it Div kontejner", +EditDiv : "Upravit Div kontejner", +DeleteDiv : "Odstranit Div kontejner", +Undo : "ZpÄ›t", +Redo : "Znovu", +NumberedListLbl : "Číslování", +NumberedList : "Vložit/odstranit Äíslovaný seznam", +BulletedListLbl : "Odrážky", +BulletedList : "Vložit/odstranit odrážky", +ShowTableBorders : "Zobrazit okraje tabulek", +ShowDetails : "Zobrazit podrobnosti", +Style : "Styl", +FontFormat : "Formát", +Font : "Písmo", +FontSize : "Velikost", +TextColor : "Barva textu", +BGColor : "Barva pozadí", +Source : "Zdroj", +Find : "Hledat", +Replace : "Nahradit", +SpellCheck : "Zkontrolovat pravopis", +UniversalKeyboard : "Univerzální klávesnice", +PageBreakLbl : "Konec stránky", +PageBreak : "Vložit konec stránky", + +Form : "Formulář", +Checkbox : "ZaÅ¡krtávací políÄko", +RadioButton : "PÅ™epínaÄ", +TextField : "Textové pole", +Textarea : "Textová oblast", +HiddenField : "Skryté pole", +Button : "TlaÄítko", +SelectionField : "Seznam", +ImageButton : "Obrázkové tlaÄítko", + +FitWindow : "Maximalizovat velikost editoru", +ShowBlocks : "Ukázat bloky", + +// Context Menu +EditLink : "ZmÄ›nit odkaz", +CellCM : "Buňka", +RowCM : "Řádek", +ColumnCM : "Sloupec", +InsertRowAfter : "Vložit řádek za", +InsertRowBefore : "Vložit řádek pÅ™ed", +DeleteRows : "Smazat řádky", +InsertColumnAfter : "Vložit sloupec za", +InsertColumnBefore : "Vložit sloupec pÅ™ed", +DeleteColumns : "Smazat sloupec", +InsertCellAfter : "Vložit buňku za", +InsertCellBefore : "Vložit buňku pÅ™ed", +DeleteCells : "Smazat buňky", +MergeCells : "SlouÄit buňky", +MergeRight : "SlouÄit doprava", +MergeDown : "SlouÄit dolů", +HorizontalSplitCell : "RozdÄ›lit buňky vodorovnÄ›", +VerticalSplitCell : "RozdÄ›lit buňky svisle", +TableDelete : "Smazat tabulku", +CellProperties : "Vlastnosti buňky", +TableProperties : "Vlastnosti tabulky", +ImageProperties : "Vlastnosti obrázku", +FlashProperties : "Vlastnosti Flashe", + +AnchorProp : "Vlastnosti záložky", +ButtonProp : "Vlastnosti tlaÄítka", +CheckboxProp : "Vlastnosti zaÅ¡krtávacího políÄka", +HiddenFieldProp : "Vlastnosti skrytého pole", +RadioButtonProp : "Vlastnosti pÅ™epínaÄe", +ImageButtonProp : "Vlastností obrázkového tlaÄítka", +TextFieldProp : "Vlastnosti textového pole", +SelectionFieldProp : "Vlastnosti seznamu", +TextareaProp : "Vlastnosti textové oblasti", +FormProp : "Vlastnosti formuláře", + +FontFormats : "Normální;Naformátováno;Adresa;Nadpis 1;Nadpis 2;Nadpis 3;Nadpis 4;Nadpis 5;Nadpis 6;Normální (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Probíhá zpracování XHTML. Prosím Äekejte...", +Done : "Hotovo", +PasteWordConfirm : "Jak je vidÄ›t, vkládaný text je kopírován z Wordu. Chcete jej pÅ™ed vložením vyÄistit?", +NotCompatiblePaste : "Tento příkaz je dostupný pouze v Internet Exploreru verze 5.5 nebo vyšší. Chcete vložit text bez vyÄiÅ¡tÄ›ní?", +UnknownToolbarItem : "Neznámá položka panelu nástrojů \"%1\"", +UnknownCommand : "Neznámý příkaz \"%1\"", +NotImplemented : "Příkaz není implementován", +UnknownToolbarSet : "Panel nástrojů \"%1\" neexistuje", +NoActiveX : "Nastavení bezpeÄnosti VaÅ¡eho prohlížeÄe omezuje funkÄnost nÄ›kterých jeho možností. Je tÅ™eba zapnout volbu \"SpouÅ¡tÄ›t ovládáací prvky ActiveX a moduly plug-in\", jinak nebude možné využívat vÅ¡echny dosputné schopnosti editoru.", +BrowseServerBlocked : "Průzkumník zdrojů nelze otevřít. Prověřte, zda nemáte aktivováno blokování popup oken.", +DialogBlocked : "Nelze otevřít dialogové okno. Prověřte, zda nemáte aktivováno blokování popup oken.", +VisitLinkBlocked : "Není možné otevřít nové okno. Prověřte, zda vÅ¡echny nástroje pro blokování vyskakovacích oken jsou vypnuty.", + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Storno", +DlgBtnClose : "Zavřít", +DlgBtnBrowseServer : "Vybrat na serveru", +DlgAdvancedTag : "Rozšířené", +DlgOpOther : "", +DlgInfoTab : "Info", +DlgAlertUrl : "Prosím vložte URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Orientace jazyka", +DlgGenLangDirLtr : "Zleva do prava (LTR)", +DlgGenLangDirRtl : "Zprava do leva (RTL)", +DlgGenLangCode : "Kód jazyka", +DlgGenAccessKey : "Přístupový klíÄ", +DlgGenName : "Jméno", +DlgGenTabIndex : "PoÅ™adí prvku", +DlgGenLongDescr : "Dlouhý popis URL", +DlgGenClass : "Třída stylu", +DlgGenTitle : "Pomocný titulek", +DlgGenContType : "Pomocný typ obsahu", +DlgGenLinkCharset : "PÅ™iÅ™azená znaková sada", +DlgGenStyle : "Styl", + +// Image Dialog +DlgImgTitle : "Vlastnosti obrázku", +DlgImgInfoTab : "Informace o obrázku", +DlgImgBtnUpload : "Odeslat na server", +DlgImgURL : "URL", +DlgImgUpload : "Odeslat", +DlgImgAlt : "Alternativní text", +DlgImgWidth : "Šířka", +DlgImgHeight : "Výška", +DlgImgLockRatio : "Zámek", +DlgBtnResetSize : "Původní velikost", +DlgImgBorder : "Okraje", +DlgImgHSpace : "H-mezera", +DlgImgVSpace : "V-mezera", +DlgImgAlign : "Zarovnání", +DlgImgAlignLeft : "Vlevo", +DlgImgAlignAbsBottom: "Zcela dolů", +DlgImgAlignAbsMiddle: "DoprostÅ™ed", +DlgImgAlignBaseline : "Na úÄaří", +DlgImgAlignBottom : "Dolů", +DlgImgAlignMiddle : "Na stÅ™ed", +DlgImgAlignRight : "Vpravo", +DlgImgAlignTextTop : "Na horní okraj textu", +DlgImgAlignTop : "Nahoru", +DlgImgPreview : "Náhled", +DlgImgAlertUrl : "Zadejte prosím URL obrázku", +DlgImgLinkTab : "Odkaz", + +// Flash Dialog +DlgFlashTitle : "Vlastnosti Flashe", +DlgFlashChkPlay : "Automatické spuÅ¡tÄ›ní", +DlgFlashChkLoop : "Opakování", +DlgFlashChkMenu : "Nabídka Flash", +DlgFlashScale : "Zobrazit", +DlgFlashScaleAll : "Zobrazit vÅ¡e", +DlgFlashScaleNoBorder : "Bez okraje", +DlgFlashScaleFit : "PÅ™izpůsobit", + +// Link Dialog +DlgLnkWindowTitle : "Odkaz", +DlgLnkInfoTab : "Informace o odkazu", +DlgLnkTargetTab : "Cíl", + +DlgLnkType : "Typ odkazu", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Kotva v této stránce", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protokol", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Vybrat kotvu", +DlgLnkAnchorByName : "Podle jména kotvy", +DlgLnkAnchorById : "Podle Id objektu", +DlgLnkNoAnchors : "(Ve stránce není definována žádná kotva!)", +DlgLnkEMail : "E-Mailová adresa", +DlgLnkEMailSubject : "PÅ™edmÄ›t zprávy", +DlgLnkEMailBody : "TÄ›lo zprávy", +DlgLnkUpload : "Odeslat", +DlgLnkBtnUpload : "Odeslat na Server", + +DlgLnkTarget : "Cíl", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Nové okno (_blank)", +DlgLnkTargetParent : "RodiÄovské okno (_parent)", +DlgLnkTargetSelf : "Stejné okno (_self)", +DlgLnkTargetTop : "Hlavní okno (_top)", +DlgLnkTargetFrameName : "Název cílového rámu", +DlgLnkPopWinName : "Název vyskakovacího okna", +DlgLnkPopWinFeat : "Vlastnosti vyskakovacího okna", +DlgLnkPopResize : "MÄ›nitelná velikost", +DlgLnkPopLocation : "Panel umístÄ›ní", +DlgLnkPopMenu : "Panel nabídky", +DlgLnkPopScroll : "Posuvníky", +DlgLnkPopStatus : "Stavový řádek", +DlgLnkPopToolbar : "Panel nástrojů", +DlgLnkPopFullScrn : "Celá obrazovka (IE)", +DlgLnkPopDependent : "Závislost (Netscape)", +DlgLnkPopWidth : "Šířka", +DlgLnkPopHeight : "Výška", +DlgLnkPopLeft : "Levý okraj", +DlgLnkPopTop : "Horní okraj", + +DlnLnkMsgNoUrl : "Zadejte prosím URL odkazu", +DlnLnkMsgNoEMail : "Zadejte prosím e-mailovou adresu", +DlnLnkMsgNoAnchor : "Vyberte prosím kotvu", +DlnLnkMsgInvPopName : "Název vyskakovacího okna musí zaÄínat písmenem a nesmí obsahovat mezery", + +// Color Dialog +DlgColorTitle : "VýbÄ›r barvy", +DlgColorBtnClear : "Vymazat", +DlgColorHighlight : "ZvýraznÄ›ná", +DlgColorSelected : "Vybraná", + +// Smiley Dialog +DlgSmileyTitle : "Vkládání smajlíků", + +// Special Character Dialog +DlgSpecialCharTitle : "VýbÄ›r speciálního znaku", + +// Table Dialog +DlgTableTitle : "Vlastnosti tabulky", +DlgTableRows : "Řádky", +DlgTableColumns : "Sloupce", +DlgTableBorder : "OhraniÄení", +DlgTableAlign : "Zarovnání", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Vlevo", +DlgTableAlignCenter : "Na stÅ™ed", +DlgTableAlignRight : "Vpravo", +DlgTableWidth : "Šířka", +DlgTableWidthPx : "bodů", +DlgTableWidthPc : "procent", +DlgTableHeight : "Výška", +DlgTableCellSpace : "Vzdálenost bunÄ›k", +DlgTableCellPad : "Odsazení obsahu", +DlgTableCaption : "Popis", +DlgTableSummary : "Souhrn", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Vlastnosti buňky", +DlgCellWidth : "Šířka", +DlgCellWidthPx : "bodů", +DlgCellWidthPc : "procent", +DlgCellHeight : "Výška", +DlgCellWordWrap : "Zalamování", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Ano", +DlgCellWordWrapNo : "Ne", +DlgCellHorAlign : "Vodorovné zarovnání", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Vlevo", +DlgCellHorAlignCenter : "Na stÅ™ed", +DlgCellHorAlignRight: "Vpravo", +DlgCellVerAlign : "Svislé zarovnání", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Nahoru", +DlgCellVerAlignMiddle : "DoprostÅ™ed", +DlgCellVerAlignBottom : "Dolů", +DlgCellVerAlignBaseline : "Na úÄaří", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "SlouÄené řádky", +DlgCellCollSpan : "SlouÄené sloupce", +DlgCellBackColor : "Barva pozadí", +DlgCellBorderColor : "Barva ohraniÄení", +DlgCellBtnSelect : "VýbÄ›r...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Najít a nahradit", + +// Find Dialog +DlgFindTitle : "Hledat", +DlgFindFindBtn : "Hledat", +DlgFindNotFoundMsg : "Hledaný text nebyl nalezen.", + +// Replace Dialog +DlgReplaceTitle : "Nahradit", +DlgReplaceFindLbl : "Co hledat:", +DlgReplaceReplaceLbl : "Čím nahradit:", +DlgReplaceCaseChk : "RozliÅ¡ovat velikost písma", +DlgReplaceReplaceBtn : "Nahradit", +DlgReplaceReplAllBtn : "Nahradit vÅ¡e", +DlgReplaceWordChk : "Pouze celá slova", + +// Paste Operations / Dialog +PasteErrorCut : "BezpeÄnostní nastavení VaÅ¡eho prohlížeÄe nedovolují editoru spustit funkci pro vyjmutí zvoleného textu do schránky. Prosím vyjmÄ›te zvolený text do schránky pomocí klávesnice (Ctrl+X).", +PasteErrorCopy : "BezpeÄnostní nastavení VaÅ¡eho prohlížeÄe nedovolují editoru spustit funkci pro kopírování zvoleného textu do schránky. Prosím zkopírujte zvolený text do schránky pomocí klávesnice (Ctrl+C).", + +PasteAsText : "Vložit jako Äistý text", +PasteFromWord : "Vložit text z Wordu", + +DlgPasteMsg2 : "Do následujícího pole vložte požadovaný obsah pomocí klávesnice (Ctrl+V) a stisknÄ›te OK.", +DlgPasteSec : "Z důvodů nastavení bezpeÄnosti VaÅ¡eho prohlížeÄe nemůže editor pÅ™istupovat přímo do schránky. Obsah schránky prosím vložte znovu do tohoto okna.", +DlgPasteIgnoreFont : "Ignorovat písmo", +DlgPasteRemoveStyles : "Odstranit styly", + +// Color Picker +ColorAutomatic : "Automaticky", +ColorMoreColors : "Více barev...", + +// Document Properties +DocProps : "Vlastnosti dokumentu", + +// Anchor Dialog +DlgAnchorTitle : "Vlastnosti záložky", +DlgAnchorName : "Název záložky", +DlgAnchorErrorName : "Zadejte prosím název záložky", + +// Speller Pages Dialog +DlgSpellNotInDic : "Není ve slovníku", +DlgSpellChangeTo : "ZmÄ›nit na", +DlgSpellBtnIgnore : "PÅ™eskoÄit", +DlgSpellBtnIgnoreAll : "PÅ™eskakovat vÅ¡e", +DlgSpellBtnReplace : "ZamÄ›nit", +DlgSpellBtnReplaceAll : "Zaměňovat vÅ¡e", +DlgSpellBtnUndo : "ZpÄ›t", +DlgSpellNoSuggestions : "- žádné návrhy -", +DlgSpellProgress : "Probíhá kontrola pravopisu...", +DlgSpellNoMispell : "Kontrola pravopisu dokonÄena: Žádné pravopisné chyby nenalezeny", +DlgSpellNoChanges : "Kontrola pravopisu dokonÄena: Beze zmÄ›n", +DlgSpellOneChange : "Kontrola pravopisu dokonÄena: Jedno slovo zmÄ›nÄ›no", +DlgSpellManyChanges : "Kontrola pravopisu dokonÄena: %1 slov zmÄ›nÄ›no", + +IeSpellDownload : "Kontrola pravopisu není nainstalována. Chcete ji nyní stáhnout?", + +// Button Dialog +DlgButtonText : "Popisek", +DlgButtonType : "Typ", +DlgButtonTypeBtn : "TlaÄítko", +DlgButtonTypeSbm : "Odeslat", +DlgButtonTypeRst : "Obnovit", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Název", +DlgCheckboxValue : "Hodnota", +DlgCheckboxSelected : "ZaÅ¡krtnuto", + +// Form Dialog +DlgFormName : "Název", +DlgFormAction : "Akce", +DlgFormMethod : "Metoda", + +// Select Field Dialog +DlgSelectName : "Název", +DlgSelectValue : "Hodnota", +DlgSelectSize : "Velikost", +DlgSelectLines : "Řádků", +DlgSelectChkMulti : "Povolit mnohonásobné výbÄ›ry", +DlgSelectOpAvail : "Dostupná nastavení", +DlgSelectOpText : "Text", +DlgSelectOpValue : "Hodnota", +DlgSelectBtnAdd : "PÅ™idat", +DlgSelectBtnModify : "ZmÄ›nit", +DlgSelectBtnUp : "Nahoru", +DlgSelectBtnDown : "Dolů", +DlgSelectBtnSetValue : "Nastavit jako vybranou hodnotu", +DlgSelectBtnDelete : "Smazat", + +// Textarea Dialog +DlgTextareaName : "Název", +DlgTextareaCols : "Sloupců", +DlgTextareaRows : "Řádků", + +// Text Field Dialog +DlgTextName : "Název", +DlgTextValue : "Hodnota", +DlgTextCharWidth : "Šířka ve znacích", +DlgTextMaxChars : "Maximální poÄet znaků", +DlgTextType : "Typ", +DlgTextTypeText : "Text", +DlgTextTypePass : "Heslo", + +// Hidden Field Dialog +DlgHiddenName : "Název", +DlgHiddenValue : "Hodnota", + +// Bulleted List Dialog +BulletedListProp : "Vlastnosti odrážek", +NumberedListProp : "Vlastnosti Äíslovaného seznamu", +DlgLstStart : "ZaÄátek", +DlgLstType : "Typ", +DlgLstTypeCircle : "Kružnice", +DlgLstTypeDisc : "Kruh", +DlgLstTypeSquare : "ÄŒtverec", +DlgLstTypeNumbers : "Čísla (1, 2, 3)", +DlgLstTypeLCase : "Malá písmena (a, b, c)", +DlgLstTypeUCase : "Velká písmena (A, B, C)", +DlgLstTypeSRoman : "Malé římská Äíslice (i, ii, iii)", +DlgLstTypeLRoman : "Velké římské Äíslice (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Obecné", +DlgDocBackTab : "Pozadí", +DlgDocColorsTab : "Barvy a okraje", +DlgDocMetaTab : "Metadata", + +DlgDocPageTitle : "Titulek stránky", +DlgDocLangDir : "SmÄ›r jazyku", +DlgDocLangDirLTR : "Zleva do prava ", +DlgDocLangDirRTL : "Zprava doleva", +DlgDocLangCode : "Kód jazyku", +DlgDocCharSet : "Znaková sada", +DlgDocCharSetCE : "StÅ™edoevropské jazyky", +DlgDocCharSetCT : "TradiÄní ÄínÅ¡tina (Big5)", +DlgDocCharSetCR : "Cyrilice", +DlgDocCharSetGR : "ŘeÄtina", +DlgDocCharSetJP : "JaponÅ¡tina", +DlgDocCharSetKR : "KorejÅ¡tina", +DlgDocCharSetTR : "TureÄtina", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Západoevropské jazyky", +DlgDocCharSetOther : "Další znaková sada", + +DlgDocDocType : "Typ dokumentu", +DlgDocDocTypeOther : "Jiný typ dokumetu", +DlgDocIncXHTML : "Zahrnou deklarace XHTML", +DlgDocBgColor : "Barva pozadí", +DlgDocBgImage : "URL obrázku na pozadí", +DlgDocBgNoScroll : "Nerolovatelné pozadí", +DlgDocCText : "Text", +DlgDocCLink : "Odkaz", +DlgDocCVisited : "NavÅ¡tívený odkaz", +DlgDocCActive : "Vybraný odkaz", +DlgDocMargins : "Okraje stránky", +DlgDocMaTop : "Horní", +DlgDocMaLeft : "Levý", +DlgDocMaRight : "Pravý", +DlgDocMaBottom : "Dolní", +DlgDocMeIndex : "KlíÄová slova (oddÄ›lená Äárkou)", +DlgDocMeDescr : "Popis dokumentu", +DlgDocMeAuthor : "Autor", +DlgDocMeCopy : "Autorská práva", +DlgDocPreview : "Náhled", + +// Templates Dialog +Templates : "Å ablony", +DlgTemplatesTitle : "Å ablony obsahu", +DlgTemplatesSelMsg : "Prosím zvolte Å¡ablonu pro otevÅ™ení v editoru
    (aktuální obsah editoru bude ztracen):", +DlgTemplatesLoading : "Nahrávám pÅ™eheld Å¡ablon. Prosím Äekejte...", +DlgTemplatesNoTpl : "(Není definována žádná Å¡ablona)", +DlgTemplatesReplace : "Nahradit aktuální obsah", + +// About Dialog +DlgAboutAboutTab : "O aplikaci", +DlgAboutBrowserInfoTab : "Informace o prohlížeÄi", +DlgAboutLicenseTab : "Licence", +DlgAboutVersion : "verze", +DlgAboutInfo : "Více informací získáte na", + +// Div Dialog +DlgDivGeneralTab : "Obecné", +DlgDivAdvancedTab : "Rozšířené", +DlgDivStyle : "Styl", +DlgDivInlineStyle : "Vložený styl" +}; diff --git a/webdir/fckeditor/editor/lang/da.js b/webdir/fckeditor/editor/lang/da.js new file mode 100644 index 0000000..9f33e5e --- /dev/null +++ b/webdir/fckeditor/editor/lang/da.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Danish language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Skjul værktøjslinier", +ToolbarExpand : "Vis værktøjslinier", + +// Toolbar Items and Context Menu +Save : "Gem", +NewPage : "Ny side", +Preview : "Vis eksempel", +Cut : "Klip", +Copy : "Kopier", +Paste : "Indsæt", +PasteText : "Indsæt som ikke-formateret tekst", +PasteWord : "Indsæt fra Word", +Print : "Udskriv", +SelectAll : "Vælg alt", +RemoveFormat : "Fjern formatering", +InsertLinkLbl : "Hyperlink", +InsertLink : "Indsæt/rediger hyperlink", +RemoveLink : "Fjern hyperlink", +VisitLink : "Ã…bn hyperlink", +Anchor : "Indsæt/rediger bogmærke", +AnchorDelete : "Fjern bogmærke", +InsertImageLbl : "Indsæt billede", +InsertImage : "Indsæt/rediger billede", +InsertFlashLbl : "Flash", +InsertFlash : "Indsæt/rediger Flash", +InsertTableLbl : "Table", +InsertTable : "Indsæt/rediger tabel", +InsertLineLbl : "Linie", +InsertLine : "Indsæt vandret linie", +InsertSpecialCharLbl: "Symbol", +InsertSpecialChar : "Indsæt symbol", +InsertSmileyLbl : "Smiley", +InsertSmiley : "Indsæt smiley", +About : "Om FCKeditor", +Bold : "Fed", +Italic : "Kursiv", +Underline : "Understreget", +StrikeThrough : "Overstreget", +Subscript : "Sænket skrift", +Superscript : "Hævet skrift", +LeftJustify : "Venstrestillet", +CenterJustify : "Centreret", +RightJustify : "Højrestillet", +BlockJustify : "Lige margener", +DecreaseIndent : "Formindsk indrykning", +IncreaseIndent : "Forøg indrykning", +Blockquote : "Blokcitat", +CreateDiv : "Opret div container", +EditDiv : "Rediger div container", +DeleteDiv : "Fjern div container", +Undo : "Fortryd", +Redo : "Annuller fortryd", +NumberedListLbl : "Talopstilling", +NumberedList : "Indsæt/fjern talopstilling", +BulletedListLbl : "Punktopstilling", +BulletedList : "Indsæt/fjern punktopstilling", +ShowTableBorders : "Vis tabelkanter", +ShowDetails : "Vis detaljer", +Style : "Typografi", +FontFormat : "Formatering", +Font : "Skrifttype", +FontSize : "Skriftstørrelse", +TextColor : "Tekstfarve", +BGColor : "Baggrundsfarve", +Source : "Kilde", +Find : "Søg", +Replace : "Erstat", +SpellCheck : "Stavekontrol", +UniversalKeyboard : "Universaltastatur", +PageBreakLbl : "Sidskift", +PageBreak : "Indsæt sideskift", + +Form : "Indsæt formular", +Checkbox : "Indsæt afkrydsningsfelt", +RadioButton : "Indsæt alternativknap", +TextField : "Indsæt tekstfelt", +Textarea : "Indsæt tekstboks", +HiddenField : "Indsæt skjult felt", +Button : "Indsæt knap", +SelectionField : "Indsæt liste", +ImageButton : "Indsæt billedknap", + +FitWindow : "Maksimer editor vinduet", +ShowBlocks : "Show Blocks", //MISSING + +// Context Menu +EditLink : "Rediger hyperlink", +CellCM : "Celle", +RowCM : "Række", +ColumnCM : "Kolonne", +InsertRowAfter : "Indsæt række efter", +InsertRowBefore : "Indsæt række før", +DeleteRows : "Slet række", +InsertColumnAfter : "Indsæt kolonne efter", +InsertColumnBefore : "Indsæt kolonne før", +DeleteColumns : "Slet kolonne", +InsertCellAfter : "Indsæt celle efter", +InsertCellBefore : "Indsæt celle før", +DeleteCells : "Slet celle", +MergeCells : "Flet celler", +MergeRight : "Flet til højre", +MergeDown : "Flet nedad", +HorizontalSplitCell : "Del celle vandret", +VerticalSplitCell : "Del celle lodret", +TableDelete : "Slet tabel", +CellProperties : "Egenskaber for celle", +TableProperties : "Egenskaber for tabel", +ImageProperties : "Egenskaber for billede", +FlashProperties : "Egenskaber for Flash", + +AnchorProp : "Egenskaber for bogmærke", +ButtonProp : "Egenskaber for knap", +CheckboxProp : "Egenskaber for afkrydsningsfelt", +HiddenFieldProp : "Egenskaber for skjult felt", +RadioButtonProp : "Egenskaber for alternativknap", +ImageButtonProp : "Egenskaber for billedknap", +TextFieldProp : "Egenskaber for tekstfelt", +SelectionFieldProp : "Egenskaber for liste", +TextareaProp : "Egenskaber for tekstboks", +FormProp : "Egenskaber for formular", + +FontFormats : "Normal;Formateret;Adresse;Overskrift 1;Overskrift 2;Overskrift 3;Overskrift 4;Overskrift 5;Overskrift 6;Normal (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Behandler XHTML...", +Done : "Færdig", +PasteWordConfirm : "Den tekst du forsøger at indsætte ser ud til at komme fra Word.
    Vil du rense teksten før den indsættes?", +NotCompatiblePaste : "Denne kommando er tilgændelig i Internet Explorer 5.5 eller senere.
    Vil du indsætte teksten uden at rense den ?", +UnknownToolbarItem : "Ukendt værktøjslinjeobjekt \"%1\"!", +UnknownCommand : "Ukendt kommandonavn \"%1\"!", +NotImplemented : "Kommandoen er ikke implementeret!", +UnknownToolbarSet : "Værktøjslinjen \"%1\" eksisterer ikke!", +NoActiveX : "Din browsers sikkerhedsindstillinger begrænser nogle af editorens muligheder.
    Slå \"Kør ActiveX-objekter og plug-ins\" til, ellers vil du opleve fejl og manglende muligheder.", +BrowseServerBlocked : "Browseren kunne ikke åbne de nødvendige ressourcer!
    Slå pop-up blokering fra.", +DialogBlocked : "Dialogvinduet kunne ikke åbnes!
    Slå pop-up blokering fra.", +VisitLinkBlocked : "Det var ikke muligt at åbne et nyt vindue. Tjek, at ingen popup-blokkere er aktive.", + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Annuller", +DlgBtnClose : "Luk", +DlgBtnBrowseServer : "Gennemse...", +DlgAdvancedTag : "Avanceret", +DlgOpOther : "", +DlgInfoTab : "Generelt", +DlgAlertUrl : "Indtast URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Tekstretning", +DlgGenLangDirLtr : "Fra venstre mod højre (LTR)", +DlgGenLangDirRtl : "Fra højre mod venstre (RTL)", +DlgGenLangCode : "Sprogkode", +DlgGenAccessKey : "Genvejstast", +DlgGenName : "Navn", +DlgGenTabIndex : "Tabulator indeks", +DlgGenLongDescr : "Udvidet beskrivelse", +DlgGenClass : "Typografiark", +DlgGenTitle : "Titel", +DlgGenContType : "Indholdstype", +DlgGenLinkCharset : "Tegnsæt", +DlgGenStyle : "Typografi", + +// Image Dialog +DlgImgTitle : "Egenskaber for billede", +DlgImgInfoTab : "Generelt", +DlgImgBtnUpload : "Upload", +DlgImgURL : "URL", +DlgImgUpload : "Upload", +DlgImgAlt : "Alternativ tekst", +DlgImgWidth : "Bredde", +DlgImgHeight : "Højde", +DlgImgLockRatio : "Lås størrelsesforhold", +DlgBtnResetSize : "Nulstil størrelse", +DlgImgBorder : "Ramme", +DlgImgHSpace : "HMargen", +DlgImgVSpace : "VMargen", +DlgImgAlign : "Justering", +DlgImgAlignLeft : "Venstre", +DlgImgAlignAbsBottom: "Absolut nederst", +DlgImgAlignAbsMiddle: "Absolut centreret", +DlgImgAlignBaseline : "Grundlinje", +DlgImgAlignBottom : "Nederst", +DlgImgAlignMiddle : "Centreret", +DlgImgAlignRight : "Højre", +DlgImgAlignTextTop : "Toppen af teksten", +DlgImgAlignTop : "Øverst", +DlgImgPreview : "Vis eksempel", +DlgImgAlertUrl : "Indtast stien til billedet", +DlgImgLinkTab : "Hyperlink", + +// Flash Dialog +DlgFlashTitle : "Egenskaber for Flash", +DlgFlashChkPlay : "Automatisk afspilning", +DlgFlashChkLoop : "Gentagelse", +DlgFlashChkMenu : "Vis Flash menu", +DlgFlashScale : "Skalér", +DlgFlashScaleAll : "Vis alt", +DlgFlashScaleNoBorder : "Ingen ramme", +DlgFlashScaleFit : "Tilpas størrelse", + +// Link Dialog +DlgLnkWindowTitle : "Egenskaber for hyperlink", +DlgLnkInfoTab : "Generelt", +DlgLnkTargetTab : "Mål", + +DlgLnkType : "Hyperlink type", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Bogmærke på denne side", +DlgLnkTypeEMail : "E-mail", +DlgLnkProto : "Protokol", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Vælg et anker", +DlgLnkAnchorByName : "Efter anker navn", +DlgLnkAnchorById : "Efter element Id", +DlgLnkNoAnchors : "(Ingen bogmærker dokumentet)", +DlgLnkEMail : "E-mailadresse", +DlgLnkEMailSubject : "Emne", +DlgLnkEMailBody : "Brødtekst", +DlgLnkUpload : "Upload", +DlgLnkBtnUpload : "Upload", + +DlgLnkTarget : "Mål", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Nyt vindue (_blank)", +DlgLnkTargetParent : "Overordnet ramme (_parent)", +DlgLnkTargetSelf : "Samme vindue (_self)", +DlgLnkTargetTop : "Hele vinduet (_top)", +DlgLnkTargetFrameName : "Destinationsvinduets navn", +DlgLnkPopWinName : "Pop-up vinduets navn", +DlgLnkPopWinFeat : "Egenskaber for pop-up", +DlgLnkPopResize : "Skalering", +DlgLnkPopLocation : "Adresselinje", +DlgLnkPopMenu : "Menulinje", +DlgLnkPopScroll : "Scrollbars", +DlgLnkPopStatus : "Statuslinje", +DlgLnkPopToolbar : "Værktøjslinje", +DlgLnkPopFullScrn : "Fuld skærm (IE)", +DlgLnkPopDependent : "Koblet/dependent (Netscape)", +DlgLnkPopWidth : "Bredde", +DlgLnkPopHeight : "Højde", +DlgLnkPopLeft : "Position fra venstre", +DlgLnkPopTop : "Position fra toppen", + +DlnLnkMsgNoUrl : "Indtast hyperlink URL!", +DlnLnkMsgNoEMail : "Indtast e-mailaddresse!", +DlnLnkMsgNoAnchor : "Vælg bogmærke!", +DlnLnkMsgInvPopName : "Navnet på popup'en skal starte med et bogstav og må ikke indeholde mellemrum", + +// Color Dialog +DlgColorTitle : "Vælg farve", +DlgColorBtnClear : "Nulstil", +DlgColorHighlight : "Markeret", +DlgColorSelected : "Valgt", + +// Smiley Dialog +DlgSmileyTitle : "Vælg smiley", + +// Special Character Dialog +DlgSpecialCharTitle : "Vælg symbol", + +// Table Dialog +DlgTableTitle : "Egenskaber for tabel", +DlgTableRows : "Rækker", +DlgTableColumns : "Kolonner", +DlgTableBorder : "Rammebredde", +DlgTableAlign : "Justering", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Venstrestillet", +DlgTableAlignCenter : "Centreret", +DlgTableAlignRight : "Højrestillet", +DlgTableWidth : "Bredde", +DlgTableWidthPx : "pixels", +DlgTableWidthPc : "procent", +DlgTableHeight : "Højde", +DlgTableCellSpace : "Celleafstand", +DlgTableCellPad : "Cellemargen", +DlgTableCaption : "Titel", +DlgTableSummary : "Resume", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Egenskaber for celle", +DlgCellWidth : "Bredde", +DlgCellWidthPx : "pixels", +DlgCellWidthPc : "procent", +DlgCellHeight : "Højde", +DlgCellWordWrap : "Orddeling", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Ja", +DlgCellWordWrapNo : "Nej", +DlgCellHorAlign : "Vandret justering", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Venstrestillet", +DlgCellHorAlignCenter : "Centreret", +DlgCellHorAlignRight: "Højrestillet", +DlgCellVerAlign : "Lodret justering", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Øverst", +DlgCellVerAlignMiddle : "Centreret", +DlgCellVerAlignBottom : "Nederst", +DlgCellVerAlignBaseline : "Grundlinje", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Højde i antal rækker", +DlgCellCollSpan : "Bredde i antal kolonner", +DlgCellBackColor : "Baggrundsfarve", +DlgCellBorderColor : "Rammefarve", +DlgCellBtnSelect : "Vælg...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Søg og erstat", + +// Find Dialog +DlgFindTitle : "Find", +DlgFindFindBtn : "Find", +DlgFindNotFoundMsg : "Søgeteksten blev ikke fundet!", + +// Replace Dialog +DlgReplaceTitle : "Erstat", +DlgReplaceFindLbl : "Søg efter:", +DlgReplaceReplaceLbl : "Erstat med:", +DlgReplaceCaseChk : "Forskel på store og små bogstaver", +DlgReplaceReplaceBtn : "Erstat", +DlgReplaceReplAllBtn : "Erstat alle", +DlgReplaceWordChk : "Kun hele ord", + +// Paste Operations / Dialog +PasteErrorCut : "Din browsers sikkerhedsindstillinger tillader ikke editoren at klippe tekst automatisk!
    Brug i stedet tastaturet til at klippe teksten (Ctrl+X).", +PasteErrorCopy : "Din browsers sikkerhedsindstillinger tillader ikke editoren at kopiere tekst automatisk!
    Brug i stedet tastaturet til at kopiere teksten (Ctrl+C).", + +PasteAsText : "Indsæt som ikke-formateret tekst", +PasteFromWord : "Indsæt fra Word", + +DlgPasteMsg2 : "Indsæt i feltet herunder (Ctrl+V) og klik OK.", +DlgPasteSec : "På grund af browserens sikkerhedsindstillinger kan editoren ikke tilgå udklipsholderen direkte. Du skal indsætte udklipsholderens indhold i dette vindue igen.", +DlgPasteIgnoreFont : "Ignorer font definitioner", +DlgPasteRemoveStyles : "Ignorer typografi", + +// Color Picker +ColorAutomatic : "Automatisk", +ColorMoreColors : "Flere farver...", + +// Document Properties +DocProps : "Egenskaber for dokument", + +// Anchor Dialog +DlgAnchorTitle : "Egenskaber for bogmærke", +DlgAnchorName : "Bogmærke navn", +DlgAnchorErrorName : "Indtast bogmærke navn!", + +// Speller Pages Dialog +DlgSpellNotInDic : "Ikke i ordbogen", +DlgSpellChangeTo : "Forslag", +DlgSpellBtnIgnore : "Ignorer", +DlgSpellBtnIgnoreAll : "Ignorer alle", +DlgSpellBtnReplace : "Erstat", +DlgSpellBtnReplaceAll : "Erstat alle", +DlgSpellBtnUndo : "Tilbage", +DlgSpellNoSuggestions : "- ingen forslag -", +DlgSpellProgress : "Stavekontrolen arbejder...", +DlgSpellNoMispell : "Stavekontrol færdig: Ingen fejl fundet", +DlgSpellNoChanges : "Stavekontrol færdig: Ingen ord ændret", +DlgSpellOneChange : "Stavekontrol færdig: Et ord ændret", +DlgSpellManyChanges : "Stavekontrol færdig: %1 ord ændret", + +IeSpellDownload : "Stavekontrol ikke installeret.
    Vil du hente den nu?", + +// Button Dialog +DlgButtonText : "Tekst", +DlgButtonType : "Type", +DlgButtonTypeBtn : "Knap", +DlgButtonTypeSbm : "Send", +DlgButtonTypeRst : "Nulstil", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Navn", +DlgCheckboxValue : "Værdi", +DlgCheckboxSelected : "Valgt", + +// Form Dialog +DlgFormName : "Navn", +DlgFormAction : "Handling", +DlgFormMethod : "Metod", + +// Select Field Dialog +DlgSelectName : "Navn", +DlgSelectValue : "Værdi", +DlgSelectSize : "Størrelse", +DlgSelectLines : "linier", +DlgSelectChkMulti : "Tillad flere valg", +DlgSelectOpAvail : "Valgmuligheder", +DlgSelectOpText : "Tekst", +DlgSelectOpValue : "Værdi", +DlgSelectBtnAdd : "Tilføj", +DlgSelectBtnModify : "Rediger", +DlgSelectBtnUp : "Op", +DlgSelectBtnDown : "Ned", +DlgSelectBtnSetValue : "Sæt som valgt", +DlgSelectBtnDelete : "Slet", + +// Textarea Dialog +DlgTextareaName : "Navn", +DlgTextareaCols : "Kolonner", +DlgTextareaRows : "Rækker", + +// Text Field Dialog +DlgTextName : "Navn", +DlgTextValue : "Værdi", +DlgTextCharWidth : "Bredde (tegn)", +DlgTextMaxChars : "Max antal tegn", +DlgTextType : "Type", +DlgTextTypeText : "Tekst", +DlgTextTypePass : "Adgangskode", + +// Hidden Field Dialog +DlgHiddenName : "Navn", +DlgHiddenValue : "Værdi", + +// Bulleted List Dialog +BulletedListProp : "Egenskaber for punktopstilling", +NumberedListProp : "Egenskaber for talopstilling", +DlgLstStart : "Start", +DlgLstType : "Type", +DlgLstTypeCircle : "Cirkel", +DlgLstTypeDisc : "Udfyldt cirkel", +DlgLstTypeSquare : "Firkant", +DlgLstTypeNumbers : "Nummereret (1, 2, 3)", +DlgLstTypeLCase : "Små bogstaver (a, b, c)", +DlgLstTypeUCase : "Store bogstaver (A, B, C)", +DlgLstTypeSRoman : "Små romertal (i, ii, iii)", +DlgLstTypeLRoman : "Store romertal (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Generelt", +DlgDocBackTab : "Baggrund", +DlgDocColorsTab : "Farver og margen", +DlgDocMetaTab : "Metadata", + +DlgDocPageTitle : "Sidetitel", +DlgDocLangDir : "Sprog", +DlgDocLangDirLTR : "Fra venstre mod højre (LTR)", +DlgDocLangDirRTL : "Fra højre mod venstre (RTL)", +DlgDocLangCode : "Landekode", +DlgDocCharSet : "Tegnsæt kode", +DlgDocCharSetCE : "Centraleuropæisk", +DlgDocCharSetCT : "Traditionel kinesisk (Big5)", +DlgDocCharSetCR : "Kyrillisk", +DlgDocCharSetGR : "Græsk", +DlgDocCharSetJP : "Japansk", +DlgDocCharSetKR : "Koreansk", +DlgDocCharSetTR : "Tyrkisk", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Vesteuropæisk", +DlgDocCharSetOther : "Anden tegnsæt kode", + +DlgDocDocType : "Dokumenttype kategori", +DlgDocDocTypeOther : "Anden dokumenttype kategori", +DlgDocIncXHTML : "Inkludere XHTML deklartion", +DlgDocBgColor : "Baggrundsfarve", +DlgDocBgImage : "Baggrundsbillede URL", +DlgDocBgNoScroll : "Fastlåst baggrund", +DlgDocCText : "Tekst", +DlgDocCLink : "Hyperlink", +DlgDocCVisited : "Besøgt hyperlink", +DlgDocCActive : "Aktivt hyperlink", +DlgDocMargins : "Sidemargen", +DlgDocMaTop : "Øverst", +DlgDocMaLeft : "Venstre", +DlgDocMaRight : "Højre", +DlgDocMaBottom : "Nederst", +DlgDocMeIndex : "Dokument index nøgleord (kommasepareret)", +DlgDocMeDescr : "Dokument beskrivelse", +DlgDocMeAuthor : "Forfatter", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Vis", + +// Templates Dialog +Templates : "Skabeloner", +DlgTemplatesTitle : "Indholdsskabeloner", +DlgTemplatesSelMsg : "Vælg den skabelon, som skal åbnes i editoren.
    (Nuværende indhold vil blive overskrevet!):", +DlgTemplatesLoading : "Henter liste over skabeloner...", +DlgTemplatesNoTpl : "(Der er ikke defineret nogen skabelon!)", +DlgTemplatesReplace : "Erstat det faktiske indhold", + +// About Dialog +DlgAboutAboutTab : "Om", +DlgAboutBrowserInfoTab : "Generelt", +DlgAboutLicenseTab : "Licens", +DlgAboutVersion : "version", +DlgAboutInfo : "For yderlig information gÃ¥ til", + +// Div Dialog +DlgDivGeneralTab : "Generelt", +DlgDivAdvancedTab : "Avanceret", +DlgDivStyle : "Style", +DlgDivInlineStyle : "Inline style" +}; diff --git a/webdir/fckeditor/editor/lang/de.js b/webdir/fckeditor/editor/lang/de.js new file mode 100644 index 0000000..b2724e3 --- /dev/null +++ b/webdir/fckeditor/editor/lang/de.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * German language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Symbolleiste einklappen", +ToolbarExpand : "Symbolleiste ausklappen", + +// Toolbar Items and Context Menu +Save : "Speichern", +NewPage : "Neue Seite", +Preview : "Vorschau", +Cut : "Ausschneiden", +Copy : "Kopieren", +Paste : "Einfügen", +PasteText : "aus Textdatei einfügen", +PasteWord : "aus MS-Word einfügen", +Print : "Drucken", +SelectAll : "Alles auswählen", +RemoveFormat : "Formatierungen entfernen", +InsertLinkLbl : "Link", +InsertLink : "Link einfügen/editieren", +RemoveLink : "Link entfernen", +VisitLink : "Link aufrufen", +Anchor : "Anker einfügen/editieren", +AnchorDelete : "Anker entfernen", +InsertImageLbl : "Bild", +InsertImage : "Bild einfügen/editieren", +InsertFlashLbl : "Flash", +InsertFlash : "Flash einfügen/editieren", +InsertTableLbl : "Tabelle", +InsertTable : "Tabelle einfügen/editieren", +InsertLineLbl : "Linie", +InsertLine : "Horizontale Linie einfügen", +InsertSpecialCharLbl: "Sonderzeichen", +InsertSpecialChar : "Sonderzeichen einfügen/editieren", +InsertSmileyLbl : "Smiley", +InsertSmiley : "Smiley einfügen", +About : "Ãœber FCKeditor", +Bold : "Fett", +Italic : "Kursiv", +Underline : "Unterstrichen", +StrikeThrough : "Durchgestrichen", +Subscript : "Tiefgestellt", +Superscript : "Hochgestellt", +LeftJustify : "Linksbündig", +CenterJustify : "Zentriert", +RightJustify : "Rechtsbündig", +BlockJustify : "Blocksatz", +DecreaseIndent : "Einzug verringern", +IncreaseIndent : "Einzug erhöhen", +Blockquote : "Zitatblock", +CreateDiv : "Erzeuge Div Block", +EditDiv : "Bearbeite Div Block", +DeleteDiv : "Entferne Div Block", +Undo : "Rückgängig", +Redo : "Wiederherstellen", +NumberedListLbl : "Nummerierte Liste", +NumberedList : "Nummerierte Liste einfügen/entfernen", +BulletedListLbl : "Liste", +BulletedList : "Liste einfügen/entfernen", +ShowTableBorders : "Zeige Tabellenrahmen", +ShowDetails : "Zeige Details", +Style : "Stil", +FontFormat : "Format", +Font : "Schriftart", +FontSize : "Größe", +TextColor : "Textfarbe", +BGColor : "Hintergrundfarbe", +Source : "Quellcode", +Find : "Suchen", +Replace : "Ersetzen", +SpellCheck : "Rechtschreibprüfung", +UniversalKeyboard : "Universal-Tastatur", +PageBreakLbl : "Seitenumbruch", +PageBreak : "Seitenumbruch einfügen", + +Form : "Formular", +Checkbox : "Checkbox", +RadioButton : "Radiobutton", +TextField : "Textfeld einzeilig", +Textarea : "Textfeld mehrzeilig", +HiddenField : "verstecktes Feld", +Button : "Klickbutton", +SelectionField : "Auswahlfeld", +ImageButton : "Bildbutton", + +FitWindow : "Editor maximieren", +ShowBlocks : "Blöcke anzeigen", + +// Context Menu +EditLink : "Link editieren", +CellCM : "Zelle", +RowCM : "Zeile", +ColumnCM : "Spalte", +InsertRowAfter : "Zeile unterhalb einfügen", +InsertRowBefore : "Zeile oberhalb einfügen", +DeleteRows : "Zeile entfernen", +InsertColumnAfter : "Spalte rechts danach einfügen", +InsertColumnBefore : "Spalte links davor einfügen", +DeleteColumns : "Spalte löschen", +InsertCellAfter : "Zelle danach einfügen", +InsertCellBefore : "Zelle davor einfügen", +DeleteCells : "Zelle löschen", +MergeCells : "Zellen verbinden", +MergeRight : "nach rechts verbinden", +MergeDown : "nach unten verbinden", +HorizontalSplitCell : "Zelle horizontal teilen", +VerticalSplitCell : "Zelle vertikal teilen", +TableDelete : "Tabelle löschen", +CellProperties : "Zellen-Eigenschaften", +TableProperties : "Tabellen-Eigenschaften", +ImageProperties : "Bild-Eigenschaften", +FlashProperties : "Flash-Eigenschaften", + +AnchorProp : "Anker-Eigenschaften", +ButtonProp : "Button-Eigenschaften", +CheckboxProp : "Checkbox-Eigenschaften", +HiddenFieldProp : "Verstecktes Feld-Eigenschaften", +RadioButtonProp : "Optionsfeld-Eigenschaften", +ImageButtonProp : "Bildbutton-Eigenschaften", +TextFieldProp : "Textfeld (einzeilig) Eigenschaften", +SelectionFieldProp : "Auswahlfeld-Eigenschaften", +TextareaProp : "Textfeld (mehrzeilig) Eigenschaften", +FormProp : "Formular-Eigenschaften", + +FontFormats : "Normal;Formatiert;Addresse;Ãœberschrift 1;Ãœberschrift 2;Ãœberschrift 3;Ãœberschrift 4;Ãœberschrift 5;Ãœberschrift 6;Normal (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Bearbeite XHTML. Bitte warten...", +Done : "Fertig", +PasteWordConfirm : "Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?", +NotCompatiblePaste : "Diese Funktion steht nur im Internet Explorer ab Version 5.5 zur Verfügung. Möchten Sie den Text unbereinigt einfügen?", +UnknownToolbarItem : "Unbekanntes Menüleisten-Objekt \"%1\"", +UnknownCommand : "Unbekannter Befehl \"%1\"", +NotImplemented : "Befehl nicht implementiert", +UnknownToolbarSet : "Menüleiste \"%1\" existiert nicht", +NoActiveX : "Die Sicherheitseinstellungen Ihres Browsers beschränken evtl. einige Funktionen des Editors. Aktivieren Sie die Option \"ActiveX-Steuerelemente und Plugins ausführen\" in den Sicherheitseinstellungen, um diese Funktionen nutzen zu können", +BrowseServerBlocked : "Ein Auswahlfenster konnte nicht geöffnet werden. Stellen Sie sicher, das alle Popup-Blocker ausgeschaltet sind.", +DialogBlocked : "Das Dialog-Fenster konnte nicht geöffnet werden. Stellen Sie sicher, das alle Popup-Blocker ausgeschaltet sind.", +VisitLinkBlocked : "Es war leider nicht möglich ein neues Fenster zu öffnen. Bitte versichern Sie sich das der Popup-Blocker ausgeschaltet ist.", + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Abbrechen", +DlgBtnClose : "Schließen", +DlgBtnBrowseServer : "Server durchsuchen", +DlgAdvancedTag : "Erweitert", +DlgOpOther : "", +DlgInfoTab : "Info", +DlgAlertUrl : "Bitte tragen Sie die URL ein", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "ID", +DlgGenLangDir : "Schreibrichtung", +DlgGenLangDirLtr : "Links nach Rechts (LTR)", +DlgGenLangDirRtl : "Rechts nach Links (RTL)", +DlgGenLangCode : "Sprachenkürzel", +DlgGenAccessKey : "Zugriffstaste", +DlgGenName : "Name", +DlgGenTabIndex : "Tab-Index", +DlgGenLongDescr : "Langform URL", +DlgGenClass : "Stylesheet Klasse", +DlgGenTitle : "Titel Beschreibung", +DlgGenContType : "Inhaltstyp", +DlgGenLinkCharset : "Ziel-Zeichensatz", +DlgGenStyle : "Style", + +// Image Dialog +DlgImgTitle : "Bild-Eigenschaften", +DlgImgInfoTab : "Bild-Info", +DlgImgBtnUpload : "Zum Server senden", +DlgImgURL : "Bildauswahl", +DlgImgUpload : "Upload", +DlgImgAlt : "Alternativer Text", +DlgImgWidth : "Breite", +DlgImgHeight : "Höhe", +DlgImgLockRatio : "Größenverhältniss beibehalten", +DlgBtnResetSize : "Größe zurücksetzen", +DlgImgBorder : "Rahmen", +DlgImgHSpace : "Horizontal-Abstand", +DlgImgVSpace : "Vertikal-Abstand", +DlgImgAlign : "Ausrichtung", +DlgImgAlignLeft : "Links", +DlgImgAlignAbsBottom: "Abs Unten", +DlgImgAlignAbsMiddle: "Abs Mitte", +DlgImgAlignBaseline : "Baseline", +DlgImgAlignBottom : "Unten", +DlgImgAlignMiddle : "Mitte", +DlgImgAlignRight : "Rechts", +DlgImgAlignTextTop : "Text Oben", +DlgImgAlignTop : "Oben", +DlgImgPreview : "Vorschau", +DlgImgAlertUrl : "Bitte geben Sie die Bild-URL an", +DlgImgLinkTab : "Link", + +// Flash Dialog +DlgFlashTitle : "Flash-Eigenschaften", +DlgFlashChkPlay : "autom. Abspielen", +DlgFlashChkLoop : "Endlosschleife", +DlgFlashChkMenu : "Flash-Menü aktivieren", +DlgFlashScale : "Skalierung", +DlgFlashScaleAll : "Alles anzeigen", +DlgFlashScaleNoBorder : "ohne Rand", +DlgFlashScaleFit : "Passgenau", + +// Link Dialog +DlgLnkWindowTitle : "Link", +DlgLnkInfoTab : "Link-Info", +DlgLnkTargetTab : "Zielseite", + +DlgLnkType : "Link-Typ", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Anker in dieser Seite", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protokoll", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Anker auswählen", +DlgLnkAnchorByName : "nach Anker Name", +DlgLnkAnchorById : "nach Element Id", +DlgLnkNoAnchors : "(keine Anker im Dokument vorhanden)", +DlgLnkEMail : "E-Mail Addresse", +DlgLnkEMailSubject : "Betreffzeile", +DlgLnkEMailBody : "Nachrichtentext", +DlgLnkUpload : "Upload", +DlgLnkBtnUpload : "Zum Server senden", + +DlgLnkTarget : "Zielseite", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Neues Fenster (_blank)", +DlgLnkTargetParent : "Oberes Fenster (_parent)", +DlgLnkTargetSelf : "Gleiches Fenster (_self)", +DlgLnkTargetTop : "Oberstes Fenster (_top)", +DlgLnkTargetFrameName : "Ziel-Fenster-Name", +DlgLnkPopWinName : "Pop-up Fenster-Name", +DlgLnkPopWinFeat : "Pop-up Fenster-Eigenschaften", +DlgLnkPopResize : "Vergrößerbar", +DlgLnkPopLocation : "Adress-Leiste", +DlgLnkPopMenu : "Menü-Leiste", +DlgLnkPopScroll : "Rollbalken", +DlgLnkPopStatus : "Statusleiste", +DlgLnkPopToolbar : "Werkzeugleiste", +DlgLnkPopFullScrn : "Vollbild (IE)", +DlgLnkPopDependent : "Abhängig (Netscape)", +DlgLnkPopWidth : "Breite", +DlgLnkPopHeight : "Höhe", +DlgLnkPopLeft : "Linke Position", +DlgLnkPopTop : "Obere Position", + +DlnLnkMsgNoUrl : "Bitte geben Sie die Link-URL an", +DlnLnkMsgNoEMail : "Bitte geben Sie e-Mail Adresse an", +DlnLnkMsgNoAnchor : "Bitte wählen Sie einen Anker aus", +DlnLnkMsgInvPopName : "Der Name des Popups muss mit einem Buchstaben beginnen und darf keine Leerzeichen enthalten", + +// Color Dialog +DlgColorTitle : "Farbauswahl", +DlgColorBtnClear : "Keine Farbe", +DlgColorHighlight : "Vorschau", +DlgColorSelected : "Ausgewählt", + +// Smiley Dialog +DlgSmileyTitle : "Smiley auswählen", + +// Special Character Dialog +DlgSpecialCharTitle : "Sonderzeichen auswählen", + +// Table Dialog +DlgTableTitle : "Tabellen-Eigenschaften", +DlgTableRows : "Zeile", +DlgTableColumns : "Spalte", +DlgTableBorder : "Rahmen", +DlgTableAlign : "Ausrichtung", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Links", +DlgTableAlignCenter : "Zentriert", +DlgTableAlignRight : "Rechts", +DlgTableWidth : "Breite", +DlgTableWidthPx : "Pixel", +DlgTableWidthPc : "%", +DlgTableHeight : "Höhe", +DlgTableCellSpace : "Zellenabstand außen", +DlgTableCellPad : "Zellenabstand innen", +DlgTableCaption : "Ãœberschrift", +DlgTableSummary : "Inhaltsübersicht", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Zellen-Eigenschaften", +DlgCellWidth : "Breite", +DlgCellWidthPx : "Pixel", +DlgCellWidthPc : "%", +DlgCellHeight : "Höhe", +DlgCellWordWrap : "Umbruch", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Ja", +DlgCellWordWrapNo : "Nein", +DlgCellHorAlign : "Horizontale Ausrichtung", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Links", +DlgCellHorAlignCenter : "Zentriert", +DlgCellHorAlignRight: "Rechts", +DlgCellVerAlign : "Vertikale Ausrichtung", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Oben", +DlgCellVerAlignMiddle : "Mitte", +DlgCellVerAlignBottom : "Unten", +DlgCellVerAlignBaseline : "Grundlinie", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Zeilen zusammenfassen", +DlgCellCollSpan : "Spalten zusammenfassen", +DlgCellBackColor : "Hintergrundfarbe", +DlgCellBorderColor : "Rahmenfarbe", +DlgCellBtnSelect : "Auswahl...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Suchen und Ersetzen", + +// Find Dialog +DlgFindTitle : "Finden", +DlgFindFindBtn : "Finden", +DlgFindNotFoundMsg : "Der gesuchte Text wurde nicht gefunden.", + +// Replace Dialog +DlgReplaceTitle : "Ersetzen", +DlgReplaceFindLbl : "Suche nach:", +DlgReplaceReplaceLbl : "Ersetze mit:", +DlgReplaceCaseChk : "Groß-Kleinschreibung beachten", +DlgReplaceReplaceBtn : "Ersetzen", +DlgReplaceReplAllBtn : "Alle Ersetzen", +DlgReplaceWordChk : "Nur ganze Worte suchen", + +// Paste Operations / Dialog +PasteErrorCut : "Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).", +PasteErrorCopy : "Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).", + +PasteAsText : "Als Text einfügen", +PasteFromWord : "Aus Word einfügen", + +DlgPasteMsg2 : "Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit Strg+V) ein und bestätigen Sie mit OK.", +DlgPasteSec : "Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.", +DlgPasteIgnoreFont : "Ignoriere Schriftart-Definitionen", +DlgPasteRemoveStyles : "Entferne Style-Definitionen", + +// Color Picker +ColorAutomatic : "Automatisch", +ColorMoreColors : "Weitere Farben...", + +// Document Properties +DocProps : "Dokument-Eigenschaften", + +// Anchor Dialog +DlgAnchorTitle : "Anker-Eigenschaften", +DlgAnchorName : "Anker Name", +DlgAnchorErrorName : "Bitte geben Sie den Namen des Ankers ein", + +// Speller Pages Dialog +DlgSpellNotInDic : "Nicht im Wörterbuch", +DlgSpellChangeTo : "Ändern in", +DlgSpellBtnIgnore : "Ignorieren", +DlgSpellBtnIgnoreAll : "Alle Ignorieren", +DlgSpellBtnReplace : "Ersetzen", +DlgSpellBtnReplaceAll : "Alle Ersetzen", +DlgSpellBtnUndo : "Rückgängig", +DlgSpellNoSuggestions : " - keine Vorschläge - ", +DlgSpellProgress : "Rechtschreibprüfung läuft...", +DlgSpellNoMispell : "Rechtschreibprüfung abgeschlossen - keine Fehler gefunden", +DlgSpellNoChanges : "Rechtschreibprüfung abgeschlossen - keine Worte geändert", +DlgSpellOneChange : "Rechtschreibprüfung abgeschlossen - ein Wort geändert", +DlgSpellManyChanges : "Rechtschreibprüfung abgeschlossen - %1 Wörter geändert", + +IeSpellDownload : "Rechtschreibprüfung nicht installiert. Möchten Sie sie jetzt herunterladen?", + +// Button Dialog +DlgButtonText : "Text (Wert)", +DlgButtonType : "Typ", +DlgButtonTypeBtn : "Button", +DlgButtonTypeSbm : "Absenden", +DlgButtonTypeRst : "Zurücksetzen", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Name", +DlgCheckboxValue : "Wert", +DlgCheckboxSelected : "ausgewählt", + +// Form Dialog +DlgFormName : "Name", +DlgFormAction : "Action", +DlgFormMethod : "Method", + +// Select Field Dialog +DlgSelectName : "Name", +DlgSelectValue : "Wert", +DlgSelectSize : "Größe", +DlgSelectLines : "Linien", +DlgSelectChkMulti : "Erlaube Mehrfachauswahl", +DlgSelectOpAvail : "Mögliche Optionen", +DlgSelectOpText : "Text", +DlgSelectOpValue : "Wert", +DlgSelectBtnAdd : "Hinzufügen", +DlgSelectBtnModify : "Ändern", +DlgSelectBtnUp : "Hoch", +DlgSelectBtnDown : "Runter", +DlgSelectBtnSetValue : "Setze als Standardwert", +DlgSelectBtnDelete : "Entfernen", + +// Textarea Dialog +DlgTextareaName : "Name", +DlgTextareaCols : "Spalten", +DlgTextareaRows : "Reihen", + +// Text Field Dialog +DlgTextName : "Name", +DlgTextValue : "Wert", +DlgTextCharWidth : "Zeichenbreite", +DlgTextMaxChars : "Max. Zeichen", +DlgTextType : "Typ", +DlgTextTypeText : "Text", +DlgTextTypePass : "Passwort", + +// Hidden Field Dialog +DlgHiddenName : "Name", +DlgHiddenValue : "Wert", + +// Bulleted List Dialog +BulletedListProp : "Listen-Eigenschaften", +NumberedListProp : "Nummerierte Listen-Eigenschaften", +DlgLstStart : "Start", +DlgLstType : "Typ", +DlgLstTypeCircle : "Ring", +DlgLstTypeDisc : "Kreis", +DlgLstTypeSquare : "Quadrat", +DlgLstTypeNumbers : "Nummern (1, 2, 3)", +DlgLstTypeLCase : "Kleinbuchstaben (a, b, c)", +DlgLstTypeUCase : "Großbuchstaben (A, B, C)", +DlgLstTypeSRoman : "Kleine römische Zahlen (i, ii, iii)", +DlgLstTypeLRoman : "Große römische Zahlen (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Allgemein", +DlgDocBackTab : "Hintergrund", +DlgDocColorsTab : "Farben und Abstände", +DlgDocMetaTab : "Metadaten", + +DlgDocPageTitle : "Seitentitel", +DlgDocLangDir : "Schriftrichtung", +DlgDocLangDirLTR : "Links nach Rechts", +DlgDocLangDirRTL : "Rechts nach Links", +DlgDocLangCode : "Sprachkürzel", +DlgDocCharSet : "Zeichenkodierung", +DlgDocCharSetCE : "Zentraleuropäisch", +DlgDocCharSetCT : "traditionell Chinesisch (Big5)", +DlgDocCharSetCR : "Kyrillisch", +DlgDocCharSetGR : "Griechisch", +DlgDocCharSetJP : "Japanisch", +DlgDocCharSetKR : "Koreanisch", +DlgDocCharSetTR : "Türkisch", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Westeuropäisch", +DlgDocCharSetOther : "Andere Zeichenkodierung", + +DlgDocDocType : "Dokumententyp", +DlgDocDocTypeOther : "Anderer Dokumententyp", +DlgDocIncXHTML : "Beziehe XHTML Deklarationen ein", +DlgDocBgColor : "Hintergrundfarbe", +DlgDocBgImage : "Hintergrundbild URL", +DlgDocBgNoScroll : "feststehender Hintergrund", +DlgDocCText : "Text", +DlgDocCLink : "Link", +DlgDocCVisited : "Besuchter Link", +DlgDocCActive : "Aktiver Link", +DlgDocMargins : "Seitenränder", +DlgDocMaTop : "Oben", +DlgDocMaLeft : "Links", +DlgDocMaRight : "Rechts", +DlgDocMaBottom : "Unten", +DlgDocMeIndex : "Schlüsselwörter (durch Komma getrennt)", +DlgDocMeDescr : "Dokument-Beschreibung", +DlgDocMeAuthor : "Autor", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Vorschau", + +// Templates Dialog +Templates : "Vorlagen", +DlgTemplatesTitle : "Vorlagen", +DlgTemplatesSelMsg : "Klicken Sie auf eine Vorlage, um sie im Editor zu öffnen (der aktuelle Inhalt wird dabei gelöscht!):", +DlgTemplatesLoading : "Liste der Vorlagen wird geladen. Bitte warten...", +DlgTemplatesNoTpl : "(keine Vorlagen definiert)", +DlgTemplatesReplace : "Aktuellen Inhalt ersetzen", + +// About Dialog +DlgAboutAboutTab : "Ãœber", +DlgAboutBrowserInfoTab : "Browser-Info", +DlgAboutLicenseTab : "Lizenz", +DlgAboutVersion : "Version", +DlgAboutInfo : "Für weitere Informationen siehe", + +// Div Dialog +DlgDivGeneralTab : "Allgemein", +DlgDivAdvancedTab : "Erweitert", +DlgDivStyle : "Style", +DlgDivInlineStyle : "Inline Style" +}; diff --git a/webdir/fckeditor/editor/lang/el.js b/webdir/fckeditor/editor/lang/el.js new file mode 100644 index 0000000..fe4bc46 --- /dev/null +++ b/webdir/fckeditor/editor/lang/el.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Greek language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "ΑπόκÏυψη ΜπάÏας ΕÏγαλείων", +ToolbarExpand : "Εμφάνιση ΜπάÏας ΕÏγαλείων", + +// Toolbar Items and Context Menu +Save : "Αποθήκευση", +NewPage : "Îέα Σελίδα", +Preview : "ΠÏοεπισκόπιση", +Cut : "Αποκοπή", +Copy : "ΑντιγÏαφή", +Paste : "Επικόλληση", +PasteText : "Επικόλληση (απλό κείμενο)", +PasteWord : "Επικόλληση από το Word", +Print : "ΕκτÏπωση", +SelectAll : "Επιλογή όλων", +RemoveFormat : "ΑφαίÏεση ΜοÏφοποίησης", +InsertLinkLbl : "ΣÏνδεσμος (Link)", +InsertLink : "Εισαγωγή/Μεταβολή Συνδέσμου (Link)", +RemoveLink : "ΑφαίÏεση Συνδέσμου (Link)", +VisitLink : "Open Link", //MISSING +Anchor : "Εισαγωγή/επεξεÏγασία Anchor", +AnchorDelete : "Remove Anchor", //MISSING +InsertImageLbl : "Εικόνα", +InsertImage : "Εισαγωγή/Μεταβολή Εικόνας", +InsertFlashLbl : "Εισαγωγή Flash", +InsertFlash : "Εισαγωγή/επεξεÏγασία Flash", +InsertTableLbl : "Πίνακας", +InsertTable : "Εισαγωγή/Μεταβολή Πίνακα", +InsertLineLbl : "ΓÏαμμή", +InsertLine : "Εισαγωγή ΟÏιζόντιας ΓÏαμμής", +InsertSpecialCharLbl: "Ειδικό ΣÏμβολο", +InsertSpecialChar : "Εισαγωγή Î•Î¹Î´Î¹ÎºÎ¿Ï Î£Ï…Î¼Î²ÏŒÎ»Î¿Ï…", +InsertSmileyLbl : "Smiley", +InsertSmiley : "Εισαγωγή Smiley", +About : "ΠεÏί του FCKeditor", +Bold : "Έντονα", +Italic : "Πλάγια", +Underline : "ΥπογÏάμμιση", +StrikeThrough : "ΔιαγÏάμμιση", +Subscript : "Δείκτης", +Superscript : "Εκθέτης", +LeftJustify : "Στοίχιση ΑÏιστεÏά", +CenterJustify : "Στοίχιση στο ΚέντÏο", +RightJustify : "Στοίχιση Δεξιά", +BlockJustify : "ΠλήÏης Στοίχιση (Block)", +DecreaseIndent : "Μείωση Εσοχής", +IncreaseIndent : "ΑÏξηση Εσοχής", +Blockquote : "Blockquote", //MISSING +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "ΑναίÏεση", +Redo : "ΕπαναφοÏά", +NumberedListLbl : "Λίστα με ΑÏιθμοÏÏ‚", +NumberedList : "Εισαγωγή/ΔιαγÏαφή Λίστας με ΑÏιθμοÏÏ‚", +BulletedListLbl : "Λίστα με Bullets", +BulletedList : "Εισαγωγή/ΔιαγÏαφή Λίστας με Bullets", +ShowTableBorders : "ΠÏοβολή ΟÏίων Πίνακα", +ShowDetails : "ΠÏοβολή ΛεπτομεÏειών", +Style : "Στυλ", +FontFormat : "ΜοÏφή ΓÏαμματοσειÏάς", +Font : "ΓÏαμματοσειÏά", +FontSize : "Μέγεθος", +TextColor : "ΧÏώμα ΓÏαμμάτων", +BGColor : "ΧÏώμα ΥποβάθÏου", +Source : "HTML κώδικας", +Find : "Αναζήτηση", +Replace : "Αντικατάσταση", +SpellCheck : "ΟÏθογÏαφικός έλεγχος", +UniversalKeyboard : "Διεθνής πληκτÏολόγιο", +PageBreakLbl : "Τέλος σελίδας", +PageBreak : "Εισαγωγή τέλους σελίδας", + +Form : "ΦόÏμα", +Checkbox : "Κουτί επιλογής", +RadioButton : "Κουμπί Radio", +TextField : "Πεδίο κειμένου", +Textarea : "ΠεÏιοχή κειμένου", +HiddenField : "ΚÏυφό πεδίο", +Button : "Κουμπί", +SelectionField : "Πεδίο επιλογής", +ImageButton : "Κουμπί εικόνας", + +FitWindow : "Μεγιστοποίηση Ï€ÏογÏάμματος", +ShowBlocks : "Show Blocks", //MISSING + +// Context Menu +EditLink : "Μεταβολή Συνδέσμου (Link)", +CellCM : "Κελί", +RowCM : "ΣειÏά", +ColumnCM : "Στήλη", +InsertRowAfter : "Insert Row After", //MISSING +InsertRowBefore : "Insert Row Before", //MISSING +DeleteRows : "ΔιαγÏαφή ΓÏαμμών", +InsertColumnAfter : "Insert Column After", //MISSING +InsertColumnBefore : "Insert Column Before", //MISSING +DeleteColumns : "ΔιαγÏαφή Κολωνών", +InsertCellAfter : "Insert Cell After", //MISSING +InsertCellBefore : "Insert Cell Before", //MISSING +DeleteCells : "ΔιαγÏαφή Κελιών", +MergeCells : "Ενοποίηση Κελιών", +MergeRight : "Merge Right", //MISSING +MergeDown : "Merge Down", //MISSING +HorizontalSplitCell : "Split Cell Horizontally", //MISSING +VerticalSplitCell : "Split Cell Vertically", //MISSING +TableDelete : "ΔιαγÏαφή πίνακα", +CellProperties : "Ιδιότητες ΚελιοÏ", +TableProperties : "Ιδιότητες Πίνακα", +ImageProperties : "Ιδιότητες Εικόνας", +FlashProperties : "Ιδιότητες Flash", + +AnchorProp : "Ιδιότητες άγκυÏας", +ButtonProp : "Ιδιότητες κουμπιοÏ", +CheckboxProp : "Ιδιότητες ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï ÎµÏ€Î¹Î»Î¿Î³Î®Ï‚", +HiddenFieldProp : "Ιδιότητες κÏÏ…Ï†Î¿Ï Ï€ÎµÎ´Î¯Î¿Ï…", +RadioButtonProp : "Ιδιότητες ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï radio", +ImageButtonProp : "Ιδιότητες ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï ÎµÎ¹ÎºÏŒÎ½Î±Ï‚", +TextFieldProp : "Ιδιότητες πεδίου κειμένου", +SelectionFieldProp : "Ιδιότητες πεδίου επιλογής", +TextareaProp : "Ιδιότητες πεÏιοχής κειμένου", +FormProp : "Ιδιότητες φόÏμας", + +FontFormats : "Κανονικό;ΜοÏφοποιημένο;ΔιεÏθυνση;Επικεφαλίδα 1;Επικεφαλίδα 2;Επικεφαλίδα 3;Επικεφαλίδα 4;Επικεφαλίδα 5;Επικεφαλίδα 6", + +// Alerts and Messages +ProcessingXHTML : "ΕπεξεÏγασία XHTML. ΠαÏακαλώ πεÏιμένετε...", +Done : "Έτοιμο", +PasteWordConfirm : "Το κείμενο που θέλετε να επικολήσετε, φαίνεται πως Ï€ÏοέÏχεται από το Word. Θέλετε να καθαÏιστεί Ï€Ïιν επικοληθεί;", +NotCompatiblePaste : "Αυτή η επιλογή είναι διαθέσιμη στον Internet Explorer έκδοση 5.5+. Θέλετε να γίνει η επικόλληση χωÏίς καθαÏισμό;", +UnknownToolbarItem : "Άγνωστο αντικείμενο της μπάÏας εÏγαλείων \"%1\"", +UnknownCommand : "Άγνωστή εντολή \"%1\"", +NotImplemented : "Η εντολή δεν έχει ενεÏγοποιηθεί", +UnknownToolbarSet : "Η μπάÏα εÏγαλείων \"%1\" δεν υπάÏχει", +NoActiveX : "Οι Ïυθμίσεις ασφαλείας του browser σας μποÏεί να πεÏιοÏίσουν κάποιες Ïυθμίσεις του Ï€ÏογÏάμματος. ΧÏειάζεται να ενεÏγοποιήσετε την επιλογή \"Run ActiveX controls and plug-ins\". Ίσως παÏουσιαστοÏν λάθη και παÏατηÏήσετε ελειπείς λειτουÏγίες.", +BrowseServerBlocked : "Οι πόÏοι του browser σας δεν είναι Ï€Ïοσπελάσιμοι. ΣιγουÏευτείτε ότι δεν υπάÏχουν ενεÏγοί popup blockers.", +DialogBlocked : "Δεν ήταν δυνατό να ανοίξει το παÏάθυÏο διαλόγου. ΣιγουÏευτείτε ότι δεν υπάÏχουν ενεÏγοί popup blockers.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "ΑκÏÏωση", +DlgBtnClose : "Κλείσιμο", +DlgBtnBrowseServer : "ΕξεÏεÏνηση διακομιστή", +DlgAdvancedTag : "Για Ï€ÏοχωÏημένους", +DlgOpOther : "<Άλλα>", +DlgInfoTab : "ΠληÏοφοÏίες", +DlgAlertUrl : "ΠαÏακαλώ εισάγετε URL", + +// General Dialogs Labels +DlgGenNotSet : "<χωÏίς>", +DlgGenId : "Id", +DlgGenLangDir : "ΚατεÏθυνση κειμένου", +DlgGenLangDirLtr : "ΑÏιστεÏά Ï€Ïος Δεξιά (LTR)", +DlgGenLangDirRtl : "Δεξιά Ï€Ïος ΑÏιστεÏά (RTL)", +DlgGenLangCode : "Κωδικός Γλώσσας", +DlgGenAccessKey : "Συντόμευση (Access Key)", +DlgGenName : "Όνομα", +DlgGenTabIndex : "Tab Index", +DlgGenLongDescr : "Αναλυτική πεÏιγÏαφή URL", +DlgGenClass : "Stylesheet Classes", +DlgGenTitle : "Συμβουλευτικός τίτλος", +DlgGenContType : "Συμβουλευτικός τίτλος πεÏιεχομένου", +DlgGenLinkCharset : "Linked Resource Charset", +DlgGenStyle : "ΣτÏλ", + +// Image Dialog +DlgImgTitle : "Ιδιότητες Εικόνας", +DlgImgInfoTab : "ΠληÏοφοÏίες Εικόνας", +DlgImgBtnUpload : "Αποστολή στον Διακομιστή", +DlgImgURL : "URL", +DlgImgUpload : "Αποστολή", +DlgImgAlt : "Εναλλακτικό Κείμενο (ALT)", +DlgImgWidth : "Πλάτος", +DlgImgHeight : "Ύψος", +DlgImgLockRatio : "Κλείδωμα Αναλογίας", +DlgBtnResetSize : "ΕπαναφοÏά ΑÏÏ‡Î¹ÎºÎ¿Ï ÎœÎµÎ³Î­Î¸Î¿Ï…Ï‚", +DlgImgBorder : "ΠεÏιθώÏιο", +DlgImgHSpace : "ΟÏιζόντιος ΧώÏος (HSpace)", +DlgImgVSpace : "Κάθετος ΧώÏος (VSpace)", +DlgImgAlign : "ΕυθυγÏάμμιση (Align)", +DlgImgAlignLeft : "ΑÏιστεÏά", +DlgImgAlignAbsBottom: "Απόλυτα Κάτω (Abs Bottom)", +DlgImgAlignAbsMiddle: "Απόλυτα στη Μέση (Abs Middle)", +DlgImgAlignBaseline : "ΓÏαμμή Βάσης (Baseline)", +DlgImgAlignBottom : "Κάτω (Bottom)", +DlgImgAlignMiddle : "Μέση (Middle)", +DlgImgAlignRight : "Δεξιά (Right)", +DlgImgAlignTextTop : "ΚοÏυφή Κειμένου (Text Top)", +DlgImgAlignTop : "Πάνω (Top)", +DlgImgPreview : "ΠÏοεπισκόπιση", +DlgImgAlertUrl : "Εισάγετε την τοποθεσία (URL) της εικόνας", +DlgImgLinkTab : "ΣÏνδεσμος", + +// Flash Dialog +DlgFlashTitle : "Ιδιότητες flash", +DlgFlashChkPlay : "Αυτόματη έναÏξη", +DlgFlashChkLoop : "Επανάληψη", +DlgFlashChkMenu : "ΕνεÏγοποίηση Flash Menu", +DlgFlashScale : "Κλίμακα", +DlgFlashScaleAll : "Εμφάνιση όλων", +DlgFlashScaleNoBorder : "ΧωÏίς ÏŒÏια", +DlgFlashScaleFit : "ΑκÏιβής εφαÏμογή", + +// Link Dialog +DlgLnkWindowTitle : "ΣÏνδεσμος (Link)", +DlgLnkInfoTab : "Link", +DlgLnkTargetTab : "ΠαÏάθυÏο Στόχος (Target)", + +DlgLnkType : "ΤÏπος συνδέσμου (Link)", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "ΆγκυÏα σε αυτή τη σελίδα", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "ΠÏοτόκολο", +DlgLnkProtoOther : "<άλλο>", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Επιλέξτε μια άγκυÏα", +DlgLnkAnchorByName : "Βάσει του Ονόματος (Name) της άγκυÏας", +DlgLnkAnchorById : "Βάσει του Element Id", +DlgLnkNoAnchors : "(Δεν υπάÏχουν άγκυÏες στο κείμενο)", +DlgLnkEMail : "ΔιεÏθυνση ΗλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Î¤Î±Ï‡Ï…Î´Ïομείου", +DlgLnkEMailSubject : "Θέμα ΜηνÏματος", +DlgLnkEMailBody : "Κείμενο ΜηνÏματος", +DlgLnkUpload : "Αποστολή", +DlgLnkBtnUpload : "Αποστολή στον Διακομιστή", + +DlgLnkTarget : "ΠαÏάθυÏο Στόχος (Target)", +DlgLnkTargetFrame : "<πλαίσιο>", +DlgLnkTargetPopup : "<παÏάθυÏο popup>", +DlgLnkTargetBlank : "Îέο ΠαÏάθυÏο (_blank)", +DlgLnkTargetParent : "Γονικό ΠαÏάθυÏο (_parent)", +DlgLnkTargetSelf : "Ίδιο ΠαÏάθυÏο (_self)", +DlgLnkTargetTop : "Ανώτατο ΠαÏάθυÏο (_top)", +DlgLnkTargetFrameName : "Όνομα πλαισίου στόχου", +DlgLnkPopWinName : "Όνομα Popup Window", +DlgLnkPopWinFeat : "Επιλογές Popup Window", +DlgLnkPopResize : "Με αλλαγή Μεγέθους", +DlgLnkPopLocation : "ΜπάÏα Τοποθεσίας", +DlgLnkPopMenu : "ΜπάÏα Menu", +DlgLnkPopScroll : "ΜπάÏες ΚÏλισης", +DlgLnkPopStatus : "ΜπάÏα Status", +DlgLnkPopToolbar : "ΜπάÏα ΕÏγαλείων", +DlgLnkPopFullScrn : "ΟλόκληÏη η Οθόνη (IE)", +DlgLnkPopDependent : "Dependent (Netscape)", +DlgLnkPopWidth : "Πλάτος", +DlgLnkPopHeight : "Ύψος", +DlgLnkPopLeft : "Τοποθεσία ΑÏιστεÏής ΆκÏης", +DlgLnkPopTop : "Τοποθεσία Πάνω ΆκÏης", + +DlnLnkMsgNoUrl : "Εισάγετε την τοποθεσία (URL) του υπεÏσυνδέσμου (Link)", +DlnLnkMsgNoEMail : "Εισάγετε την διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου", +DlnLnkMsgNoAnchor : "Επιλέξτε ένα Anchor", +DlnLnkMsgInvPopName : "Το όνομα του popup Ï€Ïέπει να αÏχίζει με χαÏακτήÏα της αλφαβήτου και να μην πεÏιέχει κενά", + +// Color Dialog +DlgColorTitle : "Επιλογή χÏώματος", +DlgColorBtnClear : "ΚαθαÏισμός", +DlgColorHighlight : "ΠÏοεπισκόπιση", +DlgColorSelected : "Επιλεγμένο", + +// Smiley Dialog +DlgSmileyTitle : "Επιλέξτε ένα Smiley", + +// Special Character Dialog +DlgSpecialCharTitle : "Επιλέξτε ένα Ειδικό ΣÏμβολο", + +// Table Dialog +DlgTableTitle : "Ιδιότητες Πίνακα", +DlgTableRows : "ΓÏαμμές", +DlgTableColumns : "Κολώνες", +DlgTableBorder : "Μέγεθος ΠεÏιθωÏίου", +DlgTableAlign : "Στοίχιση", +DlgTableAlignNotSet : "<χωÏίς>", +DlgTableAlignLeft : "ΑÏιστεÏά", +DlgTableAlignCenter : "ΚέντÏο", +DlgTableAlignRight : "Δεξιά", +DlgTableWidth : "Πλάτος", +DlgTableWidthPx : "pixels", +DlgTableWidthPc : "\%", +DlgTableHeight : "Ύψος", +DlgTableCellSpace : "Απόσταση κελιών", +DlgTableCellPad : "Γέμισμα κελιών", +DlgTableCaption : "ΥπέÏτιτλος", +DlgTableSummary : "ΠεÏίληψη", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Ιδιότητες ΚελιοÏ", +DlgCellWidth : "Πλάτος", +DlgCellWidthPx : "pixels", +DlgCellWidthPc : "\%", +DlgCellHeight : "Ύψος", +DlgCellWordWrap : "Με αλλαγή γÏαμμής", +DlgCellWordWrapNotSet : "<χωÏίς>", +DlgCellWordWrapYes : "Îαι", +DlgCellWordWrapNo : "Όχι", +DlgCellHorAlign : "ΟÏιζόντια Στοίχιση", +DlgCellHorAlignNotSet : "<χωÏίς>", +DlgCellHorAlignLeft : "ΑÏιστεÏά", +DlgCellHorAlignCenter : "ΚέντÏο", +DlgCellHorAlignRight: "Δεξιά", +DlgCellVerAlign : "Κάθετη Στοίχιση", +DlgCellVerAlignNotSet : "<χωÏίς>", +DlgCellVerAlignTop : "Πάνω (Top)", +DlgCellVerAlignMiddle : "Μέση (Middle)", +DlgCellVerAlignBottom : "Κάτω (Bottom)", +DlgCellVerAlignBaseline : "ΓÏαμμή Βάσης (Baseline)", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "ΑÏιθμός ΓÏαμμών (Rows Span)", +DlgCellCollSpan : "ΑÏιθμός Κολωνών (Columns Span)", +DlgCellBackColor : "ΧÏώμα ΥποβάθÏου", +DlgCellBorderColor : "ΧÏώμα ΠεÏιθωÏίου", +DlgCellBtnSelect : "Επιλογή...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", //MISSING + +// Find Dialog +DlgFindTitle : "Αναζήτηση", +DlgFindFindBtn : "Αναζήτηση", +DlgFindNotFoundMsg : "Το κείμενο δεν βÏέθηκε.", + +// Replace Dialog +DlgReplaceTitle : "Αντικατάσταση", +DlgReplaceFindLbl : "Αναζήτηση:", +DlgReplaceReplaceLbl : "Αντικατάσταση με:", +DlgReplaceCaseChk : "Έλεγχος πεζών/κεφαλαίων", +DlgReplaceReplaceBtn : "Αντικατάσταση", +DlgReplaceReplAllBtn : "Αντικατάσταση Όλων", +DlgReplaceWordChk : "ΕÏÏεση πλήÏους λέξης", + +// Paste Operations / Dialog +PasteErrorCut : "Οι Ïυθμίσεις ασφαλείας του φυλλομετÏητή σας δεν επιτÏέπουν την επιλεγμένη εÏγασία αποκοπής. ΧÏησιμοποιείστε το πληκτÏολόγιο (Ctrl+X).", +PasteErrorCopy : "Οι Ïυθμίσεις ασφαλείας του φυλλομετÏητή σας δεν επιτÏέπουν την επιλεγμένη εÏγασία αντιγÏαφής. ΧÏησιμοποιείστε το πληκτÏολόγιο (Ctrl+C).", + +PasteAsText : "Επικόλληση ως Απλό Κείμενο", +PasteFromWord : "Επικόλληση από το Word", + +DlgPasteMsg2 : "ΠαÏακαλώ επικολήστε στο ακόλουθο κουτί χÏησιμοποιόντας το πληκτÏολόγιο (Ctrl+V) και πατήστε OK.", +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", //MISSING +DlgPasteIgnoreFont : "Αγνόηση Ï€ÏοδιαγÏαφών γÏαμματοσειÏάς", +DlgPasteRemoveStyles : "ΑφαίÏεση Ï€ÏοδιαγÏαφών στÏλ", + +// Color Picker +ColorAutomatic : "Αυτόματο", +ColorMoreColors : "ΠεÏισσότεÏα χÏώματα...", + +// Document Properties +DocProps : "Ιδιότητες εγγÏάφου", + +// Anchor Dialog +DlgAnchorTitle : "Ιδιότητες άγκυÏας", +DlgAnchorName : "Όνομα άγκυÏας", +DlgAnchorErrorName : "ΠαÏακαλοÏμε εισάγετε όνομα άγκυÏας", + +// Speller Pages Dialog +DlgSpellNotInDic : "Δεν υπάÏχει στο λεξικό", +DlgSpellChangeTo : "Αλλαγή σε", +DlgSpellBtnIgnore : "Αγνόηση", +DlgSpellBtnIgnoreAll : "Αγνόηση όλων", +DlgSpellBtnReplace : "Αντικατάσταση", +DlgSpellBtnReplaceAll : "Αντικατάσταση όλων", +DlgSpellBtnUndo : "ΑναίÏεση", +DlgSpellNoSuggestions : "- Δεν υπάÏχουν Ï€Ïοτάσεις -", +DlgSpellProgress : "ΟÏθογÏαφικός έλεγχος σε εξέλιξη...", +DlgSpellNoMispell : "Ο οÏθογÏαφικός έλεγχος ολοκληÏώθηκε: Δεν βÏέθηκαν λάθη", +DlgSpellNoChanges : "Ο οÏθογÏαφικός έλεγχος ολοκληÏώθηκε: Δεν άλλαξαν λέξεις", +DlgSpellOneChange : "Ο οÏθογÏαφικός έλεγχος ολοκληÏώθηκε: Μια λέξη άλλαξε", +DlgSpellManyChanges : "Ο οÏθογÏαφικός έλεγχος ολοκληÏώθηκε: %1 λέξεις άλλαξαν", + +IeSpellDownload : "Δεν υπάÏχει εγκατεστημένος οÏθογÏάφος. Θέλετε να τον κατεβάσετε Ï„ÏŽÏα;", + +// Button Dialog +DlgButtonText : "Κείμενο (Τιμή)", +DlgButtonType : "ΤÏπος", +DlgButtonTypeBtn : "Κουμπί", +DlgButtonTypeSbm : "ΚαταχώÏηση", +DlgButtonTypeRst : "ΕπαναφοÏά", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Όνομα", +DlgCheckboxValue : "Τιμή", +DlgCheckboxSelected : "Επιλεγμένο", + +// Form Dialog +DlgFormName : "Όνομα", +DlgFormAction : "ΔÏάση", +DlgFormMethod : "Μάθοδος", + +// Select Field Dialog +DlgSelectName : "Όνομα", +DlgSelectValue : "Τιμή", +DlgSelectSize : "Μέγεθος", +DlgSelectLines : "γÏαμμές", +DlgSelectChkMulti : "Πολλαπλές επιλογές", +DlgSelectOpAvail : "Διαθέσιμες επιλογές", +DlgSelectOpText : "Κείμενο", +DlgSelectOpValue : "Τιμή", +DlgSelectBtnAdd : "ΠÏοσθήκη", +DlgSelectBtnModify : "Αλλαγή", +DlgSelectBtnUp : "Πάνω", +DlgSelectBtnDown : "Κάτω", +DlgSelectBtnSetValue : "ΠÏοεπιλεγμένη επιλογή", +DlgSelectBtnDelete : "ΔιαγÏαφή", + +// Textarea Dialog +DlgTextareaName : "Όνομα", +DlgTextareaCols : "Στήλες", +DlgTextareaRows : "ΣειÏές", + +// Text Field Dialog +DlgTextName : "Όνομα", +DlgTextValue : "Τιμή", +DlgTextCharWidth : "Μήκος χαÏακτήÏων", +DlgTextMaxChars : "Μέγιστοι χαÏακτήÏες", +DlgTextType : "ΤÏπος", +DlgTextTypeText : "Κείμενο", +DlgTextTypePass : "Κωδικός", + +// Hidden Field Dialog +DlgHiddenName : "Όνομα", +DlgHiddenValue : "Τιμή", + +// Bulleted List Dialog +BulletedListProp : "Ιδιότητες λίστας Bulleted", +NumberedListProp : "Ιδιότητες αÏιθμημένης λίστας ", +DlgLstStart : "ΑÏχή", +DlgLstType : "ΤÏπος", +DlgLstTypeCircle : "ΚÏκλος", +DlgLstTypeDisc : "Δίσκος", +DlgLstTypeSquare : "ΤετÏάγωνο", +DlgLstTypeNumbers : "ΑÏιθμοί (1, 2, 3)", +DlgLstTypeLCase : "Πεζά γÏάμματα (a, b, c)", +DlgLstTypeUCase : "Κεφαλαία γÏάμματα (A, B, C)", +DlgLstTypeSRoman : "ΜικÏά λατινικά αÏιθμητικά (i, ii, iii)", +DlgLstTypeLRoman : "Μεγάλα λατινικά αÏιθμητικά (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Γενικά", +DlgDocBackTab : "Φόντο", +DlgDocColorsTab : "ΧÏώματα και πεÏιθώÏια", +DlgDocMetaTab : "Δεδομένα Meta", + +DlgDocPageTitle : "Τίτλος σελίδας", +DlgDocLangDir : "ΚατεÏθυνση γÏαφής", +DlgDocLangDirLTR : "αÏιστεÏά Ï€Ïος δεξιά (LTR)", +DlgDocLangDirRTL : "δεξιά Ï€Ïος αÏιστεÏά (RTL)", +DlgDocLangCode : "Κωδικός γλώσσας", +DlgDocCharSet : "Κωδικοποίηση χαÏακτήÏων", +DlgDocCharSetCE : "ΚεντÏικής ΕυÏώπης", +DlgDocCharSetCT : "ΠαÏαδοσιακά κινέζικα (Big5)", +DlgDocCharSetCR : "ΚυÏιλλική", +DlgDocCharSetGR : "Ελληνική", +DlgDocCharSetJP : "Ιαπωνική", +DlgDocCharSetKR : "ΚοÏεάτικη", +DlgDocCharSetTR : "ΤουÏκική", +DlgDocCharSetUN : "Διεθνής (UTF-8)", +DlgDocCharSetWE : "Δυτικής ΕυÏώπης", +DlgDocCharSetOther : "Άλλη κωδικοποίηση χαÏακτήÏων", + +DlgDocDocType : "Επικεφαλίδα Ï„Ïπου εγγÏάφου", +DlgDocDocTypeOther : "Άλλη επικεφαλίδα Ï„Ïπου εγγÏάφου", +DlgDocIncXHTML : "Îα συμπεÏιληφθοÏν οι δηλώσεις XHTML", +DlgDocBgColor : "ΧÏώμα φόντου", +DlgDocBgImage : "ΔιεÏθυνση εικόνας φόντου", +DlgDocBgNoScroll : "Φόντο χωÏίς κÏλιση", +DlgDocCText : "Κείμενο", +DlgDocCLink : "ΣÏνδεσμος", +DlgDocCVisited : "ΣÏνδεσμος που έχει επισκευθεί", +DlgDocCActive : "ΕνεÏγός σÏνδεσμος", +DlgDocMargins : "ΠεÏιθώÏια σελίδας", +DlgDocMaTop : "ΚοÏυφή", +DlgDocMaLeft : "ΑÏιστεÏά", +DlgDocMaRight : "Δεξιά", +DlgDocMaBottom : "Κάτω", +DlgDocMeIndex : "Λέξεις κλειδιά δείκτες εγγÏάφου (διαχωÏισμός με κόμμα)", +DlgDocMeDescr : "ΠεÏιγÏαφή εγγÏάφου", +DlgDocMeAuthor : "ΣυγγÏαφέας", +DlgDocMeCopy : "Πνευματικά δικαιώματα", +DlgDocPreview : "ΠÏοεπισκόπηση", + +// Templates Dialog +Templates : "ΠÏότυπα", +DlgTemplatesTitle : "ΠÏότυπα πεÏιεχομένου", +DlgTemplatesSelMsg : "ΠαÏακαλώ επιλέξτε Ï€Ïότυπο για εισαγωγή στο Ï€ÏόγÏαμμα
    (τα υπάÏχοντα πεÏιεχόμενα θα χαθοÏν):", +DlgTemplatesLoading : "ΦόÏτωση καταλόγου Ï€ÏοτÏπων. ΠαÏακαλώ πεÏιμένετε...", +DlgTemplatesNoTpl : "(Δεν έχουν καθοÏιστεί Ï€Ïότυπα)", +DlgTemplatesReplace : "Αντικατάσταση υπάÏχοντων πεÏιεχομένων", + +// About Dialog +DlgAboutAboutTab : "Σχετικά", +DlgAboutBrowserInfoTab : "ΠληÏοφοÏίες Browser", +DlgAboutLicenseTab : "Άδεια", +DlgAboutVersion : "έκδοση", +DlgAboutInfo : "Για πεÏισσότεÏες πληÏοφοÏίες", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/en-au.js b/webdir/fckeditor/editor/lang/en-au.js new file mode 100644 index 0000000..9d68d70 --- /dev/null +++ b/webdir/fckeditor/editor/lang/en-au.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * English (Australia) language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Collapse Toolbar", +ToolbarExpand : "Expand Toolbar", + +// Toolbar Items and Context Menu +Save : "Save", +NewPage : "New Page", +Preview : "Preview", +Cut : "Cut", +Copy : "Copy", +Paste : "Paste", +PasteText : "Paste as plain text", +PasteWord : "Paste from Word", +Print : "Print", +SelectAll : "Select All", +RemoveFormat : "Remove Format", +InsertLinkLbl : "Link", +InsertLink : "Insert/Edit Link", +RemoveLink : "Remove Link", +VisitLink : "Open Link", +Anchor : "Insert/Edit Anchor", +AnchorDelete : "Remove Anchor", +InsertImageLbl : "Image", +InsertImage : "Insert/Edit Image", +InsertFlashLbl : "Flash", +InsertFlash : "Insert/Edit Flash", +InsertTableLbl : "Table", +InsertTable : "Insert/Edit Table", +InsertLineLbl : "Line", +InsertLine : "Insert Horizontal Line", +InsertSpecialCharLbl: "Special Character", +InsertSpecialChar : "Insert Special Character", +InsertSmileyLbl : "Smiley", +InsertSmiley : "Insert Smiley", +About : "About FCKeditor", +Bold : "Bold", +Italic : "Italic", +Underline : "Underline", +StrikeThrough : "Strike Through", +Subscript : "Subscript", +Superscript : "Superscript", +LeftJustify : "Left Justify", +CenterJustify : "Centre Justify", +RightJustify : "Right Justify", +BlockJustify : "Block Justify", +DecreaseIndent : "Decrease Indent", +IncreaseIndent : "Increase Indent", +Blockquote : "Blockquote", +CreateDiv : "Create Div Container", +EditDiv : "Edit Div Container", +DeleteDiv : "Remove Div Container", +Undo : "Undo", +Redo : "Redo", +NumberedListLbl : "Numbered List", +NumberedList : "Insert/Remove Numbered List", +BulletedListLbl : "Bulleted List", +BulletedList : "Insert/Remove Bulleted List", +ShowTableBorders : "Show Table Borders", +ShowDetails : "Show Details", +Style : "Style", +FontFormat : "Format", +Font : "Font", +FontSize : "Size", +TextColor : "Text Colour", +BGColor : "Background Colour", +Source : "Source", +Find : "Find", +Replace : "Replace", +SpellCheck : "Check Spelling", +UniversalKeyboard : "Universal Keyboard", +PageBreakLbl : "Page Break", +PageBreak : "Insert Page Break", + +Form : "Form", +Checkbox : "Checkbox", +RadioButton : "Radio Button", +TextField : "Text Field", +Textarea : "Textarea", +HiddenField : "Hidden Field", +Button : "Button", +SelectionField : "Selection Field", +ImageButton : "Image Button", + +FitWindow : "Maximize the editor size", +ShowBlocks : "Show Blocks", + +// Context Menu +EditLink : "Edit Link", +CellCM : "Cell", +RowCM : "Row", +ColumnCM : "Column", +InsertRowAfter : "Insert Row After", +InsertRowBefore : "Insert Row Before", +DeleteRows : "Delete Rows", +InsertColumnAfter : "Insert Column After", +InsertColumnBefore : "Insert Column Before", +DeleteColumns : "Delete Columns", +InsertCellAfter : "Insert Cell After", +InsertCellBefore : "Insert Cell Before", +DeleteCells : "Delete Cells", +MergeCells : "Merge Cells", +MergeRight : "Merge Right", +MergeDown : "Merge Down", +HorizontalSplitCell : "Split Cell Horizontally", +VerticalSplitCell : "Split Cell Vertically", +TableDelete : "Delete Table", +CellProperties : "Cell Properties", +TableProperties : "Table Properties", +ImageProperties : "Image Properties", +FlashProperties : "Flash Properties", + +AnchorProp : "Anchor Properties", +ButtonProp : "Button Properties", +CheckboxProp : "Checkbox Properties", +HiddenFieldProp : "Hidden Field Properties", +RadioButtonProp : "Radio Button Properties", +ImageButtonProp : "Image Button Properties", +TextFieldProp : "Text Field Properties", +SelectionFieldProp : "Selection Field Properties", +TextareaProp : "Textarea Properties", +FormProp : "Form Properties", + +FontFormats : "Normal;Formatted;Address;Heading 1;Heading 2;Heading 3;Heading 4;Heading 5;Heading 6;Normal (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Processing XHTML. Please wait...", +Done : "Done", +PasteWordConfirm : "The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?", +NotCompatiblePaste : "This command is available for Internet Explorer version 5.5 or more. Do you want to paste without cleaning?", +UnknownToolbarItem : "Unknown toolbar item \"%1\"", +UnknownCommand : "Unknown command name \"%1\"", +NotImplemented : "Command not implemented", +UnknownToolbarSet : "Toolbar set \"%1\" doesn't exist", +NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", +BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", +DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Cancel", +DlgBtnClose : "Close", +DlgBtnBrowseServer : "Browse Server", +DlgAdvancedTag : "Advanced", +DlgOpOther : "", +DlgInfoTab : "Info", +DlgAlertUrl : "Please insert the URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Language Direction", +DlgGenLangDirLtr : "Left to Right (LTR)", +DlgGenLangDirRtl : "Right to Left (RTL)", +DlgGenLangCode : "Language Code", +DlgGenAccessKey : "Access Key", +DlgGenName : "Name", +DlgGenTabIndex : "Tab Index", +DlgGenLongDescr : "Long Description URL", +DlgGenClass : "Stylesheet Classes", +DlgGenTitle : "Advisory Title", +DlgGenContType : "Advisory Content Type", +DlgGenLinkCharset : "Linked Resource Charset", +DlgGenStyle : "Style", + +// Image Dialog +DlgImgTitle : "Image Properties", +DlgImgInfoTab : "Image Info", +DlgImgBtnUpload : "Send it to the Server", +DlgImgURL : "URL", +DlgImgUpload : "Upload", +DlgImgAlt : "Alternative Text", +DlgImgWidth : "Width", +DlgImgHeight : "Height", +DlgImgLockRatio : "Lock Ratio", +DlgBtnResetSize : "Reset Size", +DlgImgBorder : "Border", +DlgImgHSpace : "HSpace", +DlgImgVSpace : "VSpace", +DlgImgAlign : "Align", +DlgImgAlignLeft : "Left", +DlgImgAlignAbsBottom: "Abs Bottom", +DlgImgAlignAbsMiddle: "Abs Middle", +DlgImgAlignBaseline : "Baseline", +DlgImgAlignBottom : "Bottom", +DlgImgAlignMiddle : "Middle", +DlgImgAlignRight : "Right", +DlgImgAlignTextTop : "Text Top", +DlgImgAlignTop : "Top", +DlgImgPreview : "Preview", +DlgImgAlertUrl : "Please type the image URL", +DlgImgLinkTab : "Link", + +// Flash Dialog +DlgFlashTitle : "Flash Properties", +DlgFlashChkPlay : "Auto Play", +DlgFlashChkLoop : "Loop", +DlgFlashChkMenu : "Enable Flash Menu", +DlgFlashScale : "Scale", +DlgFlashScaleAll : "Show all", +DlgFlashScaleNoBorder : "No Border", +DlgFlashScaleFit : "Exact Fit", + +// Link Dialog +DlgLnkWindowTitle : "Link", +DlgLnkInfoTab : "Link Info", +DlgLnkTargetTab : "Target", + +DlgLnkType : "Link Type", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Link to anchor in the text", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protocol", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Select an Anchor", +DlgLnkAnchorByName : "By Anchor Name", +DlgLnkAnchorById : "By Element Id", +DlgLnkNoAnchors : "(No anchors available in the document)", +DlgLnkEMail : "E-Mail Address", +DlgLnkEMailSubject : "Message Subject", +DlgLnkEMailBody : "Message Body", +DlgLnkUpload : "Upload", +DlgLnkBtnUpload : "Send it to the Server", + +DlgLnkTarget : "Target", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "New Window (_blank)", +DlgLnkTargetParent : "Parent Window (_parent)", +DlgLnkTargetSelf : "Same Window (_self)", +DlgLnkTargetTop : "Topmost Window (_top)", +DlgLnkTargetFrameName : "Target Frame Name", +DlgLnkPopWinName : "Popup Window Name", +DlgLnkPopWinFeat : "Popup Window Features", +DlgLnkPopResize : "Resizable", +DlgLnkPopLocation : "Location Bar", +DlgLnkPopMenu : "Menu Bar", +DlgLnkPopScroll : "Scroll Bars", +DlgLnkPopStatus : "Status Bar", +DlgLnkPopToolbar : "Toolbar", +DlgLnkPopFullScrn : "Full Screen (IE)", +DlgLnkPopDependent : "Dependent (Netscape)", +DlgLnkPopWidth : "Width", +DlgLnkPopHeight : "Height", +DlgLnkPopLeft : "Left Position", +DlgLnkPopTop : "Top Position", + +DlnLnkMsgNoUrl : "Please type the link URL", +DlnLnkMsgNoEMail : "Please type the e-mail address", +DlnLnkMsgNoAnchor : "Please select an anchor", +DlnLnkMsgInvPopName : "The popup name must begin with an alphabetic character and must not contain spaces", + +// Color Dialog +DlgColorTitle : "Select Colour", +DlgColorBtnClear : "Clear", +DlgColorHighlight : "Highlight", +DlgColorSelected : "Selected", + +// Smiley Dialog +DlgSmileyTitle : "Insert a Smiley", + +// Special Character Dialog +DlgSpecialCharTitle : "Select Special Character", + +// Table Dialog +DlgTableTitle : "Table Properties", +DlgTableRows : "Rows", +DlgTableColumns : "Columns", +DlgTableBorder : "Border size", +DlgTableAlign : "Alignment", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Left", +DlgTableAlignCenter : "Centre", +DlgTableAlignRight : "Right", +DlgTableWidth : "Width", +DlgTableWidthPx : "pixels", +DlgTableWidthPc : "percent", +DlgTableHeight : "Height", +DlgTableCellSpace : "Cell spacing", +DlgTableCellPad : "Cell padding", +DlgTableCaption : "Caption", +DlgTableSummary : "Summary", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Cell Properties", +DlgCellWidth : "Width", +DlgCellWidthPx : "pixels", +DlgCellWidthPc : "percent", +DlgCellHeight : "Height", +DlgCellWordWrap : "Word Wrap", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Yes", +DlgCellWordWrapNo : "No", +DlgCellHorAlign : "Horizontal Alignment", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Left", +DlgCellHorAlignCenter : "Centre", +DlgCellHorAlignRight: "Right", +DlgCellVerAlign : "Vertical Alignment", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Top", +DlgCellVerAlignMiddle : "Middle", +DlgCellVerAlignBottom : "Bottom", +DlgCellVerAlignBaseline : "Baseline", +DlgCellType : "Cell Type", +DlgCellTypeData : "Data", +DlgCellTypeHeader : "Header", +DlgCellRowSpan : "Rows Span", +DlgCellCollSpan : "Columns Span", +DlgCellBackColor : "Background Colour", +DlgCellBorderColor : "Border Colour", +DlgCellBtnSelect : "Select...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", + +// Find Dialog +DlgFindTitle : "Find", +DlgFindFindBtn : "Find", +DlgFindNotFoundMsg : "The specified text was not found.", + +// Replace Dialog +DlgReplaceTitle : "Replace", +DlgReplaceFindLbl : "Find what:", +DlgReplaceReplaceLbl : "Replace with:", +DlgReplaceCaseChk : "Match case", +DlgReplaceReplaceBtn : "Replace", +DlgReplaceReplAllBtn : "Replace All", +DlgReplaceWordChk : "Match whole word", + +// Paste Operations / Dialog +PasteErrorCut : "Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl+X).", +PasteErrorCopy : "Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl+C).", + +PasteAsText : "Paste as Plain Text", +PasteFromWord : "Paste from Word", + +DlgPasteMsg2 : "Please paste inside the following box using the keyboard (Ctrl+V) and hit OK.", +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", +DlgPasteIgnoreFont : "Ignore Font Face definitions", +DlgPasteRemoveStyles : "Remove Styles definitions", + +// Color Picker +ColorAutomatic : "Automatic", +ColorMoreColors : "More Colours...", + +// Document Properties +DocProps : "Document Properties", + +// Anchor Dialog +DlgAnchorTitle : "Anchor Properties", +DlgAnchorName : "Anchor Name", +DlgAnchorErrorName : "Please type the anchor name", + +// Speller Pages Dialog +DlgSpellNotInDic : "Not in dictionary", +DlgSpellChangeTo : "Change to", +DlgSpellBtnIgnore : "Ignore", +DlgSpellBtnIgnoreAll : "Ignore All", +DlgSpellBtnReplace : "Replace", +DlgSpellBtnReplaceAll : "Replace All", +DlgSpellBtnUndo : "Undo", +DlgSpellNoSuggestions : "- No suggestions -", +DlgSpellProgress : "Spell check in progress...", +DlgSpellNoMispell : "Spell check complete: No misspellings found", +DlgSpellNoChanges : "Spell check complete: No words changed", +DlgSpellOneChange : "Spell check complete: One word changed", +DlgSpellManyChanges : "Spell check complete: %1 words changed", + +IeSpellDownload : "Spell checker not installed. Do you want to download it now?", + +// Button Dialog +DlgButtonText : "Text (Value)", +DlgButtonType : "Type", +DlgButtonTypeBtn : "Button", +DlgButtonTypeSbm : "Submit", +DlgButtonTypeRst : "Reset", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Name", +DlgCheckboxValue : "Value", +DlgCheckboxSelected : "Selected", + +// Form Dialog +DlgFormName : "Name", +DlgFormAction : "Action", +DlgFormMethod : "Method", + +// Select Field Dialog +DlgSelectName : "Name", +DlgSelectValue : "Value", +DlgSelectSize : "Size", +DlgSelectLines : "lines", +DlgSelectChkMulti : "Allow multiple selections", +DlgSelectOpAvail : "Available Options", +DlgSelectOpText : "Text", +DlgSelectOpValue : "Value", +DlgSelectBtnAdd : "Add", +DlgSelectBtnModify : "Modify", +DlgSelectBtnUp : "Up", +DlgSelectBtnDown : "Down", +DlgSelectBtnSetValue : "Set as selected value", +DlgSelectBtnDelete : "Delete", + +// Textarea Dialog +DlgTextareaName : "Name", +DlgTextareaCols : "Columns", +DlgTextareaRows : "Rows", + +// Text Field Dialog +DlgTextName : "Name", +DlgTextValue : "Value", +DlgTextCharWidth : "Character Width", +DlgTextMaxChars : "Maximum Characters", +DlgTextType : "Type", +DlgTextTypeText : "Text", +DlgTextTypePass : "Password", + +// Hidden Field Dialog +DlgHiddenName : "Name", +DlgHiddenValue : "Value", + +// Bulleted List Dialog +BulletedListProp : "Bulleted List Properties", +NumberedListProp : "Numbered List Properties", +DlgLstStart : "Start", +DlgLstType : "Type", +DlgLstTypeCircle : "Circle", +DlgLstTypeDisc : "Disc", +DlgLstTypeSquare : "Square", +DlgLstTypeNumbers : "Numbers (1, 2, 3)", +DlgLstTypeLCase : "Lowercase Letters (a, b, c)", +DlgLstTypeUCase : "Uppercase Letters (A, B, C)", +DlgLstTypeSRoman : "Small Roman Numerals (i, ii, iii)", +DlgLstTypeLRoman : "Large Roman Numerals (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "General", +DlgDocBackTab : "Background", +DlgDocColorsTab : "Colours and Margins", +DlgDocMetaTab : "Meta Data", + +DlgDocPageTitle : "Page Title", +DlgDocLangDir : "Language Direction", +DlgDocLangDirLTR : "Left to Right (LTR)", +DlgDocLangDirRTL : "Right to Left (RTL)", +DlgDocLangCode : "Language Code", +DlgDocCharSet : "Character Set Encoding", +DlgDocCharSetCE : "Central European", +DlgDocCharSetCT : "Chinese Traditional (Big5)", +DlgDocCharSetCR : "Cyrillic", +DlgDocCharSetGR : "Greek", +DlgDocCharSetJP : "Japanese", +DlgDocCharSetKR : "Korean", +DlgDocCharSetTR : "Turkish", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Western European", +DlgDocCharSetOther : "Other Character Set Encoding", + +DlgDocDocType : "Document Type Heading", +DlgDocDocTypeOther : "Other Document Type Heading", +DlgDocIncXHTML : "Include XHTML Declarations", +DlgDocBgColor : "Background Colour", +DlgDocBgImage : "Background Image URL", +DlgDocBgNoScroll : "Nonscrolling Background", +DlgDocCText : "Text", +DlgDocCLink : "Link", +DlgDocCVisited : "Visited Link", +DlgDocCActive : "Active Link", +DlgDocMargins : "Page Margins", +DlgDocMaTop : "Top", +DlgDocMaLeft : "Left", +DlgDocMaRight : "Right", +DlgDocMaBottom : "Bottom", +DlgDocMeIndex : "Document Indexing Keywords (comma separated)", +DlgDocMeDescr : "Document Description", +DlgDocMeAuthor : "Author", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Preview", + +// Templates Dialog +Templates : "Templates", +DlgTemplatesTitle : "Content Templates", +DlgTemplatesSelMsg : "Please select the template to open in the editor
    (the actual contents will be lost):", +DlgTemplatesLoading : "Loading templates list. Please wait...", +DlgTemplatesNoTpl : "(No templates defined)", +DlgTemplatesReplace : "Replace actual contents", + +// About Dialog +DlgAboutAboutTab : "About", +DlgAboutBrowserInfoTab : "Browser Info", +DlgAboutLicenseTab : "License", +DlgAboutVersion : "version", +DlgAboutInfo : "For further information go to", + +// Div Dialog +DlgDivGeneralTab : "General", +DlgDivAdvancedTab : "Advanced", +DlgDivStyle : "Style", +DlgDivInlineStyle : "Inline Style" +}; diff --git a/webdir/fckeditor/editor/lang/en-ca.js b/webdir/fckeditor/editor/lang/en-ca.js new file mode 100644 index 0000000..f34d87a --- /dev/null +++ b/webdir/fckeditor/editor/lang/en-ca.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * English (Canadian) language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Collapse Toolbar", +ToolbarExpand : "Expand Toolbar", + +// Toolbar Items and Context Menu +Save : "Save", +NewPage : "New Page", +Preview : "Preview", +Cut : "Cut", +Copy : "Copy", +Paste : "Paste", +PasteText : "Paste as plain text", +PasteWord : "Paste from Word", +Print : "Print", +SelectAll : "Select All", +RemoveFormat : "Remove Format", +InsertLinkLbl : "Link", +InsertLink : "Insert/Edit Link", +RemoveLink : "Remove Link", +VisitLink : "Open Link", +Anchor : "Insert/Edit Anchor", +AnchorDelete : "Remove Anchor", +InsertImageLbl : "Image", +InsertImage : "Insert/Edit Image", +InsertFlashLbl : "Flash", +InsertFlash : "Insert/Edit Flash", +InsertTableLbl : "Table", +InsertTable : "Insert/Edit Table", +InsertLineLbl : "Line", +InsertLine : "Insert Horizontal Line", +InsertSpecialCharLbl: "Special Character", +InsertSpecialChar : "Insert Special Character", +InsertSmileyLbl : "Smiley", +InsertSmiley : "Insert Smiley", +About : "About FCKeditor", +Bold : "Bold", +Italic : "Italic", +Underline : "Underline", +StrikeThrough : "Strike Through", +Subscript : "Subscript", +Superscript : "Superscript", +LeftJustify : "Left Justify", +CenterJustify : "Centre Justify", +RightJustify : "Right Justify", +BlockJustify : "Block Justify", +DecreaseIndent : "Decrease Indent", +IncreaseIndent : "Increase Indent", +Blockquote : "Blockquote", +CreateDiv : "Create Div Container", +EditDiv : "Edit Div Container", +DeleteDiv : "Remove Div Container", +Undo : "Undo", +Redo : "Redo", +NumberedListLbl : "Numbered List", +NumberedList : "Insert/Remove Numbered List", +BulletedListLbl : "Bulleted List", +BulletedList : "Insert/Remove Bulleted List", +ShowTableBorders : "Show Table Borders", +ShowDetails : "Show Details", +Style : "Style", +FontFormat : "Format", +Font : "Font", +FontSize : "Size", +TextColor : "Text Colour", +BGColor : "Background Colour", +Source : "Source", +Find : "Find", +Replace : "Replace", +SpellCheck : "Check Spelling", +UniversalKeyboard : "Universal Keyboard", +PageBreakLbl : "Page Break", +PageBreak : "Insert Page Break", + +Form : "Form", +Checkbox : "Checkbox", +RadioButton : "Radio Button", +TextField : "Text Field", +Textarea : "Textarea", +HiddenField : "Hidden Field", +Button : "Button", +SelectionField : "Selection Field", +ImageButton : "Image Button", + +FitWindow : "Maximize the editor size", +ShowBlocks : "Show Blocks", + +// Context Menu +EditLink : "Edit Link", +CellCM : "Cell", +RowCM : "Row", +ColumnCM : "Column", +InsertRowAfter : "Insert Row After", +InsertRowBefore : "Insert Row Before", +DeleteRows : "Delete Rows", +InsertColumnAfter : "Insert Column After", +InsertColumnBefore : "Insert Column Before", +DeleteColumns : "Delete Columns", +InsertCellAfter : "Insert Cell After", +InsertCellBefore : "Insert Cell Before", +DeleteCells : "Delete Cells", +MergeCells : "Merge Cells", +MergeRight : "Merge Right", +MergeDown : "Merge Down", +HorizontalSplitCell : "Split Cell Horizontally", +VerticalSplitCell : "Split Cell Vertically", +TableDelete : "Delete Table", +CellProperties : "Cell Properties", +TableProperties : "Table Properties", +ImageProperties : "Image Properties", +FlashProperties : "Flash Properties", + +AnchorProp : "Anchor Properties", +ButtonProp : "Button Properties", +CheckboxProp : "Checkbox Properties", +HiddenFieldProp : "Hidden Field Properties", +RadioButtonProp : "Radio Button Properties", +ImageButtonProp : "Image Button Properties", +TextFieldProp : "Text Field Properties", +SelectionFieldProp : "Selection Field Properties", +TextareaProp : "Textarea Properties", +FormProp : "Form Properties", + +FontFormats : "Normal;Formatted;Address;Heading 1;Heading 2;Heading 3;Heading 4;Heading 5;Heading 6;Normal (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Processing XHTML. Please wait...", +Done : "Done", +PasteWordConfirm : "The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?", +NotCompatiblePaste : "This command is available for Internet Explorer version 5.5 or more. Do you want to paste without cleaning?", +UnknownToolbarItem : "Unknown toolbar item \"%1\"", +UnknownCommand : "Unknown command name \"%1\"", +NotImplemented : "Command not implemented", +UnknownToolbarSet : "Toolbar set \"%1\" doesn't exist", +NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", +BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", +DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Cancel", +DlgBtnClose : "Close", +DlgBtnBrowseServer : "Browse Server", +DlgAdvancedTag : "Advanced", +DlgOpOther : "", +DlgInfoTab : "Info", +DlgAlertUrl : "Please insert the URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Language Direction", +DlgGenLangDirLtr : "Left to Right (LTR)", +DlgGenLangDirRtl : "Right to Left (RTL)", +DlgGenLangCode : "Language Code", +DlgGenAccessKey : "Access Key", +DlgGenName : "Name", +DlgGenTabIndex : "Tab Index", +DlgGenLongDescr : "Long Description URL", +DlgGenClass : "Stylesheet Classes", +DlgGenTitle : "Advisory Title", +DlgGenContType : "Advisory Content Type", +DlgGenLinkCharset : "Linked Resource Charset", +DlgGenStyle : "Style", + +// Image Dialog +DlgImgTitle : "Image Properties", +DlgImgInfoTab : "Image Info", +DlgImgBtnUpload : "Send it to the Server", +DlgImgURL : "URL", +DlgImgUpload : "Upload", +DlgImgAlt : "Alternative Text", +DlgImgWidth : "Width", +DlgImgHeight : "Height", +DlgImgLockRatio : "Lock Ratio", +DlgBtnResetSize : "Reset Size", +DlgImgBorder : "Border", +DlgImgHSpace : "HSpace", +DlgImgVSpace : "VSpace", +DlgImgAlign : "Align", +DlgImgAlignLeft : "Left", +DlgImgAlignAbsBottom: "Abs Bottom", +DlgImgAlignAbsMiddle: "Abs Middle", +DlgImgAlignBaseline : "Baseline", +DlgImgAlignBottom : "Bottom", +DlgImgAlignMiddle : "Middle", +DlgImgAlignRight : "Right", +DlgImgAlignTextTop : "Text Top", +DlgImgAlignTop : "Top", +DlgImgPreview : "Preview", +DlgImgAlertUrl : "Please type the image URL", +DlgImgLinkTab : "Link", + +// Flash Dialog +DlgFlashTitle : "Flash Properties", +DlgFlashChkPlay : "Auto Play", +DlgFlashChkLoop : "Loop", +DlgFlashChkMenu : "Enable Flash Menu", +DlgFlashScale : "Scale", +DlgFlashScaleAll : "Show all", +DlgFlashScaleNoBorder : "No Border", +DlgFlashScaleFit : "Exact Fit", + +// Link Dialog +DlgLnkWindowTitle : "Link", +DlgLnkInfoTab : "Link Info", +DlgLnkTargetTab : "Target", + +DlgLnkType : "Link Type", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Link to anchor in the text", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protocol", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Select an Anchor", +DlgLnkAnchorByName : "By Anchor Name", +DlgLnkAnchorById : "By Element Id", +DlgLnkNoAnchors : "(No anchors available in the document)", +DlgLnkEMail : "E-Mail Address", +DlgLnkEMailSubject : "Message Subject", +DlgLnkEMailBody : "Message Body", +DlgLnkUpload : "Upload", +DlgLnkBtnUpload : "Send it to the Server", + +DlgLnkTarget : "Target", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "New Window (_blank)", +DlgLnkTargetParent : "Parent Window (_parent)", +DlgLnkTargetSelf : "Same Window (_self)", +DlgLnkTargetTop : "Topmost Window (_top)", +DlgLnkTargetFrameName : "Target Frame Name", +DlgLnkPopWinName : "Popup Window Name", +DlgLnkPopWinFeat : "Popup Window Features", +DlgLnkPopResize : "Resizable", +DlgLnkPopLocation : "Location Bar", +DlgLnkPopMenu : "Menu Bar", +DlgLnkPopScroll : "Scroll Bars", +DlgLnkPopStatus : "Status Bar", +DlgLnkPopToolbar : "Toolbar", +DlgLnkPopFullScrn : "Full Screen (IE)", +DlgLnkPopDependent : "Dependent (Netscape)", +DlgLnkPopWidth : "Width", +DlgLnkPopHeight : "Height", +DlgLnkPopLeft : "Left Position", +DlgLnkPopTop : "Top Position", + +DlnLnkMsgNoUrl : "Please type the link URL", +DlnLnkMsgNoEMail : "Please type the e-mail address", +DlnLnkMsgNoAnchor : "Please select an anchor", +DlnLnkMsgInvPopName : "The popup name must begin with an alphabetic character and must not contain spaces", + +// Color Dialog +DlgColorTitle : "Select Colour", +DlgColorBtnClear : "Clear", +DlgColorHighlight : "Highlight", +DlgColorSelected : "Selected", + +// Smiley Dialog +DlgSmileyTitle : "Insert a Smiley", + +// Special Character Dialog +DlgSpecialCharTitle : "Select Special Character", + +// Table Dialog +DlgTableTitle : "Table Properties", +DlgTableRows : "Rows", +DlgTableColumns : "Columns", +DlgTableBorder : "Border size", +DlgTableAlign : "Alignment", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Left", +DlgTableAlignCenter : "Centre", +DlgTableAlignRight : "Right", +DlgTableWidth : "Width", +DlgTableWidthPx : "pixels", +DlgTableWidthPc : "percent", +DlgTableHeight : "Height", +DlgTableCellSpace : "Cell spacing", +DlgTableCellPad : "Cell padding", +DlgTableCaption : "Caption", +DlgTableSummary : "Summary", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Cell Properties", +DlgCellWidth : "Width", +DlgCellWidthPx : "pixels", +DlgCellWidthPc : "percent", +DlgCellHeight : "Height", +DlgCellWordWrap : "Word Wrap", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Yes", +DlgCellWordWrapNo : "No", +DlgCellHorAlign : "Horizontal Alignment", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Left", +DlgCellHorAlignCenter : "Centre", +DlgCellHorAlignRight: "Right", +DlgCellVerAlign : "Vertical Alignment", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Top", +DlgCellVerAlignMiddle : "Middle", +DlgCellVerAlignBottom : "Bottom", +DlgCellVerAlignBaseline : "Baseline", +DlgCellType : "Cell Type", +DlgCellTypeData : "Data", +DlgCellTypeHeader : "Header", +DlgCellRowSpan : "Rows Span", +DlgCellCollSpan : "Columns Span", +DlgCellBackColor : "Background Colour", +DlgCellBorderColor : "Border Colour", +DlgCellBtnSelect : "Select...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", + +// Find Dialog +DlgFindTitle : "Find", +DlgFindFindBtn : "Find", +DlgFindNotFoundMsg : "The specified text was not found.", + +// Replace Dialog +DlgReplaceTitle : "Replace", +DlgReplaceFindLbl : "Find what:", +DlgReplaceReplaceLbl : "Replace with:", +DlgReplaceCaseChk : "Match case", +DlgReplaceReplaceBtn : "Replace", +DlgReplaceReplAllBtn : "Replace All", +DlgReplaceWordChk : "Match whole word", + +// Paste Operations / Dialog +PasteErrorCut : "Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl+X).", +PasteErrorCopy : "Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl+C).", + +PasteAsText : "Paste as Plain Text", +PasteFromWord : "Paste from Word", + +DlgPasteMsg2 : "Please paste inside the following box using the keyboard (Ctrl+V) and hit OK.", +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", +DlgPasteIgnoreFont : "Ignore Font Face definitions", +DlgPasteRemoveStyles : "Remove Styles definitions", + +// Color Picker +ColorAutomatic : "Automatic", +ColorMoreColors : "More Colours...", + +// Document Properties +DocProps : "Document Properties", + +// Anchor Dialog +DlgAnchorTitle : "Anchor Properties", +DlgAnchorName : "Anchor Name", +DlgAnchorErrorName : "Please type the anchor name", + +// Speller Pages Dialog +DlgSpellNotInDic : "Not in dictionary", +DlgSpellChangeTo : "Change to", +DlgSpellBtnIgnore : "Ignore", +DlgSpellBtnIgnoreAll : "Ignore All", +DlgSpellBtnReplace : "Replace", +DlgSpellBtnReplaceAll : "Replace All", +DlgSpellBtnUndo : "Undo", +DlgSpellNoSuggestions : "- No suggestions -", +DlgSpellProgress : "Spell check in progress...", +DlgSpellNoMispell : "Spell check complete: No misspellings found", +DlgSpellNoChanges : "Spell check complete: No words changed", +DlgSpellOneChange : "Spell check complete: One word changed", +DlgSpellManyChanges : "Spell check complete: %1 words changed", + +IeSpellDownload : "Spell checker not installed. Do you want to download it now?", + +// Button Dialog +DlgButtonText : "Text (Value)", +DlgButtonType : "Type", +DlgButtonTypeBtn : "Button", +DlgButtonTypeSbm : "Submit", +DlgButtonTypeRst : "Reset", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Name", +DlgCheckboxValue : "Value", +DlgCheckboxSelected : "Selected", + +// Form Dialog +DlgFormName : "Name", +DlgFormAction : "Action", +DlgFormMethod : "Method", + +// Select Field Dialog +DlgSelectName : "Name", +DlgSelectValue : "Value", +DlgSelectSize : "Size", +DlgSelectLines : "lines", +DlgSelectChkMulti : "Allow multiple selections", +DlgSelectOpAvail : "Available Options", +DlgSelectOpText : "Text", +DlgSelectOpValue : "Value", +DlgSelectBtnAdd : "Add", +DlgSelectBtnModify : "Modify", +DlgSelectBtnUp : "Up", +DlgSelectBtnDown : "Down", +DlgSelectBtnSetValue : "Set as selected value", +DlgSelectBtnDelete : "Delete", + +// Textarea Dialog +DlgTextareaName : "Name", +DlgTextareaCols : "Columns", +DlgTextareaRows : "Rows", + +// Text Field Dialog +DlgTextName : "Name", +DlgTextValue : "Value", +DlgTextCharWidth : "Character Width", +DlgTextMaxChars : "Maximum Characters", +DlgTextType : "Type", +DlgTextTypeText : "Text", +DlgTextTypePass : "Password", + +// Hidden Field Dialog +DlgHiddenName : "Name", +DlgHiddenValue : "Value", + +// Bulleted List Dialog +BulletedListProp : "Bulleted List Properties", +NumberedListProp : "Numbered List Properties", +DlgLstStart : "Start", +DlgLstType : "Type", +DlgLstTypeCircle : "Circle", +DlgLstTypeDisc : "Disc", +DlgLstTypeSquare : "Square", +DlgLstTypeNumbers : "Numbers (1, 2, 3)", +DlgLstTypeLCase : "Lowercase Letters (a, b, c)", +DlgLstTypeUCase : "Uppercase Letters (A, B, C)", +DlgLstTypeSRoman : "Small Roman Numerals (i, ii, iii)", +DlgLstTypeLRoman : "Large Roman Numerals (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "General", +DlgDocBackTab : "Background", +DlgDocColorsTab : "Colours and Margins", +DlgDocMetaTab : "Meta Data", + +DlgDocPageTitle : "Page Title", +DlgDocLangDir : "Language Direction", +DlgDocLangDirLTR : "Left to Right (LTR)", +DlgDocLangDirRTL : "Right to Left (RTL)", +DlgDocLangCode : "Language Code", +DlgDocCharSet : "Character Set Encoding", +DlgDocCharSetCE : "Central European", +DlgDocCharSetCT : "Chinese Traditional (Big5)", +DlgDocCharSetCR : "Cyrillic", +DlgDocCharSetGR : "Greek", +DlgDocCharSetJP : "Japanese", +DlgDocCharSetKR : "Korean", +DlgDocCharSetTR : "Turkish", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Western European", +DlgDocCharSetOther : "Other Character Set Encoding", + +DlgDocDocType : "Document Type Heading", +DlgDocDocTypeOther : "Other Document Type Heading", +DlgDocIncXHTML : "Include XHTML Declarations", +DlgDocBgColor : "Background Colour", +DlgDocBgImage : "Background Image URL", +DlgDocBgNoScroll : "Nonscrolling Background", +DlgDocCText : "Text", +DlgDocCLink : "Link", +DlgDocCVisited : "Visited Link", +DlgDocCActive : "Active Link", +DlgDocMargins : "Page Margins", +DlgDocMaTop : "Top", +DlgDocMaLeft : "Left", +DlgDocMaRight : "Right", +DlgDocMaBottom : "Bottom", +DlgDocMeIndex : "Document Indexing Keywords (comma separated)", +DlgDocMeDescr : "Document Description", +DlgDocMeAuthor : "Author", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Preview", + +// Templates Dialog +Templates : "Templates", +DlgTemplatesTitle : "Content Templates", +DlgTemplatesSelMsg : "Please select the template to open in the editor
    (the actual contents will be lost):", +DlgTemplatesLoading : "Loading templates list. Please wait...", +DlgTemplatesNoTpl : "(No templates defined)", +DlgTemplatesReplace : "Replace actual contents", + +// About Dialog +DlgAboutAboutTab : "About", +DlgAboutBrowserInfoTab : "Browser Info", +DlgAboutLicenseTab : "License", +DlgAboutVersion : "version", +DlgAboutInfo : "For further information go to", + +// Div Dialog +DlgDivGeneralTab : "General", +DlgDivAdvancedTab : "Advanced", +DlgDivStyle : "Style", +DlgDivInlineStyle : "Inline Style" +}; diff --git a/webdir/fckeditor/editor/lang/en-uk.js b/webdir/fckeditor/editor/lang/en-uk.js new file mode 100644 index 0000000..0093c75 --- /dev/null +++ b/webdir/fckeditor/editor/lang/en-uk.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * English (United Kingdom) language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Collapse Toolbar", +ToolbarExpand : "Expand Toolbar", + +// Toolbar Items and Context Menu +Save : "Save", +NewPage : "New Page", +Preview : "Preview", +Cut : "Cut", +Copy : "Copy", +Paste : "Paste", +PasteText : "Paste as plain text", +PasteWord : "Paste from Word", +Print : "Print", +SelectAll : "Select All", +RemoveFormat : "Remove Format", +InsertLinkLbl : "Link", +InsertLink : "Insert/Edit Link", +RemoveLink : "Remove Link", +VisitLink : "Open Link", +Anchor : "Insert/Edit Anchor", +AnchorDelete : "Remove Anchor", +InsertImageLbl : "Image", +InsertImage : "Insert/Edit Image", +InsertFlashLbl : "Flash", +InsertFlash : "Insert/Edit Flash", +InsertTableLbl : "Table", +InsertTable : "Insert/Edit Table", +InsertLineLbl : "Line", +InsertLine : "Insert Horizontal Line", +InsertSpecialCharLbl: "Special Character", +InsertSpecialChar : "Insert Special Character", +InsertSmileyLbl : "Smiley", +InsertSmiley : "Insert Smiley", +About : "About FCKeditor", +Bold : "Bold", +Italic : "Italic", +Underline : "Underline", +StrikeThrough : "Strike Through", +Subscript : "Subscript", +Superscript : "Superscript", +LeftJustify : "Left Justify", +CenterJustify : "Centre Justify", +RightJustify : "Right Justify", +BlockJustify : "Block Justify", +DecreaseIndent : "Decrease Indent", +IncreaseIndent : "Increase Indent", +Blockquote : "Blockquote", +CreateDiv : "Create Div Container", +EditDiv : "Edit Div Container", +DeleteDiv : "Remove Div Container", +Undo : "Undo", +Redo : "Redo", +NumberedListLbl : "Numbered List", +NumberedList : "Insert/Remove Numbered List", +BulletedListLbl : "Bulleted List", +BulletedList : "Insert/Remove Bulleted List", +ShowTableBorders : "Show Table Borders", +ShowDetails : "Show Details", +Style : "Style", +FontFormat : "Format", +Font : "Font", +FontSize : "Size", +TextColor : "Text Colour", +BGColor : "Background Colour", +Source : "Source", +Find : "Find", +Replace : "Replace", +SpellCheck : "Check Spelling", +UniversalKeyboard : "Universal Keyboard", +PageBreakLbl : "Page Break", +PageBreak : "Insert Page Break", + +Form : "Form", +Checkbox : "Checkbox", +RadioButton : "Radio Button", +TextField : "Text Field", +Textarea : "Textarea", +HiddenField : "Hidden Field", +Button : "Button", +SelectionField : "Selection Field", +ImageButton : "Image Button", + +FitWindow : "Maximize the editor size", +ShowBlocks : "Show Blocks", + +// Context Menu +EditLink : "Edit Link", +CellCM : "Cell", +RowCM : "Row", +ColumnCM : "Column", +InsertRowAfter : "Insert Row After", +InsertRowBefore : "Insert Row Before", +DeleteRows : "Delete Rows", +InsertColumnAfter : "Insert Column After", +InsertColumnBefore : "Insert Column Before", +DeleteColumns : "Delete Columns", +InsertCellAfter : "Insert Cell After", +InsertCellBefore : "Insert Cell Before", +DeleteCells : "Delete Cells", +MergeCells : "Merge Cells", +MergeRight : "Merge Right", +MergeDown : "Merge Down", +HorizontalSplitCell : "Split Cell Horizontally", +VerticalSplitCell : "Split Cell Vertically", +TableDelete : "Delete Table", +CellProperties : "Cell Properties", +TableProperties : "Table Properties", +ImageProperties : "Image Properties", +FlashProperties : "Flash Properties", + +AnchorProp : "Anchor Properties", +ButtonProp : "Button Properties", +CheckboxProp : "Checkbox Properties", +HiddenFieldProp : "Hidden Field Properties", +RadioButtonProp : "Radio Button Properties", +ImageButtonProp : "Image Button Properties", +TextFieldProp : "Text Field Properties", +SelectionFieldProp : "Selection Field Properties", +TextareaProp : "Textarea Properties", +FormProp : "Form Properties", + +FontFormats : "Normal;Formatted;Address;Heading 1;Heading 2;Heading 3;Heading 4;Heading 5;Heading 6;Normal (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Processing XHTML. Please wait...", +Done : "Done", +PasteWordConfirm : "The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?", +NotCompatiblePaste : "This command is available for Internet Explorer version 5.5 or more. Do you want to paste without cleaning?", +UnknownToolbarItem : "Unknown toolbar item \"%1\"", +UnknownCommand : "Unknown command name \"%1\"", +NotImplemented : "Command not implemented", +UnknownToolbarSet : "Toolbar set \"%1\" doesn't exist", +NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", +BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", +DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Cancel", +DlgBtnClose : "Close", +DlgBtnBrowseServer : "Browse Server", +DlgAdvancedTag : "Advanced", +DlgOpOther : "", +DlgInfoTab : "Info", +DlgAlertUrl : "Please insert the URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Language Direction", +DlgGenLangDirLtr : "Left to Right (LTR)", +DlgGenLangDirRtl : "Right to Left (RTL)", +DlgGenLangCode : "Language Code", +DlgGenAccessKey : "Access Key", +DlgGenName : "Name", +DlgGenTabIndex : "Tab Index", +DlgGenLongDescr : "Long Description URL", +DlgGenClass : "Stylesheet Classes", +DlgGenTitle : "Advisory Title", +DlgGenContType : "Advisory Content Type", +DlgGenLinkCharset : "Linked Resource Charset", +DlgGenStyle : "Style", + +// Image Dialog +DlgImgTitle : "Image Properties", +DlgImgInfoTab : "Image Info", +DlgImgBtnUpload : "Send it to the Server", +DlgImgURL : "URL", +DlgImgUpload : "Upload", +DlgImgAlt : "Alternative Text", +DlgImgWidth : "Width", +DlgImgHeight : "Height", +DlgImgLockRatio : "Lock Ratio", +DlgBtnResetSize : "Reset Size", +DlgImgBorder : "Border", +DlgImgHSpace : "HSpace", +DlgImgVSpace : "VSpace", +DlgImgAlign : "Align", +DlgImgAlignLeft : "Left", +DlgImgAlignAbsBottom: "Abs Bottom", +DlgImgAlignAbsMiddle: "Abs Middle", +DlgImgAlignBaseline : "Baseline", +DlgImgAlignBottom : "Bottom", +DlgImgAlignMiddle : "Middle", +DlgImgAlignRight : "Right", +DlgImgAlignTextTop : "Text Top", +DlgImgAlignTop : "Top", +DlgImgPreview : "Preview", +DlgImgAlertUrl : "Please type the image URL", +DlgImgLinkTab : "Link", + +// Flash Dialog +DlgFlashTitle : "Flash Properties", +DlgFlashChkPlay : "Auto Play", +DlgFlashChkLoop : "Loop", +DlgFlashChkMenu : "Enable Flash Menu", +DlgFlashScale : "Scale", +DlgFlashScaleAll : "Show all", +DlgFlashScaleNoBorder : "No Border", +DlgFlashScaleFit : "Exact Fit", + +// Link Dialog +DlgLnkWindowTitle : "Link", +DlgLnkInfoTab : "Link Info", +DlgLnkTargetTab : "Target", + +DlgLnkType : "Link Type", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Link to anchor in the text", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protocol", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Select an Anchor", +DlgLnkAnchorByName : "By Anchor Name", +DlgLnkAnchorById : "By Element Id", +DlgLnkNoAnchors : "(No anchors available in the document)", +DlgLnkEMail : "E-Mail Address", +DlgLnkEMailSubject : "Message Subject", +DlgLnkEMailBody : "Message Body", +DlgLnkUpload : "Upload", +DlgLnkBtnUpload : "Send it to the Server", + +DlgLnkTarget : "Target", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "New Window (_blank)", +DlgLnkTargetParent : "Parent Window (_parent)", +DlgLnkTargetSelf : "Same Window (_self)", +DlgLnkTargetTop : "Topmost Window (_top)", +DlgLnkTargetFrameName : "Target Frame Name", +DlgLnkPopWinName : "Popup Window Name", +DlgLnkPopWinFeat : "Popup Window Features", +DlgLnkPopResize : "Resizable", +DlgLnkPopLocation : "Location Bar", +DlgLnkPopMenu : "Menu Bar", +DlgLnkPopScroll : "Scroll Bars", +DlgLnkPopStatus : "Status Bar", +DlgLnkPopToolbar : "Toolbar", +DlgLnkPopFullScrn : "Full Screen (IE)", +DlgLnkPopDependent : "Dependent (Netscape)", +DlgLnkPopWidth : "Width", +DlgLnkPopHeight : "Height", +DlgLnkPopLeft : "Left Position", +DlgLnkPopTop : "Top Position", + +DlnLnkMsgNoUrl : "Please type the link URL", +DlnLnkMsgNoEMail : "Please type the e-mail address", +DlnLnkMsgNoAnchor : "Please select an anchor", +DlnLnkMsgInvPopName : "The popup name must begin with an alphabetic character and must not contain spaces", + +// Color Dialog +DlgColorTitle : "Select Colour", +DlgColorBtnClear : "Clear", +DlgColorHighlight : "Highlight", +DlgColorSelected : "Selected", + +// Smiley Dialog +DlgSmileyTitle : "Insert a Smiley", + +// Special Character Dialog +DlgSpecialCharTitle : "Select Special Character", + +// Table Dialog +DlgTableTitle : "Table Properties", +DlgTableRows : "Rows", +DlgTableColumns : "Columns", +DlgTableBorder : "Border size", +DlgTableAlign : "Alignment", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Left", +DlgTableAlignCenter : "Centre", +DlgTableAlignRight : "Right", +DlgTableWidth : "Width", +DlgTableWidthPx : "pixels", +DlgTableWidthPc : "percent", +DlgTableHeight : "Height", +DlgTableCellSpace : "Cell spacing", +DlgTableCellPad : "Cell padding", +DlgTableCaption : "Caption", +DlgTableSummary : "Summary", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Cell Properties", +DlgCellWidth : "Width", +DlgCellWidthPx : "pixels", +DlgCellWidthPc : "percent", +DlgCellHeight : "Height", +DlgCellWordWrap : "Word Wrap", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Yes", +DlgCellWordWrapNo : "No", +DlgCellHorAlign : "Horizontal Alignment", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Left", +DlgCellHorAlignCenter : "Centre", +DlgCellHorAlignRight: "Right", +DlgCellVerAlign : "Vertical Alignment", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Top", +DlgCellVerAlignMiddle : "Middle", +DlgCellVerAlignBottom : "Bottom", +DlgCellVerAlignBaseline : "Baseline", +DlgCellType : "Cell Type", +DlgCellTypeData : "Data", +DlgCellTypeHeader : "Header", +DlgCellRowSpan : "Rows Span", +DlgCellCollSpan : "Columns Span", +DlgCellBackColor : "Background Colour", +DlgCellBorderColor : "Border Colour", +DlgCellBtnSelect : "Select...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", + +// Find Dialog +DlgFindTitle : "Find", +DlgFindFindBtn : "Find", +DlgFindNotFoundMsg : "The specified text was not found.", + +// Replace Dialog +DlgReplaceTitle : "Replace", +DlgReplaceFindLbl : "Find what:", +DlgReplaceReplaceLbl : "Replace with:", +DlgReplaceCaseChk : "Match case", +DlgReplaceReplaceBtn : "Replace", +DlgReplaceReplAllBtn : "Replace All", +DlgReplaceWordChk : "Match whole word", + +// Paste Operations / Dialog +PasteErrorCut : "Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl+X).", +PasteErrorCopy : "Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl+C).", + +PasteAsText : "Paste as Plain Text", +PasteFromWord : "Paste from Word", + +DlgPasteMsg2 : "Please paste inside the following box using the keyboard (Ctrl+V) and hit OK.", +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", +DlgPasteIgnoreFont : "Ignore Font Face definitions", +DlgPasteRemoveStyles : "Remove Styles definitions", + +// Color Picker +ColorAutomatic : "Automatic", +ColorMoreColors : "More Colours...", + +// Document Properties +DocProps : "Document Properties", + +// Anchor Dialog +DlgAnchorTitle : "Anchor Properties", +DlgAnchorName : "Anchor Name", +DlgAnchorErrorName : "Please type the anchor name", + +// Speller Pages Dialog +DlgSpellNotInDic : "Not in dictionary", +DlgSpellChangeTo : "Change to", +DlgSpellBtnIgnore : "Ignore", +DlgSpellBtnIgnoreAll : "Ignore All", +DlgSpellBtnReplace : "Replace", +DlgSpellBtnReplaceAll : "Replace All", +DlgSpellBtnUndo : "Undo", +DlgSpellNoSuggestions : "- No suggestions -", +DlgSpellProgress : "Spell check in progress...", +DlgSpellNoMispell : "Spell check complete: No misspellings found", +DlgSpellNoChanges : "Spell check complete: No words changed", +DlgSpellOneChange : "Spell check complete: One word changed", +DlgSpellManyChanges : "Spell check complete: %1 words changed", + +IeSpellDownload : "Spell checker not installed. Do you want to download it now?", + +// Button Dialog +DlgButtonText : "Text (Value)", +DlgButtonType : "Type", +DlgButtonTypeBtn : "Button", +DlgButtonTypeSbm : "Submit", +DlgButtonTypeRst : "Reset", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Name", +DlgCheckboxValue : "Value", +DlgCheckboxSelected : "Selected", + +// Form Dialog +DlgFormName : "Name", +DlgFormAction : "Action", +DlgFormMethod : "Method", + +// Select Field Dialog +DlgSelectName : "Name", +DlgSelectValue : "Value", +DlgSelectSize : "Size", +DlgSelectLines : "lines", +DlgSelectChkMulti : "Allow multiple selections", +DlgSelectOpAvail : "Available Options", +DlgSelectOpText : "Text", +DlgSelectOpValue : "Value", +DlgSelectBtnAdd : "Add", +DlgSelectBtnModify : "Modify", +DlgSelectBtnUp : "Up", +DlgSelectBtnDown : "Down", +DlgSelectBtnSetValue : "Set as selected value", +DlgSelectBtnDelete : "Delete", + +// Textarea Dialog +DlgTextareaName : "Name", +DlgTextareaCols : "Columns", +DlgTextareaRows : "Rows", + +// Text Field Dialog +DlgTextName : "Name", +DlgTextValue : "Value", +DlgTextCharWidth : "Character Width", +DlgTextMaxChars : "Maximum Characters", +DlgTextType : "Type", +DlgTextTypeText : "Text", +DlgTextTypePass : "Password", + +// Hidden Field Dialog +DlgHiddenName : "Name", +DlgHiddenValue : "Value", + +// Bulleted List Dialog +BulletedListProp : "Bulleted List Properties", +NumberedListProp : "Numbered List Properties", +DlgLstStart : "Start", +DlgLstType : "Type", +DlgLstTypeCircle : "Circle", +DlgLstTypeDisc : "Disc", +DlgLstTypeSquare : "Square", +DlgLstTypeNumbers : "Numbers (1, 2, 3)", +DlgLstTypeLCase : "Lowercase Letters (a, b, c)", +DlgLstTypeUCase : "Uppercase Letters (A, B, C)", +DlgLstTypeSRoman : "Small Roman Numerals (i, ii, iii)", +DlgLstTypeLRoman : "Large Roman Numerals (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "General", +DlgDocBackTab : "Background", +DlgDocColorsTab : "Colours and Margins", +DlgDocMetaTab : "Meta Data", + +DlgDocPageTitle : "Page Title", +DlgDocLangDir : "Language Direction", +DlgDocLangDirLTR : "Left to Right (LTR)", +DlgDocLangDirRTL : "Right to Left (RTL)", +DlgDocLangCode : "Language Code", +DlgDocCharSet : "Character Set Encoding", +DlgDocCharSetCE : "Central European", +DlgDocCharSetCT : "Chinese Traditional (Big5)", +DlgDocCharSetCR : "Cyrillic", +DlgDocCharSetGR : "Greek", +DlgDocCharSetJP : "Japanese", +DlgDocCharSetKR : "Korean", +DlgDocCharSetTR : "Turkish", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Western European", +DlgDocCharSetOther : "Other Character Set Encoding", + +DlgDocDocType : "Document Type Heading", +DlgDocDocTypeOther : "Other Document Type Heading", +DlgDocIncXHTML : "Include XHTML Declarations", +DlgDocBgColor : "Background Colour", +DlgDocBgImage : "Background Image URL", +DlgDocBgNoScroll : "Nonscrolling Background", +DlgDocCText : "Text", +DlgDocCLink : "Link", +DlgDocCVisited : "Visited Link", +DlgDocCActive : "Active Link", +DlgDocMargins : "Page Margins", +DlgDocMaTop : "Top", +DlgDocMaLeft : "Left", +DlgDocMaRight : "Right", +DlgDocMaBottom : "Bottom", +DlgDocMeIndex : "Document Indexing Keywords (comma separated)", +DlgDocMeDescr : "Document Description", +DlgDocMeAuthor : "Author", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Preview", + +// Templates Dialog +Templates : "Templates", +DlgTemplatesTitle : "Content Templates", +DlgTemplatesSelMsg : "Please select the template to open in the editor
    (the actual contents will be lost):", +DlgTemplatesLoading : "Loading templates list. Please wait...", +DlgTemplatesNoTpl : "(No templates defined)", +DlgTemplatesReplace : "Replace actual contents", + +// About Dialog +DlgAboutAboutTab : "About", +DlgAboutBrowserInfoTab : "Browser Info", +DlgAboutLicenseTab : "License", +DlgAboutVersion : "version", +DlgAboutInfo : "For further information go to", + +// Div Dialog +DlgDivGeneralTab : "General", +DlgDivAdvancedTab : "Advanced", +DlgDivStyle : "Style", +DlgDivInlineStyle : "Inline Style" +}; diff --git a/webdir/fckeditor/editor/lang/en.js b/webdir/fckeditor/editor/lang/en.js new file mode 100644 index 0000000..5e26de2 --- /dev/null +++ b/webdir/fckeditor/editor/lang/en.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * English language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Collapse Toolbar", +ToolbarExpand : "Expand Toolbar", + +// Toolbar Items and Context Menu +Save : "Save", +NewPage : "New Page", +Preview : "Preview", +Cut : "Cut", +Copy : "Copy", +Paste : "Paste", +PasteText : "Paste as plain text", +PasteWord : "Paste from Word", +Print : "Print", +SelectAll : "Select All", +RemoveFormat : "Remove Format", +InsertLinkLbl : "Link", +InsertLink : "Insert/Edit Link", +RemoveLink : "Remove Link", +VisitLink : "Open Link", +Anchor : "Insert/Edit Anchor", +AnchorDelete : "Remove Anchor", +InsertImageLbl : "Image", +InsertImage : "Insert/Edit Image", +InsertFlashLbl : "Flash", +InsertFlash : "Insert/Edit Flash", +InsertTableLbl : "Table", +InsertTable : "Insert/Edit Table", +InsertLineLbl : "Line", +InsertLine : "Insert Horizontal Line", +InsertSpecialCharLbl: "Special Character", +InsertSpecialChar : "Insert Special Character", +InsertSmileyLbl : "Smiley", +InsertSmiley : "Insert Smiley", +About : "About FCKeditor", +Bold : "Bold", +Italic : "Italic", +Underline : "Underline", +StrikeThrough : "Strike Through", +Subscript : "Subscript", +Superscript : "Superscript", +LeftJustify : "Left Justify", +CenterJustify : "Center Justify", +RightJustify : "Right Justify", +BlockJustify : "Block Justify", +DecreaseIndent : "Decrease Indent", +IncreaseIndent : "Increase Indent", +Blockquote : "Blockquote", +CreateDiv : "Create Div Container", +EditDiv : "Edit Div Container", +DeleteDiv : "Remove Div Container", +Undo : "Undo", +Redo : "Redo", +NumberedListLbl : "Numbered List", +NumberedList : "Insert/Remove Numbered List", +BulletedListLbl : "Bulleted List", +BulletedList : "Insert/Remove Bulleted List", +ShowTableBorders : "Show Table Borders", +ShowDetails : "Show Details", +Style : "Style", +FontFormat : "Format", +Font : "Font", +FontSize : "Size", +TextColor : "Text Color", +BGColor : "Background Color", +Source : "Source", +Find : "Find", +Replace : "Replace", +SpellCheck : "Check Spelling", +UniversalKeyboard : "Universal Keyboard", +PageBreakLbl : "Page Break", +PageBreak : "Insert Page Break", + +Form : "Form", +Checkbox : "Checkbox", +RadioButton : "Radio Button", +TextField : "Text Field", +Textarea : "Textarea", +HiddenField : "Hidden Field", +Button : "Button", +SelectionField : "Selection Field", +ImageButton : "Image Button", + +FitWindow : "Maximize the editor size", +ShowBlocks : "Show Blocks", + +// Context Menu +EditLink : "Edit Link", +CellCM : "Cell", +RowCM : "Row", +ColumnCM : "Column", +InsertRowAfter : "Insert Row After", +InsertRowBefore : "Insert Row Before", +DeleteRows : "Delete Rows", +InsertColumnAfter : "Insert Column After", +InsertColumnBefore : "Insert Column Before", +DeleteColumns : "Delete Columns", +InsertCellAfter : "Insert Cell After", +InsertCellBefore : "Insert Cell Before", +DeleteCells : "Delete Cells", +MergeCells : "Merge Cells", +MergeRight : "Merge Right", +MergeDown : "Merge Down", +HorizontalSplitCell : "Split Cell Horizontally", +VerticalSplitCell : "Split Cell Vertically", +TableDelete : "Delete Table", +CellProperties : "Cell Properties", +TableProperties : "Table Properties", +ImageProperties : "Image Properties", +FlashProperties : "Flash Properties", + +AnchorProp : "Anchor Properties", +ButtonProp : "Button Properties", +CheckboxProp : "Checkbox Properties", +HiddenFieldProp : "Hidden Field Properties", +RadioButtonProp : "Radio Button Properties", +ImageButtonProp : "Image Button Properties", +TextFieldProp : "Text Field Properties", +SelectionFieldProp : "Selection Field Properties", +TextareaProp : "Textarea Properties", +FormProp : "Form Properties", + +FontFormats : "Normal;Formatted;Address;Heading 1;Heading 2;Heading 3;Heading 4;Heading 5;Heading 6;Normal (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Processing XHTML. Please wait...", +Done : "Done", +PasteWordConfirm : "The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?", +NotCompatiblePaste : "This command is available for Internet Explorer version 5.5 or more. Do you want to paste without cleaning?", +UnknownToolbarItem : "Unknown toolbar item \"%1\"", +UnknownCommand : "Unknown command name \"%1\"", +NotImplemented : "Command not implemented", +UnknownToolbarSet : "Toolbar set \"%1\" doesn't exist", +NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", +BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", +DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Cancel", +DlgBtnClose : "Close", +DlgBtnBrowseServer : "Browse Server", +DlgAdvancedTag : "Advanced", +DlgOpOther : "", +DlgInfoTab : "Info", +DlgAlertUrl : "Please insert the URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Language Direction", +DlgGenLangDirLtr : "Left to Right (LTR)", +DlgGenLangDirRtl : "Right to Left (RTL)", +DlgGenLangCode : "Language Code", +DlgGenAccessKey : "Access Key", +DlgGenName : "Name", +DlgGenTabIndex : "Tab Index", +DlgGenLongDescr : "Long Description URL", +DlgGenClass : "Stylesheet Classes", +DlgGenTitle : "Advisory Title", +DlgGenContType : "Advisory Content Type", +DlgGenLinkCharset : "Linked Resource Charset", +DlgGenStyle : "Style", + +// Image Dialog +DlgImgTitle : "Image Properties", +DlgImgInfoTab : "Image Info", +DlgImgBtnUpload : "Send it to the Server", +DlgImgURL : "URL", +DlgImgUpload : "Upload", +DlgImgAlt : "Alternative Text", +DlgImgWidth : "Width", +DlgImgHeight : "Height", +DlgImgLockRatio : "Lock Ratio", +DlgBtnResetSize : "Reset Size", +DlgImgBorder : "Border", +DlgImgHSpace : "HSpace", +DlgImgVSpace : "VSpace", +DlgImgAlign : "Align", +DlgImgAlignLeft : "Left", +DlgImgAlignAbsBottom: "Abs Bottom", +DlgImgAlignAbsMiddle: "Abs Middle", +DlgImgAlignBaseline : "Baseline", +DlgImgAlignBottom : "Bottom", +DlgImgAlignMiddle : "Middle", +DlgImgAlignRight : "Right", +DlgImgAlignTextTop : "Text Top", +DlgImgAlignTop : "Top", +DlgImgPreview : "Preview", +DlgImgAlertUrl : "Please type the image URL", +DlgImgLinkTab : "Link", + +// Flash Dialog +DlgFlashTitle : "Flash Properties", +DlgFlashChkPlay : "Auto Play", +DlgFlashChkLoop : "Loop", +DlgFlashChkMenu : "Enable Flash Menu", +DlgFlashScale : "Scale", +DlgFlashScaleAll : "Show all", +DlgFlashScaleNoBorder : "No Border", +DlgFlashScaleFit : "Exact Fit", + +// Link Dialog +DlgLnkWindowTitle : "Link", +DlgLnkInfoTab : "Link Info", +DlgLnkTargetTab : "Target", + +DlgLnkType : "Link Type", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Link to anchor in the text", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protocol", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Select an Anchor", +DlgLnkAnchorByName : "By Anchor Name", +DlgLnkAnchorById : "By Element Id", +DlgLnkNoAnchors : "(No anchors available in the document)", +DlgLnkEMail : "E-Mail Address", +DlgLnkEMailSubject : "Message Subject", +DlgLnkEMailBody : "Message Body", +DlgLnkUpload : "Upload", +DlgLnkBtnUpload : "Send it to the Server", + +DlgLnkTarget : "Target", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "New Window (_blank)", +DlgLnkTargetParent : "Parent Window (_parent)", +DlgLnkTargetSelf : "Same Window (_self)", +DlgLnkTargetTop : "Topmost Window (_top)", +DlgLnkTargetFrameName : "Target Frame Name", +DlgLnkPopWinName : "Popup Window Name", +DlgLnkPopWinFeat : "Popup Window Features", +DlgLnkPopResize : "Resizable", +DlgLnkPopLocation : "Location Bar", +DlgLnkPopMenu : "Menu Bar", +DlgLnkPopScroll : "Scroll Bars", +DlgLnkPopStatus : "Status Bar", +DlgLnkPopToolbar : "Toolbar", +DlgLnkPopFullScrn : "Full Screen (IE)", +DlgLnkPopDependent : "Dependent (Netscape)", +DlgLnkPopWidth : "Width", +DlgLnkPopHeight : "Height", +DlgLnkPopLeft : "Left Position", +DlgLnkPopTop : "Top Position", + +DlnLnkMsgNoUrl : "Please type the link URL", +DlnLnkMsgNoEMail : "Please type the e-mail address", +DlnLnkMsgNoAnchor : "Please select an anchor", +DlnLnkMsgInvPopName : "The popup name must begin with an alphabetic character and must not contain spaces", + +// Color Dialog +DlgColorTitle : "Select Color", +DlgColorBtnClear : "Clear", +DlgColorHighlight : "Highlight", +DlgColorSelected : "Selected", + +// Smiley Dialog +DlgSmileyTitle : "Insert a Smiley", + +// Special Character Dialog +DlgSpecialCharTitle : "Select Special Character", + +// Table Dialog +DlgTableTitle : "Table Properties", +DlgTableRows : "Rows", +DlgTableColumns : "Columns", +DlgTableBorder : "Border size", +DlgTableAlign : "Alignment", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Left", +DlgTableAlignCenter : "Center", +DlgTableAlignRight : "Right", +DlgTableWidth : "Width", +DlgTableWidthPx : "pixels", +DlgTableWidthPc : "percent", +DlgTableHeight : "Height", +DlgTableCellSpace : "Cell spacing", +DlgTableCellPad : "Cell padding", +DlgTableCaption : "Caption", +DlgTableSummary : "Summary", +DlgTableHeaders : "Headers", +DlgTableHeadersNone : "None", +DlgTableHeadersColumn : "First column", +DlgTableHeadersRow : "First Row", +DlgTableHeadersBoth : "Both", + +// Table Cell Dialog +DlgCellTitle : "Cell Properties", +DlgCellWidth : "Width", +DlgCellWidthPx : "pixels", +DlgCellWidthPc : "percent", +DlgCellHeight : "Height", +DlgCellWordWrap : "Word Wrap", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Yes", +DlgCellWordWrapNo : "No", +DlgCellHorAlign : "Horizontal Alignment", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Left", +DlgCellHorAlignCenter : "Center", +DlgCellHorAlignRight: "Right", +DlgCellVerAlign : "Vertical Alignment", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Top", +DlgCellVerAlignMiddle : "Middle", +DlgCellVerAlignBottom : "Bottom", +DlgCellVerAlignBaseline : "Baseline", +DlgCellType : "Cell Type", +DlgCellTypeData : "Data", +DlgCellTypeHeader : "Header", +DlgCellRowSpan : "Rows Span", +DlgCellCollSpan : "Columns Span", +DlgCellBackColor : "Background Color", +DlgCellBorderColor : "Border Color", +DlgCellBtnSelect : "Select...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", + +// Find Dialog +DlgFindTitle : "Find", +DlgFindFindBtn : "Find", +DlgFindNotFoundMsg : "The specified text was not found.", + +// Replace Dialog +DlgReplaceTitle : "Replace", +DlgReplaceFindLbl : "Find what:", +DlgReplaceReplaceLbl : "Replace with:", +DlgReplaceCaseChk : "Match case", +DlgReplaceReplaceBtn : "Replace", +DlgReplaceReplAllBtn : "Replace All", +DlgReplaceWordChk : "Match whole word", + +// Paste Operations / Dialog +PasteErrorCut : "Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl+X).", +PasteErrorCopy : "Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl+C).", + +PasteAsText : "Paste as Plain Text", +PasteFromWord : "Paste from Word", + +DlgPasteMsg2 : "Please paste inside the following box using the keyboard (Ctrl+V) and hit OK.", +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", +DlgPasteIgnoreFont : "Ignore Font Face definitions", +DlgPasteRemoveStyles : "Remove Styles definitions", + +// Color Picker +ColorAutomatic : "Automatic", +ColorMoreColors : "More Colors...", + +// Document Properties +DocProps : "Document Properties", + +// Anchor Dialog +DlgAnchorTitle : "Anchor Properties", +DlgAnchorName : "Anchor Name", +DlgAnchorErrorName : "Please type the anchor name", + +// Speller Pages Dialog +DlgSpellNotInDic : "Not in dictionary", +DlgSpellChangeTo : "Change to", +DlgSpellBtnIgnore : "Ignore", +DlgSpellBtnIgnoreAll : "Ignore All", +DlgSpellBtnReplace : "Replace", +DlgSpellBtnReplaceAll : "Replace All", +DlgSpellBtnUndo : "Undo", +DlgSpellNoSuggestions : "- No suggestions -", +DlgSpellProgress : "Spell check in progress...", +DlgSpellNoMispell : "Spell check complete: No misspellings found", +DlgSpellNoChanges : "Spell check complete: No words changed", +DlgSpellOneChange : "Spell check complete: One word changed", +DlgSpellManyChanges : "Spell check complete: %1 words changed", + +IeSpellDownload : "Spell checker not installed. Do you want to download it now?", + +// Button Dialog +DlgButtonText : "Text (Value)", +DlgButtonType : "Type", +DlgButtonTypeBtn : "Button", +DlgButtonTypeSbm : "Submit", +DlgButtonTypeRst : "Reset", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Name", +DlgCheckboxValue : "Value", +DlgCheckboxSelected : "Selected", + +// Form Dialog +DlgFormName : "Name", +DlgFormAction : "Action", +DlgFormMethod : "Method", + +// Select Field Dialog +DlgSelectName : "Name", +DlgSelectValue : "Value", +DlgSelectSize : "Size", +DlgSelectLines : "lines", +DlgSelectChkMulti : "Allow multiple selections", +DlgSelectOpAvail : "Available Options", +DlgSelectOpText : "Text", +DlgSelectOpValue : "Value", +DlgSelectBtnAdd : "Add", +DlgSelectBtnModify : "Modify", +DlgSelectBtnUp : "Up", +DlgSelectBtnDown : "Down", +DlgSelectBtnSetValue : "Set as selected value", +DlgSelectBtnDelete : "Delete", + +// Textarea Dialog +DlgTextareaName : "Name", +DlgTextareaCols : "Columns", +DlgTextareaRows : "Rows", + +// Text Field Dialog +DlgTextName : "Name", +DlgTextValue : "Value", +DlgTextCharWidth : "Character Width", +DlgTextMaxChars : "Maximum Characters", +DlgTextType : "Type", +DlgTextTypeText : "Text", +DlgTextTypePass : "Password", + +// Hidden Field Dialog +DlgHiddenName : "Name", +DlgHiddenValue : "Value", + +// Bulleted List Dialog +BulletedListProp : "Bulleted List Properties", +NumberedListProp : "Numbered List Properties", +DlgLstStart : "Start", +DlgLstType : "Type", +DlgLstTypeCircle : "Circle", +DlgLstTypeDisc : "Disc", +DlgLstTypeSquare : "Square", +DlgLstTypeNumbers : "Numbers (1, 2, 3)", +DlgLstTypeLCase : "Lowercase Letters (a, b, c)", +DlgLstTypeUCase : "Uppercase Letters (A, B, C)", +DlgLstTypeSRoman : "Small Roman Numerals (i, ii, iii)", +DlgLstTypeLRoman : "Large Roman Numerals (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "General", +DlgDocBackTab : "Background", +DlgDocColorsTab : "Colors and Margins", +DlgDocMetaTab : "Meta Data", + +DlgDocPageTitle : "Page Title", +DlgDocLangDir : "Language Direction", +DlgDocLangDirLTR : "Left to Right (LTR)", +DlgDocLangDirRTL : "Right to Left (RTL)", +DlgDocLangCode : "Language Code", +DlgDocCharSet : "Character Set Encoding", +DlgDocCharSetCE : "Central European", +DlgDocCharSetCT : "Chinese Traditional (Big5)", +DlgDocCharSetCR : "Cyrillic", +DlgDocCharSetGR : "Greek", +DlgDocCharSetJP : "Japanese", +DlgDocCharSetKR : "Korean", +DlgDocCharSetTR : "Turkish", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Western European", +DlgDocCharSetOther : "Other Character Set Encoding", + +DlgDocDocType : "Document Type Heading", +DlgDocDocTypeOther : "Other Document Type Heading", +DlgDocIncXHTML : "Include XHTML Declarations", +DlgDocBgColor : "Background Color", +DlgDocBgImage : "Background Image URL", +DlgDocBgNoScroll : "Nonscrolling Background", +DlgDocCText : "Text", +DlgDocCLink : "Link", +DlgDocCVisited : "Visited Link", +DlgDocCActive : "Active Link", +DlgDocMargins : "Page Margins", +DlgDocMaTop : "Top", +DlgDocMaLeft : "Left", +DlgDocMaRight : "Right", +DlgDocMaBottom : "Bottom", +DlgDocMeIndex : "Document Indexing Keywords (comma separated)", +DlgDocMeDescr : "Document Description", +DlgDocMeAuthor : "Author", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Preview", + +// Templates Dialog +Templates : "Templates", +DlgTemplatesTitle : "Content Templates", +DlgTemplatesSelMsg : "Please select the template to open in the editor
    (the actual contents will be lost):", +DlgTemplatesLoading : "Loading templates list. Please wait...", +DlgTemplatesNoTpl : "(No templates defined)", +DlgTemplatesReplace : "Replace actual contents", + +// About Dialog +DlgAboutAboutTab : "About", +DlgAboutBrowserInfoTab : "Browser Info", +DlgAboutLicenseTab : "License", +DlgAboutVersion : "version", +DlgAboutInfo : "For further information go to", + +// Div Dialog +DlgDivGeneralTab : "General", +DlgDivAdvancedTab : "Advanced", +DlgDivStyle : "Style", +DlgDivInlineStyle : "Inline Style" +}; diff --git a/webdir/fckeditor/editor/lang/eo.js b/webdir/fckeditor/editor/lang/eo.js new file mode 100644 index 0000000..f2e6c67 --- /dev/null +++ b/webdir/fckeditor/editor/lang/eo.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Esperanto language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "KaÅi Ilobreton", +ToolbarExpand : "Vidigi Ilojn", + +// Toolbar Items and Context Menu +Save : "Sekurigi", +NewPage : "Nova PaÄo", +Preview : "Vidigi Aspekton", +Cut : "Eltondi", +Copy : "Kopii", +Paste : "Interglui", +PasteText : "Interglui kiel Tekston", +PasteWord : "Interglui el Word", +Print : "Presi", +SelectAll : "Elekti ĉion", +RemoveFormat : "Forigi Formaton", +InsertLinkLbl : "Ligilo", +InsertLink : "Enmeti/ÅœanÄi Ligilon", +RemoveLink : "Forigi Ligilon", +VisitLink : "Open Link", //MISSING +Anchor : "Enmeti/ÅœanÄi Ankron", +AnchorDelete : "Remove Anchor", //MISSING +InsertImageLbl : "Bildo", +InsertImage : "Enmeti/ÅœanÄi Bildon", +InsertFlashLbl : "Flash", //MISSING +InsertFlash : "Insert/Edit Flash", //MISSING +InsertTableLbl : "Tabelo", +InsertTable : "Enmeti/ÅœanÄi Tabelon", +InsertLineLbl : "Horizonta Linio", +InsertLine : "Enmeti Horizonta Linio", +InsertSpecialCharLbl: "Speciala Signo", +InsertSpecialChar : "Enmeti Specialan Signon", +InsertSmileyLbl : "Mienvinjeto", +InsertSmiley : "Enmeti Mienvinjeton", +About : "Pri FCKeditor", +Bold : "Grasa", +Italic : "Kursiva", +Underline : "Substreko", +StrikeThrough : "Trastreko", +Subscript : "Subskribo", +Superscript : "Superskribo", +LeftJustify : "Maldekstrigi", +CenterJustify : "Centrigi", +RightJustify : "Dekstrigi", +BlockJustify : "Äœisrandigi AmbaÅ­flanke", +DecreaseIndent : "Malpligrandigi KrommarÄenon", +IncreaseIndent : "Pligrandigi KrommarÄenon", +Blockquote : "Blockquote", //MISSING +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "Malfari", +Redo : "Refari", +NumberedListLbl : "Numera Listo", +NumberedList : "Enmeti/Forigi Numeran Liston", +BulletedListLbl : "Bula Listo", +BulletedList : "Enmeti/Forigi Bulan Liston", +ShowTableBorders : "Vidigi Borderojn de Tabelo", +ShowDetails : "Vidigi Detalojn", +Style : "Stilo", +FontFormat : "Formato", +Font : "Tiparo", +FontSize : "Grando", +TextColor : "Teksta Koloro", +BGColor : "Fona Koloro", +Source : "Fonto", +Find : "Serĉi", +Replace : "AnstataÅ­igi", +SpellCheck : "Literumada Kontrolilo", +UniversalKeyboard : "Universala Klavaro", +PageBreakLbl : "Page Break", //MISSING +PageBreak : "Insert Page Break", //MISSING + +Form : "Formularo", +Checkbox : "Markobutono", +RadioButton : "Radiobutono", +TextField : "Teksta kampo", +Textarea : "Teksta Areo", +HiddenField : "KaÅita Kampo", +Button : "Butono", +SelectionField : "Elekta Kampo", +ImageButton : "Bildbutono", + +FitWindow : "Maximize the editor size", //MISSING +ShowBlocks : "Show Blocks", //MISSING + +// Context Menu +EditLink : "Modifier Ligilon", +CellCM : "Cell", //MISSING +RowCM : "Row", //MISSING +ColumnCM : "Column", //MISSING +InsertRowAfter : "Insert Row After", //MISSING +InsertRowBefore : "Insert Row Before", //MISSING +DeleteRows : "Forigi Liniojn", +InsertColumnAfter : "Insert Column After", //MISSING +InsertColumnBefore : "Insert Column Before", //MISSING +DeleteColumns : "Forigi Kolumnojn", +InsertCellAfter : "Insert Cell After", //MISSING +InsertCellBefore : "Insert Cell Before", //MISSING +DeleteCells : "Forigi Ĉelojn", +MergeCells : "Kunfandi Ĉelojn", +MergeRight : "Merge Right", //MISSING +MergeDown : "Merge Down", //MISSING +HorizontalSplitCell : "Split Cell Horizontally", //MISSING +VerticalSplitCell : "Split Cell Vertically", //MISSING +TableDelete : "Delete Table", //MISSING +CellProperties : "Atributoj de Ĉelo", +TableProperties : "Atributoj de Tabelo", +ImageProperties : "Atributoj de Bildo", +FlashProperties : "Flash Properties", //MISSING + +AnchorProp : "Ankraj Atributoj", +ButtonProp : "Butonaj Atributoj", +CheckboxProp : "Markobutonaj Atributoj", +HiddenFieldProp : "Atributoj de KaÅita Kampo", +RadioButtonProp : "Radiobutonaj Atributoj", +ImageButtonProp : "Bildbutonaj Atributoj", +TextFieldProp : "Atributoj de Teksta Kampo", +SelectionFieldProp : "Atributoj de Elekta Kampo", +TextareaProp : "Atributoj de Teksta Areo", +FormProp : "Formularaj Atributoj", + +FontFormats : "Normala;Formatita;Adreso;Titolo 1;Titolo 2;Titolo 3;Titolo 4;Titolo 5;Titolo 6;Paragrafo (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Traktado de XHTML. Bonvolu pacienci...", +Done : "Finita", +PasteWordConfirm : "La algluota teksto Åajnas esti Word-devena. Ĉu vi volas purigi Äin antaÅ­ ol interglui?", +NotCompatiblePaste : "Tiu ĉi komando bezonas almenaÅ­ Internet Explorer 5.5. Ĉu vi volas daÅ­rigi sen purigado?", +UnknownToolbarItem : "Ilobretero nekonata \"%1\"", +UnknownCommand : "Komandonomo nekonata \"%1\"", +NotImplemented : "Komando ne ankoraÅ­ realigita", +UnknownToolbarSet : "La ilobreto \"%1\" ne ekzistas", +NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", //MISSING +BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", //MISSING +DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", //MISSING +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "Akcepti", +DlgBtnCancel : "Rezigni", +DlgBtnClose : "Fermi", +DlgBtnBrowseServer : "Foliumi en la Servilo", +DlgAdvancedTag : "Speciala", +DlgOpOther : "", +DlgInfoTab : "Info", //MISSING +DlgAlertUrl : "Please insert the URL", //MISSING + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Skribdirekto", +DlgGenLangDirLtr : "De maldekstro dekstren (LTR)", +DlgGenLangDirRtl : "De dekstro maldekstren (RTL)", +DlgGenLangCode : "Lingva Kodo", +DlgGenAccessKey : "Fulmoklavo", +DlgGenName : "Nomo", +DlgGenTabIndex : "Taba Ordo", +DlgGenLongDescr : "URL de Longa Priskribo", +DlgGenClass : "Klasoj de Stilfolioj", +DlgGenTitle : "Indika Titolo", +DlgGenContType : "Indika Enhavotipo", +DlgGenLinkCharset : "Signaro de la Ligita Rimedo", +DlgGenStyle : "Stilo", + +// Image Dialog +DlgImgTitle : "Atributoj de Bildo", +DlgImgInfoTab : "Informoj pri Bildo", +DlgImgBtnUpload : "Sendu al Servilo", +DlgImgURL : "URL", +DlgImgUpload : "AlÅuti", +DlgImgAlt : "AnstataÅ­iga Teksto", +DlgImgWidth : "LarÄo", +DlgImgHeight : "Alto", +DlgImgLockRatio : "Konservi Proporcion", +DlgBtnResetSize : "Origina Grando", +DlgImgBorder : "Bordero", +DlgImgHSpace : "HSpaco", +DlgImgVSpace : "VSpaco", +DlgImgAlign : "Äœisrandigo", +DlgImgAlignLeft : "Maldekstre", +DlgImgAlignAbsBottom: "Abs Malsupre", +DlgImgAlignAbsMiddle: "Abs Centre", +DlgImgAlignBaseline : "Je Malsupro de Teksto", +DlgImgAlignBottom : "Malsupre", +DlgImgAlignMiddle : "Centre", +DlgImgAlignRight : "Dekstre", +DlgImgAlignTextTop : "Je Supro de Teksto", +DlgImgAlignTop : "Supre", +DlgImgPreview : "Vidigi Aspekton", +DlgImgAlertUrl : "Bonvolu tajpi la URL de la bildo", +DlgImgLinkTab : "Link", //MISSING + +// Flash Dialog +DlgFlashTitle : "Flash Properties", //MISSING +DlgFlashChkPlay : "Auto Play", //MISSING +DlgFlashChkLoop : "Loop", //MISSING +DlgFlashChkMenu : "Enable Flash Menu", //MISSING +DlgFlashScale : "Scale", //MISSING +DlgFlashScaleAll : "Show all", //MISSING +DlgFlashScaleNoBorder : "No Border", //MISSING +DlgFlashScaleFit : "Exact Fit", //MISSING + +// Link Dialog +DlgLnkWindowTitle : "Ligilo", +DlgLnkInfoTab : "Informoj pri la Ligilo", +DlgLnkTargetTab : "Celo", + +DlgLnkType : "Tipo de Ligilo", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Ankri en tiu ĉi paÄo", +DlgLnkTypeEMail : "RetpoÅto", +DlgLnkProto : "Protokolo", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Elekti Ankron", +DlgLnkAnchorByName : "Per Ankronomo", +DlgLnkAnchorById : "Per Elementidentigilo", +DlgLnkNoAnchors : "", +DlgLnkEMail : "Retadreso", +DlgLnkEMailSubject : "Temlinio", +DlgLnkEMailBody : "MesaÄa korpo", +DlgLnkUpload : "AlÅuti", +DlgLnkBtnUpload : "Sendi al Servilo", + +DlgLnkTarget : "Celo", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "<Åprucfenestro>", +DlgLnkTargetBlank : "Nova Fenestro (_blank)", +DlgLnkTargetParent : "Gepatra Fenestro (_parent)", +DlgLnkTargetSelf : "Sama Fenestro (_self)", +DlgLnkTargetTop : "Plej Supra Fenestro (_top)", +DlgLnkTargetFrameName : "Nomo de Kadro", +DlgLnkPopWinName : "Nomo de Åœprucfenestro", +DlgLnkPopWinFeat : "Atributoj de la Åœprucfenestro", +DlgLnkPopResize : "Grando ÅœanÄebla", +DlgLnkPopLocation : "Adresobreto", +DlgLnkPopMenu : "Menubreto", +DlgLnkPopScroll : "Rulumlisteloj", +DlgLnkPopStatus : "Statobreto", +DlgLnkPopToolbar : "Ilobreto", +DlgLnkPopFullScrn : "Tutekrane (IE)", +DlgLnkPopDependent : "Dependa (Netscape)", +DlgLnkPopWidth : "LarÄo", +DlgLnkPopHeight : "Alto", +DlgLnkPopLeft : "Pozicio de Maldekstro", +DlgLnkPopTop : "Pozicio de Supro", + +DlnLnkMsgNoUrl : "Bonvolu entajpi la URL-on", +DlnLnkMsgNoEMail : "Bonvolu entajpi la retadreson", +DlnLnkMsgNoAnchor : "Bonvolu elekti ankron", +DlnLnkMsgInvPopName : "The popup name must begin with an alphabetic character and must not contain spaces", //MISSING + +// Color Dialog +DlgColorTitle : "Elekti", +DlgColorBtnClear : "Forigi", +DlgColorHighlight : "Emfazi", +DlgColorSelected : "Elektita", + +// Smiley Dialog +DlgSmileyTitle : "Enmeti Mienvinjeton", + +// Special Character Dialog +DlgSpecialCharTitle : "Enmeti Specialan Signon", + +// Table Dialog +DlgTableTitle : "Atributoj de Tabelo", +DlgTableRows : "Linioj", +DlgTableColumns : "Kolumnoj", +DlgTableBorder : "Bordero", +DlgTableAlign : "Äœisrandigo", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Maldekstre", +DlgTableAlignCenter : "Centre", +DlgTableAlignRight : "Dekstre", +DlgTableWidth : "LarÄo", +DlgTableWidthPx : "Bitbilderoj", +DlgTableWidthPc : "elcentoj", +DlgTableHeight : "Alto", +DlgTableCellSpace : "Interspacigo de Ĉeloj", +DlgTableCellPad : "ĈirkaÅ­enhava Plenigado", +DlgTableCaption : "Titolo", +DlgTableSummary : "Summary", //MISSING +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Atributoj de Celo", +DlgCellWidth : "LarÄo", +DlgCellWidthPx : "bitbilderoj", +DlgCellWidthPc : "elcentoj", +DlgCellHeight : "Alto", +DlgCellWordWrap : "Linifaldo", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Jes", +DlgCellWordWrapNo : "Ne", +DlgCellHorAlign : "Horizonta Äœisrandigo", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Maldekstre", +DlgCellHorAlignCenter : "Centre", +DlgCellHorAlignRight: "Dekstre", +DlgCellVerAlign : "Vertikala Äœisrandigo", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Supre", +DlgCellVerAlignMiddle : "Centre", +DlgCellVerAlignBottom : "Malsupre", +DlgCellVerAlignBaseline : "Je Malsupro de Teksto", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Linioj Kunfanditaj", +DlgCellCollSpan : "Kolumnoj Kunfanditaj", +DlgCellBackColor : "Fono", +DlgCellBorderColor : "Bordero", +DlgCellBtnSelect : "Elekti...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", //MISSING + +// Find Dialog +DlgFindTitle : "Serĉi", +DlgFindFindBtn : "Serĉi", +DlgFindNotFoundMsg : "La celteksto ne estas trovita.", + +// Replace Dialog +DlgReplaceTitle : "AnstataÅ­igi", +DlgReplaceFindLbl : "Serĉi:", +DlgReplaceReplaceLbl : "AnstataÅ­igi per:", +DlgReplaceCaseChk : "Kongruigi Usklecon", +DlgReplaceReplaceBtn : "AnstataÅ­igi", +DlgReplaceReplAllBtn : "AnstataÅ­igi Ĉiun", +DlgReplaceWordChk : "Tuta Vorto", + +// Paste Operations / Dialog +PasteErrorCut : "La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras eltondajn operaciojn. Bonvolu uzi la klavaron por tio (ctrl-X).", +PasteErrorCopy : "La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras kopiajn operaciojn. Bonvolu uzi la klavaron por tio (ctrl-C).", + +PasteAsText : "Interglui kiel Tekston", +PasteFromWord : "Interglui el Word", + +DlgPasteMsg2 : "Please paste inside the following box using the keyboard (Ctrl+V) and hit OK.", //MISSING +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", //MISSING +DlgPasteIgnoreFont : "Ignore Font Face definitions", //MISSING +DlgPasteRemoveStyles : "Remove Styles definitions", //MISSING + +// Color Picker +ColorAutomatic : "AÅ­tomata", +ColorMoreColors : "Pli da Koloroj...", + +// Document Properties +DocProps : "Dokumentaj Atributoj", + +// Anchor Dialog +DlgAnchorTitle : "Ankraj Atributoj", +DlgAnchorName : "Ankra Nomo", +DlgAnchorErrorName : "Bv tajpi la ankran nomon", + +// Speller Pages Dialog +DlgSpellNotInDic : "Ne trovita en la vortaro", +DlgSpellChangeTo : "ÅœanÄi al", +DlgSpellBtnIgnore : "Malatenti", +DlgSpellBtnIgnoreAll : "Malatenti Ĉiun", +DlgSpellBtnReplace : "AnstataÅ­igi", +DlgSpellBtnReplaceAll : "AnstataÅ­igi Ĉiun", +DlgSpellBtnUndo : "Malfari", +DlgSpellNoSuggestions : "- Neniu propono -", +DlgSpellProgress : "Literumkontrolado daÅ­ras...", +DlgSpellNoMispell : "Literumkontrolado finita: neniu fuÅo trovita", +DlgSpellNoChanges : "Literumkontrolado finita: neniu vorto ÅanÄita", +DlgSpellOneChange : "Literumkontrolado finita: unu vorto ÅanÄita", +DlgSpellManyChanges : "Literumkontrolado finita: %1 vortoj ÅanÄitaj", + +IeSpellDownload : "Literumada Kontrolilo ne instalita. Ĉu vi volas elÅuti Äin nun?", + +// Button Dialog +DlgButtonText : "Teksto (Valoro)", +DlgButtonType : "Tipo", +DlgButtonTypeBtn : "Button", //MISSING +DlgButtonTypeSbm : "Submit", //MISSING +DlgButtonTypeRst : "Reset", //MISSING + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Nomo", +DlgCheckboxValue : "Valoro", +DlgCheckboxSelected : "Elektita", + +// Form Dialog +DlgFormName : "Nomo", +DlgFormAction : "Ago", +DlgFormMethod : "Metodo", + +// Select Field Dialog +DlgSelectName : "Nomo", +DlgSelectValue : "Valoro", +DlgSelectSize : "Grando", +DlgSelectLines : "Linioj", +DlgSelectChkMulti : "Permesi Plurajn Elektojn", +DlgSelectOpAvail : "Elektoj Disponeblaj", +DlgSelectOpText : "Teksto", +DlgSelectOpValue : "Valoro", +DlgSelectBtnAdd : "Aldoni", +DlgSelectBtnModify : "Modifi", +DlgSelectBtnUp : "Supren", +DlgSelectBtnDown : "Malsupren", +DlgSelectBtnSetValue : "Agordi kiel Elektitan Valoron", +DlgSelectBtnDelete : "Forigi", + +// Textarea Dialog +DlgTextareaName : "Nomo", +DlgTextareaCols : "Kolumnoj", +DlgTextareaRows : "Vicoj", + +// Text Field Dialog +DlgTextName : "Nomo", +DlgTextValue : "Valoro", +DlgTextCharWidth : "SignolarÄo", +DlgTextMaxChars : "Maksimuma Nombro da Signoj", +DlgTextType : "Tipo", +DlgTextTypeText : "Teksto", +DlgTextTypePass : "Pasvorto", + +// Hidden Field Dialog +DlgHiddenName : "Nomo", +DlgHiddenValue : "Valoro", + +// Bulleted List Dialog +BulletedListProp : "Atributoj de Bula Listo", +NumberedListProp : "Atributoj de Numera Listo", +DlgLstStart : "Start", //MISSING +DlgLstType : "Tipo", +DlgLstTypeCircle : "Cirklo", +DlgLstTypeDisc : "Disc", //MISSING +DlgLstTypeSquare : "Kvadrato", +DlgLstTypeNumbers : "Ciferoj (1, 2, 3)", +DlgLstTypeLCase : "Minusklaj Literoj (a, b, c)", +DlgLstTypeUCase : "Majusklaj Literoj (A, B, C)", +DlgLstTypeSRoman : "Malgrandaj Romanaj Ciferoj (i, ii, iii)", +DlgLstTypeLRoman : "Grandaj Romanaj Ciferoj (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Äœeneralaĵoj", +DlgDocBackTab : "Fono", +DlgDocColorsTab : "Koloroj kaj MarÄenoj", +DlgDocMetaTab : "Metadatumoj", + +DlgDocPageTitle : "PaÄotitolo", +DlgDocLangDir : "Skribdirekto de la Lingvo", +DlgDocLangDirLTR : "De maldekstro dekstren (LTR)", +DlgDocLangDirRTL : "De dekstro maldekstren (LTR)", +DlgDocLangCode : "Lingvokodo", +DlgDocCharSet : "Signara Kodo", +DlgDocCharSetCE : "Central European", //MISSING +DlgDocCharSetCT : "Chinese Traditional (Big5)", //MISSING +DlgDocCharSetCR : "Cyrillic", //MISSING +DlgDocCharSetGR : "Greek", //MISSING +DlgDocCharSetJP : "Japanese", //MISSING +DlgDocCharSetKR : "Korean", //MISSING +DlgDocCharSetTR : "Turkish", //MISSING +DlgDocCharSetUN : "Unicode (UTF-8)", //MISSING +DlgDocCharSetWE : "Western European", //MISSING +DlgDocCharSetOther : "Alia Signara Kodo", + +DlgDocDocType : "Dokumenta Tipo", +DlgDocDocTypeOther : "Alia Dokumenta Tipo", +DlgDocIncXHTML : "Inkluzivi XHTML Deklaroj", +DlgDocBgColor : "Fona Koloro", +DlgDocBgImage : "URL de Fona Bildo", +DlgDocBgNoScroll : "Neruluma Fono", +DlgDocCText : "Teksto", +DlgDocCLink : "Ligilo", +DlgDocCVisited : "Vizitita Ligilo", +DlgDocCActive : "Aktiva Ligilo", +DlgDocMargins : "PaÄaj MarÄenoj", +DlgDocMaTop : "Supra", +DlgDocMaLeft : "Maldekstra", +DlgDocMaRight : "Dekstra", +DlgDocMaBottom : "Malsupra", +DlgDocMeIndex : "Åœlosilvortoj de la Dokumento (apartigita de komoj)", +DlgDocMeDescr : "Dokumenta Priskribo", +DlgDocMeAuthor : "Verkinto", +DlgDocMeCopy : "Kopirajto", +DlgDocPreview : "Aspekto", + +// Templates Dialog +Templates : "Templates", //MISSING +DlgTemplatesTitle : "Content Templates", //MISSING +DlgTemplatesSelMsg : "Please select the template to open in the editor
    (the actual contents will be lost):", //MISSING +DlgTemplatesLoading : "Loading templates list. Please wait...", //MISSING +DlgTemplatesNoTpl : "(No templates defined)", //MISSING +DlgTemplatesReplace : "Replace actual contents", //MISSING + +// About Dialog +DlgAboutAboutTab : "Pri", +DlgAboutBrowserInfoTab : "Informoj pri TTT-legilo", +DlgAboutLicenseTab : "License", //MISSING +DlgAboutVersion : "versio", +DlgAboutInfo : "Por pli da informoj, vizitu", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/es.js b/webdir/fckeditor/editor/lang/es.js new file mode 100644 index 0000000..4b2043d --- /dev/null +++ b/webdir/fckeditor/editor/lang/es.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Spanish language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Contraer Barra", +ToolbarExpand : "Expandir Barra", + +// Toolbar Items and Context Menu +Save : "Guardar", +NewPage : "Nueva Página", +Preview : "Vista Previa", +Cut : "Cortar", +Copy : "Copiar", +Paste : "Pegar", +PasteText : "Pegar como texto plano", +PasteWord : "Pegar desde Word", +Print : "Imprimir", +SelectAll : "Seleccionar Todo", +RemoveFormat : "Eliminar Formato", +InsertLinkLbl : "Vínculo", +InsertLink : "Insertar/Editar Vínculo", +RemoveLink : "Eliminar Vínculo", +VisitLink : "Abrir enlace", +Anchor : "Referencia", +AnchorDelete : "Eliminar Referencia", +InsertImageLbl : "Imagen", +InsertImage : "Insertar/Editar Imagen", +InsertFlashLbl : "Flash", +InsertFlash : "Insertar/Editar Flash", +InsertTableLbl : "Tabla", +InsertTable : "Insertar/Editar Tabla", +InsertLineLbl : "Línea", +InsertLine : "Insertar Línea Horizontal", +InsertSpecialCharLbl: "Caracter Especial", +InsertSpecialChar : "Insertar Caracter Especial", +InsertSmileyLbl : "Emoticons", +InsertSmiley : "Insertar Emoticons", +About : "Acerca de FCKeditor", +Bold : "Negrita", +Italic : "Cursiva", +Underline : "Subrayado", +StrikeThrough : "Tachado", +Subscript : "Subíndice", +Superscript : "Superíndice", +LeftJustify : "Alinear a Izquierda", +CenterJustify : "Centrar", +RightJustify : "Alinear a Derecha", +BlockJustify : "Justificado", +DecreaseIndent : "Disminuir Sangría", +IncreaseIndent : "Aumentar Sangría", +Blockquote : "Cita", +CreateDiv : "Crear contenedor (div)", +EditDiv : "Editar contenedor (div)", +DeleteDiv : "Eliminar contenedor (div)", +Undo : "Deshacer", +Redo : "Rehacer", +NumberedListLbl : "Numeración", +NumberedList : "Insertar/Eliminar Numeración", +BulletedListLbl : "Viñetas", +BulletedList : "Insertar/Eliminar Viñetas", +ShowTableBorders : "Mostrar Bordes de Tablas", +ShowDetails : "Mostrar saltos de Párrafo", +Style : "Estilo", +FontFormat : "Formato", +Font : "Fuente", +FontSize : "Tamaño", +TextColor : "Color de Texto", +BGColor : "Color de Fondo", +Source : "Fuente HTML", +Find : "Buscar", +Replace : "Reemplazar", +SpellCheck : "Ortografía", +UniversalKeyboard : "Teclado Universal", +PageBreakLbl : "Salto de Página", +PageBreak : "Insertar Salto de Página", + +Form : "Formulario", +Checkbox : "Casilla de Verificación", +RadioButton : "Botones de Radio", +TextField : "Campo de Texto", +Textarea : "Area de Texto", +HiddenField : "Campo Oculto", +Button : "Botón", +SelectionField : "Campo de Selección", +ImageButton : "Botón Imagen", + +FitWindow : "Maximizar el tamaño del editor", +ShowBlocks : "Mostrar bloques", + +// Context Menu +EditLink : "Editar Vínculo", +CellCM : "Celda", +RowCM : "Fila", +ColumnCM : "Columna", +InsertRowAfter : "Insertar fila en la parte inferior", +InsertRowBefore : "Insertar fila en la parte superior", +DeleteRows : "Eliminar Filas", +InsertColumnAfter : "Insertar columna a la derecha", +InsertColumnBefore : "Insertar columna a la izquierda", +DeleteColumns : "Eliminar Columnas", +InsertCellAfter : "Insertar celda a la derecha", +InsertCellBefore : "Insertar celda a la izquierda", +DeleteCells : "Eliminar Celdas", +MergeCells : "Combinar Celdas", +MergeRight : "Combinar a la derecha", +MergeDown : "Combinar hacia abajo", +HorizontalSplitCell : "Dividir la celda horizontalmente", +VerticalSplitCell : "Dividir la celda verticalmente", +TableDelete : "Eliminar Tabla", +CellProperties : "Propiedades de Celda", +TableProperties : "Propiedades de Tabla", +ImageProperties : "Propiedades de Imagen", +FlashProperties : "Propiedades de Flash", + +AnchorProp : "Propiedades de Referencia", +ButtonProp : "Propiedades de Botón", +CheckboxProp : "Propiedades de Casilla", +HiddenFieldProp : "Propiedades de Campo Oculto", +RadioButtonProp : "Propiedades de Botón de Radio", +ImageButtonProp : "Propiedades de Botón de Imagen", +TextFieldProp : "Propiedades de Campo de Texto", +SelectionFieldProp : "Propiedades de Campo de Selección", +TextareaProp : "Propiedades de Area de Texto", +FormProp : "Propiedades de Formulario", + +FontFormats : "Normal;Con formato;Dirección;Encabezado 1;Encabezado 2;Encabezado 3;Encabezado 4;Encabezado 5;Encabezado 6;Normal (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Procesando XHTML. Por favor, espere...", +Done : "Hecho", +PasteWordConfirm : "El texto que desea parece provenir de Word. Desea depurarlo antes de pegarlo?", +NotCompatiblePaste : "Este comando está disponible sólo para Internet Explorer version 5.5 or superior. Desea pegar sin depurar?", +UnknownToolbarItem : "Item de barra desconocido \"%1\"", +UnknownCommand : "Nombre de comando desconocido \"%1\"", +NotImplemented : "Comando no implementado", +UnknownToolbarSet : "Nombre de barra \"%1\" no definido", +NoActiveX : "La configuración de las opciones de seguridad de su navegador puede estar limitando algunas características del editor. Por favor active la opción \"Ejecutar controles y complementos de ActiveX \", de lo contrario puede experimentar errores o ausencia de funcionalidades.", +BrowseServerBlocked : "La ventana de visualización del servidor no pudo ser abierta. Verifique que su navegador no esté bloqueando las ventanas emergentes (pop up).", +DialogBlocked : "No se ha podido abrir la ventana de diálogo. Verifique que su navegador no esté bloqueando las ventanas emergentes (pop up).", +VisitLinkBlocked : "Nose ha podido abrir la ventana. Asegurese de que todos los bloqueadores de popups están deshabilitados.", + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Cancelar", +DlgBtnClose : "Cerrar", +DlgBtnBrowseServer : "Ver Servidor", +DlgAdvancedTag : "Avanzado", +DlgOpOther : "", +DlgInfoTab : "Información", +DlgAlertUrl : "Inserte el URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Orientación", +DlgGenLangDirLtr : "Izquierda a Derecha (LTR)", +DlgGenLangDirRtl : "Derecha a Izquierda (RTL)", +DlgGenLangCode : "Cód. de idioma", +DlgGenAccessKey : "Clave de Acceso", +DlgGenName : "Nombre", +DlgGenTabIndex : "Indice de tabulación", +DlgGenLongDescr : "Descripción larga URL", +DlgGenClass : "Clases de hojas de estilo", +DlgGenTitle : "Título", +DlgGenContType : "Tipo de Contenido", +DlgGenLinkCharset : "Fuente de caracteres vinculado", +DlgGenStyle : "Estilo", + +// Image Dialog +DlgImgTitle : "Propiedades de Imagen", +DlgImgInfoTab : "Información de Imagen", +DlgImgBtnUpload : "Enviar al Servidor", +DlgImgURL : "URL", +DlgImgUpload : "Cargar", +DlgImgAlt : "Texto Alternativo", +DlgImgWidth : "Anchura", +DlgImgHeight : "Altura", +DlgImgLockRatio : "Proporcional", +DlgBtnResetSize : "Tamaño Original", +DlgImgBorder : "Borde", +DlgImgHSpace : "Esp.Horiz", +DlgImgVSpace : "Esp.Vert", +DlgImgAlign : "Alineación", +DlgImgAlignLeft : "Izquierda", +DlgImgAlignAbsBottom: "Abs inferior", +DlgImgAlignAbsMiddle: "Abs centro", +DlgImgAlignBaseline : "Línea de base", +DlgImgAlignBottom : "Pie", +DlgImgAlignMiddle : "Centro", +DlgImgAlignRight : "Derecha", +DlgImgAlignTextTop : "Tope del texto", +DlgImgAlignTop : "Tope", +DlgImgPreview : "Vista Previa", +DlgImgAlertUrl : "Por favor escriba la URL de la imagen", +DlgImgLinkTab : "Vínculo", + +// Flash Dialog +DlgFlashTitle : "Propiedades de Flash", +DlgFlashChkPlay : "Autoejecución", +DlgFlashChkLoop : "Repetir", +DlgFlashChkMenu : "Activar Menú Flash", +DlgFlashScale : "Escala", +DlgFlashScaleAll : "Mostrar todo", +DlgFlashScaleNoBorder : "Sin Borde", +DlgFlashScaleFit : "Ajustado", + +// Link Dialog +DlgLnkWindowTitle : "Vínculo", +DlgLnkInfoTab : "Información de Vínculo", +DlgLnkTargetTab : "Destino", + +DlgLnkType : "Tipo de vínculo", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Referencia en esta página", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protocolo", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Seleccionar una referencia", +DlgLnkAnchorByName : "Por Nombre de Referencia", +DlgLnkAnchorById : "Por ID de elemento", +DlgLnkNoAnchors : "(No hay referencias disponibles en el documento)", +DlgLnkEMail : "Dirección de E-Mail", +DlgLnkEMailSubject : "Título del Mensaje", +DlgLnkEMailBody : "Cuerpo del Mensaje", +DlgLnkUpload : "Cargar", +DlgLnkBtnUpload : "Enviar al Servidor", + +DlgLnkTarget : "Destino", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Nueva Ventana(_blank)", +DlgLnkTargetParent : "Ventana Padre (_parent)", +DlgLnkTargetSelf : "Misma Ventana (_self)", +DlgLnkTargetTop : "Ventana primaria (_top)", +DlgLnkTargetFrameName : "Nombre del Marco Destino", +DlgLnkPopWinName : "Nombre de Ventana Emergente", +DlgLnkPopWinFeat : "Características de Ventana Emergente", +DlgLnkPopResize : "Ajustable", +DlgLnkPopLocation : "Barra de ubicación", +DlgLnkPopMenu : "Barra de Menú", +DlgLnkPopScroll : "Barras de desplazamiento", +DlgLnkPopStatus : "Barra de Estado", +DlgLnkPopToolbar : "Barra de Herramientas", +DlgLnkPopFullScrn : "Pantalla Completa (IE)", +DlgLnkPopDependent : "Dependiente (Netscape)", +DlgLnkPopWidth : "Anchura", +DlgLnkPopHeight : "Altura", +DlgLnkPopLeft : "Posición Izquierda", +DlgLnkPopTop : "Posición Derecha", + +DlnLnkMsgNoUrl : "Por favor tipee el vínculo URL", +DlnLnkMsgNoEMail : "Por favor tipee la dirección de e-mail", +DlnLnkMsgNoAnchor : "Por favor seleccione una referencia", +DlnLnkMsgInvPopName : "El nombre debe empezar con un caracter alfanumérico y no debe contener espacios", + +// Color Dialog +DlgColorTitle : "Seleccionar Color", +DlgColorBtnClear : "Ninguno", +DlgColorHighlight : "Resaltado", +DlgColorSelected : "Seleccionado", + +// Smiley Dialog +DlgSmileyTitle : "Insertar un Emoticon", + +// Special Character Dialog +DlgSpecialCharTitle : "Seleccione un caracter especial", + +// Table Dialog +DlgTableTitle : "Propiedades de Tabla", +DlgTableRows : "Filas", +DlgTableColumns : "Columnas", +DlgTableBorder : "Tamaño de Borde", +DlgTableAlign : "Alineación", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Izquierda", +DlgTableAlignCenter : "Centrado", +DlgTableAlignRight : "Derecha", +DlgTableWidth : "Anchura", +DlgTableWidthPx : "pixeles", +DlgTableWidthPc : "porcentaje", +DlgTableHeight : "Altura", +DlgTableCellSpace : "Esp. e/celdas", +DlgTableCellPad : "Esp. interior", +DlgTableCaption : "Título", +DlgTableSummary : "Síntesis", +DlgTableHeaders : "Encabezados", +DlgTableHeadersNone : "Ninguno", +DlgTableHeadersColumn : "Primera columna", +DlgTableHeadersRow : "Primera fila", +DlgTableHeadersBoth : "Ambas", + +// Table Cell Dialog +DlgCellTitle : "Propiedades de Celda", +DlgCellWidth : "Anchura", +DlgCellWidthPx : "pixeles", +DlgCellWidthPc : "porcentaje", +DlgCellHeight : "Altura", +DlgCellWordWrap : "Cortar Línea", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Si", +DlgCellWordWrapNo : "No", +DlgCellHorAlign : "Alineación Horizontal", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Izquierda", +DlgCellHorAlignCenter : "Centrado", +DlgCellHorAlignRight: "Derecha", +DlgCellVerAlign : "Alineación Vertical", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Tope", +DlgCellVerAlignMiddle : "Medio", +DlgCellVerAlignBottom : "ie", +DlgCellVerAlignBaseline : "Línea de Base", +DlgCellType : "Tipo de celda", +DlgCellTypeData : "Datos", +DlgCellTypeHeader : "Encabezado", +DlgCellRowSpan : "Abarcar Filas", +DlgCellCollSpan : "Abarcar Columnas", +DlgCellBackColor : "Color de Fondo", +DlgCellBorderColor : "Color de Borde", +DlgCellBtnSelect : "Seleccione...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Buscar y Reemplazar", + +// Find Dialog +DlgFindTitle : "Buscar", +DlgFindFindBtn : "Buscar", +DlgFindNotFoundMsg : "El texto especificado no ha sido encontrado.", + +// Replace Dialog +DlgReplaceTitle : "Reemplazar", +DlgReplaceFindLbl : "Texto a buscar:", +DlgReplaceReplaceLbl : "Reemplazar con:", +DlgReplaceCaseChk : "Coincidir may/min", +DlgReplaceReplaceBtn : "Reemplazar", +DlgReplaceReplAllBtn : "Reemplazar Todo", +DlgReplaceWordChk : "Coincidir toda la palabra", + +// Paste Operations / Dialog +PasteErrorCut : "La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de cortado. Por favor use el teclado (Ctrl+X).", +PasteErrorCopy : "La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de copiado. Por favor use el teclado (Ctrl+C).", + +PasteAsText : "Pegar como Texto Plano", +PasteFromWord : "Pegar desde Word", + +DlgPasteMsg2 : "Por favor pegue dentro del cuadro utilizando el teclado (Ctrl+V); luego presione OK.", +DlgPasteSec : "Debido a la configuración de seguridad de su navegador, el editor no tiene acceso al portapapeles. Es necesario que lo pegue de nuevo en esta ventana.", +DlgPasteIgnoreFont : "Ignorar definiciones de fuentes", +DlgPasteRemoveStyles : "Remover definiciones de estilo", + +// Color Picker +ColorAutomatic : "Automático", +ColorMoreColors : "Más Colores...", + +// Document Properties +DocProps : "Propiedades del Documento", + +// Anchor Dialog +DlgAnchorTitle : "Propiedades de la Referencia", +DlgAnchorName : "Nombre de la Referencia", +DlgAnchorErrorName : "Por favor, complete el nombre de la Referencia", + +// Speller Pages Dialog +DlgSpellNotInDic : "No se encuentra en el Diccionario", +DlgSpellChangeTo : "Cambiar a", +DlgSpellBtnIgnore : "Ignorar", +DlgSpellBtnIgnoreAll : "Ignorar Todo", +DlgSpellBtnReplace : "Reemplazar", +DlgSpellBtnReplaceAll : "Reemplazar Todo", +DlgSpellBtnUndo : "Deshacer", +DlgSpellNoSuggestions : "- No hay sugerencias -", +DlgSpellProgress : "Control de Ortografía en progreso...", +DlgSpellNoMispell : "Control finalizado: no se encontraron errores", +DlgSpellNoChanges : "Control finalizado: no se ha cambiado ninguna palabra", +DlgSpellOneChange : "Control finalizado: se ha cambiado una palabra", +DlgSpellManyChanges : "Control finalizado: se ha cambiado %1 palabras", + +IeSpellDownload : "Módulo de Control de Ortografía no instalado. ¿Desea descargarlo ahora?", + +// Button Dialog +DlgButtonText : "Texto (Valor)", +DlgButtonType : "Tipo", +DlgButtonTypeBtn : "Boton", +DlgButtonTypeSbm : "Enviar", +DlgButtonTypeRst : "Reestablecer", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Nombre", +DlgCheckboxValue : "Valor", +DlgCheckboxSelected : "Seleccionado", + +// Form Dialog +DlgFormName : "Nombre", +DlgFormAction : "Acción", +DlgFormMethod : "Método", + +// Select Field Dialog +DlgSelectName : "Nombre", +DlgSelectValue : "Valor", +DlgSelectSize : "Tamaño", +DlgSelectLines : "Lineas", +DlgSelectChkMulti : "Permitir múltiple selección", +DlgSelectOpAvail : "Opciones disponibles", +DlgSelectOpText : "Texto", +DlgSelectOpValue : "Valor", +DlgSelectBtnAdd : "Agregar", +DlgSelectBtnModify : "Modificar", +DlgSelectBtnUp : "Subir", +DlgSelectBtnDown : "Bajar", +DlgSelectBtnSetValue : "Establecer como predeterminado", +DlgSelectBtnDelete : "Eliminar", + +// Textarea Dialog +DlgTextareaName : "Nombre", +DlgTextareaCols : "Columnas", +DlgTextareaRows : "Filas", + +// Text Field Dialog +DlgTextName : "Nombre", +DlgTextValue : "Valor", +DlgTextCharWidth : "Caracteres de ancho", +DlgTextMaxChars : "Máximo caracteres", +DlgTextType : "Tipo", +DlgTextTypeText : "Texto", +DlgTextTypePass : "Contraseña", + +// Hidden Field Dialog +DlgHiddenName : "Nombre", +DlgHiddenValue : "Valor", + +// Bulleted List Dialog +BulletedListProp : "Propiedades de Viñetas", +NumberedListProp : "Propiedades de Numeraciones", +DlgLstStart : "Inicio", +DlgLstType : "Tipo", +DlgLstTypeCircle : "Círculo", +DlgLstTypeDisc : "Disco", +DlgLstTypeSquare : "Cuadrado", +DlgLstTypeNumbers : "Números (1, 2, 3)", +DlgLstTypeLCase : "letras en minúsculas (a, b, c)", +DlgLstTypeUCase : "letras en mayúsculas (A, B, C)", +DlgLstTypeSRoman : "Números Romanos (i, ii, iii)", +DlgLstTypeLRoman : "Números Romanos (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "General", +DlgDocBackTab : "Fondo", +DlgDocColorsTab : "Colores y Márgenes", +DlgDocMetaTab : "Meta Información", + +DlgDocPageTitle : "Título de Página", +DlgDocLangDir : "Orientación de idioma", +DlgDocLangDirLTR : "Izq. a Derecha (LTR)", +DlgDocLangDirRTL : "Der. a Izquierda (RTL)", +DlgDocLangCode : "Código de Idioma", +DlgDocCharSet : "Codif. de Conjunto de Caracteres", +DlgDocCharSetCE : "Centro Europeo", +DlgDocCharSetCT : "Chino Tradicional (Big5)", +DlgDocCharSetCR : "Cirílico", +DlgDocCharSetGR : "Griego", +DlgDocCharSetJP : "Japonés", +DlgDocCharSetKR : "Coreano", +DlgDocCharSetTR : "Turco", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Europeo occidental", +DlgDocCharSetOther : "Otra Codificación", + +DlgDocDocType : "Encabezado de Tipo de Documento", +DlgDocDocTypeOther : "Otro Encabezado", +DlgDocIncXHTML : "Incluir Declaraciones XHTML", +DlgDocBgColor : "Color de Fondo", +DlgDocBgImage : "URL de Imagen de Fondo", +DlgDocBgNoScroll : "Fondo sin rolido", +DlgDocCText : "Texto", +DlgDocCLink : "Vínculo", +DlgDocCVisited : "Vínculo Visitado", +DlgDocCActive : "Vínculo Activo", +DlgDocMargins : "Márgenes de Página", +DlgDocMaTop : "Tope", +DlgDocMaLeft : "Izquierda", +DlgDocMaRight : "Derecha", +DlgDocMaBottom : "Pie", +DlgDocMeIndex : "Claves de indexación del Documento (separados por comas)", +DlgDocMeDescr : "Descripción del Documento", +DlgDocMeAuthor : "Autor", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Vista Previa", + +// Templates Dialog +Templates : "Plantillas", +DlgTemplatesTitle : "Contenido de Plantillas", +DlgTemplatesSelMsg : "Por favor selecciona la plantilla a abrir en el editor
    (el contenido actual se perderá):", +DlgTemplatesLoading : "Cargando lista de Plantillas. Por favor, aguarde...", +DlgTemplatesNoTpl : "(No hay plantillas definidas)", +DlgTemplatesReplace : "Reemplazar el contenido actual", + +// About Dialog +DlgAboutAboutTab : "Acerca de", +DlgAboutBrowserInfoTab : "Información de Navegador", +DlgAboutLicenseTab : "Licencia", +DlgAboutVersion : "versión", +DlgAboutInfo : "Para mayor información por favor dirigirse a", + +// Div Dialog +DlgDivGeneralTab : "General", +DlgDivAdvancedTab : "Avanzado", +DlgDivStyle : "Estilo", +DlgDivInlineStyle : "Estilos CSS" +}; diff --git a/webdir/fckeditor/editor/lang/et.js b/webdir/fckeditor/editor/lang/et.js new file mode 100644 index 0000000..290957a --- /dev/null +++ b/webdir/fckeditor/editor/lang/et.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Estonian language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Voldi tööriistariba", +ToolbarExpand : "Laienda tööriistariba", + +// Toolbar Items and Context Menu +Save : "Salvesta", +NewPage : "Uus leht", +Preview : "Eelvaade", +Cut : "Lõika", +Copy : "Kopeeri", +Paste : "Kleebi", +PasteText : "Kleebi tavalise tekstina", +PasteWord : "Kleebi Wordist", +Print : "Prindi", +SelectAll : "Vali kõik", +RemoveFormat : "Eemalda vorming", +InsertLinkLbl : "Link", +InsertLink : "Sisesta link / Muuda linki", +RemoveLink : "Eemalda link", +VisitLink : "Open Link", //MISSING +Anchor : "Sisesta ankur / Muuda ankrut", +AnchorDelete : "Eemalda ankur", +InsertImageLbl : "Pilt", +InsertImage : "Sisesta pilt / Muuda pilti", +InsertFlashLbl : "Flash", +InsertFlash : "Sisesta flash / Muuda flashi", +InsertTableLbl : "Tabel", +InsertTable : "Sisesta tabel / Muuda tabelit", +InsertLineLbl : "Joon", +InsertLine : "Sisesta horisontaaljoon", +InsertSpecialCharLbl: "Erimärgid", +InsertSpecialChar : "Sisesta erimärk", +InsertSmileyLbl : "Emotikon", +InsertSmiley : "Sisesta emotikon", +About : "FCKeditor teave", +Bold : "Paks", +Italic : "Kursiiv", +Underline : "Allajoonitud", +StrikeThrough : "Läbijoonitud", +Subscript : "Allindeks", +Superscript : "Ülaindeks", +LeftJustify : "Vasakjoondus", +CenterJustify : "Keskjoondus", +RightJustify : "Paremjoondus", +BlockJustify : "Rööpjoondus", +DecreaseIndent : "Vähenda taanet", +IncreaseIndent : "Suurenda taanet", +Blockquote : "Blokktsitaat", +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "Võta tagasi", +Redo : "Korda toimingut", +NumberedListLbl : "Nummerdatud loetelu", +NumberedList : "Sisesta/Eemalda nummerdatud loetelu", +BulletedListLbl : "Punktiseeritud loetelu", +BulletedList : "Sisesta/Eemalda punktiseeritud loetelu", +ShowTableBorders : "Näita tabeli jooni", +ShowDetails : "Näita üksikasju", +Style : "Laad", +FontFormat : "Vorming", +Font : "Kiri", +FontSize : "Suurus", +TextColor : "Teksti värv", +BGColor : "Tausta värv", +Source : "Lähtekood", +Find : "Otsi", +Replace : "Asenda", +SpellCheck : "Kontrolli õigekirja", +UniversalKeyboard : "Universaalne klaviatuur", +PageBreakLbl : "Lehepiir", +PageBreak : "Sisesta lehevahetuskoht", + +Form : "Vorm", +Checkbox : "Märkeruut", +RadioButton : "Raadionupp", +TextField : "Tekstilahter", +Textarea : "Tekstiala", +HiddenField : "Varjatud lahter", +Button : "Nupp", +SelectionField : "Valiklahter", +ImageButton : "Piltnupp", + +FitWindow : "Maksimeeri redaktori mõõtmed", +ShowBlocks : "Näita blokke", + +// Context Menu +EditLink : "Muuda linki", +CellCM : "Lahter", +RowCM : "Rida", +ColumnCM : "Veerg", +InsertRowAfter : "Sisesta rida peale", +InsertRowBefore : "Sisesta rida enne", +DeleteRows : "Eemalda read", +InsertColumnAfter : "Sisesta veerg peale", +InsertColumnBefore : "Sisesta veerg enne", +DeleteColumns : "Eemalda veerud", +InsertCellAfter : "Sisesta lahter peale", +InsertCellBefore : "Sisesta lahter enne", +DeleteCells : "Eemalda lahtrid", +MergeCells : "Ühenda lahtrid", +MergeRight : "Ühenda paremale", +MergeDown : "Ühenda alla", +HorizontalSplitCell : "Poolita lahter horisontaalselt", +VerticalSplitCell : "Poolita lahter vertikaalselt", +TableDelete : "Kustuta tabel", +CellProperties : "Lahtri atribuudid", +TableProperties : "Tabeli atribuudid", +ImageProperties : "Pildi atribuudid", +FlashProperties : "Flash omadused", + +AnchorProp : "Ankru omadused", +ButtonProp : "Nupu omadused", +CheckboxProp : "Märkeruudu omadused", +HiddenFieldProp : "Varjatud lahtri omadused", +RadioButtonProp : "Raadionupu omadused", +ImageButtonProp : "Piltnupu omadused", +TextFieldProp : "Tekstilahtri omadused", +SelectionFieldProp : "Valiklahtri omadused", +TextareaProp : "Tekstiala omadused", +FormProp : "Vormi omadused", + +FontFormats : "Tavaline;Vormindatud;Aadress;Pealkiri 1;Pealkiri 2;Pealkiri 3;Pealkiri 4;Pealkiri 5;Pealkiri 6;Tavaline (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Töötlen XHTML'i. Palun oota...", +Done : "Tehtud", +PasteWordConfirm : "Tekst, mida soovid lisada paistab pärinevat Word'ist. Kas soovid seda enne kleepimist puhastada?", +NotCompatiblePaste : "See käsk on saadaval ainult Internet Explorer versioon 5.5 või uuema puhul. Kas soovid kleepida ilma puhastamata?", +UnknownToolbarItem : "Tundmatu tööriistarea üksus \"%1\"", +UnknownCommand : "Tundmatu käsunimi \"%1\"", +NotImplemented : "Käsku ei täidetud", +UnknownToolbarSet : "Tööriistariba \"%1\" ei eksisteeri", +NoActiveX : "Sinu veebisirvija turvalisuse seaded võivad limiteerida mõningaid tekstirdaktori kasutusvõimalusi. Sa peaksid võimaldama valiku \"Run ActiveX controls and plug-ins\" oma veebisirvija seadetes. Muidu võid sa täheldada vigu tekstiredaktori töös ja märgata puuduvaid funktsioone.", +BrowseServerBlocked : "Ressursside sirvija avamine ebaõnnestus. Võimalda pop-up akende avanemine.", +DialogBlocked : "Ei olenud võimalik avada dialoogi akent. Võimalda pop-up akende avanemine.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Loobu", +DlgBtnClose : "Sulge", +DlgBtnBrowseServer : "Sirvi serverit", +DlgAdvancedTag : "Täpsemalt", +DlgOpOther : "", +DlgInfoTab : "Info", +DlgAlertUrl : "Palun sisesta URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Keele suund", +DlgGenLangDirLtr : "Vasakult paremale (LTR)", +DlgGenLangDirRtl : "Paremalt vasakule (RTL)", +DlgGenLangCode : "Keele kood", +DlgGenAccessKey : "Juurdepääsu võti", +DlgGenName : "Nimi", +DlgGenTabIndex : "Tab indeks", +DlgGenLongDescr : "Pikk kirjeldus URL", +DlgGenClass : "Stiilistiku klassid", +DlgGenTitle : "Juhendav tiitel", +DlgGenContType : "Juhendava sisu tüüp", +DlgGenLinkCharset : "Lingitud ressurssi märgistik", +DlgGenStyle : "Laad", + +// Image Dialog +DlgImgTitle : "Pildi atribuudid", +DlgImgInfoTab : "Pildi info", +DlgImgBtnUpload : "Saada serverissee", +DlgImgURL : "URL", +DlgImgUpload : "Lae üles", +DlgImgAlt : "Alternatiivne tekst", +DlgImgWidth : "Laius", +DlgImgHeight : "Kõrgus", +DlgImgLockRatio : "Lukusta kuvasuhe", +DlgBtnResetSize : "Lähtesta suurus", +DlgImgBorder : "Joon", +DlgImgHSpace : "H. vaheruum", +DlgImgVSpace : "V. vaheruum", +DlgImgAlign : "Joondus", +DlgImgAlignLeft : "Vasak", +DlgImgAlignAbsBottom: "Abs alla", +DlgImgAlignAbsMiddle: "Abs keskele", +DlgImgAlignBaseline : "Baasjoonele", +DlgImgAlignBottom : "Alla", +DlgImgAlignMiddle : "Keskele", +DlgImgAlignRight : "Paremale", +DlgImgAlignTextTop : "Tekstit üles", +DlgImgAlignTop : "Üles", +DlgImgPreview : "Eelvaade", +DlgImgAlertUrl : "Palun kirjuta pildi URL", +DlgImgLinkTab : "Link", + +// Flash Dialog +DlgFlashTitle : "Flash omadused", +DlgFlashChkPlay : "Automaatne start ", +DlgFlashChkLoop : "Korduv", +DlgFlashChkMenu : "Võimalda flash menüü", +DlgFlashScale : "Mastaap", +DlgFlashScaleAll : "Näita kõike", +DlgFlashScaleNoBorder : "Äärist ei ole", +DlgFlashScaleFit : "Täpne sobivus", + +// Link Dialog +DlgLnkWindowTitle : "Link", +DlgLnkInfoTab : "Lingi info", +DlgLnkTargetTab : "Sihtkoht", + +DlgLnkType : "Lingi tüüp", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Ankur sellel lehel", +DlgLnkTypeEMail : "E-post", +DlgLnkProto : "Protokoll", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Vali ankur", +DlgLnkAnchorByName : "Ankru nime järgi", +DlgLnkAnchorById : "Elemendi id järgi", +DlgLnkNoAnchors : "(Selles dokumendis ei ole ankruid)", +DlgLnkEMail : "E-posti aadress", +DlgLnkEMailSubject : "Sõnumi teema", +DlgLnkEMailBody : "Sõnumi tekst", +DlgLnkUpload : "Lae üles", +DlgLnkBtnUpload : "Saada serverisse", + +DlgLnkTarget : "Sihtkoht", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Uus aken (_blank)", +DlgLnkTargetParent : "Esivanem aken (_parent)", +DlgLnkTargetSelf : "Sama aken (_self)", +DlgLnkTargetTop : "Pealmine aken (_top)", +DlgLnkTargetFrameName : "Sihtmärk raami nimi", +DlgLnkPopWinName : "Hüpikakna nimi", +DlgLnkPopWinFeat : "Hüpikakna omadused", +DlgLnkPopResize : "Suurendatav", +DlgLnkPopLocation : "Aadressiriba", +DlgLnkPopMenu : "Menüüriba", +DlgLnkPopScroll : "Kerimisribad", +DlgLnkPopStatus : "Olekuriba", +DlgLnkPopToolbar : "Tööriistariba", +DlgLnkPopFullScrn : "Täisekraan (IE)", +DlgLnkPopDependent : "Sõltuv (Netscape)", +DlgLnkPopWidth : "Laius", +DlgLnkPopHeight : "Kõrgus", +DlgLnkPopLeft : "Vasak asukoht", +DlgLnkPopTop : "Ülemine asukoht", + +DlnLnkMsgNoUrl : "Palun kirjuta lingi URL", +DlnLnkMsgNoEMail : "Palun kirjuta E-Posti aadress", +DlnLnkMsgNoAnchor : "Palun vali ankur", +DlnLnkMsgInvPopName : "Hüpikakna nimi peab algama alfabeetilise tähega ja ei tohi sisaldada tühikuid", + +// Color Dialog +DlgColorTitle : "Vali värv", +DlgColorBtnClear : "Tühjenda", +DlgColorHighlight : "Märgi", +DlgColorSelected : "Valitud", + +// Smiley Dialog +DlgSmileyTitle : "Sisesta emotikon", + +// Special Character Dialog +DlgSpecialCharTitle : "Vali erimärk", + +// Table Dialog +DlgTableTitle : "Tabeli atribuudid", +DlgTableRows : "Read", +DlgTableColumns : "Veerud", +DlgTableBorder : "Joone suurus", +DlgTableAlign : "Joondus", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Vasak", +DlgTableAlignCenter : "Kesk", +DlgTableAlignRight : "Parem", +DlgTableWidth : "Laius", +DlgTableWidthPx : "pikslit", +DlgTableWidthPc : "protsenti", +DlgTableHeight : "Kõrgus", +DlgTableCellSpace : "Lahtri vahe", +DlgTableCellPad : "Lahtri täidis", +DlgTableCaption : "Tabeli tiitel", +DlgTableSummary : "Kokkuvõte", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Lahtri atribuudid", +DlgCellWidth : "Laius", +DlgCellWidthPx : "pikslit", +DlgCellWidthPc : "protsenti", +DlgCellHeight : "Kõrgus", +DlgCellWordWrap : "Sõna ülekanne", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Jah", +DlgCellWordWrapNo : "Ei", +DlgCellHorAlign : "Horisontaaljoondus", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Vasak", +DlgCellHorAlignCenter : "Kesk", +DlgCellHorAlignRight: "Parem", +DlgCellVerAlign : "Vertikaaljoondus", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Üles", +DlgCellVerAlignMiddle : "Keskele", +DlgCellVerAlignBottom : "Alla", +DlgCellVerAlignBaseline : "Baasjoonele", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Reaulatus", +DlgCellCollSpan : "Veeruulatus", +DlgCellBackColor : "Tausta värv", +DlgCellBorderColor : "Joone värv", +DlgCellBtnSelect : "Vali...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Otsi ja asenda", + +// Find Dialog +DlgFindTitle : "Otsi", +DlgFindFindBtn : "Otsi", +DlgFindNotFoundMsg : "Valitud teksti ei leitud.", + +// Replace Dialog +DlgReplaceTitle : "Asenda", +DlgReplaceFindLbl : "Leia mida:", +DlgReplaceReplaceLbl : "Asenda millega:", +DlgReplaceCaseChk : "Erista suur- ja väiketähti", +DlgReplaceReplaceBtn : "Asenda", +DlgReplaceReplAllBtn : "Asenda kõik", +DlgReplaceWordChk : "Otsi terviklike sõnu", + +// Paste Operations / Dialog +PasteErrorCut : "Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt lõigata. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl+X).", +PasteErrorCopy : "Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt kopeerida. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl+C).", + +PasteAsText : "Kleebi tavalise tekstina", +PasteFromWord : "Kleebi Wordist", + +DlgPasteMsg2 : "Palun kleebi järgnevasse kasti kasutades klaviatuuri klahvikombinatsiooni (Ctrl+V) ja vajuta seejärel OK.", +DlgPasteSec : "Sinu veebisirvija turvaseadete tõttu, ei oma redaktor otsest ligipääsu lõikelaua andmetele. Sa pead kleepima need uuesti siia aknasse.", +DlgPasteIgnoreFont : "Ignoreeri kirja definitsioone", +DlgPasteRemoveStyles : "Eemalda stiilide definitsioonid", + +// Color Picker +ColorAutomatic : "Automaatne", +ColorMoreColors : "Rohkem värve...", + +// Document Properties +DocProps : "Dokumendi omadused", + +// Anchor Dialog +DlgAnchorTitle : "Ankru omadused", +DlgAnchorName : "Ankru nimi", +DlgAnchorErrorName : "Palun sisest ankru nimi", + +// Speller Pages Dialog +DlgSpellNotInDic : "Puudub sõnastikust", +DlgSpellChangeTo : "Muuda", +DlgSpellBtnIgnore : "Ignoreeri", +DlgSpellBtnIgnoreAll : "Ignoreeri kõiki", +DlgSpellBtnReplace : "Asenda", +DlgSpellBtnReplaceAll : "Asenda kõik", +DlgSpellBtnUndo : "Võta tagasi", +DlgSpellNoSuggestions : "- Soovitused puuduvad -", +DlgSpellProgress : "Toimub õigekirja kontroll...", +DlgSpellNoMispell : "Õigekirja kontroll sooritatud: õigekirjuvigu ei leitud", +DlgSpellNoChanges : "Õigekirja kontroll sooritatud: ühtegi sõna ei muudetud", +DlgSpellOneChange : "Õigekirja kontroll sooritatud: üks sõna muudeti", +DlgSpellManyChanges : "Õigekirja kontroll sooritatud: %1 sõna muudetud", + +IeSpellDownload : "Õigekirja kontrollija ei ole installeeritud. Soovid sa selle alla laadida?", + +// Button Dialog +DlgButtonText : "Tekst (väärtus)", +DlgButtonType : "Tüüp", +DlgButtonTypeBtn : "Nupp", +DlgButtonTypeSbm : "Saada", +DlgButtonTypeRst : "Lähtesta", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Nimi", +DlgCheckboxValue : "Väärtus", +DlgCheckboxSelected : "Valitud", + +// Form Dialog +DlgFormName : "Nimi", +DlgFormAction : "Toiming", +DlgFormMethod : "Meetod", + +// Select Field Dialog +DlgSelectName : "Nimi", +DlgSelectValue : "Väärtus", +DlgSelectSize : "Suurus", +DlgSelectLines : "ridu", +DlgSelectChkMulti : "Võimalda mitu valikut", +DlgSelectOpAvail : "Võimalikud valikud", +DlgSelectOpText : "Tekst", +DlgSelectOpValue : "Väärtus", +DlgSelectBtnAdd : "Lisa", +DlgSelectBtnModify : "Muuda", +DlgSelectBtnUp : "Üles", +DlgSelectBtnDown : "Alla", +DlgSelectBtnSetValue : "Sea valitud olekuna", +DlgSelectBtnDelete : "Kustuta", + +// Textarea Dialog +DlgTextareaName : "Nimi", +DlgTextareaCols : "Veerge", +DlgTextareaRows : "Ridu", + +// Text Field Dialog +DlgTextName : "Nimi", +DlgTextValue : "Väärtus", +DlgTextCharWidth : "Laius (tähemärkides)", +DlgTextMaxChars : "Maksimaalselt tähemärke", +DlgTextType : "Tüüp", +DlgTextTypeText : "Tekst", +DlgTextTypePass : "Parool", + +// Hidden Field Dialog +DlgHiddenName : "Nimi", +DlgHiddenValue : "Väärtus", + +// Bulleted List Dialog +BulletedListProp : "Täpitud loetelu omadused", +NumberedListProp : "Nummerdatud loetelu omadused", +DlgLstStart : "Alusta", +DlgLstType : "Tüüp", +DlgLstTypeCircle : "Ring", +DlgLstTypeDisc : "Ketas", +DlgLstTypeSquare : "Ruut", +DlgLstTypeNumbers : "Numbrid (1, 2, 3)", +DlgLstTypeLCase : "Väiketähed (a, b, c)", +DlgLstTypeUCase : "Suurtähed (A, B, C)", +DlgLstTypeSRoman : "Väiksed Rooma numbrid (i, ii, iii)", +DlgLstTypeLRoman : "Suured Rooma numbrid (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Üldine", +DlgDocBackTab : "Taust", +DlgDocColorsTab : "Värvid ja veerised", +DlgDocMetaTab : "Meta andmed", + +DlgDocPageTitle : "Lehekülje tiitel", +DlgDocLangDir : "Kirja suund", +DlgDocLangDirLTR : "Vasakult paremale (LTR)", +DlgDocLangDirRTL : "Paremalt vasakule (RTL)", +DlgDocLangCode : "Keele kood", +DlgDocCharSet : "Märgistiku kodeering", +DlgDocCharSetCE : "Kesk-Euroopa", +DlgDocCharSetCT : "Hiina traditsiooniline (Big5)", +DlgDocCharSetCR : "Kirillisa", +DlgDocCharSetGR : "Kreeka", +DlgDocCharSetJP : "Jaapani", +DlgDocCharSetKR : "Korea", +DlgDocCharSetTR : "Türgi", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Lääne-Euroopa", +DlgDocCharSetOther : "Ülejäänud märgistike kodeeringud", + +DlgDocDocType : "Dokumendi tüüppäis", +DlgDocDocTypeOther : "Teised dokumendi tüüppäised", +DlgDocIncXHTML : "Arva kaasa XHTML deklaratsioonid", +DlgDocBgColor : "Taustavärv", +DlgDocBgImage : "Taustapildi URL", +DlgDocBgNoScroll : "Mittekeritav tagataust", +DlgDocCText : "Tekst", +DlgDocCLink : "Link", +DlgDocCVisited : "Külastatud link", +DlgDocCActive : "Aktiivne link", +DlgDocMargins : "Lehekülje äärised", +DlgDocMaTop : "Ülaserv", +DlgDocMaLeft : "Vasakserv", +DlgDocMaRight : "Paremserv", +DlgDocMaBottom : "Alaserv", +DlgDocMeIndex : "Dokumendi võtmesõnad (eraldatud komadega)", +DlgDocMeDescr : "Dokumendi kirjeldus", +DlgDocMeAuthor : "Autor", +DlgDocMeCopy : "Autoriõigus", +DlgDocPreview : "Eelvaade", + +// Templates Dialog +Templates : "Šabloon", +DlgTemplatesTitle : "Sisu šabloonid", +DlgTemplatesSelMsg : "Palun vali šabloon, et avada see redaktoris
    (praegune sisu läheb kaotsi):", +DlgTemplatesLoading : "Laen šabloonide nimekirja. Palun oota...", +DlgTemplatesNoTpl : "(Ühtegi šablooni ei ole defineeritud)", +DlgTemplatesReplace : "Asenda tegelik sisu", + +// About Dialog +DlgAboutAboutTab : "Teave", +DlgAboutBrowserInfoTab : "Veebisirvija info", +DlgAboutLicenseTab : "Litsents", +DlgAboutVersion : "versioon", +DlgAboutInfo : "Täpsema info saamiseks mine", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/eu.js b/webdir/fckeditor/editor/lang/eu.js new file mode 100644 index 0000000..e335a20 --- /dev/null +++ b/webdir/fckeditor/editor/lang/eu.js @@ -0,0 +1,535 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Basque language file. + * Euskara hizkuntza fitxategia. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Estutu Tresna Barra", +ToolbarExpand : "Hedatu Tresna Barra", + +// Toolbar Items and Context Menu +Save : "Gorde", +NewPage : "Orrialde Berria", +Preview : "Aurrebista", +Cut : "Ebaki", +Copy : "Kopiatu", +Paste : "Itsatsi", +PasteText : "Itsatsi testu bezala", +PasteWord : "Itsatsi Word-etik", +Print : "Inprimatu", +SelectAll : "Hautatu dena", +RemoveFormat : "Kendu Formatua", +InsertLinkLbl : "Esteka", +InsertLink : "Txertatu/Editatu Esteka", +RemoveLink : "Kendu Esteka", +VisitLink : "Ireki Esteka", +Anchor : "Aingura", +AnchorDelete : "Ezabatu Aingura", +InsertImageLbl : "Irudia", +InsertImage : "Txertatu/Editatu Irudia", +InsertFlashLbl : "Flasha", +InsertFlash : "Txertatu/Editatu Flasha", +InsertTableLbl : "Taula", +InsertTable : "Txertatu/Editatu Taula", +InsertLineLbl : "Lerroa", +InsertLine : "Txertatu Marra Horizontala", +InsertSpecialCharLbl: "Karaktere Berezia", +InsertSpecialChar : "Txertatu Karaktere Berezia", +InsertSmileyLbl : "Aurpegierak", +InsertSmiley : "Txertatu Aurpegierak", +About : "FCKeditor-ri buruz", +Bold : "Lodia", +Italic : "Etzana", +Underline : "Azpimarratu", +StrikeThrough : "Marratua", +Subscript : "Azpi-indize", +Superscript : "Goi-indize", +LeftJustify : "Lerrokatu Ezkerrean", +CenterJustify : "Lerrokatu Erdian", +RightJustify : "Lerrokatu Eskuman", +BlockJustify : "Justifikatu", +DecreaseIndent : "Txikitu Koska", +IncreaseIndent : "Handitu Koska", +Blockquote : "Aipamen blokea", +CreateDiv : "Sortu Div Edukitzailea", +EditDiv : "Editatu Div Edukitzailea", +DeleteDiv : "Ezabatu Div Edukitzailea", +Undo : "Desegin", +Redo : "Berregin", +NumberedListLbl : "Zenbakidun Zerrenda", +NumberedList : "Txertatu/Kendu Zenbakidun zerrenda", +BulletedListLbl : "Buletdun Zerrenda", +BulletedList : "Txertatu/Kendu Buletdun zerrenda", +ShowTableBorders : "Erakutsi Taularen Ertzak", +ShowDetails : "Erakutsi Xehetasunak", +Style : "Estiloa", +FontFormat : "Formatua", +Font : "Letra-tipoa", +FontSize : "Tamaina", +TextColor : "Testu Kolorea", +BGColor : "Atzeko kolorea", +Source : "HTML Iturburua", +Find : "Bilatu", +Replace : "Ordezkatu", +SpellCheck : "Ortografia", +UniversalKeyboard : "Teklatu Unibertsala", +PageBreakLbl : "Orrialde-jauzia", +PageBreak : "Txertatu Orrialde-jauzia", + +Form : "Formularioa", +Checkbox : "Kontrol-laukia", +RadioButton : "Aukera-botoia", +TextField : "Testu Eremua", +Textarea : "Testu-area", +HiddenField : "Ezkutuko Eremua", +Button : "Botoia", +SelectionField : "Hautespen Eremua", +ImageButton : "Irudi Botoia", + +FitWindow : "Maximizatu editorearen tamaina", +ShowBlocks : "Blokeak erakutsi", + +// Context Menu +EditLink : "Aldatu Esteka", +CellCM : "Gelaxka", +RowCM : "Errenkada", +ColumnCM : "Zutabea", +InsertRowAfter : "Txertatu Lerroa Ostean", +InsertRowBefore : "Txertatu Lerroa Aurretik", +DeleteRows : "Ezabatu Errenkadak", +InsertColumnAfter : "Txertatu Zutabea Ostean", +InsertColumnBefore : "Txertatu Zutabea Aurretik", +DeleteColumns : "Ezabatu Zutabeak", +InsertCellAfter : "Txertatu Gelaxka Ostean", +InsertCellBefore : "Txertatu Gelaxka Aurretik", +DeleteCells : "Kendu Gelaxkak", +MergeCells : "Batu Gelaxkak", +MergeRight : "Elkartu Eskumara", +MergeDown : "Elkartu Behera", +HorizontalSplitCell : "Banatu Gelaxkak Horizontalki", +VerticalSplitCell : "Banatu Gelaxkak Bertikalki", +TableDelete : "Ezabatu Taula", +CellProperties : "Gelaxkaren Ezaugarriak", +TableProperties : "Taularen Ezaugarriak", +ImageProperties : "Irudiaren Ezaugarriak", +FlashProperties : "Flasharen Ezaugarriak", + +AnchorProp : "Ainguraren Ezaugarriak", +ButtonProp : "Botoiaren Ezaugarriak", +CheckboxProp : "Kontrol-laukiko Ezaugarriak", +HiddenFieldProp : "Ezkutuko Eremuaren Ezaugarriak", +RadioButtonProp : "Aukera-botoiaren Ezaugarriak", +ImageButtonProp : "Irudi Botoiaren Ezaugarriak", +TextFieldProp : "Testu Eremuaren Ezaugarriak", +SelectionFieldProp : "Hautespen Eremuaren Ezaugarriak", +TextareaProp : "Testu-arearen Ezaugarriak", +FormProp : "Formularioaren Ezaugarriak", + +FontFormats : "Arrunta;Formateatua;Helbidea;Izenburua 1;Izenburua 2;Izenburua 3;Izenburua 4;Izenburua 5;Izenburua 6;Paragrafoa (DIV)", + +// Alerts and Messages +ProcessingXHTML : "XHTML Prozesatzen. Itxaron mesedez...", +Done : "Eginda", +PasteWordConfirm : "Itsatsi nahi duzun testua Wordetik hartua dela dirudi. Itsatsi baino lehen garbitu nahi duzu?", +NotCompatiblePaste : "Komando hau Internet Explorer 5.5 bertsiorako edo ondorengoentzako erabilgarria dago. Garbitu gabe itsatsi nahi duzu?", +UnknownToolbarItem : "Ataza barrako elementu ezezaguna \"%1\"", +UnknownCommand : "Komando izen ezezaguna \"%1\"", +NotImplemented : "Komando ez inplementatua", +UnknownToolbarSet : "Ataza barra \"%1\" taldea ez da existitzen", +NoActiveX : "Zure nabigatzailearen segurtasun hobespenak editore honen zenbait ezaugarri mugatu ditzake. \"ActiveX kontrolak eta pluginak\" aktibatu beharko zenituzke, bestela erroreak eta ezaugarrietan mugak egon daitezke.", +BrowseServerBlocked : "Baliabideen arakatzailea ezin da ireki. Ziurtatu popup blokeatzaileak desgaituta dituzula.", +DialogBlocked : "Ezin da elkarrizketa-leihoa ireki. Ziurtatu popup blokeatzaileak desgaituta dituzula.", +VisitLinkBlocked : "Ezin da leiho berri bat ireki. Ziurtatu popup blokeatzaileak desgaituta dituzula.", + +// Dialogs +DlgBtnOK : "Ados", +DlgBtnCancel : "Utzi", +DlgBtnClose : "Itxi", +DlgBtnBrowseServer : "Zerbitzaria arakatu", +DlgAdvancedTag : "Aurreratua", +DlgOpOther : "", +DlgInfoTab : "Informazioa", +DlgAlertUrl : "Mesedez URLa idatzi ezazu", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Hizkuntzaren Norabidea", +DlgGenLangDirLtr : "Ezkerretik Eskumara(LTR)", +DlgGenLangDirRtl : "Eskumatik Ezkerrera (RTL)", +DlgGenLangCode : "Hizkuntza Kodea", +DlgGenAccessKey : "Sarbide-gakoa", +DlgGenName : "Izena", +DlgGenTabIndex : "Tabulazio Indizea", +DlgGenLongDescr : "URL Deskribapen Luzea", +DlgGenClass : "Estilo-orriko Klaseak", +DlgGenTitle : "Izenburua", +DlgGenContType : "Eduki Mota (Content Type)", +DlgGenLinkCharset : "Estekatutako Karaktere Multzoa", +DlgGenStyle : "Estiloa", + +// Image Dialog +DlgImgTitle : "Irudi Ezaugarriak", +DlgImgInfoTab : "Irudi informazioa", +DlgImgBtnUpload : "Zerbitzarira bidalia", +DlgImgURL : "URL", +DlgImgUpload : "Gora Kargatu", +DlgImgAlt : "Ordezko Testua", +DlgImgWidth : "Zabalera", +DlgImgHeight : "Altuera", +DlgImgLockRatio : "Erlazioa Blokeatu", +DlgBtnResetSize : "Tamaina Berrezarri", +DlgImgBorder : "Ertza", +DlgImgHSpace : "HSpace", +DlgImgVSpace : "VSpace", +DlgImgAlign : "Lerrokatu", +DlgImgAlignLeft : "Ezkerrera", +DlgImgAlignAbsBottom: "Abs Behean", +DlgImgAlignAbsMiddle: "Abs Erdian", +DlgImgAlignBaseline : "Oinan", +DlgImgAlignBottom : "Behean", +DlgImgAlignMiddle : "Erdian", +DlgImgAlignRight : "Eskuman", +DlgImgAlignTextTop : "Testua Goian", +DlgImgAlignTop : "Goian", +DlgImgPreview : "Aurrebista", +DlgImgAlertUrl : "Mesedez Irudiaren URLa idatzi", +DlgImgLinkTab : "Esteka", + +// Flash Dialog +DlgFlashTitle : "Flasharen Ezaugarriak", +DlgFlashChkPlay : "Automatikoki Erreproduzitu", +DlgFlashChkLoop : "Begizta", +DlgFlashChkMenu : "Flasharen Menua Gaitu", +DlgFlashScale : "Eskalatu", +DlgFlashScaleAll : "Dena erakutsi", +DlgFlashScaleNoBorder : "Ertzik gabe", +DlgFlashScaleFit : "Doitu", + +// Link Dialog +DlgLnkWindowTitle : "Esteka", +DlgLnkInfoTab : "Estekaren Informazioa", +DlgLnkTargetTab : "Helburua", + +DlgLnkType : "Esteka Mota", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Aingura orrialde honetan", +DlgLnkTypeEMail : "ePosta", +DlgLnkProto : "Protokoloa", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Aingura bat hautatu", +DlgLnkAnchorByName : "Aingura izenagatik", +DlgLnkAnchorById : "Elementuaren ID-gatik", +DlgLnkNoAnchors : "(Ez daude aingurak eskuragarri dokumentuan)", +DlgLnkEMail : "ePosta Helbidea", +DlgLnkEMailSubject : "Mezuaren Gaia", +DlgLnkEMailBody : "Mezuaren Gorputza", +DlgLnkUpload : "Gora kargatu", +DlgLnkBtnUpload : "Zerbitzarira bidali", + +DlgLnkTarget : "Target (Helburua)", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Leiho Berria (_blank)", +DlgLnkTargetParent : "Leiho Gurasoa (_parent)", +DlgLnkTargetSelf : "Leiho Berdina (_self)", +DlgLnkTargetTop : "Goiko Leihoa (_top)", +DlgLnkTargetFrameName : "Marko Helburuaren Izena", +DlgLnkPopWinName : "Popup Leihoaren Izena", +DlgLnkPopWinFeat : "Popup Leihoaren Ezaugarriak", +DlgLnkPopResize : "Tamaina Aldakorra", +DlgLnkPopLocation : "Kokaleku Barra", +DlgLnkPopMenu : "Menu Barra", +DlgLnkPopScroll : "Korritze Barrak", +DlgLnkPopStatus : "Egoera Barra", +DlgLnkPopToolbar : "Tresna Barra", +DlgLnkPopFullScrn : "Pantaila Osoa (IE)", +DlgLnkPopDependent : "Menpekoa (Netscape)", +DlgLnkPopWidth : "Zabalera", +DlgLnkPopHeight : "Altuera", +DlgLnkPopLeft : "Ezkerreko Posizioa", +DlgLnkPopTop : "Goiko Posizioa", + +DlnLnkMsgNoUrl : "Mesedez URL esteka idatzi", +DlnLnkMsgNoEMail : "Mesedez ePosta helbidea idatzi", +DlnLnkMsgNoAnchor : "Mesedez aingura bat aukeratu", +DlnLnkMsgInvPopName : "Popup leihoaren izenak karaktere alfabetiko batekin hasi behar du eta eta ezin du zuriunerik izan", + +// Color Dialog +DlgColorTitle : "Kolore Aukeraketa", +DlgColorBtnClear : "Garbitu", +DlgColorHighlight : "Nabarmendu", +DlgColorSelected : "Aukeratuta", + +// Smiley Dialog +DlgSmileyTitle : "Aurpegiera Sartu", + +// Special Character Dialog +DlgSpecialCharTitle : "Karaktere Berezia Aukeratu", + +// Table Dialog +DlgTableTitle : "Taularen Ezaugarriak", +DlgTableRows : "Lerroak", +DlgTableColumns : "Zutabeak", +DlgTableBorder : "Ertzaren Zabalera", +DlgTableAlign : "Lerrokatu", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Ezkerrean", +DlgTableAlignCenter : "Erdian", +DlgTableAlignRight : "Eskuman", +DlgTableWidth : "Zabalera", +DlgTableWidthPx : "pixel", +DlgTableWidthPc : "ehuneko", +DlgTableHeight : "Altuera", +DlgTableCellSpace : "Gelaxka arteko tartea", +DlgTableCellPad : "Gelaxken betegarria", +DlgTableCaption : "Epigrafea", +DlgTableSummary : "Laburpena", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Gelaxken Ezaugarriak", +DlgCellWidth : "Zabalera", +DlgCellWidthPx : "pixel", +DlgCellWidthPc : "ehuneko", +DlgCellHeight : "Altuera", +DlgCellWordWrap : "Itzulbira", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Bai", +DlgCellWordWrapNo : "Ez", +DlgCellHorAlign : "Lerrokatu Horizontalki", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Ezkerrean", +DlgCellHorAlignCenter : "Erdian", +DlgCellHorAlignRight: "Eskuman", +DlgCellVerAlign : "Lerrokatu Bertikalki", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Goian", +DlgCellVerAlignMiddle : "Erdian", +DlgCellVerAlignBottom : "Behean", +DlgCellVerAlignBaseline : "Oinean", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Lerroak Hedatu", +DlgCellCollSpan : "Zutabeak Hedatu", +DlgCellBackColor : "Atzeko Kolorea", +DlgCellBorderColor : "Ertzako Kolorea", +DlgCellBtnSelect : "Aukeratu...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Bilatu eta Ordeztu", + +// Find Dialog +DlgFindTitle : "Bilaketa", +DlgFindFindBtn : "Bilatu", +DlgFindNotFoundMsg : "Idatzitako testua ez da topatu.", + +// Replace Dialog +DlgReplaceTitle : "Ordeztu", +DlgReplaceFindLbl : "Zer bilatu:", +DlgReplaceReplaceLbl : "Zerekin ordeztu:", +DlgReplaceCaseChk : "Maiuskula/minuskula", +DlgReplaceReplaceBtn : "Ordeztu", +DlgReplaceReplAllBtn : "Ordeztu Guztiak", +DlgReplaceWordChk : "Esaldi osoa bilatu", + +// Paste Operations / Dialog +PasteErrorCut : "Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki moztea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl+X).", +PasteErrorCopy : "Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki kopiatzea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl+C).", + +PasteAsText : "Testu Arrunta bezala Itsatsi", +PasteFromWord : "Word-etik itsatsi", + +DlgPasteMsg2 : "Mesedez teklatua erabilita (Ctrl+V) ondorego eremuan testua itsatsi eta OK sakatu.", +DlgPasteSec : "Nabigatzailearen segurtasun ezarpenak direla eta, editoreak ezin du arbela zuzenean erabili. Leiho honetan berriro itsatsi behar duzu.", +DlgPasteIgnoreFont : "Letra Motaren definizioa ezikusi", +DlgPasteRemoveStyles : "Estilo definizioak kendu", + +// Color Picker +ColorAutomatic : "Automatikoa", +ColorMoreColors : "Kolore gehiago...", + +// Document Properties +DocProps : "Dokumentuaren Ezarpenak", + +// Anchor Dialog +DlgAnchorTitle : "Ainguraren Ezaugarriak", +DlgAnchorName : "Ainguraren Izena", +DlgAnchorErrorName : "Idatzi ainguraren izena", + +// Speller Pages Dialog +DlgSpellNotInDic : "Ez dago hiztegian", +DlgSpellChangeTo : "Honekin ordezkatu", +DlgSpellBtnIgnore : "Ezikusi", +DlgSpellBtnIgnoreAll : "Denak Ezikusi", +DlgSpellBtnReplace : "Ordezkatu", +DlgSpellBtnReplaceAll : "Denak Ordezkatu", +DlgSpellBtnUndo : "Desegin", +DlgSpellNoSuggestions : "- Iradokizunik ez -", +DlgSpellProgress : "Zuzenketa ortografikoa martxan...", +DlgSpellNoMispell : "Zuzenketa ortografikoa bukatuta: Akatsik ez", +DlgSpellNoChanges : "Zuzenketa ortografikoa bukatuta: Ez da ezer aldatu", +DlgSpellOneChange : "Zuzenketa ortografikoa bukatuta: Hitz bat aldatu da", +DlgSpellManyChanges : "Zuzenketa ortografikoa bukatuta: %1 hitz aldatu dira", + +IeSpellDownload : "Zuzentzaile ortografikoa ez dago instalatuta. Deskargatu nahi duzu?", + +// Button Dialog +DlgButtonText : "Testua (Balorea)", +DlgButtonType : "Mota", +DlgButtonTypeBtn : "Botoia", +DlgButtonTypeSbm : "Bidali", +DlgButtonTypeRst : "Garbitu", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Izena", +DlgCheckboxValue : "Balorea", +DlgCheckboxSelected : "Hautatuta", + +// Form Dialog +DlgFormName : "Izena", +DlgFormAction : "Ekintza", +DlgFormMethod : "Metodoa", + +// Select Field Dialog +DlgSelectName : "Izena", +DlgSelectValue : "Balorea", +DlgSelectSize : "Tamaina", +DlgSelectLines : "lerro kopurura", +DlgSelectChkMulti : "Hautaketa anitzak baimendu", +DlgSelectOpAvail : "Aukera Eskuragarriak", +DlgSelectOpText : "Testua", +DlgSelectOpValue : "Balorea", +DlgSelectBtnAdd : "Gehitu", +DlgSelectBtnModify : "Aldatu", +DlgSelectBtnUp : "Gora", +DlgSelectBtnDown : "Behera", +DlgSelectBtnSetValue : "Aukeratutako balorea ezarri", +DlgSelectBtnDelete : "Ezabatu", + +// Textarea Dialog +DlgTextareaName : "Izena", +DlgTextareaCols : "Zutabeak", +DlgTextareaRows : "Lerroak", + +// Text Field Dialog +DlgTextName : "Izena", +DlgTextValue : "Balorea", +DlgTextCharWidth : "Zabalera", +DlgTextMaxChars : "Zenbat karaktere gehienez", +DlgTextType : "Mota", +DlgTextTypeText : "Testua", +DlgTextTypePass : "Pasahitza", + +// Hidden Field Dialog +DlgHiddenName : "Izena", +DlgHiddenValue : "Balorea", + +// Bulleted List Dialog +BulletedListProp : "Buletdun Zerrendaren Ezarpenak", +NumberedListProp : "Zenbakidun Zerrendaren Ezarpenak", +DlgLstStart : "Hasiera", +DlgLstType : "Mota", +DlgLstTypeCircle : "Zirkulua", +DlgLstTypeDisc : "Diskoa", +DlgLstTypeSquare : "Karratua", +DlgLstTypeNumbers : "Zenbakiak (1, 2, 3)", +DlgLstTypeLCase : "Letra xeheak (a, b, c)", +DlgLstTypeUCase : "Letra larriak (A, B, C)", +DlgLstTypeSRoman : "Erromatar zenbaki zeheak (i, ii, iii)", +DlgLstTypeLRoman : "Erromatar zenbaki larriak (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Orokorra", +DlgDocBackTab : "Atzealdea", +DlgDocColorsTab : "Koloreak eta Marjinak", +DlgDocMetaTab : "Meta Informazioa", + +DlgDocPageTitle : "Orriaren Izenburua", +DlgDocLangDir : "Hizkuntzaren Norabidea", +DlgDocLangDirLTR : "Ezkerretik eskumara (LTR)", +DlgDocLangDirRTL : "Eskumatik ezkerrera (RTL)", +DlgDocLangCode : "Hizkuntzaren Kodea", +DlgDocCharSet : "Karaktere Multzoaren Kodeketa", +DlgDocCharSetCE : "Erdialdeko Europakoa", +DlgDocCharSetCT : "Txinatar Tradizionala (Big5)", +DlgDocCharSetCR : "Zirilikoa", +DlgDocCharSetGR : "Grekoa", +DlgDocCharSetJP : "Japoniarra", +DlgDocCharSetKR : "Korearra", +DlgDocCharSetTR : "Turkiarra", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Mendebaldeko Europakoa", +DlgDocCharSetOther : "Beste Karaktere Multzoko Kodeketa", + +DlgDocDocType : "Document Type Goiburua", +DlgDocDocTypeOther : "Beste Document Type Goiburua", +DlgDocIncXHTML : "XHTML Ezarpenak", +DlgDocBgColor : "Atzeko Kolorea", +DlgDocBgImage : "Atzeko Irudiaren URL-a", +DlgDocBgNoScroll : "Korritze gabeko Atzealdea", +DlgDocCText : "Testua", +DlgDocCLink : "Estekak", +DlgDocCVisited : "Bisitatutako Estekak", +DlgDocCActive : "Esteka Aktiboa", +DlgDocMargins : "Orrialdearen marjinak", +DlgDocMaTop : "Goian", +DlgDocMaLeft : "Ezkerrean", +DlgDocMaRight : "Eskuman", +DlgDocMaBottom : "Behean", +DlgDocMeIndex : "Dokumentuaren Gako-hitzak (komarekin bananduta)", +DlgDocMeDescr : "Dokumentuaren Deskribapena", +DlgDocMeAuthor : "Egilea", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Aurrebista", + +// Templates Dialog +Templates : "Txantiloiak", +DlgTemplatesTitle : "Eduki Txantiloiak", +DlgTemplatesSelMsg : "Mesedez txantiloia aukeratu editorean kargatzeko
    (orain dauden edukiak galduko dira):", +DlgTemplatesLoading : "Txantiloiak kargatzen. Itxaron mesedez...", +DlgTemplatesNoTpl : "(Ez dago definitutako txantiloirik)", +DlgTemplatesReplace : "Ordeztu oraingo edukiak", + +// About Dialog +DlgAboutAboutTab : "Honi buruz", +DlgAboutBrowserInfoTab : "Nabigatzailearen Informazioa", +DlgAboutLicenseTab : "Lizentzia", +DlgAboutVersion : "bertsioa", +DlgAboutInfo : "Informazio gehiago eskuratzeko hona joan", + +// Div Dialog +DlgDivGeneralTab : "Orokorra", +DlgDivAdvancedTab : "Aurreratua", +DlgDivStyle : "Estiloa", +DlgDivInlineStyle : "Inline Estiloa" +}; diff --git a/webdir/fckeditor/editor/lang/fa.js b/webdir/fckeditor/editor/lang/fa.js new file mode 100644 index 0000000..d529f25 --- /dev/null +++ b/webdir/fckeditor/editor/lang/fa.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Persian language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "rtl", + +ToolbarCollapse : "برچیدن نوارابزار", +ToolbarExpand : "گستردن نوارابزار", + +// Toolbar Items and Context Menu +Save : "ذخیره", +NewPage : "برگهٴ تازه", +Preview : "پیش‌نمایش", +Cut : "برش", +Copy : "Ú©Ù¾ÛŒ", +Paste : "چسباندن", +PasteText : "چسباندن به عنوان متن Ùساده", +PasteWord : "چسباندن از Word", +Print : "چاپ", +SelectAll : "گزینش همه", +RemoveFormat : "برداشتن Ùرمت", +InsertLinkLbl : "پیوند", +InsertLink : "گنجاندن/ویرایش Ùپیوند", +RemoveLink : "برداشتن پیوند", +VisitLink : "باز کردن پیوند", +Anchor : "گنجاندن/ویرایش Ùلنگر", +AnchorDelete : "برداشتن لنگر", +InsertImageLbl : "تصویر", +InsertImage : "گنجاندن/ویرایش Ùتصویر", +InsertFlashLbl : "Flash", +InsertFlash : "گنجاندن/ویرایش ÙFlash", +InsertTableLbl : "جدول", +InsertTable : "گنجاندن/ویرایش Ùجدول", +InsertLineLbl : "خط", +InsertLine : "گنجاندن خط ÙاÙÙ‚ÛŒ", +InsertSpecialCharLbl: "نویسهٴ ویژه", +InsertSpecialChar : "گنجاندن نویسهٴ ویژه", +InsertSmileyLbl : "خندانک", +InsertSmiley : "گنجاندن خندانک", +About : "دربارهٴ FCKeditor", +Bold : "درشت", +Italic : "خمیده", +Underline : "خط‌زیردار", +StrikeThrough : "میان‌خط", +Subscript : "زیرنویس", +Superscript : "بالانویس", +LeftJustify : "چپ‌چین", +CenterJustify : "میان‌چین", +RightJustify : "راست‌چین", +BlockJustify : "بلوک‌چین", +DecreaseIndent : "کاهش تورÙتگی", +IncreaseIndent : "اÙزایش تورÙتگی", +Blockquote : "بلوک نقل قول", +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "واچیدن", +Redo : "بازچیدن", +NumberedListLbl : "Ùهرست شماره‌دار", +NumberedList : "گنجاندن/برداشتن Ùهرست شماره‌دار", +BulletedListLbl : "Ùهرست نقطه‌ای", +BulletedList : "گنجاندن/برداشتن Ùهرست نقطه‌ای", +ShowTableBorders : "نمایش لبهٴ جدول", +ShowDetails : "نمایش جزئیات", +Style : "سبک", +FontFormat : "Ùرمت", +Font : "قلم", +FontSize : "اندازه", +TextColor : "رنگ متن", +BGColor : "رنگ پس‌زمینه", +Source : "منبع", +Find : "جستجو", +Replace : "جایگزینی", +SpellCheck : "بررسی املا", +UniversalKeyboard : "صÙحه‌کلید جهانی", +PageBreakLbl : "شکستگی Ùپایان Ùبرگه", +PageBreak : "گنجاندن شکستگی Ùپایان Ùبرگه", + +Form : "Ùرم", +Checkbox : "خانهٴ گزینه‌ای", +RadioButton : "دکمهٴ رادیویی", +TextField : "Ùیلد متنی", +Textarea : "ناحیهٴ متنی", +HiddenField : "Ùیلد پنهان", +Button : "دکمه", +SelectionField : "Ùیلد چندگزینه‌ای", +ImageButton : "دکمهٴ تصویری", + +FitWindow : "بیشینه‌سازی Ùاندازهٴ ویرایشگر", +ShowBlocks : "نمایش بلوک‌ها", + +// Context Menu +EditLink : "ویرایش پیوند", +CellCM : "سلول", +RowCM : "سطر", +ColumnCM : "ستون", +InsertRowAfter : "اÙزودن سطر بعد از", +InsertRowBefore : "اÙزودن سطر قبل از", +DeleteRows : "حذ٠سطرها", +InsertColumnAfter : "اÙزودن ستون بعد از", +InsertColumnBefore : "اÙزودن ستون قبل از", +DeleteColumns : "حذ٠ستونها", +InsertCellAfter : "اÙزودن سلول بعد از", +InsertCellBefore : "اÙزودن سلول قبل از", +DeleteCells : "حذ٠سلولها", +MergeCells : "ادغام سلولها", +MergeRight : "ادغام به راست", +MergeDown : "ادغام به پایین", +HorizontalSplitCell : "جدا کردن اÙÙ‚ÛŒ سلول", +VerticalSplitCell : "جدا کردن عمودی سلول", +TableDelete : "پاک‌کردن جدول", +CellProperties : "ویژگیهای سلول", +TableProperties : "ویژگیهای جدول", +ImageProperties : "ویژگیهای تصویر", +FlashProperties : "ویژگیهای Flash", + +AnchorProp : "ویژگیهای لنگر", +ButtonProp : "ویژگیهای دکمه", +CheckboxProp : "ویژگیهای خانهٴ گزینه‌ای", +HiddenFieldProp : "ویژگیهای Ùیلد پنهان", +RadioButtonProp : "ویژگیهای دکمهٴ رادیویی", +ImageButtonProp : "ویژگیهای دکمهٴ تصویری", +TextFieldProp : "ویژگیهای Ùیلد متنی", +SelectionFieldProp : "ویژگیهای Ùیلد چندگزینه‌ای", +TextareaProp : "ویژگیهای ناحیهٴ متنی", +FormProp : "ویژگیهای Ùرم", + +FontFormats : "نرمال;Ùرمت‌شده;آدرس;سرنویس 1;سرنویس 2;سرنویس 3;سرنویس 4;سرنویس 5;سرنویس 6;بند;(DIV)", + +// Alerts and Messages +ProcessingXHTML : "پردازش XHTML. لطÙا صبر کنید...", +Done : "انجام شد", +PasteWordConfirm : "متنی Ú©Ù‡ می‌خواهید بچسبانید به نظر می‌رسد از Word Ú©Ù¾ÛŒ شده است. آیا می‌خواهید قبل از چسباندن آن را پاک‌سازی کنید؟", +NotCompatiblePaste : "این Ùرمان برای مرورگر Internet Explorer از نگارش 5.5 یا بالاتر در دسترس است. آیا می‌خواهید بدون پاک‌سازی، متن را بچسبانید؟", +UnknownToolbarItem : "Ùقرهٴ نوارابزار ناشناخته \"%1\"", +UnknownCommand : "نام دستور ناشناخته \"%1\"", +NotImplemented : "دستور پیاده‌سازی‌نشده", +UnknownToolbarSet : "مجموعهٴ نوارابزار \"%1\" وجود ندارد", +NoActiveX : "تنظیمات امنیتی مرورگر شما ممکن است در بعضی از ویژگیهای مرورگر محدودیت ایجاد کند. شما باید گزینهٴ \"Run ActiveX controls and plug-ins\" را Ùعال کنید. ممکن است شما با خطاهایی روبرو باشید Ùˆ متوجه کمبود ویژگیهایی شوید.", +BrowseServerBlocked : "توانایی بازگشایی مرورگر منابع Ùراهم نیست. اطمینان حاصل کنید Ú©Ù‡ تمامی برنامه‌های پیشگیری از نمایش popup را از کار بازداشته‌اید.", +DialogBlocked : "توانایی بازگشایی پنجرهٴ Ú©ÙˆÚ†Ú© ÙÚ¯Ùتگو Ùراهم نیست. اطمینان حاصل کنید Ú©Ù‡ تمامی برنامه‌های پیشگیری از نمایش popup را از کار بازداشته‌اید.", +VisitLinkBlocked : "امکان بازکردن یک پنجره جدید نیست. اطمینان حاصل کنید Ú©Ù‡ تمامی برنامه‌های پیشگیری از نمایش popup را از کار بازداشته‌اید.", + +// Dialogs +DlgBtnOK : "پذیرش", +DlgBtnCancel : "انصراÙ", +DlgBtnClose : "بستن", +DlgBtnBrowseServer : "Ùهرست‌نمایی سرور", +DlgAdvancedTag : "پیشرÙته", +DlgOpOther : "<غیره>", +DlgInfoTab : "اطلاعات", +DlgAlertUrl : "لطÙاً URL را بنویسید", + +// General Dialogs Labels +DlgGenNotSet : "<تعین‌نشده>", +DlgGenId : "شناسه", +DlgGenLangDir : "جهت‌نمای زبان", +DlgGenLangDirLtr : "Ú†Ù¾ به راست (LTR)", +DlgGenLangDirRtl : "راست به Ú†Ù¾ (RTL)", +DlgGenLangCode : "کد زبان", +DlgGenAccessKey : "کلید دستیابی", +DlgGenName : "نام", +DlgGenTabIndex : "نمایهٴ دسترسی با Tab", +DlgGenLongDescr : "URL توصی٠طولانی", +DlgGenClass : "کلاسهای شیوه‌نامه(Stylesheet)", +DlgGenTitle : "عنوان Ú©Ù…Ú©ÛŒ", +DlgGenContType : "نوع محتوای Ú©Ù…Ú©ÛŒ", +DlgGenLinkCharset : "نویسه‌گان منبع Ùپیوندشده", +DlgGenStyle : "شیوه(style)", + +// Image Dialog +DlgImgTitle : "ویژگیهای تصویر", +DlgImgInfoTab : "اطلاعات تصویر", +DlgImgBtnUpload : "به سرور بÙرست", +DlgImgURL : "URL", +DlgImgUpload : "انتقال به سرور", +DlgImgAlt : "متن جایگزین", +DlgImgWidth : "پهنا", +DlgImgHeight : "درازا", +DlgImgLockRatio : "Ù‚Ùل‌کردن Ùنسبت", +DlgBtnResetSize : "بازنشانی اندازه", +DlgImgBorder : "لبه", +DlgImgHSpace : "Ùاصلهٴ اÙÙ‚ÛŒ", +DlgImgVSpace : "Ùاصلهٴ عمودی", +DlgImgAlign : "چینش", +DlgImgAlignLeft : "Ú†Ù¾", +DlgImgAlignAbsBottom: "پائین مطلق", +DlgImgAlignAbsMiddle: "وسط مطلق", +DlgImgAlignBaseline : "خط‌پایه", +DlgImgAlignBottom : "پائین", +DlgImgAlignMiddle : "وسط", +DlgImgAlignRight : "راست", +DlgImgAlignTextTop : "متن بالا", +DlgImgAlignTop : "بالا", +DlgImgPreview : "پیش‌نمایش", +DlgImgAlertUrl : "لطÙا URL تصویر را بنویسید", +DlgImgLinkTab : "پیوند", + +// Flash Dialog +DlgFlashTitle : "ویژگیهای Flash", +DlgFlashChkPlay : "آغاز Ùخودکار", +DlgFlashChkLoop : "اجرای پیاپی", +DlgFlashChkMenu : "دردسترس‌بودن منوی Flash", +DlgFlashScale : "مقیاس", +DlgFlashScaleAll : "نمایش همه", +DlgFlashScaleNoBorder : "بدون کران", +DlgFlashScaleFit : "جایگیری کامل", + +// Link Dialog +DlgLnkWindowTitle : "پیوند", +DlgLnkInfoTab : "اطلاعات پیوند", +DlgLnkTargetTab : "مقصد", + +DlgLnkType : "نوع پیوند", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "لنگر در همین صÙحه", +DlgLnkTypeEMail : "پست الکترونیکی", +DlgLnkProto : "پروتکل", +DlgLnkProtoOther : "<دیگر>", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "یک لنگر برگزینید", +DlgLnkAnchorByName : "با نام لنگر", +DlgLnkAnchorById : "با شناسهٴ المان", +DlgLnkNoAnchors : "(در این سند لنگری دردسترس نیست)", +DlgLnkEMail : "نشانی پست الکترونیکی", +DlgLnkEMailSubject : "موضوع پیام", +DlgLnkEMailBody : "متن پیام", +DlgLnkUpload : "انتقال به سرور", +DlgLnkBtnUpload : "به سرور بÙرست", + +DlgLnkTarget : "مقصد", +DlgLnkTargetFrame : "<Ùریم>", +DlgLnkTargetPopup : "<پنجرهٴ پاپاپ>", +DlgLnkTargetBlank : "پنجرهٴ دیگر (_blank)", +DlgLnkTargetParent : "پنجرهٴ والد (_parent)", +DlgLnkTargetSelf : "همان پنجره (_self)", +DlgLnkTargetTop : "بالاترین پنجره (_top)", +DlgLnkTargetFrameName : "نام Ùریم مقصد", +DlgLnkPopWinName : "نام پنجرهٴ پاپاپ", +DlgLnkPopWinFeat : "ویژگیهای پنجرهٴ پاپاپ", +DlgLnkPopResize : "قابل تغییر اندازه", +DlgLnkPopLocation : "نوار موقعیت", +DlgLnkPopMenu : "نوار منو", +DlgLnkPopScroll : "میله‌های پیمایش", +DlgLnkPopStatus : "نوار وضعیت", +DlgLnkPopToolbar : "نوارابزار", +DlgLnkPopFullScrn : "تمام‌صÙحه (IE)", +DlgLnkPopDependent : "وابسته (Netscape)", +DlgLnkPopWidth : "پهنا", +DlgLnkPopHeight : "درازا", +DlgLnkPopLeft : "موقعیت ÙÚ†Ù¾", +DlgLnkPopTop : "موقعیت Ùبالا", + +DlnLnkMsgNoUrl : "لطÙا URL پیوند را بنویسید", +DlnLnkMsgNoEMail : "لطÙا نشانی پست الکترونیکی را بنویسید", +DlnLnkMsgNoAnchor : "لطÙا لنگری را برگزینید", +DlnLnkMsgInvPopName : "نام پنجرهٴ پاپاپ باید با یک نویسهٴ الÙبایی آغاز گردد Ùˆ نباید Ùاصله‌های خالی در آن باشند", + +// Color Dialog +DlgColorTitle : "گزینش رنگ", +DlgColorBtnClear : "پاک‌کردن", +DlgColorHighlight : "نمونه", +DlgColorSelected : "برگزیده", + +// Smiley Dialog +DlgSmileyTitle : "گنجاندن خندانک", + +// Special Character Dialog +DlgSpecialCharTitle : "گزینش نویسهٴ‌ویژه", + +// Table Dialog +DlgTableTitle : "ویژگیهای جدول", +DlgTableRows : "سطرها", +DlgTableColumns : "ستونها", +DlgTableBorder : "اندازهٴ لبه", +DlgTableAlign : "چینش", +DlgTableAlignNotSet : "<تعین‌نشده>", +DlgTableAlignLeft : "Ú†Ù¾", +DlgTableAlignCenter : "وسط", +DlgTableAlignRight : "راست", +DlgTableWidth : "پهنا", +DlgTableWidthPx : "پیکسل", +DlgTableWidthPc : "درصد", +DlgTableHeight : "درازا", +DlgTableCellSpace : "Ùاصلهٴ میان سلولها", +DlgTableCellPad : "Ùاصلهٴ پرشده در سلول", +DlgTableCaption : "عنوان", +DlgTableSummary : "خلاصه", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "ویژگیهای سلول", +DlgCellWidth : "پهنا", +DlgCellWidthPx : "پیکسل", +DlgCellWidthPc : "درصد", +DlgCellHeight : "درازا", +DlgCellWordWrap : "شکستن واژه‌ها", +DlgCellWordWrapNotSet : "<تعین‌نشده>", +DlgCellWordWrapYes : "بله", +DlgCellWordWrapNo : "خیر", +DlgCellHorAlign : "چینش ÙاÙÙ‚ÛŒ", +DlgCellHorAlignNotSet : "<تعین‌نشده>", +DlgCellHorAlignLeft : "Ú†Ù¾", +DlgCellHorAlignCenter : "وسط", +DlgCellHorAlignRight: "راست", +DlgCellVerAlign : "چینش Ùعمودی", +DlgCellVerAlignNotSet : "<تعین‌نشده>", +DlgCellVerAlignTop : "بالا", +DlgCellVerAlignMiddle : "میان", +DlgCellVerAlignBottom : "پائین", +DlgCellVerAlignBaseline : "خط‌پایه", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "گستردگی سطرها", +DlgCellCollSpan : "گستردگی ستونها", +DlgCellBackColor : "رنگ پس‌زمینه", +DlgCellBorderColor : "رنگ لبه", +DlgCellBtnSelect : "برگزینید...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "جستجو Ùˆ جایگزینی", + +// Find Dialog +DlgFindTitle : "یاÙتن", +DlgFindFindBtn : "یاÙتن", +DlgFindNotFoundMsg : "متن موردنظر یاÙت نشد.", + +// Replace Dialog +DlgReplaceTitle : "جایگزینی", +DlgReplaceFindLbl : "چه‌چیز را می‌یابید:", +DlgReplaceReplaceLbl : "جایگزینی با:", +DlgReplaceCaseChk : "همسانی در بزرگی Ùˆ Ú©ÙˆÚ†Ú©ÛŒ نویسه‌ها", +DlgReplaceReplaceBtn : "جایگزینی", +DlgReplaceReplAllBtn : "جایگزینی همهٴ یاÙته‌ها", +DlgReplaceWordChk : "همسانی با واژهٴ کامل", + +// Paste Operations / Dialog +PasteErrorCut : "تنظیمات امنیتی مرورگر شما اجازه نمی‌دهد Ú©Ù‡ ویرایشگر به طور خودکار عملکردهای برش را انجام دهد. لطÙا با دکمه‌های صÙحه‌کلید این کار را انجام دهید (Ctrl+X).", +PasteErrorCopy : "تنظیمات امنیتی مرورگر شما اجازه نمی‌دهد Ú©Ù‡ ویرایشگر به طور خودکار عملکردهای کپی‌کردن را انجام دهد. لطÙا با دکمه‌های صÙحه‌کلید این کار را انجام دهید (Ctrl+C).", + +PasteAsText : "چسباندن به عنوان متن Ùساده", +PasteFromWord : "چسباندن از Word", + +DlgPasteMsg2 : "لطÙا متن را با کلیدهای (Ctrl+V) در این جعبهٴ متنی بچسبانید Ùˆ پذیرش را بزنید.", +DlgPasteSec : "به خاطر تنظیمات امنیتی مرورگر شما، ویرایشگر نمی‌تواند دسترسی مستقیم به داده‌های clipboard داشته باشد. شما باید دوباره آنرا در این پنجره بچسبانید.", +DlgPasteIgnoreFont : "چشم‌پوشی از تعاری٠نوع قلم", +DlgPasteRemoveStyles : "چشم‌پوشی از تعاری٠سبک (style)", + +// Color Picker +ColorAutomatic : "خودکار", +ColorMoreColors : "رنگهای بیشتر...", + +// Document Properties +DocProps : "ویژگیهای سند", + +// Anchor Dialog +DlgAnchorTitle : "ویژگیهای لنگر", +DlgAnchorName : "نام لنگر", +DlgAnchorErrorName : "لطÙا نام لنگر را بنویسید", + +// Speller Pages Dialog +DlgSpellNotInDic : "در واژه‌نامه یاÙت نشد", +DlgSpellChangeTo : "تغییر به", +DlgSpellBtnIgnore : "چشم‌پوشی", +DlgSpellBtnIgnoreAll : "چشم‌پوشی همه", +DlgSpellBtnReplace : "جایگزینی", +DlgSpellBtnReplaceAll : "جایگزینی همه", +DlgSpellBtnUndo : "واچینش", +DlgSpellNoSuggestions : "- پیشنهادی نیست -", +DlgSpellProgress : "بررسی املا در حال انجام...", +DlgSpellNoMispell : "بررسی املا انجام شد. هیچ غلط‌املائی یاÙت نشد", +DlgSpellNoChanges : "بررسی املا انجام شد. هیچ واژه‌ای تغییر نیاÙت", +DlgSpellOneChange : "بررسی املا انجام شد. یک واژه تغییر یاÙت", +DlgSpellManyChanges : "بررسی املا انجام شد. %1 واژه تغییر یاÙت", + +IeSpellDownload : "بررسی‌کنندهٴ املا نصب نشده است. آیا می‌خواهید آن را هم‌اکنون دریاÙت کنید؟", + +// Button Dialog +DlgButtonText : "متن (مقدار)", +DlgButtonType : "نوع", +DlgButtonTypeBtn : "دکمه", +DlgButtonTypeSbm : "Submit", +DlgButtonTypeRst : "بازنشانی (Reset)", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "نام", +DlgCheckboxValue : "مقدار", +DlgCheckboxSelected : "برگزیده", + +// Form Dialog +DlgFormName : "نام", +DlgFormAction : "رویداد", +DlgFormMethod : "متد", + +// Select Field Dialog +DlgSelectName : "نام", +DlgSelectValue : "مقدار", +DlgSelectSize : "اندازه", +DlgSelectLines : "خطوط", +DlgSelectChkMulti : "گزینش چندگانه Ùراهم باشد", +DlgSelectOpAvail : "گزینه‌های دردسترس", +DlgSelectOpText : "متن", +DlgSelectOpValue : "مقدار", +DlgSelectBtnAdd : "اÙزودن", +DlgSelectBtnModify : "ویرایش", +DlgSelectBtnUp : "بالا", +DlgSelectBtnDown : "پائین", +DlgSelectBtnSetValue : "تنظیم به عنوان مقدار Ùبرگزیده", +DlgSelectBtnDelete : "پاک‌کردن", + +// Textarea Dialog +DlgTextareaName : "نام", +DlgTextareaCols : "ستونها", +DlgTextareaRows : "سطرها", + +// Text Field Dialog +DlgTextName : "نام", +DlgTextValue : "مقدار", +DlgTextCharWidth : "پهنای نویسه", +DlgTextMaxChars : "بیشینهٴ نویسه‌ها", +DlgTextType : "نوع", +DlgTextTypeText : "متن", +DlgTextTypePass : "گذرواژه", + +// Hidden Field Dialog +DlgHiddenName : "نام", +DlgHiddenValue : "مقدار", + +// Bulleted List Dialog +BulletedListProp : "ویژگیهای Ùهرست نقطه‌ای", +NumberedListProp : "ویژگیهای Ùهرست شماره‌دار", +DlgLstStart : "آغاز", +DlgLstType : "نوع", +DlgLstTypeCircle : "دایره", +DlgLstTypeDisc : "قرص", +DlgLstTypeSquare : "چهارگوش", +DlgLstTypeNumbers : "شماره‌ها (1ØŒ 2ØŒ 3)", +DlgLstTypeLCase : "نویسه‌های Ú©ÙˆÚ†Ú© (aØŒ bØŒ c)", +DlgLstTypeUCase : "نویسه‌های بزرگ (AØŒ BØŒ C)", +DlgLstTypeSRoman : "شمارگان رومی Ú©ÙˆÚ†Ú© (iØŒ iiØŒ iii)", +DlgLstTypeLRoman : "شمارگان رومی بزرگ (IØŒ IIØŒ III)", + +// Document Properties Dialog +DlgDocGeneralTab : "عمومی", +DlgDocBackTab : "پس‌زمینه", +DlgDocColorsTab : "رنگها Ùˆ حاشیه‌ها", +DlgDocMetaTab : "Ùراداده", + +DlgDocPageTitle : "عنوان صÙحه", +DlgDocLangDir : "جهت زبان", +DlgDocLangDirLTR : "Ú†Ù¾ به راست (LTR(", +DlgDocLangDirRTL : "راست به Ú†Ù¾ (RTL(", +DlgDocLangCode : "کد زبان", +DlgDocCharSet : "رمزگذاری نویسه‌گان", +DlgDocCharSetCE : "اروپای مرکزی", +DlgDocCharSetCT : "چینی رسمی (Big5)", +DlgDocCharSetCR : "سیریلیک", +DlgDocCharSetGR : "یونانی", +DlgDocCharSetJP : "ژاپنی", +DlgDocCharSetKR : "کره‌ای", +DlgDocCharSetTR : "ترکی", +DlgDocCharSetUN : "یونیکÙد (UTF-8)", +DlgDocCharSetWE : "اروپای غربی", +DlgDocCharSetOther : "رمزگذاری نویسه‌گان دیگر", + +DlgDocDocType : "عنوان نوع سند", +DlgDocDocTypeOther : "عنوان نوع سند دیگر", +DlgDocIncXHTML : "شامل تعاری٠XHTML", +DlgDocBgColor : "رنگ پس‌زمینه", +DlgDocBgImage : "URL تصویر پس‌زمینه", +DlgDocBgNoScroll : "پس‌زمینهٴ پیمایش‌ناپذیر", +DlgDocCText : "متن", +DlgDocCLink : "پیوند", +DlgDocCVisited : "پیوند مشاهده‌شده", +DlgDocCActive : "پیوند Ùعال", +DlgDocMargins : "حاشیه‌های صÙحه", +DlgDocMaTop : "بالا", +DlgDocMaLeft : "Ú†Ù¾", +DlgDocMaRight : "راست", +DlgDocMaBottom : "پایین", +DlgDocMeIndex : "کلیدواژگان نمایه‌گذاری سند (با کاما جدا شوند)", +DlgDocMeDescr : "توصی٠سند", +DlgDocMeAuthor : "نویسنده", +DlgDocMeCopy : "کپی‌رایت", +DlgDocPreview : "پیش‌نمایش", + +// Templates Dialog +Templates : "الگوها", +DlgTemplatesTitle : "الگوهای محتویات", +DlgTemplatesSelMsg : "لطÙا الگوی موردنظر را برای بازکردن در ویرایشگر برگزینید
    (محتویات کنونی از دست خواهند رÙت):", +DlgTemplatesLoading : "بارگذاری Ùهرست الگوها. لطÙا صبر کنید...", +DlgTemplatesNoTpl : "(الگوئی تعری٠نشده است)", +DlgTemplatesReplace : "محتویات کنونی جایگزین شوند", + +// About Dialog +DlgAboutAboutTab : "درباره", +DlgAboutBrowserInfoTab : "اطلاعات مرورگر", +DlgAboutLicenseTab : "گواهینامه", +DlgAboutVersion : "نگارش", +DlgAboutInfo : "برای آگاهی بیشتر به این نشانی بروید", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/fi.js b/webdir/fckeditor/editor/lang/fi.js new file mode 100644 index 0000000..f59fda2 --- /dev/null +++ b/webdir/fckeditor/editor/lang/fi.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Finnish language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Piilota työkalurivi", +ToolbarExpand : "Näytä työkalurivi", + +// Toolbar Items and Context Menu +Save : "Tallenna", +NewPage : "Tyhjennä", +Preview : "Esikatsele", +Cut : "Leikkaa", +Copy : "Kopioi", +Paste : "Liitä", +PasteText : "Liitä tekstinä", +PasteWord : "Liitä Wordista", +Print : "Tulosta", +SelectAll : "Valitse kaikki", +RemoveFormat : "Poista muotoilu", +InsertLinkLbl : "Linkki", +InsertLink : "Lisää linkki/muokkaa linkkiä", +RemoveLink : "Poista linkki", +VisitLink : "Open Link", //MISSING +Anchor : "Lisää ankkuri/muokkaa ankkuria", +AnchorDelete : "Poista ankkuri", +InsertImageLbl : "Kuva", +InsertImage : "Lisää kuva/muokkaa kuvaa", +InsertFlashLbl : "Flash", +InsertFlash : "Lisää/muokkaa Flashia", +InsertTableLbl : "Taulu", +InsertTable : "Lisää taulu/muokkaa taulua", +InsertLineLbl : "Murtoviiva", +InsertLine : "Lisää murtoviiva", +InsertSpecialCharLbl: "Erikoismerkki", +InsertSpecialChar : "Lisää erikoismerkki", +InsertSmileyLbl : "Hymiö", +InsertSmiley : "Lisää hymiö", +About : "FCKeditorista", +Bold : "Lihavoitu", +Italic : "Kursivoitu", +Underline : "Alleviivattu", +StrikeThrough : "Yliviivattu", +Subscript : "Alaindeksi", +Superscript : "Yläindeksi", +LeftJustify : "Tasaa vasemmat reunat", +CenterJustify : "Keskitä", +RightJustify : "Tasaa oikeat reunat", +BlockJustify : "Tasaa molemmat reunat", +DecreaseIndent : "Pienennä sisennystä", +IncreaseIndent : "Suurenna sisennystä", +Blockquote : "Lainaus", +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "Kumoa", +Redo : "Toista", +NumberedListLbl : "Numerointi", +NumberedList : "Lisää/poista numerointi", +BulletedListLbl : "Luottelomerkit", +BulletedList : "Lisää/poista luottelomerkit", +ShowTableBorders : "Näytä taulun rajat", +ShowDetails : "Näytä muotoilu", +Style : "Tyyli", +FontFormat : "Muotoilu", +Font : "Fontti", +FontSize : "Koko", +TextColor : "Tekstiväri", +BGColor : "Taustaväri", +Source : "Koodi", +Find : "Etsi", +Replace : "Korvaa", +SpellCheck : "Tarkista oikeinkirjoitus", +UniversalKeyboard : "Universaali näppäimistö", +PageBreakLbl : "Sivun vaihto", +PageBreak : "Lisää sivun vaihto", + +Form : "Lomake", +Checkbox : "Valintaruutu", +RadioButton : "Radiopainike", +TextField : "Tekstikenttä", +Textarea : "Tekstilaatikko", +HiddenField : "Piilokenttä", +Button : "Painike", +SelectionField : "Valintakenttä", +ImageButton : "Kuvapainike", + +FitWindow : "Suurenna editori koko ikkunaan", +ShowBlocks : "Näytä elementit", + +// Context Menu +EditLink : "Muokkaa linkkiä", +CellCM : "Solu", +RowCM : "Rivi", +ColumnCM : "Sarake", +InsertRowAfter : "Lisää rivi alapuolelle", +InsertRowBefore : "Lisää rivi yläpuolelle", +DeleteRows : "Poista rivit", +InsertColumnAfter : "Lisää sarake oikealle", +InsertColumnBefore : "Lisää sarake vasemmalle", +DeleteColumns : "Poista sarakkeet", +InsertCellAfter : "Lisää solu perään", +InsertCellBefore : "Lisää solu eteen", +DeleteCells : "Poista solut", +MergeCells : "Yhdistä solut", +MergeRight : "Yhdistä oikealla olevan kanssa", +MergeDown : "Yhdistä alla olevan kanssa", +HorizontalSplitCell : "Jaa solu vaakasuunnassa", +VerticalSplitCell : "Jaa solu pystysuunnassa", +TableDelete : "Poista taulu", +CellProperties : "Solun ominaisuudet", +TableProperties : "Taulun ominaisuudet", +ImageProperties : "Kuvan ominaisuudet", +FlashProperties : "Flash ominaisuudet", + +AnchorProp : "Ankkurin ominaisuudet", +ButtonProp : "Painikkeen ominaisuudet", +CheckboxProp : "Valintaruudun ominaisuudet", +HiddenFieldProp : "Piilokentän ominaisuudet", +RadioButtonProp : "Radiopainikkeen ominaisuudet", +ImageButtonProp : "Kuvapainikkeen ominaisuudet", +TextFieldProp : "Tekstikentän ominaisuudet", +SelectionFieldProp : "Valintakentän ominaisuudet", +TextareaProp : "Tekstilaatikon ominaisuudet", +FormProp : "Lomakkeen ominaisuudet", + +FontFormats : "Normaali;Muotoiltu;Osoite;Otsikko 1;Otsikko 2;Otsikko 3;Otsikko 4;Otsikko 5;Otsikko 6", + +// Alerts and Messages +ProcessingXHTML : "Prosessoidaan XHTML:ää. Odota hetki...", +Done : "Valmis", +PasteWordConfirm : "Teksti, jonka haluat liittää, näyttää olevan kopioitu Wordista. Haluatko puhdistaa sen ennen liittämistä?", +NotCompatiblePaste : "Tämä komento toimii vain Internet Explorer 5.5:ssa tai uudemmassa. Haluatko liittää ilman puhdistusta?", +UnknownToolbarItem : "Tuntemanton työkalu \"%1\"", +UnknownCommand : "Tuntematon komento \"%1\"", +NotImplemented : "Komentoa ei ole liitetty sovellukseen", +UnknownToolbarSet : "Työkalukokonaisuus \"%1\" ei ole olemassa", +NoActiveX : "Selaimesi turvallisuusasetukset voivat rajoittaa joitain editorin ominaisuuksia. Sinun pitää ottaa käyttöön asetuksista \"Suorita ActiveX komponentit ja -plugin-laajennukset\". Saatat kohdata virheitä ja huomata puuttuvia ominaisuuksia.", +BrowseServerBlocked : "Resurssiselainta ei voitu avata. Varmista, että ponnahdusikkunoiden estäjät eivät ole päällä.", +DialogBlocked : "Apuikkunaa ei voitu avaata. Varmista, että ponnahdusikkunoiden estäjät eivät ole päällä.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Peruuta", +DlgBtnClose : "Sulje", +DlgBtnBrowseServer : "Selaa palvelinta", +DlgAdvancedTag : "Lisäominaisuudet", +DlgOpOther : "Muut", +DlgInfoTab : "Info", +DlgAlertUrl : "Lisää URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Tunniste", +DlgGenLangDir : "Kielen suunta", +DlgGenLangDirLtr : "Vasemmalta oikealle (LTR)", +DlgGenLangDirRtl : "Oikealta vasemmalle (RTL)", +DlgGenLangCode : "Kielikoodi", +DlgGenAccessKey : "Pikanäppäin", +DlgGenName : "Nimi", +DlgGenTabIndex : "Tabulaattori indeksi", +DlgGenLongDescr : "Pitkän kuvauksen URL", +DlgGenClass : "Tyyliluokat", +DlgGenTitle : "Avustava otsikko", +DlgGenContType : "Avustava sisällön tyyppi", +DlgGenLinkCharset : "Linkitetty kirjaimisto", +DlgGenStyle : "Tyyli", + +// Image Dialog +DlgImgTitle : "Kuvan ominaisuudet", +DlgImgInfoTab : "Kuvan tiedot", +DlgImgBtnUpload : "Lähetä palvelimelle", +DlgImgURL : "Osoite", +DlgImgUpload : "Lisää kuva", +DlgImgAlt : "Vaihtoehtoinen teksti", +DlgImgWidth : "Leveys", +DlgImgHeight : "Korkeus", +DlgImgLockRatio : "Lukitse suhteet", +DlgBtnResetSize : "Alkuperäinen koko", +DlgImgBorder : "Raja", +DlgImgHSpace : "Vaakatila", +DlgImgVSpace : "Pystytila", +DlgImgAlign : "Kohdistus", +DlgImgAlignLeft : "Vasemmalle", +DlgImgAlignAbsBottom: "Aivan alas", +DlgImgAlignAbsMiddle: "Aivan keskelle", +DlgImgAlignBaseline : "Alas (teksti)", +DlgImgAlignBottom : "Alas", +DlgImgAlignMiddle : "Keskelle", +DlgImgAlignRight : "Oikealle", +DlgImgAlignTextTop : "Ylös (teksti)", +DlgImgAlignTop : "Ylös", +DlgImgPreview : "Esikatselu", +DlgImgAlertUrl : "Kirjoita kuvan osoite (URL)", +DlgImgLinkTab : "Linkki", + +// Flash Dialog +DlgFlashTitle : "Flash ominaisuudet", +DlgFlashChkPlay : "Automaattinen käynnistys", +DlgFlashChkLoop : "Toisto", +DlgFlashChkMenu : "Näytä Flash-valikko", +DlgFlashScale : "Levitä", +DlgFlashScaleAll : "Näytä kaikki", +DlgFlashScaleNoBorder : "Ei rajaa", +DlgFlashScaleFit : "Tarkka koko", + +// Link Dialog +DlgLnkWindowTitle : "Linkki", +DlgLnkInfoTab : "Linkin tiedot", +DlgLnkTargetTab : "Kohde", + +DlgLnkType : "Linkkityyppi", +DlgLnkTypeURL : "Osoite", +DlgLnkTypeAnchor : "Ankkuri tässä sivussa", +DlgLnkTypeEMail : "Sähköposti", +DlgLnkProto : "Protokolla", +DlgLnkProtoOther : "", +DlgLnkURL : "Osoite", +DlgLnkAnchorSel : "Valitse ankkuri", +DlgLnkAnchorByName : "Ankkurin nimen mukaan", +DlgLnkAnchorById : "Ankkurin ID:n mukaan", +DlgLnkNoAnchors : "(Ei ankkureita tässä dokumentissa)", +DlgLnkEMail : "Sähköpostiosoite", +DlgLnkEMailSubject : "Aihe", +DlgLnkEMailBody : "Viesti", +DlgLnkUpload : "Lisää tiedosto", +DlgLnkBtnUpload : "Lähetä palvelimelle", + +DlgLnkTarget : "Kohde", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Uusi ikkuna (_blank)", +DlgLnkTargetParent : "Emoikkuna (_parent)", +DlgLnkTargetSelf : "Sama ikkuna (_self)", +DlgLnkTargetTop : "Päällimmäisin ikkuna (_top)", +DlgLnkTargetFrameName : "Kohdekehyksen nimi", +DlgLnkPopWinName : "Popup ikkunan nimi", +DlgLnkPopWinFeat : "Popup ikkunan ominaisuudet", +DlgLnkPopResize : "Venytettävä", +DlgLnkPopLocation : "Osoiterivi", +DlgLnkPopMenu : "Valikkorivi", +DlgLnkPopScroll : "Vierityspalkit", +DlgLnkPopStatus : "Tilarivi", +DlgLnkPopToolbar : "Vakiopainikkeet", +DlgLnkPopFullScrn : "Täysi ikkuna (IE)", +DlgLnkPopDependent : "Riippuva (Netscape)", +DlgLnkPopWidth : "Leveys", +DlgLnkPopHeight : "Korkeus", +DlgLnkPopLeft : "Vasemmalta (px)", +DlgLnkPopTop : "Ylhäältä (px)", + +DlnLnkMsgNoUrl : "Linkille on kirjoitettava URL", +DlnLnkMsgNoEMail : "Kirjoita sähköpostiosoite", +DlnLnkMsgNoAnchor : "Valitse ankkuri", +DlnLnkMsgInvPopName : "Popup-ikkunan nimi pitää alkaa aakkosella ja ei saa sisältää välejä", + +// Color Dialog +DlgColorTitle : "Valitse väri", +DlgColorBtnClear : "Tyhjennä", +DlgColorHighlight : "Kohdalla", +DlgColorSelected : "Valittu", + +// Smiley Dialog +DlgSmileyTitle : "Lisää hymiö", + +// Special Character Dialog +DlgSpecialCharTitle : "Valitse erikoismerkki", + +// Table Dialog +DlgTableTitle : "Taulun ominaisuudet", +DlgTableRows : "Rivit", +DlgTableColumns : "Sarakkeet", +DlgTableBorder : "Rajan paksuus", +DlgTableAlign : "Kohdistus", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Vasemmalle", +DlgTableAlignCenter : "Keskelle", +DlgTableAlignRight : "Oikealle", +DlgTableWidth : "Leveys", +DlgTableWidthPx : "pikseliä", +DlgTableWidthPc : "prosenttia", +DlgTableHeight : "Korkeus", +DlgTableCellSpace : "Solujen väli", +DlgTableCellPad : "Solujen sisennys", +DlgTableCaption : "Otsikko", +DlgTableSummary : "Yhteenveto", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Solun ominaisuudet", +DlgCellWidth : "Leveys", +DlgCellWidthPx : "pikseliä", +DlgCellWidthPc : "prosenttia", +DlgCellHeight : "Korkeus", +DlgCellWordWrap : "Tekstikierrätys", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Kyllä", +DlgCellWordWrapNo : "Ei", +DlgCellHorAlign : "Vaakakohdistus", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Vasemmalle", +DlgCellHorAlignCenter : "Keskelle", +DlgCellHorAlignRight: "Oikealle", +DlgCellVerAlign : "Pystykohdistus", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Ylös", +DlgCellVerAlignMiddle : "Keskelle", +DlgCellVerAlignBottom : "Alas", +DlgCellVerAlignBaseline : "Tekstin alas", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Rivin jatkuvuus", +DlgCellCollSpan : "Sarakkeen jatkuvuus", +DlgCellBackColor : "Taustaväri", +DlgCellBorderColor : "Rajan väri", +DlgCellBtnSelect : "Valitse...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Etsi ja korvaa", + +// Find Dialog +DlgFindTitle : "Etsi", +DlgFindFindBtn : "Etsi", +DlgFindNotFoundMsg : "Etsittyä tekstiä ei löytynyt.", + +// Replace Dialog +DlgReplaceTitle : "Korvaa", +DlgReplaceFindLbl : "Etsi mitä:", +DlgReplaceReplaceLbl : "Korvaa tällä:", +DlgReplaceCaseChk : "Sama kirjainkoko", +DlgReplaceReplaceBtn : "Korvaa", +DlgReplaceReplAllBtn : "Korvaa kaikki", +DlgReplaceWordChk : "Koko sana", + +// Paste Operations / Dialog +PasteErrorCut : "Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).", +PasteErrorCopy : "Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).", + +PasteAsText : "Liitä tekstinä", +PasteFromWord : "Liitä Wordista", + +DlgPasteMsg2 : "Liitä painamalla (Ctrl+V) ja painamalla OK.", +DlgPasteSec : "Selaimesi turva-asetukset eivät salli editorin käyttää leikepöytää suoraan. Sinun pitää suorittaa liittäminen tässä ikkunassa.", +DlgPasteIgnoreFont : "Jätä huomioimatta fonttimääritykset", +DlgPasteRemoveStyles : "Poista tyylimääritykset", + +// Color Picker +ColorAutomatic : "Automaattinen", +ColorMoreColors : "Lisää värejä...", + +// Document Properties +DocProps : "Dokumentin ominaisuudet", + +// Anchor Dialog +DlgAnchorTitle : "Ankkurin ominaisuudet", +DlgAnchorName : "Nimi", +DlgAnchorErrorName : "Ankkurille on kirjoitettava nimi", + +// Speller Pages Dialog +DlgSpellNotInDic : "Ei sanakirjassa", +DlgSpellChangeTo : "Vaihda", +DlgSpellBtnIgnore : "Jätä huomioimatta", +DlgSpellBtnIgnoreAll : "Jätä kaikki huomioimatta", +DlgSpellBtnReplace : "Korvaa", +DlgSpellBtnReplaceAll : "Korvaa kaikki", +DlgSpellBtnUndo : "Kumoa", +DlgSpellNoSuggestions : "Ei ehdotuksia", +DlgSpellProgress : "Tarkistus käynnissä...", +DlgSpellNoMispell : "Tarkistus valmis: Ei virheitä", +DlgSpellNoChanges : "Tarkistus valmis: Yhtään sanaa ei muutettu", +DlgSpellOneChange : "Tarkistus valmis: Yksi sana muutettiin", +DlgSpellManyChanges : "Tarkistus valmis: %1 sanaa muutettiin", + +IeSpellDownload : "Oikeinkirjoituksen tarkistusta ei ole asennettu. Haluatko ladata sen nyt?", + +// Button Dialog +DlgButtonText : "Teksti (arvo)", +DlgButtonType : "Tyyppi", +DlgButtonTypeBtn : "Painike", +DlgButtonTypeSbm : "Lähetä", +DlgButtonTypeRst : "Tyhjennä", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Nimi", +DlgCheckboxValue : "Arvo", +DlgCheckboxSelected : "Valittu", + +// Form Dialog +DlgFormName : "Nimi", +DlgFormAction : "Toiminto", +DlgFormMethod : "Tapa", + +// Select Field Dialog +DlgSelectName : "Nimi", +DlgSelectValue : "Arvo", +DlgSelectSize : "Koko", +DlgSelectLines : "Rivit", +DlgSelectChkMulti : "Salli usea valinta", +DlgSelectOpAvail : "Ominaisuudet", +DlgSelectOpText : "Teksti", +DlgSelectOpValue : "Arvo", +DlgSelectBtnAdd : "Lisää", +DlgSelectBtnModify : "Muuta", +DlgSelectBtnUp : "Ylös", +DlgSelectBtnDown : "Alas", +DlgSelectBtnSetValue : "Aseta valituksi", +DlgSelectBtnDelete : "Poista", + +// Textarea Dialog +DlgTextareaName : "Nimi", +DlgTextareaCols : "Sarakkeita", +DlgTextareaRows : "Rivejä", + +// Text Field Dialog +DlgTextName : "Nimi", +DlgTextValue : "Arvo", +DlgTextCharWidth : "Leveys", +DlgTextMaxChars : "Maksimi merkkimäärä", +DlgTextType : "Tyyppi", +DlgTextTypeText : "Teksti", +DlgTextTypePass : "Salasana", + +// Hidden Field Dialog +DlgHiddenName : "Nimi", +DlgHiddenValue : "Arvo", + +// Bulleted List Dialog +BulletedListProp : "Luettelon ominaisuudet", +NumberedListProp : "Numeroinnin ominaisuudet", +DlgLstStart : "Alku", +DlgLstType : "Tyyppi", +DlgLstTypeCircle : "Kehä", +DlgLstTypeDisc : "Ympyrä", +DlgLstTypeSquare : "Neliö", +DlgLstTypeNumbers : "Numerot (1, 2, 3)", +DlgLstTypeLCase : "Pienet kirjaimet (a, b, c)", +DlgLstTypeUCase : "Isot kirjaimet (A, B, C)", +DlgLstTypeSRoman : "Pienet roomalaiset numerot (i, ii, iii)", +DlgLstTypeLRoman : "Isot roomalaiset numerot (Ii, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Yleiset", +DlgDocBackTab : "Tausta", +DlgDocColorsTab : "Värit ja marginaalit", +DlgDocMetaTab : "Meta-tieto", + +DlgDocPageTitle : "Sivun nimi", +DlgDocLangDir : "Kielen suunta", +DlgDocLangDirLTR : "Vasemmalta oikealle (LTR)", +DlgDocLangDirRTL : "Oikealta vasemmalle (RTL)", +DlgDocLangCode : "Kielikoodi", +DlgDocCharSet : "Merkistökoodaus", +DlgDocCharSetCE : "Keskieurooppalainen", +DlgDocCharSetCT : "Kiina, perinteinen (Big5)", +DlgDocCharSetCR : "Kyrillinen", +DlgDocCharSetGR : "Kreikka", +DlgDocCharSetJP : "Japani", +DlgDocCharSetKR : "Korealainen", +DlgDocCharSetTR : "Turkkilainen", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Länsieurooppalainen", +DlgDocCharSetOther : "Muu merkistökoodaus", + +DlgDocDocType : "Dokumentin tyyppi", +DlgDocDocTypeOther : "Muu dokumentin tyyppi", +DlgDocIncXHTML : "Lisää XHTML julistukset", +DlgDocBgColor : "Taustaväri", +DlgDocBgImage : "Taustakuva", +DlgDocBgNoScroll : "Paikallaanpysyvä tausta", +DlgDocCText : "Teksti", +DlgDocCLink : "Linkki", +DlgDocCVisited : "Vierailtu linkki", +DlgDocCActive : "Aktiivinen linkki", +DlgDocMargins : "Sivun marginaalit", +DlgDocMaTop : "Ylä", +DlgDocMaLeft : "Vasen", +DlgDocMaRight : "Oikea", +DlgDocMaBottom : "Ala", +DlgDocMeIndex : "Hakusanat (pilkulla erotettuna)", +DlgDocMeDescr : "Kuvaus", +DlgDocMeAuthor : "Tekijä", +DlgDocMeCopy : "Tekijänoikeudet", +DlgDocPreview : "Esikatselu", + +// Templates Dialog +Templates : "Pohjat", +DlgTemplatesTitle : "Sisältöpohjat", +DlgTemplatesSelMsg : "Valitse pohja editoriin
    (aiempi sisältö menetetään):", +DlgTemplatesLoading : "Ladataan listaa pohjista. Hetkinen...", +DlgTemplatesNoTpl : "(Ei määriteltyjä pohjia)", +DlgTemplatesReplace : "Korvaa editorin koko sisältö", + +// About Dialog +DlgAboutAboutTab : "Editorista", +DlgAboutBrowserInfoTab : "Selaimen tiedot", +DlgAboutLicenseTab : "Lisenssi", +DlgAboutVersion : "versio", +DlgAboutInfo : "Lisää tietoa osoitteesta", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/fo.js b/webdir/fckeditor/editor/lang/fo.js new file mode 100644 index 0000000..24e4c6f --- /dev/null +++ b/webdir/fckeditor/editor/lang/fo.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Faroese language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Fjal amboðsbjálkan", +ToolbarExpand : "Vís amboðsbjálkan", + +// Toolbar Items and Context Menu +Save : "Goym", +NewPage : "Nýggj síða", +Preview : "Frumsýning", +Cut : "Kvett", +Copy : "Avrita", +Paste : "Innrita", +PasteText : "Innrita reinan tekst", +PasteWord : "Innrita frá Word", +Print : "Prenta", +SelectAll : "Markera alt", +RemoveFormat : "Strika sniðgeving", +InsertLinkLbl : "Tilknýti", +InsertLink : "Ger/broyt tilknýti", +RemoveLink : "Strika tilknýti", +VisitLink : "Opna tilknýti", +Anchor : "Ger/broyt marknastein", +AnchorDelete : "Strika marknastein", +InsertImageLbl : "Myndir", +InsertImage : "Set inn/broyt mynd", +InsertFlashLbl : "Flash", +InsertFlash : "Set inn/broyt Flash", +InsertTableLbl : "Tabell", +InsertTable : "Set inn/broyt tabell", +InsertLineLbl : "Linja", +InsertLine : "Ger vatnrætta linju", +InsertSpecialCharLbl: "Sertekn", +InsertSpecialChar : "Set inn sertekn", +InsertSmileyLbl : "Smiley", +InsertSmiley : "Set inn Smiley", +About : "Um FCKeditor", +Bold : "Feit skrift", +Italic : "Skráskrift", +Underline : "Undirstrikað", +StrikeThrough : "Yvirstrikað", +Subscript : "Lækkað skrift", +Superscript : "Hækkað skrift", +LeftJustify : "Vinstrasett", +CenterJustify : "Miðsett", +RightJustify : "Høgrasett", +BlockJustify : "Javnir tekstkantar", +DecreaseIndent : "Minka reglubrotarinntriv", +IncreaseIndent : "Økja reglubrotarinntriv", +Blockquote : "Blockquote", +CreateDiv : "Ger DIV øki", +EditDiv : "Broyt DIV øki", +DeleteDiv : "Strika DIV øki", +Undo : "Angra", +Redo : "Vend aftur", +NumberedListLbl : "Talmerktur listi", +NumberedList : "Ger/strika talmerktan lista", +BulletedListLbl : "Punktmerktur listi", +BulletedList : "Ger/strika punktmerktan lista", +ShowTableBorders : "Vís tabellbordar", +ShowDetails : "Vís í smálutum", +Style : "Typografi", +FontFormat : "Skriftsnið", +Font : "Skrift", +FontSize : "Skriftstødd", +TextColor : "Tekstlitur", +BGColor : "Bakgrundslitur", +Source : "Kelda", +Find : "Leita", +Replace : "Yvirskriva", +SpellCheck : "Kanna stavseting", +UniversalKeyboard : "Knappaborð", +PageBreakLbl : "Síðuskift", +PageBreak : "Ger síðuskift", + +Form : "Formur", +Checkbox : "Flugubein", +RadioButton : "Radioknøttur", +TextField : "Tekstteigur", +Textarea : "Tekstumráði", +HiddenField : "Fjaldur teigur", +Button : "Knøttur", +SelectionField : "Valskrá", +ImageButton : "Myndaknøttur", + +FitWindow : "Set tekstviðgera til fulla stødd", +ShowBlocks : "Vís blokkar", + +// Context Menu +EditLink : "Broyt tilknýti", +CellCM : "Meski", +RowCM : "Rað", +ColumnCM : "Kolonna", +InsertRowAfter : "Set rað inn aftaná", +InsertRowBefore : "Set rað inn áðrenn", +DeleteRows : "Strika røðir", +InsertColumnAfter : "Set kolonnu inn aftaná", +InsertColumnBefore : "Set kolonnu inn áðrenn", +DeleteColumns : "Strika kolonnur", +InsertCellAfter : "Set meska inn aftaná", +InsertCellBefore : "Set meska inn áðrenn", +DeleteCells : "Strika meskar", +MergeCells : "Flætta meskar", +MergeRight : "Flætta meskar til høgru", +MergeDown : "Flætta saman", +HorizontalSplitCell : "Kloyv meska vatnrætt", +VerticalSplitCell : "Kloyv meska loddrætt", +TableDelete : "Strika tabell", +CellProperties : "Meskueginleikar", +TableProperties : "Tabelleginleikar", +ImageProperties : "Myndaeginleikar", +FlashProperties : "Flash eginleikar", + +AnchorProp : "Eginleikar fyri marknastein", +ButtonProp : "Eginleikar fyri knøtt", +CheckboxProp : "Eginleikar fyri flugubein", +HiddenFieldProp : "Eginleikar fyri fjaldan teig", +RadioButtonProp : "Eginleikar fyri radioknøtt", +ImageButtonProp : "Eginleikar fyri myndaknøtt", +TextFieldProp : "Eginleikar fyri tekstteig", +SelectionFieldProp : "Eginleikar fyri valskrá", +TextareaProp : "Eginleikar fyri tekstumráði", +FormProp : "Eginleikar fyri Form", + +FontFormats : "Vanligt;Sniðgivið;Adressa;Yvirskrift 1;Yvirskrift 2;Yvirskrift 3;Yvirskrift 4;Yvirskrift 5;Yvirskrift 6", + +// Alerts and Messages +ProcessingXHTML : "XHTML verður viðgjørt. Bíða við...", +Done : "Liðugt", +PasteWordConfirm : "Teksturin, royndur verður at seta inn, tykist at stava frá Word. Vilt tú reinsa tekstin, áðrenn hann verður settur inn?", +NotCompatiblePaste : "Hetta er bert tøkt í Internet Explorer 5.5 og nýggjari. Vilt tú seta tekstin inn kortini - óreinsaðan?", +UnknownToolbarItem : "Ókendur lutur í amboðsbjálkanum \"%1\"", +UnknownCommand : "Ókend kommando \"%1\"", +NotImplemented : "Hetta er ikki tøkt í hesi útgávuni", +UnknownToolbarSet : "Amboðsbjálkin \"%1\" finst ikki", +NoActiveX : "Trygdaruppsetingin í alnótskaganum kann sum er avmarka onkrar hentleikar í tekstviðgeranum. Tú mást loyva møguleikanum \"Run/Kør ActiveX controls and plug-ins\". Tú kanst uppliva feilir og ávaringar um tvørrandi hentleikar.", +BrowseServerBlocked : "Ambætarakagin kundi ikki opnast. Tryggja tær, at allar pop-up forðingar eru óvirknar.", +DialogBlocked : "Tað eyðnaðist ikki at opna samskiftisrútin. Tryggja tær, at allar pop-up forðingar eru óvirknar.", +VisitLinkBlocked : "Tað eyðnaðist ikki at opna nýggjan rút. Tryggja tær, at allar pop-up forðingar eru óvirknar.", + +// Dialogs +DlgBtnOK : "Góðkent", +DlgBtnCancel : "Avlýst", +DlgBtnClose : "Lat aftur", +DlgBtnBrowseServer : "Ambætarakagi", +DlgAdvancedTag : "Fjølbroytt", +DlgOpOther : "", +DlgInfoTab : "Upplýsingar", +DlgAlertUrl : "Vinarliga veit ein URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Tekstkós", +DlgGenLangDirLtr : "Frá vinstru til høgru (LTR)", +DlgGenLangDirRtl : "Frá høgru til vinstru (RTL)", +DlgGenLangCode : "Málkoda", +DlgGenAccessKey : "Snarvegisknappur", +DlgGenName : "Navn", +DlgGenTabIndex : "Inntriv indeks", +DlgGenLongDescr : "Víðkað URL frágreiðing", +DlgGenClass : "Typografi klassar", +DlgGenTitle : "Vegleiðandi heiti", +DlgGenContType : "Vegleiðandi innihaldsslag", +DlgGenLinkCharset : "Atknýtt teknsett", +DlgGenStyle : "Typografi", + +// Image Dialog +DlgImgTitle : "Myndaeginleikar", +DlgImgInfoTab : "Myndaupplýsingar", +DlgImgBtnUpload : "Send til ambætaran", +DlgImgURL : "URL", +DlgImgUpload : "Send", +DlgImgAlt : "Alternativur tekstur", +DlgImgWidth : "Breidd", +DlgImgHeight : "Hædd", +DlgImgLockRatio : "Læs lutfallið", +DlgBtnResetSize : "Upprunastødd", +DlgImgBorder : "Bordi", +DlgImgHSpace : "Høgri breddi", +DlgImgVSpace : "Vinstri breddi", +DlgImgAlign : "Justering", +DlgImgAlignLeft : "Vinstra", +DlgImgAlignAbsBottom: "Abs botnur", +DlgImgAlignAbsMiddle: "Abs miðja", +DlgImgAlignBaseline : "Basislinja", +DlgImgAlignBottom : "Botnur", +DlgImgAlignMiddle : "Miðja", +DlgImgAlignRight : "Høgra", +DlgImgAlignTextTop : "Tekst toppur", +DlgImgAlignTop : "Ovast", +DlgImgPreview : "Frumsýning", +DlgImgAlertUrl : "Rita slóðina til myndina", +DlgImgLinkTab : "Tilknýti", + +// Flash Dialog +DlgFlashTitle : "Flash eginleikar", +DlgFlashChkPlay : "Avspælingin byrjar sjálv", +DlgFlashChkLoop : "Endurspæl", +DlgFlashChkMenu : "Ger Flash skrá virkna", +DlgFlashScale : "Skalering", +DlgFlashScaleAll : "Vís alt", +DlgFlashScaleNoBorder : "Eingin bordi", +DlgFlashScaleFit : "Neyv skalering", + +// Link Dialog +DlgLnkWindowTitle : "Tilknýti", +DlgLnkInfoTab : "Tilknýtis upplýsingar", +DlgLnkTargetTab : "Mál", + +DlgLnkType : "Tilknýtisslag", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Tilknýti til marknastein í tekstinum", +DlgLnkTypeEMail : "Teldupostur", +DlgLnkProto : "Protokoll", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Vel ein marknastein", +DlgLnkAnchorByName : "Eftir navni á marknasteini", +DlgLnkAnchorById : "Eftir element Id", +DlgLnkNoAnchors : "(Eingir marknasteinar eru í hesum dokumentið)", +DlgLnkEMail : "Teldupost-adressa", +DlgLnkEMailSubject : "Evni", +DlgLnkEMailBody : "Breyðtekstur", +DlgLnkUpload : "Send til ambætaran", +DlgLnkBtnUpload : "Send til ambætaran", + +DlgLnkTarget : "Mál", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Nýtt vindeyga (_blank)", +DlgLnkTargetParent : "Upphavliga vindeygað (_parent)", +DlgLnkTargetSelf : "Sama vindeygað (_self)", +DlgLnkTargetTop : "Alt vindeygað (_top)", +DlgLnkTargetFrameName : "Vís navn vindeygans", +DlgLnkPopWinName : "Popup vindeygans navn", +DlgLnkPopWinFeat : "Popup vindeygans víðkaðu eginleikar", +DlgLnkPopResize : "Kann broyta stødd", +DlgLnkPopLocation : "Adressulinja", +DlgLnkPopMenu : "Skrábjálki", +DlgLnkPopScroll : "Rullibjálki", +DlgLnkPopStatus : "Støðufrágreiðingarbjálki", +DlgLnkPopToolbar : "Amboðsbjálki", +DlgLnkPopFullScrn : "Fullur skermur (IE)", +DlgLnkPopDependent : "Bundið (Netscape)", +DlgLnkPopWidth : "Breidd", +DlgLnkPopHeight : "Hædd", +DlgLnkPopLeft : "Frástøða frá vinstru", +DlgLnkPopTop : "Frástøða frá íerva", + +DlnLnkMsgNoUrl : "Vinarliga skriva tilknýti (URL)", +DlnLnkMsgNoEMail : "Vinarliga skriva teldupost-adressu", +DlnLnkMsgNoAnchor : "Vinarliga vel marknastein", +DlnLnkMsgInvPopName : "Popup navnið má byrja við bókstavi og má ikki hava millumrúm", + +// Color Dialog +DlgColorTitle : "Vel lit", +DlgColorBtnClear : "Strika alt", +DlgColorHighlight : "Framhevja", +DlgColorSelected : "Valt", + +// Smiley Dialog +DlgSmileyTitle : "Vel Smiley", + +// Special Character Dialog +DlgSpecialCharTitle : "Vel sertekn", + +// Table Dialog +DlgTableTitle : "Eginleikar fyri tabell", +DlgTableRows : "Røðir", +DlgTableColumns : "Kolonnur", +DlgTableBorder : "Bordabreidd", +DlgTableAlign : "Justering", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Vinstrasett", +DlgTableAlignCenter : "Miðsett", +DlgTableAlignRight : "Høgrasett", +DlgTableWidth : "Breidd", +DlgTableWidthPx : "pixels", +DlgTableWidthPc : "prosent", +DlgTableHeight : "Hædd", +DlgTableCellSpace : "Fjarstøða millum meskar", +DlgTableCellPad : "Meskubreddi", +DlgTableCaption : "Tabellfrágreiðing", +DlgTableSummary : "Samandráttur", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Mesku eginleikar", +DlgCellWidth : "Breidd", +DlgCellWidthPx : "pixels", +DlgCellWidthPc : "prosent", +DlgCellHeight : "Hædd", +DlgCellWordWrap : "Orðkloyving", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Ja", +DlgCellWordWrapNo : "Nei", +DlgCellHorAlign : "Vatnrøtt justering", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Vinstrasett", +DlgCellHorAlignCenter : "Miðsett", +DlgCellHorAlignRight: "Høgrasett", +DlgCellVerAlign : "Lodrøtt justering", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Ovast", +DlgCellVerAlignMiddle : "Miðjan", +DlgCellVerAlignBottom : "Niðast", +DlgCellVerAlignBaseline : "Basislinja", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Røðir, meskin fevnir um", +DlgCellCollSpan : "Kolonnur, meskin fevnir um", +DlgCellBackColor : "Bakgrundslitur", +DlgCellBorderColor : "Litur á borda", +DlgCellBtnSelect : "Vel...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Finn og broyt", + +// Find Dialog +DlgFindTitle : "Finn", +DlgFindFindBtn : "Finn", +DlgFindNotFoundMsg : "Leititeksturin varð ikki funnin", + +// Replace Dialog +DlgReplaceTitle : "Yvirskriva", +DlgReplaceFindLbl : "Finn:", +DlgReplaceReplaceLbl : "Yvirskriva við:", +DlgReplaceCaseChk : "Munur á stórum og smáðum bókstavum", +DlgReplaceReplaceBtn : "Yvirskriva", +DlgReplaceReplAllBtn : "Yvirskriva alt", +DlgReplaceWordChk : "Bert heil orð", + +// Paste Operations / Dialog +PasteErrorCut : "Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. Vinarliga nýt knappaborðið til at kvetta tekstin (CTRL+X).", +PasteErrorCopy : "Trygdaruppseting alnótskagans forðar tekstviðgeranum í at avrita tekstin. Vinarliga nýt knappaborðið til at avrita tekstin (CTRL+C).", + +PasteAsText : "Innrita som reinan tekst", +PasteFromWord : "Innrita fra Word", + +DlgPasteMsg2 : "Vinarliga koyr tekstin í hendan rútin við knappaborðinum (CTRL+V) og klikk á Góðtak.", +DlgPasteSec : "Trygdaruppseting alnótskagans forðar tekstviðgeranum í beinleiðis atgongd til avritingarminnið. Tygum mugu royna aftur í hesum rútinum.", +DlgPasteIgnoreFont : "Forfjóna Font definitiónirnar", +DlgPasteRemoveStyles : "Strika typografi definitiónir", + +// Color Picker +ColorAutomatic : "Automatiskt", +ColorMoreColors : "Fleiri litir...", + +// Document Properties +DocProps : "Eginleikar fyri dokument", + +// Anchor Dialog +DlgAnchorTitle : "Eginleikar fyri marknastein", +DlgAnchorName : "Heiti marknasteinsins", +DlgAnchorErrorName : "Vinarliga rita marknasteinsins heiti", + +// Speller Pages Dialog +DlgSpellNotInDic : "Finst ikki í orðabókini", +DlgSpellChangeTo : "Broyt til", +DlgSpellBtnIgnore : "Forfjóna", +DlgSpellBtnIgnoreAll : "Forfjóna alt", +DlgSpellBtnReplace : "Yvirskriva", +DlgSpellBtnReplaceAll : "Yvirskriva alt", +DlgSpellBtnUndo : "Angra", +DlgSpellNoSuggestions : "- Einki uppskot -", +DlgSpellProgress : "Rættstavarin arbeiðir...", +DlgSpellNoMispell : "Rættstavarain liðugur: Eingin feilur funnin", +DlgSpellNoChanges : "Rættstavarain liðugur: Einki orð varð broytt", +DlgSpellOneChange : "Rættstavarain liðugur: Eitt orð er broytt", +DlgSpellManyChanges : "Rættstavarain liðugur: %1 orð broytt", + +IeSpellDownload : "Rættstavarin er ikki tøkur í tekstviðgeranum. Vilt tú heinta hann nú?", + +// Button Dialog +DlgButtonText : "Tekstur", +DlgButtonType : "Slag", +DlgButtonTypeBtn : "Knøttur", +DlgButtonTypeSbm : "Send", +DlgButtonTypeRst : "Nullstilla", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Navn", +DlgCheckboxValue : "Virði", +DlgCheckboxSelected : "Valt", + +// Form Dialog +DlgFormName : "Navn", +DlgFormAction : "Hending", +DlgFormMethod : "Háttur", + +// Select Field Dialog +DlgSelectName : "Navn", +DlgSelectValue : "Virði", +DlgSelectSize : "Stødd", +DlgSelectLines : "Linjur", +DlgSelectChkMulti : "Loyv fleiri valmøguleikum samstundis", +DlgSelectOpAvail : "Tøkir møguleikar", +DlgSelectOpText : "Tekstur", +DlgSelectOpValue : "Virði", +DlgSelectBtnAdd : "Legg afturat", +DlgSelectBtnModify : "Broyt", +DlgSelectBtnUp : "Upp", +DlgSelectBtnDown : "Niður", +DlgSelectBtnSetValue : "Set sum valt virði", +DlgSelectBtnDelete : "Strika", + +// Textarea Dialog +DlgTextareaName : "Navn", +DlgTextareaCols : "kolonnur", +DlgTextareaRows : "røðir", + +// Text Field Dialog +DlgTextName : "Navn", +DlgTextValue : "Virði", +DlgTextCharWidth : "Breidd (sjónlig tekn)", +DlgTextMaxChars : "Mest loyvdu tekn", +DlgTextType : "Slag", +DlgTextTypeText : "Tekstur", +DlgTextTypePass : "Loyniorð", + +// Hidden Field Dialog +DlgHiddenName : "Navn", +DlgHiddenValue : "Virði", + +// Bulleted List Dialog +BulletedListProp : "Eginleikar fyri punktmerktan lista", +NumberedListProp : "Eginleikar fyri talmerktan lista", +DlgLstStart : "Byrjan", +DlgLstType : "Slag", +DlgLstTypeCircle : "Sirkul", +DlgLstTypeDisc : "Fyltur sirkul", +DlgLstTypeSquare : "Fjórhyrningur", +DlgLstTypeNumbers : "Talmerkt (1, 2, 3)", +DlgLstTypeLCase : "Smáir bókstavir (a, b, c)", +DlgLstTypeUCase : "Stórir bókstavir (A, B, C)", +DlgLstTypeSRoman : "Smá rómaratøl (i, ii, iii)", +DlgLstTypeLRoman : "Stór rómaratøl (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Generelt", +DlgDocBackTab : "Bakgrund", +DlgDocColorsTab : "Litir og breddar", +DlgDocMetaTab : "META-upplýsingar", + +DlgDocPageTitle : "Síðuheiti", +DlgDocLangDir : "Tekstkós", +DlgDocLangDirLTR : "Frá vinstru móti høgru (LTR)", +DlgDocLangDirRTL : "Frá høgru móti vinstru (RTL)", +DlgDocLangCode : "Málkoda", +DlgDocCharSet : "Teknsett koda", +DlgDocCharSetCE : "Miðeuropa", +DlgDocCharSetCT : "Kinesiskt traditionelt (Big5)", +DlgDocCharSetCR : "Cyrilliskt", +DlgDocCharSetGR : "Grikst", +DlgDocCharSetJP : "Japanskt", +DlgDocCharSetKR : "Koreanskt", +DlgDocCharSetTR : "Turkiskt", +DlgDocCharSetUN : "UNICODE (UTF-8)", +DlgDocCharSetWE : "Vestureuropa", +DlgDocCharSetOther : "Onnur teknsett koda", + +DlgDocDocType : "Dokumentslag yvirskrift", +DlgDocDocTypeOther : "Annað dokumentslag yvirskrift", +DlgDocIncXHTML : "Viðfest XHTML deklaratiónir", +DlgDocBgColor : "Bakgrundslitur", +DlgDocBgImage : "Leið til bakgrundsmynd (URL)", +DlgDocBgNoScroll : "Læst bakgrund (rullar ikki)", +DlgDocCText : "Tekstur", +DlgDocCLink : "Tilknýti", +DlgDocCVisited : "Vitjaði tilknýti", +DlgDocCActive : "Virkin tilknýti", +DlgDocMargins : "Síðubreddar", +DlgDocMaTop : "Ovast", +DlgDocMaLeft : "Vinstra", +DlgDocMaRight : "Høgra", +DlgDocMaBottom : "Niðast", +DlgDocMeIndex : "Dokument index lyklaorð (sundurbýtt við komma)", +DlgDocMeDescr : "Dokumentlýsing", +DlgDocMeAuthor : "Høvundur", +DlgDocMeCopy : "Upphavsrættindi", +DlgDocPreview : "Frumsýning", + +// Templates Dialog +Templates : "Skabelónir", +DlgTemplatesTitle : "Innihaldsskabelónir", +DlgTemplatesSelMsg : "Vinarliga vel ta skabelón, ið skal opnast í tekstviðgeranum
    (Hetta yvirskrivar núverandi innihald):", +DlgTemplatesLoading : "Heinti yvirlit yvir skabelónir. Vinarliga bíða við...", +DlgTemplatesNoTpl : "(Ongar skabelónir tøkar)", +DlgTemplatesReplace : "Yvirskriva núverandi innihald", + +// About Dialog +DlgAboutAboutTab : "Um", +DlgAboutBrowserInfoTab : "Upplýsingar um alnótskagan", +DlgAboutLicenseTab : "License", +DlgAboutVersion : "version", +DlgAboutInfo : "Fyri fleiri upplýsingar, far til", + +// Div Dialog +DlgDivGeneralTab : "Generelt", +DlgDivAdvancedTab : "Fjølbroytt", +DlgDivStyle : "Typografi", +DlgDivInlineStyle : "Inline typografi" +}; diff --git a/webdir/fckeditor/editor/lang/fr-ca.js b/webdir/fckeditor/editor/lang/fr-ca.js new file mode 100644 index 0000000..9521c67 --- /dev/null +++ b/webdir/fckeditor/editor/lang/fr-ca.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Canadian French language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Masquer Outils", +ToolbarExpand : "Afficher Outils", + +// Toolbar Items and Context Menu +Save : "Sauvegarder", +NewPage : "Nouvelle page", +Preview : "Previsualiser", +Cut : "Couper", +Copy : "Copier", +Paste : "Coller", +PasteText : "Coller en tant que texte", +PasteWord : "Coller en tant que Word (formaté)", +Print : "Imprimer", +SelectAll : "Tout sélectionner", +RemoveFormat : "Supprimer le formatage", +InsertLinkLbl : "Lien", +InsertLink : "Insérer/modifier le lien", +RemoveLink : "Supprimer le lien", +VisitLink : "Suivre le lien", +Anchor : "Insérer/modifier l'ancre", +AnchorDelete : "Supprimer l'ancre", +InsertImageLbl : "Image", +InsertImage : "Insérer/modifier l'image", +InsertFlashLbl : "Animation Flash", +InsertFlash : "Insérer/modifier l'animation Flash", +InsertTableLbl : "Tableau", +InsertTable : "Insérer/modifier le tableau", +InsertLineLbl : "Séparateur", +InsertLine : "Insérer un séparateur", +InsertSpecialCharLbl: "Caractères spéciaux", +InsertSpecialChar : "Insérer un caractère spécial", +InsertSmileyLbl : "Emoticon", +InsertSmiley : "Insérer un Emoticon", +About : "A propos de FCKeditor", +Bold : "Gras", +Italic : "Italique", +Underline : "Souligné", +StrikeThrough : "Barrer", +Subscript : "Indice", +Superscript : "Exposant", +LeftJustify : "Aligner à gauche", +CenterJustify : "Centrer", +RightJustify : "Aligner à Droite", +BlockJustify : "Texte justifié", +DecreaseIndent : "Diminuer le retrait", +IncreaseIndent : "Augmenter le retrait", +Blockquote : "Citation", +CreateDiv : "Créer Balise Div", +EditDiv : "Modifier Balise Div", +DeleteDiv : "Supprimer Balise Div", +Undo : "Annuler", +Redo : "Refaire", +NumberedListLbl : "Liste numérotée", +NumberedList : "Insérer/supprimer la liste numérotée", +BulletedListLbl : "Liste à puces", +BulletedList : "Insérer/supprimer la liste à puces", +ShowTableBorders : "Afficher les bordures du tableau", +ShowDetails : "Afficher les caractères invisibles", +Style : "Style", +FontFormat : "Format", +Font : "Police", +FontSize : "Taille", +TextColor : "Couleur de caractère", +BGColor : "Couleur de fond", +Source : "Source", +Find : "Chercher", +Replace : "Remplacer", +SpellCheck : "Orthographe", +UniversalKeyboard : "Clavier universel", +PageBreakLbl : "Saut de page", +PageBreak : "Insérer un saut de page", + +Form : "Formulaire", +Checkbox : "Case à cocher", +RadioButton : "Bouton radio", +TextField : "Champ texte", +Textarea : "Zone de texte", +HiddenField : "Champ caché", +Button : "Bouton", +SelectionField : "Champ de sélection", +ImageButton : "Bouton image", + +FitWindow : "Edition pleine page", +ShowBlocks : "Afficher les blocs", + +// Context Menu +EditLink : "Modifier le lien", +CellCM : "Cellule", +RowCM : "Ligne", +ColumnCM : "Colonne", +InsertRowAfter : "Insérer une ligne après", +InsertRowBefore : "Insérer une ligne avant", +DeleteRows : "Supprimer des lignes", +InsertColumnAfter : "Insérer une colonne après", +InsertColumnBefore : "Insérer une colonne avant", +DeleteColumns : "Supprimer des colonnes", +InsertCellAfter : "Insérer une cellule après", +InsertCellBefore : "Insérer une cellule avant", +DeleteCells : "Supprimer des cellules", +MergeCells : "Fusionner les cellules", +MergeRight : "Fusionner à droite", +MergeDown : "Fusionner en bas", +HorizontalSplitCell : "Scinder la cellule horizontalement", +VerticalSplitCell : "Scinder la cellule verticalement", +TableDelete : "Supprimer le tableau", +CellProperties : "Propriétés de cellule", +TableProperties : "Propriétés du tableau", +ImageProperties : "Propriétés de l'image", +FlashProperties : "Propriétés de l'animation Flash", + +AnchorProp : "Propriétés de l'ancre", +ButtonProp : "Propriétés du bouton", +CheckboxProp : "Propriétés de la case à cocher", +HiddenFieldProp : "Propriétés du champ caché", +RadioButtonProp : "Propriétés du bouton radio", +ImageButtonProp : "Propriétés du bouton image", +TextFieldProp : "Propriétés du champ texte", +SelectionFieldProp : "Propriétés de la liste/du menu", +TextareaProp : "Propriétés de la zone de texte", +FormProp : "Propriétés du formulaire", + +FontFormats : "Normal;Formaté;Adresse;En-tête 1;En-tête 2;En-tête 3;En-tête 4;En-tête 5;En-tête 6;Normal (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Calcul XHTML. Veuillez patienter...", +Done : "Terminé", +PasteWordConfirm : "Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller?", +NotCompatiblePaste : "Cette commande nécessite Internet Explorer version 5.5 et plus. Souhaitez-vous coller sans nettoyage?", +UnknownToolbarItem : "Élément de barre d'outil inconnu \"%1\"", +UnknownCommand : "Nom de commande inconnu \"%1\"", +NotImplemented : "Commande indisponible", +UnknownToolbarSet : "La barre d'outils \"%1\" n'existe pas", +NoActiveX : "Les paramètres de sécurité de votre navigateur peuvent limiter quelques fonctionnalités de l'éditeur. Veuillez activer l'option \"Exécuter les contrôles ActiveX et les plug-ins\". Il se peut que vous rencontriez des erreurs et remarquiez quelques limitations.", +BrowseServerBlocked : "Le navigateur n'a pas pu être ouvert. Assurez-vous que les bloqueurs de popups soient désactivés.", +DialogBlocked : "La fenêtre de dialogue n'a pas pu s'ouvrir. Assurez-vous que les bloqueurs de popups soient désactivés.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Annuler", +DlgBtnClose : "Fermer", +DlgBtnBrowseServer : "Parcourir le serveur", +DlgAdvancedTag : "Avancée", +DlgOpOther : "", +DlgInfoTab : "Info", +DlgAlertUrl : "Veuillez saisir l'URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Sens d'écriture", +DlgGenLangDirLtr : "De gauche à droite (LTR)", +DlgGenLangDirRtl : "De droite à gauche (RTL)", +DlgGenLangCode : "Code langue", +DlgGenAccessKey : "Équivalent clavier", +DlgGenName : "Nom", +DlgGenTabIndex : "Ordre de tabulation", +DlgGenLongDescr : "URL de description longue", +DlgGenClass : "Classes de feuilles de style", +DlgGenTitle : "Titre", +DlgGenContType : "Type de contenu", +DlgGenLinkCharset : "Encodage de caractère", +DlgGenStyle : "Style", + +// Image Dialog +DlgImgTitle : "Propriétés de l'image", +DlgImgInfoTab : "Informations sur l'image", +DlgImgBtnUpload : "Envoyer sur le serveur", +DlgImgURL : "URL", +DlgImgUpload : "Télécharger", +DlgImgAlt : "Texte de remplacement", +DlgImgWidth : "Largeur", +DlgImgHeight : "Hauteur", +DlgImgLockRatio : "Garder les proportions", +DlgBtnResetSize : "Taille originale", +DlgImgBorder : "Bordure", +DlgImgHSpace : "Espacement horizontal", +DlgImgVSpace : "Espacement vertical", +DlgImgAlign : "Alignement", +DlgImgAlignLeft : "Gauche", +DlgImgAlignAbsBottom: "Abs Bas", +DlgImgAlignAbsMiddle: "Abs Milieu", +DlgImgAlignBaseline : "Bas du texte", +DlgImgAlignBottom : "Bas", +DlgImgAlignMiddle : "Milieu", +DlgImgAlignRight : "Droite", +DlgImgAlignTextTop : "Haut du texte", +DlgImgAlignTop : "Haut", +DlgImgPreview : "Prévisualisation", +DlgImgAlertUrl : "Veuillez saisir l'URL de l'image", +DlgImgLinkTab : "Lien", + +// Flash Dialog +DlgFlashTitle : "Propriétés de l'animation Flash", +DlgFlashChkPlay : "Lecture automatique", +DlgFlashChkLoop : "Boucle", +DlgFlashChkMenu : "Activer le menu Flash", +DlgFlashScale : "Affichage", +DlgFlashScaleAll : "Par défaut (tout montrer)", +DlgFlashScaleNoBorder : "Sans bordure", +DlgFlashScaleFit : "Ajuster aux dimensions", + +// Link Dialog +DlgLnkWindowTitle : "Propriétés du lien", +DlgLnkInfoTab : "Informations sur le lien", +DlgLnkTargetTab : "Destination", + +DlgLnkType : "Type de lien", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Ancre dans cette page", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protocole", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Sélectionner une ancre", +DlgLnkAnchorByName : "Par nom", +DlgLnkAnchorById : "Par id", +DlgLnkNoAnchors : "(Pas d'ancre disponible dans le document)", +DlgLnkEMail : "Adresse E-Mail", +DlgLnkEMailSubject : "Sujet du message", +DlgLnkEMailBody : "Corps du message", +DlgLnkUpload : "Télécharger", +DlgLnkBtnUpload : "Envoyer sur le serveur", + +DlgLnkTarget : "Destination", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Nouvelle fenêtre (_blank)", +DlgLnkTargetParent : "Fenêtre mère (_parent)", +DlgLnkTargetSelf : "Même fenêtre (_self)", +DlgLnkTargetTop : "Fenêtre supérieure (_top)", +DlgLnkTargetFrameName : "Nom du cadre de destination", +DlgLnkPopWinName : "Nom de la fenêtre popup", +DlgLnkPopWinFeat : "Caractéristiques de la fenêtre popup", +DlgLnkPopResize : "Taille modifiable", +DlgLnkPopLocation : "Barre d'adresses", +DlgLnkPopMenu : "Barre de menu", +DlgLnkPopScroll : "Barres de défilement", +DlgLnkPopStatus : "Barre d'état", +DlgLnkPopToolbar : "Barre d'outils", +DlgLnkPopFullScrn : "Plein écran (IE)", +DlgLnkPopDependent : "Dépendante (Netscape)", +DlgLnkPopWidth : "Largeur", +DlgLnkPopHeight : "Hauteur", +DlgLnkPopLeft : "Position à partir de la gauche", +DlgLnkPopTop : "Position à partir du haut", + +DlnLnkMsgNoUrl : "Veuillez saisir l'URL", +DlnLnkMsgNoEMail : "Veuillez saisir l'adresse e-mail", +DlnLnkMsgNoAnchor : "Veuillez sélectionner une ancre", +DlnLnkMsgInvPopName : "Le nom de la fenêtre popup doit commencer par une lettre et ne doit pas contenir d'espace", + +// Color Dialog +DlgColorTitle : "Sélectionner", +DlgColorBtnClear : "Effacer", +DlgColorHighlight : "Prévisualisation", +DlgColorSelected : "Sélectionné", + +// Smiley Dialog +DlgSmileyTitle : "Insérer un Emoticon", + +// Special Character Dialog +DlgSpecialCharTitle : "Insérer un caractère spécial", + +// Table Dialog +DlgTableTitle : "Propriétés du tableau", +DlgTableRows : "Lignes", +DlgTableColumns : "Colonnes", +DlgTableBorder : "Taille de la bordure", +DlgTableAlign : "Alignement", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Gauche", +DlgTableAlignCenter : "Centré", +DlgTableAlignRight : "Droite", +DlgTableWidth : "Largeur", +DlgTableWidthPx : "pixels", +DlgTableWidthPc : "pourcentage", +DlgTableHeight : "Hauteur", +DlgTableCellSpace : "Espacement", +DlgTableCellPad : "Contour", +DlgTableCaption : "Titre", +DlgTableSummary : "Résumé", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Propriétés de la cellule", +DlgCellWidth : "Largeur", +DlgCellWidthPx : "pixels", +DlgCellWidthPc : "pourcentage", +DlgCellHeight : "Hauteur", +DlgCellWordWrap : "Retour à la ligne", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Oui", +DlgCellWordWrapNo : "Non", +DlgCellHorAlign : "Alignement horizontal", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Gauche", +DlgCellHorAlignCenter : "Centré", +DlgCellHorAlignRight: "Droite", +DlgCellVerAlign : "Alignement vertical", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Haut", +DlgCellVerAlignMiddle : "Milieu", +DlgCellVerAlignBottom : "Bas", +DlgCellVerAlignBaseline : "Bas du texte", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Lignes fusionnées", +DlgCellCollSpan : "Colonnes fusionnées", +DlgCellBackColor : "Couleur de fond", +DlgCellBorderColor : "Couleur de bordure", +DlgCellBtnSelect : "Sélectionner...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Chercher et Remplacer", + +// Find Dialog +DlgFindTitle : "Chercher", +DlgFindFindBtn : "Chercher", +DlgFindNotFoundMsg : "Le texte indiqué est introuvable.", + +// Replace Dialog +DlgReplaceTitle : "Remplacer", +DlgReplaceFindLbl : "Rechercher:", +DlgReplaceReplaceLbl : "Remplacer par:", +DlgReplaceCaseChk : "Respecter la casse", +DlgReplaceReplaceBtn : "Remplacer", +DlgReplaceReplAllBtn : "Tout remplacer", +DlgReplaceWordChk : "Mot entier", + +// Paste Operations / Dialog +PasteErrorCut : "Les paramètres de sécurité de votre navigateur empêchent l'éditeur de couper automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl+X).", +PasteErrorCopy : "Les paramètres de sécurité de votre navigateur empêchent l'éditeur de copier automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl+C).", + +PasteAsText : "Coller comme texte", +PasteFromWord : "Coller à partir de Word", + +DlgPasteMsg2 : "Veuillez coller dans la zone ci-dessous en utilisant le clavier (Ctrl+V) et appuyer sur OK.", +DlgPasteSec : "A cause des paramètres de sécurité de votre navigateur, l'éditeur ne peut accéder au presse-papier directement. Vous devez coller à nouveau le contenu dans cette fenêtre.", +DlgPasteIgnoreFont : "Ignorer les polices de caractères", +DlgPasteRemoveStyles : "Supprimer les styles", + +// Color Picker +ColorAutomatic : "Automatique", +ColorMoreColors : "Plus de couleurs...", + +// Document Properties +DocProps : "Propriétés du document", + +// Anchor Dialog +DlgAnchorTitle : "Propriétés de l'ancre", +DlgAnchorName : "Nom de l'ancre", +DlgAnchorErrorName : "Veuillez saisir le nom de l'ancre", + +// Speller Pages Dialog +DlgSpellNotInDic : "Pas dans le dictionnaire", +DlgSpellChangeTo : "Changer en", +DlgSpellBtnIgnore : "Ignorer", +DlgSpellBtnIgnoreAll : "Ignorer tout", +DlgSpellBtnReplace : "Remplacer", +DlgSpellBtnReplaceAll : "Remplacer tout", +DlgSpellBtnUndo : "Annuler", +DlgSpellNoSuggestions : "- Pas de suggestion -", +DlgSpellProgress : "Vérification d'orthographe en cours...", +DlgSpellNoMispell : "Vérification d'orthographe terminée: pas d'erreur trouvée", +DlgSpellNoChanges : "Vérification d'orthographe terminée: Pas de modifications", +DlgSpellOneChange : "Vérification d'orthographe terminée: Un mot modifié", +DlgSpellManyChanges : "Vérification d'orthographe terminée: %1 mots modifiés", + +IeSpellDownload : "Le Correcteur d'orthographe n'est pas installé. Souhaitez-vous le télécharger maintenant?", + +// Button Dialog +DlgButtonText : "Texte (Valeur)", +DlgButtonType : "Type", +DlgButtonTypeBtn : "Bouton", +DlgButtonTypeSbm : "Soumettre", +DlgButtonTypeRst : "Réinitialiser", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Nom", +DlgCheckboxValue : "Valeur", +DlgCheckboxSelected : "Sélectionné", + +// Form Dialog +DlgFormName : "Nom", +DlgFormAction : "Action", +DlgFormMethod : "Méthode", + +// Select Field Dialog +DlgSelectName : "Nom", +DlgSelectValue : "Valeur", +DlgSelectSize : "Taille", +DlgSelectLines : "lignes", +DlgSelectChkMulti : "Sélection multiple", +DlgSelectOpAvail : "Options disponibles", +DlgSelectOpText : "Texte", +DlgSelectOpValue : "Valeur", +DlgSelectBtnAdd : "Ajouter", +DlgSelectBtnModify : "Modifier", +DlgSelectBtnUp : "Monter", +DlgSelectBtnDown : "Descendre", +DlgSelectBtnSetValue : "Valeur sélectionnée", +DlgSelectBtnDelete : "Supprimer", + +// Textarea Dialog +DlgTextareaName : "Nom", +DlgTextareaCols : "Colonnes", +DlgTextareaRows : "Lignes", + +// Text Field Dialog +DlgTextName : "Nom", +DlgTextValue : "Valeur", +DlgTextCharWidth : "Largeur en caractères", +DlgTextMaxChars : "Nombre maximum de caractères", +DlgTextType : "Type", +DlgTextTypeText : "Texte", +DlgTextTypePass : "Mot de passe", + +// Hidden Field Dialog +DlgHiddenName : "Nom", +DlgHiddenValue : "Valeur", + +// Bulleted List Dialog +BulletedListProp : "Propriétés de liste à puces", +NumberedListProp : "Propriétés de liste numérotée", +DlgLstStart : "Début", +DlgLstType : "Type", +DlgLstTypeCircle : "Cercle", +DlgLstTypeDisc : "Disque", +DlgLstTypeSquare : "Carré", +DlgLstTypeNumbers : "Nombres (1, 2, 3)", +DlgLstTypeLCase : "Lettres minuscules (a, b, c)", +DlgLstTypeUCase : "Lettres majuscules (A, B, C)", +DlgLstTypeSRoman : "Chiffres romains minuscules (i, ii, iii)", +DlgLstTypeLRoman : "Chiffres romains majuscules (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Général", +DlgDocBackTab : "Fond", +DlgDocColorsTab : "Couleurs et Marges", +DlgDocMetaTab : "Méta-Données", + +DlgDocPageTitle : "Titre de la page", +DlgDocLangDir : "Sens d'écriture", +DlgDocLangDirLTR : "De la gauche vers la droite (LTR)", +DlgDocLangDirRTL : "De la droite vers la gauche (RTL)", +DlgDocLangCode : "Code langue", +DlgDocCharSet : "Encodage de caractère", +DlgDocCharSetCE : "Europe Centrale", +DlgDocCharSetCT : "Chinois Traditionnel (Big5)", +DlgDocCharSetCR : "Cyrillique", +DlgDocCharSetGR : "Grecque", +DlgDocCharSetJP : "Japonais", +DlgDocCharSetKR : "Coréen", +DlgDocCharSetTR : "Turcque", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Occidental", +DlgDocCharSetOther : "Autre encodage de caractère", + +DlgDocDocType : "Type de document", +DlgDocDocTypeOther : "Autre type de document", +DlgDocIncXHTML : "Inclure les déclarations XHTML", +DlgDocBgColor : "Couleur de fond", +DlgDocBgImage : "Image de fond", +DlgDocBgNoScroll : "Image fixe sans défilement", +DlgDocCText : "Texte", +DlgDocCLink : "Lien", +DlgDocCVisited : "Lien visité", +DlgDocCActive : "Lien activé", +DlgDocMargins : "Marges", +DlgDocMaTop : "Haut", +DlgDocMaLeft : "Gauche", +DlgDocMaRight : "Droite", +DlgDocMaBottom : "Bas", +DlgDocMeIndex : "Mots-clés (séparés par des virgules)", +DlgDocMeDescr : "Description", +DlgDocMeAuthor : "Auteur", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Prévisualisation", + +// Templates Dialog +Templates : "Modèles", +DlgTemplatesTitle : "Modèles de contenu", +DlgTemplatesSelMsg : "Sélectionner le modèle à ouvrir dans l'éditeur
    (le contenu actuel sera remplacé):", +DlgTemplatesLoading : "Chargement de la liste des modèles. Veuillez patienter...", +DlgTemplatesNoTpl : "(Aucun modèle disponible)", +DlgTemplatesReplace : "Remplacer tout le contenu actuel", + +// About Dialog +DlgAboutAboutTab : "à propos de", +DlgAboutBrowserInfoTab : "Navigateur", +DlgAboutLicenseTab : "License", +DlgAboutVersion : "Version", +DlgAboutInfo : "Pour plus d'informations, visiter", + +// Div Dialog +DlgDivGeneralTab : "Général", +DlgDivAdvancedTab : "Avancé", +DlgDivStyle : "Style", +DlgDivInlineStyle : "Attribut Style" +}; diff --git a/webdir/fckeditor/editor/lang/fr.js b/webdir/fckeditor/editor/lang/fr.js new file mode 100644 index 0000000..935f8f7 --- /dev/null +++ b/webdir/fckeditor/editor/lang/fr.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * French language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Masquer Outils", +ToolbarExpand : "Afficher Outils", + +// Toolbar Items and Context Menu +Save : "Enregistrer", +NewPage : "Nouvelle page", +Preview : "Prévisualisation", +Cut : "Couper", +Copy : "Copier", +Paste : "Coller", +PasteText : "Coller comme texte", +PasteWord : "Coller de Word", +Print : "Imprimer", +SelectAll : "Tout sélectionner", +RemoveFormat : "Supprimer le format", +InsertLinkLbl : "Lien", +InsertLink : "Insérer/modifier le lien", +RemoveLink : "Supprimer le lien", +VisitLink : "Suivre le lien", +Anchor : "Insérer/modifier l'ancre", +AnchorDelete : "Supprimer l'ancre", +InsertImageLbl : "Image", +InsertImage : "Insérer/modifier l'image", +InsertFlashLbl : "Animation Flash", +InsertFlash : "Insérer/modifier l'animation Flash", +InsertTableLbl : "Tableau", +InsertTable : "Insérer/modifier le tableau", +InsertLineLbl : "Séparateur", +InsertLine : "Insérer un séparateur", +InsertSpecialCharLbl: "Caractères spéciaux", +InsertSpecialChar : "Insérer un caractère spécial", +InsertSmileyLbl : "Smiley", +InsertSmiley : "Insérer un Smiley", +About : "A propos de FCKeditor", +Bold : "Gras", +Italic : "Italique", +Underline : "Souligné", +StrikeThrough : "Barré", +Subscript : "Indice", +Superscript : "Exposant", +LeftJustify : "Aligné à gauche", +CenterJustify : "Centré", +RightJustify : "Aligné à Droite", +BlockJustify : "Texte justifié", +DecreaseIndent : "Diminuer le retrait", +IncreaseIndent : "Augmenter le retrait", +Blockquote : "Citation", +CreateDiv : "Créer Balise Div", +EditDiv : "Modifier Balise Div", +DeleteDiv : "Supprimer Balise Div", +Undo : "Annuler", +Redo : "Refaire", +NumberedListLbl : "Liste numérotée", +NumberedList : "Insérer/supprimer la liste numérotée", +BulletedListLbl : "Liste à puces", +BulletedList : "Insérer/supprimer la liste à puces", +ShowTableBorders : "Afficher les bordures du tableau", +ShowDetails : "Afficher les caractères invisibles", +Style : "Style", +FontFormat : "Format", +Font : "Police", +FontSize : "Taille", +TextColor : "Couleur de caractère", +BGColor : "Couleur de fond", +Source : "Source", +Find : "Chercher", +Replace : "Remplacer", +SpellCheck : "Orthographe", +UniversalKeyboard : "Clavier universel", +PageBreakLbl : "Saut de page", +PageBreak : "Insérer un saut de page", + +Form : "Formulaire", +Checkbox : "Case à cocher", +RadioButton : "Bouton radio", +TextField : "Champ texte", +Textarea : "Zone de texte", +HiddenField : "Champ caché", +Button : "Bouton", +SelectionField : "Liste/menu", +ImageButton : "Bouton image", + +FitWindow : "Edition pleine page", +ShowBlocks : "Afficher les blocs", + +// Context Menu +EditLink : "Modifier le lien", +CellCM : "Cellule", +RowCM : "Ligne", +ColumnCM : "Colonne", +InsertRowAfter : "Insérer une ligne après", +InsertRowBefore : "Insérer une ligne avant", +DeleteRows : "Supprimer des lignes", +InsertColumnAfter : "Insérer une colonne après", +InsertColumnBefore : "Insérer une colonne avant", +DeleteColumns : "Supprimer des colonnes", +InsertCellAfter : "Insérer une cellule après", +InsertCellBefore : "Insérer une cellule avant", +DeleteCells : "Supprimer des cellules", +MergeCells : "Fusionner les cellules", +MergeRight : "Fusionner à droite", +MergeDown : "Fusionner en bas", +HorizontalSplitCell : "Scinder la cellule horizontalement", +VerticalSplitCell : "Scinder la cellule verticalement", +TableDelete : "Supprimer le tableau", +CellProperties : "Propriétés de cellule", +TableProperties : "Propriétés du tableau", +ImageProperties : "Propriétés de l'image", +FlashProperties : "Propriétés de l'animation Flash", + +AnchorProp : "Propriétés de l'ancre", +ButtonProp : "Propriétés du bouton", +CheckboxProp : "Propriétés de la case à cocher", +HiddenFieldProp : "Propriétés du champ caché", +RadioButtonProp : "Propriétés du bouton radio", +ImageButtonProp : "Propriétés du bouton image", +TextFieldProp : "Propriétés du champ texte", +SelectionFieldProp : "Propriétés de la liste/du menu", +TextareaProp : "Propriétés de la zone de texte", +FormProp : "Propriétés du formulaire", + +FontFormats : "Normal;Formaté;Adresse;En-tête 1;En-tête 2;En-tête 3;En-tête 4;En-tête 5;En-tête 6;Normal (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Calcul XHTML. Veuillez patienter...", +Done : "Terminé", +PasteWordConfirm : "Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller?", +NotCompatiblePaste : "Cette commande nécessite Internet Explorer version 5.5 minimum. Souhaitez-vous coller sans nettoyage?", +UnknownToolbarItem : "Elément de barre d'outil inconnu \"%1\"", +UnknownCommand : "Nom de commande inconnu \"%1\"", +NotImplemented : "Commande non encore écrite", +UnknownToolbarSet : "La barre d'outils \"%1\" n'existe pas", +NoActiveX : "Les paramètres de sécurité de votre navigateur peuvent limiter quelques fonctionnalités de l'éditeur. Veuillez activer l'option \"Exécuter les contrôles ActiveX et les plug-ins\". Il se peut que vous rencontriez des erreurs et remarquiez quelques limitations.", +BrowseServerBlocked : "Le navigateur n'a pas pu être ouvert. Assurez-vous que les bloqueurs de popups soient désactivés.", +DialogBlocked : "La fenêtre de dialogue n'a pas pu s'ouvrir. Assurez-vous que les bloqueurs de popups soient désactivés.", +VisitLinkBlocked : "Impossible d'ouvrir une nouvelle fenêtre. Assurez-vous que les bloqueurs de popups soient désactivés.", + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Annuler", +DlgBtnClose : "Fermer", +DlgBtnBrowseServer : "Parcourir le serveur", +DlgAdvancedTag : "Avancé", +DlgOpOther : "", +DlgInfoTab : "Info", +DlgAlertUrl : "Veuillez saisir l'URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Sens d'écriture", +DlgGenLangDirLtr : "De gauche à droite (LTR)", +DlgGenLangDirRtl : "De droite à gauche (RTL)", +DlgGenLangCode : "Code langue", +DlgGenAccessKey : "Equivalent clavier", +DlgGenName : "Nom", +DlgGenTabIndex : "Ordre de tabulation", +DlgGenLongDescr : "URL de description longue", +DlgGenClass : "Classes de feuilles de style", +DlgGenTitle : "Titre", +DlgGenContType : "Type de contenu", +DlgGenLinkCharset : "Encodage de caractère", +DlgGenStyle : "Style", + +// Image Dialog +DlgImgTitle : "Propriétés de l'image", +DlgImgInfoTab : "Informations sur l'image", +DlgImgBtnUpload : "Envoyer sur le serveur", +DlgImgURL : "URL", +DlgImgUpload : "Télécharger", +DlgImgAlt : "Texte de remplacement", +DlgImgWidth : "Largeur", +DlgImgHeight : "Hauteur", +DlgImgLockRatio : "Garder les proportions", +DlgBtnResetSize : "Taille originale", +DlgImgBorder : "Bordure", +DlgImgHSpace : "Espacement horizontal", +DlgImgVSpace : "Espacement vertical", +DlgImgAlign : "Alignement", +DlgImgAlignLeft : "Gauche", +DlgImgAlignAbsBottom: "Abs Bas", +DlgImgAlignAbsMiddle: "Abs Milieu", +DlgImgAlignBaseline : "Bas du texte", +DlgImgAlignBottom : "Bas", +DlgImgAlignMiddle : "Milieu", +DlgImgAlignRight : "Droite", +DlgImgAlignTextTop : "Haut du texte", +DlgImgAlignTop : "Haut", +DlgImgPreview : "Prévisualisation", +DlgImgAlertUrl : "Veuillez saisir l'URL de l'image", +DlgImgLinkTab : "Lien", + +// Flash Dialog +DlgFlashTitle : "Propriétés de l'animation Flash", +DlgFlashChkPlay : "Lecture automatique", +DlgFlashChkLoop : "Boucle", +DlgFlashChkMenu : "Activer le menu Flash", +DlgFlashScale : "Affichage", +DlgFlashScaleAll : "Par défaut (tout montrer)", +DlgFlashScaleNoBorder : "Sans bordure", +DlgFlashScaleFit : "Ajuster aux dimensions", + +// Link Dialog +DlgLnkWindowTitle : "Propriétés du lien", +DlgLnkInfoTab : "Informations sur le lien", +DlgLnkTargetTab : "Destination", + +DlgLnkType : "Type de lien", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Ancre dans cette page", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protocole", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Sélectionner une ancre", +DlgLnkAnchorByName : "Par nom", +DlgLnkAnchorById : "Par id", +DlgLnkNoAnchors : "(Pas d'ancre disponible dans le document)", +DlgLnkEMail : "Adresse E-Mail", +DlgLnkEMailSubject : "Sujet du message", +DlgLnkEMailBody : "Corps du message", +DlgLnkUpload : "Télécharger", +DlgLnkBtnUpload : "Envoyer sur le serveur", + +DlgLnkTarget : "Destination", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Nouvelle fenêtre (_blank)", +DlgLnkTargetParent : "Fenêtre mère (_parent)", +DlgLnkTargetSelf : "Même fenêtre (_self)", +DlgLnkTargetTop : "Fenêtre supérieure (_top)", +DlgLnkTargetFrameName : "Nom du cadre de destination", +DlgLnkPopWinName : "Nom de la fenêtre popup", +DlgLnkPopWinFeat : "Caractéristiques de la fenêtre popup", +DlgLnkPopResize : "Taille modifiable", +DlgLnkPopLocation : "Barre d'adresses", +DlgLnkPopMenu : "Barre de menu", +DlgLnkPopScroll : "Barres de défilement", +DlgLnkPopStatus : "Barre d'état", +DlgLnkPopToolbar : "Barre d'outils", +DlgLnkPopFullScrn : "Plein écran (IE)", +DlgLnkPopDependent : "Dépendante (Netscape)", +DlgLnkPopWidth : "Largeur", +DlgLnkPopHeight : "Hauteur", +DlgLnkPopLeft : "Position à partir de la gauche", +DlgLnkPopTop : "Position à partir du haut", + +DlnLnkMsgNoUrl : "Veuillez saisir l'URL", +DlnLnkMsgNoEMail : "Veuillez saisir l'adresse e-mail", +DlnLnkMsgNoAnchor : "Veuillez sélectionner une ancre", +DlnLnkMsgInvPopName : "Le nom de la fenêtre popup doit commencer par une lettre et ne doit pas contenir d'espace", + +// Color Dialog +DlgColorTitle : "Sélectionner", +DlgColorBtnClear : "Effacer", +DlgColorHighlight : "Prévisualisation", +DlgColorSelected : "Sélectionné", + +// Smiley Dialog +DlgSmileyTitle : "Insérer un Smiley", + +// Special Character Dialog +DlgSpecialCharTitle : "Insérer un caractère spécial", + +// Table Dialog +DlgTableTitle : "Propriétés du tableau", +DlgTableRows : "Lignes", +DlgTableColumns : "Colonnes", +DlgTableBorder : "Bordure", +DlgTableAlign : "Alignement", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Gauche", +DlgTableAlignCenter : "Centré", +DlgTableAlignRight : "Droite", +DlgTableWidth : "Largeur", +DlgTableWidthPx : "pixels", +DlgTableWidthPc : "pourcentage", +DlgTableHeight : "Hauteur", +DlgTableCellSpace : "Espacement", +DlgTableCellPad : "Contour", +DlgTableCaption : "Titre", +DlgTableSummary : "Résumé", +DlgTableHeaders : "Entêtes", +DlgTableHeadersNone : "Sans", +DlgTableHeadersColumn : "Première colonne", +DlgTableHeadersRow : "Première Ligne", +DlgTableHeadersBoth : "Les 2", + +// Table Cell Dialog +DlgCellTitle : "Propriétés de la cellule", +DlgCellWidth : "Largeur", +DlgCellWidthPx : "pixels", +DlgCellWidthPc : "pourcentage", +DlgCellHeight : "Hauteur", +DlgCellWordWrap : "Retour à la ligne", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Oui", +DlgCellWordWrapNo : "Non", +DlgCellHorAlign : "Alignement horizontal", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Gauche", +DlgCellHorAlignCenter : "Centré", +DlgCellHorAlignRight: "Droite", +DlgCellVerAlign : "Alignement vertical", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Haut", +DlgCellVerAlignMiddle : "Milieu", +DlgCellVerAlignBottom : "Bas", +DlgCellVerAlignBaseline : "Bas du texte", +DlgCellType : "Type de Cellule", +DlgCellTypeData : "Données", +DlgCellTypeHeader : "Entête", +DlgCellRowSpan : "Lignes fusionnées", +DlgCellCollSpan : "Colonnes fusionnées", +DlgCellBackColor : "Fond", +DlgCellBorderColor : "Bordure", +DlgCellBtnSelect : "Choisir...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Chercher et Remplacer", + +// Find Dialog +DlgFindTitle : "Chercher", +DlgFindFindBtn : "Chercher", +DlgFindNotFoundMsg : "Le texte indiqué est introuvable.", + +// Replace Dialog +DlgReplaceTitle : "Remplacer", +DlgReplaceFindLbl : "Rechercher:", +DlgReplaceReplaceLbl : "Remplacer par:", +DlgReplaceCaseChk : "Respecter la casse", +DlgReplaceReplaceBtn : "Remplacer", +DlgReplaceReplAllBtn : "Tout remplacer", +DlgReplaceWordChk : "Mot entier", + +// Paste Operations / Dialog +PasteErrorCut : "Les paramètres de sécurité de votre navigateur empêchent l'éditeur de couper automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl+X).", +PasteErrorCopy : "Les paramètres de sécurité de votre navigateur empêchent l'éditeur de copier automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl+C).", + +PasteAsText : "Coller comme texte", +PasteFromWord : "Coller à partir de Word", + +DlgPasteMsg2 : "Veuillez coller dans la zone ci-dessous en utilisant le clavier (Ctrl+V) et cliquez sur OK.", +DlgPasteSec : "A cause des paramètres de sécurité de votre navigateur, l'éditeur ne peut accéder au presse-papier directement. Vous devez coller à nouveau le contenu dans cette fenêtre.", +DlgPasteIgnoreFont : "Ignorer les polices de caractères", +DlgPasteRemoveStyles : "Supprimer les styles", + +// Color Picker +ColorAutomatic : "Automatique", +ColorMoreColors : "Plus de couleurs...", + +// Document Properties +DocProps : "Propriétés du document", + +// Anchor Dialog +DlgAnchorTitle : "Propriétés de l'ancre", +DlgAnchorName : "Nom de l'ancre", +DlgAnchorErrorName : "Veuillez saisir le nom de l'ancre", + +// Speller Pages Dialog +DlgSpellNotInDic : "Pas dans le dictionnaire", +DlgSpellChangeTo : "Changer en", +DlgSpellBtnIgnore : "Ignorer", +DlgSpellBtnIgnoreAll : "Ignorer tout", +DlgSpellBtnReplace : "Remplacer", +DlgSpellBtnReplaceAll : "Remplacer tout", +DlgSpellBtnUndo : "Annuler", +DlgSpellNoSuggestions : "- Aucune suggestion -", +DlgSpellProgress : "Vérification d'orthographe en cours...", +DlgSpellNoMispell : "Vérification d'orthographe terminée: Aucune erreur trouvée", +DlgSpellNoChanges : "Vérification d'orthographe terminée: Pas de modifications", +DlgSpellOneChange : "Vérification d'orthographe terminée: Un mot modifié", +DlgSpellManyChanges : "Vérification d'orthographe terminée: %1 mots modifiés", + +IeSpellDownload : "Le Correcteur n'est pas installé. Souhaitez-vous le télécharger maintenant?", + +// Button Dialog +DlgButtonText : "Texte (valeur)", +DlgButtonType : "Type", +DlgButtonTypeBtn : "Bouton", +DlgButtonTypeSbm : "Envoyer", +DlgButtonTypeRst : "Réinitialiser", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Nom", +DlgCheckboxValue : "Valeur", +DlgCheckboxSelected : "Sélectionné", + +// Form Dialog +DlgFormName : "Nom", +DlgFormAction : "Action", +DlgFormMethod : "Méthode", + +// Select Field Dialog +DlgSelectName : "Nom", +DlgSelectValue : "Valeur", +DlgSelectSize : "Taille", +DlgSelectLines : "lignes", +DlgSelectChkMulti : "Sélection multiple", +DlgSelectOpAvail : "Options disponibles", +DlgSelectOpText : "Texte", +DlgSelectOpValue : "Valeur", +DlgSelectBtnAdd : "Ajouter", +DlgSelectBtnModify : "Modifier", +DlgSelectBtnUp : "Monter", +DlgSelectBtnDown : "Descendre", +DlgSelectBtnSetValue : "Valeur sélectionnée", +DlgSelectBtnDelete : "Supprimer", + +// Textarea Dialog +DlgTextareaName : "Nom", +DlgTextareaCols : "Colonnes", +DlgTextareaRows : "Lignes", + +// Text Field Dialog +DlgTextName : "Nom", +DlgTextValue : "Valeur", +DlgTextCharWidth : "Largeur en caractères", +DlgTextMaxChars : "Nombre maximum de caractères", +DlgTextType : "Type", +DlgTextTypeText : "Texte", +DlgTextTypePass : "Mot de passe", + +// Hidden Field Dialog +DlgHiddenName : "Nom", +DlgHiddenValue : "Valeur", + +// Bulleted List Dialog +BulletedListProp : "Propriétés de liste à puces", +NumberedListProp : "Propriétés de liste numérotée", +DlgLstStart : "Début", +DlgLstType : "Type", +DlgLstTypeCircle : "Cercle", +DlgLstTypeDisc : "Disque", +DlgLstTypeSquare : "Carré", +DlgLstTypeNumbers : "Nombres (1, 2, 3)", +DlgLstTypeLCase : "Lettres minuscules (a, b, c)", +DlgLstTypeUCase : "Lettres majuscules (A, B, C)", +DlgLstTypeSRoman : "Chiffres romains minuscules (i, ii, iii)", +DlgLstTypeLRoman : "Chiffres romains majuscules (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Général", +DlgDocBackTab : "Fond", +DlgDocColorsTab : "Couleurs et marges", +DlgDocMetaTab : "Métadonnées", + +DlgDocPageTitle : "Titre de la page", +DlgDocLangDir : "Sens d'écriture", +DlgDocLangDirLTR : "De la gauche vers la droite (LTR)", +DlgDocLangDirRTL : "De la droite vers la gauche (RTL)", +DlgDocLangCode : "Code langue", +DlgDocCharSet : "Encodage de caractère", +DlgDocCharSetCE : "Europe Centrale", +DlgDocCharSetCT : "Chinois Traditionnel (Big5)", +DlgDocCharSetCR : "Cyrillique", +DlgDocCharSetGR : "Grec", +DlgDocCharSetJP : "Japonais", +DlgDocCharSetKR : "Coréen", +DlgDocCharSetTR : "Turc", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Occidental", +DlgDocCharSetOther : "Autre encodage de caractère", + +DlgDocDocType : "Type de document", +DlgDocDocTypeOther : "Autre type de document", +DlgDocIncXHTML : "Inclure les déclarations XHTML", +DlgDocBgColor : "Couleur de fond", +DlgDocBgImage : "Image de fond", +DlgDocBgNoScroll : "Image fixe sans défilement", +DlgDocCText : "Texte", +DlgDocCLink : "Lien", +DlgDocCVisited : "Lien visité", +DlgDocCActive : "Lien activé", +DlgDocMargins : "Marges", +DlgDocMaTop : "Haut", +DlgDocMaLeft : "Gauche", +DlgDocMaRight : "Droite", +DlgDocMaBottom : "Bas", +DlgDocMeIndex : "Mots-clés (séparés par des virgules)", +DlgDocMeDescr : "Description", +DlgDocMeAuthor : "Auteur", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Prévisualisation", + +// Templates Dialog +Templates : "Modèles", +DlgTemplatesTitle : "Modèles de contenu", +DlgTemplatesSelMsg : "Veuillez sélectionner le modèle à ouvrir dans l'éditeur
    (le contenu actuel sera remplacé):", +DlgTemplatesLoading : "Chargement de la liste des modèles. Veuillez patienter...", +DlgTemplatesNoTpl : "(Aucun modèle disponible)", +DlgTemplatesReplace : "Remplacer tout le contenu", + +// About Dialog +DlgAboutAboutTab : "A propos de", +DlgAboutBrowserInfoTab : "Navigateur", +DlgAboutLicenseTab : "Licence", +DlgAboutVersion : "Version", +DlgAboutInfo : "Pour plus d'informations, aller à", + +// Div Dialog +DlgDivGeneralTab : "Général", +DlgDivAdvancedTab : "Avancé", +DlgDivStyle : "Style", +DlgDivInlineStyle : "Attribut Style" +}; diff --git a/webdir/fckeditor/editor/lang/gl.js b/webdir/fckeditor/editor/lang/gl.js new file mode 100644 index 0000000..06cba17 --- /dev/null +++ b/webdir/fckeditor/editor/lang/gl.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Galician language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Ocultar Ferramentas", +ToolbarExpand : "Mostrar Ferramentas", + +// Toolbar Items and Context Menu +Save : "Gardar", +NewPage : "Nova Páxina", +Preview : "Vista Previa", +Cut : "Cortar", +Copy : "Copiar", +Paste : "Pegar", +PasteText : "Pegar como texto plano", +PasteWord : "Pegar dende Word", +Print : "Imprimir", +SelectAll : "Seleccionar todo", +RemoveFormat : "Eliminar Formato", +InsertLinkLbl : "Ligazón", +InsertLink : "Inserir/Editar Ligazón", +RemoveLink : "Eliminar Ligazón", +VisitLink : "Open Link", //MISSING +Anchor : "Inserir/Editar Referencia", +AnchorDelete : "Remove Anchor", //MISSING +InsertImageLbl : "Imaxe", +InsertImage : "Inserir/Editar Imaxe", +InsertFlashLbl : "Flash", +InsertFlash : "Inserir/Editar Flash", +InsertTableLbl : "Tabla", +InsertTable : "Inserir/Editar Tabla", +InsertLineLbl : "Liña", +InsertLine : "Inserir Liña Horizontal", +InsertSpecialCharLbl: "Carácter Special", +InsertSpecialChar : "Inserir Carácter Especial", +InsertSmileyLbl : "Smiley", +InsertSmiley : "Inserir Smiley", +About : "Acerca de FCKeditor", +Bold : "Negrita", +Italic : "Cursiva", +Underline : "Sub-raiado", +StrikeThrough : "Tachado", +Subscript : "Subíndice", +Superscript : "Superíndice", +LeftJustify : "Aliñar á Esquerda", +CenterJustify : "Centrado", +RightJustify : "Aliñar á Dereita", +BlockJustify : "Xustificado", +DecreaseIndent : "Disminuir Sangría", +IncreaseIndent : "Aumentar Sangría", +Blockquote : "Blockquote", //MISSING +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "Desfacer", +Redo : "Refacer", +NumberedListLbl : "Lista Numerada", +NumberedList : "Inserir/Eliminar Lista Numerada", +BulletedListLbl : "Marcas", +BulletedList : "Inserir/Eliminar Marcas", +ShowTableBorders : "Mostrar Bordes das Táboas", +ShowDetails : "Mostrar Marcas Parágrafo", +Style : "Estilo", +FontFormat : "Formato", +Font : "Tipo", +FontSize : "Tamaño", +TextColor : "Cor do Texto", +BGColor : "Cor do Fondo", +Source : "Código Fonte", +Find : "Procurar", +Replace : "Substituir", +SpellCheck : "Corrección Ortográfica", +UniversalKeyboard : "Teclado Universal", +PageBreakLbl : "Salto de Páxina", +PageBreak : "Inserir Salto de Páxina", + +Form : "Formulario", +Checkbox : "Cadro de Verificación", +RadioButton : "Botón de Radio", +TextField : "Campo de Texto", +Textarea : "Ãrea de Texto", +HiddenField : "Campo Oculto", +Button : "Botón", +SelectionField : "Campo de Selección", +ImageButton : "Botón de Imaxe", + +FitWindow : "Maximizar o tamaño do editor", +ShowBlocks : "Show Blocks", //MISSING + +// Context Menu +EditLink : "Editar Ligazón", +CellCM : "Cela", +RowCM : "Fila", +ColumnCM : "Columna", +InsertRowAfter : "Insert Row After", //MISSING +InsertRowBefore : "Insert Row Before", //MISSING +DeleteRows : "Borrar Filas", +InsertColumnAfter : "Insert Column After", //MISSING +InsertColumnBefore : "Insert Column Before", //MISSING +DeleteColumns : "Borrar Columnas", +InsertCellAfter : "Insert Cell After", //MISSING +InsertCellBefore : "Insert Cell Before", //MISSING +DeleteCells : "Borrar Cela", +MergeCells : "Unir Celas", +MergeRight : "Merge Right", //MISSING +MergeDown : "Merge Down", //MISSING +HorizontalSplitCell : "Split Cell Horizontally", //MISSING +VerticalSplitCell : "Split Cell Vertically", //MISSING +TableDelete : "Borrar Táboa", +CellProperties : "Propriedades da Cela", +TableProperties : "Propriedades da Táboa", +ImageProperties : "Propriedades Imaxe", +FlashProperties : "Propriedades Flash", + +AnchorProp : "Propriedades da Referencia", +ButtonProp : "Propriedades do Botón", +CheckboxProp : "Propriedades do Cadro de Verificación", +HiddenFieldProp : "Propriedades do Campo Oculto", +RadioButtonProp : "Propriedades do Botón de Radio", +ImageButtonProp : "Propriedades do Botón de Imaxe", +TextFieldProp : "Propriedades do Campo de Texto", +SelectionFieldProp : "Propriedades do Campo de Selección", +TextareaProp : "Propriedades da Ãrea de Texto", +FormProp : "Propriedades do Formulario", + +FontFormats : "Normal;Formateado;Enderezo;Enacabezado 1;Encabezado 2;Encabezado 3;Encabezado 4;Encabezado 5;Encabezado 6;Paragraph (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Procesando XHTML. Por facor, agarde...", +Done : "Feiro", +PasteWordConfirm : "Parece que o texto que quere pegar está copiado do Word.¿Quere limpar o formato antes de pegalo?", +NotCompatiblePaste : "Este comando está disponible para Internet Explorer versión 5.5 ou superior. ¿Quere pegalo sen limpar o formato?", +UnknownToolbarItem : "Ãtem de ferramentas descoñecido \"%1\"", +UnknownCommand : "Nome de comando descoñecido \"%1\"", +NotImplemented : "Comando non implementado", +UnknownToolbarSet : "O conxunto de ferramentas \"%1\" non existe", +NoActiveX : "As opcións de seguridade do seu navegador poderían limitar algunha das características de editor. Debe activar a opción \"Executar controis ActiveX e plug-ins\". Pode notar que faltan características e experimentar erros", +BrowseServerBlocked : "Non se poido abrir o navegador de recursos. Asegúrese de que están desactivados os bloqueadores de xanelas emerxentes", +DialogBlocked : "Non foi posible abrir a xanela de diálogo. Asegúrese de que están desactivados os bloqueadores de xanelas emerxentes", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Cancelar", +DlgBtnClose : "Pechar", +DlgBtnBrowseServer : "Navegar no Servidor", +DlgAdvancedTag : "Advanzado", +DlgOpOther : "", +DlgInfoTab : "Info", +DlgAlertUrl : "Por favor, insira a URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Orientación do Idioma", +DlgGenLangDirLtr : "Esquerda a Dereita (LTR)", +DlgGenLangDirRtl : "Dereita a Esquerda (RTL)", +DlgGenLangCode : "Código do Idioma", +DlgGenAccessKey : "Chave de Acceso", +DlgGenName : "Nome", +DlgGenTabIndex : "Ãndice de Tabulación", +DlgGenLongDescr : "Descrición Completa da URL", +DlgGenClass : "Clases da Folla de Estilos", +DlgGenTitle : "Título", +DlgGenContType : "Tipo de Contido", +DlgGenLinkCharset : "Fonte de Caracteres Vinculado", +DlgGenStyle : "Estilo", + +// Image Dialog +DlgImgTitle : "Propriedades da Imaxe", +DlgImgInfoTab : "Información da Imaxe", +DlgImgBtnUpload : "Enviar ó Servidor", +DlgImgURL : "URL", +DlgImgUpload : "Carregar", +DlgImgAlt : "Texto Alternativo", +DlgImgWidth : "Largura", +DlgImgHeight : "Altura", +DlgImgLockRatio : "Proporcional", +DlgBtnResetSize : "Tamaño Orixinal", +DlgImgBorder : "Límite", +DlgImgHSpace : "Esp. Horiz.", +DlgImgVSpace : "Esp. Vert.", +DlgImgAlign : "Aliñamento", +DlgImgAlignLeft : "Esquerda", +DlgImgAlignAbsBottom: "Abs Inferior", +DlgImgAlignAbsMiddle: "Abs Centro", +DlgImgAlignBaseline : "Liña Base", +DlgImgAlignBottom : "Pé", +DlgImgAlignMiddle : "Centro", +DlgImgAlignRight : "Dereita", +DlgImgAlignTextTop : "Tope do Texto", +DlgImgAlignTop : "Tope", +DlgImgPreview : "Vista Previa", +DlgImgAlertUrl : "Por favor, escriba a URL da imaxe", +DlgImgLinkTab : "Ligazón", + +// Flash Dialog +DlgFlashTitle : "Propriedades Flash", +DlgFlashChkPlay : "Auto Execución", +DlgFlashChkLoop : "Bucle", +DlgFlashChkMenu : "Activar Menú Flash", +DlgFlashScale : "Escalar", +DlgFlashScaleAll : "Amosar Todo", +DlgFlashScaleNoBorder : "Sen Borde", +DlgFlashScaleFit : "Encaixar axustando", + +// Link Dialog +DlgLnkWindowTitle : "Ligazón", +DlgLnkInfoTab : "Información da Ligazón", +DlgLnkTargetTab : "Referencia a esta páxina", + +DlgLnkType : "Tipo de Ligazón", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Referencia nesta páxina", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protocolo", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Seleccionar unha Referencia", +DlgLnkAnchorByName : "Por Nome de Referencia", +DlgLnkAnchorById : "Por Element Id", +DlgLnkNoAnchors : "(Non hai referencias disponibles no documento)", +DlgLnkEMail : "Enderezo de E-Mail", +DlgLnkEMailSubject : "Asunto do Mensaxe", +DlgLnkEMailBody : "Corpo do Mensaxe", +DlgLnkUpload : "Carregar", +DlgLnkBtnUpload : "Enviar ó servidor", + +DlgLnkTarget : "Destino", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Nova Xanela (_blank)", +DlgLnkTargetParent : "Xanela Pai (_parent)", +DlgLnkTargetSelf : "Mesma Xanela (_self)", +DlgLnkTargetTop : "Xanela Primaria (_top)", +DlgLnkTargetFrameName : "Nome do Marco Destino", +DlgLnkPopWinName : "Nome da Xanela Emerxente", +DlgLnkPopWinFeat : "Características da Xanela Emerxente", +DlgLnkPopResize : "Axustable", +DlgLnkPopLocation : "Barra de Localización", +DlgLnkPopMenu : "Barra de Menú", +DlgLnkPopScroll : "Barras de Desplazamento", +DlgLnkPopStatus : "Barra de Estado", +DlgLnkPopToolbar : "Barra de Ferramentas", +DlgLnkPopFullScrn : "A Toda Pantalla (IE)", +DlgLnkPopDependent : "Dependente (Netscape)", +DlgLnkPopWidth : "Largura", +DlgLnkPopHeight : "Altura", +DlgLnkPopLeft : "Posición Esquerda", +DlgLnkPopTop : "Posición dende Arriba", + +DlnLnkMsgNoUrl : "Por favor, escriba a ligazón URL", +DlnLnkMsgNoEMail : "Por favor, escriba o enderezo de e-mail", +DlnLnkMsgNoAnchor : "Por favor, seleccione un destino", +DlnLnkMsgInvPopName : "The popup name must begin with an alphabetic character and must not contain spaces", //MISSING + +// Color Dialog +DlgColorTitle : "Seleccionar Color", +DlgColorBtnClear : "Nengunha", +DlgColorHighlight : "Destacado", +DlgColorSelected : "Seleccionado", + +// Smiley Dialog +DlgSmileyTitle : "Inserte un Smiley", + +// Special Character Dialog +DlgSpecialCharTitle : "Seleccione Caracter Especial", + +// Table Dialog +DlgTableTitle : "Propiedades da Táboa", +DlgTableRows : "Filas", +DlgTableColumns : "Columnas", +DlgTableBorder : "Tamaño do Borde", +DlgTableAlign : "Aliñamento", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Esquerda", +DlgTableAlignCenter : "Centro", +DlgTableAlignRight : "Ereita", +DlgTableWidth : "Largura", +DlgTableWidthPx : "pixels", +DlgTableWidthPc : "percent", +DlgTableHeight : "Altura", +DlgTableCellSpace : "Marxe entre Celas", +DlgTableCellPad : "Marxe interior", +DlgTableCaption : "Título", +DlgTableSummary : "Sumario", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Propriedades da Cela", +DlgCellWidth : "Largura", +DlgCellWidthPx : "pixels", +DlgCellWidthPc : "percent", +DlgCellHeight : "Altura", +DlgCellWordWrap : "Axustar Liñas", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Si", +DlgCellWordWrapNo : "Non", +DlgCellHorAlign : "Aliñamento Horizontal", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Esquerda", +DlgCellHorAlignCenter : "Centro", +DlgCellHorAlignRight: "Dereita", +DlgCellVerAlign : "Aliñamento Vertical", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Arriba", +DlgCellVerAlignMiddle : "Medio", +DlgCellVerAlignBottom : "Abaixo", +DlgCellVerAlignBaseline : "Liña de Base", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Ocupar Filas", +DlgCellCollSpan : "Ocupar Columnas", +DlgCellBackColor : "Color de Fondo", +DlgCellBorderColor : "Color de Borde", +DlgCellBtnSelect : "Seleccionar...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", //MISSING + +// Find Dialog +DlgFindTitle : "Procurar", +DlgFindFindBtn : "Procurar", +DlgFindNotFoundMsg : "Non te atopou o texto indicado.", + +// Replace Dialog +DlgReplaceTitle : "Substituir", +DlgReplaceFindLbl : "Texto a procurar:", +DlgReplaceReplaceLbl : "Substituir con:", +DlgReplaceCaseChk : "Coincidir Mai./min.", +DlgReplaceReplaceBtn : "Substituir", +DlgReplaceReplAllBtn : "Substitiur Todo", +DlgReplaceWordChk : "Coincidir con toda a palabra", + +// Paste Operations / Dialog +PasteErrorCut : "Os axustes de seguridade do seu navegador non permiten que o editor realice automáticamente as tarefas de corte. Por favor, use o teclado para iso (Ctrl+X).", +PasteErrorCopy : "Os axustes de seguridade do seu navegador non permiten que o editor realice automáticamente as tarefas de copia. Por favor, use o teclado para iso (Ctrl+C).", + +PasteAsText : "Pegar como texto plano", +PasteFromWord : "Pegar dende Word", + +DlgPasteMsg2 : "Por favor, pegue dentro do seguinte cadro usando o teclado (Ctrl+V) e pulse OK.", +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", //MISSING +DlgPasteIgnoreFont : "Ignorar as definicións de Tipografía", +DlgPasteRemoveStyles : "Eliminar as definicións de Estilos", + +// Color Picker +ColorAutomatic : "Automático", +ColorMoreColors : "Máis Cores...", + +// Document Properties +DocProps : "Propriedades do Documento", + +// Anchor Dialog +DlgAnchorTitle : "Propriedades da Referencia", +DlgAnchorName : "Nome da Referencia", +DlgAnchorErrorName : "Por favor, escriba o nome da referencia", + +// Speller Pages Dialog +DlgSpellNotInDic : "Non está no diccionario", +DlgSpellChangeTo : "Cambiar a", +DlgSpellBtnIgnore : "Ignorar", +DlgSpellBtnIgnoreAll : "Ignorar Todas", +DlgSpellBtnReplace : "Substituir", +DlgSpellBtnReplaceAll : "Substituir Todas", +DlgSpellBtnUndo : "Desfacer", +DlgSpellNoSuggestions : "- Sen candidatos -", +DlgSpellProgress : "Corrección ortográfica en progreso...", +DlgSpellNoMispell : "Corrección ortográfica rematada: Non se atoparon erros", +DlgSpellNoChanges : "Corrección ortográfica rematada: Non se substituiu nengunha verba", +DlgSpellOneChange : "Corrección ortográfica rematada: Unha verba substituida", +DlgSpellManyChanges : "Corrección ortográfica rematada: %1 verbas substituidas", + +IeSpellDownload : "O corrector ortográfico non está instalado. ¿Quere descargalo agora?", + +// Button Dialog +DlgButtonText : "Texto (Valor)", +DlgButtonType : "Tipo", +DlgButtonTypeBtn : "Button", //MISSING +DlgButtonTypeSbm : "Submit", //MISSING +DlgButtonTypeRst : "Reset", //MISSING + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Nome", +DlgCheckboxValue : "Valor", +DlgCheckboxSelected : "Seleccionado", + +// Form Dialog +DlgFormName : "Nome", +DlgFormAction : "Acción", +DlgFormMethod : "Método", + +// Select Field Dialog +DlgSelectName : "Nome", +DlgSelectValue : "Valor", +DlgSelectSize : "Tamaño", +DlgSelectLines : "liñas", +DlgSelectChkMulti : "Permitir múltiples seleccións", +DlgSelectOpAvail : "Opcións Disponibles", +DlgSelectOpText : "Texto", +DlgSelectOpValue : "Valor", +DlgSelectBtnAdd : "Engadir", +DlgSelectBtnModify : "Modificar", +DlgSelectBtnUp : "Subir", +DlgSelectBtnDown : "Baixar", +DlgSelectBtnSetValue : "Definir como valor por defecto", +DlgSelectBtnDelete : "Borrar", + +// Textarea Dialog +DlgTextareaName : "Nome", +DlgTextareaCols : "Columnas", +DlgTextareaRows : "Filas", + +// Text Field Dialog +DlgTextName : "Nome", +DlgTextValue : "Valor", +DlgTextCharWidth : "Tamaño do Caracter", +DlgTextMaxChars : "Máximo de Caracteres", +DlgTextType : "Tipo", +DlgTextTypeText : "Texto", +DlgTextTypePass : "Chave", + +// Hidden Field Dialog +DlgHiddenName : "Nome", +DlgHiddenValue : "Valor", + +// Bulleted List Dialog +BulletedListProp : "Propriedades das Marcas", +NumberedListProp : "Propriedades da Lista de Numeración", +DlgLstStart : "Start", //MISSING +DlgLstType : "Tipo", +DlgLstTypeCircle : "Círculo", +DlgLstTypeDisc : "Disco", +DlgLstTypeSquare : "Cuadrado", +DlgLstTypeNumbers : "Números (1, 2, 3)", +DlgLstTypeLCase : "Letras Minúsculas (a, b, c)", +DlgLstTypeUCase : "Letras Maiúsculas (A, B, C)", +DlgLstTypeSRoman : "Números Romanos en minúscula (i, ii, iii)", +DlgLstTypeLRoman : "Números Romanos en Maiúscula (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Xeral", +DlgDocBackTab : "Fondo", +DlgDocColorsTab : "Cores e Marxes", +DlgDocMetaTab : "Meta Data", + +DlgDocPageTitle : "Título da Páxina", +DlgDocLangDir : "Orientación do Idioma", +DlgDocLangDirLTR : "Esquerda a Dereita (LTR)", +DlgDocLangDirRTL : "Dereita a Esquerda (RTL)", +DlgDocLangCode : "Código de Idioma", +DlgDocCharSet : "Codificación do Xogo de Caracteres", +DlgDocCharSetCE : "Central European", //MISSING +DlgDocCharSetCT : "Chinese Traditional (Big5)", //MISSING +DlgDocCharSetCR : "Cyrillic", //MISSING +DlgDocCharSetGR : "Greek", //MISSING +DlgDocCharSetJP : "Japanese", //MISSING +DlgDocCharSetKR : "Korean", //MISSING +DlgDocCharSetTR : "Turkish", //MISSING +DlgDocCharSetUN : "Unicode (UTF-8)", //MISSING +DlgDocCharSetWE : "Western European", //MISSING +DlgDocCharSetOther : "Outra Codificación do Xogo de Caracteres", + +DlgDocDocType : "Encabezado do Tipo de Documento", +DlgDocDocTypeOther : "Outro Encabezado do Tipo de Documento", +DlgDocIncXHTML : "Incluir Declaracións XHTML", +DlgDocBgColor : "Cor de Fondo", +DlgDocBgImage : "URL da Imaxe de Fondo", +DlgDocBgNoScroll : "Fondo Fixo", +DlgDocCText : "Texto", +DlgDocCLink : "Ligazóns", +DlgDocCVisited : "Ligazón Visitada", +DlgDocCActive : "Ligazón Activa", +DlgDocMargins : "Marxes da Páxina", +DlgDocMaTop : "Arriba", +DlgDocMaLeft : "Esquerda", +DlgDocMaRight : "Dereita", +DlgDocMaBottom : "Abaixo", +DlgDocMeIndex : "Palabras Chave de Indexación do Documento (separadas por comas)", +DlgDocMeDescr : "Descripción do Documento", +DlgDocMeAuthor : "Autor", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Vista Previa", + +// Templates Dialog +Templates : "Plantillas", +DlgTemplatesTitle : "Plantillas de Contido", +DlgTemplatesSelMsg : "Por favor, seleccione a plantilla a abrir no editor
    (o contido actual perderase):", +DlgTemplatesLoading : "Cargando listado de plantillas. Por favor, espere...", +DlgTemplatesNoTpl : "(Non hai plantillas definidas)", +DlgTemplatesReplace : "Replace actual contents", //MISSING + +// About Dialog +DlgAboutAboutTab : "Acerca de", +DlgAboutBrowserInfoTab : "Información do Navegador", +DlgAboutLicenseTab : "Licencia", +DlgAboutVersion : "versión", +DlgAboutInfo : "Para máis información visitar:", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/gu.js b/webdir/fckeditor/editor/lang/gu.js new file mode 100644 index 0000000..b8d5776 --- /dev/null +++ b/webdir/fckeditor/editor/lang/gu.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Gujarati language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "ટૂલબાર નાનà«àª‚ કરવà«àª‚", +ToolbarExpand : "ટૂલબાર મોટà«àª‚ કરવà«àª‚", + +// Toolbar Items and Context Menu +Save : "સેવ", +NewPage : "નવૠપાનà«àª‚", +Preview : "પૂરà«àªµàª¦àª°à«àª¶àª¨", +Cut : "કાપવà«àª‚", +Copy : "નકલ", +Paste : "પેસà«àªŸ", +PasteText : "પેસà«àªŸ (સાદી ટેકà«àª¸à«àªŸ)", +PasteWord : "પેસà«àªŸ (વડૅ ટેકà«àª¸à«àªŸ)", +Print : "પà«àª°àª¿àª¨à«àªŸ", +SelectAll : "બઘà«àª‚ પસંદ કરવà«àª‚", +RemoveFormat : "ફૉરà«àª®àªŸ કાઢવà«àª‚", +InsertLinkLbl : "સંબંધન, લિંક", +InsertLink : "લિંક ઇનà«àª¸àª°à«àªŸ/દાખલ કરવી", +RemoveLink : "લિંક કાઢવી", +VisitLink : "Open Link", //MISSING +Anchor : "àªàª‚કર ઇનà«àª¸àª°à«àªŸ/દાખલ કરવી", +AnchorDelete : "àªàª‚કર કાઢવી", +InsertImageLbl : "ચિતà«àª°", +InsertImage : "ચિતà«àª° ઇનà«àª¸àª°à«àªŸ/દાખલ કરવà«àª‚", +InsertFlashLbl : "ફà«àª²à«…શ", +InsertFlash : "ફà«àª²à«…શ ઇનà«àª¸àª°à«àªŸ/દાખલ કરવà«àª‚", +InsertTableLbl : "ટેબલ, કોઠો", +InsertTable : "ટેબલ, કોઠો ઇનà«àª¸àª°à«àªŸ/દાખલ કરવà«àª‚", +InsertLineLbl : "રેખા", +InsertLine : "સમસà«àª¤àª°à«€àª¯ રેખા ઇનà«àª¸àª°à«àªŸ/દાખલ કરવી", +InsertSpecialCharLbl: "વિશિષà«àªŸ અકà«àª·àª°", +InsertSpecialChar : "વિશિષà«àªŸ અકà«àª·àª° ઇનà«àª¸àª°à«àªŸ/દાખલ કરવà«àª‚", +InsertSmileyLbl : "સà«àª®àª¾àª‡àª²à«€", +InsertSmiley : "સà«àª®àª¾àª‡àª²à«€ ઇનà«àª¸àª°à«àªŸ/દાખલ કરવી", +About : "FCKeditorના વિષે", +Bold : "બોલà«àª¡/સà«àªªàª·à«àªŸ", +Italic : "ઇટેલિક, તà«àª°àª¾àª‚સા", +Underline : "અનà«àª¡àª°à«àª²àª¾àª‡àª¨, નીચે લીટી", +StrikeThrough : "છેકી નાખવà«àª‚", +Subscript : "àªàª• ચિહà«àª¨àª¨à«€ નીચે કરેલà«àª‚ બીજà«àª‚ ચિહà«àª¨", +Superscript : "àªàª• ચિહà«àª¨ ઉપર કરેલà«àª‚ બીજà«àª‚ ચિહà«àª¨.", +LeftJustify : "ડાબી બાજà«àª/બાજૠતરફ", +CenterJustify : "સંકેંદà«àª°àª£/સેંટરિંગ", +RightJustify : "જમણી બાજà«àª/બાજૠતરફ", +BlockJustify : "બà«àª²à«‰àª•, અંતરાય જસà«àªŸàª¿àª«àª¾àª‡", +DecreaseIndent : "ઇનà«àª¡à«‡àª¨à«àªŸ લીટીના આરંભમાં જગà«àª¯àª¾ ઘટાડવી", +IncreaseIndent : "ઇનà«àª¡à«‡àª¨à«àªŸ, લીટીના આરંભમાં જગà«àª¯àª¾ વધારવી", +Blockquote : "બà«àª²à«‰àª•-કોટ, અવતરણચિહà«àª¨à«‹", +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "રદ કરવà«àª‚; પહેલાં હતી àªàªµà«€ સà«àª¥àª¿àª¤àª¿ પાછી લાવવી", +Redo : "રિડૂ; પછી હતી àªàªµà«€ સà«àª¥àª¿àª¤àª¿ પાછી લાવવી", +NumberedListLbl : "સંખà«àª¯àª¾àª‚કન સૂચિ", +NumberedList : "સંખà«àª¯àª¾àª‚કન સૂચિ ઇનà«àª¸àª°à«àªŸ/દાખલ કરવી", +BulletedListLbl : "બà«àª²à«‡àªŸ સૂચિ", +BulletedList : "બà«àª²à«‡àªŸ સૂચિ ઇનà«àª¸àª°à«àªŸ/દાખલ કરવી", +ShowTableBorders : "ટેબલ, કોઠાની બાજà«(બોરà«àª¡àª°) બતાવવી", +ShowDetails : "વિસà«àª¤à«ƒàª¤ વિગતવાર બતાવવà«àª‚", +Style : "શૈલી/રીત", +FontFormat : "ફૉનà«àªŸ ફૉરà«àª®àªŸ, રચનાની શૈલી", +Font : "ફૉનà«àªŸ", +FontSize : "ફૉનà«àªŸ સાઇàª/કદ", +TextColor : "શબà«àª¦àª¨à«‹ રંગ", +BGColor : "બૅકગà«àª°àª¾àª‰àª¨à«àª¡ રંગ,", +Source : "મૂળ કે પà«àª°àª¾àª¥àª®àª¿àª• દસà«àª¤àª¾àªµà«‡àªœ", +Find : "શોધવà«àª‚", +Replace : "રિપà«àª²à«‡àª¸/બદલવà«àª‚", +SpellCheck : "જોડણી (સà«àªªà«‡àª²àª¿àª‚ગ) તપાસવી", +UniversalKeyboard : "યૂનિવરà«àª¸àª²/વિશà«àªµàªµà«àª¯àª¾àªªàª• કીબૉરà«àª¡", +PageBreakLbl : "પેજબà«àª°à«‡àª•/પાનાને અલગ કરવà«àª‚", +PageBreak : "ઇનà«àª¸àª°à«àªŸ પેજબà«àª°à«‡àª•/પાનાને અલગ કરવà«àª‚/દાખલ કરવà«àª‚", + +Form : "ફૉરà«àª®/પતà«àª°àª•", +Checkbox : "ચેક બોકà«àª¸", +RadioButton : "રેડિઓ બટન", +TextField : "ટેકà«àª¸à«àªŸ ફીલà«àª¡, શબà«àª¦ કà«àª·à«‡àª¤à«àª°", +Textarea : "ટેકà«àª¸à«àªŸ àªàª°àª¿àª†, શબà«àª¦ વિસà«àª¤àª¾àª°", +HiddenField : "ગà«àªªà«àª¤ કà«àª·à«‡àª¤à«àª°", +Button : "બટન", +SelectionField : "પસંદગી કà«àª·à«‡àª¤à«àª°", +ImageButton : "ચિતà«àª° બટન", + +FitWindow : "àªàª¡àª¿àªŸàª°àª¨à«€ સાઇઠઅધિકતમ કરવી", +ShowBlocks : "બà«àª²à«‰àª• બતાવવà«àª‚", + +// Context Menu +EditLink : " લિંક àªàª¡àª¿àªŸ/માં ફેરફાર કરવો", +CellCM : "કોષના ખાના", +RowCM : "પંકà«àª¤àª¿àª¨àª¾ ખાના", +ColumnCM : "કૉલમ/ઊભી કટાર", +InsertRowAfter : "પછી પંકà«àª¤àª¿ ઉમેરવી", +InsertRowBefore : "પહેલાં પંકà«àª¤àª¿ ઉમેરવી", +DeleteRows : "પંકà«àª¤àª¿àª“ ડિલીટ/કાઢી નાખવી", +InsertColumnAfter : "પછી કૉલમ/ઊભી કટાર ઉમેરવી", +InsertColumnBefore : "પહેલાં કૉલમ/ઊભી કટાર ઉમેરવી", +DeleteColumns : "કૉલમ/ઊભી કટાર ડિલીટ/કાઢી નાખવી", +InsertCellAfter : "પછી કોષ ઉમેરવો", +InsertCellBefore : "પહેલાં કોષ ઉમેરવો", +DeleteCells : "કોષ ડિલીટ/કાઢી નાખવો", +MergeCells : "કોષ ભેગા કરવા", +MergeRight : "જમણી બાજૠભેગા કરવા", +MergeDown : "નીચે ભેગા કરવા", +HorizontalSplitCell : "કોષને સમસà«àª¤àª°à«€àª¯ વિભાજન કરવà«àª‚", +VerticalSplitCell : "કોષને સીધà«àª‚ ને ઊભà«àª‚ વિભાજન કરવà«àª‚", +TableDelete : "કોઠો ડિલીટ/કાઢી નાખવà«àª‚", +CellProperties : "કોષના ગà«àª£", +TableProperties : "કોઠાના ગà«àª£", +ImageProperties : "ચિતà«àª°àª¨àª¾ ગà«àª£", +FlashProperties : "ફà«àª²à«…શના ગà«àª£", + +AnchorProp : "àªàª‚કરના ગà«àª£", +ButtonProp : "બટનના ગà«àª£", +CheckboxProp : "ચેક બોકà«àª¸ ગà«àª£", +HiddenFieldProp : "ગà«àªªà«àª¤ કà«àª·à«‡àª¤à«àª°àª¨àª¾ ગà«àª£", +RadioButtonProp : "રેડિઓ બટનના ગà«àª£", +ImageButtonProp : "ચિતà«àª° બટનના ગà«àª£", +TextFieldProp : "ટેકà«àª¸à«àªŸ ફીલà«àª¡, શબà«àª¦ કà«àª·à«‡àª¤à«àª°àª¨àª¾ ગà«àª£", +SelectionFieldProp : "પસંદગી કà«àª·à«‡àª¤à«àª°àª¨àª¾ ગà«àª£", +TextareaProp : "ટેકà«àª¸à«àªŸ àªàª…રિઆ, શબà«àª¦ વિસà«àª¤àª¾àª°àª¨àª¾ ગà«àª£", +FormProp : "ફૉરà«àª®/પતà«àª°àª•àª¨àª¾ ગà«àª£", + +FontFormats : "સામાનà«àª¯;ફૉરà«àª®àªŸà«‡àª¡;સરનામà«àª‚;શીરà«àª·àª• 1;શીરà«àª·àª• 2;શીરà«àª·àª• 3;શીરà«àª·àª• 4;શીરà«àª·àª• 5;શીરà«àª·àª• 6;શીરà«àª·àª• (DIV)", + +// Alerts and Messages +ProcessingXHTML : "XHTML પà«àª°àª•à«àª°àª¿àª¯àª¾ ચાલૠછે. મહેરબાની કરીને રાહ જોવો...", +Done : "પતી ગયà«àª‚", +PasteWordConfirm : "તમે જે ટેકà«àª¸à«àªŸ પેસà«àªŸ કરવા માંગો છો, તે વડૅમાંથી કોપી કરેલૠલાગે છે. પેસà«àªŸ કરતા પહેલાં ટેકà«àª¸à«àªŸ સાફ કરવી છે?", +NotCompatiblePaste : "આ કમાનà«àª¡ ઈનટરનેટ àªàª•à«àª¸àªªà«àª²à«‹àª°àª°(Internet Explorer) 5.5 અથવા àªàª¨àª¾ પછીના વરà«àªàª¨ માટેજ છે. ટેકà«àª¸à«àªŸàª¨à«‡ સાફ કયૅા પહેલાં પેસà«àªŸ કરવી છે?", +UnknownToolbarItem : "અજાણી ટૂલબાર આઇટમ \"%1\"", +UnknownCommand : "અજાણયો કમાનà«àª¡ \"%1\"", +NotImplemented : "કમાનà«àª¡ ઇમà«àªªà«àª²àª¿àª®àª¨à«àªŸ નથી કરોયો", +UnknownToolbarSet : "ટૂલબાર સેટ \"%1\" ઉપલબà«àª§ નથી", +NoActiveX : "તમારા બà«àª°àª¾àª‰àªàª°àª¨à«€ સà«àª°àª•à«àª·àª¾ સેટિંગસ àªàª¡àª¿àªŸàª°àª¨àª¾ અમà«àª• ફીચરને પરવાનગી આપતી નથી. કૃપયા \"Run ActiveX controls and plug-ins\" વિકલà«àªªàª¨à«‡ ઇનેબલ/સમરà«àª¥ કરો. તમારા બà«àª°àª¾àª‰àªàª°àª®àª¾àª‚ àªàª°àª° ઇનà«àªµàª¿àªàª¿àª¬àª² ફીચરનો અનà«àª­àªµ થઈ શકે છે. કૃપયા પૉપ-અપ બà«àª²à«‰àª•àª° ડિસેબલ કરો.", +BrowseServerBlocked : "રિસૉરà«àª¸ બà«àª°àª¾àª‰àªàª° ખોલી ન સકાયà«àª‚.", +DialogBlocked : "ડાયલૉગ વિનà«àª¡à«‹ ખોલી ન સકાયà«àª‚. કૃપયા પૉપ-અપ બà«àª²à«‰àª•àª° ડિસેબલ કરો.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "ઠીક છે", +DlgBtnCancel : "રદ કરવà«àª‚", +DlgBtnClose : "બંધ કરવà«àª‚", +DlgBtnBrowseServer : "સરà«àªµàª° બà«àª°àª¾àª‰àª કરો", +DlgAdvancedTag : "અડà«àªµàª¾àª¨à«àª¸àª¡", +DlgOpOther : "<અનà«àª¯>", +DlgInfoTab : "સૂચના", +DlgAlertUrl : "URL ઇનà«àª¸àª°à«àªŸ કરો", + +// General Dialogs Labels +DlgGenNotSet : "<સેટ નથી>", +DlgGenId : "Id", +DlgGenLangDir : "ભાષા લેખવાની પદà«àª§àª¤àª¿", +DlgGenLangDirLtr : "ડાબે થી જમણે (LTR)", +DlgGenLangDirRtl : "જમણે થી ડાબે (RTL)", +DlgGenLangCode : "ભાષા કોડ", +DlgGenAccessKey : "àªàª•à«àª¸à«‡àª¸ કી", +DlgGenName : "નામ", +DlgGenTabIndex : "ટૅબ ઇનà«àª¡à«‡àª•à«àª¸", +DlgGenLongDescr : "વધારે માહિતી માટે URL", +DlgGenClass : "સà«àªŸàª¾àª‡àª²-શીટ કà«àª²àª¾àª¸", +DlgGenTitle : "મà«àª–à«àª¯ મથાળà«àª‚", +DlgGenContType : "મà«àª–à«àª¯ કનà«àªŸà«‡àª¨à«àªŸ પà«àª°àª•àª¾àª°", +DlgGenLinkCharset : "લિંક રિસૉરà«àª¸ કૅરિકà«àªŸàª° સેટ", +DlgGenStyle : "સà«àªŸàª¾àª‡àª²", + +// Image Dialog +DlgImgTitle : "ચિતà«àª°àª¨àª¾ ગà«àª£", +DlgImgInfoTab : "ચિતà«àª° ની જાણકારી", +DlgImgBtnUpload : "આ સરà«àªµàª°àª¨à«‡ મોકલવà«àª‚", +DlgImgURL : "URL", +DlgImgUpload : "અપલોડ", +DlgImgAlt : "ઑલà«àªŸàª°à«àª¨àªŸ ટેકà«àª¸à«àªŸ", +DlgImgWidth : "પહોળાઈ", +DlgImgHeight : "ઊંચાઈ", +DlgImgLockRatio : "લૉક ગà«àª£à«‹àª¤à«àª¤àª°", +DlgBtnResetSize : "રીસેટ સાઇàª", +DlgImgBorder : "બોરà«àª¡àª°", +DlgImgHSpace : "સમસà«àª¤àª°à«€àª¯ જગà«àª¯àª¾", +DlgImgVSpace : "લંબરૂપ જગà«àª¯àª¾", +DlgImgAlign : "લાઇનદોરીમાં ગોઠવવà«àª‚", +DlgImgAlignLeft : "ડાબી બાજૠગોઠવવà«àª‚", +DlgImgAlignAbsBottom: "Abs નીચે", +DlgImgAlignAbsMiddle: "Abs ઉપર", +DlgImgAlignBaseline : "આધાર લીટી", +DlgImgAlignBottom : "નીચે", +DlgImgAlignMiddle : "વચà«àªšà«‡", +DlgImgAlignRight : "જમણી", +DlgImgAlignTextTop : "ટેકà«àª¸à«àªŸ ઉપર", +DlgImgAlignTop : "ઉપર", +DlgImgPreview : "પૂરà«àªµàª¦àª°à«àª¶àª¨", +DlgImgAlertUrl : "ચિતà«àª°àª¨à«€ URL ટાઇપ કરો", +DlgImgLinkTab : "લિંક", + +// Flash Dialog +DlgFlashTitle : "ફà«àª²à«…શ ગà«àª£", +DlgFlashChkPlay : "ઑટો/સà«àªµàª¯àª‚ પà«àª²à«‡", +DlgFlashChkLoop : "લૂપ", +DlgFlashChkMenu : "ફà«àª²à«…શ મેનà«àª¯à«‚ નો પà«àª°àª¯à«‹àª— કરો", +DlgFlashScale : "સà«àª•à«‡àª²", +DlgFlashScaleAll : "સà«àª•à«‡àª² ઓલ/બધૠબતાવો", +DlgFlashScaleNoBorder : "સà«àª•à«‡àª² બોરà«àª¡àª° વગર", +DlgFlashScaleFit : "સà«àª•à«‡àª² àªàª•àª¦àª® ફીટ", + +// Link Dialog +DlgLnkWindowTitle : "લિંક", +DlgLnkInfoTab : "લિંક ઇનà«àª«à«‰ ટૅબ", +DlgLnkTargetTab : "ટારà«àª—ેટ/લકà«àª·à«àª¯ ટૅબ", + +DlgLnkType : "લિંક પà«àª°àª•àª¾àª°", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "આ પેજનો àªàª‚કર", +DlgLnkTypeEMail : "ઈ-મેલ", +DlgLnkProto : "પà«àª°à«‹àªŸà«‹àª•à«‰àª²", +DlgLnkProtoOther : "<અનà«àª¯>", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "àªàª‚કર પસંદ કરો", +DlgLnkAnchorByName : "àªàª‚કર નામથી પસંદ કરો", +DlgLnkAnchorById : "àªàª‚કર àªàª²àª¿àª®àª¨à«àªŸ Id થી પસંદ કરો", +DlgLnkNoAnchors : "(ડૉકà«àª¯à«àª®àª¨à«àªŸàª®àª¾àª‚ àªàª‚કરની સંખà«àª¯àª¾)", +DlgLnkEMail : "ઈ-મેલ સરનામà«àª‚", +DlgLnkEMailSubject : "ઈ-મેલ વિષય", +DlgLnkEMailBody : "સંદેશ", +DlgLnkUpload : "અપલોડ", +DlgLnkBtnUpload : "આ સરà«àªµàª°àª¨à«‡ મોકલવà«àª‚", + +DlgLnkTarget : "ટારà«àª—ેટ/લકà«àª·à«àª¯", +DlgLnkTargetFrame : "<ફà«àª°à«‡àª®>", +DlgLnkTargetPopup : "<પૉપ-અપ વિનà«àª¡à«‹>", +DlgLnkTargetBlank : "નવી વિનà«àª¡à«‹ (_blank)", +DlgLnkTargetParent : "મૂળ વિનà«àª¡à«‹ (_parent)", +DlgLnkTargetSelf : "આજ વિનà«àª¡à«‹ (_self)", +DlgLnkTargetTop : "ઉપરની વિનà«àª¡à«‹ (_top)", +DlgLnkTargetFrameName : "ટારà«àª—ેટ ફà«àª°à«‡àª® નà«àª‚ નામ", +DlgLnkPopWinName : "પૉપ-અપ વિનà«àª¡à«‹ નà«àª‚ નામ", +DlgLnkPopWinFeat : "પૉપ-અપ વિનà«àª¡à«‹ ફીચરસૅ", +DlgLnkPopResize : "સાઇઠબદલી સકાય છે", +DlgLnkPopLocation : "લોકેશન બાર", +DlgLnkPopMenu : "મેનà«àª¯à«‚ બાર", +DlgLnkPopScroll : "સà«àª•à«àª°à«‹àª² બાર", +DlgLnkPopStatus : "સà«àªŸà«…ટસ બાર", +DlgLnkPopToolbar : "ટૂલ બાર", +DlgLnkPopFullScrn : "ફà«àª² સà«àª•à«àª°à«€àª¨ (IE)", +DlgLnkPopDependent : "ડિપેનà«àª¡àª¨à«àªŸ (Netscape)", +DlgLnkPopWidth : "પહોળાઈ", +DlgLnkPopHeight : "ઊંચાઈ", +DlgLnkPopLeft : "ડાબી બાજà«", +DlgLnkPopTop : "જમણી બાજà«", + +DlnLnkMsgNoUrl : "લિંક URL ટાઇપ કરો", +DlnLnkMsgNoEMail : "ઈ-મેલ સરનામà«àª‚ ટાઇપ કરો", +DlnLnkMsgNoAnchor : "àªàª‚કર પસંદ કરો", +DlnLnkMsgInvPopName : "પૉપ-અપ વિનà«àª¡à«‹ નà«àª‚ નામ àªàª²à«àª«àª¬à«‡àªŸàª¥à«€ શરૂ કરવો અને તેમાં સà«àªªà«‡àª‡àª¸ ન હોવી જોઈàª", + +// Color Dialog +DlgColorTitle : "રંગ પસંદ કરો", +DlgColorBtnClear : "સાફ કરો", +DlgColorHighlight : "હાઈલાઇટ", +DlgColorSelected : "સિલેકà«àªŸà«‡àª¡/પસંદ કરવà«àª‚", + +// Smiley Dialog +DlgSmileyTitle : "સà«àª®àª¾àª‡àª²à«€ પસંદ કરો", + +// Special Character Dialog +DlgSpecialCharTitle : "સà«àªªà«‡àª¶àª¿àª…લ વિશિષà«àªŸ અકà«àª·àª° પસંદ કરો", + +// Table Dialog +DlgTableTitle : "ટેબલ, કોઠાનà«àª‚ મથાળà«àª‚", +DlgTableRows : "પંકà«àª¤àª¿àª¨àª¾ ખાના", +DlgTableColumns : "કૉલમ/ઊભી કટાર", +DlgTableBorder : "કોઠાની બાજà«(બોરà«àª¡àª°) સાઇàª", +DlgTableAlign : "અલાઇનમનà«àªŸ/ગોઠવાયેલà«àª‚ ", +DlgTableAlignNotSet : "<સેટ નથી>", +DlgTableAlignLeft : "ડાબી બાજà«", +DlgTableAlignCenter : "મધà«àª¯ સેનà«àªŸàª°", +DlgTableAlignRight : "જમણી બાજà«", +DlgTableWidth : "પહોળાઈ", +DlgTableWidthPx : "પિકસલ", +DlgTableWidthPc : "પà«àª°àª¤àª¿àª¶àª¤", +DlgTableHeight : "ઊંચાઈ", +DlgTableCellSpace : "સેલ અંતર", +DlgTableCellPad : "સેલ પૅડિંગ", +DlgTableCaption : "મથાળà«àª‚/કૅપà«àª¶àª¨ ", +DlgTableSummary : "ટૂંકો àªàª¹à«‡àªµàª¾àª²", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "પંકà«àª¤àª¿àª¨àª¾ ખાનાના ગà«àª£", +DlgCellWidth : "પહોળાઈ", +DlgCellWidthPx : "પિકસલ", +DlgCellWidthPc : "પà«àª°àª¤àª¿àª¶àª¤", +DlgCellHeight : "ઊંચાઈ", +DlgCellWordWrap : "વરà«àª¡ રૅપ", +DlgCellWordWrapNotSet : "<સેટ નથી>", +DlgCellWordWrapYes : "હા", +DlgCellWordWrapNo : "ના", +DlgCellHorAlign : "સમસà«àª¤àª°à«€àª¯ ગોઠવવà«àª‚", +DlgCellHorAlignNotSet : "<સેટ નથી>", +DlgCellHorAlignLeft : "ડાબી બાજà«", +DlgCellHorAlignCenter : "મધà«àª¯ સેનà«àªŸàª°", +DlgCellHorAlignRight: "જમણી બાજà«", +DlgCellVerAlign : "લંબરૂપ ગોઠવવà«àª‚", +DlgCellVerAlignNotSet : "<સેટ નથી>", +DlgCellVerAlignTop : "ઉપર", +DlgCellVerAlignMiddle : "મધà«àª¯ સેનà«àªŸàª°", +DlgCellVerAlignBottom : "નીચે", +DlgCellVerAlignBaseline : "મૂળ રેખા", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "પંકà«àª¤àª¿ સà«àªªàª¾àª¨", +DlgCellCollSpan : "કૉલમ/ઊભી કટાર સà«àªªàª¾àª¨", +DlgCellBackColor : "બૅકગà«àª°àª¾àª‰àª¨à«àª¡ રંગ", +DlgCellBorderColor : "બોરà«àª¡àª°àª¨à«‹ રંગ", +DlgCellBtnSelect : "પસંદ કરો...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "શોધવà«àª‚ અને બદલવà«àª‚", + +// Find Dialog +DlgFindTitle : "શોધવà«àª‚", +DlgFindFindBtn : "શોધવà«àª‚", +DlgFindNotFoundMsg : "તમે શોધેલી ટેકà«àª¸à«àªŸ નથી મળી", + +// Replace Dialog +DlgReplaceTitle : "બદલવà«àª‚", +DlgReplaceFindLbl : "આ શોધો", +DlgReplaceReplaceLbl : "આનાથી બદલો", +DlgReplaceCaseChk : "કેસ સરખા રાખો", +DlgReplaceReplaceBtn : "બદલવà«àª‚", +DlgReplaceReplAllBtn : "બઘા બદલી ", +DlgReplaceWordChk : "બઘા શબà«àª¦ સરખા રાખો", + +// Paste Operations / Dialog +PasteErrorCut : "તમારા બà«àª°àª¾àª‰àªàª° ની સà«àª°àª•à«àª·àª¿àª¤ સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl+X) નો ઉપયોગ કરો.", +PasteErrorCopy : "તમારા બà«àª°àª¾àª‰àªàª° ની સà«àª°àª•à«àª·àª¿àª¤ સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી. (Ctrl+C) का पà¥à¤°à¤¯à¥‹à¤— करें।", + +PasteAsText : "પેસà«àªŸ (ટેકà«àª¸à«àªŸ)", +PasteFromWord : "પેસà«àªŸ (વરà«àª¡ થી)", + +DlgPasteMsg2 : "Ctrl+V નો પà«àª°àª¯à«‹àª— કરી પેસà«àªŸ કરો", +DlgPasteSec : "તમારા બà«àª°àª¾àª‰àªàª° ની સà«àª°àª•à«àª·àª¿àª¤ સેટિંગસના કારણે,àªàª¡àª¿àªŸàª° તમારા કિલà«àªªàª¬à«‹àª°à«àª¡ ડેટા ને કોપી નથી કરી શકતો. તમારે આ વિનà«àª¡à«‹àª®àª¾àª‚ ફરીથી પેસà«àªŸ કરવà«àª‚ પડશે.", +DlgPasteIgnoreFont : "ફૉનà«àªŸàª«à«‡àª¸ વà«àª¯àª¾àª–à«àª¯àª¾àª¨à«€ અવગણના", +DlgPasteRemoveStyles : "સà«àªŸàª¾àª‡àª² વà«àª¯àª¾àª–à«àª¯àª¾ કાઢી નાખવી", + +// Color Picker +ColorAutomatic : "સà«àªµàªšàª¾àª²àª¿àª¤", +ColorMoreColors : "ઔર રંગ...", + +// Document Properties +DocProps : "ડૉકà«àª¯à«àª®àª¨à«àªŸ ગà«àª£/પà«àª°à«‰àªªàª°à«àªŸàª¿àª", + +// Anchor Dialog +DlgAnchorTitle : "àªàª‚કર ગà«àª£/પà«àª°à«‰àªªàª°à«àªŸàª¿àª", +DlgAnchorName : "àªàª‚કરનà«àª‚ નામ", +DlgAnchorErrorName : "àªàª‚કરનà«àª‚ નામ ટાઈપ કરો", + +// Speller Pages Dialog +DlgSpellNotInDic : "શબà«àª¦àª•à«‹àª¶àª®àª¾àª‚ નથી", +DlgSpellChangeTo : "આનાથી બદલવà«àª‚", +DlgSpellBtnIgnore : "ઇગà«àª¨à«‹àª°/અવગણના કરવી", +DlgSpellBtnIgnoreAll : "બધાની ઇગà«àª¨à«‹àª°/અવગણના કરવી", +DlgSpellBtnReplace : "બદલવà«àª‚", +DlgSpellBtnReplaceAll : "બધા બદલી કરો", +DlgSpellBtnUndo : "અનà«àª¡à«‚", +DlgSpellNoSuggestions : "- કઇ સજેશન નથી -", +DlgSpellProgress : "શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² ચેક ચાલૠછે...", +DlgSpellNoMispell : "શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² ચેક પૂરà«àª£: ખોટી જોડણી મળી નથી", +DlgSpellNoChanges : "શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² ચેક પૂરà«àª£: àªàª•àªªàª£ શબà«àª¦ બદલયો નથી", +DlgSpellOneChange : "શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² ચેક પૂરà«àª£: àªàª• શબà«àª¦ બદલયો છે", +DlgSpellManyChanges : "શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² ચેક પૂરà«àª£: %1 શબà«àª¦ બદલયા છે", + +IeSpellDownload : "સà«àªªà«‡àª²-ચેકર ઇનà«àª¸à«àªŸà«‹àª² નથી. શà«àª‚ તમે ડાઉનલોડ કરવા માંગો છો?", + +// Button Dialog +DlgButtonText : "ટેકà«àª¸à«àªŸ (વૅલà«àª¯à«‚)", +DlgButtonType : "પà«àª°àª•àª¾àª°", +DlgButtonTypeBtn : "બટન", +DlgButtonTypeSbm : "સબà«àª®àª¿àªŸ", +DlgButtonTypeRst : "રિસેટ", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "નામ", +DlgCheckboxValue : "વૅલà«àª¯à«‚", +DlgCheckboxSelected : "સિલેકà«àªŸà«‡àª¡", + +// Form Dialog +DlgFormName : "નામ", +DlgFormAction : "કà«àª°àª¿àª¯àª¾", +DlgFormMethod : "પદà«àª§àª¤àª¿", + +// Select Field Dialog +DlgSelectName : "નામ", +DlgSelectValue : "વૅલà«àª¯à«‚", +DlgSelectSize : "સાઇàª", +DlgSelectLines : "લીટીઓ", +DlgSelectChkMulti : "àªàª•àª¥à«€ વધારે પસંદ કરી શકો", +DlgSelectOpAvail : "ઉપલબà«àª§ વિકલà«àªª", +DlgSelectOpText : "ટેકà«àª¸à«àªŸ", +DlgSelectOpValue : "વૅલà«àª¯à«‚", +DlgSelectBtnAdd : "ઉમેરવà«àª‚", +DlgSelectBtnModify : "બદલવà«àª‚", +DlgSelectBtnUp : "ઉપર", +DlgSelectBtnDown : "નીચે", +DlgSelectBtnSetValue : "પસંદ કરલી વૅલà«àª¯à«‚ સેટ કરો", +DlgSelectBtnDelete : "રદ કરવà«àª‚", + +// Textarea Dialog +DlgTextareaName : "નામ", +DlgTextareaCols : "કૉલમ/ઊભી કટાર", +DlgTextareaRows : "પંકà«àª¤àª¿àª“", + +// Text Field Dialog +DlgTextName : "નામ", +DlgTextValue : "વૅલà«àª¯à«‚", +DlgTextCharWidth : "કેરેકà«àªŸàª°àª¨à«€ પહોળાઈ", +DlgTextMaxChars : "અધિકતમ કેરેકà«àªŸàª°", +DlgTextType : "ટાઇપ", +DlgTextTypeText : "ટેકà«àª¸à«àªŸ", +DlgTextTypePass : "પાસવરà«àª¡", + +// Hidden Field Dialog +DlgHiddenName : "નામ", +DlgHiddenValue : "વૅલà«àª¯à«‚", + +// Bulleted List Dialog +BulletedListProp : "બà«àª²à«‡àªŸ સૂચિ ગà«àª£", +NumberedListProp : "સંખà«àª¯àª¾àª‚કà«àª¤àª¿ સૂચિ ગà«àª£", +DlgLstStart : "શરૂઆતથી", +DlgLstType : "પà«àª°àª•àª¾àª°", +DlgLstTypeCircle : "વરà«àª¤à«àª³", +DlgLstTypeDisc : "ડિસà«àª•", +DlgLstTypeSquare : "ચોરસ", +DlgLstTypeNumbers : "સંખà«àª¯àª¾ (1, 2, 3)", +DlgLstTypeLCase : "નાના અકà«àª·àª° (a, b, c)", +DlgLstTypeUCase : "મોટા અકà«àª·àª° (A, B, C)", +DlgLstTypeSRoman : "નાના રોમન આંક (i, ii, iii)", +DlgLstTypeLRoman : "મોટા રોમન આંક (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "સાધારણ", +DlgDocBackTab : "બૅકગà«àª°àª¾àª‰àª¨à«àª¡", +DlgDocColorsTab : "રંગ અને મારà«àªœàª¿àª¨/કિનાર", +DlgDocMetaTab : "મેટાડૅટા", + +DlgDocPageTitle : "પેજ મથાળà«àª‚/ટાઇટલ", +DlgDocLangDir : "ભાષા લેખવાની પદà«àª§àª¤àª¿", +DlgDocLangDirLTR : "ડાબે થી જમણે (LTR)", +DlgDocLangDirRTL : "જમણે થી ડાબે (RTL)", +DlgDocLangCode : "ભાષા કોડ", +DlgDocCharSet : "કેરેકà«àªŸàª° સેટ àªàª¨à«àª•à«‹àª¡àª¿àª‚ગ", +DlgDocCharSetCE : "મધà«àª¯ યà«àª°à«‹àªªàª¿àª…ન (Central European)", +DlgDocCharSetCT : "ચાઇનીઠ(Chinese Traditional Big5)", +DlgDocCharSetCR : "સિરીલિક (Cyrillic)", +DlgDocCharSetGR : "ગà«àª°à«€àª• (Greek)", +DlgDocCharSetJP : "જાપાનિઠ(Japanese)", +DlgDocCharSetKR : "કોરીયન (Korean)", +DlgDocCharSetTR : "ટરà«àª•àª¿ (Turkish)", +DlgDocCharSetUN : "યૂનિકોડ (UTF-8)", +DlgDocCharSetWE : "પશà«àªšàª¿àª® યà«àª°à«‹àªªàª¿àª…ન (Western European)", +DlgDocCharSetOther : "અનà«àª¯ કેરેકà«àªŸàª° સેટ àªàª¨à«àª•à«‹àª¡àª¿àª‚ગ", + +DlgDocDocType : "ડૉકà«àª¯à«àª®àª¨à«àªŸ પà«àª°àª•àª¾àª° શીરà«àª·àª•", +DlgDocDocTypeOther : "અનà«àª¯ ડૉકà«àª¯à«àª®àª¨à«àªŸ પà«àª°àª•àª¾àª° શીરà«àª·àª•", +DlgDocIncXHTML : "XHTML સૂચના સમાવિષà«àªŸ કરવી", +DlgDocBgColor : "બૅકગà«àª°àª¾àª‰àª¨à«àª¡ રંગ", +DlgDocBgImage : "બૅકગà«àª°àª¾àª‰àª¨à«àª¡ ચિતà«àª° URL", +DlgDocBgNoScroll : "સà«àª•à«àª°à«‹àª² ન થાય તેવà«àª‚ બૅકગà«àª°àª¾àª‰àª¨à«àª¡", +DlgDocCText : "ટેકà«àª¸à«àªŸ", +DlgDocCLink : "લિંક", +DlgDocCVisited : "વિàªàª¿àªŸà«‡àª¡ લિંક", +DlgDocCActive : "સકà«àª°àª¿àª¯ લિંક", +DlgDocMargins : "પેજ મારà«àªœàª¿àª¨", +DlgDocMaTop : "ઉપર", +DlgDocMaLeft : "ડાબી", +DlgDocMaRight : "જમણી", +DlgDocMaBottom : "નીચે", +DlgDocMeIndex : "ડૉકà«àª¯à«àª®àª¨à«àªŸ ઇનà«àª¡à«‡àª•à«àª¸ સંકેતશબà«àª¦ (અલà«àªªàªµàª¿àª°àª¾àª® (,) થી અલગ કરો)", +DlgDocMeDescr : "ડૉકà«àª¯à«àª®àª¨à«àªŸ વરà«àª£àª¨", +DlgDocMeAuthor : "લેખક", +DlgDocMeCopy : "કૉપિરાઇટ", +DlgDocPreview : "પૂરà«àªµàª¦àª°à«àª¶àª¨", + +// Templates Dialog +Templates : "ટેમà«àªªà«àª²à«‡àªŸ", +DlgTemplatesTitle : "કનà«àªŸà«‡àª¨à«àªŸ ટેમà«àªªà«àª²à«‡àªŸ", +DlgTemplatesSelMsg : "àªàª¡àª¿àªŸàª°àª®àª¾àª‚ ઓપન કરવા ટેમà«àªªà«àª²à«‡àªŸ પસંદ કરો (વરà«àª¤àª®àª¾àª¨ કનà«àªŸà«‡àª¨à«àªŸ સેવ નહીં થાય):", +DlgTemplatesLoading : "ટેમà«àªªà«àª²à«‡àªŸ સૂચિ લોડ થાય છે. રાહ જà«àª“...", +DlgTemplatesNoTpl : "(કોઈ ટેમà«àªªà«àª²à«‡àªŸ ડિફાઇન નથી)", +DlgTemplatesReplace : "મૂળ શબà«àª¦àª¨à«‡ બદલો", + +// About Dialog +DlgAboutAboutTab : "FCKEditor ના વિષે", +DlgAboutBrowserInfoTab : "બà«àª°àª¾àª‰àªàª° ના વિષે", +DlgAboutLicenseTab : "લાઇસનà«àª¸", +DlgAboutVersion : "વરà«àªàª¨", +DlgAboutInfo : "વધારે માહિતી માટે:", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/he.js b/webdir/fckeditor/editor/lang/he.js new file mode 100644 index 0000000..c352137 --- /dev/null +++ b/webdir/fckeditor/editor/lang/he.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Hebrew language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "rtl", + +ToolbarCollapse : "כיווץ סרגל הכלי×", +ToolbarExpand : "פתיחת סרגל הכלי×", + +// Toolbar Items and Context Menu +Save : "שמירה", +NewPage : "דף חדש", +Preview : "תצוגה מקדימה", +Cut : "גזירה", +Copy : "העתקה", +Paste : "הדבקה", +PasteText : "הדבקה כטקסט פשוט", +PasteWord : "הדבקה מ-וורד", +Print : "הדפסה", +SelectAll : "בחירת הכל", +RemoveFormat : "הסרת העיצוב", +InsertLinkLbl : "קישור", +InsertLink : "הוספת/עריכת קישור", +RemoveLink : "הסרת הקישור", +VisitLink : "פתח קישור", +Anchor : "הוספת/עריכת נקודת עיגון", +AnchorDelete : "הסר נקודת עיגון", +InsertImageLbl : "תמונה", +InsertImage : "הוספת/עריכת תמונה", +InsertFlashLbl : "פל×ש", +InsertFlash : "הוסף/ערוך פל×ש", +InsertTableLbl : "טבלה", +InsertTable : "הוספת/עריכת טבלה", +InsertLineLbl : "קו", +InsertLine : "הוספת קו ×ופקי", +InsertSpecialCharLbl: "תו מיוחד", +InsertSpecialChar : "הוספת תו מיוחד", +InsertSmileyLbl : "סמיילי", +InsertSmiley : "הוספת סמיילי", +About : "×ודות FCKeditor", +Bold : "מודגש", +Italic : "נטוי", +Underline : "קו תחתון", +StrikeThrough : "כתיב מחוק", +Subscript : "כתיב תחתון", +Superscript : "כתיב עליון", +LeftJustify : "יישור לשמ×ל", +CenterJustify : "מרכוז", +RightJustify : "יישור לימין", +BlockJustify : "יישור לשוליי×", +DecreaseIndent : "הקטנת ×ינדנטציה", +IncreaseIndent : "הגדלת ×ינדנטציה", +Blockquote : "בלוק ציטוט", +CreateDiv : "צור מיכל(תג)DIV", +EditDiv : "ערוך מיכל (תג)DIV", +DeleteDiv : "הסר מיכל(תג) DIV", +Undo : "ביטול צעד ×חרון", +Redo : "חזרה על צעד ×חרון", +NumberedListLbl : "רשימה ממוספרת", +NumberedList : "הוספת/הסרת רשימה ממוספרת", +BulletedListLbl : "רשימת נקודות", +BulletedList : "הוספת/הסרת רשימת נקודות", +ShowTableBorders : "הצגת מסגרת הטבלה", +ShowDetails : "הצגת פרטי×", +Style : "סגנון", +FontFormat : "עיצוב", +Font : "גופן", +FontSize : "גודל", +TextColor : "צבע טקסט", +BGColor : "צבע רקע", +Source : "מקור", +Find : "חיפוש", +Replace : "החלפה", +SpellCheck : "בדיקת ×יות", +UniversalKeyboard : "מקלדת ×וניברסלית", +PageBreakLbl : "שבירת דף", +PageBreak : "הוסף שבירת דף", + +Form : "טופס", +Checkbox : "תיבת סימון", +RadioButton : "לחצן ×פשרויות", +TextField : "שדה טקסט", +Textarea : "×יזור טקסט", +HiddenField : "שדה חבוי", +Button : "כפתור", +SelectionField : "שדה בחירה", +ImageButton : "כפתור תמונה", + +FitWindow : "הגדל ×ת גודל העורך", +ShowBlocks : "הצג בלוקי×", + +// Context Menu +EditLink : "עריכת קישור", +CellCM : "ת×", +RowCM : "שורה", +ColumnCM : "עמודה", +InsertRowAfter : "הוסף שורה ×חרי", +InsertRowBefore : "הוסף שורה לפני", +DeleteRows : "מחיקת שורות", +InsertColumnAfter : "הוסף עמודה ×חרי", +InsertColumnBefore : "הוסף עמודה לפני", +DeleteColumns : "מחיקת עמודות", +InsertCellAfter : "הוסף ×ª× ×חרי", +InsertCellBefore : "הוסף ×ª× ×חרי", +DeleteCells : "מחיקת ת××™×", +MergeCells : "מיזוג ת××™×", +MergeRight : "מזג ימינה", +MergeDown : "מזג למטה", +HorizontalSplitCell : "פצל ×ª× ×ופקית", +VerticalSplitCell : "פצל ×ª× ×נכית", +TableDelete : "מחק טבלה", +CellProperties : "תכונות הת×", +TableProperties : "תכונות הטבלה", +ImageProperties : "תכונות התמונה", +FlashProperties : "מ×פייני פל×ש", + +AnchorProp : "מ×פייני נקודת עיגון", +ButtonProp : "מ×פייני כפתור", +CheckboxProp : "מ×פייני תיבת סימון", +HiddenFieldProp : "מ×פיני שדה חבוי", +RadioButtonProp : "מ×פייני לחצן ×פשרויות", +ImageButtonProp : "מ×פיני כפתור תמונה", +TextFieldProp : "מ×פייני שדה טקסט", +SelectionFieldProp : "מ×פייני שדה בחירה", +TextareaProp : "מ×פיני ×יזור טקסט", +FormProp : "מ×פיני טופס", + +FontFormats : "נורמלי;קוד;כתובת;כותרת;כותרת 2;כותרת 3;כותרת 4;כותרת 5;כותרת 6", + +// Alerts and Messages +ProcessingXHTML : "מעבד XHTML, × × ×œ×”×ž×ª×™×Ÿ...", +Done : "המשימה הושלמה", +PasteWordConfirm : "נר××” הטקסט שבכוונתך להדביק מקורו בקובץ וורד. ×”×× ×‘×¨×¦×•× ×š לנקות ×ותו ×˜×¨× ×”×”×“×‘×§×”?", +NotCompatiblePaste : "פעולה זו זמינה לדפדפן ×ינטרנט ×קספלורר ×ž×’×™×¨×¡× 5.5 ומעלה. ×”×× ×œ×”×ž×©×™×š בהדבקה ×œ×œ× ×”× ×™×§×•×™?", +UnknownToolbarItem : "פריט ×œ× ×™×“×•×¢ בסרגל ×”×›×œ×™× \"%1\"", +UnknownCommand : "×©× ×¤×¢×•×œ×” ×œ× ×™×“×•×¢ \"%1\"", +NotImplemented : "הפקודה ×œ× ×ž×™×•×©×ž×ª", +UnknownToolbarSet : "ערכת סרגל ×”×›×œ×™× \"%1\" ×œ× ×§×™×™×ž×ª", +NoActiveX : "הגדרות ×בטחה של הדפדפן עלולות לגביל ×ת ×פשרויות העריכה.יש ל×פשר ×ת ×”×ופציה \"הרץ ×¤×§×“×™× ×¤×¢×™×œ×™× ×•×ª×•×¡×¤×•×ª\". תוכל לחוות טעויות ×•×—×™×•×•×™× ×©×œ ×פשרויות שחסרי×.", +BrowseServerBlocked : "×œ× × ×™×ª×Ÿ לגשת לדפדפן מש×בי×.×× × ×•×•×“× ×©×—×•×¡× ×—×œ×•× ×•×ª ×”×§×•×¤×¦×™× ×œ× ×¤×¢×™×œ.", +DialogBlocked : "×œ× ×”×™×” ניתן לפתוח חלון די×לוג. ×× × ×•×•×“× ×©×—×•×¡× ×—×œ×•× ×•×ª ×§×•×¤×¦×™× ×œ× ×¤×¢×™×œ.", +VisitLinkBlocked : "×œ× × ×™×ª×Ÿ לפתוח חלון חדש.× × ×œ×•×•×“× ×©×—×•×¡×ž×™ החלונות ×”×§×•×¤×¦×™× ×œ× ×¤×¢×™×œ×™×.", + +// Dialogs +DlgBtnOK : "×ישור", +DlgBtnCancel : "ביטול", +DlgBtnClose : "סגירה", +DlgBtnBrowseServer : "סייר השרת", +DlgAdvancedTag : "×פשרויות מתקדמות", +DlgOpOther : "<×חר>", +DlgInfoTab : "מידע", +DlgAlertUrl : "×× × ×”×–×Ÿ URL", + +// General Dialogs Labels +DlgGenNotSet : "<×œ× × ×§×‘×¢>", +DlgGenId : "זיהוי (Id)", +DlgGenLangDir : "כיוון שפה", +DlgGenLangDirLtr : "שמ×ל לימין (LTR)", +DlgGenLangDirRtl : "ימין לשמ×ל (RTL)", +DlgGenLangCode : "קוד שפה", +DlgGenAccessKey : "מקש גישה", +DlgGenName : "ש×", +DlgGenTabIndex : "מספר ט×ב", +DlgGenLongDescr : "קישור לתי×ור מפורט", +DlgGenClass : "גיליונות עיצוב קבוצות", +DlgGenTitle : "כותרת מוצעת", +DlgGenContType : "Content Type מוצע", +DlgGenLinkCharset : "קידוד המש×ב המקושר", +DlgGenStyle : "סגנון", + +// Image Dialog +DlgImgTitle : "תכונות התמונה", +DlgImgInfoTab : "מידע על התמונה", +DlgImgBtnUpload : "שליחה לשרת", +DlgImgURL : "כתובת (URL)", +DlgImgUpload : "העל××”", +DlgImgAlt : "טקסט חלופי", +DlgImgWidth : "רוחב", +DlgImgHeight : "גובה", +DlgImgLockRatio : "נעילת היחס", +DlgBtnResetSize : "×יפוס הגודל", +DlgImgBorder : "מסגרת", +DlgImgHSpace : "מרווח ×ופקי", +DlgImgVSpace : "מרווח ×× ×›×™", +DlgImgAlign : "יישור", +DlgImgAlignLeft : "לשמ×ל", +DlgImgAlignAbsBottom: "לתחתית ×”×בסולוטית", +DlgImgAlignAbsMiddle: "מרכוז ×בסולוטי", +DlgImgAlignBaseline : "לקו התחתית", +DlgImgAlignBottom : "לתחתית", +DlgImgAlignMiddle : "ל×מצע", +DlgImgAlignRight : "לימין", +DlgImgAlignTextTop : "לר×ש הטקסט", +DlgImgAlignTop : "למעלה", +DlgImgPreview : "תצוגה מקדימה", +DlgImgAlertUrl : "× × ×œ×”×§×œ×™×“ ×ת כתובת התמונה", +DlgImgLinkTab : "קישור", + +// Flash Dialog +DlgFlashTitle : "מ×פיני פל×ש", +DlgFlashChkPlay : "נגן ×וטומטי", +DlgFlashChkLoop : "לול××”", +DlgFlashChkMenu : "×פשר תפריט פל×ש", +DlgFlashScale : "גודל", +DlgFlashScaleAll : "הצג הכל", +DlgFlashScaleNoBorder : "×œ×œ× ×’×‘×•×œ×•×ª", +DlgFlashScaleFit : "הת×מה מושלמת", + +// Link Dialog +DlgLnkWindowTitle : "קישור", +DlgLnkInfoTab : "מידע על הקישור", +DlgLnkTargetTab : "מטרה", + +DlgLnkType : "סוג קישור", +DlgLnkTypeURL : "כתובת (URL)", +DlgLnkTypeAnchor : "עוגן בעמוד ×–×”", +DlgLnkTypeEMail : "דו×''ל", +DlgLnkProto : "פרוטוקול", +DlgLnkProtoOther : "<×חר>", +DlgLnkURL : "כתובת (URL)", +DlgLnkAnchorSel : "בחירת עוגן", +DlgLnkAnchorByName : "עפ''×™ ×©× ×”×¢×•×’×Ÿ", +DlgLnkAnchorById : "עפ''×™ זיהוי (Id) הרכיב", +DlgLnkNoAnchors : "(×ין ×¢×•×’× ×™× ×–×ž×™× ×™× ×‘×“×£)", +DlgLnkEMail : "כתובת הדו×''ל", +DlgLnkEMailSubject : "× ×•×©× ×”×”×•×“×¢×”", +DlgLnkEMailBody : "גוף ההודעה", +DlgLnkUpload : "העל××”", +DlgLnkBtnUpload : "שליחה לשרת", + +DlgLnkTarget : "מטרה", +DlgLnkTargetFrame : "<מסגרת>", +DlgLnkTargetPopup : "<חלון קופץ>", +DlgLnkTargetBlank : "חלון חדש (_blank)", +DlgLnkTargetParent : "חלון ×”×ב (_parent)", +DlgLnkTargetSelf : "ב×ותו החלון (_self)", +DlgLnkTargetTop : "חלון ר×שי (_top)", +DlgLnkTargetFrameName : "×©× ×ž×¡×’×¨×ª היעד", +DlgLnkPopWinName : "×©× ×”×—×œ×•×Ÿ הקופץ", +DlgLnkPopWinFeat : "תכונות החלון הקופץ", +DlgLnkPopResize : "בעל גודל ניתן לשינוי", +DlgLnkPopLocation : "סרגל כתובת", +DlgLnkPopMenu : "סרגל תפריט", +DlgLnkPopScroll : "ניתן לגלילה", +DlgLnkPopStatus : "סרגל חיווי", +DlgLnkPopToolbar : "סרגל הכלי×", +DlgLnkPopFullScrn : "מסך ×ž×œ× (IE)", +DlgLnkPopDependent : "תלוי (Netscape)", +DlgLnkPopWidth : "רוחב", +DlgLnkPopHeight : "גובה", +DlgLnkPopLeft : "×ž×™×§×•× ×¦×“ שמ×ל", +DlgLnkPopTop : "×ž×™×§×•× ×¦×“ עליון", + +DlnLnkMsgNoUrl : "× × ×œ×”×§×œ×™×“ ×ת כתובת הקישור (URL)", +DlnLnkMsgNoEMail : "× × ×œ×”×§×œ×™×“ ×ת כתובת הדו×''ל", +DlnLnkMsgNoAnchor : "× × ×œ×‘×—×•×¨ עוגן במסמך", +DlnLnkMsgInvPopName : "×©× ×”×—×œ×•×Ÿ הקופץ חייב להתחיל ב×ותיות ו×סור לכלול רווחי×", + +// Color Dialog +DlgColorTitle : "בחירת צבע", +DlgColorBtnClear : "×יפוס", +DlgColorHighlight : "נוכחי", +DlgColorSelected : "נבחר", + +// Smiley Dialog +DlgSmileyTitle : "הוספת סמיילי", + +// Special Character Dialog +DlgSpecialCharTitle : "בחירת תו מיוחד", + +// Table Dialog +DlgTableTitle : "תכונות טבלה", +DlgTableRows : "שורות", +DlgTableColumns : "עמודות", +DlgTableBorder : "גודל מסגרת", +DlgTableAlign : "יישור", +DlgTableAlignNotSet : "<×œ× × ×§×‘×¢>", +DlgTableAlignLeft : "שמ×ל", +DlgTableAlignCenter : "מרכז", +DlgTableAlignRight : "ימין", +DlgTableWidth : "רוחב", +DlgTableWidthPx : "פיקסלי×", +DlgTableWidthPc : "×חוז", +DlgTableHeight : "גובה", +DlgTableCellSpace : "מרווח ת×", +DlgTableCellPad : "ריפוד ת×", +DlgTableCaption : "כיתוב", +DlgTableSummary : "סיכו×", +DlgTableHeaders : "כותרות", +DlgTableHeadersNone : "×ין", +DlgTableHeadersColumn : "עמודה ר×שונה", +DlgTableHeadersRow : "שורה ר×שונה", +DlgTableHeadersBoth : "שניה×", + +// Table Cell Dialog +DlgCellTitle : "תכונות ת×", +DlgCellWidth : "רוחב", +DlgCellWidthPx : "פיקסלי×", +DlgCellWidthPc : "×חוז", +DlgCellHeight : "גובה", +DlgCellWordWrap : "גלילת שורות", +DlgCellWordWrapNotSet : "<×œ× × ×§×‘×¢>", +DlgCellWordWrapYes : "כן", +DlgCellWordWrapNo : "ל×", +DlgCellHorAlign : "יישור ×ופקי", +DlgCellHorAlignNotSet : "<×œ× × ×§×‘×¢>", +DlgCellHorAlignLeft : "שמ×ל", +DlgCellHorAlignCenter : "מרכז", +DlgCellHorAlignRight: "ימין", +DlgCellVerAlign : "יישור ×× ×›×™", +DlgCellVerAlignNotSet : "<×œ× × ×§×‘×¢>", +DlgCellVerAlignTop : "למעלה", +DlgCellVerAlignMiddle : "ל×מצע", +DlgCellVerAlignBottom : "לתחתית", +DlgCellVerAlignBaseline : "קו תחתית", +DlgCellType : "סוג ת×", +DlgCellTypeData : "סוג", +DlgCellTypeHeader : "כותרת", +DlgCellRowSpan : "טווח שורות", +DlgCellCollSpan : "טווח עמודות", +DlgCellBackColor : "צבע רקע", +DlgCellBorderColor : "צבע מסגרת", +DlgCellBtnSelect : "בחירה...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "חפש והחלף", + +// Find Dialog +DlgFindTitle : "חיפוש", +DlgFindFindBtn : "חיפוש", +DlgFindNotFoundMsg : "הטקסט המבוקש ×œ× × ×ž×¦×.", + +// Replace Dialog +DlgReplaceTitle : "החלפה", +DlgReplaceFindLbl : "חיפוש מחרוזת:", +DlgReplaceReplaceLbl : "החלפה במחרוזת:", +DlgReplaceCaseChk : "הת×מת סוג ×ותיות (Case)", +DlgReplaceReplaceBtn : "החלפה", +DlgReplaceReplAllBtn : "החלפה בכל העמוד", +DlgReplaceWordChk : "הת×מה למילה המל××”", + +// Paste Operations / Dialog +PasteErrorCut : "הגדרות ×”×בטחה בדפדפן שלך ×œ× ×ž×פשרות לעורך לבצע פעולות גזירה ×וטומטיות. יש להשתמש במקלדת ×œ×©× ×›×š (Ctrl+X).", +PasteErrorCopy : "הגדרות ×”×בטחה בדפדפן שלך ×œ× ×ž×פשרות לעורך לבצע פעולות העתקה ×וטומטיות. יש להשתמש במקלדת ×œ×©× ×›×š (Ctrl+C).", + +PasteAsText : "הדבקה כטקסט פשוט", +PasteFromWord : "הדבקה מ-וורד", + +DlgPasteMsg2 : "×× × ×”×“×‘×§ בתוך הקופסה ב×מצעות (Ctrl+V) ולחץ על ×ישור.", +DlgPasteSec : "עקב הגדרות ×בטחה בדפדפן, ×œ× × ×™×ª×Ÿ לגשת ×ל לוח ×”×’×–×™×¨×™× (clipboard) בצורה ישירה.×× × ×‘×¦×¢ הדבק שוב בחלון ×–×”.", +DlgPasteIgnoreFont : "×”×ª×¢×œ× ×ž×”×’×“×¨×•×ª סוג פונט", +DlgPasteRemoveStyles : "הסר הגדרות סגנון", + +// Color Picker +ColorAutomatic : "×וטומטי", +ColorMoreColors : "×¦×‘×¢×™× × ×•×¡×¤×™×...", + +// Document Properties +DocProps : "מ×פיני מסמך", + +// Anchor Dialog +DlgAnchorTitle : "מ×פיני נקודת עיגון", +DlgAnchorName : "×©× ×œ× ×§×•×“×ª עיגון", +DlgAnchorErrorName : "×× × ×”×–×Ÿ ×©× ×œ× ×§×•×“×ª עיגון", + +// Speller Pages Dialog +DlgSpellNotInDic : "×œ× × ×ž×¦× ×‘×ž×™×œ×•×Ÿ", +DlgSpellChangeTo : "שנה ל", +DlgSpellBtnIgnore : "התעל×", +DlgSpellBtnIgnoreAll : "×”×ª×¢×œ× ×ž×”×›×œ", +DlgSpellBtnReplace : "החלף", +DlgSpellBtnReplaceAll : "החלף הכל", +DlgSpellBtnUndo : "החזר", +DlgSpellNoSuggestions : "- ×ין הצעות -", +DlgSpellProgress : "בדיקות ×יות בתהליך ....", +DlgSpellNoMispell : "בדיקות ×יות הסתיימה: ×œ× × ×ž×¦×ו שגיעות כתיב", +DlgSpellNoChanges : "בדיקות ×יות הסתיימה: ×œ× ×©×•× ×ª×” ××£ מילה", +DlgSpellOneChange : "בדיקות ×יות הסתיימה: שונתה מילה ×חת", +DlgSpellManyChanges : "בדיקות ×יות הסתיימה: %1 ×ž×™×œ×™× ×©×•× ×•", + +IeSpellDownload : "בודק ×”×יות ×œ× ×ž×•×ª×§×Ÿ, ×”×× ×תה מעוניין להוריד?", + +// Button Dialog +DlgButtonText : "טקסט (ערך)", +DlgButtonType : "סוג", +DlgButtonTypeBtn : "כפתור", +DlgButtonTypeSbm : "שלח", +DlgButtonTypeRst : "×פס", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "ש×", +DlgCheckboxValue : "ערך", +DlgCheckboxSelected : "בחור", + +// Form Dialog +DlgFormName : "ש×", +DlgFormAction : "שלח ×ל", +DlgFormMethod : "סוג שליחה", + +// Select Field Dialog +DlgSelectName : "ש×", +DlgSelectValue : "ערך", +DlgSelectSize : "גודל", +DlgSelectLines : "שורות", +DlgSelectChkMulti : "×פשר בחירות מרובות", +DlgSelectOpAvail : "×פשרויות זמינות", +DlgSelectOpText : "טקסט", +DlgSelectOpValue : "ערך", +DlgSelectBtnAdd : "הוסף", +DlgSelectBtnModify : "שנה", +DlgSelectBtnUp : "למעלה", +DlgSelectBtnDown : "למטה", +DlgSelectBtnSetValue : "קבע כברירת מחדל", +DlgSelectBtnDelete : "מחק", + +// Textarea Dialog +DlgTextareaName : "ש×", +DlgTextareaCols : "עמודות", +DlgTextareaRows : "שורות", + +// Text Field Dialog +DlgTextName : "ש×", +DlgTextValue : "ערך", +DlgTextCharWidth : "רוחב ב×ותיות", +DlgTextMaxChars : "מקסימות ×ותיות", +DlgTextType : "סוג", +DlgTextTypeText : "טקסט", +DlgTextTypePass : "סיסמה", + +// Hidden Field Dialog +DlgHiddenName : "ש×", +DlgHiddenValue : "ערך", + +// Bulleted List Dialog +BulletedListProp : "מ×פייני רשימה", +NumberedListProp : "מ×פייני רשימה ממוספרת", +DlgLstStart : "התחלה", +DlgLstType : "סוג", +DlgLstTypeCircle : "עיגול", +DlgLstTypeDisc : "דיסק", +DlgLstTypeSquare : "מרובע", +DlgLstTypeNumbers : "×ž×¡×¤×¨×™× (1, 2, 3)", +DlgLstTypeLCase : "×ותיות קטנות (a, b, c)", +DlgLstTypeUCase : "×ותיות גדולות (A, B, C)", +DlgLstTypeSRoman : "ספרות רומ×יות קטנות (i, ii, iii)", +DlgLstTypeLRoman : "ספרות רומ×יות גדולות (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "כללי", +DlgDocBackTab : "רקע", +DlgDocColorsTab : "×¦×‘×¢×™× ×•×’×‘×•×œ×•×ª", +DlgDocMetaTab : "נתוני META", + +DlgDocPageTitle : "כותרת דף", +DlgDocLangDir : "כיוון שפה", +DlgDocLangDirLTR : "שמ×ל לימין (LTR)", +DlgDocLangDirRTL : "ימין לשמ×ל (RTL)", +DlgDocLangCode : "קוד שפה", +DlgDocCharSet : "קידוד ×ותיות", +DlgDocCharSetCE : "מרכז ×ירופה", +DlgDocCharSetCT : "סיני מסורתי (Big5)", +DlgDocCharSetCR : "קירילי", +DlgDocCharSetGR : "יוונית", +DlgDocCharSetJP : "יפנית", +DlgDocCharSetKR : "קור×נית", +DlgDocCharSetTR : "טורקית", +DlgDocCharSetUN : "יוני קוד (UTF-8)", +DlgDocCharSetWE : "מערב ×ירופה", +DlgDocCharSetOther : "קידוד ×ותיות ×חר", + +DlgDocDocType : "הגדרות סוג מסמך", +DlgDocDocTypeOther : "הגדרות סוג מסמך ×חרות", +DlgDocIncXHTML : "כלול הגדרות XHTML", +DlgDocBgColor : "צבע רקע", +DlgDocBgImage : "URL לתמונת רקע", +DlgDocBgNoScroll : "רגע ×œ×œ× ×’×œ×™×œ×”", +DlgDocCText : "טקסט", +DlgDocCLink : "קישור", +DlgDocCVisited : "קישור שבוקר", +DlgDocCActive : " קישור פעיל", +DlgDocMargins : "גבולות דף", +DlgDocMaTop : "למעלה", +DlgDocMaLeft : "שמ×לה", +DlgDocMaRight : "ימינה", +DlgDocMaBottom : "למטה", +DlgDocMeIndex : "מפתח ×¢× ×™×™× ×™× ×©×œ המסמך )מופרד בפסיק(", +DlgDocMeDescr : "ת×ור מסמך", +DlgDocMeAuthor : "מחבר", +DlgDocMeCopy : "זכויות יוצרי×", +DlgDocPreview : "תצוגה מקדימה", + +// Templates Dialog +Templates : "תבניות", +DlgTemplatesTitle : "תביות תוכן", +DlgTemplatesSelMsg : "×× × ×‘×—×¨ תבנית לפתיחה בעורך
    התוכן המקורי ימחק:", +DlgTemplatesLoading : "מעלה רשימת תבניות ×× × ×”×ž×ª×Ÿ", +DlgTemplatesNoTpl : "(×œ× ×”×•×’×“×¨×• תבניות)", +DlgTemplatesReplace : "החלפת תוכן ממשי", + +// About Dialog +DlgAboutAboutTab : "×ודות", +DlgAboutBrowserInfoTab : "גירסת דפדפן", +DlgAboutLicenseTab : "רשיון", +DlgAboutVersion : "גירס×", +DlgAboutInfo : "מידע נוסף ניתן ×œ×ž×¦×•× ×›×ן:", + +// Div Dialog +DlgDivGeneralTab : "כללי", +DlgDivAdvancedTab : "מתקד×", +DlgDivStyle : "סגנון", +DlgDivInlineStyle : "סגנון בתוך השורה" +}; diff --git a/webdir/fckeditor/editor/lang/hi.js b/webdir/fckeditor/editor/lang/hi.js new file mode 100644 index 0000000..e68131b --- /dev/null +++ b/webdir/fckeditor/editor/lang/hi.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Hindi language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "टूलबार सिमटायें", +ToolbarExpand : "टूलबार का विसà¥à¤¤à¤¾à¤° करें", + +// Toolbar Items and Context Menu +Save : "सेव", +NewPage : "नया पेज", +Preview : "पà¥à¤°à¥€à¤µà¥à¤¯à¥‚", +Cut : "कट", +Copy : "कॉपी", +Paste : "पेसà¥à¤Ÿ", +PasteText : "पेसà¥à¤Ÿ (सादा टॅकà¥à¤¸à¥à¤Ÿ)", +PasteWord : "पेसà¥à¤Ÿ (वरà¥à¤¡ से)", +Print : "पà¥à¤°à¤¿à¤¨à¥à¤Ÿ", +SelectAll : "सब सॅलॅकà¥à¤Ÿ करें", +RemoveFormat : "फ़ॉरà¥à¤®à¥ˆà¤Ÿ हटायें", +InsertLinkLbl : "लिंक", +InsertLink : "लिंक इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन", +RemoveLink : "लिंक हटायें", +VisitLink : "लिंक खोलें", +Anchor : "à¤à¤‚कर इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन", +AnchorDelete : "à¤à¤‚कर हटायें", +InsertImageLbl : "तसà¥à¤µà¥€à¤°", +InsertImage : "तसà¥à¤µà¥€à¤° इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन", +InsertFlashLbl : "फ़à¥à¤²à¥ˆà¤¶", +InsertFlash : "फ़à¥à¤²à¥ˆà¤¶ इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन", +InsertTableLbl : "टेबल", +InsertTable : "टेबल इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन", +InsertLineLbl : "रेखा", +InsertLine : "हॉरिज़ॉनà¥à¤Ÿà¤² रेखा इनà¥à¤¸à¤°à¥à¤Ÿ करें", +InsertSpecialCharLbl: "विशेष करॅकà¥à¤Ÿà¤°", +InsertSpecialChar : "विशेष करॅकà¥à¤Ÿà¤° इनà¥à¤¸à¤°à¥à¤Ÿ करें", +InsertSmileyLbl : "सà¥à¤®à¤¾à¤‡à¤²à¥€", +InsertSmiley : "सà¥à¤®à¤¾à¤‡à¤²à¥€ इनà¥à¤¸à¤°à¥à¤Ÿ करें", +About : "FCKeditor के बारे में", +Bold : "बोलà¥à¤¡", +Italic : "इटैलिक", +Underline : "रेखांकण", +StrikeThrough : "सà¥à¤Ÿà¥à¤°à¤¾à¤‡à¤• थà¥à¤°à¥‚", +Subscript : "अधोलेख", +Superscript : "अभिलेख", +LeftJustify : "बायीं तरफ", +CenterJustify : "बीच में", +RightJustify : "दायीं तरफ", +BlockJustify : "बà¥à¤²à¥‰à¤• जसà¥à¤Ÿà¥€à¥žà¤¾à¤ˆ", +DecreaseIndent : "इनà¥à¤¡à¥…नà¥à¤Ÿ कम करें", +IncreaseIndent : "इनà¥à¤¡à¥…नà¥à¤Ÿ बà¥à¤¾à¤¯à¥‡à¤‚", +Blockquote : "बà¥à¤²à¥‰à¤•-कोट", +CreateDiv : "डिव (Div) कनà¥à¤Ÿà¥‡à¤¨à¤° बनायें", +EditDiv : "डिव (Div) कनà¥à¤Ÿà¥‡à¤¨à¤° बदलें", +DeleteDiv : "डिव कनà¥à¤Ÿà¥‡à¤¨à¤° हटायें", +Undo : "अनà¥à¤¡à¥‚", +Redo : "रीडू", +NumberedListLbl : "अंकीय सूची", +NumberedList : "अंकीय सूची इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन", +BulletedListLbl : "बà¥à¤²à¥…ट सूची", +BulletedList : "बà¥à¤²à¥…ट सूची इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन", +ShowTableBorders : "टेबल बॉरà¥à¤¡à¤°à¤¯à¥‡à¤‚ दिखायें", +ShowDetails : "जà¥à¤¯à¤¾à¤¦à¤¾ दिखायें", +Style : "सà¥à¤Ÿà¤¾à¤‡à¤²", +FontFormat : "फ़ॉरà¥à¤®à¥ˆà¤Ÿ", +Font : "फ़ॉनà¥à¤Ÿ", +FontSize : "साइज़", +TextColor : "टेकà¥à¤¸à¥à¤Ÿ रंग", +BGColor : "बैकà¥à¤—à¥à¤°à¤¾à¤‰à¤¨à¥à¤¡ रंग", +Source : "सोरà¥à¤¸", +Find : "खोजें", +Replace : "रीपà¥à¤²à¥‡à¤¸", +SpellCheck : "वरà¥à¤¤à¤¨à¥€ (सà¥à¤ªà¥‡à¤²à¤¿à¤‚ग) जाà¤à¤š", +UniversalKeyboard : "यूनीवरà¥à¤¸à¤² कीबोरà¥à¤¡", +PageBreakLbl : "पेज बà¥à¤°à¥‡à¤•", +PageBreak : "पेज बà¥à¤°à¥‡à¤• इनà¥à¤¸à¤°à¥à¤Ÿà¥ करें", + +Form : "फ़ॉरà¥à¤®", +Checkbox : "चॅक बॉकà¥à¤¸", +RadioButton : "रेडिओ बटन", +TextField : "टेकà¥à¤¸à¥à¤Ÿ फ़ीलà¥à¤¡", +Textarea : "टेकà¥à¤¸à¥à¤Ÿ à¤à¤°à¤¿à¤¯à¤¾", +HiddenField : "गà¥à¤ªà¥à¤¤ फ़ीलà¥à¤¡", +Button : "बटन", +SelectionField : "चà¥à¤¨à¤¾à¤µ फ़ीलà¥à¤¡", +ImageButton : "तसà¥à¤µà¥€à¤° बटन", + +FitWindow : "à¤à¤¡à¤¿à¤Ÿà¤° साइज़ को चरम सीमा तक बà¥à¤¾à¤¯à¥‡à¤‚", +ShowBlocks : "बà¥à¤²à¥‰à¤• दिखायें", + +// Context Menu +EditLink : "लिंक संपादन", +CellCM : "खाना", +RowCM : "पंकà¥à¤¤à¤¿", +ColumnCM : "कालम", +InsertRowAfter : "बाद में पंकà¥à¤¤à¤¿ डालें", +InsertRowBefore : "पहले पंकà¥à¤¤à¤¿ डालें", +DeleteRows : "पंकà¥à¤¤à¤¿à¤¯à¤¾à¤ डिलीट करें", +InsertColumnAfter : "बाद में कालम डालें", +InsertColumnBefore : "पहले कालम डालें", +DeleteColumns : "कालम डिलीट करें", +InsertCellAfter : "बाद में सैल डालें", +InsertCellBefore : "पहले सैल डालें", +DeleteCells : "सैल डिलीट करें", +MergeCells : "सैल मिलायें", +MergeRight : "बाà¤à¤¯à¤¾ विलय", +MergeDown : "नीचे विलय करें", +HorizontalSplitCell : "सैल को कà¥à¤·à¥ˆà¤¤à¤¿à¤œ सà¥à¤¥à¤¿à¤¤à¤¿ में विभाजित करें", +VerticalSplitCell : "सैल को लमà¥à¤¬à¤¾à¤•à¤¾à¤° में विभाजित करें", +TableDelete : "टेबल डिलीट करें", +CellProperties : "सैल पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +TableProperties : "टेबल पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +ImageProperties : "तसà¥à¤µà¥€à¤° पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +FlashProperties : "फ़à¥à¤²à¥ˆà¤¶ पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", + +AnchorProp : "à¤à¤‚कर पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +ButtonProp : "बटन पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +CheckboxProp : "चॅक बॉकà¥à¤¸ पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +HiddenFieldProp : "गà¥à¤ªà¥à¤¤ फ़ीलà¥à¤¡ पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +RadioButtonProp : "रेडिओ बटन पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +ImageButtonProp : "तसà¥à¤µà¥€à¤° बटन पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +TextFieldProp : "टेकà¥à¤¸à¥à¤Ÿ फ़ीलà¥à¤¡ पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +SelectionFieldProp : "चà¥à¤¨à¤¾à¤µ फ़ीलà¥à¤¡ पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +TextareaProp : "टेकà¥à¤¸à¥à¤¤ à¤à¤°à¤¿à¤¯à¤¾ पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +FormProp : "फ़ॉरà¥à¤® पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", + +FontFormats : "साधारण;फ़ॉरà¥à¤®à¥ˆà¤Ÿà¥…ड;पता;शीरà¥à¤·à¤• 1;शीरà¥à¤·à¤• 2;शीरà¥à¤·à¤• 3;शीरà¥à¤·à¤• 4;शीरà¥à¤·à¤• 5;शीरà¥à¤·à¤• 6;शीरà¥à¤·à¤• (DIV)", + +// Alerts and Messages +ProcessingXHTML : "XHTML पà¥à¤°à¥‹à¤¸à¥…स हो रहा है। ज़रा ठहरें...", +Done : "पूरा हà¥à¤†", +PasteWordConfirm : "आप जो टेकà¥à¤¸à¥à¤Ÿ पेसà¥à¤Ÿ करना चाहते हैं, वह वरà¥à¤¡ से कॉपी किया हà¥à¤† लग रहा है। कà¥à¤¯à¤¾ पेसà¥à¤Ÿ करने से पहले आप इसे साफ़ करना चाहेंगे?", +NotCompatiblePaste : "यह कमांड इनà¥à¤Ÿà¤°à¤¨à¥…ट à¤à¤•à¥à¤¸à¥à¤ªà¥à¤²à¥‹à¤°à¤°(Internet Explorer) 5.5 या उसके बाद के वरà¥à¥›à¤¨ के लिठही उपलबà¥à¤§ है। कà¥à¤¯à¤¾ आप बिना साफ़ किठपेसà¥à¤Ÿ करना चाहेंगे?", +UnknownToolbarItem : "अनजान टूलबार आइटम \"%1\"", +UnknownCommand : "अनजान कमानà¥à¤¡ \"%1\"", +NotImplemented : "कमानà¥à¤¡ इमà¥à¤ªà¥à¤²à¥€à¤®à¥…नà¥à¤Ÿ नहीं किया गया है", +UnknownToolbarSet : "टूलबार सॅट \"%1\" उपलबà¥à¤§ नहीं है", +NoActiveX : "आपके बà¥à¤°à¤¾à¤‰à¥›à¤°à¥ की सà¥à¤°à¤•à¥à¤¶à¤¾ सेटिंगà¥à¤¸à¥ à¤à¤¡à¤¿à¤Ÿà¤° की कà¥à¤›à¥ फ़ीचरों को सीमित करॠसकती हैं। कà¥à¤°à¤¿à¤ªà¤¯à¤¾ \"Run ActiveX controls and plug-ins\" विकलà¥à¤ª को à¤à¤¨à¥‡à¤¬à¤² करें. आपको à¤à¤°à¤°à¥à¤¸à¥ और गायब फ़ीचरà¥à¤¸à¥ का अनà¥à¤­à¤µ हो सकता है।", +BrowseServerBlocked : "रिसोरà¥à¤¸à¥‡à¥› बà¥à¤°à¤¾à¤‰à¥›à¤°à¥ नहीं खोला जा सका। कà¥à¤°à¤¿à¤ªà¤¯à¤¾ सभी पॉपà¥-अपॠबà¥à¤²à¥‰à¤•à¤°à¥à¤¸à¥ को निषà¥à¤•à¥à¤°à¤¿à¤¯ करें।", +DialogBlocked : "डायलग विनà¥à¤¡à¥‹ नहीं खोला जा सका। कà¥à¤°à¤¿à¤ªà¤¯à¤¾ सभी पॉपà¥-अपॠबà¥à¤²à¥‰à¤•à¤°à¥à¤¸à¥ को निषà¥à¤•à¥à¤°à¤¿à¤¯ करें।", +VisitLinkBlocked : "नया विनà¥à¤¡à¥‹ नहीं खोला जा सका। कà¥à¤°à¤¿à¤ªà¤¯à¤¾ सभी पॉपà¥-अपॠबà¥à¤²à¥‰à¤•à¤°à¥à¤¸à¥ को निषà¥à¤•à¥à¤°à¤¿à¤¯ करें।", + +// Dialogs +DlgBtnOK : "ठीक है", +DlgBtnCancel : "रदà¥à¤¦ करें", +DlgBtnClose : "बनà¥à¤¦ करें", +DlgBtnBrowseServer : "सरà¥à¤µà¤° बà¥à¤°à¤¾à¤‰à¥› करें", +DlgAdvancedTag : "à¤à¤¡à¥à¤µà¤¾à¤¨à¥à¤¸à¥à¤¡", +DlgOpOther : "<अनà¥à¤¯>", +DlgInfoTab : "सूचना", +DlgAlertUrl : "URL इनà¥à¤¸à¤°à¥à¤Ÿ करें", + +// General Dialogs Labels +DlgGenNotSet : "<सॅट नहीं>", +DlgGenId : "Id", +DlgGenLangDir : "भाषा लिखने की दिशा", +DlgGenLangDirLtr : "बायें से दायें (LTR)", +DlgGenLangDirRtl : "दायें से बायें (RTL)", +DlgGenLangCode : "भाषा कोड", +DlgGenAccessKey : "à¤à¤•à¥à¤¸à¥…स की", +DlgGenName : "नाम", +DlgGenTabIndex : "टैब इनà¥à¤¡à¥…कà¥à¤¸", +DlgGenLongDescr : "अधिक विवरण के लिठURL", +DlgGenClass : "सà¥à¤Ÿà¤¾à¤‡à¤²-शीट कà¥à¤²à¤¾à¤¸", +DlgGenTitle : "परामरà¥à¤¶ शीरà¥à¤¶à¤•", +DlgGenContType : "परामरà¥à¤¶ कनà¥à¤Ÿà¥…नà¥à¤Ÿ पà¥à¤°à¤•à¤¾à¤°", +DlgGenLinkCharset : "लिंक रिसोरà¥à¤¸ करॅकà¥à¤Ÿà¤° सॅट", +DlgGenStyle : "सà¥à¤Ÿà¤¾à¤‡à¤²", + +// Image Dialog +DlgImgTitle : "तसà¥à¤µà¥€à¤° पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +DlgImgInfoTab : "तसà¥à¤µà¥€à¤° की जानकारी", +DlgImgBtnUpload : "इसे सरà¥à¤µà¤° को भेजें", +DlgImgURL : "URL", +DlgImgUpload : "अपलोड", +DlgImgAlt : "वैकलà¥à¤ªà¤¿à¤• टेकà¥à¤¸à¥à¤Ÿ", +DlgImgWidth : "चौड़ाई", +DlgImgHeight : "ऊà¤à¤šà¤¾à¤ˆ", +DlgImgLockRatio : "लॉक अनà¥à¤ªà¤¾à¤¤", +DlgBtnResetSize : "रीसॅट साइज़", +DlgImgBorder : "बॉरà¥à¤¡à¤°", +DlgImgHSpace : "हॉरिज़ॉनà¥à¤Ÿà¤² सà¥à¤ªà¥‡à¤¸", +DlgImgVSpace : "वरà¥à¤Ÿà¤¿à¤•à¤² सà¥à¤ªà¥‡à¤¸", +DlgImgAlign : "à¤à¤²à¤¾à¤‡à¤¨", +DlgImgAlignLeft : "दायें", +DlgImgAlignAbsBottom: "Abs नीचे", +DlgImgAlignAbsMiddle: "Abs ऊपर", +DlgImgAlignBaseline : "मूल रेखा", +DlgImgAlignBottom : "नीचे", +DlgImgAlignMiddle : "मधà¥à¤¯", +DlgImgAlignRight : "दायें", +DlgImgAlignTextTop : "टेकà¥à¤¸à¥à¤Ÿ ऊपर", +DlgImgAlignTop : "ऊपर", +DlgImgPreview : "पà¥à¤°à¥€à¤µà¥à¤¯à¥‚", +DlgImgAlertUrl : "तसà¥à¤µà¥€à¤° का URL टाइप करें ", +DlgImgLinkTab : "लिंक", + +// Flash Dialog +DlgFlashTitle : "फ़à¥à¤²à¥ˆà¤¶ पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +DlgFlashChkPlay : "ऑटो पà¥à¤²à¥‡", +DlgFlashChkLoop : "लूप", +DlgFlashChkMenu : "फ़à¥à¤²à¥ˆà¤¶ मॅनà¥à¤¯à¥‚ का पà¥à¤°à¤¯à¥‹à¤— करें", +DlgFlashScale : "सà¥à¤•à¥‡à¤²", +DlgFlashScaleAll : "सभी दिखायें", +DlgFlashScaleNoBorder : "कोई बॉरà¥à¤¡à¤° नहीं", +DlgFlashScaleFit : "बिलà¥à¤•à¥à¤² फ़िट", + +// Link Dialog +DlgLnkWindowTitle : "लिंक", +DlgLnkInfoTab : "लिंक ", +DlgLnkTargetTab : "टारà¥à¤—ेट", + +DlgLnkType : "लिंक पà¥à¤°à¤•à¤¾à¤°", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "इस पेज का à¤à¤‚कर", +DlgLnkTypeEMail : "ई-मेल", +DlgLnkProto : "पà¥à¤°à¥‹à¤Ÿà¥‹à¤•à¥‰à¤²", +DlgLnkProtoOther : "<अनà¥à¤¯>", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "à¤à¤‚कर चà¥à¤¨à¥‡à¤‚", +DlgLnkAnchorByName : "à¤à¤‚कर नाम से", +DlgLnkAnchorById : "à¤à¤²à¥€à¤®à¥…नà¥à¤Ÿ Id से", +DlgLnkNoAnchors : "(डॉकà¥à¤¯à¥‚मॅनà¥à¤Ÿ में à¤à¤‚करà¥à¤¸ की संखà¥à¤¯à¤¾)", +DlgLnkEMail : "ई-मेल पता", +DlgLnkEMailSubject : "संदेश विषय", +DlgLnkEMailBody : "संदेश", +DlgLnkUpload : "अपलोड", +DlgLnkBtnUpload : "इसे सरà¥à¤µà¤° को भेजें", + +DlgLnkTarget : "टारà¥à¤—ेट", +DlgLnkTargetFrame : "<फ़à¥à¤°à¥‡à¤®>", +DlgLnkTargetPopup : "<पॉप-अप विनà¥à¤¡à¥‹>", +DlgLnkTargetBlank : "नया विनà¥à¤¡à¥‹ (_blank)", +DlgLnkTargetParent : "मूल विनà¥à¤¡à¥‹ (_parent)", +DlgLnkTargetSelf : "इसी विनà¥à¤¡à¥‹ (_self)", +DlgLnkTargetTop : "शीरà¥à¤· विनà¥à¤¡à¥‹ (_top)", +DlgLnkTargetFrameName : "टारà¥à¤—ेट फ़à¥à¤°à¥‡à¤® का नाम", +DlgLnkPopWinName : "पॉप-अप विनà¥à¤¡à¥‹ का नाम", +DlgLnkPopWinFeat : "पॉप-अप विनà¥à¤¡à¥‹ फ़ीचरà¥à¤¸", +DlgLnkPopResize : "साइज़ बदला जा सकता है", +DlgLnkPopLocation : "लोकेशन बार", +DlgLnkPopMenu : "मॅनà¥à¤¯à¥‚ बार", +DlgLnkPopScroll : "सà¥à¤•à¥à¤°à¥‰à¤² बार", +DlgLnkPopStatus : "सà¥à¤Ÿà¥‡à¤Ÿà¤¸ बार", +DlgLnkPopToolbar : "टूल बार", +DlgLnkPopFullScrn : "फ़à¥à¤² सà¥à¤•à¥à¤°à¥€à¤¨ (IE)", +DlgLnkPopDependent : "डिपेनà¥à¤¡à¥…नà¥à¤Ÿ (Netscape)", +DlgLnkPopWidth : "चौड़ाई", +DlgLnkPopHeight : "ऊà¤à¤šà¤¾à¤ˆ", +DlgLnkPopLeft : "बायीं तरफ", +DlgLnkPopTop : "दायीं तरफ", + +DlnLnkMsgNoUrl : "लिंक URL टाइप करें", +DlnLnkMsgNoEMail : "ई-मेल पता टाइप करें", +DlnLnkMsgNoAnchor : "à¤à¤‚कर चà¥à¤¨à¥‡à¤‚", +DlnLnkMsgInvPopName : "पॉप-अप का नाम अलà¥à¤«à¤¾à¤¬à¥‡à¤Ÿ से शà¥à¤°à¥‚ होना चाहिये और उसमें सà¥à¤ªà¥‡à¤¸ नहीं होने चाहिà¤", + +// Color Dialog +DlgColorTitle : "रंग चà¥à¤¨à¥‡à¤‚", +DlgColorBtnClear : "साफ़ करें", +DlgColorHighlight : "हाइलाइट", +DlgColorSelected : "सॅलॅकà¥à¤Ÿà¥…ड", + +// Smiley Dialog +DlgSmileyTitle : "सà¥à¤®à¤¾à¤‡à¤²à¥€ इनà¥à¤¸à¤°à¥à¤Ÿ करें", + +// Special Character Dialog +DlgSpecialCharTitle : "विशेष करॅकà¥à¤Ÿà¤° चà¥à¤¨à¥‡à¤‚", + +// Table Dialog +DlgTableTitle : "टेबल पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +DlgTableRows : "पंकà¥à¤¤à¤¿à¤¯à¤¾à¤", +DlgTableColumns : "कालम", +DlgTableBorder : "बॉरà¥à¤¡à¤° साइज़", +DlgTableAlign : "à¤à¤²à¤¾à¤‡à¤¨à¥à¤®à¥…नà¥à¤Ÿ", +DlgTableAlignNotSet : "<सॅट नहीं>", +DlgTableAlignLeft : "दायें", +DlgTableAlignCenter : "बीच में", +DlgTableAlignRight : "बायें", +DlgTableWidth : "चौड़ाई", +DlgTableWidthPx : "पिकà¥à¤¸à¥ˆà¤²", +DlgTableWidthPc : "पà¥à¤°à¤¤à¤¿à¤¶à¤¤", +DlgTableHeight : "ऊà¤à¤šà¤¾à¤ˆ", +DlgTableCellSpace : "सैल अंतर", +DlgTableCellPad : "सैल पैडिंग", +DlgTableCaption : "शीरà¥à¤·à¤•", +DlgTableSummary : "सारांश", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "सैल पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +DlgCellWidth : "चौड़ाई", +DlgCellWidthPx : "पिकà¥à¤¸à¥ˆà¤²", +DlgCellWidthPc : "पà¥à¤°à¤¤à¤¿à¤¶à¤¤", +DlgCellHeight : "ऊà¤à¤šà¤¾à¤ˆ", +DlgCellWordWrap : "वरà¥à¤¡ रैप", +DlgCellWordWrapNotSet : "<सॅट नहीं>", +DlgCellWordWrapYes : "हाà¤", +DlgCellWordWrapNo : "नहीं", +DlgCellHorAlign : "हॉरिज़ॉनà¥à¤Ÿà¤² à¤à¤²à¤¾à¤‡à¤¨à¥à¤®à¥…नà¥à¤Ÿ", +DlgCellHorAlignNotSet : "<सॅट नहीं>", +DlgCellHorAlignLeft : "दायें", +DlgCellHorAlignCenter : "बीच में", +DlgCellHorAlignRight: "बायें", +DlgCellVerAlign : "वरà¥à¤Ÿà¤¿à¤•à¤² à¤à¤²à¤¾à¤‡à¤¨à¥à¤®à¥…नà¥à¤Ÿ", +DlgCellVerAlignNotSet : "<सॅट नहीं>", +DlgCellVerAlignTop : "ऊपर", +DlgCellVerAlignMiddle : "मधà¥à¤¯", +DlgCellVerAlignBottom : "नीचे", +DlgCellVerAlignBaseline : "मूलरेखा", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "पंकà¥à¤¤à¤¿ सà¥à¤ªà¥ˆà¤¨", +DlgCellCollSpan : "कालम सà¥à¤ªà¥ˆà¤¨", +DlgCellBackColor : "बैकà¥à¤—à¥à¤°à¤¾à¤‰à¤¨à¥à¤¡ रंग", +DlgCellBorderColor : "बॉरà¥à¤¡à¤° का रंग", +DlgCellBtnSelect : "चà¥à¤¨à¥‡à¤‚...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "खोजें और बदलें", + +// Find Dialog +DlgFindTitle : "खोजें", +DlgFindFindBtn : "खोजें", +DlgFindNotFoundMsg : "आपके दà¥à¤µà¤¾à¤°à¤¾ दिया गया टेकà¥à¤¸à¥à¤Ÿ नहीं मिला", + +// Replace Dialog +DlgReplaceTitle : "रिपà¥à¤²à¥‡à¤¸", +DlgReplaceFindLbl : "यह खोजें:", +DlgReplaceReplaceLbl : "इससे रिपà¥à¤²à¥‡à¤¸ करें:", +DlgReplaceCaseChk : "केस मिलायें", +DlgReplaceReplaceBtn : "रिपà¥à¤²à¥‡à¤¸", +DlgReplaceReplAllBtn : "सभी रिपà¥à¤²à¥‡à¤¸ करें", +DlgReplaceWordChk : "पूरा शबà¥à¤¦ मिलायें", + +// Paste Operations / Dialog +PasteErrorCut : "आपके बà¥à¤°à¤¾à¤‰à¥›à¤° की सà¥à¤°à¤•à¥à¤·à¤¾ सॅटिनà¥à¤—à¥à¤¸ ने कट करने की अनà¥à¤®à¤¤à¤¿ नहीं पà¥à¤°à¤¦à¤¾à¤¨ की है। (Ctrl+X) का पà¥à¤°à¤¯à¥‹à¤— करें।", +PasteErrorCopy : "आपके बà¥à¤°à¤¾à¤†à¤‰à¥›à¤° की सà¥à¤°à¤•à¥à¤·à¤¾ सॅटिनà¥à¤—à¥à¤¸ ने कॉपी करने की अनà¥à¤®à¤¤à¤¿ नहीं पà¥à¤°à¤¦à¤¾à¤¨ की है। (Ctrl+C) का पà¥à¤°à¤¯à¥‹à¤— करें।", + +PasteAsText : "पेसà¥à¤Ÿ (सादा टॅकà¥à¤¸à¥à¤Ÿ)", +PasteFromWord : "पेसà¥à¤Ÿ (वरà¥à¤¡ से)", + +DlgPasteMsg2 : "Ctrl+V का पà¥à¤°à¤¯à¥‹à¤— करके पेसà¥à¤Ÿ करें और ठीक है करें.", +DlgPasteSec : "आपके बà¥à¤°à¤¾à¤‰à¥›à¤° की सà¥à¤°à¤•à¥à¤·à¤¾ आपके बà¥à¤°à¤¾à¤‰à¥›à¤° की सà¥à¤°Kश सैटिंग के कारण, à¤à¤¡à¤¿à¤Ÿà¤° आपके कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ डेटा को नहीं पा सकता है. आपको उसे इस विनà¥à¤¡à¥‹ में दोबारा पेसà¥à¤Ÿ करना होगा.", +DlgPasteIgnoreFont : "फ़ॉनà¥à¤Ÿ परिभाषा निकालें", +DlgPasteRemoveStyles : "सà¥à¤Ÿà¤¾à¤‡à¤² परिभाषा निकालें", + +// Color Picker +ColorAutomatic : "सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤", +ColorMoreColors : "और रंग...", + +// Document Properties +DocProps : "डॉकà¥à¤¯à¥‚मॅनà¥à¤Ÿ पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", + +// Anchor Dialog +DlgAnchorTitle : "à¤à¤‚कर पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +DlgAnchorName : "à¤à¤‚कर का नाम", +DlgAnchorErrorName : "à¤à¤‚कर का नाम टाइप करें", + +// Speller Pages Dialog +DlgSpellNotInDic : "शबà¥à¤¦à¤•à¥‹à¤¶ में नहीं", +DlgSpellChangeTo : "इसमें बदलें", +DlgSpellBtnIgnore : "इगà¥à¤¨à¥‹à¤°", +DlgSpellBtnIgnoreAll : "सभी इगà¥à¤¨à¥‹à¤° करें", +DlgSpellBtnReplace : "रिपà¥à¤²à¥‡à¤¸", +DlgSpellBtnReplaceAll : "सभी रिपà¥à¤²à¥‡à¤¸ करें", +DlgSpellBtnUndo : "अनà¥à¤¡à¥‚", +DlgSpellNoSuggestions : "- कोई सà¥à¤à¤¾à¤µ नहीं -", +DlgSpellProgress : "वरà¥à¤¤à¤¨à¥€ की जाà¤à¤š (सà¥à¤ªà¥…ल-चॅक) जारी है...", +DlgSpellNoMispell : "वरà¥à¤¤à¤¨à¥€ की जाà¤à¤š : कोई गलत वरà¥à¤¤à¤¨à¥€ (सà¥à¤ªà¥…लिंग) नहीं पाई गई", +DlgSpellNoChanges : "वरà¥à¤¤à¤¨à¥€ की जाà¤à¤š :कोई शबà¥à¤¦ नहीं बदला गया", +DlgSpellOneChange : "वरà¥à¤¤à¤¨à¥€ की जाà¤à¤š : à¤à¤• शबà¥à¤¦ बदला गया", +DlgSpellManyChanges : "वरà¥à¤¤à¤¨à¥€ की जाà¤à¤š : %1 शबà¥à¤¦ बदले गये", + +IeSpellDownload : "सà¥à¤ªà¥…ल-चॅकर इनà¥à¤¸à¥à¤Ÿà¤¾à¤² नहीं किया गया है। कà¥à¤¯à¤¾ आप इसे डा‌उनलोड करना चाहेंगे?", + +// Button Dialog +DlgButtonText : "टेकà¥à¤¸à¥à¤Ÿ (वैलà¥à¤¯à¥‚)", +DlgButtonType : "पà¥à¤°à¤•à¤¾à¤°", +DlgButtonTypeBtn : "बटन", +DlgButtonTypeSbm : "सबà¥à¤®à¤¿à¤Ÿ", +DlgButtonTypeRst : "रिसेट", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "नाम", +DlgCheckboxValue : "वैलà¥à¤¯à¥‚", +DlgCheckboxSelected : "सॅलॅकà¥à¤Ÿà¥…ड", + +// Form Dialog +DlgFormName : "नाम", +DlgFormAction : "कà¥à¤°à¤¿à¤¯à¤¾", +DlgFormMethod : "तरीका", + +// Select Field Dialog +DlgSelectName : "नाम", +DlgSelectValue : "वैलà¥à¤¯à¥‚", +DlgSelectSize : "साइज़", +DlgSelectLines : "पंकà¥à¤¤à¤¿à¤¯à¤¾à¤", +DlgSelectChkMulti : "à¤à¤• से जà¥à¤¯à¤¾à¤¦à¤¾ विकलà¥à¤ª चà¥à¤¨à¤¨à¥‡ दें", +DlgSelectOpAvail : "उपलबà¥à¤§ विकलà¥à¤ª", +DlgSelectOpText : "टेकà¥à¤¸à¥à¤Ÿ", +DlgSelectOpValue : "वैलà¥à¤¯à¥‚", +DlgSelectBtnAdd : "जोड़ें", +DlgSelectBtnModify : "बदलें", +DlgSelectBtnUp : "ऊपर", +DlgSelectBtnDown : "नीचे", +DlgSelectBtnSetValue : "चà¥à¤¨à¥€ गई वैलà¥à¤¯à¥‚ सॅट करें", +DlgSelectBtnDelete : "डिलीट", + +// Textarea Dialog +DlgTextareaName : "नाम", +DlgTextareaCols : "कालम", +DlgTextareaRows : "पंकà¥à¤¤à¤¿à¤¯à¤¾à¤‚", + +// Text Field Dialog +DlgTextName : "नाम", +DlgTextValue : "वैलà¥à¤¯à¥‚", +DlgTextCharWidth : "करॅकà¥à¤Ÿà¤° की चौà¥à¤¾à¤ˆ", +DlgTextMaxChars : "अधिकतम करॅकà¥à¤Ÿà¤°", +DlgTextType : "टाइप", +DlgTextTypeText : "टेकà¥à¤¸à¥à¤Ÿ", +DlgTextTypePass : "पासà¥à¤µà¤°à¥à¤¡", + +// Hidden Field Dialog +DlgHiddenName : "नाम", +DlgHiddenValue : "वैलà¥à¤¯à¥‚", + +// Bulleted List Dialog +BulletedListProp : "बà¥à¤²à¥…ट सूची पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +NumberedListProp : "अंकीय सूची पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›", +DlgLstStart : "पà¥à¤°à¤¾à¤°à¤®à¥à¤­", +DlgLstType : "पà¥à¤°à¤•à¤¾à¤°", +DlgLstTypeCircle : "गोल", +DlgLstTypeDisc : "डिसà¥à¤•", +DlgLstTypeSquare : "चौकॊण", +DlgLstTypeNumbers : "अंक (1, 2, 3)", +DlgLstTypeLCase : "छोटे अकà¥à¤·à¤° (a, b, c)", +DlgLstTypeUCase : "बड़े अकà¥à¤·à¤° (A, B, C)", +DlgLstTypeSRoman : "छोटे रोमन अंक (i, ii, iii)", +DlgLstTypeLRoman : "बड़े रोमन अंक (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "आम", +DlgDocBackTab : "बैकà¥à¤—à¥à¤°à¤¾à¤‰à¤¨à¥à¤¡", +DlgDocColorsTab : "रंग और मारà¥à¤œà¤¿à¤¨", +DlgDocMetaTab : "मॅटाडेटा", + +DlgDocPageTitle : "पेज शीरà¥à¤·à¤•", +DlgDocLangDir : "भाषा लिखने की दिशा", +DlgDocLangDirLTR : "बायें से दायें (LTR)", +DlgDocLangDirRTL : "दायें से बायें (RTL)", +DlgDocLangCode : "भाषा कोड", +DlgDocCharSet : "करेकà¥à¤Ÿà¤° सॅट à¤à¤¨à¥à¤•à¥‹à¤¡à¤¿à¤‚ग", +DlgDocCharSetCE : "मधà¥à¤¯ यूरोपीय (Central European)", +DlgDocCharSetCT : "चीनी (Chinese Traditional Big5)", +DlgDocCharSetCR : "सिरीलिक (Cyrillic)", +DlgDocCharSetGR : "यवन (Greek)", +DlgDocCharSetJP : "जापानी (Japanese)", +DlgDocCharSetKR : "कोरीयन (Korean)", +DlgDocCharSetTR : "तà¥à¤°à¥à¤•à¥€ (Turkish)", +DlgDocCharSetUN : "यूनीकोड (UTF-8)", +DlgDocCharSetWE : "पशà¥à¤šà¤¿à¤® यूरोपीय (Western European)", +DlgDocCharSetOther : "अनà¥à¤¯ करेकà¥à¤Ÿà¤° सॅट à¤à¤¨à¥à¤•à¥‹à¤¡à¤¿à¤‚ग", + +DlgDocDocType : "डॉकà¥à¤¯à¥‚मॅनà¥à¤Ÿ पà¥à¤°à¤•à¤¾à¤° शीरà¥à¤·à¤•", +DlgDocDocTypeOther : "अनà¥à¤¯ डॉकà¥à¤¯à¥‚मॅनà¥à¤Ÿ पà¥à¤°à¤•à¤¾à¤° शीरà¥à¤·à¤•", +DlgDocIncXHTML : "XHTML सूचना समà¥à¤®à¤¿à¤²à¤¿à¤¤ करें", +DlgDocBgColor : "बैकà¥à¤—à¥à¤°à¤¾à¤‰à¤¨à¥à¤¡ रंग", +DlgDocBgImage : "बैकà¥à¤—à¥à¤°à¤¾à¤‰à¤¨à¥à¤¡ तसà¥à¤µà¥€à¤° URL", +DlgDocBgNoScroll : "सà¥à¤•à¥à¤°à¥‰à¤² न करने वाला बैकà¥à¤—à¥à¤°à¤¾à¤‰à¤¨à¥à¤¡", +DlgDocCText : "टेकà¥à¤¸à¥à¤Ÿ", +DlgDocCLink : "लिंक", +DlgDocCVisited : "विज़िट किया गया लिंक", +DlgDocCActive : "सकà¥à¤°à¤¿à¤¯ लिंक", +DlgDocMargins : "पेज मारà¥à¤œà¤¿à¤¨", +DlgDocMaTop : "ऊपर", +DlgDocMaLeft : "बायें", +DlgDocMaRight : "दायें", +DlgDocMaBottom : "नीचे", +DlgDocMeIndex : "डॉकà¥à¤¯à¥à¤®à¥…नà¥à¤Ÿ इनà¥à¤¡à¥‡à¤•à¥à¤¸ संकेतशबà¥à¤¦ (अलà¥à¤ªà¤µà¤¿à¤°à¤¾à¤® से अलग करें)", +DlgDocMeDescr : "डॉकà¥à¤¯à¥‚मॅनà¥à¤Ÿ करॅकà¥à¤Ÿà¤°à¤¨", +DlgDocMeAuthor : "लेखक", +DlgDocMeCopy : "कॉपीराइट", +DlgDocPreview : "पà¥à¤°à¥€à¤µà¥à¤¯à¥‚", + +// Templates Dialog +Templates : "टॅमà¥à¤ªà¥à¤²à¥‡à¤Ÿ", +DlgTemplatesTitle : "कनà¥à¤Ÿà¥‡à¤¨à¥à¤Ÿ टॅमà¥à¤ªà¥à¤²à¥‡à¤Ÿ", +DlgTemplatesSelMsg : "à¤à¤¡à¤¿à¤Ÿà¤° में ओपन करने हेतॠटॅमà¥à¤ªà¥à¤²à¥‡à¤Ÿ चà¥à¤¨à¥‡à¤‚(वरà¥à¤¤à¤®à¤¾à¤¨ कनà¥à¤Ÿà¥…नà¥à¤Ÿ सेव नहीं होंगे):", +DlgTemplatesLoading : "टॅमà¥à¤ªà¥à¤²à¥‡à¤Ÿ सूची लोड की जा रही है। ज़रा ठहरें...", +DlgTemplatesNoTpl : "(कोई टॅमà¥à¤ªà¥à¤²à¥‡à¤Ÿ डिफ़ाइन नहीं किया गया है)", +DlgTemplatesReplace : "मूल शबà¥à¤¦à¥‹à¤‚ को बदलें", + +// About Dialog +DlgAboutAboutTab : "FCKEditor के बारे में", +DlgAboutBrowserInfoTab : "बà¥à¤°à¤¾à¤‰à¥›à¤° के बारे में", +DlgAboutLicenseTab : "लाइसैनà¥à¤¸", +DlgAboutVersion : "वरà¥à¥›à¤¨", +DlgAboutInfo : "अधिक जानकारी के लिये यहाठजायें:", + +// Div Dialog +DlgDivGeneralTab : "सामानà¥à¤¯", +DlgDivAdvancedTab : "à¤à¤¡à¥à¤µà¤¾à¤¨à¥à¤¸à¥à¤¡", +DlgDivStyle : "सà¥à¤Ÿà¤¾à¤‡à¤²", +DlgDivInlineStyle : "इनलाइन सà¥à¤Ÿà¤¾à¤‡à¤²" +}; diff --git a/webdir/fckeditor/editor/lang/hr.js b/webdir/fckeditor/editor/lang/hr.js new file mode 100644 index 0000000..85840f1 --- /dev/null +++ b/webdir/fckeditor/editor/lang/hr.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Croatian language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Smanji trake s alatima", +ToolbarExpand : "ProÅ¡iri trake s alatima", + +// Toolbar Items and Context Menu +Save : "Snimi", +NewPage : "Nova stranica", +Preview : "Pregledaj", +Cut : "Izreži", +Copy : "Kopiraj", +Paste : "Zalijepi", +PasteText : "Zalijepi kao Äisti tekst", +PasteWord : "Zalijepi iz Worda", +Print : "IspiÅ¡i", +SelectAll : "Odaberi sve", +RemoveFormat : "Ukloni formatiranje", +InsertLinkLbl : "Link", +InsertLink : "Ubaci/promijeni link", +RemoveLink : "Ukloni link", +VisitLink : "Otvori link", +Anchor : "Ubaci/promijeni sidro", +AnchorDelete : "Ukloni sidro", +InsertImageLbl : "Slika", +InsertImage : "Ubaci/promijeni sliku", +InsertFlashLbl : "Flash", +InsertFlash : "Ubaci/promijeni Flash", +InsertTableLbl : "Tablica", +InsertTable : "Ubaci/promijeni tablicu", +InsertLineLbl : "Linija", +InsertLine : "Ubaci vodoravnu liniju", +InsertSpecialCharLbl: "Posebni karakteri", +InsertSpecialChar : "Ubaci posebne znakove", +InsertSmileyLbl : "SmjeÅ¡ko", +InsertSmiley : "Ubaci smjeÅ¡ka", +About : "O FCKeditoru", +Bold : "Podebljaj", +Italic : "Ukosi", +Underline : "Potcrtano", +StrikeThrough : "Precrtano", +Subscript : "Subscript", +Superscript : "Superscript", +LeftJustify : "Lijevo poravnanje", +CenterJustify : "SrediÅ¡nje poravnanje", +RightJustify : "Desno poravnanje", +BlockJustify : "Blok poravnanje", +DecreaseIndent : "Pomakni ulijevo", +IncreaseIndent : "Pomakni udesno", +Blockquote : "Blockquote", +CreateDiv : "Napravi Div kontejner", +EditDiv : "Uredi Div kontejner", +DeleteDiv : "Ukloni Div kontejner", +Undo : "PoniÅ¡ti", +Redo : "Ponovi", +NumberedListLbl : "BrojÄana lista", +NumberedList : "Ubaci/ukloni brojÄanu listu", +BulletedListLbl : "ObiÄna lista", +BulletedList : "Ubaci/ukloni obiÄnu listu", +ShowTableBorders : "Prikaži okvir tablice", +ShowDetails : "Prikaži detalje", +Style : "Stil", +FontFormat : "Format", +Font : "Font", +FontSize : "VeliÄina", +TextColor : "Boja teksta", +BGColor : "Boja pozadine", +Source : "Kôd", +Find : "PronaÄ‘i", +Replace : "Zamijeni", +SpellCheck : "Provjeri pravopis", +UniversalKeyboard : "Univerzalna tipkovnica", +PageBreakLbl : "Prijelom stranice", +PageBreak : "Ubaci prijelom stranice", + +Form : "Form", +Checkbox : "Checkbox", +RadioButton : "Radio Button", +TextField : "Text Field", +Textarea : "Textarea", +HiddenField : "Hidden Field", +Button : "Button", +SelectionField : "Selection Field", +ImageButton : "Image Button", + +FitWindow : "Povećaj veliÄinu editora", +ShowBlocks : "Prikaži blokove", + +// Context Menu +EditLink : "Promijeni link", +CellCM : "Ćelija", +RowCM : "Red", +ColumnCM : "Kolona", +InsertRowAfter : "Ubaci red poslije", +InsertRowBefore : "Ubaci red prije", +DeleteRows : "IzbriÅ¡i redove", +InsertColumnAfter : "Ubaci kolonu poslije", +InsertColumnBefore : "Ubaci kolonu prije", +DeleteColumns : "IzbriÅ¡i kolone", +InsertCellAfter : "Ubaci ćeliju poslije", +InsertCellBefore : "Ubaci ćeliju prije", +DeleteCells : "IzbriÅ¡i ćelije", +MergeCells : "Spoji ćelije", +MergeRight : "Spoji desno", +MergeDown : "Spoji dolje", +HorizontalSplitCell : "Podijeli ćeliju vodoravno", +VerticalSplitCell : "Podijeli ćeliju okomito", +TableDelete : "IzbriÅ¡i tablicu", +CellProperties : "Svojstva ćelije", +TableProperties : "Svojstva tablice", +ImageProperties : "Svojstva slike", +FlashProperties : "Flash svojstva", + +AnchorProp : "Svojstva sidra", +ButtonProp : "Image Button svojstva", +CheckboxProp : "Checkbox svojstva", +HiddenFieldProp : "Hidden Field svojstva", +RadioButtonProp : "Radio Button svojstva", +ImageButtonProp : "Image Button svojstva", +TextFieldProp : "Text Field svojstva", +SelectionFieldProp : "Selection svojstva", +TextareaProp : "Textarea svojstva", +FormProp : "Form svojstva", + +FontFormats : "Normal;Formatted;Address;Heading 1;Heading 2;Heading 3;Heading 4;Heading 5;Heading 6;Normal (DIV)", + +// Alerts and Messages +ProcessingXHTML : "ObraÄ‘ujem XHTML. Molimo priÄekajte...", +Done : "ZavrÅ¡io", +PasteWordConfirm : "Tekst koji želite zalijepiti Äini se da je kopiran iz Worda. Želite li prije oÄistiti tekst?", +NotCompatiblePaste : "Ova naredba je dostupna samo u Internet Exploreru 5.5 ili novijem. Želite li nastaviti bez Äišćenja?", +UnknownToolbarItem : "Nepoznati Älan trake s alatima \"%1\"", +UnknownCommand : "Nepoznata naredba \"%1\"", +NotImplemented : "Naredba nije implementirana", +UnknownToolbarSet : "Traka s alatima \"%1\" ne postoji", +NoActiveX : "VaÅ¡e postavke pretraživaÄa mogle bi ograniÄiti neke od mogućnosti editora. Morate ukljuÄiti opciju \"Run ActiveX controls and plug-ins\" u postavkama. Ukoliko to ne uÄinite, moguće su razliite greÅ¡ke tijekom rada.", +BrowseServerBlocked : "PretraivaÄ nije moguće otvoriti. Provjerite da li je ukljuÄeno blokiranje pop-up prozora.", +DialogBlocked : "Nije moguće otvoriti novi prozor. Provjerite da li je ukljuÄeno blokiranje pop-up prozora.", +VisitLinkBlocked : "Nije moguće otvoriti novi prozor. Provjerite da li je ukljuÄeno blokiranje pop-up prozora.", + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "PoniÅ¡ti", +DlgBtnClose : "Zatvori", +DlgBtnBrowseServer : "Pretraži server", +DlgAdvancedTag : "Napredno", +DlgOpOther : "", +DlgInfoTab : "Info", +DlgAlertUrl : "Molimo unesite URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Smjer jezika", +DlgGenLangDirLtr : "S lijeva na desno (LTR)", +DlgGenLangDirRtl : "S desna na lijevo (RTL)", +DlgGenLangCode : "Kôd jezika", +DlgGenAccessKey : "Pristupna tipka", +DlgGenName : "Naziv", +DlgGenTabIndex : "Tab Indeks", +DlgGenLongDescr : "DugaÄki opis URL", +DlgGenClass : "Stylesheet klase", +DlgGenTitle : "Advisory naslov", +DlgGenContType : "Advisory vrsta sadržaja", +DlgGenLinkCharset : "Kodna stranica povezanih resursa", +DlgGenStyle : "Stil", + +// Image Dialog +DlgImgTitle : "Svojstva slika", +DlgImgInfoTab : "Info slike", +DlgImgBtnUpload : "PoÅ¡alji na server", +DlgImgURL : "URL", +DlgImgUpload : "PoÅ¡alji", +DlgImgAlt : "Alternativni tekst", +DlgImgWidth : "Å irina", +DlgImgHeight : "Visina", +DlgImgLockRatio : "ZakljuÄaj odnos", +DlgBtnResetSize : "ObriÅ¡i veliÄinu", +DlgImgBorder : "Okvir", +DlgImgHSpace : "HSpace", +DlgImgVSpace : "VSpace", +DlgImgAlign : "Poravnaj", +DlgImgAlignLeft : "Lijevo", +DlgImgAlignAbsBottom: "Abs dolje", +DlgImgAlignAbsMiddle: "Abs sredina", +DlgImgAlignBaseline : "Bazno", +DlgImgAlignBottom : "Dolje", +DlgImgAlignMiddle : "Sredina", +DlgImgAlignRight : "Desno", +DlgImgAlignTextTop : "Vrh teksta", +DlgImgAlignTop : "Vrh", +DlgImgPreview : "Pregledaj", +DlgImgAlertUrl : "Unesite URL slike", +DlgImgLinkTab : "Link", + +// Flash Dialog +DlgFlashTitle : "Flash svojstva", +DlgFlashChkPlay : "Auto Play", +DlgFlashChkLoop : "Ponavljaj", +DlgFlashChkMenu : "Omogući Flash izbornik", +DlgFlashScale : "Omjer", +DlgFlashScaleAll : "Prikaži sve", +DlgFlashScaleNoBorder : "Bez okvira", +DlgFlashScaleFit : "ToÄna veliÄina", + +// Link Dialog +DlgLnkWindowTitle : "Link", +DlgLnkInfoTab : "Link Info", +DlgLnkTargetTab : "Meta", + +DlgLnkType : "Link vrsta", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Sidro na ovoj stranici", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protokol", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Odaberi sidro", +DlgLnkAnchorByName : "Po nazivu sidra", +DlgLnkAnchorById : "Po Id elementa", +DlgLnkNoAnchors : "(Nema dostupnih sidra)", +DlgLnkEMail : "E-Mail adresa", +DlgLnkEMailSubject : "Naslov", +DlgLnkEMailBody : "Sadržaj poruke", +DlgLnkUpload : "PoÅ¡alji", +DlgLnkBtnUpload : "PoÅ¡alji na server", + +DlgLnkTarget : "Meta", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Novi prozor (_blank)", +DlgLnkTargetParent : "Roditeljski prozor (_parent)", +DlgLnkTargetSelf : "Isti prozor (_self)", +DlgLnkTargetTop : "VrÅ¡ni prozor (_top)", +DlgLnkTargetFrameName : "Ime ciljnog okvira", +DlgLnkPopWinName : "Naziv popup prozora", +DlgLnkPopWinFeat : "Mogućnosti popup prozora", +DlgLnkPopResize : "Promjenljive veliÄine", +DlgLnkPopLocation : "Traka za lokaciju", +DlgLnkPopMenu : "Izborna traka", +DlgLnkPopScroll : "Scroll traka", +DlgLnkPopStatus : "Statusna traka", +DlgLnkPopToolbar : "Traka s alatima", +DlgLnkPopFullScrn : "Cijeli ekran (IE)", +DlgLnkPopDependent : "Ovisno (Netscape)", +DlgLnkPopWidth : "Å irina", +DlgLnkPopHeight : "Visina", +DlgLnkPopLeft : "Lijeva pozicija", +DlgLnkPopTop : "Gornja pozicija", + +DlnLnkMsgNoUrl : "Molimo upiÅ¡ite URL link", +DlnLnkMsgNoEMail : "Molimo upiÅ¡ite e-mail adresu", +DlnLnkMsgNoAnchor : "Molimo odaberite sidro", +DlnLnkMsgInvPopName : "Ime popup prozora mora poÄeti sa slovom i ne smije sadržavati razmake", + +// Color Dialog +DlgColorTitle : "Odaberite boju", +DlgColorBtnClear : "ObriÅ¡i", +DlgColorHighlight : "Osvijetli", +DlgColorSelected : "Odaberi", + +// Smiley Dialog +DlgSmileyTitle : "Ubaci smjeÅ¡ka", + +// Special Character Dialog +DlgSpecialCharTitle : "Odaberite posebni karakter", + +// Table Dialog +DlgTableTitle : "Svojstva tablice", +DlgTableRows : "Redova", +DlgTableColumns : "Kolona", +DlgTableBorder : "VeliÄina okvira", +DlgTableAlign : "Poravnanje", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Lijevo", +DlgTableAlignCenter : "SrediÅ¡nje", +DlgTableAlignRight : "Desno", +DlgTableWidth : "Å irina", +DlgTableWidthPx : "piksela", +DlgTableWidthPc : "postotaka", +DlgTableHeight : "Visina", +DlgTableCellSpace : "Prostornost ćelija", +DlgTableCellPad : "Razmak ćelija", +DlgTableCaption : "Naslov", +DlgTableSummary : "Sažetak", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Svojstva ćelije", +DlgCellWidth : "Å irina", +DlgCellWidthPx : "piksela", +DlgCellWidthPc : "postotaka", +DlgCellHeight : "Visina", +DlgCellWordWrap : "Word Wrap", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Da", +DlgCellWordWrapNo : "Ne", +DlgCellHorAlign : "Vodoravno poravnanje", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Lijevo", +DlgCellHorAlignCenter : "SrediÅ¡nje", +DlgCellHorAlignRight: "Desno", +DlgCellVerAlign : "Okomito poravnanje", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Gornje", +DlgCellVerAlignMiddle : "SredniÅ¡nje", +DlgCellVerAlignBottom : "Donje", +DlgCellVerAlignBaseline : "Bazno", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Spajanje redova", +DlgCellCollSpan : "Spajanje kolona", +DlgCellBackColor : "Boja pozadine", +DlgCellBorderColor : "Boja okvira", +DlgCellBtnSelect : "Odaberi...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "PronaÄ‘i i zamijeni", + +// Find Dialog +DlgFindTitle : "PronaÄ‘i", +DlgFindFindBtn : "PronaÄ‘i", +DlgFindNotFoundMsg : "Traženi tekst nije pronaÄ‘en.", + +// Replace Dialog +DlgReplaceTitle : "Zamijeni", +DlgReplaceFindLbl : "PronaÄ‘i:", +DlgReplaceReplaceLbl : "Zamijeni s:", +DlgReplaceCaseChk : "Usporedi mala/velika slova", +DlgReplaceReplaceBtn : "Zamijeni", +DlgReplaceReplAllBtn : "Zamijeni sve", +DlgReplaceWordChk : "Usporedi cijele rijeÄi", + +// Paste Operations / Dialog +PasteErrorCut : "Sigurnosne postavke VaÅ¡eg pretraživaÄa ne dozvoljavaju operacije automatskog izrezivanja. Molimo koristite kraticu na tipkovnici (Ctrl+X).", +PasteErrorCopy : "Sigurnosne postavke VaÅ¡eg pretraživaÄa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tipkovnici (Ctrl+C).", + +PasteAsText : "Zalijepi kao Äisti tekst", +PasteFromWord : "Zalijepi iz Worda", + +DlgPasteMsg2 : "Molimo zaljepite unutar doljnjeg okvira koristeći tipkovnicu (Ctrl+V) i kliknite OK.", +DlgPasteSec : "Zbog sigurnosnih postavki VaÅ¡eg pretraživaÄa, editor nema direktan pristup VaÅ¡em meÄ‘uspremniku. Potrebno je ponovno zalijepiti tekst u ovaj prozor.", +DlgPasteIgnoreFont : "Zanemari definiciju vrste fonta", +DlgPasteRemoveStyles : "Ukloni definicije stilova", + +// Color Picker +ColorAutomatic : "Automatski", +ColorMoreColors : "ViÅ¡e boja...", + +// Document Properties +DocProps : "Svojstva dokumenta", + +// Anchor Dialog +DlgAnchorTitle : "Svojstva sidra", +DlgAnchorName : "Ime sidra", +DlgAnchorErrorName : "Molimo unesite ime sidra", + +// Speller Pages Dialog +DlgSpellNotInDic : "Nije u rjeÄniku", +DlgSpellChangeTo : "Promijeni u", +DlgSpellBtnIgnore : "Zanemari", +DlgSpellBtnIgnoreAll : "Zanemari sve", +DlgSpellBtnReplace : "Zamijeni", +DlgSpellBtnReplaceAll : "Zamijeni sve", +DlgSpellBtnUndo : "Vrati", +DlgSpellNoSuggestions : "-Nema preporuke-", +DlgSpellProgress : "Provjera u tijeku...", +DlgSpellNoMispell : "Provjera zavrÅ¡ena: Nema greÅ¡aka", +DlgSpellNoChanges : "Provjera zavrÅ¡ena: Nije napravljena promjena", +DlgSpellOneChange : "Provjera zavrÅ¡ena: Jedna rijeÄ promjenjena", +DlgSpellManyChanges : "Provjera zavrÅ¡ena: Promijenjeno %1 rijeÄi", + +IeSpellDownload : "Provjera pravopisa nije instalirana. Želite li skinuti provjeru pravopisa?", + +// Button Dialog +DlgButtonText : "Tekst (vrijednost)", +DlgButtonType : "Vrsta", +DlgButtonTypeBtn : "Gumb", +DlgButtonTypeSbm : "PoÅ¡alji", +DlgButtonTypeRst : "PoniÅ¡ti", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Ime", +DlgCheckboxValue : "Vrijednost", +DlgCheckboxSelected : "Odabrano", + +// Form Dialog +DlgFormName : "Ime", +DlgFormAction : "Akcija", +DlgFormMethod : "Metoda", + +// Select Field Dialog +DlgSelectName : "Ime", +DlgSelectValue : "Vrijednost", +DlgSelectSize : "VeliÄina", +DlgSelectLines : "linija", +DlgSelectChkMulti : "Dozvoli viÅ¡estruki odabir", +DlgSelectOpAvail : "Dostupne opcije", +DlgSelectOpText : "Tekst", +DlgSelectOpValue : "Vrijednost", +DlgSelectBtnAdd : "Dodaj", +DlgSelectBtnModify : "Promijeni", +DlgSelectBtnUp : "Gore", +DlgSelectBtnDown : "Dolje", +DlgSelectBtnSetValue : "Postavi kao odabranu vrijednost", +DlgSelectBtnDelete : "ObriÅ¡i", + +// Textarea Dialog +DlgTextareaName : "Ime", +DlgTextareaCols : "Kolona", +DlgTextareaRows : "Redova", + +// Text Field Dialog +DlgTextName : "Ime", +DlgTextValue : "Vrijednost", +DlgTextCharWidth : "Å irina", +DlgTextMaxChars : "NajviÅ¡e karaktera", +DlgTextType : "Vrsta", +DlgTextTypeText : "Tekst", +DlgTextTypePass : "Å ifra", + +// Hidden Field Dialog +DlgHiddenName : "Ime", +DlgHiddenValue : "Vrijednost", + +// Bulleted List Dialog +BulletedListProp : "Svojstva liste", +NumberedListProp : "Svojstva brojÄane liste", +DlgLstStart : "PoÄetak", +DlgLstType : "Vrsta", +DlgLstTypeCircle : "Krug", +DlgLstTypeDisc : "Disk", +DlgLstTypeSquare : "Kvadrat", +DlgLstTypeNumbers : "Brojevi (1, 2, 3)", +DlgLstTypeLCase : "Mala slova (a, b, c)", +DlgLstTypeUCase : "Velika slova (A, B, C)", +DlgLstTypeSRoman : "Male rimske brojke (i, ii, iii)", +DlgLstTypeLRoman : "Velike rimske brojke (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Općenito", +DlgDocBackTab : "Pozadina", +DlgDocColorsTab : "Boje i margine", +DlgDocMetaTab : "Meta Data", + +DlgDocPageTitle : "Naslov stranice", +DlgDocLangDir : "Smjer jezika", +DlgDocLangDirLTR : "S lijeva na desno", +DlgDocLangDirRTL : "S desna na lijevo", +DlgDocLangCode : "Kôd jezika", +DlgDocCharSet : "Enkodiranje znakova", +DlgDocCharSetCE : "SrediÅ¡nja Europa", +DlgDocCharSetCT : "Tradicionalna kineska (Big5)", +DlgDocCharSetCR : "Ćirilica", +DlgDocCharSetGR : "GrÄka", +DlgDocCharSetJP : "Japanska", +DlgDocCharSetKR : "Koreanska", +DlgDocCharSetTR : "Turska", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Zapadna Europa", +DlgDocCharSetOther : "Ostalo enkodiranje znakova", + +DlgDocDocType : "Zaglavlje vrste dokumenta", +DlgDocDocTypeOther : "Ostalo zaglavlje vrste dokumenta", +DlgDocIncXHTML : "Ubaci XHTML deklaracije", +DlgDocBgColor : "Boja pozadine", +DlgDocBgImage : "URL slike pozadine", +DlgDocBgNoScroll : "Pozadine se ne pomiÄe", +DlgDocCText : "Tekst", +DlgDocCLink : "Link", +DlgDocCVisited : "Posjećeni link", +DlgDocCActive : "Aktivni link", +DlgDocMargins : "Margine stranice", +DlgDocMaTop : "Vrh", +DlgDocMaLeft : "Lijevo", +DlgDocMaRight : "Desno", +DlgDocMaBottom : "Dolje", +DlgDocMeIndex : "KljuÄne rijeÄi dokumenta (odvojene zarezom)", +DlgDocMeDescr : "Opis dokumenta", +DlgDocMeAuthor : "Autor", +DlgDocMeCopy : "Autorska prava", +DlgDocPreview : "Pregledaj", + +// Templates Dialog +Templates : "PredloÅ¡ci", +DlgTemplatesTitle : "PredloÅ¡ci sadržaja", +DlgTemplatesSelMsg : "Molimo odaberite predložak koji želite otvoriti
    (stvarni sadržaj će biti izgubljen):", +DlgTemplatesLoading : "UÄitavam listu predložaka. Molimo priÄekajte...", +DlgTemplatesNoTpl : "(Nema definiranih predložaka)", +DlgTemplatesReplace : "Zamijeni trenutne sadržaje", + +// About Dialog +DlgAboutAboutTab : "O FCKEditoru", +DlgAboutBrowserInfoTab : "Podaci o pretraživaÄu", +DlgAboutLicenseTab : "Licenca", +DlgAboutVersion : "inaÄica", +DlgAboutInfo : "Za viÅ¡e informacija posjetite", + +// Div Dialog +DlgDivGeneralTab : "Općenito", +DlgDivAdvancedTab : "Napredno", +DlgDivStyle : "Stil", +DlgDivInlineStyle : "Stil u redu" +}; diff --git a/webdir/fckeditor/editor/lang/hu.js b/webdir/fckeditor/editor/lang/hu.js new file mode 100644 index 0000000..55e707b --- /dev/null +++ b/webdir/fckeditor/editor/lang/hu.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Hungarian language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Eszköztár elrejtése", +ToolbarExpand : "Eszköztár megjelenítése", + +// Toolbar Items and Context Menu +Save : "Mentés", +NewPage : "Új oldal", +Preview : "ElÅ‘nézet", +Cut : "Kivágás", +Copy : "Másolás", +Paste : "Beillesztés", +PasteText : "Beillesztés formázás nélkül", +PasteWord : "Beillesztés Word-bÅ‘l", +Print : "Nyomtatás", +SelectAll : "Mindent kijelöl", +RemoveFormat : "Formázás eltávolítása", +InsertLinkLbl : "Hivatkozás", +InsertLink : "Hivatkozás beillesztése/módosítása", +RemoveLink : "Hivatkozás törlése", +VisitLink : "Open Link", //MISSING +Anchor : "Horgony beillesztése/szerkesztése", +AnchorDelete : "Horgony eltávolítása", +InsertImageLbl : "Kép", +InsertImage : "Kép beillesztése/módosítása", +InsertFlashLbl : "Flash", +InsertFlash : "Flash beillesztése, módosítása", +InsertTableLbl : "Táblázat", +InsertTable : "Táblázat beillesztése/módosítása", +InsertLineLbl : "Vonal", +InsertLine : "Elválasztóvonal beillesztése", +InsertSpecialCharLbl: "Speciális karakter", +InsertSpecialChar : "Speciális karakter beillesztése", +InsertSmileyLbl : "Hangulatjelek", +InsertSmiley : "Hangulatjelek beillesztése", +About : "FCKeditor névjegy", +Bold : "Félkövér", +Italic : "DÅ‘lt", +Underline : "Aláhúzott", +StrikeThrough : "Ãthúzott", +Subscript : "Alsó index", +Superscript : "FelsÅ‘ index", +LeftJustify : "Balra", +CenterJustify : "Középre", +RightJustify : "Jobbra", +BlockJustify : "Sorkizárt", +DecreaseIndent : "Behúzás csökkentése", +IncreaseIndent : "Behúzás növelése", +Blockquote : "Idézet blokk", +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "Visszavonás", +Redo : "Ismétlés", +NumberedListLbl : "Számozás", +NumberedList : "Számozás beillesztése/törlése", +BulletedListLbl : "Felsorolás", +BulletedList : "Felsorolás beillesztése/törlése", +ShowTableBorders : "Táblázat szegély mutatása", +ShowDetails : "Részletek mutatása", +Style : "Stílus", +FontFormat : "Formátum", +Font : "Betűtípus", +FontSize : "Méret", +TextColor : "Betűszín", +BGColor : "Háttérszín", +Source : "Forráskód", +Find : "Keresés", +Replace : "Csere", +SpellCheck : "Helyesírás-ellenÅ‘rzés", +UniversalKeyboard : "Univerzális billentyűzet", +PageBreakLbl : "Oldaltörés", +PageBreak : "Oldaltörés beillesztése", + +Form : "Å°rlap", +Checkbox : "JelölÅ‘négyzet", +RadioButton : "Választógomb", +TextField : "SzövegmezÅ‘", +Textarea : "Szövegterület", +HiddenField : "RejtettmezÅ‘", +Button : "Gomb", +SelectionField : "LegördülÅ‘ lista", +ImageButton : "Képgomb", + +FitWindow : "Maximalizálás", +ShowBlocks : "Blokkok megjelenítése", + +// Context Menu +EditLink : "Hivatkozás módosítása", +CellCM : "Cella", +RowCM : "Sor", +ColumnCM : "Oszlop", +InsertRowAfter : "Sor beillesztése az aktuális sor mögé", +InsertRowBefore : "Sor beillesztése az aktuális sor elé", +DeleteRows : "Sorok törlése", +InsertColumnAfter : "Oszlop beillesztése az aktuális oszlop mögé", +InsertColumnBefore : "Oszlop beillesztése az aktuális oszlop elé", +DeleteColumns : "Oszlopok törlése", +InsertCellAfter : "Cella beillesztése az aktuális cella mögé", +InsertCellBefore : "Cella beillesztése az aktuális cella elé", +DeleteCells : "Cellák törlése", +MergeCells : "Cellák egyesítése", +MergeRight : "Cellák egyesítése jobbra", +MergeDown : "Cellák egyesítése lefelé", +HorizontalSplitCell : "Cellák szétválasztása vízszintesen", +VerticalSplitCell : "Cellák szétválasztása függÅ‘legesen", +TableDelete : "Táblázat törlése", +CellProperties : "Cella tulajdonságai", +TableProperties : "Táblázat tulajdonságai", +ImageProperties : "Kép tulajdonságai", +FlashProperties : "Flash tulajdonságai", + +AnchorProp : "Horgony tulajdonságai", +ButtonProp : "Gomb tulajdonságai", +CheckboxProp : "JelölÅ‘négyzet tulajdonságai", +HiddenFieldProp : "Rejtett mezÅ‘ tulajdonságai", +RadioButtonProp : "Választógomb tulajdonságai", +ImageButtonProp : "Képgomb tulajdonságai", +TextFieldProp : "SzövegmezÅ‘ tulajdonságai", +SelectionFieldProp : "LegördülÅ‘ lista tulajdonságai", +TextareaProp : "Szövegterület tulajdonságai", +FormProp : "Å°rlap tulajdonságai", + +FontFormats : "Normál;Formázott;Címsor;Fejléc 1;Fejléc 2;Fejléc 3;Fejléc 4;Fejléc 5;Fejléc 6;Bekezdés (DIV)", + +// Alerts and Messages +ProcessingXHTML : "XHTML feldolgozása. Kérem várjon...", +Done : "Kész", +PasteWordConfirm : "A beilleszteni kívánt szöveg Word-bÅ‘l van másolva. El kívánja távolítani a formázást a beillesztés elÅ‘tt?", +NotCompatiblePaste : "Ez a parancs csak Internet Explorer 5.5 verziótól használható. Megpróbálja beilleszteni a szöveget az eredeti formázással?", +UnknownToolbarItem : "Ismeretlen eszköztár elem \"%1\"", +UnknownCommand : "Ismeretlen parancs \"%1\"", +NotImplemented : "A parancs nem hajtható végre", +UnknownToolbarSet : "Az eszközkészlet \"%1\" nem létezik", +NoActiveX : "A böngészÅ‘ biztonsági beállításai korlátozzák a szerkesztÅ‘ lehetÅ‘ségeit. Engedélyezni kell ezt az opciót: \"Run ActiveX controls and plug-ins\". EttÅ‘l függetlenül elÅ‘fordulhatnak hibaüzenetek ill. bizonyos funkciók hiányozhatnak.", +BrowseServerBlocked : "Nem lehet megnyitni a fájlböngészÅ‘t. Bizonyosodjon meg róla, hogy a felbukkanó ablakok engedélyezve vannak.", +DialogBlocked : "Nem lehet megnyitni a párbeszédablakot. Bizonyosodjon meg róla, hogy a felbukkanó ablakok engedélyezve vannak.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "Rendben", +DlgBtnCancel : "Mégsem", +DlgBtnClose : "Bezárás", +DlgBtnBrowseServer : "Böngészés a szerveren", +DlgAdvancedTag : "További opciók", +DlgOpOther : "Egyéb", +DlgInfoTab : "Alaptulajdonságok", +DlgAlertUrl : "Illessze be a webcímet", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Azonosító", +DlgGenLangDir : "Ãrás iránya", +DlgGenLangDirLtr : "Balról jobbra", +DlgGenLangDirRtl : "Jobbról balra", +DlgGenLangCode : "Nyelv kódja", +DlgGenAccessKey : "Billentyűkombináció", +DlgGenName : "Név", +DlgGenTabIndex : "Tabulátor index", +DlgGenLongDescr : "Részletes leírás webcíme", +DlgGenClass : "Stíluskészlet", +DlgGenTitle : "Súgócimke", +DlgGenContType : "Súgó tartalomtípusa", +DlgGenLinkCharset : "Hivatkozott tartalom kódlapja", +DlgGenStyle : "Stílus", + +// Image Dialog +DlgImgTitle : "Kép tulajdonságai", +DlgImgInfoTab : "Alaptulajdonságok", +DlgImgBtnUpload : "Küldés a szerverre", +DlgImgURL : "Hivatkozás", +DlgImgUpload : "Feltöltés", +DlgImgAlt : "Buborék szöveg", +DlgImgWidth : "Szélesség", +DlgImgHeight : "Magasság", +DlgImgLockRatio : "Arány megtartása", +DlgBtnResetSize : "Eredeti méret", +DlgImgBorder : "Keret", +DlgImgHSpace : "Vízsz. táv", +DlgImgVSpace : "Függ. táv", +DlgImgAlign : "Igazítás", +DlgImgAlignLeft : "Bal", +DlgImgAlignAbsBottom: "Legaljára", +DlgImgAlignAbsMiddle: "Közepére", +DlgImgAlignBaseline : "Alapvonalhoz", +DlgImgAlignBottom : "Aljára", +DlgImgAlignMiddle : "Középre", +DlgImgAlignRight : "Jobbra", +DlgImgAlignTextTop : "Szöveg tetejére", +DlgImgAlignTop : "Tetejére", +DlgImgPreview : "ElÅ‘nézet", +DlgImgAlertUrl : "Töltse ki a kép webcímét", +DlgImgLinkTab : "Hivatkozás", + +// Flash Dialog +DlgFlashTitle : "Flash tulajdonságai", +DlgFlashChkPlay : "Automata lejátszás", +DlgFlashChkLoop : "Folyamatosan", +DlgFlashChkMenu : "Flash menü engedélyezése", +DlgFlashScale : "Méretezés", +DlgFlashScaleAll : "Mindent mutat", +DlgFlashScaleNoBorder : "Keret nélkül", +DlgFlashScaleFit : "Teljes kitöltés", + +// Link Dialog +DlgLnkWindowTitle : "Hivatkozás tulajdonságai", +DlgLnkInfoTab : "Alaptulajdonságok", +DlgLnkTargetTab : "Megjelenítés", + +DlgLnkType : "Hivatkozás típusa", +DlgLnkTypeURL : "Webcím", +DlgLnkTypeAnchor : "Horgony az oldalon", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protokoll", +DlgLnkProtoOther : "", +DlgLnkURL : "Webcím", +DlgLnkAnchorSel : "Horgony választása", +DlgLnkAnchorByName : "Horgony név szerint", +DlgLnkAnchorById : "Azonosító szerint", +DlgLnkNoAnchors : "(Nincs horgony a dokumentumban)", +DlgLnkEMail : "E-Mail cím", +DlgLnkEMailSubject : "Ãœzenet tárgya", +DlgLnkEMailBody : "Ãœzenet", +DlgLnkUpload : "Feltöltés", +DlgLnkBtnUpload : "Küldés a szerverre", + +DlgLnkTarget : "Tartalom megjelenítése", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Új ablakban (_blank)", +DlgLnkTargetParent : "SzülÅ‘ ablakban (_parent)", +DlgLnkTargetSelf : "Azonos ablakban (_self)", +DlgLnkTargetTop : "LegfelsÅ‘ ablakban (_top)", +DlgLnkTargetFrameName : "Keret neve", +DlgLnkPopWinName : "Felugró ablak neve", +DlgLnkPopWinFeat : "Felugró ablak jellemzÅ‘i", +DlgLnkPopResize : "MéretezhetÅ‘", +DlgLnkPopLocation : "Címsor", +DlgLnkPopMenu : "Menü sor", +DlgLnkPopScroll : "GördítÅ‘sáv", +DlgLnkPopStatus : "Ãllapotsor", +DlgLnkPopToolbar : "Eszköztár", +DlgLnkPopFullScrn : "Teljes képernyÅ‘ (csak IE)", +DlgLnkPopDependent : "SzülÅ‘höz kapcsolt (csak Netscape)", +DlgLnkPopWidth : "Szélesség", +DlgLnkPopHeight : "Magasság", +DlgLnkPopLeft : "Bal pozíció", +DlgLnkPopTop : "FelsÅ‘ pozíció", + +DlnLnkMsgNoUrl : "Adja meg a hivatkozás webcímét", +DlnLnkMsgNoEMail : "Adja meg az E-Mail címet", +DlnLnkMsgNoAnchor : "Válasszon egy horgonyt", +DlnLnkMsgInvPopName : "A felbukkanó ablak neve alfanumerikus karakterrel kezdôdjön, valamint ne tartalmazzon szóközt", + +// Color Dialog +DlgColorTitle : "Színválasztás", +DlgColorBtnClear : "Törlés", +DlgColorHighlight : "ElÅ‘nézet", +DlgColorSelected : "Kiválasztott", + +// Smiley Dialog +DlgSmileyTitle : "Hangulatjel beszúrása", + +// Special Character Dialog +DlgSpecialCharTitle : "Speciális karakter választása", + +// Table Dialog +DlgTableTitle : "Táblázat tulajdonságai", +DlgTableRows : "Sorok", +DlgTableColumns : "Oszlopok", +DlgTableBorder : "Szegélyméret", +DlgTableAlign : "Igazítás", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Balra", +DlgTableAlignCenter : "Középre", +DlgTableAlignRight : "Jobbra", +DlgTableWidth : "Szélesség", +DlgTableWidthPx : "képpont", +DlgTableWidthPc : "százalék", +DlgTableHeight : "Magasság", +DlgTableCellSpace : "Cella térköz", +DlgTableCellPad : "Cella belsÅ‘ margó", +DlgTableCaption : "Felirat", +DlgTableSummary : "Leírás", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Cella tulajdonságai", +DlgCellWidth : "Szélesség", +DlgCellWidthPx : "képpont", +DlgCellWidthPc : "százalék", +DlgCellHeight : "Magasság", +DlgCellWordWrap : "Sortörés", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Igen", +DlgCellWordWrapNo : "Nem", +DlgCellHorAlign : "Vízsz. igazítás", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Balra", +DlgCellHorAlignCenter : "Középre", +DlgCellHorAlignRight: "Jobbra", +DlgCellVerAlign : "Függ. igazítás", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Tetejére", +DlgCellVerAlignMiddle : "Középre", +DlgCellVerAlignBottom : "Aljára", +DlgCellVerAlignBaseline : "Egyvonalba", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Sorok egyesítése", +DlgCellCollSpan : "Oszlopok egyesítése", +DlgCellBackColor : "Háttérszín", +DlgCellBorderColor : "Szegélyszín", +DlgCellBtnSelect : "Kiválasztás...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Keresés és csere", + +// Find Dialog +DlgFindTitle : "Keresés", +DlgFindFindBtn : "Keresés", +DlgFindNotFoundMsg : "A keresett szöveg nem található.", + +// Replace Dialog +DlgReplaceTitle : "Csere", +DlgReplaceFindLbl : "Keresett szöveg:", +DlgReplaceReplaceLbl : "Csere erre:", +DlgReplaceCaseChk : "kis- és nagybetű megkülönböztetése", +DlgReplaceReplaceBtn : "Csere", +DlgReplaceReplAllBtn : "Az összes cseréje", +DlgReplaceWordChk : "csak ha ez a teljes szó", + +// Paste Operations / Dialog +PasteErrorCut : "A böngészÅ‘ biztonsági beállításai nem engedélyezik a szerkesztÅ‘nek, hogy végrehajtsa a kivágás műveletet. Használja az alábbi billentyűkombinációt (Ctrl+X).", +PasteErrorCopy : "A böngészÅ‘ biztonsági beállításai nem engedélyezik a szerkesztÅ‘nek, hogy végrehajtsa a másolás műveletet. Használja az alábbi billentyűkombinációt (Ctrl+X).", + +PasteAsText : "Beillesztés formázatlan szövegként", +PasteFromWord : "Beillesztés Word-bÅ‘l", + +DlgPasteMsg2 : "Másolja be az alábbi mezÅ‘be a Ctrl+V billentyűk lenyomásával, majd nyomjon Rendben-t.", +DlgPasteSec : "A böngészÅ‘ biztonsági beállításai miatt a szerkesztÅ‘ nem képes hozzáférni a vágólap adataihoz. Illeszd be újra ebben az ablakban.", +DlgPasteIgnoreFont : "Betű formázások megszüntetése", +DlgPasteRemoveStyles : "Stílusok eltávolítása", + +// Color Picker +ColorAutomatic : "Automatikus", +ColorMoreColors : "További színek...", + +// Document Properties +DocProps : "Dokumentum tulajdonságai", + +// Anchor Dialog +DlgAnchorTitle : "Horgony tulajdonságai", +DlgAnchorName : "Horgony neve", +DlgAnchorErrorName : "Kérem adja meg a horgony nevét", + +// Speller Pages Dialog +DlgSpellNotInDic : "Nincs a szótárban", +DlgSpellChangeTo : "Módosítás", +DlgSpellBtnIgnore : "Kihagyja", +DlgSpellBtnIgnoreAll : "Mindet kihagyja", +DlgSpellBtnReplace : "Csere", +DlgSpellBtnReplaceAll : "Összes cseréje", +DlgSpellBtnUndo : "Visszavonás", +DlgSpellNoSuggestions : "Nincs javaslat", +DlgSpellProgress : "Helyesírás-ellenÅ‘rzés folyamatban...", +DlgSpellNoMispell : "Helyesírás-ellenÅ‘rzés kész: Nem találtam hibát", +DlgSpellNoChanges : "Helyesírás-ellenÅ‘rzés kész: Nincs változtatott szó", +DlgSpellOneChange : "Helyesírás-ellenÅ‘rzés kész: Egy szó cserélve", +DlgSpellManyChanges : "Helyesírás-ellenÅ‘rzés kész: %1 szó cserélve", + +IeSpellDownload : "A helyesírás-ellenÅ‘rzÅ‘ nincs telepítve. Szeretné letölteni most?", + +// Button Dialog +DlgButtonText : "Szöveg (Érték)", +DlgButtonType : "Típus", +DlgButtonTypeBtn : "Gomb", +DlgButtonTypeSbm : "Küldés", +DlgButtonTypeRst : "Alaphelyzet", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Név", +DlgCheckboxValue : "Érték", +DlgCheckboxSelected : "Kiválasztott", + +// Form Dialog +DlgFormName : "Név", +DlgFormAction : "Adatfeldolgozást végzÅ‘ hivatkozás", +DlgFormMethod : "Adatküldés módja", + +// Select Field Dialog +DlgSelectName : "Név", +DlgSelectValue : "Érték", +DlgSelectSize : "Méret", +DlgSelectLines : "sor", +DlgSelectChkMulti : "több sor is kiválasztható", +DlgSelectOpAvail : "ElérhetÅ‘ opciók", +DlgSelectOpText : "Szöveg", +DlgSelectOpValue : "Érték", +DlgSelectBtnAdd : "Hozzáad", +DlgSelectBtnModify : "Módosít", +DlgSelectBtnUp : "Fel", +DlgSelectBtnDown : "Le", +DlgSelectBtnSetValue : "Legyen az alapértelmezett érték", +DlgSelectBtnDelete : "Töröl", + +// Textarea Dialog +DlgTextareaName : "Név", +DlgTextareaCols : "Karakterek száma egy sorban", +DlgTextareaRows : "Sorok száma", + +// Text Field Dialog +DlgTextName : "Név", +DlgTextValue : "Érték", +DlgTextCharWidth : "Megjelenített karakterek száma", +DlgTextMaxChars : "Maximális karakterszám", +DlgTextType : "Típus", +DlgTextTypeText : "Szöveg", +DlgTextTypePass : "Jelszó", + +// Hidden Field Dialog +DlgHiddenName : "Név", +DlgHiddenValue : "Érték", + +// Bulleted List Dialog +BulletedListProp : "Felsorolás tulajdonságai", +NumberedListProp : "Számozás tulajdonságai", +DlgLstStart : "Start", +DlgLstType : "Formátum", +DlgLstTypeCircle : "Kör", +DlgLstTypeDisc : "Lemez", +DlgLstTypeSquare : "Négyzet", +DlgLstTypeNumbers : "Számok (1, 2, 3)", +DlgLstTypeLCase : "Kisbetűk (a, b, c)", +DlgLstTypeUCase : "Nagybetűk (A, B, C)", +DlgLstTypeSRoman : "Kis római számok (i, ii, iii)", +DlgLstTypeLRoman : "Nagy római számok (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Ãltalános", +DlgDocBackTab : "Háttér", +DlgDocColorsTab : "Színek és margók", +DlgDocMetaTab : "Meta adatok", + +DlgDocPageTitle : "Oldalcím", +DlgDocLangDir : "Ãrás iránya", +DlgDocLangDirLTR : "Balról jobbra", +DlgDocLangDirRTL : "Jobbról balra", +DlgDocLangCode : "Nyelv kód", +DlgDocCharSet : "Karakterkódolás", +DlgDocCharSetCE : "Közép-Európai", +DlgDocCharSetCT : "Kínai Tradicionális (Big5)", +DlgDocCharSetCR : "Cyrill", +DlgDocCharSetGR : "Görög", +DlgDocCharSetJP : "Japán", +DlgDocCharSetKR : "Koreai", +DlgDocCharSetTR : "Török", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Nyugat-Európai", +DlgDocCharSetOther : "Más karakterkódolás", + +DlgDocDocType : "Dokumentum típus fejléc", +DlgDocDocTypeOther : "Más dokumentum típus fejléc", +DlgDocIncXHTML : "XHTML deklarációk beillesztése", +DlgDocBgColor : "Háttérszín", +DlgDocBgImage : "Háttérkép cím", +DlgDocBgNoScroll : "Nem gördíthetÅ‘ háttér", +DlgDocCText : "Szöveg", +DlgDocCLink : "Cím", +DlgDocCVisited : "Látogatott cím", +DlgDocCActive : "Aktív cím", +DlgDocMargins : "Oldal margók", +DlgDocMaTop : "FelsÅ‘", +DlgDocMaLeft : "Bal", +DlgDocMaRight : "Jobb", +DlgDocMaBottom : "Alsó", +DlgDocMeIndex : "Dokumentum keresÅ‘szavak (vesszÅ‘vel elválasztva)", +DlgDocMeDescr : "Dokumentum leírás", +DlgDocMeAuthor : "SzerzÅ‘", +DlgDocMeCopy : "SzerzÅ‘i jog", +DlgDocPreview : "ElÅ‘nézet", + +// Templates Dialog +Templates : "Sablonok", +DlgTemplatesTitle : "ElérhetÅ‘ sablonok", +DlgTemplatesSelMsg : "Válassza ki melyik sablon nyíljon meg a szerkesztÅ‘ben
    (a jelenlegi tartalom elveszik):", +DlgTemplatesLoading : "Sablon lista betöltése. Kis türelmet...", +DlgTemplatesNoTpl : "(Nincs sablon megadva)", +DlgTemplatesReplace : "Kicseréli a jelenlegi tartalmat", + +// About Dialog +DlgAboutAboutTab : "Névjegy", +DlgAboutBrowserInfoTab : "Böngésző információ", +DlgAboutLicenseTab : "Licensz", +DlgAboutVersion : "verzió", +DlgAboutInfo : "További információkért látogasson el ide:", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/is.js b/webdir/fckeditor/editor/lang/is.js new file mode 100644 index 0000000..1a31cac --- /dev/null +++ b/webdir/fckeditor/editor/lang/is.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Icelandic language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Fela verkstiku", +ToolbarExpand : "Sýna verkstiku", + +// Toolbar Items and Context Menu +Save : "Vista", +NewPage : "Ný síða", +Preview : "Forskoða", +Cut : "Klippa", +Copy : "Afrita", +Paste : "Líma", +PasteText : "Líma ósniðinn texta", +PasteWord : "Líma úr Word", +Print : "Prenta", +SelectAll : "Velja allt", +RemoveFormat : "Fjarlægja snið", +InsertLinkLbl : "Stikla", +InsertLink : "Stofna/breyta stiklu", +RemoveLink : "Fjarlægja stiklu", +VisitLink : "Opna stiklusíðu", +Anchor : "Stofna/breyta kaflamerki", +AnchorDelete : "Eyða kaflamerki", +InsertImageLbl : "Setja inn mynd", +InsertImage : "Setja inn/breyta mynd", +InsertFlashLbl : "Flash", +InsertFlash : "Setja inn/breyta Flash", +InsertTableLbl : "Tafla", +InsertTable : "Setja inn/breyta töflu", +InsertLineLbl : "Lína", +InsertLine : "Lóðrétt lína", +InsertSpecialCharLbl: "Merki", +InsertSpecialChar : "Setja inn merki", +InsertSmileyLbl : "Svipur", +InsertSmiley : "Setja upp svip", +About : "Um FCKeditor", +Bold : "Feitletrað", +Italic : "Skáletrað", +Underline : "Undirstrikað", +StrikeThrough : "Yfirstrikað", +Subscript : "Niðurskrifað", +Superscript : "Uppskrifað", +LeftJustify : "Vinstrijöfnun", +CenterJustify : "Miðja texta", +RightJustify : "Hægrijöfnun", +BlockJustify : "Jafna báðum megin", +DecreaseIndent : "Auka inndrátt", +IncreaseIndent : "Minnka inndrátt", +Blockquote : "Inndráttur", +CreateDiv : "Búa til DIV-hýsil", +EditDiv : "Breyta DIV-hýsli", +DeleteDiv : "Eyða DIV-hýsli", +Undo : "Afturkalla", +Redo : "Hætta við afturköllun", +NumberedListLbl : "Númeraður listi", +NumberedList : "Setja inn/fella númeraðan lista", +BulletedListLbl : "Punktalisti", +BulletedList : "Setja inn/fella punktalista", +ShowTableBorders : "Sýna töflugrind", +ShowDetails : "Sýna smáatriði", +Style : "Stílflokkur", +FontFormat : "Stílsnið", +Font : "Leturgerð ", +FontSize : "Leturstærð ", +TextColor : "Litur texta", +BGColor : "Bakgrunnslitur", +Source : "Kóði", +Find : "Leita", +Replace : "Skipta út", +SpellCheck : "Villuleit", +UniversalKeyboard : "Hnattrænt lyklaborð", +PageBreakLbl : "Síðuskil", +PageBreak : "Setja inn síðuskil", + +Form : "Setja inn innsláttarform", +Checkbox : "Setja inn hökunarreit", +RadioButton : "Setja inn valhnapp", +TextField : "Setja inn textareit", +Textarea : "Setja inn textasvæði", +HiddenField : "Setja inn falið svæði", +Button : "Setja inn hnapp", +SelectionField : "Setja inn lista", +ImageButton : "Setja inn myndahnapp", + +FitWindow : "Skoða ritil í fullri stærð", +ShowBlocks : "Sýna blokkir", + +// Context Menu +EditLink : "Breyta stiklu", +CellCM : "Reitur", +RowCM : "Röð", +ColumnCM : "Dálkur", +InsertRowAfter : "Skjóta inn röð fyrir neðan", +InsertRowBefore : "Skjóta inn röð fyrir ofan", +DeleteRows : "Eyða röð", +InsertColumnAfter : "Skjóta inn dálki hægra megin", +InsertColumnBefore : "Skjóta inn dálki vinstra megin", +DeleteColumns : "Fella dálk", +InsertCellAfter : "Skjóta inn reiti fyrir framan", +InsertCellBefore : "Skjóta inn reiti fyrir aftan", +DeleteCells : "Fella reit", +MergeCells : "Sameina reiti", +MergeRight : "Sameina til hægri", +MergeDown : "Sameina niður á við", +HorizontalSplitCell : "Kljúfa reit lárétt", +VerticalSplitCell : "Kljúfa reit lóðrétt", +TableDelete : "Fella töflu", +CellProperties : "Eigindi reits", +TableProperties : "Eigindi töflu", +ImageProperties : "Eigindi myndar", +FlashProperties : "Eigindi Flash", + +AnchorProp : "Eigindi kaflamerkis", +ButtonProp : "Eigindi hnapps", +CheckboxProp : "Eigindi markreits", +HiddenFieldProp : "Eigindi falins svæðis", +RadioButtonProp : "Eigindi valhnapps", +ImageButtonProp : "Eigindi myndahnapps", +TextFieldProp : "Eigindi textareits", +SelectionFieldProp : "Eigindi lista", +TextareaProp : "Eigindi textasvæðis", +FormProp : "Eigindi innsláttarforms", + +FontFormats : "Venjulegt letur;Forsniðið;Vistfang;Fyrirsögn 1;Fyrirsögn 2;Fyrirsögn 3;Fyrirsögn 4;Fyrirsögn 5;Fyrirsögn 6;Venjulegt (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Meðhöndla XHTML...", +Done : "Tilbúið", +PasteWordConfirm : "Textinn sem þú ætlar að líma virðist koma úr Word. Viltu hreinsa óþarfar Word-skipanir úr honum?", +NotCompatiblePaste : "Þessi aðgerð er bundin við Internet Explorer 5.5 og nýrri. Viltu líma textann án þess að hreinsa hann?", +UnknownToolbarItem : "Óþekktur hlutur í verkstiku \"%1\"!", +UnknownCommand : "Óþekkt skipanaheiti \"%1\"!", +NotImplemented : "Skipun ekki virkjuð!", +UnknownToolbarSet : "Verkstikan \"%1\" ekki til!", +NoActiveX : "Öryggisstillingarnar í vafranum þínum leyfa ekki alla möguleika ritilsins.
    Láttu vafrann leyfa Active-X og viðbætur til að komast hjá villum og takmörkunum.", +BrowseServerBlocked : "Ritillinn getur ekki opnað nauðsynlega hjálparglugga!
    Láttu hann leyfa þessari síðu að opna sprettiglugga.", +DialogBlocked : "Ekki var hægt að opna skipanaglugga!
    Nauðsynlegt er að leyfa síðunni að opna sprettiglugga.", +VisitLinkBlocked : "Ekki var hægt að opna nýjan glugga. Gangtu úr skugga um að engir sprettigluggabanar séu virkir.", + +// Dialogs +DlgBtnOK : "à lagi", +DlgBtnCancel : "Hætta við", +DlgBtnClose : "Loka", +DlgBtnBrowseServer : "Fletta í skjalasafni", +DlgAdvancedTag : "Tæknilegt", +DlgOpOther : "", +DlgInfoTab : "Upplýsingar", +DlgAlertUrl : "Sláðu inn slóð", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Auðkenni", +DlgGenLangDir : "Lesstefna", +DlgGenLangDirLtr : "Frá vinstri til hægri (LTR)", +DlgGenLangDirRtl : "Frá hægri til vinstri (RTL)", +DlgGenLangCode : "Tungumálakóði", +DlgGenAccessKey : "Skammvalshnappur", +DlgGenName : "Nafn", +DlgGenTabIndex : "Raðnúmer innsláttarreits", +DlgGenLongDescr : "Nánari lýsing", +DlgGenClass : "Stílsniðsflokkur", +DlgGenTitle : "Titill", +DlgGenContType : "Tegund innihalds", +DlgGenLinkCharset : "Táknróf", +DlgGenStyle : "Stíll", + +// Image Dialog +DlgImgTitle : "Eigindi myndar", +DlgImgInfoTab : "Almennt", +DlgImgBtnUpload : "Hlaða upp", +DlgImgURL : "Vefslóð", +DlgImgUpload : "Hlaða upp", +DlgImgAlt : "Baklægur texti", +DlgImgWidth : "Breidd", +DlgImgHeight : "Hæð", +DlgImgLockRatio : "Festa stærðarhlutfall", +DlgBtnResetSize : "Reikna stærð", +DlgImgBorder : "Rammi", +DlgImgHSpace : "Vinstri bil", +DlgImgVSpace : "Hægri bil", +DlgImgAlign : "Jöfnun", +DlgImgAlignLeft : "Vinstri", +DlgImgAlignAbsBottom: "Abs neðst", +DlgImgAlignAbsMiddle: "Abs miðjuð", +DlgImgAlignBaseline : "Grunnlína", +DlgImgAlignBottom : "Neðst", +DlgImgAlignMiddle : "Miðjuð", +DlgImgAlignRight : "Hægri", +DlgImgAlignTextTop : "Efri brún texta", +DlgImgAlignTop : "Efst", +DlgImgPreview : "Sýna dæmi", +DlgImgAlertUrl : "Sláðu inn slóðina að myndinni", +DlgImgLinkTab : "Stikla", + +// Flash Dialog +DlgFlashTitle : "Eigindi Flash", +DlgFlashChkPlay : "Sjálfvirk spilun", +DlgFlashChkLoop : "Endurtekning", +DlgFlashChkMenu : "Sýna Flash-valmynd", +DlgFlashScale : "Skali", +DlgFlashScaleAll : "Sýna allt", +DlgFlashScaleNoBorder : "Ãn ramma", +DlgFlashScaleFit : "Fella skala að stærð", + +// Link Dialog +DlgLnkWindowTitle : "Stikla", +DlgLnkInfoTab : "Almennt", +DlgLnkTargetTab : "Mark", + +DlgLnkType : "Stikluflokkur", +DlgLnkTypeURL : "Vefslóð", +DlgLnkTypeAnchor : "Bókamerki á þessari síðu", +DlgLnkTypeEMail : "Netfang", +DlgLnkProto : "Samskiptastaðall", +DlgLnkProtoOther : "", +DlgLnkURL : "Vefslóð", +DlgLnkAnchorSel : "Veldu akkeri", +DlgLnkAnchorByName : "Eftir akkerisnafni", +DlgLnkAnchorById : "Eftir auðkenni einingar", +DlgLnkNoAnchors : "", +DlgLnkEMail : "Netfang", +DlgLnkEMailSubject : "Efni", +DlgLnkEMailBody : "Meginmál", +DlgLnkUpload : "Senda upp", +DlgLnkBtnUpload : "Senda upp", + +DlgLnkTarget : "Mark", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Nýr gluggi (_blank)", +DlgLnkTargetParent : "Yfirsettur rammi (_parent)", +DlgLnkTargetSelf : "Sami gluggi (_self)", +DlgLnkTargetTop : "Allur glugginn (_top)", +DlgLnkTargetFrameName : "Nafn markglugga", +DlgLnkPopWinName : "Nafn sprettiglugga", +DlgLnkPopWinFeat : "Eigindi sprettiglugga", +DlgLnkPopResize : "Skölun", +DlgLnkPopLocation : "Fanglína", +DlgLnkPopMenu : "Vallína", +DlgLnkPopScroll : "Skrunstikur", +DlgLnkPopStatus : "Stöðustika", +DlgLnkPopToolbar : "Verkfærastika", +DlgLnkPopFullScrn : "Heilskjár (IE)", +DlgLnkPopDependent : "Háð venslum (Netscape)", +DlgLnkPopWidth : "Breidd", +DlgLnkPopHeight : "Hæð", +DlgLnkPopLeft : "Fjarlægð frá vinstri", +DlgLnkPopTop : "Fjarlægð frá efri brún", + +DlnLnkMsgNoUrl : "Sláðu inn veffang stiklunnar!", +DlnLnkMsgNoEMail : "Sláðu inn netfang!", +DlnLnkMsgNoAnchor : "Veldu fyrst eitthvert bókamerki!", +DlnLnkMsgInvPopName : "Sprettisíðan verður að byrja á bókstaf (a-z) og má ekki innihalda stafabil", + +// Color Dialog +DlgColorTitle : "Velja lit", +DlgColorBtnClear : "Núllstilla", +DlgColorHighlight : "Litmerkja", +DlgColorSelected : "Valið", + +// Smiley Dialog +DlgSmileyTitle : "Velja svip", + +// Special Character Dialog +DlgSpecialCharTitle : "Velja tákn", + +// Table Dialog +DlgTableTitle : "Eigindi töflu", +DlgTableRows : "Raðir", +DlgTableColumns : "Dálkar", +DlgTableBorder : "Breidd ramma", +DlgTableAlign : "Jöfnun", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Vinstrijafnað", +DlgTableAlignCenter : "Miðjað", +DlgTableAlignRight : "Hægrijafnað", +DlgTableWidth : "Breidd", +DlgTableWidthPx : "myndeindir", +DlgTableWidthPc : "prósent", +DlgTableHeight : "Hæð", +DlgTableCellSpace : "Bil milli reita", +DlgTableCellPad : "Reitaspássía", +DlgTableCaption : "Titill", +DlgTableSummary : "Ãfram", +DlgTableHeaders : "Fyrirsagnir", +DlgTableHeadersNone : "Engar", +DlgTableHeadersColumn : "Fyrsti dálkur", +DlgTableHeadersRow : "Fyrsta röð", +DlgTableHeadersBoth : "Hvort tveggja", + +// Table Cell Dialog +DlgCellTitle : "Eigindi reits", +DlgCellWidth : "Breidd", +DlgCellWidthPx : "myndeindir", +DlgCellWidthPc : "prósent", +DlgCellHeight : "Hæð", +DlgCellWordWrap : "Línuskipting", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Já", +DlgCellWordWrapNo : "Nei", +DlgCellHorAlign : "Lárétt jöfnun", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Vinstrijafnað", +DlgCellHorAlignCenter : "Miðjað", +DlgCellHorAlignRight: "Hægrijafnað", +DlgCellVerAlign : "Lóðrétt jöfnun", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Efst", +DlgCellVerAlignMiddle : "Miðjað", +DlgCellVerAlignBottom : "Neðst", +DlgCellVerAlignBaseline : "Grunnlína", +DlgCellType : "Tegund reits", +DlgCellTypeData : "Gögn", +DlgCellTypeHeader : "Fyrirsögn", +DlgCellRowSpan : "Hæð í röðum talið", +DlgCellCollSpan : "Breidd í dálkum talið", +DlgCellBackColor : "Bakgrunnslitur", +DlgCellBorderColor : "Rammalitur", +DlgCellBtnSelect : "Veldu...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Finna og skipta", + +// Find Dialog +DlgFindTitle : "Finna", +DlgFindFindBtn : "Finna", +DlgFindNotFoundMsg : "Leitartexti fannst ekki!", + +// Replace Dialog +DlgReplaceTitle : "Skipta út", +DlgReplaceFindLbl : "Leita að:", +DlgReplaceReplaceLbl : "Skipta út fyrir:", +DlgReplaceCaseChk : "Gera greinarmun á¡ há¡- og lágstöfum", +DlgReplaceReplaceBtn : "Skipta út", +DlgReplaceReplAllBtn : "Skipta út allsstaðar", +DlgReplaceWordChk : "Aðeins heil orð", + +// Paste Operations / Dialog +PasteErrorCut : "Öryggisstillingar vafrans þíns leyfa ekki klippingu texta með músaraðgerð. Notaðu lyklaborðið í klippa (Ctrl+X).", +PasteErrorCopy : "Öryggisstillingar vafrans þíns leyfa ekki afritun texta með músaraðgerð. Notaðu lyklaborðið í afrita (Ctrl+C).", + +PasteAsText : "Líma sem ósniðinn texta", +PasteFromWord : "Líma úr Word", + +DlgPasteMsg2 : "Límdu í svæðið hér að neðan og (Ctrl+V) og smelltu á OK.", +DlgPasteSec : "Vegna öryggisstillinga í vafranum þínum fær ritillinn ekki beinan aðgang að klippuborðinu. Þú verður að líma innihaldið aftur inn í þennan glugga.", +DlgPasteIgnoreFont : "Hunsa leturskilgreiningar", +DlgPasteRemoveStyles : "Hunsa letureigindi", + +// Color Picker +ColorAutomatic : "Sjálfval", +ColorMoreColors : "Fleiri liti...", + +// Document Properties +DocProps : "Eigindi skjals", + +// Anchor Dialog +DlgAnchorTitle : "Eigindi bókamerkis", +DlgAnchorName : "Nafn bókamerkis", +DlgAnchorErrorName : "Sláðu inn nafn bókamerkis!", + +// Speller Pages Dialog +DlgSpellNotInDic : "Ekki í orðabókinni", +DlgSpellChangeTo : "Tillaga", +DlgSpellBtnIgnore : "Hunsa", +DlgSpellBtnIgnoreAll : "Hunsa allt", +DlgSpellBtnReplace : "Skipta", +DlgSpellBtnReplaceAll : "Skipta öllu", +DlgSpellBtnUndo : "Til baka", +DlgSpellNoSuggestions : "- engar tillögur -", +DlgSpellProgress : "Villuleit í gangi...", +DlgSpellNoMispell : "Villuleit lokið: Engin villa fannst", +DlgSpellNoChanges : "Villuleit lokið: Engu orði breytt", +DlgSpellOneChange : "Villuleit lokið: Einu orði breytt", +DlgSpellManyChanges : "Villuleit lokið: %1 orðum breytt", + +IeSpellDownload : "Villuleit ekki sett upp.
    Viltu setja hana upp?", + +// Button Dialog +DlgButtonText : "Texti", +DlgButtonType : "Gerð", +DlgButtonTypeBtn : "Hnappur", +DlgButtonTypeSbm : "Staðfesta", +DlgButtonTypeRst : "Hreinsa", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Nafn", +DlgCheckboxValue : "Gildi", +DlgCheckboxSelected : "Valið", + +// Form Dialog +DlgFormName : "Nafn", +DlgFormAction : "Aðgerð", +DlgFormMethod : "Aðferð", + +// Select Field Dialog +DlgSelectName : "Nafn", +DlgSelectValue : "Gildi", +DlgSelectSize : "Stærð", +DlgSelectLines : "línur", +DlgSelectChkMulti : "Leyfa fleiri kosti", +DlgSelectOpAvail : "Kostir", +DlgSelectOpText : "Texti", +DlgSelectOpValue : "Gildi", +DlgSelectBtnAdd : "Bæta við", +DlgSelectBtnModify : "Breyta", +DlgSelectBtnUp : "Upp", +DlgSelectBtnDown : "Niður", +DlgSelectBtnSetValue : "Merkja sem valið", +DlgSelectBtnDelete : "Eyða", + +// Textarea Dialog +DlgTextareaName : "Nafn", +DlgTextareaCols : "Dálkar", +DlgTextareaRows : "Línur", + +// Text Field Dialog +DlgTextName : "Nafn", +DlgTextValue : "Gildi", +DlgTextCharWidth : "Breidd (leturtákn)", +DlgTextMaxChars : "Hámarksfjöldi leturtákna", +DlgTextType : "Gerð", +DlgTextTypeText : "Texti", +DlgTextTypePass : "Lykilorð", + +// Hidden Field Dialog +DlgHiddenName : "Nafn", +DlgHiddenValue : "Gildi", + +// Bulleted List Dialog +BulletedListProp : "Eigindi depillista", +NumberedListProp : "Eigindi tölusetts lista", +DlgLstStart : "Byrja", +DlgLstType : "Gerð", +DlgLstTypeCircle : "Hringur", +DlgLstTypeDisc : "Fylltur hringur", +DlgLstTypeSquare : "Ferningur", +DlgLstTypeNumbers : "Tölusett (1, 2, 3)", +DlgLstTypeLCase : "Lágstafir (a, b, c)", +DlgLstTypeUCase : "Hástafir (A, B, C)", +DlgLstTypeSRoman : "Rómverkar lágstafatölur (i, ii, iii)", +DlgLstTypeLRoman : "Rómverkar hástafatölur (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Almennt", +DlgDocBackTab : "Bakgrunnur", +DlgDocColorsTab : "Litir og rammar", +DlgDocMetaTab : "Lýsigögn", + +DlgDocPageTitle : "Titill síðu", +DlgDocLangDir : "Tungumál", +DlgDocLangDirLTR : "Vinstri til hægri (LTR)", +DlgDocLangDirRTL : "Hægri til vinstri (RTL)", +DlgDocLangCode : "Tungumálakóði", +DlgDocCharSet : "Letursett", +DlgDocCharSetCE : "Mið-evrópskt", +DlgDocCharSetCT : "Kínverskt, hefðbundið (Big5)", +DlgDocCharSetCR : "Kýrilskt", +DlgDocCharSetGR : "Grískt", +DlgDocCharSetJP : "Japanskt", +DlgDocCharSetKR : "Kóreskt", +DlgDocCharSetTR : "Tyrkneskt", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Vestur-evrópst", +DlgDocCharSetOther : "Annað letursett", + +DlgDocDocType : "Flokkur skjalategunda", +DlgDocDocTypeOther : "Annar flokkur skjalategunda", +DlgDocIncXHTML : "Fella inn XHTML lýsingu", +DlgDocBgColor : "Bakgrunnslitur", +DlgDocBgImage : "Slóð bakgrunnsmyndar", +DlgDocBgNoScroll : "Læstur bakgrunnur", +DlgDocCText : "Texti", +DlgDocCLink : "Stikla", +DlgDocCVisited : "Heimsótt stikla", +DlgDocCActive : "Virk stikla", +DlgDocMargins : "Hliðarspássía", +DlgDocMaTop : "Efst", +DlgDocMaLeft : "Vinstri", +DlgDocMaRight : "Hægri", +DlgDocMaBottom : "Neðst", +DlgDocMeIndex : "Lykilorð efnisorðaskrár (aðgreind með kommum)", +DlgDocMeDescr : "Lýsing skjals", +DlgDocMeAuthor : "Höfundur", +DlgDocMeCopy : "Höfundarréttur", +DlgDocPreview : "Sýna", + +// Templates Dialog +Templates : "Sniðmát", +DlgTemplatesTitle : "Innihaldssniðmát", +DlgTemplatesSelMsg : "Veldu sniðmát til að opna í ritlinum.
    (Núverandi innihald víkur fyrir því!):", +DlgTemplatesLoading : "Sæki lista yfir sniðmát...", +DlgTemplatesNoTpl : "(Ekkert sniðmát er skilgreint!)", +DlgTemplatesReplace : "Skipta út raunverulegu innihaldi", + +// About Dialog +DlgAboutAboutTab : "Um", +DlgAboutBrowserInfoTab : "Almennt", +DlgAboutLicenseTab : "Leyfi", +DlgAboutVersion : "útgáfa", +DlgAboutInfo : "Nánari upplýsinar, sjá:", + +// Div Dialog +DlgDivGeneralTab : "Almennt", +DlgDivAdvancedTab : "Sérhæft", +DlgDivStyle : "Stíll", +DlgDivInlineStyle : "Línulægur stíll" +}; diff --git a/webdir/fckeditor/editor/lang/it.js b/webdir/fckeditor/editor/lang/it.js new file mode 100644 index 0000000..353abfb --- /dev/null +++ b/webdir/fckeditor/editor/lang/it.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Italian language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Nascondi la barra degli strumenti", +ToolbarExpand : "Mostra la barra degli strumenti", + +// Toolbar Items and Context Menu +Save : "Salva", +NewPage : "Nuova pagina vuota", +Preview : "Anteprima", +Cut : "Taglia", +Copy : "Copia", +Paste : "Incolla", +PasteText : "Incolla come testo semplice", +PasteWord : "Incolla da Word", +Print : "Stampa", +SelectAll : "Seleziona tutto", +RemoveFormat : "Elimina formattazione", +InsertLinkLbl : "Collegamento", +InsertLink : "Inserisci/Modifica collegamento", +RemoveLink : "Elimina collegamento", +VisitLink : "Open Link", //MISSING +Anchor : "Inserisci/Modifica Ancora", +AnchorDelete : "Rimuovi Ancora", +InsertImageLbl : "Immagine", +InsertImage : "Inserisci/Modifica immagine", +InsertFlashLbl : "Oggetto Flash", +InsertFlash : "Inserisci/Modifica Oggetto Flash", +InsertTableLbl : "Tabella", +InsertTable : "Inserisci/Modifica tabella", +InsertLineLbl : "Riga orizzontale", +InsertLine : "Inserisci riga orizzontale", +InsertSpecialCharLbl: "Caratteri speciali", +InsertSpecialChar : "Inserisci carattere speciale", +InsertSmileyLbl : "Emoticon", +InsertSmiley : "Inserisci emoticon", +About : "Informazioni su FCKeditor", +Bold : "Grassetto", +Italic : "Corsivo", +Underline : "Sottolineato", +StrikeThrough : "Barrato", +Subscript : "Pedice", +Superscript : "Apice", +LeftJustify : "Allinea a sinistra", +CenterJustify : "Centra", +RightJustify : "Allinea a destra", +BlockJustify : "Giustifica", +DecreaseIndent : "Riduci rientro", +IncreaseIndent : "Aumenta rientro", +Blockquote : "Blockquote", //MISSING +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "Annulla", +Redo : "Ripristina", +NumberedListLbl : "Elenco numerato", +NumberedList : "Inserisci/Modifica elenco numerato", +BulletedListLbl : "Elenco puntato", +BulletedList : "Inserisci/Modifica elenco puntato", +ShowTableBorders : "Mostra bordi tabelle", +ShowDetails : "Mostra dettagli", +Style : "Stile", +FontFormat : "Formato", +Font : "Font", +FontSize : "Dimensione", +TextColor : "Colore testo", +BGColor : "Colore sfondo", +Source : "Codice Sorgente", +Find : "Trova", +Replace : "Sostituisci", +SpellCheck : "Correttore ortografico", +UniversalKeyboard : "Tastiera universale", +PageBreakLbl : "Interruzione di pagina", +PageBreak : "Inserisci interruzione di pagina", + +Form : "Modulo", +Checkbox : "Checkbox", +RadioButton : "Radio Button", +TextField : "Campo di testo", +Textarea : "Area di testo", +HiddenField : "Campo nascosto", +Button : "Bottone", +SelectionField : "Menu di selezione", +ImageButton : "Bottone immagine", + +FitWindow : "Massimizza l'area dell'editor", +ShowBlocks : "Visualizza Blocchi", + +// Context Menu +EditLink : "Modifica collegamento", +CellCM : "Cella", +RowCM : "Riga", +ColumnCM : "Colonna", +InsertRowAfter : "Inserisci Riga Dopo", +InsertRowBefore : "Inserisci Riga Prima", +DeleteRows : "Elimina righe", +InsertColumnAfter : "Inserisci Colonna Dopo", +InsertColumnBefore : "Inserisci Colonna Prima", +DeleteColumns : "Elimina colonne", +InsertCellAfter : "Inserisci Cella Dopo", +InsertCellBefore : "Inserisci Cella Prima", +DeleteCells : "Elimina celle", +MergeCells : "Unisce celle", +MergeRight : "Unisci a Destra", +MergeDown : "Unisci in Basso", +HorizontalSplitCell : "Dividi Cella Orizzontalmente", +VerticalSplitCell : "Dividi Cella Verticalmente", +TableDelete : "Cancella Tabella", +CellProperties : "Proprietà cella", +TableProperties : "Proprietà tabella", +ImageProperties : "Proprietà immagine", +FlashProperties : "Proprietà Oggetto Flash", + +AnchorProp : "Proprietà ancora", +ButtonProp : "Proprietà bottone", +CheckboxProp : "Proprietà checkbox", +HiddenFieldProp : "Proprietà campo nascosto", +RadioButtonProp : "Proprietà radio button", +ImageButtonProp : "Proprietà bottone immagine", +TextFieldProp : "Proprietà campo di testo", +SelectionFieldProp : "Proprietà menu di selezione", +TextareaProp : "Proprietà area di testo", +FormProp : "Proprietà modulo", + +FontFormats : "Normale;Formattato;Indirizzo;Titolo 1;Titolo 2;Titolo 3;Titolo 4;Titolo 5;Titolo 6;Paragrafo (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Elaborazione XHTML in corso. Attendere prego...", +Done : "Completato", +PasteWordConfirm : "Il testo da incollare sembra provenire da Word. Desideri pulirlo prima di incollare?", +NotCompatiblePaste : "Questa funzione è disponibile solo per Internet Explorer 5.5 o superiore. Desideri incollare il testo senza pulirlo?", +UnknownToolbarItem : "Elemento della barra strumenti sconosciuto \"%1\"", +UnknownCommand : "Comando sconosciuto \"%1\"", +NotImplemented : "Comando non implementato", +UnknownToolbarSet : "La barra di strumenti \"%1\" non esiste", +NoActiveX : "Le impostazioni di sicurezza del tuo browser potrebbero limitare alcune funzionalità dell'editor. Devi abilitare l'opzione \"Esegui controlli e plug-in ActiveX\". Potresti avere errori e notare funzionalità mancanti.", +BrowseServerBlocked : "Non è possibile aprire la finestra di espolorazione risorse. Verifica che tutti i blocca popup siano bloccati.", +DialogBlocked : "Non è possibile aprire la finestra di dialogo. Verifica che tutti i blocca popup siano bloccati.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Annulla", +DlgBtnClose : "Chiudi", +DlgBtnBrowseServer : "Cerca sul server", +DlgAdvancedTag : "Avanzate", +DlgOpOther : "", +DlgInfoTab : "Info", +DlgAlertUrl : "Devi inserire l'URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Direzione scrittura", +DlgGenLangDirLtr : "Da Sinistra a Destra (LTR)", +DlgGenLangDirRtl : "Da Destra a Sinistra (RTL)", +DlgGenLangCode : "Codice Lingua", +DlgGenAccessKey : "Scorciatoia
    da tastiera", +DlgGenName : "Nome", +DlgGenTabIndex : "Ordine di tabulazione", +DlgGenLongDescr : "URL descrizione estesa", +DlgGenClass : "Nome classe CSS", +DlgGenTitle : "Titolo", +DlgGenContType : "Tipo della risorsa collegata", +DlgGenLinkCharset : "Set di caretteri della risorsa collegata", +DlgGenStyle : "Stile", + +// Image Dialog +DlgImgTitle : "Proprietà immagine", +DlgImgInfoTab : "Informazioni immagine", +DlgImgBtnUpload : "Invia al server", +DlgImgURL : "URL", +DlgImgUpload : "Carica", +DlgImgAlt : "Testo alternativo", +DlgImgWidth : "Larghezza", +DlgImgHeight : "Altezza", +DlgImgLockRatio : "Blocca rapporto", +DlgBtnResetSize : "Reimposta dimensione", +DlgImgBorder : "Bordo", +DlgImgHSpace : "HSpace", +DlgImgVSpace : "VSpace", +DlgImgAlign : "Allineamento", +DlgImgAlignLeft : "Sinistra", +DlgImgAlignAbsBottom: "In basso assoluto", +DlgImgAlignAbsMiddle: "Centrato assoluto", +DlgImgAlignBaseline : "Linea base", +DlgImgAlignBottom : "In Basso", +DlgImgAlignMiddle : "Centrato", +DlgImgAlignRight : "Destra", +DlgImgAlignTextTop : "In alto al testo", +DlgImgAlignTop : "In Alto", +DlgImgPreview : "Anteprima", +DlgImgAlertUrl : "Devi inserire l'URL per l'immagine", +DlgImgLinkTab : "Collegamento", + +// Flash Dialog +DlgFlashTitle : "Proprietà Oggetto Flash", +DlgFlashChkPlay : "Avvio Automatico", +DlgFlashChkLoop : "Cicla", +DlgFlashChkMenu : "Abilita Menu di Flash", +DlgFlashScale : "Ridimensiona", +DlgFlashScaleAll : "Mostra Tutto", +DlgFlashScaleNoBorder : "Senza Bordo", +DlgFlashScaleFit : "Dimensione Esatta", + +// Link Dialog +DlgLnkWindowTitle : "Collegamento", +DlgLnkInfoTab : "Informazioni collegamento", +DlgLnkTargetTab : "Destinazione", + +DlgLnkType : "Tipo di Collegamento", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "Ancora nella pagina", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "Protocollo", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Scegli Ancora", +DlgLnkAnchorByName : "Per Nome", +DlgLnkAnchorById : "Per id elemento", +DlgLnkNoAnchors : "(Nessuna ancora disponibile nel documento)", +DlgLnkEMail : "Indirizzo E-Mail", +DlgLnkEMailSubject : "Oggetto del messaggio", +DlgLnkEMailBody : "Corpo del messaggio", +DlgLnkUpload : "Carica", +DlgLnkBtnUpload : "Invia al Server", + +DlgLnkTarget : "Destinazione", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Nuova finestra (_blank)", +DlgLnkTargetParent : "Finestra padre (_parent)", +DlgLnkTargetSelf : "Stessa finestra (_self)", +DlgLnkTargetTop : "Finestra superiore (_top)", +DlgLnkTargetFrameName : "Nome del riquadro di destinazione", +DlgLnkPopWinName : "Nome finestra popup", +DlgLnkPopWinFeat : "Caratteristiche finestra popup", +DlgLnkPopResize : "Ridimensionabile", +DlgLnkPopLocation : "Barra degli indirizzi", +DlgLnkPopMenu : "Barra del menu", +DlgLnkPopScroll : "Barre di scorrimento", +DlgLnkPopStatus : "Barra di stato", +DlgLnkPopToolbar : "Barra degli strumenti", +DlgLnkPopFullScrn : "A tutto schermo (IE)", +DlgLnkPopDependent : "Dipendente (Netscape)", +DlgLnkPopWidth : "Larghezza", +DlgLnkPopHeight : "Altezza", +DlgLnkPopLeft : "Posizione da sinistra", +DlgLnkPopTop : "Posizione dall'alto", + +DlnLnkMsgNoUrl : "Devi inserire l'URL del collegamento", +DlnLnkMsgNoEMail : "Devi inserire un'indirizzo e-mail", +DlnLnkMsgNoAnchor : "Devi selezionare un'ancora", +DlnLnkMsgInvPopName : "Il nome del popup deve iniziare con una lettera, e non può contenere spazi", + +// Color Dialog +DlgColorTitle : "Seleziona colore", +DlgColorBtnClear : "Vuota", +DlgColorHighlight : "Evidenziato", +DlgColorSelected : "Selezionato", + +// Smiley Dialog +DlgSmileyTitle : "Inserisci emoticon", + +// Special Character Dialog +DlgSpecialCharTitle : "Seleziona carattere speciale", + +// Table Dialog +DlgTableTitle : "Proprietà tabella", +DlgTableRows : "Righe", +DlgTableColumns : "Colonne", +DlgTableBorder : "Dimensione bordo", +DlgTableAlign : "Allineamento", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "Sinistra", +DlgTableAlignCenter : "Centrato", +DlgTableAlignRight : "Destra", +DlgTableWidth : "Larghezza", +DlgTableWidthPx : "pixel", +DlgTableWidthPc : "percento", +DlgTableHeight : "Altezza", +DlgTableCellSpace : "Spaziatura celle", +DlgTableCellPad : "Padding celle", +DlgTableCaption : "Intestazione", +DlgTableSummary : "Indice", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Proprietà cella", +DlgCellWidth : "Larghezza", +DlgCellWidthPx : "pixel", +DlgCellWidthPc : "percento", +DlgCellHeight : "Altezza", +DlgCellWordWrap : "A capo automatico", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Si", +DlgCellWordWrapNo : "No", +DlgCellHorAlign : "Allineamento orizzontale", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "Sinistra", +DlgCellHorAlignCenter : "Centrato", +DlgCellHorAlignRight: "Destra", +DlgCellVerAlign : "Allineamento verticale", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "In Alto", +DlgCellVerAlignMiddle : "Centrato", +DlgCellVerAlignBottom : "In Basso", +DlgCellVerAlignBaseline : "Linea base", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "Righe occupate", +DlgCellCollSpan : "Colonne occupate", +DlgCellBackColor : "Colore sfondo", +DlgCellBorderColor : "Colore bordo", +DlgCellBtnSelect : "Scegli...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Cerca e Sostituisci", + +// Find Dialog +DlgFindTitle : "Trova", +DlgFindFindBtn : "Trova", +DlgFindNotFoundMsg : "L'elemento cercato non è stato trovato.", + +// Replace Dialog +DlgReplaceTitle : "Sostituisci", +DlgReplaceFindLbl : "Trova:", +DlgReplaceReplaceLbl : "Sostituisci con:", +DlgReplaceCaseChk : "Maiuscole/minuscole", +DlgReplaceReplaceBtn : "Sostituisci", +DlgReplaceReplAllBtn : "Sostituisci tutto", +DlgReplaceWordChk : "Solo parole intere", + +// Paste Operations / Dialog +PasteErrorCut : "Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl+X).", +PasteErrorCopy : "Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl+C).", + +PasteAsText : "Incolla come testo semplice", +PasteFromWord : "Incolla da Word", + +DlgPasteMsg2 : "Incolla il testo all'interno dell'area sottostante usando la scorciatoia di tastiere (Ctrl+V) e premi OK.", +DlgPasteSec : "A causa delle impostazioni di sicurezza del browser,l'editor non è in grado di accedere direttamente agli appunti. E' pertanto necessario incollarli di nuovo in questa finestra.", +DlgPasteIgnoreFont : "Ignora le definizioni di Font", +DlgPasteRemoveStyles : "Rimuovi le definizioni di Stile", + +// Color Picker +ColorAutomatic : "Automatico", +ColorMoreColors : "Altri colori...", + +// Document Properties +DocProps : "Proprietà del Documento", + +// Anchor Dialog +DlgAnchorTitle : "Proprietà ancora", +DlgAnchorName : "Nome ancora", +DlgAnchorErrorName : "Inserici il nome dell'ancora", + +// Speller Pages Dialog +DlgSpellNotInDic : "Non nel dizionario", +DlgSpellChangeTo : "Cambia in", +DlgSpellBtnIgnore : "Ignora", +DlgSpellBtnIgnoreAll : "Ignora tutto", +DlgSpellBtnReplace : "Cambia", +DlgSpellBtnReplaceAll : "Cambia tutto", +DlgSpellBtnUndo : "Annulla", +DlgSpellNoSuggestions : "- Nessun suggerimento -", +DlgSpellProgress : "Controllo ortografico in corso", +DlgSpellNoMispell : "Controllo ortografico completato: nessun errore trovato", +DlgSpellNoChanges : "Controllo ortografico completato: nessuna parola cambiata", +DlgSpellOneChange : "Controllo ortografico completato: 1 parola cambiata", +DlgSpellManyChanges : "Controllo ortografico completato: %1 parole cambiate", + +IeSpellDownload : "Contollo ortografico non installato. Lo vuoi scaricare ora?", + +// Button Dialog +DlgButtonText : "Testo (Value)", +DlgButtonType : "Tipo", +DlgButtonTypeBtn : "Bottone", +DlgButtonTypeSbm : "Invio", +DlgButtonTypeRst : "Annulla", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Nome", +DlgCheckboxValue : "Valore", +DlgCheckboxSelected : "Selezionato", + +// Form Dialog +DlgFormName : "Nome", +DlgFormAction : "Azione", +DlgFormMethod : "Metodo", + +// Select Field Dialog +DlgSelectName : "Nome", +DlgSelectValue : "Valore", +DlgSelectSize : "Dimensione", +DlgSelectLines : "righe", +DlgSelectChkMulti : "Permetti selezione multipla", +DlgSelectOpAvail : "Opzioni disponibili", +DlgSelectOpText : "Testo", +DlgSelectOpValue : "Valore", +DlgSelectBtnAdd : "Aggiungi", +DlgSelectBtnModify : "Modifica", +DlgSelectBtnUp : "Su", +DlgSelectBtnDown : "Gi", +DlgSelectBtnSetValue : "Imposta come predefinito", +DlgSelectBtnDelete : "Rimuovi", + +// Textarea Dialog +DlgTextareaName : "Nome", +DlgTextareaCols : "Colonne", +DlgTextareaRows : "Righe", + +// Text Field Dialog +DlgTextName : "Nome", +DlgTextValue : "Valore", +DlgTextCharWidth : "Larghezza", +DlgTextMaxChars : "Numero massimo di caratteri", +DlgTextType : "Tipo", +DlgTextTypeText : "Testo", +DlgTextTypePass : "Password", + +// Hidden Field Dialog +DlgHiddenName : "Nome", +DlgHiddenValue : "Valore", + +// Bulleted List Dialog +BulletedListProp : "Proprietà lista puntata", +NumberedListProp : "Proprietà lista numerata", +DlgLstStart : "Inizio", +DlgLstType : "Tipo", +DlgLstTypeCircle : "Tondo", +DlgLstTypeDisc : "Disco", +DlgLstTypeSquare : "Quadrato", +DlgLstTypeNumbers : "Numeri (1, 2, 3)", +DlgLstTypeLCase : "Caratteri minuscoli (a, b, c)", +DlgLstTypeUCase : "Caratteri maiuscoli (A, B, C)", +DlgLstTypeSRoman : "Numeri Romani minuscoli (i, ii, iii)", +DlgLstTypeLRoman : "Numeri Romani maiuscoli (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Genarale", +DlgDocBackTab : "Sfondo", +DlgDocColorsTab : "Colori e margini", +DlgDocMetaTab : "Meta Data", + +DlgDocPageTitle : "Titolo pagina", +DlgDocLangDir : "Direzione scrittura", +DlgDocLangDirLTR : "Da Sinistra a Destra (LTR)", +DlgDocLangDirRTL : "Da Destra a Sinistra (RTL)", +DlgDocLangCode : "Codice Lingua", +DlgDocCharSet : "Set di caretteri", +DlgDocCharSetCE : "Europa Centrale", +DlgDocCharSetCT : "Cinese Tradizionale (Big5)", +DlgDocCharSetCR : "Cirillico", +DlgDocCharSetGR : "Greco", +DlgDocCharSetJP : "Giapponese", +DlgDocCharSetKR : "Coreano", +DlgDocCharSetTR : "Turco", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Europa Occidentale", +DlgDocCharSetOther : "Altro set di caretteri", + +DlgDocDocType : "Intestazione DocType", +DlgDocDocTypeOther : "Altra intestazione DocType", +DlgDocIncXHTML : "Includi dichiarazione XHTML", +DlgDocBgColor : "Colore di sfondo", +DlgDocBgImage : "Immagine di sfondo", +DlgDocBgNoScroll : "Sfondo fissato", +DlgDocCText : "Testo", +DlgDocCLink : "Collegamento", +DlgDocCVisited : "Collegamento visitato", +DlgDocCActive : "Collegamento attivo", +DlgDocMargins : "Margini", +DlgDocMaTop : "In Alto", +DlgDocMaLeft : "A Sinistra", +DlgDocMaRight : "A Destra", +DlgDocMaBottom : "In Basso", +DlgDocMeIndex : "Chiavi di indicizzazione documento (separate da virgola)", +DlgDocMeDescr : "Descrizione documento", +DlgDocMeAuthor : "Autore", +DlgDocMeCopy : "Copyright", +DlgDocPreview : "Anteprima", + +// Templates Dialog +Templates : "Modelli", +DlgTemplatesTitle : "Contenuto dei modelli", +DlgTemplatesSelMsg : "Seleziona il modello da aprire nell'editor
    (il contenuto attuale verrà eliminato):", +DlgTemplatesLoading : "Caricamento modelli in corso. Attendere prego...", +DlgTemplatesNoTpl : "(Nessun modello definito)", +DlgTemplatesReplace : "Cancella il contenuto corrente", + +// About Dialog +DlgAboutAboutTab : "Informazioni", +DlgAboutBrowserInfoTab : "Informazioni Browser", +DlgAboutLicenseTab : "Licenza", +DlgAboutVersion : "versione", +DlgAboutInfo : "Per maggiori informazioni visitare", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/ja.js b/webdir/fckeditor/editor/lang/ja.js new file mode 100644 index 0000000..b4a6635 --- /dev/null +++ b/webdir/fckeditor/editor/lang/ja.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Japanese language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "ツールãƒãƒ¼ã‚’éš ã™", +ToolbarExpand : "ツールãƒãƒ¼ã‚’表示", + +// Toolbar Items and Context Menu +Save : "ä¿å­˜", +NewPage : "æ–°ã—ã„ページ", +Preview : "プレビュー", +Cut : "切りå–ã‚Š", +Copy : "コピー", +Paste : "貼り付ã‘", +PasteText : "プレーンテキスト貼り付ã‘", +PasteWord : "ワード文章ã‹ã‚‰è²¼ã‚Šä»˜ã‘", +Print : "å°åˆ·", +SelectAll : "ã™ã¹ã¦é¸æŠž", +RemoveFormat : "フォーマット削除", +InsertLinkLbl : "リンク", +InsertLink : "リンク挿入/編集", +RemoveLink : "リンク削除", +VisitLink : "リンクを開ã", +Anchor : "アンカー挿入/編集", +AnchorDelete : "アンカー削除", +InsertImageLbl : "イメージ", +InsertImage : "イメージ挿入/編集", +InsertFlashLbl : "Flash", +InsertFlash : "Flash挿入/編集", +InsertTableLbl : "テーブル", +InsertTable : "テーブル挿入/編集", +InsertLineLbl : "ライン", +InsertLine : "横罫線", +InsertSpecialCharLbl: "特殊文字", +InsertSpecialChar : "特殊文字挿入", +InsertSmileyLbl : "絵文字", +InsertSmiley : "絵文字挿入", +About : "FCKeditorヘルプ", +Bold : "太字", +Italic : "斜体", +Underline : "下線", +StrikeThrough : "打ã¡æ¶ˆã—ç·š", +Subscript : "æ·»ãˆå­—", +Superscript : "上付ã文字", +LeftJustify : "å·¦æƒãˆ", +CenterJustify : "中央æƒãˆ", +RightJustify : "å³æƒãˆ", +BlockJustify : "両端æƒãˆ", +DecreaseIndent : "インデント解除", +IncreaseIndent : "インデント", +Blockquote : "ブロック引用", +CreateDiv : "Div 作æˆ", +EditDiv : "Div 編集", +DeleteDiv : "Div 削除", +Undo : "å…ƒã«æˆ»ã™", +Redo : "ã‚„ã‚Šç›´ã—", +NumberedListLbl : "段è½ç•ªå·", +NumberedList : "段è½ç•ªå·ã®è¿½åŠ /削除", +BulletedListLbl : "箇æ¡æ›¸ã", +BulletedList : "箇æ¡æ›¸ãã®è¿½åŠ /削除", +ShowTableBorders : "テーブルボーダー表示", +ShowDetails : "詳細表示", +Style : "スタイル", +FontFormat : "フォーマット", +Font : "フォント", +FontSize : "サイズ", +TextColor : "テキスト色", +BGColor : "背景色", +Source : "ソース", +Find : "検索", +Replace : "ç½®ãæ›ãˆ", +SpellCheck : "スペルãƒã‚§ãƒƒã‚¯", +UniversalKeyboard : "ユニãƒãƒ¼ã‚µãƒ«ãƒ»ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰", +PageBreakLbl : "改ページ", +PageBreak : "改ページ挿入", + +Form : "フォーム", +Checkbox : "ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹", +RadioButton : "ラジオボタン", +TextField : "1行テキスト", +Textarea : "テキストエリア", +HiddenField : "ä¸å¯è¦–フィールド", +Button : "ボタン", +SelectionField : "é¸æŠžãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰", +ImageButton : "ç”»åƒãƒœã‚¿ãƒ³", + +FitWindow : "エディタサイズを最大ã«ã—ã¾ã™", +ShowBlocks : "ブロック表示", + +// Context Menu +EditLink : "リンク編集", +CellCM : "セル", +RowCM : "è¡Œ", +ColumnCM : "カラム", +InsertRowAfter : "列ã®å¾Œã«æŒ¿å…¥", +InsertRowBefore : "列ã®å‰ã«æŒ¿å…¥", +DeleteRows : "行削除", +InsertColumnAfter : "カラムã®å¾Œã«æŒ¿å…¥", +InsertColumnBefore : "カラムã®å‰ã«æŒ¿å…¥", +DeleteColumns : "列削除", +InsertCellAfter : "セルã®å¾Œã«æŒ¿å…¥", +InsertCellBefore : "セルã®å‰ã«æŒ¿å…¥", +DeleteCells : "セル削除", +MergeCells : "セルçµåˆ", +MergeRight : "å³ã«çµåˆ", +MergeDown : "下ã«çµåˆ", +HorizontalSplitCell : "セルを水平方å‘分割", +VerticalSplitCell : "セルを垂直方å‘ã«åˆ†å‰²", +TableDelete : "テーブル削除", +CellProperties : "セル プロパティ", +TableProperties : "テーブル プロパティ", +ImageProperties : "イメージ プロパティ", +FlashProperties : "Flash プロパティ", + +AnchorProp : "アンカー プロパティ", +ButtonProp : "ボタン プロパティ", +CheckboxProp : "ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ プロパティ", +HiddenFieldProp : "ä¸å¯è¦–フィールド プロパティ", +RadioButtonProp : "ラジオボタン プロパティ", +ImageButtonProp : "ç”»åƒãƒœã‚¿ãƒ³ プロパティ", +TextFieldProp : "1行テキスト プロパティ", +SelectionFieldProp : "é¸æŠžãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ プロパティ", +TextareaProp : "テキストエリア プロパティ", +FormProp : "フォーム プロパティ", + +FontFormats : "標準;書å¼ä»˜ã;アドレス;見出㗠1;見出㗠2;見出㗠3;見出㗠4;見出㗠5;見出㗠6;標準 (DIV)", + +// Alerts and Messages +ProcessingXHTML : "XHTML処ç†ä¸­. ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„...", +Done : "完了", +PasteWordConfirm : "貼り付ã‘ã‚’è¡Œã†ãƒ†ã‚­ã‚¹ãƒˆã¯ã€ãƒ¯ãƒ¼ãƒ‰æ–‡ç« ã‹ã‚‰ã‚³ãƒ”ーã•ã‚Œã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚貼り付ã‘ã‚‹å‰ã«ã‚¯ãƒªãƒ¼ãƒ‹ãƒ³ã‚°ã‚’è¡Œã„ã¾ã™ã‹ï¼Ÿ", +NotCompatiblePaste : "ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆãƒ»ã‚¨ã‚¯ã‚¹ãƒ—ローラーãƒãƒ¼ã‚¸ãƒ§ãƒ³5.5以上ã§åˆ©ç”¨å¯èƒ½ã§ã™ã€‚クリーニングã—ãªã„ã§è²¼ã‚Šä»˜ã‘ã‚’è¡Œã„ã¾ã™ã‹ï¼Ÿ", +UnknownToolbarItem : "未知ã®ãƒ„ールãƒãƒ¼é …ç›® \"%1\"", +UnknownCommand : "未知ã®ã‚³ãƒžãƒ³ãƒ‰å \"%1\"", +NotImplemented : "コマンドã¯ã‚¤ãƒ³ãƒ—リメントã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚", +UnknownToolbarSet : "ツールãƒãƒ¼è¨­å®š \"%1\" 存在ã—ã¾ã›ã‚“。", +NoActiveX : "エラーã€è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãªã©ãŒç™ºç”Ÿã—ãŸå ´åˆã€ãƒ–ラウザーã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£è¨­å®šã«ã‚ˆã‚Šã‚¨ãƒ‡ã‚£ã‚¿ã®ã„ãã¤ã‹ã®æ©Ÿèƒ½ãŒåˆ¶é™ã•ã‚Œã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚セキュリティ設定ã®ã‚ªãƒ—ションã§\"ActiveXコントロールã¨ãƒ—ラグインã®å®Ÿè¡Œ\"を有効ã«ã™ã‚‹ã«ã—ã¦ãã ã•ã„。", +BrowseServerBlocked : "サーãƒãƒ¼ãƒ–ラウザーを開ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãƒãƒƒãƒ—アップ・ブロック機能ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。", +DialogBlocked : "ダイアログウィンドウを開ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãƒãƒƒãƒ—アップ・ブロック機能ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。", +VisitLinkBlocked : "æ–°ã—ã„ウィンドウを開ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãƒãƒƒãƒ—アップ・ブロック機能ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。", + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "キャンセル", +DlgBtnClose : "é–‰ã˜ã‚‹", +DlgBtnBrowseServer : "サーãƒãƒ¼ãƒ–ラウザー", +DlgAdvancedTag : "高度ãªè¨­å®š", +DlgOpOther : "<ãã®ä»–>", +DlgInfoTab : "情報", +DlgAlertUrl : "URLを挿入ã—ã¦ãã ã•ã„", + +// General Dialogs Labels +DlgGenNotSet : "<ãªã—>", +DlgGenId : "Id", +DlgGenLangDir : "文字表記ã®æ–¹å‘", +DlgGenLangDirLtr : "å·¦ã‹ã‚‰å³ (LTR)", +DlgGenLangDirRtl : "å³ã‹ã‚‰å·¦ (RTL)", +DlgGenLangCode : "言語コード", +DlgGenAccessKey : "アクセスキー", +DlgGenName : "Name属性", +DlgGenTabIndex : "タブインデックス", +DlgGenLongDescr : "longdesc属性(長文説明)", +DlgGenClass : "スタイルシートクラス", +DlgGenTitle : "Title属性", +DlgGenContType : "Content Type属性", +DlgGenLinkCharset : "リンクcharset属性", +DlgGenStyle : "スタイルシート", + +// Image Dialog +DlgImgTitle : "イメージ プロパティ", +DlgImgInfoTab : "イメージ 情報", +DlgImgBtnUpload : "サーãƒãƒ¼ã«é€ä¿¡", +DlgImgURL : "URL", +DlgImgUpload : "アップロード", +DlgImgAlt : "代替テキスト", +DlgImgWidth : "å¹…", +DlgImgHeight : "高ã•", +DlgImgLockRatio : "ロック比率", +DlgBtnResetSize : "サイズリセット", +DlgImgBorder : "ボーダー", +DlgImgHSpace : "横間隔", +DlgImgVSpace : "縦間隔", +DlgImgAlign : "è¡Œæƒãˆ", +DlgImgAlignLeft : "å·¦", +DlgImgAlignAbsBottom: "下部(絶対的)", +DlgImgAlignAbsMiddle: "中央(絶対的)", +DlgImgAlignBaseline : "ベースライン", +DlgImgAlignBottom : "下", +DlgImgAlignMiddle : "中央", +DlgImgAlignRight : "å³", +DlgImgAlignTextTop : "テキスト上部", +DlgImgAlignTop : "上", +DlgImgPreview : "プレビュー", +DlgImgAlertUrl : "イメージã®URLを入力ã—ã¦ãã ã•ã„。", +DlgImgLinkTab : "リンク", + +// Flash Dialog +DlgFlashTitle : "Flash プロパティ", +DlgFlashChkPlay : "å†ç”Ÿ", +DlgFlashChkLoop : "ループå†ç”Ÿ", +DlgFlashChkMenu : "Flashメニューå¯èƒ½", +DlgFlashScale : "拡大縮å°è¨­å®š", +DlgFlashScaleAll : "ã™ã¹ã¦è¡¨ç¤º", +DlgFlashScaleNoBorder : "外ãŒè¦‹ãˆãªã„様ã«æ‹¡å¤§", +DlgFlashScaleFit : "上下左å³ã«ãƒ•ã‚£ãƒƒãƒˆ", + +// Link Dialog +DlgLnkWindowTitle : "ãƒã‚¤ãƒ‘ーリンク", +DlgLnkInfoTab : "ãƒã‚¤ãƒ‘ーリンク 情報", +DlgLnkTargetTab : "ターゲット", + +DlgLnkType : "リンクタイプ", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "ã“ã®ãƒšãƒ¼ã‚¸ã®ã‚¢ãƒ³ã‚«ãƒ¼", +DlgLnkTypeEMail : "E-Mail", +DlgLnkProto : "プロトコル", +DlgLnkProtoOther : "<ãã®ä»–>", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "アンカーをé¸æŠž", +DlgLnkAnchorByName : "アンカーå", +DlgLnkAnchorById : "エレメントID", +DlgLnkNoAnchors : "(ドキュメントã«ãŠã„ã¦åˆ©ç”¨å¯èƒ½ãªã‚¢ãƒ³ã‚«ãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“。)", +DlgLnkEMail : "E-Mail アドレス", +DlgLnkEMailSubject : "件å", +DlgLnkEMailBody : "本文", +DlgLnkUpload : "アップロード", +DlgLnkBtnUpload : "サーãƒãƒ¼ã«é€ä¿¡", + +DlgLnkTarget : "ターゲット", +DlgLnkTargetFrame : "<フレーム>", +DlgLnkTargetPopup : "<ãƒãƒƒãƒ—アップウィンドウ>", +DlgLnkTargetBlank : "æ–°ã—ã„ウィンドウ (_blank)", +DlgLnkTargetParent : "親ウィンドウ (_parent)", +DlgLnkTargetSelf : "åŒã˜ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ (_self)", +DlgLnkTargetTop : "最上ä½ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ (_top)", +DlgLnkTargetFrameName : "目的ã®ãƒ•ãƒ¬ãƒ¼ãƒ å", +DlgLnkPopWinName : "ãƒãƒƒãƒ—アップウィンドウå", +DlgLnkPopWinFeat : "ãƒãƒƒãƒ—アップウィンドウ特徴", +DlgLnkPopResize : "リサイズå¯èƒ½", +DlgLnkPopLocation : "ロケーションãƒãƒ¼", +DlgLnkPopMenu : "メニューãƒãƒ¼", +DlgLnkPopScroll : "スクロールãƒãƒ¼", +DlgLnkPopStatus : "ステータスãƒãƒ¼", +DlgLnkPopToolbar : "ツールãƒãƒ¼", +DlgLnkPopFullScrn : "全画é¢ãƒ¢ãƒ¼ãƒ‰(IE)", +DlgLnkPopDependent : "é–‹ã„ãŸã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã«é€£å‹•ã—ã¦é–‰ã˜ã‚‹ (Netscape)", +DlgLnkPopWidth : "å¹…", +DlgLnkPopHeight : "高ã•", +DlgLnkPopLeft : "左端ã‹ã‚‰ã®åº§æ¨™ã§æŒ‡å®š", +DlgLnkPopTop : "上端ã‹ã‚‰ã®åº§æ¨™ã§æŒ‡å®š", + +DlnLnkMsgNoUrl : "リンクURLを入力ã—ã¦ãã ã•ã„。", +DlnLnkMsgNoEMail : "メールアドレスを入力ã—ã¦ãã ã•ã„。", +DlnLnkMsgNoAnchor : "アンカーをé¸æŠžã—ã¦ãã ã•ã„。", +DlnLnkMsgInvPopName : "ãƒãƒƒãƒ—・アップåã¯è‹±å­—ã§å§‹ã¾ã‚‹æ–‡å­—ã§æŒ‡å®šã—ã¦ãã ã„。ãƒãƒƒãƒ—・アップåã«ã‚¹ãƒšãƒ¼ã‚¹ã¯å«ã‚ã¾ã›ã‚“", + +// Color Dialog +DlgColorTitle : "色é¸æŠž", +DlgColorBtnClear : "クリア", +DlgColorHighlight : "ãƒã‚¤ãƒ©ã‚¤ãƒˆ", +DlgColorSelected : "é¸æŠžè‰²", + +// Smiley Dialog +DlgSmileyTitle : "顔文字挿入", + +// Special Character Dialog +DlgSpecialCharTitle : "特殊文字é¸æŠž", + +// Table Dialog +DlgTableTitle : "テーブル プロパティ", +DlgTableRows : "è¡Œ", +DlgTableColumns : "列", +DlgTableBorder : "ボーダーサイズ", +DlgTableAlign : "キャプションã®æ•´åˆ—", +DlgTableAlignNotSet : "<ãªã—>", +DlgTableAlignLeft : "å·¦", +DlgTableAlignCenter : "中央", +DlgTableAlignRight : "å³", +DlgTableWidth : "テーブル幅", +DlgTableWidthPx : "ピクセル", +DlgTableWidthPc : "パーセント", +DlgTableHeight : "テーブル高ã•", +DlgTableCellSpace : "セル内余白", +DlgTableCellPad : "セル内間隔", +DlgTableCaption : "キャプショï¾", +DlgTableSummary : "テーブル目的/構造", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "セル プロパティ", +DlgCellWidth : "å¹…", +DlgCellWidthPx : "ピクセル", +DlgCellWidthPc : "パーセント", +DlgCellHeight : "高ã•", +DlgCellWordWrap : "折り返ã—", +DlgCellWordWrapNotSet : "<ãªã—>", +DlgCellWordWrapYes : "Yes", +DlgCellWordWrapNo : "No", +DlgCellHorAlign : "セル横ã®æ•´åˆ—", +DlgCellHorAlignNotSet : "<ãªã—>", +DlgCellHorAlignLeft : "å·¦", +DlgCellHorAlignCenter : "中央", +DlgCellHorAlignRight: "å³", +DlgCellVerAlign : "セル縦ã®æ•´åˆ—", +DlgCellVerAlignNotSet : "<ãªã—>", +DlgCellVerAlignTop : "上", +DlgCellVerAlignMiddle : "中央", +DlgCellVerAlignBottom : "下", +DlgCellVerAlignBaseline : "ベースライン", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "縦幅(行数)", +DlgCellCollSpan : "横幅(列数)", +DlgCellBackColor : "背景色", +DlgCellBorderColor : "ボーダーカラー", +DlgCellBtnSelect : "é¸æŠž...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "検索ã—ã¦ç½®æ›", + +// Find Dialog +DlgFindTitle : "検索", +DlgFindFindBtn : "検索", +DlgFindNotFoundMsg : "指定ã•ã‚ŒãŸæ–‡å­—列ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚", + +// Replace Dialog +DlgReplaceTitle : "ç½®ãæ›ãˆ", +DlgReplaceFindLbl : "検索ã™ã‚‹æ–‡å­—列:", +DlgReplaceReplaceLbl : "ç½®æ›ãˆã™ã‚‹æ–‡å­—列:", +DlgReplaceCaseChk : "部分一致", +DlgReplaceReplaceBtn : "ç½®æ›ãˆ", +DlgReplaceReplAllBtn : "ã™ã¹ã¦ç½®æ›ãˆ", +DlgReplaceWordChk : "å˜èªžå˜ä½ã§ä¸€è‡´", + +// Paste Operations / Dialog +PasteErrorCut : "ブラウザーã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£è¨­å®šã«ã‚ˆã‚Šã‚¨ãƒ‡ã‚£ã‚¿ã®åˆ‡ã‚Šå–ã‚Šæ“作ãŒè‡ªå‹•ã§å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。実行ã™ã‚‹ã«ã¯æ‰‹å‹•ã§ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®(Ctrl+X)を使用ã—ã¦ãã ã•ã„。", +PasteErrorCopy : "ブラウザーã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£è¨­å®šã«ã‚ˆã‚Šã‚¨ãƒ‡ã‚£ã‚¿ã®ã‚³ãƒ”ーæ“作ãŒè‡ªå‹•ã§å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。実行ã™ã‚‹ã«ã¯æ‰‹å‹•ã§ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®(Ctrl+C)を使用ã—ã¦ãã ã•ã„。", + +PasteAsText : "プレーンテキスト貼り付ã‘", +PasteFromWord : "ワード文章ã‹ã‚‰è²¼ã‚Šä»˜ã‘", + +DlgPasteMsg2 : "キーボード(Ctrl+V)を使用ã—ã¦ã€æ¬¡ã®å…¥åŠ›ã‚¨ãƒªã‚¢å†…ã§è²¼ã£ã¦ã€OKを押ã—ã¦ãã ã•ã„。", +DlgPasteSec : "ブラウザã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£è¨­å®šã«ã‚ˆã‚Šã€ã‚¨ãƒ‡ã‚£ã‚¿ã¯ã‚¯ãƒªãƒƒãƒ—ボード・データã«ç›´æŽ¥ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã¯è²¼ã‚Šä»˜ã‘æ“作を行ã†åº¦ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚", +DlgPasteIgnoreFont : "Fontã‚¿ã‚°ã®Face属性を無視ã—ã¾ã™ã€‚", +DlgPasteRemoveStyles : "スタイル定義を削除ã—ã¾ã™ã€‚", + +// Color Picker +ColorAutomatic : "自動", +ColorMoreColors : "ãã®ä»–ã®è‰²...", + +// Document Properties +DocProps : "文書 プロパティ", + +// Anchor Dialog +DlgAnchorTitle : "アンカー プロパティ", +DlgAnchorName : "アンカーå", +DlgAnchorErrorName : "アンカーåã‚’å¿…ãšå…¥åŠ›ã—ã¦ãã ã•ã„。", + +// Speller Pages Dialog +DlgSpellNotInDic : "辞書ã«ã‚ã‚Šã¾ã›ã‚“", +DlgSpellChangeTo : "変更", +DlgSpellBtnIgnore : "無視", +DlgSpellBtnIgnoreAll : "ã™ã¹ã¦ç„¡è¦–", +DlgSpellBtnReplace : "ç½®æ›", +DlgSpellBtnReplaceAll : "ã™ã¹ã¦ç½®æ›", +DlgSpellBtnUndo : "ã‚„ã‚Šç›´ã—", +DlgSpellNoSuggestions : "- 該当ãªã— -", +DlgSpellProgress : "スペルãƒã‚§ãƒƒã‚¯å‡¦ç†ä¸­...", +DlgSpellNoMispell : "スペルãƒã‚§ãƒƒã‚¯å®Œäº†: スペルã®èª¤ã‚Šã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ", +DlgSpellNoChanges : "スペルãƒã‚§ãƒƒã‚¯å®Œäº†: 語å¥ã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ", +DlgSpellOneChange : "スペルãƒã‚§ãƒƒã‚¯å®Œäº†: 1語å¥å¤‰æ›´ã•ã‚Œã¾ã—ãŸ", +DlgSpellManyChanges : "スペルãƒã‚§ãƒƒã‚¯å®Œäº†: %1 語å¥å¤‰æ›´ã•ã‚Œã¾ã—ãŸ", + +IeSpellDownload : "スペルãƒã‚§ãƒƒã‚«ãƒ¼ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“。今ã™ãダウンロードã—ã¾ã™ã‹?", + +// Button Dialog +DlgButtonText : "テキスト (値)", +DlgButtonType : "タイプ", +DlgButtonTypeBtn : "ボタン", +DlgButtonTypeSbm : "é€ä¿¡", +DlgButtonTypeRst : "リセット", + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "åå‰", +DlgCheckboxValue : "値", +DlgCheckboxSelected : "é¸æŠžæ¸ˆã¿", + +// Form Dialog +DlgFormName : "フォームå", +DlgFormAction : "アクション", +DlgFormMethod : "メソッド", + +// Select Field Dialog +DlgSelectName : "åå‰", +DlgSelectValue : "値", +DlgSelectSize : "サイズ", +DlgSelectLines : "è¡Œ", +DlgSelectChkMulti : "複数項目é¸æŠžã‚’許å¯", +DlgSelectOpAvail : "利用å¯èƒ½ãªã‚ªãƒ—ション", +DlgSelectOpText : "é¸æŠžé …ç›®å", +DlgSelectOpValue : "é¸æŠžé …目値", +DlgSelectBtnAdd : "追加", +DlgSelectBtnModify : "編集", +DlgSelectBtnUp : "上ã¸", +DlgSelectBtnDown : "下ã¸", +DlgSelectBtnSetValue : "é¸æŠžã—ãŸå€¤ã‚’設定", +DlgSelectBtnDelete : "削除", + +// Textarea Dialog +DlgTextareaName : "åå‰", +DlgTextareaCols : "列", +DlgTextareaRows : "è¡Œ", + +// Text Field Dialog +DlgTextName : "åå‰", +DlgTextValue : "値", +DlgTextCharWidth : "サイズ", +DlgTextMaxChars : "最大長", +DlgTextType : "タイプ", +DlgTextTypeText : "テキスト", +DlgTextTypePass : "パスワード入力", + +// Hidden Field Dialog +DlgHiddenName : "åå‰", +DlgHiddenValue : "値", + +// Bulleted List Dialog +BulletedListProp : "箇æ¡æ›¸ã プロパティ", +NumberedListProp : "段è½ç•ªå· プロパティ", +DlgLstStart : "開始文字", +DlgLstType : "タイプ", +DlgLstTypeCircle : "白丸", +DlgLstTypeDisc : "黒丸", +DlgLstTypeSquare : "四角", +DlgLstTypeNumbers : "アラビア数字 (1, 2, 3)", +DlgLstTypeLCase : "英字å°æ–‡å­— (a, b, c)", +DlgLstTypeUCase : "英字大文字 (A, B, C)", +DlgLstTypeSRoman : "ローマ数字å°æ–‡å­— (i, ii, iii)", +DlgLstTypeLRoman : "ローマ数字大文字 (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "全般", +DlgDocBackTab : "背景", +DlgDocColorsTab : "色ã¨ãƒžãƒ¼ã‚¸ãƒ³", +DlgDocMetaTab : "メタデータ", + +DlgDocPageTitle : "ページタイトル", +DlgDocLangDir : "言語文字表記ã®æ–¹å‘", +DlgDocLangDirLTR : "å·¦ã‹ã‚‰å³ã«è¡¨è¨˜(LTR)", +DlgDocLangDirRTL : "å³ã‹ã‚‰å·¦ã«è¡¨è¨˜(RTL)", +DlgDocLangCode : "言語コード", +DlgDocCharSet : "文字セット符å·åŒ–", +DlgDocCharSetCE : "Central European", +DlgDocCharSetCT : "Chinese Traditional (Big5)", +DlgDocCharSetCR : "Cyrillic", +DlgDocCharSetGR : "Greek", +DlgDocCharSetJP : "Japanese", +DlgDocCharSetKR : "Korean", +DlgDocCharSetTR : "Turkish", +DlgDocCharSetUN : "Unicode (UTF-8)", +DlgDocCharSetWE : "Western European", +DlgDocCharSetOther : "ä»–ã®æ–‡å­—セット符å·åŒ–", + +DlgDocDocType : "文書タイプヘッダー", +DlgDocDocTypeOther : "ãã®ä»–文書タイプヘッダー", +DlgDocIncXHTML : "XHTML宣言をインクルード", +DlgDocBgColor : "背景色", +DlgDocBgImage : "èƒŒæ™¯ç”»åƒ URL", +DlgDocBgNoScroll : "スクロールã—ãªã„背景", +DlgDocCText : "テキスト", +DlgDocCLink : "リンク", +DlgDocCVisited : "アクセス済ã¿ãƒªãƒ³ã‚¯", +DlgDocCActive : "アクセス中リンク", +DlgDocMargins : "ページ・マージン", +DlgDocMaTop : "上部", +DlgDocMaLeft : "å·¦", +DlgDocMaRight : "å³", +DlgDocMaBottom : "下部", +DlgDocMeIndex : "文書ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰(カンマ区切り)", +DlgDocMeDescr : "文書ã®æ¦‚è¦", +DlgDocMeAuthor : "文書ã®ä½œè€…", +DlgDocMeCopy : "文書ã®è‘—作権", +DlgDocPreview : "プレビュー", + +// Templates Dialog +Templates : "テンプレート(雛形)", +DlgTemplatesTitle : "テンプレート内容", +DlgTemplatesSelMsg : "エディターã§ä½¿ç”¨ã™ã‚‹ãƒ†ãƒ³ãƒ—レートをé¸æŠžã—ã¦ãã ã•ã„。
    (ç¾åœ¨ã®ã‚¨ãƒ‡ã‚£ã‚¿ã®å†…容ã¯å¤±ã‚ã‚Œã¾ã™):", +DlgTemplatesLoading : "テンプレート一覧読ã¿è¾¼ã¿ä¸­. ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„...", +DlgTemplatesNoTpl : "(テンプレートãŒå®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“)", +DlgTemplatesReplace : "ç¾åœ¨ã®ã‚¨ãƒ‡ã‚£ã‚¿ã®å†…容ã¨ç½®æ›ãˆã‚’ã—ã¾ã™", + +// About Dialog +DlgAboutAboutTab : "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±", +DlgAboutBrowserInfoTab : "ブラウザ情報", +DlgAboutLicenseTab : "ライセンス", +DlgAboutVersion : "ãƒãƒ¼ã‚¸ãƒ§ãƒ³", +DlgAboutInfo : "より詳ã—ã„情報ã¯ã“ã¡ã‚‰ã§", + +// Div Dialog +DlgDivGeneralTab : "全般", +DlgDivAdvancedTab : "高度ãªè¨­å®š", +DlgDivStyle : "スタイル", +DlgDivInlineStyle : "インラインスタイル" +}; diff --git a/webdir/fckeditor/editor/lang/km.js b/webdir/fckeditor/editor/lang/km.js new file mode 100644 index 0000000..a52b8b0 --- /dev/null +++ b/webdir/fckeditor/editor/lang/km.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Khmer language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "បង្រួមរបាឧបរកណáŸ", +ToolbarExpand : "ពង្រីករបាឧបរណáŸ", + +// Toolbar Items and Context Menu +Save : "រក្សាទុក", +NewPage : "ទំពáŸážšážáŸ’មី", +Preview : "មើលសាកល្បង", +Cut : "កាážáŸ‹áž™áž€", +Copy : "ចំលងយក", +Paste : "ចំលងដាក់", +PasteText : "ចំលងដាក់ជាអážáŸ’ážáž”ទធម្មážáž¶", +PasteWord : "ចំលងដាក់ពី Word", +Print : "បោះពុម្ភ", +SelectAll : "ជ្រើសរើសទាំងអស់", +RemoveFormat : "លប់ចោល ការរចនា", +InsertLinkLbl : "ឈ្នាប់", +InsertLink : "បន្ážáŸ‚ម/កែប្រែ ឈ្នាប់", +RemoveLink : "លប់ឈ្នាប់", +VisitLink : "Open Link", //MISSING +Anchor : "បន្ážáŸ‚ម/កែប្រែ យុážáŸ’កា", +AnchorDelete : "Remove Anchor", //MISSING +InsertImageLbl : "រូបភាព", +InsertImage : "បន្ážáŸ‚ម/កែប្រែ រូបភាព", +InsertFlashLbl : "Flash", +InsertFlash : "បន្ážáŸ‚ម/កែប្រែ Flash", +InsertTableLbl : "ážáž¶ážšáž¶áž„", +InsertTable : "បន្ážáŸ‚ម/កែប្រែ ážáž¶ážšáž¶áž„", +InsertLineLbl : "បន្ទាážáŸ‹", +InsertLine : "បន្ážáŸ‚មបន្ទាážáŸ‹áž•áŸ’ážáŸáž€", +InsertSpecialCharLbl: "អក្សរពិសáŸážŸ", +InsertSpecialChar : "បន្ážáŸ‚មអក្សរពិសáŸážŸ", +InsertSmileyLbl : "រូបភាព", +InsertSmiley : "បន្ážáŸ‚ម រូបភាព", +About : "អំពី FCKeditor", +Bold : "អក្សរដិážáž’ំ", +Italic : "អក្សរផ្ážáŸáž€", +Underline : "ដិážáž”ន្ទាážáŸ‹áž–ីក្រោមអក្សរ", +StrikeThrough : "ដិážáž”ន្ទាážáŸ‹áž–ាក់កណ្ážáž¶áž›áž¢áž€áŸ’សរ", +Subscript : "អក្សរážáž¼áž…ក្រោម", +Superscript : "អក្សរážáž¼áž…លើ", +LeftJustify : "ážáŸ†ážšáž¹áž˜áž†áŸ’ážœáŸáž„", +CenterJustify : "ážáŸ†ážšáž¹áž˜áž€ážŽáŸ’ážáž¶áž›", +RightJustify : "ážáŸ†ážšáž¹áž˜ážŸáŸ’ážáž¶áŸ†", +BlockJustify : "ážáŸ†ážšáž¹áž˜ážŸáž„ážáž¶áž„", +DecreaseIndent : "បន្ážáž™áž€áž¶ážšáž…ូលបន្ទាážáŸ‹", +IncreaseIndent : "បន្ážáŸ‚មការចូលបន្ទាážáŸ‹", +Blockquote : "Blockquote", //MISSING +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "សារឡើងវិញ", +Redo : "ធ្វើឡើងវិញ", +NumberedListLbl : "បញ្ជីជាអក្សរ", +NumberedList : "បន្ážáŸ‚ម/លប់ បញ្ជីជាអក្សរ", +BulletedListLbl : "បញ្ជីជារង្វង់មូល", +BulletedList : "បន្ážáŸ‚ម/លប់ បញ្ជីជារង្វង់មូល", +ShowTableBorders : "បង្ហាញស៊ុមážáž¶ážšáž¶áž„", +ShowDetails : "បង្ហាញពិស្ážáž¶ážš", +Style : "ម៉ូáž", +FontFormat : "រចនា", +Font : "ហ្វុង", +FontSize : "ទំហំ", +TextColor : "ពណ៌អក្សរ", +BGColor : "ពណ៌ផ្ទៃážáž¶áž„ក្រោយ", +Source : "កូáž", +Find : "ស្វែងរក", +Replace : "ជំនួស", +SpellCheck : "áž–áž·áž“áž·ážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធ", +UniversalKeyboard : "ក្ážáž¶ážšáž–ុម្ភអក្សរសកល", +PageBreakLbl : "ការផ្ážáž¶áž…់ទំពáŸážš", +PageBreak : "បន្ážáŸ‚ម ការផ្ážáž¶áž…់ទំពáŸážš", + +Form : "បែបបទ", +Checkbox : "ប្រអប់ជ្រើសរើស", +RadioButton : "ប៉ូážáž»áž“រង្វង់មូល", +TextField : "ជួរសរសáŸážšáž¢ážáŸ’ážáž”áž‘", +Textarea : "ážáŸ†áž”ន់សរសáŸážšáž¢ážáŸ’ážáž”áž‘", +HiddenField : "ជួរលាក់", +Button : "ប៉ូážáž»áž“", +SelectionField : "ជួរជ្រើសរើស", +ImageButton : "ប៉ូážáž»áž“រូបភាព", + +FitWindow : "Maximize the editor size", //MISSING +ShowBlocks : "Show Blocks", //MISSING + +// Context Menu +EditLink : "កែប្រែឈ្នាប់", +CellCM : "Cell", //MISSING +RowCM : "Row", //MISSING +ColumnCM : "Column", //MISSING +InsertRowAfter : "Insert Row After", //MISSING +InsertRowBefore : "Insert Row Before", //MISSING +DeleteRows : "លប់ជួរផ្ážáŸáž€", +InsertColumnAfter : "Insert Column After", //MISSING +InsertColumnBefore : "Insert Column Before", //MISSING +DeleteColumns : "លប់ជួរឈរ", +InsertCellAfter : "Insert Cell After", //MISSING +InsertCellBefore : "Insert Cell Before", //MISSING +DeleteCells : "លប់សែល", +MergeCells : "បញ្ជូលសែល", +MergeRight : "Merge Right", //MISSING +MergeDown : "Merge Down", //MISSING +HorizontalSplitCell : "Split Cell Horizontally", //MISSING +VerticalSplitCell : "Split Cell Vertically", //MISSING +TableDelete : "លប់ážáž¶ážšáž¶áž„", +CellProperties : "ការកំណážáŸ‹ážŸáŸ‚áž›", +TableProperties : "ការកំណážáŸ‹ážáž¶ážšáž¶áž„", +ImageProperties : "ការកំណážáŸ‹ážšáž¼áž”ភាព", +FlashProperties : "ការកំណážáŸ‹ Flash", + +AnchorProp : "ការកំណážáŸ‹áž™áž»ážáŸ’កា", +ButtonProp : "ការកំណážáŸ‹ ប៉ូážáž»áž“", +CheckboxProp : "ការកំណážáŸ‹áž”្រអប់ជ្រើសរើស", +HiddenFieldProp : "ការកំណážáŸ‹áž‡áž½ážšáž›áž¶áž€áŸ‹", +RadioButtonProp : "ការកំណážáŸ‹áž”៉ូážáž»áž“រង្វង់", +ImageButtonProp : "ការកំណážáŸ‹áž”៉ូážáž»áž“រូបភាព", +TextFieldProp : "ការកំណážáŸ‹áž‡áž½ážšáž¢ážáŸ’ážáž”áž‘", +SelectionFieldProp : "ការកំណážáŸ‹áž‡áž½ážšáž‡áŸ’រើសរើស", +TextareaProp : "ការកំណážáŸ‹áž€áž“្លែងសរសáŸážšáž¢ážáŸ’ážáž”áž‘", +FormProp : "ការកំណážáŸ‹áž”ែបបទ", + +FontFormats : "Normal;Formatted;Address;Heading 1;Heading 2;Heading 3;Heading 4;Heading 5;Heading 6;Normal (DIV)", + +// Alerts and Messages +ProcessingXHTML : "កំពុងដំណើរការ XHTML ។ សូមរងចាំ...", +Done : "ចប់រួចរាល់", +PasteWordConfirm : "អážáŸ’ážáž”ទដែលលោកអ្នកបំរុងចំលងដាក់ ហាក់បីដូចជាážáŸ’រូវចំលងមកពីកម្មវិធី​Word​។ ážáž¾áž›áŸ„កអ្នកចង់សំអាážáž˜áž»áž“ចំលងអážáŸ’ážáž”ទដាក់ទáŸ?", +NotCompatiblePaste : "ពាក្យបញ្ជានáŸáŸ‡áž”្រើបានážáŸ‚ជាមួយ Internet Explorer កំរិហ5.5 រឺ លើសនáŸáŸ‡ ។ ážáž¾áž›áŸ„កអ្នកចង់ចំលងដាក់ដោយមិនចាំបាច់សំអាážáž‘áŸ?", +UnknownToolbarItem : "ážœážáŸ’ážáž»áž›áž¾ážšáž”ាឧបរកណ០មិនស្គាល់ \"%1\"", +UnknownCommand : "ឈ្មោះពាក្យបញ្ជា មិនស្គាល់ \"%1\"", +NotImplemented : "ពាក្យបញ្ជា មិនបានអនុវážáŸ’áž", +UnknownToolbarSet : "របាឧបរកណ០\"%1\" ពុំមាន ។", +NoActiveX : "ការកំណážáŸ‹ážŸáž»ážœážáŸ’ážáž—ាពរបស់កម្មវិធីរុករករបស់លោកអ្នក áž“áŸáŸ‡â€‹áž¢áž¶áž…ធ្វើអោយលោកអ្នកមិនអាចប្រើមុážáž„ារážáŸ’លះរបស់កម្មវិធីážáž¶áž€áŸ‹ážáŸ‚ងអážáŸ’ážáž”áž‘áž“áŸáŸ‡ ។ លោកអ្នកážáŸ’រូវកំណážáŸ‹áž¢áŸ„áž™ \"ActiveX និង​កម្មវិធីជំនួយក្នុង (plug-ins)\" អោយដំណើរការ ។ លោកអ្នកអាចជួបប្រទះនឹង បញ្ហា ព្រមជាមួយនឹងការបាážáŸ‹áž”ង់មុážáž„ារណាមួយរបស់កម្មវិធីážáž¶áž€áŸ‹ážáŸ‚ងអážáŸ’ážáž”áž‘áž“áŸáŸ‡ ។", +BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", //MISSING +DialogBlocked : "វីនដូវមិនអាចបើកបានទ០។ សូមពិនិážáŸ’យចំពោះកម្មវិធីបិទ វីនដូវលោហ(popup) ážáž¶ážáž¾ážœáž¶ážŠáŸ†ážŽáž¾ážšáž€áž¶ážšážšážºáž‘០។", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "យល់ព្រម", +DlgBtnCancel : "មិនយល់ព្រម", +DlgBtnClose : "បិទ", +DlgBtnBrowseServer : "មើល", +DlgAdvancedTag : "កំរិážážáŸ’ពស់", +DlgOpOther : "<ផ្សáŸáž„ទៅáž>", +DlgInfoTab : "áž–ážáŸŒáž˜áž¶áž“", +DlgAlertUrl : "សូមសរសáŸážš URL", + +// General Dialogs Labels +DlgGenNotSet : "<មិនមែន>", +DlgGenId : "Id", +DlgGenLangDir : "ទិសដៅភាសា", +DlgGenLangDirLtr : "ពីឆ្វáŸáž„ទៅស្ážáž¶áŸ†(LTR)", +DlgGenLangDirRtl : "ពីស្ážáž¶áŸ†áž‘ៅឆ្វáŸáž„(RTL)", +DlgGenLangCode : "áž›áŸážáž€áž¼ážáž—ាសា", +DlgGenAccessKey : "ឃី សំរាប់ចូល", +DlgGenName : "ឈ្មោះ", +DlgGenTabIndex : "áž›áŸáž Tab", +DlgGenLongDescr : "អធិប្បាយ URL វែង", +DlgGenClass : "Stylesheet Classes", +DlgGenTitle : "ចំណងជើង ប្រឹក្សា", +DlgGenContType : "ប្រភáŸáž‘អážáŸ’ážáž”áž‘ ប្រឹក្សា", +DlgGenLinkCharset : "áž›áŸážáž€áž¼ážáž¢áž€áŸ’សររបស់ឈ្នាប់", +DlgGenStyle : "ម៉ូáž", + +// Image Dialog +DlgImgTitle : "ការកំណážáŸ‹ážšáž¼áž”ភាព", +DlgImgInfoTab : "áž–ážáŸŒáž˜áž¶áž“អំពីរូបភាព", +DlgImgBtnUpload : "បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្ážáž›áŸ‹ážŸáŸážœáž¶", +DlgImgURL : "URL", +DlgImgUpload : "ទាញយក", +DlgImgAlt : "អážáŸ’ážáž”ទជំនួស", +DlgImgWidth : "ទទឹង", +DlgImgHeight : "កំពស់", +DlgImgLockRatio : "អážáŸ’រាឡុក", +DlgBtnResetSize : "កំណážáŸ‹áž‘ំហំឡើងវិញ", +DlgImgBorder : "ស៊ុម", +DlgImgHSpace : "គំលាážáž‘ទឹង", +DlgImgVSpace : "គំលាážáž”ណ្ážáŸ„áž™", +DlgImgAlign : "កំណážáŸ‹áž‘ីážáž¶áŸ†áž„", +DlgImgAlignLeft : "ážáž¶áž„ឆ្វង", +DlgImgAlignAbsBottom: "Abs Bottom", //MISSING +DlgImgAlignAbsMiddle: "Abs Middle", //MISSING +DlgImgAlignBaseline : "បន្ទាážáŸ‹áž‡áž¶áž˜áž¼áž›ážŠáŸ’ឋាន", +DlgImgAlignBottom : "ážáž¶áž„ក្រោម", +DlgImgAlignMiddle : "កណ្ážáž¶áž›", +DlgImgAlignRight : "ážáž¶áž„ស្ážáž¶áŸ†", +DlgImgAlignTextTop : "លើអážáŸ’ážáž”áž‘", +DlgImgAlignTop : "ážáž¶áž„លើ", +DlgImgPreview : "មើលសាកល្បង", +DlgImgAlertUrl : "សូមសរសáŸážšáž„ាសáŸáž™ážŠáŸ’ឋានរបស់រូបភាព", +DlgImgLinkTab : "ឈ្នាប់", + +// Flash Dialog +DlgFlashTitle : "ការកំណážáŸ‹ Flash", +DlgFlashChkPlay : "áž›áŸáž„ដោយស្វáŸáž™áž”្រវážáŸ’áž", +DlgFlashChkLoop : "ចំនួនដង", +DlgFlashChkMenu : "បង្ហាញ មឺនុយរបស់ Flash", +DlgFlashScale : "ទំហំ", +DlgFlashScaleAll : "បង្ហាញទាំងអស់", +DlgFlashScaleNoBorder : "មិនបង្ហាញស៊ុម", +DlgFlashScaleFit : "ážáŸ’រូវល្មម", + +// Link Dialog +DlgLnkWindowTitle : "ឈ្នាប់", +DlgLnkInfoTab : "áž–ážáŸŒáž˜áž¶áž“អំពីឈ្នាប់", +DlgLnkTargetTab : "គោលដៅ", + +DlgLnkType : "ប្រភáŸáž‘ឈ្នាប់", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "យុážáŸ’កានៅក្នុងទំពáŸážšáž“áŸáŸ‡", +DlgLnkTypeEMail : "អ៊ីមែល", +DlgLnkProto : "ប្រូážáž¼áž€áž¼áž›", +DlgLnkProtoOther : "<ផ្សáŸáž„ទៀáž>", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "ជ្រើសរើសយុážáŸ’កា", +DlgLnkAnchorByName : "ážáž¶áž˜ážˆáŸ’មោះរបស់យុážáŸ’កា", +DlgLnkAnchorById : "ážáž¶áž˜ Id", +DlgLnkNoAnchors : "(No anchors available in the document)", //MISSING +DlgLnkEMail : "អ៊ីមែល", +DlgLnkEMailSubject : "ចំណងជើងអážáŸ’ážáž”áž‘", +DlgLnkEMailBody : "អážáŸ’ážáž”áž‘", +DlgLnkUpload : "ទាញយក", +DlgLnkBtnUpload : "ទាញយក", + +DlgLnkTarget : "គោលដៅ", +DlgLnkTargetFrame : "<ហ្វ្រáŸáž˜>", +DlgLnkTargetPopup : "<វីនដូវ លោáž>", +DlgLnkTargetBlank : "វីនដូវážáŸ’មី (_blank)", +DlgLnkTargetParent : "វីនដូវម០(_parent)", +DlgLnkTargetSelf : "វីនដូវដដែល (_self)", +DlgLnkTargetTop : "វីនដូវនៅលើគáŸ(_top)", +DlgLnkTargetFrameName : "ឈ្មោះហ្រ្វáŸáž˜ážŠáŸ‚លជាគោលដៅ", +DlgLnkPopWinName : "ឈ្មោះវីនដូវលោáž", +DlgLnkPopWinFeat : "លក្ážážŽáŸ‡ážšáž”ស់វីនដូលលោáž", +DlgLnkPopResize : "ទំហំអាចផ្លាស់ប្ážáž¼ážš", +DlgLnkPopLocation : "របា ទីážáž¶áŸ†áž„", +DlgLnkPopMenu : "របា មឺនុយ", +DlgLnkPopScroll : "របា ទាញ", +DlgLnkPopStatus : "របា áž–ážáŸŒáž˜áž¶áž“", +DlgLnkPopToolbar : "របា ឩបករណáŸ", +DlgLnkPopFullScrn : "អáŸáž€áŸ’រុងពáŸáž‰(IE)", +DlgLnkPopDependent : "អាស្រáŸáž™áž›áž¾ (Netscape)", +DlgLnkPopWidth : "ទទឹង", +DlgLnkPopHeight : "កំពស់", +DlgLnkPopLeft : "ទីážáž¶áŸ†áž„ážáž¶áž„ឆ្វáŸáž„", +DlgLnkPopTop : "ទីážáž¶áŸ†áž„ážáž¶áž„លើ", + +DlnLnkMsgNoUrl : "សូមសរសáŸážš អាសáŸáž™ážŠáŸ’ឋាន URL", +DlnLnkMsgNoEMail : "សូមសរសáŸážš អាសáŸáž™ážŠáŸ’ឋាន អ៊ីមែល", +DlnLnkMsgNoAnchor : "សូមជ្រើសរើស យុážáŸ’កា", +DlnLnkMsgInvPopName : "The popup name must begin with an alphabetic character and must not contain spaces", //MISSING + +// Color Dialog +DlgColorTitle : "ជ្រើសរើស ពណ៌", +DlgColorBtnClear : "លប់", +DlgColorHighlight : "ផាážáŸ‹áž–ណ៌", +DlgColorSelected : "បានជ្រើសរើស", + +// Smiley Dialog +DlgSmileyTitle : "បញ្ជូលរូបភាព", + +// Special Character Dialog +DlgSpecialCharTitle : "ážáž¼áž¢áž€áŸ’សរពិសáŸážŸ", + +// Table Dialog +DlgTableTitle : "ការកំណážáŸ‹ ážáž¶ážšáž¶áž„", +DlgTableRows : "ជួរផ្ážáŸáž€", +DlgTableColumns : "ជួរឈរ", +DlgTableBorder : "ទំហំស៊ុម", +DlgTableAlign : "ការកំណážáŸ‹áž‘ីážáž¶áŸ†áž„", +DlgTableAlignNotSet : "<មិនកំណážáŸ‹>", +DlgTableAlignLeft : "ážáž¶áž„ឆ្វáŸáž„", +DlgTableAlignCenter : "កណ្ážáž¶áž›", +DlgTableAlignRight : "ážáž¶áž„ស្ážáž¶áŸ†", +DlgTableWidth : "ទទឹង", +DlgTableWidthPx : "ភីកសែល", +DlgTableWidthPc : "ភាគរយ", +DlgTableHeight : "កំពស់", +DlgTableCellSpace : "គំលាážážŸáŸ‚áž›", +DlgTableCellPad : "គែមសែល", +DlgTableCaption : "ចំណងជើង", +DlgTableSummary : "សáŸáž…ក្ážáž¸ážŸáž„្ážáŸáž”", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "ការកំណážáŸ‹ សែល", +DlgCellWidth : "ទទឹង", +DlgCellWidthPx : "ភីកសែល", +DlgCellWidthPc : "ភាគរយ", +DlgCellHeight : "កំពស់", +DlgCellWordWrap : "បង្ហាញអážáŸ’ážáž”ទទាំងអស់", +DlgCellWordWrapNotSet : "<មិនកំណážáŸ‹>", +DlgCellWordWrapYes : "បាទ(ចា)", +DlgCellWordWrapNo : "áž‘áŸ", +DlgCellHorAlign : "ážáŸ†ážšáž¹áž˜áž•áŸ’ážáŸáž€", +DlgCellHorAlignNotSet : "<មិនកំណážáŸ‹>", +DlgCellHorAlignLeft : "ážáž¶áž„ឆ្វáŸáž„", +DlgCellHorAlignCenter : "កណ្ážáž¶áž›", +DlgCellHorAlignRight: "Right", //MISSING +DlgCellVerAlign : "ážáŸ†ážšáž¹áž˜ážˆážš", +DlgCellVerAlignNotSet : "<មិនកណážáŸ‹>", +DlgCellVerAlignTop : "ážáž¶áž„លើ", +DlgCellVerAlignMiddle : "កណ្ážáž¶áž›", +DlgCellVerAlignBottom : "ážáž¶áž„ក្រោម", +DlgCellVerAlignBaseline : "បន្ទាážáŸ‹áž‡áž¶áž˜áž¼áž›ážŠáŸ’ឋាន", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "បញ្ជូលជួរផ្ážáŸáž€", +DlgCellCollSpan : "បញ្ជូលជួរឈរ", +DlgCellBackColor : "ពណ៌ផ្នែកážáž¶áž„ក្រោម", +DlgCellBorderColor : "ពណ៌ស៊ុម", +DlgCellBtnSelect : "ជ្រើសរើស...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", //MISSING + +// Find Dialog +DlgFindTitle : "ស្វែងរក", +DlgFindFindBtn : "ស្វែងរក", +DlgFindNotFoundMsg : "ពាក្យនáŸáŸ‡ រកមិនឃើញទ០។", + +// Replace Dialog +DlgReplaceTitle : "ជំនួស", +DlgReplaceFindLbl : "ស្វែងរកអ្វី:", +DlgReplaceReplaceLbl : "ជំនួសជាមួយ:", +DlgReplaceCaseChk : "ករណ៉ážáŸ’រូវរក", +DlgReplaceReplaceBtn : "ជំនួស", +DlgReplaceReplAllBtn : "ជំនួសទាំងអស់", +DlgReplaceWordChk : "ážáŸ’រូវពាក្យទាំងអស់", + +// Paste Operations / Dialog +PasteErrorCut : "ការកំណážáŸ‹ážŸáž»ážœážáŸ’ážáž—ាពរបស់កម្មវិធីរុករករបស់លោកអ្នក áž“áŸáŸ‡â€‹áž˜áž·áž“អាចធ្វើកម្មវិធីážáž¶áž€áŸ‹ážáŸ‚ងអážáŸ’ážáž”áž‘ កាážáŸ‹áž¢ážáŸ’ážáž”ទយកដោយស្វáŸáž™áž”្រវážáŸ’ážáž”ានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនáŸáŸ‡ (Ctrl+X) ។", +PasteErrorCopy : "ការកំណážáŸ‹ážŸáž»ážœážáŸ’ážáž—ាពរបស់កម្មវិធីរុករករបស់លោកអ្នក áž“áŸáŸ‡â€‹áž˜áž·áž“អាចធ្វើកម្មវិធីážáž¶áž€áŸ‹ážáŸ‚ងអážáŸ’ážáž”áž‘ ចំលងអážáŸ’ážáž”ទយកដោយស្វáŸáž™áž”្រវážáŸ’ážáž”ានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនáŸáŸ‡ (Ctrl+C)។", + +PasteAsText : "ចំលងដាក់អážáŸ’ážáž”ទធម្មážáž¶", +PasteFromWord : "ចំលងពាក្យពីកម្មវិធី Word", + +DlgPasteMsg2 : "សូមចំលងអážáŸ’ážáž”ទទៅដាក់ក្នុងប្រអប់ដូចážáž¶áž„ក្រោមដោយប្រើប្រាស់ ឃី ​(Ctrl+V) ហើយចុច OK ។", +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", //MISSING +DlgPasteIgnoreFont : "មិនគិážáž¢áŸ†áž–ីប្រភáŸáž‘ពុម្ភអក្សរ", +DlgPasteRemoveStyles : "លប់ម៉ូáž", + +// Color Picker +ColorAutomatic : "ស្វáŸáž™áž”្រវážáŸ’áž", +ColorMoreColors : "ពណ៌ផ្សáŸáž„ទៀáž..", + +// Document Properties +DocProps : "ការកំណážáŸ‹ ឯកសារ", + +// Anchor Dialog +DlgAnchorTitle : "ការកំណážáŸ‹áž…ំណងជើងយុទ្ធážáŸ’កា", +DlgAnchorName : "ឈ្មោះយុទ្ធážáŸ’កា", +DlgAnchorErrorName : "សូមសរសáŸážš ឈ្មោះយុទ្ធážáŸ’កា", + +// Speller Pages Dialog +DlgSpellNotInDic : "គ្មានក្នុងវចនានុក្រម", +DlgSpellChangeTo : "ផ្លាស់ប្ážáž¼ážšáž‘ៅ", +DlgSpellBtnIgnore : "មិនផ្លាស់ប្ážáž¼ážš", +DlgSpellBtnIgnoreAll : "មិនផ្លាស់ប្ážáž¼ážš ទាំងអស់", +DlgSpellBtnReplace : "ជំនួស", +DlgSpellBtnReplaceAll : "ជំនួសទាំងអស់", +DlgSpellBtnUndo : "សារឡើងវិញ", +DlgSpellNoSuggestions : "- គ្មានសំណើរ -", +DlgSpellProgress : "កំពុងពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធ...", +DlgSpellNoMispell : "ការពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធបានចប់: គ្មានកំហុស", +DlgSpellNoChanges : "ការពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធបានចប់: ពុំមានផ្លាស់ប្ážáž¼ážš", +DlgSpellOneChange : "ការពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធបានចប់: ពាក្យមួយážáŸ’រូចបានផ្លាស់ប្ážáž¼ážš", +DlgSpellManyChanges : "ការពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធបានចប់: %1 ពាក្យបានផ្លាស់ប្ážáž¼ážš", + +IeSpellDownload : "ពុំមានកម្មវិធីពិនិážáŸ’យអក្ážážšáž¶ážœáž·ážšáž»áž‘្ធ ។ ážáž¾áž…ង់ទាញយកពីណា?", + +// Button Dialog +DlgButtonText : "អážáŸ’ážáž”áž‘(ážáŸ†áž›áŸƒ)", +DlgButtonType : "ប្រភáŸáž‘", +DlgButtonTypeBtn : "Button", //MISSING +DlgButtonTypeSbm : "Submit", //MISSING +DlgButtonTypeRst : "Reset", //MISSING + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "ឈ្មោះ", +DlgCheckboxValue : "ážáŸ†áž›áŸƒ", +DlgCheckboxSelected : "បានជ្រើសរើស", + +// Form Dialog +DlgFormName : "ឈ្មោះ", +DlgFormAction : "សកម្មភាព", +DlgFormMethod : "វិធី", + +// Select Field Dialog +DlgSelectName : "ឈ្មោះ", +DlgSelectValue : "ážáŸ†áž›áŸƒ", +DlgSelectSize : "ទំហំ", +DlgSelectLines : "បន្ទាážáŸ‹", +DlgSelectChkMulti : "អនុញ្ញាážáž¢áŸ„យជ្រើសរើសច្រើន", +DlgSelectOpAvail : "ការកំណážáŸ‹áž‡áŸ’រើសរើស ដែលអាចកំណážáŸ‹áž”ាន", +DlgSelectOpText : "ពាក្យ", +DlgSelectOpValue : "ážáŸ†áž›áŸƒ", +DlgSelectBtnAdd : "បន្ážáŸ‚ម", +DlgSelectBtnModify : "ផ្លាស់ប្ážáž¼ážš", +DlgSelectBtnUp : "លើ", +DlgSelectBtnDown : "ក្រោម", +DlgSelectBtnSetValue : "Set as selected value", //MISSING +DlgSelectBtnDelete : "លប់", + +// Textarea Dialog +DlgTextareaName : "ឈ្មោះ", +DlgTextareaCols : "ជូរឈរ", +DlgTextareaRows : "ជូរផ្ážáŸáž€", + +// Text Field Dialog +DlgTextName : "ឈ្មោះ", +DlgTextValue : "ážáŸ†áž›áŸƒ", +DlgTextCharWidth : "ទទឹង អក្សរ", +DlgTextMaxChars : "អក្សរអážáž·áž”រិមា", +DlgTextType : "ប្រភáŸáž‘", +DlgTextTypeText : "ពាក្យ", +DlgTextTypePass : "ពាក្យសំងាážáŸ‹", + +// Hidden Field Dialog +DlgHiddenName : "ឈ្មោះ", +DlgHiddenValue : "ážáŸ†áž›áŸƒ", + +// Bulleted List Dialog +BulletedListProp : "កំណážáŸ‹áž”ញ្ជីរង្វង់", +NumberedListProp : "កំណážáŸ‹áž”ញ្áŸáž‡áž¸áž›áŸáž", +DlgLstStart : "Start", //MISSING +DlgLstType : "ប្រភáŸáž‘", +DlgLstTypeCircle : "រង្វង់", +DlgLstTypeDisc : "Disc", +DlgLstTypeSquare : "ការáŸ", +DlgLstTypeNumbers : "áž›áŸáž(1, 2, 3)", +DlgLstTypeLCase : "អក្សរážáž¼áž…(a, b, c)", +DlgLstTypeUCase : "អក្សរធំ(A, B, C)", +DlgLstTypeSRoman : "អក្សរឡាážáž¶áŸ†áž„ážáž¼áž…(i, ii, iii)", +DlgLstTypeLRoman : "អក្សរឡាážáž¶áŸ†áž„ធំ(I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "ទូទៅ", +DlgDocBackTab : "ផ្នែកážáž¶áž„ក្រោយ", +DlgDocColorsTab : "ទំពáŸážšâ€‹áž“áž·áž„ ស៊ុម", +DlgDocMetaTab : "ទិន្ននáŸáž™áž˜áŸ", + +DlgDocPageTitle : "ចំណងជើងទំពáŸážš", +DlgDocLangDir : "ទិសដៅសរសáŸážšáž—ាសា", +DlgDocLangDirLTR : "ពីឆ្វáŸáž„ទៅស្ដាំ(LTR)", +DlgDocLangDirRTL : "ពីស្ដាំទៅឆ្វáŸáž„(RTL)", +DlgDocLangCode : "áž›áŸážáž€áž¼ážáž—ាសា", +DlgDocCharSet : "កំណážáŸ‹áž›áŸážáž€áž¼ážáž—ាសា", +DlgDocCharSetCE : "Central European", //MISSING +DlgDocCharSetCT : "Chinese Traditional (Big5)", //MISSING +DlgDocCharSetCR : "Cyrillic", //MISSING +DlgDocCharSetGR : "Greek", //MISSING +DlgDocCharSetJP : "Japanese", //MISSING +DlgDocCharSetKR : "Korean", //MISSING +DlgDocCharSetTR : "Turkish", //MISSING +DlgDocCharSetUN : "Unicode (UTF-8)", //MISSING +DlgDocCharSetWE : "Western European", //MISSING +DlgDocCharSetOther : "កំណážáŸ‹áž›áŸážáž€áž¼ážáž—ាសាផ្សáŸáž„ទៀáž", + +DlgDocDocType : "ប្រភáŸáž‘ក្បាលទំពáŸážš", +DlgDocDocTypeOther : "ប្រភáŸáž‘ក្បាលទំពáŸážšáž•áŸ’សáŸáž„ទៀáž", +DlgDocIncXHTML : "បញ្ជូល XHTML", +DlgDocBgColor : "ពណ៌ážáž¶áž„ក្រោម", +DlgDocBgImage : "URL របស់រូបភាពážáž¶áž„ក្រោម", +DlgDocBgNoScroll : "ទំពáŸážšáž€áŸ’រោមមិនប្ážáž¼ážš", +DlgDocCText : "អážáŸ’ážáž”áž‘", +DlgDocCLink : "ឈ្នាប់", +DlgDocCVisited : "ឈ្នាប់មើលហើយ", +DlgDocCActive : "ឈ្នាប់កំពុងមើល", +DlgDocMargins : "ស៊ុមទំពáŸážš", +DlgDocMaTop : "លើ", +DlgDocMaLeft : "ឆ្វáŸáž„", +DlgDocMaRight : "ស្ដាំ", +DlgDocMaBottom : "ក្រោម", +DlgDocMeIndex : "ពាក្យនៅក្នុងឯកសារ (ផ្ážáž¶áž…់ពីគ្នាដោយក្បៀស)", +DlgDocMeDescr : "សáŸáž…ក្ážáž¸áž¢ážáŸ’ážáž¶áž’ិប្បាយអំពីឯកសារ", +DlgDocMeAuthor : "អ្នកនិពន្ធ", +DlgDocMeCopy : "រក្សាសិទ្ធិáŸ", +DlgDocPreview : "មើលសាកល្បង", + +// Templates Dialog +Templates : "ឯកសារគំរូ", +DlgTemplatesTitle : "ឯកសារគំរូ របស់អážáŸ’ážáž“áŸáž™", +DlgTemplatesSelMsg : "សូមជ្រើសរើសឯកសារគំរូ ដើម្បីបើកនៅក្នុងកម្មវិធីážáž¶áž€áŸ‹ážáŸ‚ងអážáŸ’ážáž”áž‘
    (អážáŸ’ážáž”ទនឹងបាážáŸ‹áž”ង់):", +DlgTemplatesLoading : "កំពុងអានបញ្ជីឯកសារគំរូ ។ សូមរងចាំ...", +DlgTemplatesNoTpl : "(ពុំមានឯកសារគំរូážáŸ’រូវបានកំណážáŸ‹)", +DlgTemplatesReplace : "Replace actual contents", //MISSING + +// About Dialog +DlgAboutAboutTab : "អំពី", +DlgAboutBrowserInfoTab : "ព៌ážáž˜áž¶áž“កម្មវិធីរុករក", +DlgAboutLicenseTab : "License", //MISSING +DlgAboutVersion : "ជំនាន់", +DlgAboutInfo : "សំរាប់ព៌ážáž˜áž¶áž“ផ្សáŸáž„ទៀហសូមទាក់ទង", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/ko.js b/webdir/fckeditor/editor/lang/ko.js new file mode 100644 index 0000000..a5d2e0c --- /dev/null +++ b/webdir/fckeditor/editor/lang/ko.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Korean language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "툴바 ê°ì¶”기", +ToolbarExpand : "툴바 ë³´ì´ê¸°", + +// Toolbar Items and Context Menu +Save : "저장하기", +NewPage : "새 문서", +Preview : "미리보기", +Cut : "잘ë¼ë‚´ê¸°", +Copy : "복사하기", +Paste : "붙여넣기", +PasteText : "í…스트로 붙여넣기", +PasteWord : "MS Word 형ì‹ì—ì„œ 붙여넣기", +Print : "ì¸ì‡„하기", +SelectAll : "ì „ì²´ì„ íƒ", +RemoveFormat : "í¬ë§· 지우기", +InsertLinkLbl : "ë§í¬", +InsertLink : "ë§í¬ 삽입/변경", +RemoveLink : "ë§í¬ ì‚­ì œ", +VisitLink : "Open Link", //MISSING +Anchor : "책갈피 삽입/변경", +AnchorDelete : "Remove Anchor", //MISSING +InsertImageLbl : "ì´ë¯¸ì§€", +InsertImage : "ì´ë¯¸ì§€ 삽입/변경", +InsertFlashLbl : "플래쉬", +InsertFlash : "플래쉬 삽입/변경", +InsertTableLbl : "í‘œ", +InsertTable : "í‘œ 삽입/변경", +InsertLineLbl : "수í‰ì„ ", +InsertLine : "수í‰ì„  삽입", +InsertSpecialCharLbl: "íŠ¹ìˆ˜ë¬¸ìž ì‚½ìž…", +InsertSpecialChar : "íŠ¹ìˆ˜ë¬¸ìž ì‚½ìž…", +InsertSmileyLbl : "ì•„ì´ì½˜", +InsertSmiley : "ì•„ì´ì½˜ 삽입", +About : "FCKeditorì— ëŒ€í•˜ì—¬", +Bold : "진하게", +Italic : "ì´í…”릭", +Underline : "밑줄", +StrikeThrough : "취소선", +Subscript : "아래 첨ìž", +Superscript : "위 첨ìž", +LeftJustify : "왼쪽 ì •ë ¬", +CenterJustify : "ê°€ìš´ë° ì •ë ¬", +RightJustify : "오른쪽 ì •ë ¬", +BlockJustify : "양쪽 맞춤", +DecreaseIndent : "내어쓰기", +IncreaseIndent : "들여쓰기", +Blockquote : "Blockquote", //MISSING +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "취소", +Redo : "재실행", +NumberedListLbl : "순서있는 목ë¡", +NumberedList : "순서있는 목ë¡", +BulletedListLbl : "순서없는 목ë¡", +BulletedList : "순서없는 목ë¡", +ShowTableBorders : "í‘œ í…Œë‘리 보기", +ShowDetails : "문서기호 보기", +Style : "스타ì¼", +FontFormat : "í¬ë§·", +Font : "í°íŠ¸", +FontSize : "ê¸€ìž í¬ê¸°", +TextColor : "ê¸€ìž ìƒ‰ìƒ", +BGColor : "ë°°ê²½ 색ìƒ", +Source : "소스", +Find : "찾기", +Replace : "바꾸기", +SpellCheck : "ì² ìžê²€ì‚¬", +UniversalKeyboard : "다국어 입력기", +PageBreakLbl : "Page Break", //MISSING +PageBreak : "Insert Page Break", //MISSING + +Form : "í¼", +Checkbox : "ì²´í¬ë°•ìŠ¤", +RadioButton : "ë¼ë””오버튼", +TextField : "입력필드", +Textarea : "ìž…ë ¥ì˜ì—­", +HiddenField : "숨김필드", +Button : "버튼", +SelectionField : "펼침목ë¡", +ImageButton : "ì´ë¯¸ì§€ë²„튼", + +FitWindow : "ì—디터 최대화", +ShowBlocks : "Show Blocks", //MISSING + +// Context Menu +EditLink : "ë§í¬ 수정", +CellCM : "ì…€/칸(Cell)", +RowCM : "í–‰(Row)", +ColumnCM : "ì—´(Column)", +InsertRowAfter : "ë’¤ì— í–‰ 삽입", +InsertRowBefore : "ì•žì— í–‰ 삽입", +DeleteRows : "가로줄 ì‚­ì œ", +InsertColumnAfter : "ë’¤ì— ì—´ 삽입", +InsertColumnBefore : "ì•žì— ì—´ 삽입", +DeleteColumns : "세로줄 ì‚­ì œ", +InsertCellAfter : "ë’¤ì— ì…€/칸 삽입", +InsertCellBefore : "ì•žì— ì…€/칸 삽입", +DeleteCells : "ì…€ ì‚­ì œ", +MergeCells : "ì…€ 합치기", +MergeRight : "오른쪽 뭉치기", +MergeDown : "왼쪽 뭉치기", +HorizontalSplitCell : "ìˆ˜í‰ ë‚˜ëˆ„ê¸°", +VerticalSplitCell : "ìˆ˜ì§ ë‚˜ëˆ„ê¸°", +TableDelete : "í‘œ ì‚­ì œ", +CellProperties : "ì…€ ì†ì„±", +TableProperties : "í‘œ ì†ì„±", +ImageProperties : "ì´ë¯¸ì§€ ì†ì„±", +FlashProperties : "플래쉬 ì†ì„±", + +AnchorProp : "책갈피 ì†ì„±", +ButtonProp : "버튼 ì†ì„±", +CheckboxProp : "ì²´í¬ë°•ìŠ¤ ì†ì„±", +HiddenFieldProp : "숨김필드 ì†ì„±", +RadioButtonProp : "ë¼ë””오버튼 ì†ì„±", +ImageButtonProp : "ì´ë¯¸ì§€ë²„튼 ì†ì„±", +TextFieldProp : "입력필드 ì†ì„±", +SelectionFieldProp : "íŽ¼ì¹¨ëª©ë¡ ì†ì„±", +TextareaProp : "ìž…ë ¥ì˜ì—­ ì†ì„±", +FormProp : "í¼ ì†ì„±", + +FontFormats : "Normal;Formatted;Address;Heading 1;Heading 2;Heading 3;Heading 4;Heading 5;Heading 6", + +// Alerts and Messages +ProcessingXHTML : "XHTML 처리중. 잠시만 기다려주십시요.", +Done : "완료", +PasteWordConfirm : "붙여넣기 í•  í…스트는 MS Wordì—ì„œ 복사한 것입니다. 붙여넣기 ì „ì— MS Word í¬ë©§ì„ 삭제하시겠습니까?", +NotCompatiblePaste : "ì´ ëª…ë ¹ì€ ì¸í„°ë„·ìµìŠ¤í”Œë¡œëŸ¬ 5.5 버전 ì´ìƒì—서만 ìž‘ë™í•©ë‹ˆë‹¤. í¬ë©§ì„ 삭제하지 ì•Šê³  붙여넣기 하시겠습니까?", +UnknownToolbarItem : "알수없는 툴바입니다. : \"%1\"", +UnknownCommand : "알수없는 기능입니다. : \"%1\"", +NotImplemented : "ê¸°ëŠ¥ì´ ì‹¤í–‰ë˜ì§€ 않았습니다.", +UnknownToolbarSet : "툴바 ì„¤ì •ì´ ì—†ìŠµë‹ˆë‹¤. : \"%1\"", +NoActiveX : "ë¸ŒëŸ¬ìš°ì €ì˜ ë³´ì•ˆ 설정으로 ì¸í•´ 몇몇 ê¸°ëŠ¥ì˜ ìž‘ë™ì— 장애가 ìžˆì„ ìˆ˜ 있습니다. \"액티브-액스 기능과 플러그 ì¸\" ì˜µì…˜ì„ í—ˆìš©í•˜ì—¬ 주시지 않으면 오류가 ë°œìƒí•  수 있습니다.", +BrowseServerBlocked : "브러우저 요소가 열리지 않습니다. íŒì—…차단 ì„¤ì •ì´ êº¼ì ¸ìžˆëŠ”ì§€ 확ì¸í•˜ì—¬ 주십시오.", +DialogBlocked : "윈ë„ìš° ëŒ€í™”ì°½ì„ ì—´ 수 없습니다. íŒì—…차단 ì„¤ì •ì´ êº¼ì ¸ìžˆëŠ”ì§€ 확ì¸í•˜ì—¬ 주십시오.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "예", +DlgBtnCancel : "아니오", +DlgBtnClose : "닫기", +DlgBtnBrowseServer : "서버 보기", +DlgAdvancedTag : "ìžì„¸ížˆ", +DlgOpOther : "<기타>", +DlgInfoTab : "ì •ë³´", +DlgAlertUrl : "URLì„ ìž…ë ¥í•˜ì‹­ì‹œìš”", + +// General Dialogs Labels +DlgGenNotSet : "<설정ë˜ì§€ ì•ŠìŒ>", +DlgGenId : "ID", +DlgGenLangDir : "쓰기 ë°©í–¥", +DlgGenLangDirLtr : "왼쪽ì—ì„œ 오른쪽 (LTR)", +DlgGenLangDirRtl : "오른쪽ì—ì„œ 왼쪽 (RTL)", +DlgGenLangCode : "언어 코드", +DlgGenAccessKey : "엑세스 키", +DlgGenName : "Name", +DlgGenTabIndex : "탭 순서", +DlgGenLongDescr : "URL 설명", +DlgGenClass : "Stylesheet Classes", +DlgGenTitle : "Advisory Title", +DlgGenContType : "Advisory Content Type", +DlgGenLinkCharset : "Linked Resource Charset", +DlgGenStyle : "Style", + +// Image Dialog +DlgImgTitle : "ì´ë¯¸ì§€ 설정", +DlgImgInfoTab : "ì´ë¯¸ì§€ ì •ë³´", +DlgImgBtnUpload : "서버로 전송", +DlgImgURL : "URL", +DlgImgUpload : "업로드", +DlgImgAlt : "ì´ë¯¸ì§€ 설명", +DlgImgWidth : "너비", +DlgImgHeight : "높ì´", +DlgImgLockRatio : "비율 유지", +DlgBtnResetSize : "ì›ëž˜ í¬ê¸°ë¡œ", +DlgImgBorder : "í…Œë‘리", +DlgImgHSpace : "수í‰ì—¬ë°±", +DlgImgVSpace : "수ì§ì—¬ë°±", +DlgImgAlign : "ì •ë ¬", +DlgImgAlignLeft : "왼쪽", +DlgImgAlignAbsBottom: "줄아래(Abs Bottom)", +DlgImgAlignAbsMiddle: "줄중간(Abs Middle)", +DlgImgAlignBaseline : "기준선", +DlgImgAlignBottom : "아래", +DlgImgAlignMiddle : "중간", +DlgImgAlignRight : "오른쪽", +DlgImgAlignTextTop : "글ìžìƒë‹¨", +DlgImgAlignTop : "위", +DlgImgPreview : "미리보기", +DlgImgAlertUrl : "ì´ë¯¸ì§€ URLì„ ìž…ë ¥í•˜ì‹­ì‹œìš”", +DlgImgLinkTab : "ë§í¬", + +// Flash Dialog +DlgFlashTitle : "플래쉬 등ë¡ì •ë³´", +DlgFlashChkPlay : "ìžë™ìž¬ìƒ", +DlgFlashChkLoop : "반복", +DlgFlashChkMenu : "플래쉬메뉴 가능", +DlgFlashScale : "ì˜ì—­", +DlgFlashScaleAll : "모ë‘보기", +DlgFlashScaleNoBorder : "경계선없ìŒ", +DlgFlashScaleFit : "ì˜ì—­ìžë™ì¡°ì ˆ", + +// Link Dialog +DlgLnkWindowTitle : "ë§í¬", +DlgLnkInfoTab : "ë§í¬ ì •ë³´", +DlgLnkTargetTab : "타겟", + +DlgLnkType : "ë§í¬ 종류", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "책갈피", +DlgLnkTypeEMail : "ì´ë©”ì¼", +DlgLnkProto : "프로토콜", +DlgLnkProtoOther : "<기타>", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "책갈피 ì„ íƒ", +DlgLnkAnchorByName : "책갈피 ì´ë¦„", +DlgLnkAnchorById : "책갈피 ID", +DlgLnkNoAnchors : "(ë¬¸ì„œì— ì±…ê°ˆí”¼ê°€ 없습니다.)", +DlgLnkEMail : "ì´ë©”ì¼ ì£¼ì†Œ", +DlgLnkEMailSubject : "제목", +DlgLnkEMailBody : "ë‚´ìš©", +DlgLnkUpload : "업로드", +DlgLnkBtnUpload : "서버로 전송", + +DlgLnkTarget : "타겟", +DlgLnkTargetFrame : "<프레임>", +DlgLnkTargetPopup : "<íŒì—…ì°½>", +DlgLnkTargetBlank : "새 ì°½ (_blank)", +DlgLnkTargetParent : "부모 ì°½ (_parent)", +DlgLnkTargetSelf : "현재 ì°½ (_self)", +DlgLnkTargetTop : "최 ìƒìœ„ ì°½ (_top)", +DlgLnkTargetFrameName : "타겟 프레임 ì´ë¦„", +DlgLnkPopWinName : "íŒì—…ì°½ ì´ë¦„", +DlgLnkPopWinFeat : "íŒì—…ì°½ 설정", +DlgLnkPopResize : "í¬ê¸°ì¡°ì •", +DlgLnkPopLocation : "주소표시줄", +DlgLnkPopMenu : "메뉴바", +DlgLnkPopScroll : "스í¬ë¡¤ë°”", +DlgLnkPopStatus : "ìƒíƒœë°”", +DlgLnkPopToolbar : "툴바", +DlgLnkPopFullScrn : "전체화면 (IE)", +DlgLnkPopDependent : "Dependent (Netscape)", +DlgLnkPopWidth : "너비", +DlgLnkPopHeight : "높ì´", +DlgLnkPopLeft : "왼쪽 위치", +DlgLnkPopTop : "윗쪽 위치", + +DlnLnkMsgNoUrl : "ë§í¬ URLì„ ìž…ë ¥í•˜ì‹­ì‹œìš”.", +DlnLnkMsgNoEMail : "ì´ë©”ì¼ì£¼ì†Œë¥¼ 입력하십시요.", +DlnLnkMsgNoAnchor : "ì±…ê°ˆí”¼ëª…ì„ ìž…ë ¥í•˜ì‹­ì‹œìš”.", +DlnLnkMsgInvPopName : "íŒì—…ì°½ì˜ íƒ€ì´í‹€ì€ ê³µë°±ì„ í—ˆìš©í•˜ì§€ 않습니다.", + +// Color Dialog +DlgColorTitle : "ìƒ‰ìƒ ì„ íƒ", +DlgColorBtnClear : "지우기", +DlgColorHighlight : "현재", +DlgColorSelected : "ì„ íƒë¨", + +// Smiley Dialog +DlgSmileyTitle : "ì•„ì´ì½˜ 삽입", + +// Special Character Dialog +DlgSpecialCharTitle : "íŠ¹ìˆ˜ë¬¸ìž ì„ íƒ", + +// Table Dialog +DlgTableTitle : "í‘œ 설정", +DlgTableRows : "가로줄", +DlgTableColumns : "세로줄", +DlgTableBorder : "í…Œë‘리 í¬ê¸°", +DlgTableAlign : "ì •ë ¬", +DlgTableAlignNotSet : "<설정ë˜ì§€ ì•ŠìŒ>", +DlgTableAlignLeft : "왼쪽", +DlgTableAlignCenter : "가운ë°", +DlgTableAlignRight : "오른쪽", +DlgTableWidth : "너비", +DlgTableWidthPx : "픽셀", +DlgTableWidthPc : "í¼ì„¼íŠ¸", +DlgTableHeight : "높ì´", +DlgTableCellSpace : "ì…€ 간격", +DlgTableCellPad : "ì…€ 여백", +DlgTableCaption : "캡션", +DlgTableSummary : "Summary", //MISSING +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "ì…€ 설정", +DlgCellWidth : "너비", +DlgCellWidthPx : "픽셀", +DlgCellWidthPc : "í¼ì„¼íŠ¸", +DlgCellHeight : "높ì´", +DlgCellWordWrap : "워드랩", +DlgCellWordWrapNotSet : "<설정ë˜ì§€ ì•ŠìŒ>", +DlgCellWordWrapYes : "예", +DlgCellWordWrapNo : "아니오", +DlgCellHorAlign : "ìˆ˜í‰ ì •ë ¬", +DlgCellHorAlignNotSet : "<설정ë˜ì§€ ì•ŠìŒ>", +DlgCellHorAlignLeft : "왼쪽", +DlgCellHorAlignCenter : "가운ë°", +DlgCellHorAlignRight: "오른쪽", +DlgCellVerAlign : "ìˆ˜ì§ ì •ë ¬", +DlgCellVerAlignNotSet : "<설정ë˜ì§€ ì•ŠìŒ>", +DlgCellVerAlignTop : "위", +DlgCellVerAlignMiddle : "중간", +DlgCellVerAlignBottom : "아래", +DlgCellVerAlignBaseline : "기준선", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "세로 합치기", +DlgCellCollSpan : "가로 합치기", +DlgCellBackColor : "ë°°ê²½ 색ìƒ", +DlgCellBorderColor : "í…Œë‘리 색ìƒ", +DlgCellBtnSelect : "ì„ íƒ", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "찾기 & 바꾸기", + +// Find Dialog +DlgFindTitle : "찾기", +DlgFindFindBtn : "찾기", +DlgFindNotFoundMsg : "문ìžì—´ì„ ì°¾ì„ ìˆ˜ 없습니다.", + +// Replace Dialog +DlgReplaceTitle : "바꾸기", +DlgReplaceFindLbl : "ì°¾ì„ ë¬¸ìžì—´:", +DlgReplaceReplaceLbl : "바꿀 문ìžì—´:", +DlgReplaceCaseChk : "ëŒ€ì†Œë¬¸ìž êµ¬ë¶„", +DlgReplaceReplaceBtn : "바꾸기", +DlgReplaceReplAllBtn : "ëª¨ë‘ ë°”ê¾¸ê¸°", +DlgReplaceWordChk : "온전한 단어", + +// Paste Operations / Dialog +PasteErrorCut : "브ë¼ìš°ì €ì˜ ë³´ì•ˆì„¤ì •ë•Œë¬¸ì— ìž˜ë¼ë‚´ê¸° ê¸°ëŠ¥ì„ ì‹¤í–‰í•  수 없습니다. 키보드 ëª…ë ¹ì„ ì‚¬ìš©í•˜ì‹­ì‹œìš”. (Ctrl+X).", +PasteErrorCopy : "브ë¼ìš°ì €ì˜ ë³´ì•ˆì„¤ì •ë•Œë¬¸ì— ë³µì‚¬í•˜ê¸° ê¸°ëŠ¥ì„ ì‹¤í–‰í•  수 없습니다. 키보드 ëª…ë ¹ì„ ì‚¬ìš©í•˜ì‹­ì‹œìš”. (Ctrl+C).", + +PasteAsText : "í…스트로 붙여넣기", +PasteFromWord : "MS Word 형ì‹ì—ì„œ 붙여넣기", + +DlgPasteMsg2 : "í‚¤ë³´ë“œì˜ (Ctrl+V) 를 ì´ìš©í•´ì„œ ìƒìžì•ˆì— 붙여넣고 OK 를 누르세요.", +DlgPasteSec : "브러우저 보안 설정으로 ì¸í•´, í´ë¦½ë³´ë“œì˜ ìžë£Œë¥¼ ì§ì ‘ 접근할 수 없습니다. ì´ ì°½ì— ë‹¤ì‹œ 붙여넣기 하십시오.", +DlgPasteIgnoreFont : "í°íŠ¸ 설정 무시", +DlgPasteRemoveStyles : "ìŠ¤íƒ€ì¼ ì •ì˜ ì œê±°", + +// Color Picker +ColorAutomatic : "기본색ìƒ", +ColorMoreColors : "색ìƒì„ íƒ...", + +// Document Properties +DocProps : "문서 ì†ì„±", + +// Anchor Dialog +DlgAnchorTitle : "책갈피 ì†ì„±", +DlgAnchorName : "책갈피 ì´ë¦„", +DlgAnchorErrorName : "책갈피 ì´ë¦„ì„ ìž…ë ¥í•˜ì‹­ì‹œìš”.", + +// Speller Pages Dialog +DlgSpellNotInDic : "ì‚¬ì „ì— ì—†ëŠ” 단어", +DlgSpellChangeTo : "변경할 단어", +DlgSpellBtnIgnore : "건너뜀", +DlgSpellBtnIgnoreAll : "ëª¨ë‘ ê±´ë„ˆëœ€", +DlgSpellBtnReplace : "변경", +DlgSpellBtnReplaceAll : "ëª¨ë‘ ë³€ê²½", +DlgSpellBtnUndo : "취소", +DlgSpellNoSuggestions : "- 추천단어 ì—†ìŒ -", +DlgSpellProgress : "ì² ìžê²€ì‚¬ë¥¼ 진행중입니다...", +DlgSpellNoMispell : "ì² ìžê²€ì‚¬ 완료: ìž˜ëª»ëœ ì² ìžê°€ 없습니다.", +DlgSpellNoChanges : "ì² ìžê²€ì‚¬ 완료: ë³€ê²½ëœ ë‹¨ì–´ê°€ 없습니다.", +DlgSpellOneChange : "ì² ìžê²€ì‚¬ 완료: 단어가 변경ë˜ì—ˆìŠµë‹ˆë‹¤.", +DlgSpellManyChanges : "ì² ìžê²€ì‚¬ 완료: %1 단어가 변경ë˜ì—ˆìŠµë‹ˆë‹¤.", + +IeSpellDownload : "ì² ìž ê²€ì‚¬ê¸°ê°€ 철치ë˜ì§€ 않았습니다. 지금 다운로드하시겠습니까?", + +// Button Dialog +DlgButtonText : "버튼글ìž(ê°’)", +DlgButtonType : "버튼종류", +DlgButtonTypeBtn : "Button", //MISSING +DlgButtonTypeSbm : "Submit", //MISSING +DlgButtonTypeRst : "Reset", //MISSING + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "ì´ë¦„", +DlgCheckboxValue : "ê°’", +DlgCheckboxSelected : "ì„ íƒë¨", + +// Form Dialog +DlgFormName : "í¼ì´ë¦„", +DlgFormAction : "실행경로(Action)", +DlgFormMethod : "방법(Method)", + +// Select Field Dialog +DlgSelectName : "ì´ë¦„", +DlgSelectValue : "ê°’", +DlgSelectSize : "세로í¬ê¸°", +DlgSelectLines : "줄", +DlgSelectChkMulti : "여러항목 ì„ íƒ í—ˆìš©", +DlgSelectOpAvail : "ì„ íƒì˜µì…˜", +DlgSelectOpText : "ì´ë¦„", +DlgSelectOpValue : "ê°’", +DlgSelectBtnAdd : "추가", +DlgSelectBtnModify : "변경", +DlgSelectBtnUp : "위로", +DlgSelectBtnDown : "아래로", +DlgSelectBtnSetValue : "ì„ íƒëœê²ƒìœ¼ë¡œ 설정", +DlgSelectBtnDelete : "ì‚­ì œ", + +// Textarea Dialog +DlgTextareaName : "ì´ë¦„", +DlgTextareaCols : "칸수", +DlgTextareaRows : "줄수", + +// Text Field Dialog +DlgTextName : "ì´ë¦„", +DlgTextValue : "ê°’", +DlgTextCharWidth : "ê¸€ìž ë„ˆë¹„", +DlgTextMaxChars : "최대 글ìžìˆ˜", +DlgTextType : "종류", +DlgTextTypeText : "문ìžì—´", +DlgTextTypePass : "비밀번호", + +// Hidden Field Dialog +DlgHiddenName : "ì´ë¦„", +DlgHiddenValue : "ê°’", + +// Bulleted List Dialog +BulletedListProp : "순서없는 ëª©ë¡ ì†ì„±", +NumberedListProp : "순서있는 ëª©ë¡ ì†ì„±", +DlgLstStart : "Start", //MISSING +DlgLstType : "종류", +DlgLstTypeCircle : "ì›(Circle)", +DlgLstTypeDisc : "Disc", //MISSING +DlgLstTypeSquare : "네모ì (Square)", +DlgLstTypeNumbers : "번호 (1, 2, 3)", +DlgLstTypeLCase : "ì†Œë¬¸ìž (a, b, c)", +DlgLstTypeUCase : "ëŒ€ë¬¸ìž (A, B, C)", +DlgLstTypeSRoman : "ë¡œë§ˆìž ìˆ˜ë¬¸ìž (i, ii, iii)", +DlgLstTypeLRoman : "ë¡œë§ˆìž ëŒ€ë¬¸ìž (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "ì¼ë°˜", +DlgDocBackTab : "ë°°ê²½", +DlgDocColorsTab : "ìƒ‰ìƒ ë° ì—¬ë°±", +DlgDocMetaTab : "메타ë°ì´í„°", + +DlgDocPageTitle : "페ì´ì§€ëª…", +DlgDocLangDir : "ë¬¸ìž ì“°ê¸°ë°©í–¥", +DlgDocLangDirLTR : "왼쪽ì—ì„œ 오른쪽 (LTR)", +DlgDocLangDirRTL : "오른쪽ì—ì„œ 왼쪽 (RTL)", +DlgDocLangCode : "언어코드", +DlgDocCharSet : "ìºë¦­í„°ì…‹ ì¸ì½”딩", +DlgDocCharSetCE : "Central European", //MISSING +DlgDocCharSetCT : "Chinese Traditional (Big5)", //MISSING +DlgDocCharSetCR : "Cyrillic", //MISSING +DlgDocCharSetGR : "Greek", //MISSING +DlgDocCharSetJP : "Japanese", //MISSING +DlgDocCharSetKR : "Korean", //MISSING +DlgDocCharSetTR : "Turkish", //MISSING +DlgDocCharSetUN : "Unicode (UTF-8)", //MISSING +DlgDocCharSetWE : "Western European", //MISSING +DlgDocCharSetOther : "다른 ìºë¦­í„°ì…‹ ì¸ì½”딩", + +DlgDocDocType : "문서 헤드", +DlgDocDocTypeOther : "다른 문서헤드", +DlgDocIncXHTML : "XHTML ë¬¸ì„œì •ì˜ í¬í•¨", +DlgDocBgColor : "배경색ìƒ", +DlgDocBgImage : "ë°°ê²½ì´ë¯¸ì§€ URL", +DlgDocBgNoScroll : "스í¬ë¡¤ë˜ì§€ì•ŠëŠ” ë°°ê²½", +DlgDocCText : "í…스트", +DlgDocCLink : "ë§í¬", +DlgDocCVisited : "방문한 ë§í¬(Visited)", +DlgDocCActive : "í™œì„±í™”ëœ ë§í¬(Active)", +DlgDocMargins : "페ì´ì§€ 여백", +DlgDocMaTop : "위", +DlgDocMaLeft : "왼쪽", +DlgDocMaRight : "오른쪽", +DlgDocMaBottom : "아래", +DlgDocMeIndex : "문서 키워드 (콤마로 구분)", +DlgDocMeDescr : "문서 설명", +DlgDocMeAuthor : "작성ìž", +DlgDocMeCopy : "저작권", +DlgDocPreview : "미리보기", + +// Templates Dialog +Templates : "템플릿", +DlgTemplatesTitle : "ë‚´ìš© 템플릿", +DlgTemplatesSelMsg : "ì—디터ì—ì„œ 사용할 í…œí”Œë¦¿ì„ ì„ íƒí•˜ì‹­ì‹œìš”.
    (지금까지 ìž‘ì„±ëœ ë‚´ìš©ì€ ì‚¬ë¼ì§‘니다.):", +DlgTemplatesLoading : "템플릿 목ë¡ì„ 불러오는중입니다. 잠시만 기다려주십시요.", +DlgTemplatesNoTpl : "(í…œí”Œë¦¿ì´ ì—†ìŠµë‹ˆë‹¤.)", +DlgTemplatesReplace : "현재 ë‚´ìš© 바꾸기", + +// About Dialog +DlgAboutAboutTab : "About", +DlgAboutBrowserInfoTab : "브ë¼ìš°ì € ì •ë³´", +DlgAboutLicenseTab : "License", //MISSING +DlgAboutVersion : "버전", +DlgAboutInfo : "ë” ë§Žì€ ì •ë³´ë¥¼ 보시려면 ë‹¤ìŒ ì‚¬ì´íŠ¸ë¡œ 가십시오.", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/lt.js b/webdir/fckeditor/editor/lang/lt.js new file mode 100644 index 0000000..3b9e6d6 --- /dev/null +++ b/webdir/fckeditor/editor/lang/lt.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Lithuanian language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "Sutraukti mygtukų juostÄ…", +ToolbarExpand : "IÅ¡plÄ—sti mygtukų juostÄ…", + +// Toolbar Items and Context Menu +Save : "IÅ¡saugoti", +NewPage : "Naujas puslapis", +Preview : "PeržiÅ«ra", +Cut : "IÅ¡kirpti", +Copy : "Kopijuoti", +Paste : "Ä®dÄ—ti", +PasteText : "Ä®dÄ—ti kaip grynÄ… tekstÄ…", +PasteWord : "Ä®dÄ—ti iÅ¡ Word", +Print : "Spausdinti", +SelectAll : "PažymÄ—ti viskÄ…", +RemoveFormat : "Panaikinti formatÄ…", +InsertLinkLbl : "Nuoroda", +InsertLink : "Ä®terpti/taisyti nuorodÄ…", +RemoveLink : "Panaikinti nuorodÄ…", +VisitLink : "Open Link", //MISSING +Anchor : "Ä®terpti/modifikuoti žymÄ™", +AnchorDelete : "Remove Anchor", //MISSING +InsertImageLbl : "Vaizdas", +InsertImage : "Ä®terpti/taisyti vaizdÄ…", +InsertFlashLbl : "Flash", +InsertFlash : "Ä®terpti/taisyti Flash", +InsertTableLbl : "LentelÄ—", +InsertTable : "Ä®terpti/taisyti lentelÄ™", +InsertLineLbl : "Linija", +InsertLine : "Ä®terpti horizontaliÄ… linijÄ…", +InsertSpecialCharLbl: "Spec. simbolis", +InsertSpecialChar : "Ä®terpti specialų simbolį", +InsertSmileyLbl : "Veideliai", +InsertSmiley : "Ä®terpti veidelį", +About : "Apie FCKeditor", +Bold : "Pusjuodis", +Italic : "Kursyvas", +Underline : "Pabrauktas", +StrikeThrough : "Perbrauktas", +Subscript : "Apatinis indeksas", +Superscript : "VirÅ¡utinis indeksas", +LeftJustify : "Lygiuoti kairÄ™", +CenterJustify : "Centruoti", +RightJustify : "Lygiuoti deÅ¡inÄ™", +BlockJustify : "Lygiuoti abi puses", +DecreaseIndent : "Sumažinti įtraukÄ…", +IncreaseIndent : "Padidinti įtraukÄ…", +Blockquote : "Blockquote", //MISSING +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "AtÅ¡aukti", +Redo : "Atstatyti", +NumberedListLbl : "Numeruotas sÄ…raÅ¡as", +NumberedList : "Ä®terpti/Panaikinti numeruotÄ… sÄ…raÅ¡Ä…", +BulletedListLbl : "Suženklintas sÄ…raÅ¡as", +BulletedList : "Ä®terpti/Panaikinti suženklintÄ… sÄ…raÅ¡Ä…", +ShowTableBorders : "Rodyti lentelÄ—s rÄ—mus", +ShowDetails : "Rodyti detales", +Style : "Stilius", +FontFormat : "Å rifto formatas", +Font : "Å riftas", +FontSize : "Å rifto dydis", +TextColor : "Teksto spalva", +BGColor : "Fono spalva", +Source : "Å altinis", +Find : "Rasti", +Replace : "Pakeisti", +SpellCheck : "RaÅ¡ybos tikrinimas", +UniversalKeyboard : "Universali klaviatÅ«ra", +PageBreakLbl : "Puslapių skirtukas", +PageBreak : "Ä®terpti puslapių skirtukÄ…", + +Form : "Forma", +Checkbox : "Žymimasis langelis", +RadioButton : "Žymimoji akutÄ—", +TextField : "Teksto laukas", +Textarea : "Teksto sritis", +HiddenField : "Nerodomas laukas", +Button : "Mygtukas", +SelectionField : "Atrankos laukas", +ImageButton : "Vaizdinis mygtukas", + +FitWindow : "Maximize the editor size", //MISSING +ShowBlocks : "Show Blocks", //MISSING + +// Context Menu +EditLink : "Taisyti nuorodÄ…", +CellCM : "Cell", //MISSING +RowCM : "Row", //MISSING +ColumnCM : "Column", //MISSING +InsertRowAfter : "Insert Row After", //MISSING +InsertRowBefore : "Insert Row Before", //MISSING +DeleteRows : "Å alinti eilutes", +InsertColumnAfter : "Insert Column After", //MISSING +InsertColumnBefore : "Insert Column Before", //MISSING +DeleteColumns : "Å alinti stulpelius", +InsertCellAfter : "Insert Cell After", //MISSING +InsertCellBefore : "Insert Cell Before", //MISSING +DeleteCells : "Å alinti langelius", +MergeCells : "Sujungti langelius", +MergeRight : "Merge Right", //MISSING +MergeDown : "Merge Down", //MISSING +HorizontalSplitCell : "Split Cell Horizontally", //MISSING +VerticalSplitCell : "Split Cell Vertically", //MISSING +TableDelete : "Å alinti lentelÄ™", +CellProperties : "Langelio savybÄ—s", +TableProperties : "LentelÄ—s savybÄ—s", +ImageProperties : "Vaizdo savybÄ—s", +FlashProperties : "Flash savybÄ—s", + +AnchorProp : "ŽymÄ—s savybÄ—s", +ButtonProp : "Mygtuko savybÄ—s", +CheckboxProp : "Žymimojo langelio savybÄ—s", +HiddenFieldProp : "Nerodomo lauko savybÄ—s", +RadioButtonProp : "Žymimosios akutÄ—s savybÄ—s", +ImageButtonProp : "Vaizdinio mygtuko savybÄ—s", +TextFieldProp : "Teksto lauko savybÄ—s", +SelectionFieldProp : "Atrankos lauko savybÄ—s", +TextareaProp : "Teksto srities savybÄ—s", +FormProp : "Formos savybÄ—s", + +FontFormats : "Normalus;Formuotas;Kreipinio;AntraÅ¡tinis 1;AntraÅ¡tinis 2;AntraÅ¡tinis 3;AntraÅ¡tinis 4;AntraÅ¡tinis 5;AntraÅ¡tinis 6", + +// Alerts and Messages +ProcessingXHTML : "Apdorojamas XHTML. PraÅ¡ome palaukti...", +Done : "Baigta", +PasteWordConfirm : "Ä®dedamas tekstas yra panaÅ¡us į kopijÄ… iÅ¡ Word. Ar JÅ«s norite prieÅ¡ įdÄ—jimÄ… iÅ¡valyti jį?", +NotCompatiblePaste : "Å i komanda yra prieinama tik per Internet Explorer 5.5 ar aukÅ¡tesnÄ™ versijÄ…. Ar JÅ«s norite įterpti be valymo?", +UnknownToolbarItem : "Nežinomas mygtukų juosta elementas \"%1\"", +UnknownCommand : "Nežinomas komandos vardas \"%1\"", +NotImplemented : "Komanda nÄ—ra įgyvendinta", +UnknownToolbarSet : "Mygtukų juostos rinkinys \"%1\" neegzistuoja", +NoActiveX : "JÅ«sų narÅ¡yklÄ—s saugumo nuostatos gali riboti kai kurias redaktoriaus savybes. JÅ«s turite aktyvuoti opcijÄ… \"Run ActiveX controls and plug-ins\". Kitu atveju Jums bus praneÅ¡ama apie klaidas ir trÅ«kstamas savybes.", +BrowseServerBlocked : "Neįmanoma atidaryti naujo narÅ¡yklÄ—s lango. Ä®sitikinkite, kad iÅ¡kylanÄių langų blokavimo programos neveiksnios.", +DialogBlocked : "Neįmanoma atidaryti dialogo lango. Ä®sitikinkite, kad iÅ¡kylanÄių langų blokavimo programos neveiksnios.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "OK", +DlgBtnCancel : "Nutraukti", +DlgBtnClose : "Uždaryti", +DlgBtnBrowseServer : "NarÅ¡yti po serverį", +DlgAdvancedTag : "Papildomas", +DlgOpOther : "", +DlgInfoTab : "Informacija", +DlgAlertUrl : "PraÅ¡ome įraÅ¡yti URL", + +// General Dialogs Labels +DlgGenNotSet : "", +DlgGenId : "Id", +DlgGenLangDir : "Teksto kryptis", +DlgGenLangDirLtr : "IÅ¡ kairÄ—s į deÅ¡inÄ™ (LTR)", +DlgGenLangDirRtl : "IÅ¡ deÅ¡inÄ—s į kairÄ™ (RTL)", +DlgGenLangCode : "Kalbos kodas", +DlgGenAccessKey : "Prieigos raktas", +DlgGenName : "Vardas", +DlgGenTabIndex : "Tabuliavimo indeksas", +DlgGenLongDescr : "Ilgas apraÅ¡ymas URL", +DlgGenClass : "Stilių lentelÄ—s klasÄ—s", +DlgGenTitle : "KonsultacinÄ— antraÅ¡tÄ—", +DlgGenContType : "Konsultacinio turinio tipas", +DlgGenLinkCharset : "Susietų iÅ¡teklių simbolių lentelÄ—", +DlgGenStyle : "Stilius", + +// Image Dialog +DlgImgTitle : "Vaizdo savybÄ—s", +DlgImgInfoTab : "Vaizdo informacija", +DlgImgBtnUpload : "Siųsti į serverį", +DlgImgURL : "URL", +DlgImgUpload : "Nusiųsti", +DlgImgAlt : "Alternatyvus Tekstas", +DlgImgWidth : "Plotis", +DlgImgHeight : "AukÅ¡tis", +DlgImgLockRatio : "IÅ¡laikyti proporcijÄ…", +DlgBtnResetSize : "Atstatyti dydį", +DlgImgBorder : "RÄ—melis", +DlgImgHSpace : "Hor.ErdvÄ—", +DlgImgVSpace : "Vert.ErdvÄ—", +DlgImgAlign : "Lygiuoti", +DlgImgAlignLeft : "KairÄ™", +DlgImgAlignAbsBottom: "AbsoliuÄiÄ… apaÄiÄ…", +DlgImgAlignAbsMiddle: "Absoliutų vidurį", +DlgImgAlignBaseline : "ApatinÄ™ linijÄ…", +DlgImgAlignBottom : "ApaÄiÄ…", +DlgImgAlignMiddle : "Vidurį", +DlgImgAlignRight : "DeÅ¡inÄ™", +DlgImgAlignTextTop : "Teksto virÅ¡Å«nÄ™", +DlgImgAlignTop : "VirÅ¡Å«nÄ™", +DlgImgPreview : "PeržiÅ«ra", +DlgImgAlertUrl : "PraÅ¡ome įvesti vaizdo URL", +DlgImgLinkTab : "Nuoroda", + +// Flash Dialog +DlgFlashTitle : "Flash savybÄ—s", +DlgFlashChkPlay : "Automatinis paleidimas", +DlgFlashChkLoop : "Ciklas", +DlgFlashChkMenu : "Leisti Flash meniu", +DlgFlashScale : "Mastelis", +DlgFlashScaleAll : "Rodyti visÄ…", +DlgFlashScaleNoBorder : "Be rÄ—melio", +DlgFlashScaleFit : "Tikslus atitikimas", + +// Link Dialog +DlgLnkWindowTitle : "Nuoroda", +DlgLnkInfoTab : "Nuorodos informacija", +DlgLnkTargetTab : "Paskirtis", + +DlgLnkType : "Nuorodos tipas", +DlgLnkTypeURL : "URL", +DlgLnkTypeAnchor : "ŽymÄ— Å¡iame puslapyje", +DlgLnkTypeEMail : "El.paÅ¡tas", +DlgLnkProto : "Protokolas", +DlgLnkProtoOther : "", +DlgLnkURL : "URL", +DlgLnkAnchorSel : "Pasirinkite žymÄ™", +DlgLnkAnchorByName : "Pagal žymÄ—s vardÄ…", +DlgLnkAnchorById : "Pagal žymÄ—s Id", +DlgLnkNoAnchors : "(Å iame dokumente žymių nÄ—ra)", +DlgLnkEMail : "El.paÅ¡to adresas", +DlgLnkEMailSubject : "ŽinutÄ—s tema", +DlgLnkEMailBody : "ŽinutÄ—s turinys", +DlgLnkUpload : "Siųsti", +DlgLnkBtnUpload : "Siųsti į serverį", + +DlgLnkTarget : "Paskirties vieta", +DlgLnkTargetFrame : "", +DlgLnkTargetPopup : "", +DlgLnkTargetBlank : "Naujas langas (_blank)", +DlgLnkTargetParent : "Pirminis langas (_parent)", +DlgLnkTargetSelf : "Tas pats langas (_self)", +DlgLnkTargetTop : "Svarbiausias langas (_top)", +DlgLnkTargetFrameName : "Paskirties kadro vardas", +DlgLnkPopWinName : "Paskirties lango vardas", +DlgLnkPopWinFeat : "IÅ¡skleidžiamo lango savybÄ—s", +DlgLnkPopResize : "KeiÄiamas dydis", +DlgLnkPopLocation : "Adreso juosta", +DlgLnkPopMenu : "Meniu juosta", +DlgLnkPopScroll : "Slinkties juostos", +DlgLnkPopStatus : "BÅ«senos juosta", +DlgLnkPopToolbar : "Mygtukų juosta", +DlgLnkPopFullScrn : "Visas ekranas (IE)", +DlgLnkPopDependent : "Priklausomas (Netscape)", +DlgLnkPopWidth : "Plotis", +DlgLnkPopHeight : "AukÅ¡tis", +DlgLnkPopLeft : "KairÄ— pozicija", +DlgLnkPopTop : "VirÅ¡utinÄ— pozicija", + +DlnLnkMsgNoUrl : "PraÅ¡ome įvesti nuorodos URL", +DlnLnkMsgNoEMail : "PraÅ¡ome įvesti el.paÅ¡to adresÄ…", +DlnLnkMsgNoAnchor : "PraÅ¡ome pasirinkti žymÄ™", +DlnLnkMsgInvPopName : "The popup name must begin with an alphabetic character and must not contain spaces", //MISSING + +// Color Dialog +DlgColorTitle : "Pasirinkite spalvÄ…", +DlgColorBtnClear : "Trinti", +DlgColorHighlight : "ParyÅ¡kinta", +DlgColorSelected : "PažymÄ—ta", + +// Smiley Dialog +DlgSmileyTitle : "Ä®terpti veidelį", + +// Special Character Dialog +DlgSpecialCharTitle : "Pasirinkite specialų simbolį", + +// Table Dialog +DlgTableTitle : "LentelÄ—s savybÄ—s", +DlgTableRows : "EilutÄ—s", +DlgTableColumns : "Stulpeliai", +DlgTableBorder : "RÄ—melio dydis", +DlgTableAlign : "Lygiuoti", +DlgTableAlignNotSet : "", +DlgTableAlignLeft : "KairÄ™", +DlgTableAlignCenter : "CentrÄ…", +DlgTableAlignRight : "DeÅ¡inÄ™", +DlgTableWidth : "Plotis", +DlgTableWidthPx : "taÅ¡kais", +DlgTableWidthPc : "procentais", +DlgTableHeight : "AukÅ¡tis", +DlgTableCellSpace : "Tarpas tarp langelių", +DlgTableCellPad : "Trapas nuo langelio rÄ—mo iki teksto", +DlgTableCaption : "AntraÅ¡tÄ—", +DlgTableSummary : "Santrauka", +DlgTableHeaders : "Headers", //MISSING +DlgTableHeadersNone : "None", //MISSING +DlgTableHeadersColumn : "First column", //MISSING +DlgTableHeadersRow : "First Row", //MISSING +DlgTableHeadersBoth : "Both", //MISSING + +// Table Cell Dialog +DlgCellTitle : "Langelio savybÄ—s", +DlgCellWidth : "Plotis", +DlgCellWidthPx : "taÅ¡kais", +DlgCellWidthPc : "procentais", +DlgCellHeight : "AukÅ¡tis", +DlgCellWordWrap : "Teksto laužymas", +DlgCellWordWrapNotSet : "", +DlgCellWordWrapYes : "Taip", +DlgCellWordWrapNo : "Ne", +DlgCellHorAlign : "Horizontaliai lygiuoti", +DlgCellHorAlignNotSet : "", +DlgCellHorAlignLeft : "KairÄ™", +DlgCellHorAlignCenter : "CentrÄ…", +DlgCellHorAlignRight: "DeÅ¡inÄ™", +DlgCellVerAlign : "Vertikaliai lygiuoti", +DlgCellVerAlignNotSet : "", +DlgCellVerAlignTop : "Viršų", +DlgCellVerAlignMiddle : "Vidurį", +DlgCellVerAlignBottom : "ApaÄiÄ…", +DlgCellVerAlignBaseline : "ApatinÄ™ linijÄ…", +DlgCellType : "Cell Type", //MISSING +DlgCellTypeData : "Data", //MISSING +DlgCellTypeHeader : "Header", //MISSING +DlgCellRowSpan : "EiluÄių apjungimas", +DlgCellCollSpan : "Stulpelių apjungimas", +DlgCellBackColor : "Fono spalva", +DlgCellBorderColor : "RÄ—melio spalva", +DlgCellBtnSelect : "PažymÄ—ti...", + +// Find and Replace Dialog +DlgFindAndReplaceTitle : "Find and Replace", //MISSING + +// Find Dialog +DlgFindTitle : "PaieÅ¡ka", +DlgFindFindBtn : "Surasti", +DlgFindNotFoundMsg : "Nurodytas tekstas nerastas.", + +// Replace Dialog +DlgReplaceTitle : "Pakeisti", +DlgReplaceFindLbl : "Surasti tekstÄ…:", +DlgReplaceReplaceLbl : "Pakeisti tekstu:", +DlgReplaceCaseChk : "Skirti didžiÄ…sias ir mažąsias raides", +DlgReplaceReplaceBtn : "Pakeisti", +DlgReplaceReplAllBtn : "Pakeisti viskÄ…", +DlgReplaceWordChk : "Atitikti pilnÄ… žodį", + +// Paste Operations / Dialog +PasteErrorCut : "JÅ«sų narÅ¡yklÄ—s saugumo nustatymai neleidžia redaktoriui automatiÅ¡kai įvykdyti iÅ¡kirpimo operacijų. Tam praÅ¡ome naudoti klaviatÅ«rÄ… (Ctrl+X).", +PasteErrorCopy : "JÅ«sų narÅ¡yklÄ—s saugumo nustatymai neleidžia redaktoriui automatiÅ¡kai įvykdyti kopijavimo operacijų. Tam praÅ¡ome naudoti klaviatÅ«rÄ… (Ctrl+C).", + +PasteAsText : "Ä®dÄ—ti kaip grynÄ… tekstÄ…", +PasteFromWord : "Ä®dÄ—ti iÅ¡ Word", + +DlgPasteMsg2 : "Žemiau esanÄiame įvedimo lauke įdÄ—kite tekstÄ…, naudodami klaviatÅ«rÄ… (Ctrl+V) ir spÅ«stelkite mygtukÄ… OK.", +DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", //MISSING +DlgPasteIgnoreFont : "Ignoruoti Å¡riftų nustatymus", +DlgPasteRemoveStyles : "PaÅ¡alinti stilių nustatymus", + +// Color Picker +ColorAutomatic : "Automatinis", +ColorMoreColors : "Daugiau spalvų...", + +// Document Properties +DocProps : "Dokumento savybÄ—s", + +// Anchor Dialog +DlgAnchorTitle : "ŽymÄ—s savybÄ—s", +DlgAnchorName : "ŽymÄ—s vardas", +DlgAnchorErrorName : "PraÅ¡ome įvesti žymÄ—s vardÄ…", + +// Speller Pages Dialog +DlgSpellNotInDic : "Žodyne nerastas", +DlgSpellChangeTo : "Pakeisti į", +DlgSpellBtnIgnore : "Ignoruoti", +DlgSpellBtnIgnoreAll : "Ignoruoti visus", +DlgSpellBtnReplace : "Pakeisti", +DlgSpellBtnReplaceAll : "Pakeisti visus", +DlgSpellBtnUndo : "AtÅ¡aukti", +DlgSpellNoSuggestions : "- NÄ—ra pasiÅ«lymų -", +DlgSpellProgress : "Vyksta raÅ¡ybos tikrinimas...", +DlgSpellNoMispell : "RaÅ¡ybos tikrinimas baigtas: Nerasta raÅ¡ybos klaidų", +DlgSpellNoChanges : "RaÅ¡ybos tikrinimas baigtas: NÄ—ra pakeistų žodžių", +DlgSpellOneChange : "RaÅ¡ybos tikrinimas baigtas: Vienas žodis pakeistas", +DlgSpellManyChanges : "RaÅ¡ybos tikrinimas baigtas: Pakeista %1 žodžių", + +IeSpellDownload : "RaÅ¡ybos tikrinimas neinstaliuotas. Ar JÅ«s norite jį dabar atsisiųsti?", + +// Button Dialog +DlgButtonText : "Tekstas (ReikÅ¡mÄ—)", +DlgButtonType : "Tipas", +DlgButtonTypeBtn : "Button", //MISSING +DlgButtonTypeSbm : "Submit", //MISSING +DlgButtonTypeRst : "Reset", //MISSING + +// Checkbox and Radio Button Dialogs +DlgCheckboxName : "Vardas", +DlgCheckboxValue : "ReikÅ¡mÄ—", +DlgCheckboxSelected : "PažymÄ—tas", + +// Form Dialog +DlgFormName : "Vardas", +DlgFormAction : "Veiksmas", +DlgFormMethod : "Metodas", + +// Select Field Dialog +DlgSelectName : "Vardas", +DlgSelectValue : "ReikÅ¡mÄ—", +DlgSelectSize : "Dydis", +DlgSelectLines : "eiluÄių", +DlgSelectChkMulti : "Leisti daugeriopÄ… atrankÄ…", +DlgSelectOpAvail : "Galimos parinktys", +DlgSelectOpText : "Tekstas", +DlgSelectOpValue : "ReikÅ¡mÄ—", +DlgSelectBtnAdd : "Ä®traukti", +DlgSelectBtnModify : "Modifikuoti", +DlgSelectBtnUp : "AukÅ¡tyn", +DlgSelectBtnDown : "Žemyn", +DlgSelectBtnSetValue : "Laikyti pažymÄ—ta reikÅ¡me", +DlgSelectBtnDelete : "Trinti", + +// Textarea Dialog +DlgTextareaName : "Vardas", +DlgTextareaCols : "Ilgis", +DlgTextareaRows : "Plotis", + +// Text Field Dialog +DlgTextName : "Vardas", +DlgTextValue : "ReikÅ¡mÄ—", +DlgTextCharWidth : "Ilgis simboliais", +DlgTextMaxChars : "Maksimalus simbolių skaiÄius", +DlgTextType : "Tipas", +DlgTextTypeText : "Tekstas", +DlgTextTypePass : "Slaptažodis", + +// Hidden Field Dialog +DlgHiddenName : "Vardas", +DlgHiddenValue : "ReikÅ¡mÄ—", + +// Bulleted List Dialog +BulletedListProp : "Suženklinto sÄ…raÅ¡o savybÄ—s", +NumberedListProp : "Numeruoto sÄ…raÅ¡o savybÄ—s", +DlgLstStart : "Start", //MISSING +DlgLstType : "Tipas", +DlgLstTypeCircle : "Apskritimas", +DlgLstTypeDisc : "Diskas", +DlgLstTypeSquare : "Kvadratas", +DlgLstTypeNumbers : "SkaiÄiai (1, 2, 3)", +DlgLstTypeLCase : "Mažosios raidÄ—s (a, b, c)", +DlgLstTypeUCase : "Didžiosios raidÄ—s (A, B, C)", +DlgLstTypeSRoman : "RomÄ—nų mažieji skaiÄiai (i, ii, iii)", +DlgLstTypeLRoman : "RomÄ—nų didieji skaiÄiai (I, II, III)", + +// Document Properties Dialog +DlgDocGeneralTab : "Bendros savybÄ—s", +DlgDocBackTab : "Fonas", +DlgDocColorsTab : "Spalvos ir kraÅ¡tinÄ—s", +DlgDocMetaTab : "Meta duomenys", + +DlgDocPageTitle : "Puslapio antraÅ¡tÄ—", +DlgDocLangDir : "Kalbos kryptis", +DlgDocLangDirLTR : "IÅ¡ kairÄ—s į deÅ¡inÄ™ (LTR)", +DlgDocLangDirRTL : "IÅ¡ deÅ¡inÄ—s į kairÄ™ (RTL)", +DlgDocLangCode : "Kalbos kodas", +DlgDocCharSet : "Simbolių kodavimo lentelÄ—", +DlgDocCharSetCE : "Central European", //MISSING +DlgDocCharSetCT : "Chinese Traditional (Big5)", //MISSING +DlgDocCharSetCR : "Cyrillic", //MISSING +DlgDocCharSetGR : "Greek", //MISSING +DlgDocCharSetJP : "Japanese", //MISSING +DlgDocCharSetKR : "Korean", //MISSING +DlgDocCharSetTR : "Turkish", //MISSING +DlgDocCharSetUN : "Unicode (UTF-8)", //MISSING +DlgDocCharSetWE : "Western European", //MISSING +DlgDocCharSetOther : "Kita simbolių kodavimo lentelÄ—", + +DlgDocDocType : "Dokumento tipo antraÅ¡tÄ—", +DlgDocDocTypeOther : "Kita dokumento tipo antraÅ¡tÄ—", +DlgDocIncXHTML : "Ä®traukti XHTML deklaracijas", +DlgDocBgColor : "Fono spalva", +DlgDocBgImage : "Fono paveikslÄ—lio nuoroda (URL)", +DlgDocBgNoScroll : "Neslenkantis fonas", +DlgDocCText : "Tekstas", +DlgDocCLink : "Nuoroda", +DlgDocCVisited : "Aplankyta nuoroda", +DlgDocCActive : "Aktyvi nuoroda", +DlgDocMargins : "Puslapio kraÅ¡tinÄ—s", +DlgDocMaTop : "VirÅ¡uje", +DlgDocMaLeft : "KairÄ—je", +DlgDocMaRight : "DeÅ¡inÄ—je", +DlgDocMaBottom : "ApaÄioje", +DlgDocMeIndex : "Dokumento indeksavimo raktiniai žodžiai (atskirti kableliais)", +DlgDocMeDescr : "Dokumento apibÅ«dinimas", +DlgDocMeAuthor : "Autorius", +DlgDocMeCopy : "AutorinÄ—s teisÄ—s", +DlgDocPreview : "PeržiÅ«ra", + +// Templates Dialog +Templates : "Å ablonai", +DlgTemplatesTitle : "Turinio Å¡ablonai", +DlgTemplatesSelMsg : "Pasirinkite norimÄ… Å¡ablonÄ…
    (DÄ—mesio! esamas turinys bus prarastas):", +DlgTemplatesLoading : "Ä®keliamas Å¡ablonų sÄ…raÅ¡as. PraÅ¡ome palaukti...", +DlgTemplatesNoTpl : "(Å ablonų sÄ…raÅ¡as tuÅ¡Äias)", +DlgTemplatesReplace : "Replace actual contents", //MISSING + +// About Dialog +DlgAboutAboutTab : "Apie", +DlgAboutBrowserInfoTab : "NarÅ¡yklÄ—s informacija", +DlgAboutLicenseTab : "License", //MISSING +DlgAboutVersion : "versija", +DlgAboutInfo : "PapildomÄ… informacijÄ… galima gauti", + +// Div Dialog +DlgDivGeneralTab : "General", //MISSING +DlgDivAdvancedTab : "Advanced", //MISSING +DlgDivStyle : "Style", //MISSING +DlgDivInlineStyle : "Inline Style" //MISSING +}; diff --git a/webdir/fckeditor/editor/lang/lv.js b/webdir/fckeditor/editor/lang/lv.js new file mode 100644 index 0000000..bfb09c1 --- /dev/null +++ b/webdir/fckeditor/editor/lang/lv.js @@ -0,0 +1,534 @@ +/* + * FCKeditor - The text editor for Internet - http://www.fckeditor.net + * Copyright (C) 2003-2009 Frederico Caldeira Knabben + * + * == BEGIN LICENSE == + * + * Licensed under the terms of any of the following licenses at your + * choice: + * + * - GNU General Public License Version 2 or later (the "GPL") + * http://www.gnu.org/licenses/gpl.html + * + * - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + * http://www.gnu.org/licenses/lgpl.html + * + * - Mozilla Public License Version 1.1 or later (the "MPL") + * http://www.mozilla.org/MPL/MPL-1.1.html + * + * == END LICENSE == + * + * Latvian language file. + */ + +var FCKLang = +{ +// Language direction : "ltr" (left to right) or "rtl" (right to left). +Dir : "ltr", + +ToolbarCollapse : "SamazinÄt rÄ«ku joslu", +ToolbarExpand : "PaplaÅ¡inÄt rÄ«ku joslu", + +// Toolbar Items and Context Menu +Save : "SaglabÄt", +NewPage : "Jauna lapa", +Preview : "PÄrskatÄ«t", +Cut : "Izgriezt", +Copy : "KopÄ“t", +Paste : "Ievietot", +PasteText : "Ievietot kÄ vienkÄrÅ¡u tekstu", +PasteWord : "Ievietot no Worda", +Print : "DrukÄt", +SelectAll : "IezÄ«mÄ“t visu", +RemoveFormat : "Noņemt stilus", +InsertLinkLbl : "Hipersaite", +InsertLink : "Ievietot/Labot hipersaiti", +RemoveLink : "Noņemt hipersaiti", +VisitLink : "Open Link", //MISSING +Anchor : "Ievietot/Labot iezÄ«mi", +AnchorDelete : "Remove Anchor", //MISSING +InsertImageLbl : "AttÄ“ls", +InsertImage : "Ievietot/Labot AttÄ“lu", +InsertFlashLbl : "Flash", +InsertFlash : "Ievietot/Labot Flash", +InsertTableLbl : "Tabula", +InsertTable : "Ievietot/Labot Tabulu", +InsertLineLbl : "AtdalÄ«tÄjsvÄ«tra", +InsertLine : "Ievietot horizontÄlu AtdalÄ«tÄjsvÄ«tru", +InsertSpecialCharLbl: "ĪpaÅ¡s simbols", +InsertSpecialChar : "Ievietot speciÄlo simbolu", +InsertSmileyLbl : "Smaidiņi", +InsertSmiley : "Ievietot smaidiņu", +About : "ĪsumÄ par FCKeditor", +Bold : "Treknu Å¡riftu", +Italic : "SlÄ«prakstÄ", +Underline : "ApakÅ¡svÄ«tra", +StrikeThrough : "PÄrsvÄ«trots", +Subscript : "ZemrakstÄ", +Superscript : "AugÅ¡rakstÄ", +LeftJustify : "IzlÄ«dzinÄt pa kreisi", +CenterJustify : "IzlÄ«dzinÄt pret centru", +RightJustify : "IzlÄ«dzinÄt pa labi", +BlockJustify : "IzlÄ«dzinÄt malas", +DecreaseIndent : "SamazinÄt atkÄpi", +IncreaseIndent : "PalielinÄt atkÄpi", +Blockquote : "Blockquote", //MISSING +CreateDiv : "Create Div Container", //MISSING +EditDiv : "Edit Div Container", //MISSING +DeleteDiv : "Remove Div Container", //MISSING +Undo : "Atcelt", +Redo : "AtkÄrtot", +NumberedListLbl : "NumurÄ“ts saraksts", +NumberedList : "Ievietot/Noņemt numerÄ“to sarakstu", +BulletedListLbl : "Izcelts saraksts", +BulletedList : "Ievietot/Noņemt izceltu sarakstu", +ShowTableBorders : "ParÄdÄ«t tabulas robežas", +ShowDetails : "ParÄdÄ«t sÄ«kÄku informÄciju", +Style : "Stils", +FontFormat : "FormÄts", +Font : "Å rifts", +FontSize : "IzmÄ“rs", +TextColor : "Teksta krÄsa", +BGColor : "Fona krÄsa", +Source : "HTML kods", +Find : "MeklÄ“t", +Replace : "NomainÄ«t", +SpellCheck : "PareizrakstÄ«bas pÄrbaude", +UniversalKeyboard : "UniversÄla klaviatÅ«ra", +PageBreakLbl : "Lapas pÄrtraukums", +PageBreak : "Ievietot lapas pÄrtraukumu", + +Form : "Forma", +Checkbox : "AtzÄ«mÄ“Å¡anas kastÄ«te", +RadioButton : "IzvÄ“les poga", +TextField : "Teksta rinda", +Textarea : "Teksta laukums", +HiddenField : "PaslÄ“pta teksta rinda", +Button : "Poga", +SelectionField : "IezÄ«mÄ“Å¡anas lauks", +ImageButton : "AttÄ“lpoga", + +FitWindow : "MaksimizÄ“t redaktora izmÄ“ru", +ShowBlocks : "Show Blocks", //MISSING + +// Context Menu +EditLink : "Labot hipersaiti", +CellCM : "Å Å«na", +RowCM : "Rinda", +ColumnCM : "Kolonna", +InsertRowAfter : "Insert Row After", //MISSING +InsertRowBefore : "Insert Row Before", //MISSING +DeleteRows : "DzÄ“st rindas", +InsertColumnAfter : "Insert Column After", //MISSING +InsertColumnBefore : "Insert Column Before", //MISSING +DeleteColumns : "DzÄ“st kolonnas", +InsertCellAfter : "Insert Cell After", //MISSING +InsertCellBefore : "Insert Cell Before", //MISSING +DeleteCells : "DzÄ“st rÅ«tiņas", +MergeCells : "Apvienot rÅ«tiņas", +MergeRight : "Merge Right", //MISSING +MergeDown : "Merge Down", //MISSING +HorizontalSplitCell : "Split Cell Horizontally", //MISSING +VerticalSplitCell : "Split Cell Vertically", //MISSING +TableDelete : "DzÄ“st tabulu", +CellProperties : "RÅ«tiņas Ä«paÅ¡Ä«bas", +TableProperties : "Tabulas Ä«paÅ¡Ä«bas", +ImageProperties : "AttÄ“la Ä«paÅ¡Ä«bas", +FlashProperties : "Flash Ä«paÅ¡Ä«bas", + +AnchorProp : "IezÄ«mes Ä«paÅ¡Ä«bas", +ButtonProp : "Pogas Ä«paÅ¡Ä«bas", +CheckboxProp : "AtzÄ«mÄ“Å¡anas kastÄ«tes Ä«paÅ¡Ä«bas", +HiddenFieldProp : "PaslÄ“ptÄs teksta rindas Ä«paÅ¡Ä«bas", +RadioButtonProp : "IzvÄ“les poga Ä«paÅ¡Ä«bas", +ImageButtonProp : "AttÄ“lpogas Ä«paÅ¡Ä«bas", +TextFieldProp : "Teksta rindas Ä«paÅ¡Ä«bas", +SelectionFieldProp : "IezÄ«mÄ“Å¡anas lauka Ä«paÅ¡Ä«bas", +TextareaProp : "Teksta laukuma Ä«paÅ¡Ä«bas", +FormProp : "Formas Ä«paÅ¡Ä«bas", + +FontFormats : "NormÄls teksts;FormatÄ“ts teksts;Adrese;Virsraksts 1;Virsraksts 2;Virsraksts 3;Virsraksts 4;Virsraksts 5;Virsraksts 6;Rindkopa (DIV)", + +// Alerts and Messages +ProcessingXHTML : "Tiek apstrÄdÄts XHTML. LÅ«dzu uzgaidiet...", +Done : "DarÄ«ts", +PasteWordConfirm : "Teksta fragments, kas tiek ievietots, izskatÄs, ka bÅ«tu sagatavots Word'Ä. Vai vÄ“laties to apstrÄdÄt pirms ievietoÅ¡anas?", +NotCompatiblePaste : "Å Ä« darbÄ«ba ir pieejama Internet Explorer'Ä«, kas jaunÄks par 5.5 versiju. Vai vÄ“laties ievietot bez apstrÄdes?", +UnknownToolbarItem : "NezinÄms rÄ«ku joslas objekts \"%1\"", +UnknownCommand : "NezinÄmas darbÄ«bas nosaukums \"%1\"", +NotImplemented : "DarbÄ«ba netika paveikta", +UnknownToolbarSet : "RÄ«ku joslas komplekts \"%1\" neeksistÄ“", +NoActiveX : "Interneta pÄrlÅ«kprogrammas droÅ¡Ä«bas uzstÄdÄ«jumi varÄ“tu ietekmÄ“t dažas no redaktora Ä«paÅ¡Ä«bÄm. JÄbÅ«t aktivizÄ“tai sadaļai \"Run ActiveX controls and plug-ins\". SavÄdÄk ir iespÄ“jamas kļūdas darbÄ«bÄ un kļūdu paziņojumu parÄdÄ«Å¡anÄs.", +BrowseServerBlocked : "Resursu pÄrlÅ«ks nevar tikt atvÄ“rts. PÄrliecinieties, ka uznirstoÅ¡o logu bloÄ·Ä“tÄji ir atslÄ“gti.", +DialogBlocked : "Nav iespÄ“jams atvÄ“rt dialoglogu. PÄrliecinieties, ka uznirstoÅ¡o logu bloÄ·Ä“tÄji ir atslÄ“gti.", +VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING + +// Dialogs +DlgBtnOK : "DarÄ«ts!", +DlgBtnCancel : "Atcelt", +DlgBtnClose : "AizvÄ“rt", +DlgBtnBrowseServer : "SkatÄ«t servera saturu", +DlgAdvancedTag : "IzvÄ“rstais", +DlgOpOther : "", +DlgInfoTab : "InformÄcija", +DlgAlertUrl : "LÅ«dzu, ievietojiet hipersaiti", + +// General Dialogs Labels +DlgGenNotSet : "