From 4cc22075134f2abd787ff1b2f4ca4111b24fa587 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Sat, 16 Nov 2013 02:21:12 +0400 Subject: [PATCH] Uploading and preparing the repository to the dev version. Original unminified source code (dev folder - js, css, less) (fixes #6) Grunt build system Multiple identities correction (fixes #9) Compose html editor (fixes #12) New general settings - Loading Description New warning about default admin password Split general and login screen settings --- .gitignore | 7 + Gruntfile.js | 382 + LICENSE | 50 +- README.md | 38 +- _include.php | 35 + dev/Admin/Domains.js | 90 + dev/Admin/General.js | 122 + dev/Admin/Licensing.js | 53 + dev/Admin/Login.js | 53 + dev/Admin/Packages.js | 105 + dev/Admin/Plugins.js | 79 + dev/Admin/Security.js | 89 + dev/Admin/Social.js | 117 + dev/Boots/AbstractApp.js | 227 + dev/Boots/AdminApp.js | 248 + dev/Boots/RainLoopApp.js | 750 + dev/Common/Base64.js | 164 + dev/Common/Constants.js | 101 + dev/Common/Enums.js | 286 + dev/Common/Globals.js | 67 + dev/Common/HtmlEditor.js | 897 + dev/Common/Knockout.js | 787 + dev/Common/LinkBuilder.js | 274 + dev/Common/Plugins.js | 95 + dev/Common/Selector.js | 525 + dev/Common/Utils.js | 1343 ++ dev/Common/_Begin.js | 71 + dev/Common/_BeginA.js | 6 + dev/Common/_BeginW.js | 6 + dev/Common/_BootEnd.js | 3 + dev/Common/_CoreEnd.js | 3 + dev/Common/_End.js | 57 + dev/Common/_LibsEnd.js | 3 + dev/Knoin/AbstractBoot.js | 14 + dev/Knoin/AbstractScreen.js | 77 + dev/Knoin/AbstractViewModel.js | 61 + dev/Knoin/Knoin.js | 382 + dev/Models/AccountModel.js | 23 + dev/Models/AttachmentModel.js | 228 + dev/Models/ComposeAttachmentModel.js | 63 + dev/Models/ContactModel.js | 73 + dev/Models/EmailModel.js | 240 + dev/Models/FolderModel.js | 305 + dev/Models/IdentityModel.js | 37 + dev/Models/MessageModel.js | 897 + dev/Screens/AbstractSettings.js | 178 + dev/Screens/AdminLogin.js | 17 + dev/Screens/AdminSettings.js | 22 + dev/Screens/Login.js | 17 + dev/Screens/MailBox.js | 165 + dev/Screens/Settings.js | 29 + dev/Settings/Accounts.js | 67 + dev/Settings/ChangePassword.js | 65 + dev/Settings/Folders.js | 196 + dev/Settings/General.js | 155 + dev/Settings/Identities.js | 109 + dev/Settings/Personal.js | 52 + dev/Settings/Social.js | 68 + dev/Settings/Themes.js | 216 + dev/Storages/AbstractAjaxRemote.js | 249 + dev/Storages/AbstractCache.js | 67 + dev/Storages/AbstractData.js | 70 + dev/Storages/AdminAjaxRemote.js | 236 + dev/Storages/AdminCache.js | 12 + dev/Storages/AdminData.js | 36 + dev/Storages/LocalStorage.js | 44 + dev/Storages/LocalStorages/CookieDriver.js | 75 + .../LocalStorages/LocalStorageDriver.js | 73 + dev/Storages/WebMailAjaxRemote.js | 660 + dev/Storages/WebMailCache.js | 318 + dev/Storages/WebMailData.js | 896 + dev/Styles/@Main.less | 73 + dev/Styles/Activate.less | 12 + dev/Styles/AddAccount.less | 7 + dev/Styles/Admin.less | 101 + dev/Styles/AdminDomain.less | 43 + dev/Styles/AdminDomains.less | 60 + dev/Styles/AdminGeneral.less | 4 + dev/Styles/AdminPackages.less | 43 + dev/Styles/AdminPlugin.less | 30 + dev/Styles/AdminPlugins.less | 40 + dev/Styles/AdvancedSearch.less | 16 + dev/Styles/Animations.less | 179 + dev/Styles/Compose.less | 177 + dev/Styles/Contacts.less | 303 + dev/Styles/Editor.less | 173 + dev/Styles/FolderClear.less | 7 + dev/Styles/FolderCreate.less | 7 + dev/Styles/FolderList.less | 141 + dev/Styles/FolderSystem.less | 10 + dev/Styles/Identity.less | 12 + dev/Styles/Languages.less | 34 + dev/Styles/Layout.less | 123 + dev/Styles/Login.less | 96 + dev/Styles/Main.less | 54 + dev/Styles/MessageList.less | 523 + dev/Styles/MessageView.less | 381 + dev/Styles/Scroll.less | 29 + dev/Styles/Settings.less | 99 + dev/Styles/SettingsAccounts.less | 55 + dev/Styles/SettingsFolders.less | 104 + dev/Styles/SettingsGeneral.less | 25 + dev/Styles/SettingsIdentities.less | 59 + dev/Styles/SettingsPersonal.less | 4 + dev/Styles/SettingsThemes.less | 33 + dev/Styles/SystemDropDown.less | 34 + dev/Styles/Ui.less | 130 + dev/Styles/_BootstrapFix.less | 228 + dev/Styles/_End.less | 2 + dev/Styles/_IcoMoonToBoot.less | 142 + dev/Styles/_Select2Fix.less | 72 + dev/Styles/_Values.less | 34 + .../AbstractSystemDropDownViewModel.js | 69 + dev/ViewModels/AdminLoginViewModel.js | 86 + dev/ViewModels/AdminMenuViewModel.js | 21 + dev/ViewModels/AdminPaneViewModel.js | 22 + dev/ViewModels/LoginViewModel.js | 269 + dev/ViewModels/MailBoxFolderListViewModel.js | 113 + dev/ViewModels/MailBoxMessageListViewModel.js | 935 + dev/ViewModels/MailBoxMessageViewViewModel.js | 320 + .../MailBoxSystemDropDownViewModel.js | 12 + dev/ViewModels/PopupsActivateViewModel.js | 110 + dev/ViewModels/PopupsAddAccountViewModel.js | 113 + .../PopupsAdvancedSearchViewModel.js | 105 + dev/ViewModels/PopupsComposeViewModel.js | 1367 ++ dev/ViewModels/PopupsContactsViewModel.js | 385 + dev/ViewModels/PopupsDomainViewModel.js | 205 + dev/ViewModels/PopupsFolderClearViewModel.js | 95 + dev/ViewModels/PopupsFolderCreateViewModel.js | 105 + dev/ViewModels/PopupsFolderSystemViewModel.js | 103 + dev/ViewModels/PopupsIdentityViewModel.js | 145 + dev/ViewModels/PopupsLanguagesViewModel.js | 45 + dev/ViewModels/PopupsPluginViewModel.js | 111 + dev/ViewModels/SettingsMenuViewModel.js | 26 + dev/ViewModels/SettingsPaneViewModel.js | 22 + .../SettingsSystemDropDownViewModel.js | 12 + package.json | 47 + rainloop/v/0.0.0/VERSION | 1 + .../v/{1.3.10.492 => 0.0.0}/app/.htaccess | 0 .../app/domains/disabled | 0 .../app/domains/gmail.com.ini | 0 .../app/domains/outlook.com.ini | 0 .../app/domains/yahoo.com.ini | 0 .../v/{1.3.10.492 => 0.0.0}/app/handle.php | 0 .../{1.3.10.492 => 0.0.0}/app/i18n/langs.ini | 0 .../v/0.0.0/app/i18n/moment/CONTRIBUTING.md | 45 + rainloop/v/0.0.0/app/i18n/moment/LICENSE | 22 + .../app/i18n/moment/ar-ma.js | 0 .../app/i18n/moment/ar.js | 0 .../app/i18n/moment/bg.js | 0 .../app/i18n/moment/br.js | 0 .../app/i18n/moment/bs.js | 0 .../app/i18n/moment/ca.js | 0 .../app/i18n/moment/cs.js | 0 .../app/i18n/moment/cv.js | 0 .../app/i18n/moment/da.js | 0 .../app/i18n/moment/de.js | 0 .../app/i18n/moment/el.js | 0 .../app/i18n/moment/en-au.js | 0 .../app/i18n/moment/en-ca.js | 0 .../app/i18n/moment/en-gb.js | 0 .../app/i18n/moment/eo.js | 0 .../app/i18n/moment/es.js | 0 .../app/i18n/moment/et.js | 0 .../app/i18n/moment/eu.js | 0 .../app/i18n/moment/fa.js | 0 .../app/i18n/moment/fi.js | 0 .../app/i18n/moment/fr-ca.js | 0 .../app/i18n/moment/fr.js | 0 .../app/i18n/moment/gl.js | 0 .../app/i18n/moment/he.js | 0 .../app/i18n/moment/hi.js | 0 .../app/i18n/moment/hr.js | 0 .../app/i18n/moment/hu.js | 0 .../app/i18n/moment/id.js | 0 .../app/i18n/moment/is.js | 0 .../app/i18n/moment/it.js | 0 .../app/i18n/moment/ja.js | 0 .../app/i18n/moment/ka.js | 0 .../app/i18n/moment/ko.js | 0 .../app/i18n/moment/lt.js | 0 .../app/i18n/moment/lv.js | 0 .../app/i18n/moment/ml.js | 0 .../app/i18n/moment/mr.js | 0 .../app/i18n/moment/ms-my.js | 0 .../app/i18n/moment/nb.js | 0 .../app/i18n/moment/ne.js | 0 .../app/i18n/moment/nl.js | 0 .../app/i18n/moment/nn.js | 0 .../app/i18n/moment/pl.js | 0 .../app/i18n/moment/pt-br.js | 0 .../app/i18n/moment/pt.js | 0 rainloop/v/0.0.0/app/i18n/moment/readme.md | 283 + .../app/i18n/moment/ro.js | 0 .../app/i18n/moment/ru.js | 0 .../app/i18n/moment/sk.js | 0 .../app/i18n/moment/sl.js | 0 .../app/i18n/moment/sq.js | 0 .../app/i18n/moment/sv.js | 0 .../app/i18n/moment/th.js | 0 .../app/i18n/moment/tr.js | 0 .../app/i18n/moment/tzm-la.js | 0 .../app/i18n/moment/tzm.js | 0 .../app/i18n/moment/uk.js | 0 .../app/i18n/moment/uz.js | 0 .../app/i18n/moment/vn.js | 0 .../app/i18n/moment/zh-cn.js | 0 .../app/i18n/moment/zh-tw.js | 0 .../app/libraries/MailSo/Base/Collection.php | 0 .../app/libraries/MailSo/Base/Crypt.php | 0 .../libraries/MailSo/Base/DateTimeHelper.php | 0 .../MailSo/Base/Enumerations/Charset.php | 0 .../MailSo/Base/Enumerations/Encoding.php | 0 .../MailSo/Base/Exceptions/Exception.php | 0 .../Exceptions/InvalidArgumentException.php | 0 .../app/libraries/MailSo/Base/HtmlUtils.php | 0 .../app/libraries/MailSo/Base/Http.php | 0 .../app/libraries/MailSo/Base/LinkFinder.php | 0 .../app/libraries/MailSo/Base/Loader.php | 0 .../MailSo/Base/ResourceRegistry.php | 0 .../MailSo/Base/StreamWrappers/Binary.php | 0 .../MailSo/Base/StreamWrappers/Literal.php | 0 .../MailSo/Base/StreamWrappers/SubStreams.php | 0 .../MailSo/Base/StreamWrappers/Test.php | 0 .../app/libraries/MailSo/Base/Utils.php | 0 .../app/libraries/MailSo/Base/Validator.php | 0 .../libraries/MailSo/Cache/CacheClient.php | 0 .../MailSo/Cache/DriverInterface.php | 0 .../libraries/MailSo/Cache/Drivers/APC.php | 0 .../libraries/MailSo/Cache/Drivers/File.php | 0 .../MailSo/Cache/Drivers/Memcache.php | 0 .../libraries/MailSo/Imap/BodyStructure.php | 0 .../MailSo/Imap/Enumerations/FetchType.php | 0 .../Enumerations/FolderResponseStatus.php | 0 .../MailSo/Imap/Enumerations/FolderStatus.php | 0 .../MailSo/Imap/Enumerations/FolderType.php | 0 .../MailSo/Imap/Enumerations/MessageFlag.php | 0 .../Imap/Enumerations/ResponseStatus.php | 0 .../MailSo/Imap/Enumerations/ResponseType.php | 0 .../MailSo/Imap/Enumerations/StoreAction.php | 0 .../MailSo/Imap/Exceptions/Exception.php | 0 .../Exceptions/InvalidResponseException.php | 0 .../LoginBadCredentialsException.php | 0 .../Exceptions/LoginBadMethodException.php | 0 .../MailSo/Imap/Exceptions/LoginException.php | 0 .../Exceptions/NegativeResponseException.php | 0 .../Imap/Exceptions/ResponseException.php | 0 .../Exceptions/ResponseNotFoundException.php | 0 .../Imap/Exceptions/RuntimeException.php | 0 .../libraries/MailSo/Imap/FetchResponse.php | 0 .../app/libraries/MailSo/Imap/Folder.php | 0 .../MailSo/Imap/FolderInformation.php | 0 .../app/libraries/MailSo/Imap/ImapClient.php | 53 +- .../libraries/MailSo/Imap/NamespaceResult.php | 0 .../app/libraries/MailSo/Imap/Response.php | 0 .../libraries/MailSo/Imap/SearchBuilder.php | 0 .../app/libraries/MailSo/Log/Driver.php | 0 .../libraries/MailSo/Log/Drivers/Callback.php | 0 .../app/libraries/MailSo/Log/Drivers/File.php | 0 .../libraries/MailSo/Log/Drivers/Inline.php | 0 .../MailSo/Log/Enumerations/Type.php | 0 .../app/libraries/MailSo/Log/Logger.php | 31 + .../app/libraries/MailSo/Mail/Attachment.php | 0 .../MailSo/Mail/AttachmentCollection.php | 0 .../MailSo/Mail/Exceptions/Exception.php | 0 .../MailSo/Mail/Exceptions/NonEmptyFolder.php | 0 .../Mail/Exceptions/RuntimeException.php | 0 .../app/libraries/MailSo/Mail/Folder.php | 0 .../MailSo/Mail/FolderCollection.php | 0 .../app/libraries/MailSo/Mail/MailClient.php | 60 +- .../app/libraries/MailSo/Mail/Message.php | 0 .../MailSo/Mail/MessageCollection.php | 0 .../app/libraries/MailSo/MailSo.php | 0 .../app/libraries/MailSo/Mime/Attachment.php | 0 .../MailSo/Mime/AttachmentCollection.php | 0 .../app/libraries/MailSo/Mime/Email.php | 0 .../libraries/MailSo/Mime/EmailCollection.php | 0 .../MailSo/Mime/Enumerations/Constants.php | 0 .../MailSo/Mime/Enumerations/Header.php | 0 .../Mime/Enumerations/MessagePriority.php | 0 .../MailSo/Mime/Enumerations/MimeType.php | 0 .../MailSo/Mime/Enumerations/Parameter.php | 0 .../MailSo/Mime/Enumerations/Sensitivity.php | 0 .../app/libraries/MailSo/Mime/Header.php | 0 .../MailSo/Mime/HeaderCollection.php | 0 .../app/libraries/MailSo/Mime/Message.php | 95 +- .../app/libraries/MailSo/Mime/Parameter.php | 0 .../MailSo/Mime/ParameterCollection.php | 0 .../MailSo/Mime/Parser/ParserEmpty.php | 0 .../MailSo/Mime/Parser/ParserInterface.php | 0 .../MailSo/Mime/Parser/ParserMemory.php | 0 .../app/libraries/MailSo/Mime/Part.php | 15 - .../libraries/MailSo/Mime/PartCollection.php | 14 - .../Enumerations/ConnectionSecurityType.php | 0 .../Net/Exceptions/ConnectionException.php | 0 .../MailSo/Net/Exceptions/Exception.php | 0 .../Exceptions/InvalidArgumentException.php | 0 .../SocketAlreadyConnectedException.php | 0 .../SocketCanNotConnectToHostException.php | 0 ...ketConnectionDoesNotAvailableException.php | 0 .../Net/Exceptions/SocketReadException.php | 0 .../Exceptions/SocketReadTimeoutException.php | 0 .../SocketUnreadBufferException.php | 0 ...etUnsuppoterdSecureConnectionException.php | 0 .../Net/Exceptions/SocketWriteException.php | 0 .../app/libraries/MailSo/Net/NetClient.php | 0 .../MailSo/Pop3/Exceptions/Exception.php | 0 .../LoginBadCredentialsException.php | 0 .../Exceptions/NegativeResponseException.php | 0 .../Pop3/Exceptions/ResponseException.php | 0 .../Pop3/Exceptions/RuntimeException.php | 0 .../app/libraries/MailSo/Pop3/Pop3Client.php | 0 .../MailSo/Poppassd/Exceptions/Exception.php | 0 .../LoginBadCredentialsException.php | 0 .../Exceptions/NegativeResponseException.php | 0 .../Poppassd/Exceptions/ResponseException.php | 0 .../Poppassd/Exceptions/RuntimeException.php | 0 .../MailSo/Poppassd/PoppassdClient.php | 0 .../MailSo/Sieve/Exceptions/Exception.php | 0 .../LoginBadCredentialsException.php | 0 .../Exceptions/LoginBadMethodException.php | 0 .../Sieve/Exceptions/LoginException.php | 0 .../Exceptions/NegativeResponseException.php | 0 .../Sieve/Exceptions/ResponseException.php | 0 .../Sieve/Exceptions/RuntimeException.php | 0 .../MailSo/Sieve/ManageSieveClient.php | 0 .../MailSo/Smtp/Exceptions/Exception.php | 0 .../LoginBadCredentialsException.php | 0 .../Exceptions/LoginBadMethodException.php | 0 .../MailSo/Smtp/Exceptions/LoginException.php | 0 .../Exceptions/NegativeResponseException.php | 0 .../Smtp/Exceptions/ResponseException.php | 0 .../Smtp/Exceptions/RuntimeException.php | 0 .../app/libraries/MailSo/Smtp/SmtpClient.php | 0 .../app/libraries/MailSo/Version.php | 0 .../app/libraries/PHP-OAuth2/Client.php | 0 .../GrantType/AuthorizationCode.php | 0 .../GrantType/ClientCredentials.php | 0 .../PHP-OAuth2/GrantType/IGrantType.php | 0 .../PHP-OAuth2/GrantType/Password.php | 0 .../PHP-OAuth2/GrantType/RefreshToken.php | 0 .../app/libraries/PHP-OAuth2/README | 0 .../app/libraries/RainLoop/Account.php | 0 .../app/libraries/RainLoop/Actions.php | 315 +- .../RainLoop/Config/AbstractConfig.php | 0 .../libraries/RainLoop/Config/Application.php | 1 + .../app/libraries/RainLoop/Config/Plugin.php | 0 .../app/libraries/RainLoop/Domain.php | 0 .../RainLoop/Enumerations/CustomThemeType.php | 0 .../Enumerations/InterfaceAnimation.php | 0 .../Enumerations/PluginPropertyType.php | 0 .../RainLoop/Enumerations/SignMeType.php | 0 .../RainLoop/Enumerations/TimeFormat.php | 0 .../Enumerations/UploadClientError.php | 2 +- .../RainLoop}/Enumerations/UploadError.php | 2 +- .../RainLoop/Exceptions/AuthException.php | 0 .../RainLoop/Exceptions/ClientException.php | 0 .../RainLoop/Exceptions/Exception.php | 0 .../Exceptions/InvalidArgumentException.php | 0 .../RainLoop/Exceptions/RuntimeException.php | 0 .../app/libraries/RainLoop/Identity.php | 0 .../app/libraries/RainLoop/Notifications.php | 0 .../RainLoop/Plugins/AbstractPlugin.php | 0 .../libraries/RainLoop/Plugins/Manager.php | 0 .../libraries/RainLoop/Plugins/Property.php | 0 .../RainLoop/Providers/AbstractProvider.php | 0 .../RainLoop/Providers/ChangePassword.php | 0 .../ChangePasswordInterface.php | 0 .../libraries/RainLoop/Providers/Contacts.php | 0 .../Providers/Contacts/Classes/Contact.php | 0 .../Providers/Contacts/Classes/Db.php | 0 .../Providers/Contacts/ContactsInterface.php | 0 .../Providers/Contacts/DefaultContacts.php | 0 .../libraries/RainLoop/Providers/Domain.php | 0 .../Providers/Domain/DefaultDomain.php | 0 .../Providers/Domain/DomainAdminInterface.php | 0 .../Providers/Domain/DomainInterface.php | 0 .../Domain/DomainSimpleInterface.php | 0 .../libraries/RainLoop/Providers/Files.php | 117 + .../Providers/Files/DefaultStorage.php | 186 + .../Providers/Files/FilesInterface.php | 72 + .../libraries/RainLoop/Providers/Login.php | 0 .../RainLoop/Providers/Login/DefaultLogin.php | 0 .../Providers/Login/LoginInterface.php | 0 .../libraries/RainLoop/Providers/Settings.php | 0 .../Providers/Settings/DefaultSettings.php | 0 .../Providers/Settings/SettingsInterface.php | 0 .../libraries/RainLoop/Providers/Storage.php | 80 + .../Providers/Storage/DefaultStorage.php | 129 + .../Storage/Enumerations/StorageType.php | 21 +- .../Providers/Storage/StorageInterface.php | 35 + .../RainLoop/Providers/Suggestions.php | 0 .../Suggestions/SuggestionsInterface.php | 0 .../app/libraries/RainLoop/Service.php | 9 +- .../app/libraries/RainLoop/ServiceActions.php | 4 +- .../app/libraries/RainLoop/Settings.php | 0 .../app/libraries/RainLoop/Social.php | 0 .../app/libraries/RainLoop/Utils.php | 0 .../app/libraries/facebook/base_facebook.php | 0 .../app/libraries/facebook/facebook.php | 0 .../libraries/facebook/fb_ca_chain_bundle.crt | 0 .../app/libraries/lessphp/LICENSE | 0 .../app/libraries/lessphp/README.md | 0 .../app/libraries/lessphp/ctype.php | 0 .../app/libraries/lessphp/lessc.inc.php | 0 .../app/libraries/pclzip/gnu-lgpl.txt | 0 .../app/libraries/pclzip/pclzip.lib.php | 0 .../app/libraries/pclzip/readme.txt | 0 .../app/libraries/tmhOAuth/LICENSE | 0 .../app/libraries/tmhOAuth/README.md | 0 .../app/libraries/tmhOAuth/cacert.pem | 0 .../app/libraries/tmhOAuth/tmhOAuth.php | 0 .../app/libraries/tmhOAuth/tmhUtilities.php | 0 .../app/templates/BadBrowser.html | 0 .../app/templates/Error.html | 0 rainloop/v/0.0.0/app/templates/Index.html | 91 + .../templates/Themes/custom-values-dark.less | 0 .../templates/Themes/custom-values-light.less | 0 .../app/templates/Themes/template.less | 0 .../app/templates/Themes/values.less | 0 .../app/templates/Views/AdminLogin.html | 0 .../app/templates/Views/AdminMenu.html | 0 .../app/templates/Views/AdminPane.html | 0 .../Views/AdminSettingsDomainListItem.html} | 0 .../Views/AdminSettingsDomains.html} | 2 +- .../Views/AdminSettingsGeneral.html} | 56 +- .../Views/AdminSettingsLicensing.html} | 0 .../templates/Views/AdminSettingsLogin.html | 33 + .../Views/AdminSettingsPackages.html} | 6 +- .../Views/AdminSettingsPackagesListItem.html} | 0 .../Views/AdminSettingsPackagesTable.html} | 2 +- .../Views/AdminSettingsPluginListItem.html} | 0 .../Views/AdminSettingsPluginProperty.html} | 0 .../Views/AdminSettingsPlugins.html} | 2 +- .../Views/AdminSettingsSecurity.html} | 0 .../templates/Views/AdminSettingsSocial.html} | 14 +- .../templates/Views/ComposeAttachment.html | 0 .../Views/ComposeAttachmentInProcess.html | 0 .../app/templates/Views/Login.html | 198 +- .../app/templates/Views/MailFolderList.html | 0 .../templates/Views/MailFolderListItem.html | 0 .../Views/MailFolderListSystemItem.html | 0 .../app/templates/Views/MailMessageList.html | 0 .../templates/Views/MailMessageListItem.html | 0 .../MailMessageListItemNoPreviewPane.html | 0 .../app/templates/Views/MailMessageView.html | 0 .../app/templates/Views/PopupsActivate.html | 0 .../app/templates/Views/PopupsAddAccount.html | 0 .../templates/Views/PopupsAdvancedSearch.html | 0 .../app/templates/Views/PopupsCompose.html | 0 .../app/templates/Views/PopupsContacts.html | 0 .../app/templates/Views/PopupsDomain.html | 0 .../templates/Views/PopupsFolderClear.html | 0 .../templates/Views/PopupsFolderCreate.html | 0 .../templates/Views/PopupsFolderSystem.html | 0 .../app/templates/Views/PopupsIdentity.html | 0 .../app/templates/Views/PopupsLanguages.html | 0 .../app/templates/Views/PopupsPlugin.html | 2 +- .../Views/PopupsWindowSimpleMessage.html | 0 .../app/templates/Views/SettingsAccounts.html | 0 .../Views/SettingsChangePassword.html | 0 .../app/templates/Views/SettingsCustom.html | 0 .../templates/Views/SettingsFolderItem.html | 0 .../app/templates/Views/SettingsFolders.html | 0 .../app/templates/Views/SettingsGeneral.html | 2 +- .../templates/Views/SettingsIdentities.html | 2 +- .../app/templates/Views/SettingsMenu.html | 0 .../app/templates/Views/SettingsPane.html | 0 .../app/templates/Views/SettingsPersonal.html | 4 +- .../app/templates/Views/SettingsSocial.html | 0 .../app/templates/Views/SettingsThemes.html | 0 .../app/templates/Views/SystemDropDown.html | 0 rainloop/v/{1.3.10.492 => 0.0.0}/check.php | 0 rainloop/v/{1.3.10.492 => 0.0.0}/index.php | 0 rainloop/v/{1.3.10.492 => 0.0.0}/langs/de.ini | 2 +- rainloop/v/{1.3.10.492 => 0.0.0}/langs/en.ini | 2 +- rainloop/v/{1.3.10.492 => 0.0.0}/langs/es.ini | 2 +- rainloop/v/{1.3.10.492 => 0.0.0}/langs/fr.ini | 0 rainloop/v/{1.3.10.492 => 0.0.0}/langs/is.ini | 2 +- rainloop/v/{1.3.10.492 => 0.0.0}/langs/lv.ini | 2 +- rainloop/v/{1.3.10.492 => 0.0.0}/langs/nl.ini | 2 +- .../v/{1.3.10.492 => 0.0.0}/langs/pt-br.ini | 2 +- rainloop/v/{1.3.10.492 => 0.0.0}/langs/ru.ini | 2 +- .../static/browsers/chrome.gif | Bin .../static/browsers/firefox.gif | Bin .../static/browsers/opera.gif | Bin .../static/browsers/safari.gif | Bin .../{1.3.10.492 => 0.0.0}/static/css/app.css | 669 +- rainloop/v/0.0.0/static/css/app.min.css | 4 + .../static/css/flags.png | Bin .../static/css/fonts/icomoon.dev.svg | 0 .../static/css/fonts/icomoon.eot | Bin .../static/css/fonts/icomoon.svg | 0 .../static/css/fonts/icomoon.ttf | Bin .../static/css/fonts/icomoon.woff | Bin .../static/css/images/editor.png | Bin .../static/css/images/empty-contact.png | Bin .../static/css/images/grey.png | Bin .../css/images/icom-message-notification.png | Bin .../static/css/images/loader-black.gif | Bin .../static/css/images/loader-white.gif | Bin .../static/css/images/sync.gif | Bin .../static/css/images/sync.png | Bin .../static/css/images/white.png | Bin rainloop/v/0.0.0/static/css/less.css | 6248 ++++++ .../static/css/select2-spinner.gif | Bin .../static/css/select2.png | Bin .../static/css/select2x2.png | Bin .../{1.3.10.492 => 0.0.0}/static/favicon.ico | Bin .../{1.3.10.492 => 0.0.0}/static/favicon.png | Bin rainloop/v/0.0.0/static/js/admin.js | 6845 +++++++ rainloop/v/0.0.0/static/js/admin.min.js | 4 + rainloop/v/0.0.0/static/js/app.js | 15997 ++++++++++++++++ rainloop/v/0.0.0/static/js/app.min.js | 8 + .../Index.html => 0.0.0/static/js/boot.js} | 102 +- .../v/{1.3.10.492 => 0.0.0}/static/js/libs.js | 84 +- .../static/services/amazon.png | Bin .../static/services/apple.jpg | Bin .../static/services/asana.png | Bin .../static/services/battle.net.png | Bin .../static/services/cnet.jpg | Bin .../static/services/ea.png | Bin .../static/services/ebay.jpg | Bin .../static/services/facebook.png | Bin .../static/services/github.png | Bin .../static/services/google-plus.png | Bin .../static/services/google.png | Bin .../static/services/icloud.jpg | Bin .../static/services/microsoft.jpg | Bin .../static/services/myspace.png | Bin .../static/services/onlive.png | Bin .../static/services/paypal.jpg | Bin .../static/services/skype.png | Bin .../static/services/steam.png | Bin .../static/services/ted.png | Bin .../static/services/twitter.jpg | Bin .../static/services/youtube.gif | Bin .../static/sounds/new-mail.mp3 | Bin .../static/sounds/new-mail.ogg | Bin .../themes/A/images/background.jpg | Bin .../themes/A/images/preview.png | Bin .../themes/A/styles.less | 0 .../themes/Clear/images/preview.png | Bin .../themes/Clear/styles.less | 0 .../themes/Custom/ext.less | 0 .../themes/Custom/images/preview.png | Bin .../themes/Default/images/background.jpg | Bin .../themes/Default/images/background.png | Bin .../themes/Default/images/preview.png | Bin .../themes/Default/styles.less | 0 .../themes/Linen/images/background.jpg | Bin .../themes/Linen/images/background.png | Bin .../themes/Linen/images/preview.png | Bin .../themes/Linen/styles.less | 0 .../themes/Love/images/background.jpg | Bin .../themes/Love/images/preview.png | Bin .../themes/Love/styles.less | 0 .../themes/Snow/images/background.jpg | Bin .../themes/Snow/images/preview.png | Bin .../themes/Snow/styles.less | 0 .../themes/Squares/images/background.jpg | Bin .../themes/Squares/images/background.png | Bin .../themes/Squares/images/preview.png | Bin .../themes/Squares/styles.less | 0 .../themes/SquaresDark/images/background.jpg | Bin .../themes/SquaresDark/images/background.png | Bin .../themes/SquaresDark/images/preview.png | Bin .../themes/SquaresDark/styles.less | 0 .../themes/Stripes/images/background.jpg | Bin .../themes/Stripes/images/preview.png | Bin .../themes/Stripes/styles.less | 0 .../themes/Wood/images/background.jpg | Bin .../themes/Wood/images/background.png | Bin .../themes/Wood/images/preview.png | Bin .../themes/Wood/styles.less | 0 .../themes/Xv/images/background.jpg | Bin .../themes/Xv/images/background.png | Bin .../themes/Xv/images/preview.png | Bin .../themes/Xv/styles.less | 0 rainloop/v/1.3.10.492/LICENSE | 25 - rainloop/v/1.3.10.492/VERSION | 1 - .../libraries/RainLoop/Providers/Storage.php | 195 - .../Providers/Storage/DefaultStorage.php | 290 - .../Providers/Storage/StorageInterface.php | 109 - rainloop/v/1.3.10.492/static/css/app.min.css | 4 - rainloop/v/1.3.10.492/static/js/admin.min.js | 159 - rainloop/v/1.3.10.492/static/js/app.min.js | 406 - vendors/bootstrap/LICENSE | 176 + .../img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../bootstrap/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes vendors/bootstrap/js/bootstrap.min.js | 6 + vendors/bootstrap/js/bootstrap.min.orig.js | 6 + vendors/bootstrap/less/accordion.less | 34 + vendors/bootstrap/less/alerts.less | 65 + vendors/bootstrap/less/bootstrap.less | 62 + vendors/bootstrap/less/breadcrumbs.less | 24 + vendors/bootstrap/less/button-groups.less | 244 + vendors/bootstrap/less/buttons.less | 211 + vendors/bootstrap/less/carousel.less | 131 + vendors/bootstrap/less/close.less | 31 + vendors/bootstrap/less/code.less | 58 + .../bootstrap/less/component-animations.less | 23 + vendors/bootstrap/less/dropdowns.less | 210 + vendors/bootstrap/less/forms.less | 635 + vendors/bootstrap/less/grid.less | 21 + vendors/bootstrap/less/hero-unit.less | 24 + vendors/bootstrap/less/labels-badges.less | 72 + vendors/bootstrap/less/layouts.less | 16 + vendors/bootstrap/less/mixins.less | 671 + vendors/bootstrap/less/modals.less | 97 + vendors/bootstrap/less/navbar.less | 469 + vendors/bootstrap/less/navs.less | 384 + vendors/bootstrap/less/pager.less | 37 + vendors/bootstrap/less/pagination.less | 64 + vendors/bootstrap/less/popovers.less | 117 + vendors/bootstrap/less/progress-bars.less | 122 + vendors/bootstrap/less/reset.less | 134 + .../bootstrap/less/responsive-1200px-min.less | 28 + .../bootstrap/less/responsive-767px-max.less | 167 + .../less/responsive-768px-979px.less | 19 + vendors/bootstrap/less/responsive-navbar.less | 166 + .../bootstrap/less/responsive-utilities.less | 43 + vendors/bootstrap/less/responsive.less | 48 + vendors/bootstrap/less/scaffolding.less | 51 + vendors/bootstrap/less/sprites.less | 189 + vendors/bootstrap/less/tables.less | 225 + vendors/bootstrap/less/thumbnails.less | 52 + vendors/bootstrap/less/tooltip.less | 70 + vendors/bootstrap/less/type.less | 206 + vendors/bootstrap/less/utilities.less | 30 + vendors/bootstrap/less/variables.less | 277 + vendors/bootstrap/less/wells.less | 29 + vendors/flags/flags-fixed.css | 32 + vendors/flags/flags.css | 257 + vendors/flags/flags.png | Bin 0 -> 78832 bytes vendors/icomoon/Read Me.txt | 3 + vendors/icomoon/fonts/icomoon.dev.svg | 308 + vendors/icomoon/fonts/icomoon.eot | Bin 0 -> 13980 bytes vendors/icomoon/fonts/icomoon.svg | 308 + vendors/icomoon/fonts/icomoon.ttf | Bin 0 -> 13816 bytes vendors/icomoon/fonts/icomoon.woff | Bin 0 -> 19584 bytes vendors/icomoon/index.html | 815 + vendors/icomoon/license.txt | 18 + vendors/icomoon/lte-ie7.js | 115 + vendors/icomoon/style.css | 303 + vendors/jquery-1.10.1.min.js | 4 + vendors/jquery-cookie/CHANGELOG.md | 65 + vendors/jquery-cookie/CONTRIBUTING.md | 53 + vendors/jquery-cookie/MIT-LICENSE.txt | 20 + vendors/jquery-cookie/README.md | 148 + vendors/jquery-cookie/bower.json | 18 + vendors/jquery-cookie/cookie.jquery.json | 32 + .../jquery-cookie/jquery.cookie-1.4.0.min.js | 2 + vendors/jquery-cookie/jquery.cookie.js | 113 + vendors/jquery-cookie/package.json | 31 + vendors/jquery-lazyload/jquery.lazyload.js | 239 + .../jquery-lazyload/jquery.lazyload.min.js | 2 + vendors/jquery-magnific-popup/README.md | 183 + vendors/jquery-magnific-popup/bower.json | 17 + .../jquery.magnific-popup.js | 2041 ++ .../jquery.magnific-popup.min.js | 4 + .../magnific-popup-animations.css | 45 + .../jquery-magnific-popup/magnific-popup.css | 364 + .../magnific-popup.jquery.json | 29 + vendors/jquery-magnific-popup/package.json | 26 + vendors/jquery-mousewheel/ChangeLog.markdown | 96 + vendors/jquery-mousewheel/LICENSE.txt | 20 + vendors/jquery-mousewheel/README.markdown | 58 + .../jquery.mousewheel-3.1.4.min.js | 2 + .../jquery-mousewheel/jquery.mousewheel.js | 122 + .../jquery-mousewheel/mousewheel.jquery.json | 27 + vendors/jquery-mousewheel/package.json | 43 + .../jquery.nanoscroller-0.7.min.js | 2 + .../jquery.nanoscroller.js | 867 + .../jquery.nanoscroller.orig.js | 753 + .../jquery.nanoscroller.orig.min.js | 3 + vendors/jquery-nanoscroller/nanoscroller.css | 116 + .../jquery-scrollstop/jquery.scrollstop.js | 72 + .../jquery.scrollstop.min.js | 2 + vendors/jquery-ui/AUTHORS.txt | 245 + vendors/jquery-ui/MIT-LICENSE.txt | 26 + vendors/jquery-ui/README.md | 99 + .../css/no-theme/jquery-ui-1.10.3.custom.css | 155 + .../no-theme/jquery-ui-1.10.3.custom.min.css | 6 + .../jquery-ui/js/jquery-ui-1.10.3.custom.js | 3234 ++++ .../js/jquery-ui-1.10.3.custom.min.js | 6 + vendors/jquery-ui/package.json | 70 + vendors/jquery-wakeup/jquery.wakeup.js | 69 + vendors/jquery-wakeup/jquery.wakeup.min.js | 2 + vendors/json2.min.js | 2 + vendors/jua/jua.js | 1193 ++ vendors/jua/jua.min.js | 23 + vendors/knockout/README.md | 48 + vendors/knockout/knockout-3.0.0.js | 94 + vendors/knockout/package.json | 39 + vendors/magnific-popup/magnific-popup.css | 492 + vendors/magnific-popup/magnific-popup.min.js | 3 + vendors/modernizr.js | 4 + vendors/moment/CONTRIBUTING.md | 45 + vendors/moment/LICENSE | 22 + vendors/moment/bower.json | 20 + vendors/moment/component.json | 72 + vendors/moment/composer.json | 18 + vendors/moment/lang/ar-ma.js | 56 + vendors/moment/lang/ar.js | 56 + vendors/moment/lang/bg.js | 86 + vendors/moment/lang/br.js | 107 + vendors/moment/lang/bs.js | 139 + vendors/moment/lang/ca.js | 66 + vendors/moment/lang/cs.js | 155 + vendors/moment/lang/cv.js | 59 + vendors/moment/lang/da.js | 56 + vendors/moment/lang/de.js | 71 + vendors/moment/lang/el.js | 79 + vendors/moment/lang/en-au.js | 62 + vendors/moment/lang/en-ca.js | 59 + vendors/moment/lang/en-gb.js | 63 + vendors/moment/lang/eo.js | 65 + vendors/moment/lang/es.js | 66 + vendors/moment/lang/et.js | 60 + vendors/moment/lang/eu.js | 60 + vendors/moment/lang/fa.js | 97 + vendors/moment/lang/fi.js | 103 + vendors/moment/lang/fr-ca.js | 54 + vendors/moment/lang/fr.js | 58 + vendors/moment/lang/gl.js | 71 + vendors/moment/lang/he.js | 77 + vendors/moment/lang/hi.js | 105 + vendors/moment/lang/hr.js | 140 + vendors/moment/lang/hu.js | 98 + vendors/moment/lang/id.js | 67 + vendors/moment/lang/is.js | 124 + vendors/moment/lang/it.js | 59 + vendors/moment/lang/ja.js | 58 + vendors/moment/lang/ka.js | 108 + vendors/moment/lang/ko.js | 56 + vendors/moment/lang/lt.js | 118 + vendors/moment/lang/lv.js | 77 + vendors/moment/lang/ml.js | 64 + vendors/moment/lang/mr.js | 104 + vendors/moment/lang/ms-my.js | 66 + vendors/moment/lang/nb.js | 57 + vendors/moment/lang/ne.js | 105 + vendors/moment/lang/nl.js | 67 + vendors/moment/lang/nn.js | 56 + vendors/moment/lang/pl.js | 98 + vendors/moment/lang/pt-br.js | 56 + vendors/moment/lang/pt.js | 60 + vendors/moment/lang/ro.js | 56 + vendors/moment/lang/ru.js | 163 + vendors/moment/lang/sk.js | 156 + vendors/moment/lang/sl.js | 144 + vendors/moment/lang/sq.js | 57 + vendors/moment/lang/sv.js | 63 + vendors/moment/lang/th.js | 58 + vendors/moment/lang/tr.js | 93 + vendors/moment/lang/tzm-la.js | 55 + vendors/moment/lang/tzm.js | 55 + vendors/moment/lang/uk.js | 157 + vendors/moment/lang/uz.js | 55 + vendors/moment/lang/vn.js | 62 + vendors/moment/lang/zh-cn.js | 108 + vendors/moment/lang/zh-tw.js | 84 + vendors/moment/min/langs.js | 4969 +++++ vendors/moment/min/langs.min.js | 3 + vendors/moment/min/moment-with-langs.js | 6841 +++++++ vendors/moment/min/moment-with-langs.min.js | 9 + vendors/moment/min/moment.min.js | 6 + vendors/moment/moment.js | 2290 +++ vendors/moment/package.js | 11 + vendors/moment/package.json | 56 + vendors/moment/readme.md | 283 + vendors/normalize/normalize.css | 504 + vendors/rl/LICENSE | 20 + vendors/rl/rl-1.0.min.js | 2 + vendors/rl/rl.js | 64 + vendors/routes/crossroads.min.js | 14 + vendors/routes/hasher.min.js | 7 + vendors/routes/signals.min.js | 13 + vendors/select2-3.4.5/LICENSE | 18 + vendors/select2-3.4.5/README.md | 83 + vendors/select2-3.4.5/bower.json | 8 + vendors/select2-3.4.5/release.sh | 73 + vendors/select2-3.4.5/select2-bootstrap.css | 87 + vendors/select2-3.4.5/select2-spinner.gif | Bin 0 -> 1849 bytes vendors/select2-3.4.5/select2.css | 615 + vendors/select2-3.4.5/select2.jquery.json | 36 + vendors/select2-3.4.5/select2.js | 3255 ++++ vendors/select2-3.4.5/select2.min.js | 22 + vendors/select2-3.4.5/select2.png | Bin 0 -> 613 bytes vendors/select2-3.4.5/select2_locale_ar.js | 17 + vendors/select2-3.4.5/select2_locale_bg.js | 17 + vendors/select2-3.4.5/select2_locale_ca.js | 17 + vendors/select2-3.4.5/select2_locale_cs.js | 49 + vendors/select2-3.4.5/select2_locale_da.js | 17 + vendors/select2-3.4.5/select2_locale_de.js | 15 + vendors/select2-3.4.5/select2_locale_el.js | 17 + .../select2_locale_en.js.template | 17 + vendors/select2-3.4.5/select2_locale_es.js | 15 + vendors/select2-3.4.5/select2_locale_et.js | 17 + vendors/select2-3.4.5/select2_locale_eu.js | 43 + vendors/select2-3.4.5/select2_locale_fa.js | 17 + vendors/select2-3.4.5/select2_locale_fi.js | 28 + vendors/select2-3.4.5/select2_locale_fr.js | 15 + vendors/select2-3.4.5/select2_locale_gl.js | 43 + vendors/select2-3.4.5/select2_locale_he.js | 17 + vendors/select2-3.4.5/select2_locale_hr.js | 42 + vendors/select2-3.4.5/select2_locale_hu.js | 15 + vendors/select2-3.4.5/select2_locale_id.js | 17 + vendors/select2-3.4.5/select2_locale_is.js | 16 + vendors/select2-3.4.5/select2_locale_it.js | 15 + vendors/select2-3.4.5/select2_locale_ja.js | 15 + vendors/select2-3.4.5/select2_locale_ko.js | 17 + vendors/select2-3.4.5/select2_locale_lt.js | 29 + vendors/select2-3.4.5/select2_locale_lv.js | 16 + vendors/select2-3.4.5/select2_locale_mk.js | 17 + vendors/select2-3.4.5/select2_locale_ms.js | 17 + vendors/select2-3.4.5/select2_locale_nl.js | 15 + vendors/select2-3.4.5/select2_locale_no.js | 18 + vendors/select2-3.4.5/select2_locale_pl.js | 37 + vendors/select2-3.4.5/select2_locale_pt-BR.js | 15 + vendors/select2-3.4.5/select2_locale_pt-PT.js | 15 + vendors/select2-3.4.5/select2_locale_ro.js | 15 + vendors/select2-3.4.5/select2_locale_ru.js | 15 + vendors/select2-3.4.5/select2_locale_sk.js | 48 + vendors/select2-3.4.5/select2_locale_sv.js | 17 + vendors/select2-3.4.5/select2_locale_th.js | 17 + vendors/select2-3.4.5/select2_locale_tr.js | 17 + vendors/select2-3.4.5/select2_locale_ua.js | 17 + vendors/select2-3.4.5/select2_locale_vi.js | 18 + vendors/select2-3.4.5/select2_locale_zh-CN.js | 14 + vendors/select2-3.4.5/select2_locale_zh-TW.js | 14 + vendors/select2-3.4.5/select2x2.png | Bin 0 -> 845 bytes vendors/simple-pace/LICENSE | 20 + vendors/simple-pace/simple-pace-1.0.min.js | 2 + vendors/simple-pace/simple-pace.js | 142 + vendors/simple-pace/styles.css | 71 + vendors/underscore/CONTRIBUTING.md | 9 + vendors/underscore/LICENSE | 23 + vendors/underscore/README.md | 22 + vendors/underscore/bower.json | 6 + vendors/underscore/component.json | 10 + vendors/underscore/package.json | 25 + vendors/underscore/underscore-1.5.2.min.js | 5 + vendors/underscore/underscore-min.map | 1 + vendors/underscore/underscore.js | 1300 ++ 846 files changed, 99453 insertions(+), 2123 deletions(-) create mode 100644 .gitignore create mode 100644 Gruntfile.js create mode 100644 _include.php create mode 100644 dev/Admin/Domains.js create mode 100644 dev/Admin/General.js create mode 100644 dev/Admin/Licensing.js create mode 100644 dev/Admin/Login.js create mode 100644 dev/Admin/Packages.js create mode 100644 dev/Admin/Plugins.js create mode 100644 dev/Admin/Security.js create mode 100644 dev/Admin/Social.js create mode 100644 dev/Boots/AbstractApp.js create mode 100644 dev/Boots/AdminApp.js create mode 100644 dev/Boots/RainLoopApp.js create mode 100644 dev/Common/Base64.js create mode 100644 dev/Common/Constants.js create mode 100644 dev/Common/Enums.js create mode 100644 dev/Common/Globals.js create mode 100644 dev/Common/HtmlEditor.js create mode 100644 dev/Common/Knockout.js create mode 100644 dev/Common/LinkBuilder.js create mode 100644 dev/Common/Plugins.js create mode 100644 dev/Common/Selector.js create mode 100644 dev/Common/Utils.js create mode 100644 dev/Common/_Begin.js create mode 100644 dev/Common/_BeginA.js create mode 100644 dev/Common/_BeginW.js create mode 100644 dev/Common/_BootEnd.js create mode 100644 dev/Common/_CoreEnd.js create mode 100644 dev/Common/_End.js create mode 100644 dev/Common/_LibsEnd.js create mode 100644 dev/Knoin/AbstractBoot.js create mode 100644 dev/Knoin/AbstractScreen.js create mode 100644 dev/Knoin/AbstractViewModel.js create mode 100644 dev/Knoin/Knoin.js create mode 100644 dev/Models/AccountModel.js create mode 100644 dev/Models/AttachmentModel.js create mode 100644 dev/Models/ComposeAttachmentModel.js create mode 100644 dev/Models/ContactModel.js create mode 100644 dev/Models/EmailModel.js create mode 100644 dev/Models/FolderModel.js create mode 100644 dev/Models/IdentityModel.js create mode 100644 dev/Models/MessageModel.js create mode 100644 dev/Screens/AbstractSettings.js create mode 100644 dev/Screens/AdminLogin.js create mode 100644 dev/Screens/AdminSettings.js create mode 100644 dev/Screens/Login.js create mode 100644 dev/Screens/MailBox.js create mode 100644 dev/Screens/Settings.js create mode 100644 dev/Settings/Accounts.js create mode 100644 dev/Settings/ChangePassword.js create mode 100644 dev/Settings/Folders.js create mode 100644 dev/Settings/General.js create mode 100644 dev/Settings/Identities.js create mode 100644 dev/Settings/Personal.js create mode 100644 dev/Settings/Social.js create mode 100644 dev/Settings/Themes.js create mode 100644 dev/Storages/AbstractAjaxRemote.js create mode 100644 dev/Storages/AbstractCache.js create mode 100644 dev/Storages/AbstractData.js create mode 100644 dev/Storages/AdminAjaxRemote.js create mode 100644 dev/Storages/AdminCache.js create mode 100644 dev/Storages/AdminData.js create mode 100644 dev/Storages/LocalStorage.js create mode 100644 dev/Storages/LocalStorages/CookieDriver.js create mode 100644 dev/Storages/LocalStorages/LocalStorageDriver.js create mode 100644 dev/Storages/WebMailAjaxRemote.js create mode 100644 dev/Storages/WebMailCache.js create mode 100644 dev/Storages/WebMailData.js create mode 100644 dev/Styles/@Main.less create mode 100644 dev/Styles/Activate.less create mode 100644 dev/Styles/AddAccount.less create mode 100644 dev/Styles/Admin.less create mode 100644 dev/Styles/AdminDomain.less create mode 100644 dev/Styles/AdminDomains.less create mode 100644 dev/Styles/AdminGeneral.less create mode 100644 dev/Styles/AdminPackages.less create mode 100644 dev/Styles/AdminPlugin.less create mode 100644 dev/Styles/AdminPlugins.less create mode 100644 dev/Styles/AdvancedSearch.less create mode 100644 dev/Styles/Animations.less create mode 100644 dev/Styles/Compose.less create mode 100644 dev/Styles/Contacts.less create mode 100644 dev/Styles/Editor.less create mode 100644 dev/Styles/FolderClear.less create mode 100644 dev/Styles/FolderCreate.less create mode 100644 dev/Styles/FolderList.less create mode 100644 dev/Styles/FolderSystem.less create mode 100644 dev/Styles/Identity.less create mode 100644 dev/Styles/Languages.less create mode 100644 dev/Styles/Layout.less create mode 100644 dev/Styles/Login.less create mode 100644 dev/Styles/Main.less create mode 100644 dev/Styles/MessageList.less create mode 100644 dev/Styles/MessageView.less create mode 100644 dev/Styles/Scroll.less create mode 100644 dev/Styles/Settings.less create mode 100644 dev/Styles/SettingsAccounts.less create mode 100644 dev/Styles/SettingsFolders.less create mode 100644 dev/Styles/SettingsGeneral.less create mode 100644 dev/Styles/SettingsIdentities.less create mode 100644 dev/Styles/SettingsPersonal.less create mode 100644 dev/Styles/SettingsThemes.less create mode 100644 dev/Styles/SystemDropDown.less create mode 100644 dev/Styles/Ui.less create mode 100644 dev/Styles/_BootstrapFix.less create mode 100644 dev/Styles/_End.less create mode 100644 dev/Styles/_IcoMoonToBoot.less create mode 100644 dev/Styles/_Select2Fix.less create mode 100644 dev/Styles/_Values.less create mode 100644 dev/ViewModels/AbstractSystemDropDownViewModel.js create mode 100644 dev/ViewModels/AdminLoginViewModel.js create mode 100644 dev/ViewModels/AdminMenuViewModel.js create mode 100644 dev/ViewModels/AdminPaneViewModel.js create mode 100644 dev/ViewModels/LoginViewModel.js create mode 100644 dev/ViewModels/MailBoxFolderListViewModel.js create mode 100644 dev/ViewModels/MailBoxMessageListViewModel.js create mode 100644 dev/ViewModels/MailBoxMessageViewViewModel.js create mode 100644 dev/ViewModels/MailBoxSystemDropDownViewModel.js create mode 100644 dev/ViewModels/PopupsActivateViewModel.js create mode 100644 dev/ViewModels/PopupsAddAccountViewModel.js create mode 100644 dev/ViewModels/PopupsAdvancedSearchViewModel.js create mode 100644 dev/ViewModels/PopupsComposeViewModel.js create mode 100644 dev/ViewModels/PopupsContactsViewModel.js create mode 100644 dev/ViewModels/PopupsDomainViewModel.js create mode 100644 dev/ViewModels/PopupsFolderClearViewModel.js create mode 100644 dev/ViewModels/PopupsFolderCreateViewModel.js create mode 100644 dev/ViewModels/PopupsFolderSystemViewModel.js create mode 100644 dev/ViewModels/PopupsIdentityViewModel.js create mode 100644 dev/ViewModels/PopupsLanguagesViewModel.js create mode 100644 dev/ViewModels/PopupsPluginViewModel.js create mode 100644 dev/ViewModels/SettingsMenuViewModel.js create mode 100644 dev/ViewModels/SettingsPaneViewModel.js create mode 100644 dev/ViewModels/SettingsSystemDropDownViewModel.js create mode 100644 package.json create mode 100644 rainloop/v/0.0.0/VERSION rename rainloop/v/{1.3.10.492 => 0.0.0}/app/.htaccess (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/domains/disabled (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/domains/gmail.com.ini (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/domains/outlook.com.ini (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/domains/yahoo.com.ini (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/handle.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/langs.ini (100%) create mode 100644 rainloop/v/0.0.0/app/i18n/moment/CONTRIBUTING.md create mode 100644 rainloop/v/0.0.0/app/i18n/moment/LICENSE rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/ar-ma.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/ar.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/bg.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/br.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/bs.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/ca.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/cs.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/cv.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/da.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/de.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/el.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/en-au.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/en-ca.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/en-gb.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/eo.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/es.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/et.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/eu.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/fa.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/fi.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/fr-ca.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/fr.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/gl.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/he.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/hi.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/hr.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/hu.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/id.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/is.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/it.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/ja.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/ka.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/ko.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/lt.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/lv.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/ml.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/mr.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/ms-my.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/nb.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/ne.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/nl.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/nn.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/pl.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/pt-br.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/pt.js (100%) create mode 100644 rainloop/v/0.0.0/app/i18n/moment/readme.md rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/ro.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/ru.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/sk.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/sl.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/sq.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/sv.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/th.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/tr.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/tzm-la.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/tzm.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/uk.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/uz.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/vn.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/zh-cn.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/i18n/moment/zh-tw.js (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/Collection.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/Crypt.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/DateTimeHelper.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/Enumerations/Charset.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/Enumerations/Encoding.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/Exceptions/Exception.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/HtmlUtils.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/Http.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/LinkFinder.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/Loader.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/ResourceRegistry.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/StreamWrappers/Binary.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/StreamWrappers/Literal.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/StreamWrappers/Test.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/Utils.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Base/Validator.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Cache/CacheClient.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Cache/DriverInterface.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Cache/Drivers/APC.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Cache/Drivers/File.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Cache/Drivers/Memcache.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/BodyStructure.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Enumerations/FetchType.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Enumerations/FolderResponseStatus.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Enumerations/FolderStatus.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Enumerations/FolderType.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Enumerations/MessageFlag.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Enumerations/ResponseStatus.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Enumerations/ResponseType.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Enumerations/StoreAction.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Exceptions/Exception.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Exceptions/InvalidResponseException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Exceptions/LoginBadCredentialsException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Exceptions/LoginBadMethodException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Exceptions/LoginException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Exceptions/NegativeResponseException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Exceptions/ResponseException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Exceptions/RuntimeException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/FetchResponse.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Folder.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/FolderInformation.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/ImapClient.php (96%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/NamespaceResult.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/Response.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Imap/SearchBuilder.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Log/Driver.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Log/Drivers/Callback.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Log/Drivers/File.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Log/Drivers/Inline.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Log/Enumerations/Type.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Log/Logger.php (83%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mail/Attachment.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mail/AttachmentCollection.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mail/Exceptions/Exception.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mail/Exceptions/NonEmptyFolder.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mail/Exceptions/RuntimeException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mail/Folder.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mail/FolderCollection.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mail/MailClient.php (96%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mail/Message.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mail/MessageCollection.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/MailSo.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Attachment.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/AttachmentCollection.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Email.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/EmailCollection.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Enumerations/Constants.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Enumerations/Header.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Enumerations/MessagePriority.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Enumerations/MimeType.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Enumerations/Parameter.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Enumerations/Sensitivity.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Header.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/HeaderCollection.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Message.php (90%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Parameter.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/ParameterCollection.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Parser/ParserEmpty.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Parser/ParserInterface.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Parser/ParserMemory.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/Part.php (98%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Mime/PartCollection.php (80%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/Exceptions/ConnectionException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/Exceptions/Exception.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/Exceptions/InvalidArgumentException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/Exceptions/SocketAlreadyConnectedException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/Exceptions/SocketCanNotConnectToHostException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/Exceptions/SocketReadException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/Exceptions/SocketReadTimeoutException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/Exceptions/SocketUnreadBufferException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/Exceptions/SocketUnsuppoterdSecureConnectionException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/Exceptions/SocketWriteException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Net/NetClient.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Pop3/Exceptions/Exception.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Pop3/Exceptions/LoginBadCredentialsException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Pop3/Exceptions/NegativeResponseException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Pop3/Exceptions/ResponseException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Pop3/Pop3Client.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Poppassd/Exceptions/Exception.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Poppassd/Exceptions/LoginBadCredentialsException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Poppassd/Exceptions/NegativeResponseException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Poppassd/Exceptions/ResponseException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Poppassd/PoppassdClient.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Sieve/Exceptions/Exception.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Sieve/Exceptions/LoginBadCredentialsException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Sieve/Exceptions/LoginBadMethodException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Sieve/Exceptions/LoginException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Sieve/Exceptions/NegativeResponseException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Sieve/Exceptions/ResponseException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Sieve/ManageSieveClient.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Smtp/Exceptions/Exception.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Smtp/Exceptions/LoginBadCredentialsException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Smtp/Exceptions/LoginBadMethodException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Smtp/Exceptions/LoginException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Smtp/Exceptions/NegativeResponseException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Smtp/Exceptions/ResponseException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Smtp/SmtpClient.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/MailSo/Version.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/PHP-OAuth2/Client.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/PHP-OAuth2/GrantType/ClientCredentials.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/PHP-OAuth2/GrantType/IGrantType.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/PHP-OAuth2/GrantType/Password.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/PHP-OAuth2/GrantType/RefreshToken.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/PHP-OAuth2/README (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Account.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Actions.php (95%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Config/AbstractConfig.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Config/Application.php (98%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Config/Plugin.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Domain.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Enumerations/CustomThemeType.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Enumerations/InterfaceAnimation.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Enumerations/PluginPropertyType.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Enumerations/SignMeType.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Enumerations/TimeFormat.php (100%) rename rainloop/v/{1.3.10.492/app/libraries/RainLoop/Providers/Storage => 0.0.0/app/libraries/RainLoop}/Enumerations/UploadClientError.php (83%) rename rainloop/v/{1.3.10.492/app/libraries/RainLoop/Providers/Storage => 0.0.0/app/libraries/RainLoop}/Enumerations/UploadError.php (76%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Exceptions/AuthException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Exceptions/ClientException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Exceptions/Exception.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Exceptions/InvalidArgumentException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Exceptions/RuntimeException.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Identity.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Notifications.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Plugins/AbstractPlugin.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Plugins/Manager.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Plugins/Property.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/AbstractProvider.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/ChangePassword.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/ChangePassword/ChangePasswordInterface.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Contacts.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Contacts/Classes/Contact.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Contacts/Classes/Db.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Contacts/ContactsInterface.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Contacts/DefaultContacts.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Domain.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Domain/DefaultDomain.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Domain/DomainAdminInterface.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Domain/DomainInterface.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Domain/DomainSimpleInterface.php (100%) create mode 100644 rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files.php create mode 100644 rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/DefaultStorage.php create mode 100644 rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/FilesInterface.php rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Login.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Login/DefaultLogin.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Login/LoginInterface.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Settings.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Settings/DefaultSettings.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Settings/SettingsInterface.php (100%) create mode 100644 rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Storage.php create mode 100644 rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Storage/DefaultStorage.php rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Storage/Enumerations/StorageType.php (82%) create mode 100644 rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Storage/StorageInterface.php rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Suggestions.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Providers/Suggestions/SuggestionsInterface.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Service.php (93%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/ServiceActions.php (99%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Settings.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Social.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/RainLoop/Utils.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/facebook/base_facebook.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/facebook/facebook.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/facebook/fb_ca_chain_bundle.crt (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/lessphp/LICENSE (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/lessphp/README.md (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/lessphp/ctype.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/lessphp/lessc.inc.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/pclzip/gnu-lgpl.txt (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/pclzip/pclzip.lib.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/pclzip/readme.txt (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/tmhOAuth/LICENSE (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/tmhOAuth/README.md (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/tmhOAuth/cacert.pem (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/tmhOAuth/tmhOAuth.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/libraries/tmhOAuth/tmhUtilities.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/BadBrowser.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Error.html (100%) create mode 100644 rainloop/v/0.0.0/app/templates/Index.html rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Themes/custom-values-dark.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Themes/custom-values-light.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Themes/template.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Themes/values.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/AdminLogin.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/AdminMenu.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/AdminPane.html (100%) rename rainloop/v/{1.3.10.492/app/templates/Views/AdminDomainListItem.html => 0.0.0/app/templates/Views/AdminSettingsDomainListItem.html} (100%) rename rainloop/v/{1.3.10.492/app/templates/Views/AdminDomains.html => 0.0.0/app/templates/Views/AdminSettingsDomains.html} (87%) rename rainloop/v/{1.3.10.492/app/templates/Views/AdminGeneral.html => 0.0.0/app/templates/Views/AdminSettingsGeneral.html} (68%) rename rainloop/v/{1.3.10.492/app/templates/Views/AdminLicensing.html => 0.0.0/app/templates/Views/AdminSettingsLicensing.html} (100%) create mode 100644 rainloop/v/0.0.0/app/templates/Views/AdminSettingsLogin.html rename rainloop/v/{1.3.10.492/app/templates/Views/AdminPackages.html => 0.0.0/app/templates/Views/AdminSettingsPackages.html} (78%) rename rainloop/v/{1.3.10.492/app/templates/Views/AdminPackagesListItem.html => 0.0.0/app/templates/Views/AdminSettingsPackagesListItem.html} (100%) rename rainloop/v/{1.3.10.492/app/templates/Views/AdminPackagesTable.html => 0.0.0/app/templates/Views/AdminSettingsPackagesTable.html} (71%) rename rainloop/v/{1.3.10.492/app/templates/Views/AdminPluginListItem.html => 0.0.0/app/templates/Views/AdminSettingsPluginListItem.html} (100%) rename rainloop/v/{1.3.10.492/app/templates/Views/AdminPluginProperty.html => 0.0.0/app/templates/Views/AdminSettingsPluginProperty.html} (100%) rename rainloop/v/{1.3.10.492/app/templates/Views/AdminPlugins.html => 0.0.0/app/templates/Views/AdminSettingsPlugins.html} (93%) rename rainloop/v/{1.3.10.492/app/templates/Views/AdminSecurity.html => 0.0.0/app/templates/Views/AdminSettingsSecurity.html} (100%) rename rainloop/v/{1.3.10.492/app/templates/Views/AdminSocial.html => 0.0.0/app/templates/Views/AdminSettingsSocial.html} (92%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/ComposeAttachment.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/ComposeAttachmentInProcess.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/Login.html (97%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/MailFolderList.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/MailFolderListItem.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/MailFolderListSystemItem.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/MailMessageList.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/MailMessageListItem.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/MailMessageListItemNoPreviewPane.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/MailMessageView.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsActivate.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsAddAccount.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsAdvancedSearch.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsCompose.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsContacts.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsDomain.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsFolderClear.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsFolderCreate.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsFolderSystem.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsIdentity.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsLanguages.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsPlugin.html (91%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/PopupsWindowSimpleMessage.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SettingsAccounts.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SettingsChangePassword.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SettingsCustom.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SettingsFolderItem.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SettingsFolders.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SettingsGeneral.html (98%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SettingsIdentities.html (93%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SettingsMenu.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SettingsPane.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SettingsPersonal.html (86%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SettingsSocial.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SettingsThemes.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/app/templates/Views/SystemDropDown.html (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/check.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/index.php (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/langs/de.ini (99%) rename rainloop/v/{1.3.10.492 => 0.0.0}/langs/en.ini (99%) rename rainloop/v/{1.3.10.492 => 0.0.0}/langs/es.ini (99%) rename rainloop/v/{1.3.10.492 => 0.0.0}/langs/fr.ini (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/langs/is.ini (99%) rename rainloop/v/{1.3.10.492 => 0.0.0}/langs/lv.ini (99%) rename rainloop/v/{1.3.10.492 => 0.0.0}/langs/nl.ini (99%) rename rainloop/v/{1.3.10.492 => 0.0.0}/langs/pt-br.ini (99%) rename rainloop/v/{1.3.10.492 => 0.0.0}/langs/ru.ini (99%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/browsers/chrome.gif (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/browsers/firefox.gif (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/browsers/opera.gif (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/browsers/safari.gif (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/app.css (94%) create mode 100644 rainloop/v/0.0.0/static/css/app.min.css rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/flags.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/fonts/icomoon.dev.svg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/fonts/icomoon.eot (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/fonts/icomoon.svg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/fonts/icomoon.ttf (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/fonts/icomoon.woff (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/images/editor.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/images/empty-contact.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/images/grey.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/images/icom-message-notification.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/images/loader-black.gif (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/images/loader-white.gif (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/images/sync.gif (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/images/sync.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/images/white.png (100%) create mode 100644 rainloop/v/0.0.0/static/css/less.css rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/select2-spinner.gif (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/select2.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/css/select2x2.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/favicon.ico (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/favicon.png (100%) create mode 100644 rainloop/v/0.0.0/static/js/admin.js create mode 100644 rainloop/v/0.0.0/static/js/admin.min.js create mode 100644 rainloop/v/0.0.0/static/js/app.js create mode 100644 rainloop/v/0.0.0/static/js/app.min.js rename rainloop/v/{1.3.10.492/app/templates/Index.html => 0.0.0/static/js/boot.js} (64%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/js/libs.js (74%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/amazon.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/apple.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/asana.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/battle.net.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/cnet.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/ea.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/ebay.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/facebook.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/github.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/google-plus.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/google.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/icloud.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/microsoft.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/myspace.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/onlive.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/paypal.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/skype.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/steam.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/ted.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/twitter.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/services/youtube.gif (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/sounds/new-mail.mp3 (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/static/sounds/new-mail.ogg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/A/images/background.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/A/images/preview.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/A/styles.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Clear/images/preview.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Clear/styles.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Custom/ext.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Custom/images/preview.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Default/images/background.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Default/images/background.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Default/images/preview.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Default/styles.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Linen/images/background.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Linen/images/background.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Linen/images/preview.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Linen/styles.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Love/images/background.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Love/images/preview.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Love/styles.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Snow/images/background.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Snow/images/preview.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Snow/styles.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Squares/images/background.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Squares/images/background.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Squares/images/preview.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Squares/styles.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/SquaresDark/images/background.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/SquaresDark/images/background.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/SquaresDark/images/preview.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/SquaresDark/styles.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Stripes/images/background.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Stripes/images/preview.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Stripes/styles.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Wood/images/background.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Wood/images/background.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Wood/images/preview.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Wood/styles.less (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Xv/images/background.jpg (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Xv/images/background.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Xv/images/preview.png (100%) rename rainloop/v/{1.3.10.492 => 0.0.0}/themes/Xv/styles.less (100%) delete mode 100644 rainloop/v/1.3.10.492/LICENSE delete mode 100644 rainloop/v/1.3.10.492/VERSION delete mode 100644 rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage.php delete mode 100644 rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/DefaultStorage.php delete mode 100644 rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/StorageInterface.php delete mode 100644 rainloop/v/1.3.10.492/static/css/app.min.css delete mode 100644 rainloop/v/1.3.10.492/static/js/admin.min.js delete mode 100644 rainloop/v/1.3.10.492/static/js/app.min.js create mode 100644 vendors/bootstrap/LICENSE create mode 100644 vendors/bootstrap/img/glyphicons-halflings-white.png create mode 100644 vendors/bootstrap/img/glyphicons-halflings.png create mode 100644 vendors/bootstrap/js/bootstrap.min.js create mode 100644 vendors/bootstrap/js/bootstrap.min.orig.js create mode 100644 vendors/bootstrap/less/accordion.less create mode 100644 vendors/bootstrap/less/alerts.less create mode 100644 vendors/bootstrap/less/bootstrap.less create mode 100644 vendors/bootstrap/less/breadcrumbs.less create mode 100644 vendors/bootstrap/less/button-groups.less create mode 100644 vendors/bootstrap/less/buttons.less create mode 100644 vendors/bootstrap/less/carousel.less create mode 100644 vendors/bootstrap/less/close.less create mode 100644 vendors/bootstrap/less/code.less create mode 100644 vendors/bootstrap/less/component-animations.less create mode 100644 vendors/bootstrap/less/dropdowns.less create mode 100644 vendors/bootstrap/less/forms.less create mode 100644 vendors/bootstrap/less/grid.less create mode 100644 vendors/bootstrap/less/hero-unit.less create mode 100644 vendors/bootstrap/less/labels-badges.less create mode 100644 vendors/bootstrap/less/layouts.less create mode 100644 vendors/bootstrap/less/mixins.less create mode 100644 vendors/bootstrap/less/modals.less create mode 100644 vendors/bootstrap/less/navbar.less create mode 100644 vendors/bootstrap/less/navs.less create mode 100644 vendors/bootstrap/less/pager.less create mode 100644 vendors/bootstrap/less/pagination.less create mode 100644 vendors/bootstrap/less/popovers.less create mode 100644 vendors/bootstrap/less/progress-bars.less create mode 100644 vendors/bootstrap/less/reset.less create mode 100644 vendors/bootstrap/less/responsive-1200px-min.less create mode 100644 vendors/bootstrap/less/responsive-767px-max.less create mode 100644 vendors/bootstrap/less/responsive-768px-979px.less create mode 100644 vendors/bootstrap/less/responsive-navbar.less create mode 100644 vendors/bootstrap/less/responsive-utilities.less create mode 100644 vendors/bootstrap/less/responsive.less create mode 100644 vendors/bootstrap/less/scaffolding.less create mode 100644 vendors/bootstrap/less/sprites.less create mode 100644 vendors/bootstrap/less/tables.less create mode 100644 vendors/bootstrap/less/thumbnails.less create mode 100644 vendors/bootstrap/less/tooltip.less create mode 100644 vendors/bootstrap/less/type.less create mode 100644 vendors/bootstrap/less/utilities.less create mode 100644 vendors/bootstrap/less/variables.less create mode 100644 vendors/bootstrap/less/wells.less create mode 100644 vendors/flags/flags-fixed.css create mode 100644 vendors/flags/flags.css create mode 100644 vendors/flags/flags.png create mode 100644 vendors/icomoon/Read Me.txt create mode 100644 vendors/icomoon/fonts/icomoon.dev.svg create mode 100644 vendors/icomoon/fonts/icomoon.eot create mode 100644 vendors/icomoon/fonts/icomoon.svg create mode 100644 vendors/icomoon/fonts/icomoon.ttf create mode 100644 vendors/icomoon/fonts/icomoon.woff create mode 100644 vendors/icomoon/index.html create mode 100644 vendors/icomoon/license.txt create mode 100644 vendors/icomoon/lte-ie7.js create mode 100644 vendors/icomoon/style.css create mode 100644 vendors/jquery-1.10.1.min.js create mode 100644 vendors/jquery-cookie/CHANGELOG.md create mode 100644 vendors/jquery-cookie/CONTRIBUTING.md create mode 100644 vendors/jquery-cookie/MIT-LICENSE.txt create mode 100644 vendors/jquery-cookie/README.md create mode 100644 vendors/jquery-cookie/bower.json create mode 100644 vendors/jquery-cookie/cookie.jquery.json create mode 100644 vendors/jquery-cookie/jquery.cookie-1.4.0.min.js create mode 100644 vendors/jquery-cookie/jquery.cookie.js create mode 100644 vendors/jquery-cookie/package.json create mode 100644 vendors/jquery-lazyload/jquery.lazyload.js create mode 100644 vendors/jquery-lazyload/jquery.lazyload.min.js create mode 100644 vendors/jquery-magnific-popup/README.md create mode 100644 vendors/jquery-magnific-popup/bower.json create mode 100644 vendors/jquery-magnific-popup/jquery.magnific-popup.js create mode 100644 vendors/jquery-magnific-popup/jquery.magnific-popup.min.js create mode 100644 vendors/jquery-magnific-popup/magnific-popup-animations.css create mode 100644 vendors/jquery-magnific-popup/magnific-popup.css create mode 100644 vendors/jquery-magnific-popup/magnific-popup.jquery.json create mode 100644 vendors/jquery-magnific-popup/package.json create mode 100644 vendors/jquery-mousewheel/ChangeLog.markdown create mode 100644 vendors/jquery-mousewheel/LICENSE.txt create mode 100644 vendors/jquery-mousewheel/README.markdown create mode 100644 vendors/jquery-mousewheel/jquery.mousewheel-3.1.4.min.js create mode 100644 vendors/jquery-mousewheel/jquery.mousewheel.js create mode 100644 vendors/jquery-mousewheel/mousewheel.jquery.json create mode 100644 vendors/jquery-mousewheel/package.json create mode 100644 vendors/jquery-nanoscroller/jquery.nanoscroller-0.7.min.js create mode 100644 vendors/jquery-nanoscroller/jquery.nanoscroller.js create mode 100644 vendors/jquery-nanoscroller/jquery.nanoscroller.orig.js create mode 100644 vendors/jquery-nanoscroller/jquery.nanoscroller.orig.min.js create mode 100644 vendors/jquery-nanoscroller/nanoscroller.css create mode 100644 vendors/jquery-scrollstop/jquery.scrollstop.js create mode 100644 vendors/jquery-scrollstop/jquery.scrollstop.min.js create mode 100644 vendors/jquery-ui/AUTHORS.txt create mode 100644 vendors/jquery-ui/MIT-LICENSE.txt create mode 100644 vendors/jquery-ui/README.md create mode 100644 vendors/jquery-ui/css/no-theme/jquery-ui-1.10.3.custom.css create mode 100644 vendors/jquery-ui/css/no-theme/jquery-ui-1.10.3.custom.min.css create mode 100644 vendors/jquery-ui/js/jquery-ui-1.10.3.custom.js create mode 100644 vendors/jquery-ui/js/jquery-ui-1.10.3.custom.min.js create mode 100644 vendors/jquery-ui/package.json create mode 100644 vendors/jquery-wakeup/jquery.wakeup.js create mode 100644 vendors/jquery-wakeup/jquery.wakeup.min.js create mode 100644 vendors/json2.min.js create mode 100644 vendors/jua/jua.js create mode 100644 vendors/jua/jua.min.js create mode 100644 vendors/knockout/README.md create mode 100644 vendors/knockout/knockout-3.0.0.js create mode 100644 vendors/knockout/package.json create mode 100644 vendors/magnific-popup/magnific-popup.css create mode 100644 vendors/magnific-popup/magnific-popup.min.js create mode 100644 vendors/modernizr.js create mode 100644 vendors/moment/CONTRIBUTING.md create mode 100644 vendors/moment/LICENSE create mode 100644 vendors/moment/bower.json create mode 100644 vendors/moment/component.json create mode 100644 vendors/moment/composer.json create mode 100644 vendors/moment/lang/ar-ma.js create mode 100644 vendors/moment/lang/ar.js create mode 100644 vendors/moment/lang/bg.js create mode 100644 vendors/moment/lang/br.js create mode 100644 vendors/moment/lang/bs.js create mode 100644 vendors/moment/lang/ca.js create mode 100644 vendors/moment/lang/cs.js create mode 100644 vendors/moment/lang/cv.js create mode 100644 vendors/moment/lang/da.js create mode 100644 vendors/moment/lang/de.js create mode 100644 vendors/moment/lang/el.js create mode 100644 vendors/moment/lang/en-au.js create mode 100644 vendors/moment/lang/en-ca.js create mode 100644 vendors/moment/lang/en-gb.js create mode 100644 vendors/moment/lang/eo.js create mode 100644 vendors/moment/lang/es.js create mode 100644 vendors/moment/lang/et.js create mode 100644 vendors/moment/lang/eu.js create mode 100644 vendors/moment/lang/fa.js create mode 100644 vendors/moment/lang/fi.js create mode 100644 vendors/moment/lang/fr-ca.js create mode 100644 vendors/moment/lang/fr.js create mode 100644 vendors/moment/lang/gl.js create mode 100644 vendors/moment/lang/he.js create mode 100644 vendors/moment/lang/hi.js create mode 100644 vendors/moment/lang/hr.js create mode 100644 vendors/moment/lang/hu.js create mode 100644 vendors/moment/lang/id.js create mode 100644 vendors/moment/lang/is.js create mode 100644 vendors/moment/lang/it.js create mode 100644 vendors/moment/lang/ja.js create mode 100644 vendors/moment/lang/ka.js create mode 100644 vendors/moment/lang/ko.js create mode 100644 vendors/moment/lang/lt.js create mode 100644 vendors/moment/lang/lv.js create mode 100644 vendors/moment/lang/ml.js create mode 100644 vendors/moment/lang/mr.js create mode 100644 vendors/moment/lang/ms-my.js create mode 100644 vendors/moment/lang/nb.js create mode 100644 vendors/moment/lang/ne.js create mode 100644 vendors/moment/lang/nl.js create mode 100644 vendors/moment/lang/nn.js create mode 100644 vendors/moment/lang/pl.js create mode 100644 vendors/moment/lang/pt-br.js create mode 100644 vendors/moment/lang/pt.js create mode 100644 vendors/moment/lang/ro.js create mode 100644 vendors/moment/lang/ru.js create mode 100644 vendors/moment/lang/sk.js create mode 100644 vendors/moment/lang/sl.js create mode 100644 vendors/moment/lang/sq.js create mode 100644 vendors/moment/lang/sv.js create mode 100644 vendors/moment/lang/th.js create mode 100644 vendors/moment/lang/tr.js create mode 100644 vendors/moment/lang/tzm-la.js create mode 100644 vendors/moment/lang/tzm.js create mode 100644 vendors/moment/lang/uk.js create mode 100644 vendors/moment/lang/uz.js create mode 100644 vendors/moment/lang/vn.js create mode 100644 vendors/moment/lang/zh-cn.js create mode 100644 vendors/moment/lang/zh-tw.js create mode 100644 vendors/moment/min/langs.js create mode 100644 vendors/moment/min/langs.min.js create mode 100644 vendors/moment/min/moment-with-langs.js create mode 100644 vendors/moment/min/moment-with-langs.min.js create mode 100644 vendors/moment/min/moment.min.js create mode 100644 vendors/moment/moment.js create mode 100644 vendors/moment/package.js create mode 100644 vendors/moment/package.json create mode 100644 vendors/moment/readme.md create mode 100644 vendors/normalize/normalize.css create mode 100644 vendors/rl/LICENSE create mode 100644 vendors/rl/rl-1.0.min.js create mode 100644 vendors/rl/rl.js create mode 100644 vendors/routes/crossroads.min.js create mode 100644 vendors/routes/hasher.min.js create mode 100644 vendors/routes/signals.min.js create mode 100644 vendors/select2-3.4.5/LICENSE create mode 100644 vendors/select2-3.4.5/README.md create mode 100644 vendors/select2-3.4.5/bower.json create mode 100644 vendors/select2-3.4.5/release.sh create mode 100644 vendors/select2-3.4.5/select2-bootstrap.css create mode 100644 vendors/select2-3.4.5/select2-spinner.gif create mode 100644 vendors/select2-3.4.5/select2.css create mode 100644 vendors/select2-3.4.5/select2.jquery.json create mode 100644 vendors/select2-3.4.5/select2.js create mode 100644 vendors/select2-3.4.5/select2.min.js create mode 100644 vendors/select2-3.4.5/select2.png create mode 100644 vendors/select2-3.4.5/select2_locale_ar.js create mode 100644 vendors/select2-3.4.5/select2_locale_bg.js create mode 100644 vendors/select2-3.4.5/select2_locale_ca.js create mode 100644 vendors/select2-3.4.5/select2_locale_cs.js create mode 100644 vendors/select2-3.4.5/select2_locale_da.js create mode 100644 vendors/select2-3.4.5/select2_locale_de.js create mode 100644 vendors/select2-3.4.5/select2_locale_el.js create mode 100644 vendors/select2-3.4.5/select2_locale_en.js.template create mode 100644 vendors/select2-3.4.5/select2_locale_es.js create mode 100644 vendors/select2-3.4.5/select2_locale_et.js create mode 100644 vendors/select2-3.4.5/select2_locale_eu.js create mode 100644 vendors/select2-3.4.5/select2_locale_fa.js create mode 100644 vendors/select2-3.4.5/select2_locale_fi.js create mode 100644 vendors/select2-3.4.5/select2_locale_fr.js create mode 100644 vendors/select2-3.4.5/select2_locale_gl.js create mode 100644 vendors/select2-3.4.5/select2_locale_he.js create mode 100644 vendors/select2-3.4.5/select2_locale_hr.js create mode 100644 vendors/select2-3.4.5/select2_locale_hu.js create mode 100644 vendors/select2-3.4.5/select2_locale_id.js create mode 100644 vendors/select2-3.4.5/select2_locale_is.js create mode 100644 vendors/select2-3.4.5/select2_locale_it.js create mode 100644 vendors/select2-3.4.5/select2_locale_ja.js create mode 100644 vendors/select2-3.4.5/select2_locale_ko.js create mode 100644 vendors/select2-3.4.5/select2_locale_lt.js create mode 100644 vendors/select2-3.4.5/select2_locale_lv.js create mode 100644 vendors/select2-3.4.5/select2_locale_mk.js create mode 100644 vendors/select2-3.4.5/select2_locale_ms.js create mode 100644 vendors/select2-3.4.5/select2_locale_nl.js create mode 100644 vendors/select2-3.4.5/select2_locale_no.js create mode 100644 vendors/select2-3.4.5/select2_locale_pl.js create mode 100644 vendors/select2-3.4.5/select2_locale_pt-BR.js create mode 100644 vendors/select2-3.4.5/select2_locale_pt-PT.js create mode 100644 vendors/select2-3.4.5/select2_locale_ro.js create mode 100644 vendors/select2-3.4.5/select2_locale_ru.js create mode 100644 vendors/select2-3.4.5/select2_locale_sk.js create mode 100644 vendors/select2-3.4.5/select2_locale_sv.js create mode 100644 vendors/select2-3.4.5/select2_locale_th.js create mode 100644 vendors/select2-3.4.5/select2_locale_tr.js create mode 100644 vendors/select2-3.4.5/select2_locale_ua.js create mode 100644 vendors/select2-3.4.5/select2_locale_vi.js create mode 100644 vendors/select2-3.4.5/select2_locale_zh-CN.js create mode 100644 vendors/select2-3.4.5/select2_locale_zh-TW.js create mode 100644 vendors/select2-3.4.5/select2x2.png create mode 100644 vendors/simple-pace/LICENSE create mode 100644 vendors/simple-pace/simple-pace-1.0.min.js create mode 100644 vendors/simple-pace/simple-pace.js create mode 100644 vendors/simple-pace/styles.css create mode 100644 vendors/underscore/CONTRIBUTING.md create mode 100644 vendors/underscore/LICENSE create mode 100644 vendors/underscore/README.md create mode 100644 vendors/underscore/bower.json create mode 100644 vendors/underscore/component.json create mode 100644 vendors/underscore/package.json create mode 100644 vendors/underscore/underscore-1.5.2.min.js create mode 100644 vendors/underscore/underscore-min.map create mode 100644 vendors/underscore/underscore.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..8ca891877 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/.idea +/nbproject +/npm-debug.log +/node_modules +/build/dist +/build/tmp +/data \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 000000000..c858d6def --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,382 @@ + +/*jshint node: true */ + +'use strict'; + +module.exports = function(grunt) { + + grunt.initConfig({ + pkg: grunt.file.readJSON("package.json"), + less: { + development: { + files: { + "rainloop/v/<%= pkg.version %>/static/css/less.css": "dev/Styles/@Main.less" + } + } + }, + jshint: { + files: [ + 'Gruntfile.js', + 'rainloop/v/<%= pkg.version %>/static/js/app.js', + 'rainloop/v/<%= pkg.version %>/static/js/admin.js' + ], + options: { + boss: true, + browser: true, + curly: true, + eqeqeq: true, + eqnull: true, + expr: true, + evil: true, + newcap: true, + noarg: true, + undef: true, + smarttabs: true, + sub: true, + globals: { + define: true, + window: true, + jQuery: true, + ko: true, + console: true, + moment: true, + crossroads: true, + hasher: true, + Jua: true, + _: true, + Dropbox: true + } + } + }, + uglify: { + options: { + compress: true, + mangle: true, + preserveComments: "some" + }, + cookie: { + options: { + banner: "/*! jquery.cookie v1.4.0 (c) 2013 Klaus Hartl | MIT */\n", + preserveComments: "false" + }, + src: "vendors/jquery-cookie/jquery.cookie.js", + dest: "vendors/jquery-cookie/jquery.cookie-1.4.0.min.js" + }, + wakeup: { + options: { + banner: "/*! jQuery WakeUp plugin (c) 2013 Paul Okopny | MIT */\n", + preserveComments: "false" + }, + src: "vendors/jquery-wakeup/jquery.wakeup.js", + dest: "vendors/jquery-wakeup/jquery.wakeup.min.js" + }, + mousewheel: { + options: { + banner: "/*! jquery.mousewheel v3.1.4 (c) 2013 Brandon Aaron (http://brandon.aaron.sh) | MIT */\n", + preserveComments: "false" + }, + src: "vendors/jquery-mousewheel/jquery.mousewheel.js", + dest: "vendors/jquery-mousewheel/jquery.mousewheel-3.1.4.min.js" + }, + nano: { + options: { + banner: "/*! nanoScrollerJS v0.7 (c) 2013 James Florentino; modified by RainLoop Team | MIT */\n", + preserveComments: "false" + }, + src: "vendors/jquery-nanoscroller/jquery.nanoscroller.js", + dest: "vendors/jquery-nanoscroller/jquery.nanoscroller-0.7.min.js" + }, + pace: { + src: "vendors/simple-pace/simple-pace.js", + dest: "vendors/simple-pace/simple-pace-1.0.min.js" + }, + rl: { + src: "vendors/rl/rl.js", + dest: "vendors/rl/rl-1.0.min.js" + }, + min_app: { + src: "rainloop/v/<%= pkg.version %>/static/js/app.js", + dest: "rainloop/v/<%= pkg.version %>/static/js/app.min.js" + }, + min_admin: { + src: "rainloop/v/<%= pkg.version %>/static/js/admin.js", + dest: "rainloop/v/<%= pkg.version %>/static/js/admin.min.js" + } + }, + concat: { + js_index: { + nonull: true, + src: [ + "vendors/json2.min.js", + "vendors/simple-pace/simple-pace-1.0.min.js", + "vendors/rl/rl-1.0.min.js" + ], + dest: "rainloop/v/<%= pkg.version %>/static/js/boot.js" + }, + js_libs: { + nonull: true, + options: { + separator: "\n\n" + }, + src: [ + "vendors/modernizr.js", + "vendors/underscore/underscore-1.5.2.min.js", + "vendors/jquery-1.10.1.min.js", + "vendors/jquery-ui/js/jquery-ui-1.10.3.custom.min.js", + "vendors/jquery-cookie/jquery.cookie-1.4.0.min.js", + "vendors/jquery-mousewheel/jquery.mousewheel-3.1.4.min.js", + "vendors/jquery-scrollstop/jquery.scrollstop.min.js", + "vendors/jquery-lazyload/jquery.lazyload.min.js", + "vendors/jquery-nanoscroller/jquery.nanoscroller-0.7.min.js", + "vendors/jquery-wakeup/jquery.wakeup.min.js", + "vendors/moment/min/moment.min.js ", + "vendors/routes/signals.min.js", + "vendors/routes/hasher.min.js", + "vendors/routes/crossroads.min.js", + "vendors/knockout/knockout-3.0.0.js", + "vendors/jua/jua.min.js", + "vendors/select2-3.4.5/select2.min.js", + "vendors/jquery-magnific-popup/jquery.magnific-popup.min.js", + "vendors/bootstrap/js/bootstrap.min.js", + "dev/Common/_LibsEnd.js" + ], + dest: "rainloop/v/<%= pkg.version %>/static/js/libs.js" + }, + js_admin: { + nonull: true, + options: { + stripBanners: true, + banner: "/*! RainLoop Admin Module (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */\n" + + "(function (window, $, ko, crossroads, hasher, _) {\n", + footer: "\n\n}(window, jQuery, ko, crossroads, hasher, _));" + }, + src: [ + "dev/Common/_Begin.js", + "dev/Common/_BeginA.js", + + "dev/Common/Globals.js", + "dev/Common/Constants.js", + "dev/Common/Enums.js", + "dev/Common/Utils.js", + "dev/Common/Base64.js", + "dev/Common/Knockout.js", + "dev/Common/LinkBuilder.js", + "dev/Common/Plugins.js", + + "dev/Storages/LocalStorages/CookieDriver.js", + "dev/Storages/LocalStorages/LocalStorageDriver.js", + "dev/Storages/LocalStorage.js", + + "dev/Knoin/AbstractBoot.js", + "dev/Knoin/AbstractViewModel.js", + "dev/Knoin/AbstractScreen.js", + "dev/Knoin/Knoin.js", + + "dev/Models/EmailModel.js", + + "dev/ViewModels/PopupsDomainViewModel.js", + "dev/ViewModels/PopupsPluginViewModel.js", + "dev/ViewModels/PopupsActivateViewModel.js", + "dev/ViewModels/PopupsLanguagesViewModel.js", + + "dev/ViewModels/AdminLoginViewModel.js", + + "dev/ViewModels/AdminMenuViewModel.js", + "dev/ViewModels/AdminPaneViewModel.js", + + "dev/Admin/General.js", + "dev/Admin/Login.js", + "dev/Admin/Domains.js", + "dev/Admin/Security.js", + "dev/Admin/Social.js", + "dev/Admin/Plugins.js", + "dev/Admin/Packages.js", + "dev/Admin/Licensing.js", + + "dev/Storages/AbstractData.js", + "dev/Storages/AdminData.js", + + "dev/Storages/AbstractAjaxRemote.js", + "dev/Storages/AdminAjaxRemote.js", + + "dev/Storages/AbstractCache.js", + "dev/Storages/AdminCache.js", + + "dev/Screens/AbstractSettings.js", + + "dev/Screens/AdminLogin.js", + "dev/Screens/AdminSettings.js", + + "dev/Boots/AbstractApp.js", + "dev/Boots/AdminApp.js", + + "dev/Common/_End.js", + "dev/Common/_CoreEnd.js" + ], + dest: "rainloop/v/<%= pkg.version %>/static/js/admin.js" + }, + js_app: { + nonull: true, + options: { + stripBanners: true, + banner: "/*! RainLoop Webmail Module (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */\n" + + "(function (window, $, ko, crossroads, hasher, moment, Jua, _) {\n", + footer: "\n\n}(window, jQuery, ko, crossroads, hasher, moment, Jua, _));" + }, + src: [ + "dev/Common/_Begin.js", + "dev/Common/_BeginW.js", + + "dev/Common/Globals.js", + "dev/Common/Constants.js", + "dev/Common/Enums.js", + "dev/Common/Utils.js", + "dev/Common/Base64.js", + "dev/Common/Knockout.js", + "dev/Common/LinkBuilder.js", + "dev/Common/Plugins.js", + "dev/Common/HtmlEditor.js", + "dev/Common/Selector.js", + + "dev/Storages/LocalStorages/CookieDriver.js", + "dev/Storages/LocalStorages/LocalStorageDriver.js", + "dev/Storages/LocalStorage.js", + + "dev/Knoin/AbstractBoot.js", + "dev/Knoin/AbstractViewModel.js", + "dev/Knoin/AbstractScreen.js", + "dev/Knoin/Knoin.js", + + "dev/Models/EmailModel.js", + "dev/Models/ContactModel.js", + "dev/Models/AttachmentModel.js", + "dev/Models/ComposeAttachmentModel.js", + "dev/Models/MessageModel.js", + "dev/Models/FolderModel.js", + "dev/Models/AccountModel.js", + "dev/Models/IdentityModel.js", + + "dev/ViewModels/PopupsFolderClearViewModel.js", + "dev/ViewModels/PopupsFolderCreateViewModel.js", + "dev/ViewModels/PopupsFolderSystemViewModel.js", + "dev/ViewModels/PopupsComposeViewModel.js", + "dev/ViewModels/PopupsContactsViewModel.js", + "dev/ViewModels/PopupsAdvancedSearchViewModel.js", + "dev/ViewModels/PopupsAddAccountViewModel.js", + "dev/ViewModels/PopupsIdentityViewModel.js", + "dev/ViewModels/PopupsLanguagesViewModel.js", + + "dev/ViewModels/LoginViewModel.js", + + "dev/ViewModels/AbstractSystemDropDownViewModel.js", + "dev/ViewModels/MailBoxSystemDropDownViewModel.js", + "dev/ViewModels/SettingsSystemDropDownViewModel.js", + + "dev/ViewModels/MailBoxFolderListViewModel.js", + "dev/ViewModels/MailBoxMessageListViewModel.js", + "dev/ViewModels/MailBoxMessageViewViewModel.js", + + "dev/ViewModels/SettingsMenuViewModel.js", + "dev/ViewModels/SettingsPaneViewModel.js", + + "dev/Settings/General.js", + "dev/Settings/Personal.js", + "dev/Settings/Accounts.js", + "dev/Settings/Identities.js", + "dev/Settings/Social.js", + "dev/Settings/ChangePassword.js", + "dev/Settings/Folders.js", + "dev/Settings/Themes.js", + + "dev/Storages/AbstractData.js", + "dev/Storages/WebMailData.js", + + "dev/Storages/AbstractAjaxRemote.js", + "dev/Storages/WebMailAjaxRemote.js", + + "dev/Storages/AbstractCache.js", + "dev/Storages/WebMailCache.js", + + "dev/Screens/AbstractSettings.js", + + "dev/Screens/Login.js", + "dev/Screens/MailBox.js", + "dev/Screens/Settings.js", + + "dev/Boots/AbstractApp.js", + "dev/Boots/RainLoopApp.js", + + "dev/Common/_End.js", + "dev/Common/_CoreEnd.js" + ], + dest: "rainloop/v/<%= pkg.version %>/static/js/app.js" + }, + css: { + nonull: true, + src: [ + "vendors/jquery-ui/css/no-theme/jquery-ui-1.10.3.custom.css", + "vendors/normalize/normalize.css", + "vendors/icomoon/style.css", + "vendors/select2-3.4.5/select2.css", + "vendors/select2-3.4.5/select2-bootstrap.css", + "vendors/jquery-nanoscroller/nanoscroller.css", + "vendors/jquery-magnific-popup/magnific-popup.css", + "vendors/jquery-magnific-popup/magnific-popup-animations.css", + "vendors/simple-pace/styles.css", + "vendors/flags/flags-fixed.css", + "rainloop/v/<%= pkg.version %>/static/css/less.css" + ], + dest: "rainloop/v/<%= pkg.version %>/static/css/app.css" + } + }, + + cssmin: { + css: { + src: "rainloop/v/<%= pkg.version %>/static/css/app.css", + dest: "rainloop/v/<%= pkg.version %>/static/css/app.min.css" + } + }, + + watch: { + js: { + options: { + nospawn: true + }, + files: ["dev/**/*.js"], + tasks: ["concat:js_libs", "concat:js_admin", "concat:js_app"] + }, + styles: { + options: { + nospawn: true + }, + files: ["dev/Styles/*.less"], + tasks: ["less", "concat:css"] + } + } + }); + + // dependencies + for (var key in grunt.file.readJSON('package.json').devDependencies) { + if (key !== 'grunt' && key.indexOf('grunt') === 0) { + grunt.loadNpmTasks(key); + } + } + + // uglify + grunt.registerTask('mousewheel', ['uglify:mousewheel']); + grunt.registerTask('wakeup', ['uglify:wakeup']); + grunt.registerTask('nano', ['uglify:nano']); + grunt.registerTask('pace', ['uglify:pace']); + grunt.registerTask('rl', ['uglify:rl']); + grunt.registerTask('cookie', ['uglify:cookie']); + grunt.registerTask('rainloop', ['uglify:min_app', 'uglify:min_admin']); + // --- + + grunt.registerTask('default', ['less', 'concat', 'jshint', 'cssmin', 'rainloop']); + + // aliases + grunt.registerTask('ant', ['default']); // special for ant task + grunt.registerTask('u', ['uglify']); + grunt.registerTask('h', ['jshint']); + grunt.registerTask('w', ['watch']); +}; diff --git a/LICENSE b/LICENSE index d2de32663..70fc6a921 100644 --- a/LICENSE +++ b/LICENSE @@ -1,25 +1,25 @@ -Creative Commons — Attribution-NonCommercial-ShareAlike 3.0 Unported — CC BY-NC-SA 3.0 -(http://creativecommons.org/licenses/by-nc-sa/3.0/) - -You are free: - - to Share — to copy, distribute and transmit the work - to Remix — to adapt the work - -Under the following conditions: - - Attribution — You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). - Noncommercial — You may not use this work for commercial purposes. - Share Alike — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one. - -With the understanding that: - - Waiver — Any of the above conditions can be waived if you get permission from the copyright holder. - Public Domain — Where the work or any of its elements is in the public domain under applicable law, that status is in no way affected by the license. - -Other Rights — In no way are any of the following rights affected by the license: - Your fair dealing or fair use rights, or other applicable copyright exceptions and limitations; - The author's moral rights; - Rights other persons may have either in the work itself or in how the work is used, such as publicity or privacy rights. - -Notice — For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to this web page. \ No newline at end of file +Creative Commons — Attribution-NonCommercial-ShareAlike 3.0 Unported — CC BY-NC-SA 3.0 +(http://creativecommons.org/licenses/by-nc-sa/3.0/) + +You are free: + + to Share — to copy, distribute and transmit the work + to Remix — to adapt the work + +Under the following conditions: + + Attribution — You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). + Noncommercial — You may not use this work for commercial purposes. + Share Alike — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one. + +With the understanding that: + + Waiver — Any of the above conditions can be waived if you get permission from the copyright holder. + Public Domain — Where the work or any of its elements is in the public domain under applicable law, that status is in no way affected by the license. + +Other Rights — In no way are any of the following rights affected by the license: + Your fair dealing or fair use rights, or other applicable copyright exceptions and limitations; + The author's moral rights; + Rights other persons may have either in the work itself or in how the work is used, such as publicity or privacy rights. + +Notice — For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to this web page. \ No newline at end of file diff --git a/README.md b/README.md index cb49d5f23..8af794f5b 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,19 @@ -RainLoop Webmail (PHP) -================== - -## About - -Simple, modern & fast web-based email client - -Modest system requirements, decent performance, simple installation and upgrade, no database required - all these make RainLoop Webmail a perfect choice for your email solution. - -For more information about the product, check [http://rainloop.net](http://rainloop.net). - -Information about installing the product, check the [documentation page](http://rainloop.net/docs/installation/). - -## License - -**Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)** -http://creativecommons.org/licenses/by-nc-sa/3.0/ - -Copyright (c) 2013 Rainloop Team +RainLoop Webmail (PHP) +================== + +## About + +Simple, modern & fast web-based email client + +Modest system requirements, decent performance, simple installation and upgrade, no database required - all these make RainLoop Webmail a perfect choice for your email solution. + +For more information about the product, check [http://rainloop.net](http://rainloop.net). + +Information about installing the product, check the [documentation page](http://rainloop.net/docs/installation/). + +## License + +**Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)** +http://creativecommons.org/licenses/by-nc-sa/3.0/ + +Copyright (c) 2013 Rainloop Team \ No newline at end of file diff --git a/_include.php b/_include.php new file mode 100644 index 000000000..cd4a8cd79 --- /dev/null +++ b/_include.php @@ -0,0 +1,35 @@ +').appendTo('body'); + + $window.on('error', function (oEvent) { + if (RL && oEvent && oEvent.originalEvent && oEvent.originalEvent.message && + -1 === Utils.inArray(oEvent.originalEvent.message, [ + 'Script error.', 'Uncaught Error: Error calling method on NPObject.' + ])) + { + RL.remote().jsError( + Utils.emptyFunction, + oEvent.originalEvent.message, + oEvent.originalEvent.filename, + oEvent.originalEvent.lineno, + location && location.toString ? location.toString() : '', + $html.attr('class'), + Utils.microtime() - Globals.now + ); + } + }); +} + +_.extend(AbstractApp.prototype, KnoinAbstractBoot.prototype); + +AbstractApp.prototype.oSettings = null; +AbstractApp.prototype.oLink = null; + +/** + * @param {string} sLink + * @return {boolean} + */ +AbstractApp.prototype.download = function (sLink) +{ + var + oLink = null, + oE = null, + sUserAgent = navigator.userAgent.toLowerCase() + ; + + if (sUserAgent && (sUserAgent.indexOf('chrome') > -1 || sUserAgent.indexOf('chrome') > -1)) + { + oLink = document.createElement('a'); + oLink['href'] = sLink; + + if (document['createEvent']) + { + oE = document['createEvent']('MouseEvents'); + if (oE && oE['initEvent'] && oLink['dispatchEvent']) + { + oE['initEvent']('click', true, true); + oLink['dispatchEvent'](oE); + return true; + } + } + } + + if (Globals.bMobileDevice) + { + window.open(sLink, '_self'); + window.focus(); + } + else + { + this.iframe.attr('src', sLink); +// window.document.location.href = sLink; + } + + return true; +}; + +/** + * @return {LinkBuilder} + */ +AbstractApp.prototype.link = function () +{ + if (null === this.oLink) + { + this.oLink = new LinkBuilder(); + } + + return this.oLink; +}; + +/** + * @return {LocalStorage} + */ +AbstractApp.prototype.local = function () +{ + if (null === this.oLocal) + { + this.oLocal = new LocalStorage(); + } + + return this.oLocal; +}; + +/** + * @param {string} sName + * @return {?} + */ +AbstractApp.prototype.settingsGet = function (sName) +{ + if (null === this.oSettings) + { + this.oSettings = Utils.isNormal(AppData) ? AppData : {}; + } + + return Utils.isUnd(this.oSettings[sName]) ? null : this.oSettings[sName]; +}; + +/** + * @param {string} sName + * @param {?} mValue + */ +AbstractApp.prototype.settingsSet = function (sName, mValue) +{ + if (null === this.oSettings) + { + this.oSettings = Utils.isNormal(AppData) ? AppData : {}; + } + + this.oSettings[sName] = mValue; +}; + +AbstractApp.prototype.setTitle = function (sTitle) +{ + sTitle = ((0 < sTitle.length) ? sTitle + ' - ' : '') + + this.settingsGet('Title') || ''; + + if (sTitle !== window.document.title) + { + window.document.title = sTitle; + _.delay(function () { + window.document.title = sTitle; + }, 5); + } +}; + +/** + * @param {boolean=} bLogout = false + * @param {boolean=} bClose = false + */ +AbstractApp.prototype.loginAndLogoutReload = function (bLogout, bClose) +{ + var + sCustomLogoutLink = Utils.pString(this.settingsGet('CustomLogoutLink')), + bInIframe = !!this.settingsGet('InIframe') + ; + + bLogout = Utils.isUnd(bLogout) ? false : !!bLogout; + bClose = Utils.isUnd(bClose) ? false : !!bClose; + + if (bLogout && bClose && window.close) + { + window.close(); + } + + if (bLogout && '' !== sCustomLogoutLink && window.location.href !== sCustomLogoutLink) + { + _.delay(function () { + if (bInIframe && window.parent) + { + window.parent.location.href = sCustomLogoutLink; + } + else + { + window.location.href = sCustomLogoutLink; + } + }, 100); + } + else + { + kn.routeOff(); + kn.setHash(RL.link().root(), true); + kn.routeOff(); + + _.delay(function () { + if (bInIframe && window.parent) + { + window.parent.location.reload(); + } + else + { + window.location.reload(); + } + }, 100); + } +}; + +/** + * @param {string} sQuery + * @param {number} iPage + * @param {Function} fCallback + */ +AbstractApp.prototype.getAutocomplete = function (sQuery, iPage, fCallback) +{ + fCallback([], sQuery); +}; + +AbstractApp.prototype.bootstart = function () +{ + Utils.initOnStartOrLangChange(function () { + Utils.initNotificationLanguage(); + }, null); + + _.delay(function () { + Utils.windowResize(); + }, 1000); +}; diff --git a/dev/Boots/AdminApp.js b/dev/Boots/AdminApp.js new file mode 100644 index 000000000..9887ee974 --- /dev/null +++ b/dev/Boots/AdminApp.js @@ -0,0 +1,248 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends AbstractApp + */ +function AdminApp() +{ + AbstractApp.call(this); + + this.oData = null; + this.oRemote = null; + this.oCache = null; +} + +_.extend(AdminApp.prototype, AbstractApp.prototype); + +AdminApp.prototype.oData = null; +AdminApp.prototype.oRemote = null; +AdminApp.prototype.oCache = null; + +/** + * @return {AdminDataStorage} + */ +AdminApp.prototype.data = function () +{ + if (null === this.oData) + { + this.oData = new AdminDataStorage(); + } + + return this.oData; +}; + +/** + * @return {AdminAjaxRemoteStorage} + */ +AdminApp.prototype.remote = function () +{ + if (null === this.oRemote) + { + this.oRemote = new AdminAjaxRemoteStorage(); + } + + return this.oRemote; +}; + +/** + * @return {AdminCacheStorage} + */ +AdminApp.prototype.cache = function () +{ + if (null === this.oCache) + { + this.oCache = new AdminCacheStorage(); + } + + return this.oCache; +}; + +AdminApp.prototype.reloadDomainList = function () +{ + RL.data().domainsLoading(true); + RL.remote().domainList(function (sResult, oData) { + RL.data().domainsLoading(false); + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + var aList = _.map(oData.Result, function (bEnabled, sName) { + return { + 'name': sName, + 'disabled': ko.observable(!bEnabled), + 'deleteAccess': ko.observable(false) + }; + }, this); + + RL.data().domains(aList); + } + }); +}; + +AdminApp.prototype.reloadPluginList = function () +{ + RL.data().pluginsLoading(true); + RL.remote().pluginList(function (sResult, oData) { + RL.data().pluginsLoading(false); + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + var aList = _.map(oData.Result, function (oItem) { + return { + 'name': oItem['Name'], + 'disabled': ko.observable(!oItem['Enabled']), + 'configured': ko.observable(!!oItem['Configured']) + }; + }, this); + + RL.data().plugins(aList); + } + }); +}; + +AdminApp.prototype.reloadPackagesList = function () +{ + RL.data().packagesLoading(true); + RL.data().packagesReal(true); + + RL.remote().packagesList(function (sResult, oData) { + + RL.data().packagesLoading(false); + + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + RL.data().packagesReal(!!oData.Result.Real); + RL.data().packagesMainUpdatable(!!oData.Result.MainUpdatable); + + var + aList = [], + aLoading = {} + ; + + _.each(RL.data().packages(), function (oItem) { + if (oItem && oItem['loading']()) + { + aLoading[oItem['file']] = oItem; + } + }); + + if (Utils.isArray(oData.Result.List)) + { + aList = _.compact(_.map(oData.Result.List, function (oItem) { + if (oItem) + { + oItem['loading'] = ko.observable(!Utils.isUnd(aLoading[oItem['file']])); + return 'core' === oItem['type'] && !oItem['canBeInstalled'] ? null : oItem; + } + return null; + })); + } + + RL.data().packages(aList); + } + else + { + RL.data().packagesReal(false); + } + }); +}; + +/** + * + * @param {boolean=} bForce = false + */ +AdminApp.prototype.reloadLicensing = function (bForce) +{ + bForce = Utils.isUnd(bForce) ? false : !!bForce; + + RL.data().licensingProcess(true); + RL.data().licenseError(''); + + RL.remote().licensing(function (sResult, oData) { + RL.data().licensingProcess(false); + if (Enums.StorageResultType.Success === sResult && oData && oData.Result && Utils.isNormal(oData.Result['Expired'])) + { + RL.data().licenseValid(true); + RL.data().licenseExpired(Utils.pInt(oData.Result['Expired'])); + RL.data().licenseError(''); + + RL.data().licensing(true); + } + else + { + if (oData && oData.ErrorCode && -1 < Utils.inArray(Utils.pInt(oData.ErrorCode), [ + Enums.Notification.LicensingServerIsUnavailable, + Enums.Notification.LicensingExpired + ])) + { + RL.data().licenseError(Utils.getNotification(Utils.pInt(oData.ErrorCode))); + RL.data().licensing(true); + } + else + { + if (Enums.StorageResultType.Abort === sResult) + { + RL.data().licenseError(Utils.getNotification(Enums.Notification.LicensingServerIsUnavailable)); + RL.data().licensing(true); + } + else + { + RL.data().licensing(false); + } + } + } + }, bForce); +}; + +AdminApp.prototype.bootstart = function () +{ + AbstractApp.prototype.bootstart.call(this); + + RL.data().populateDataOnStart(); + + kn.hideLoading(); + + if (!this.settingsGet('AllowAdminPanel')) + { + kn.routeOff(); + kn.setHash(RL.link().root(), true); + kn.routeOff(); + + _.defer(function () { + window.location.href = '/'; + }); + } + else + { + if (!!this.settingsGet('Auth')) + { +// TODO +// if (!this.settingsGet('AllowPackages') && AdminPackages) +// { +// Utils.disableSettingsViewModel(AdminPackages); +// } + + kn.startScreens([AdminSettingsScreen]); + + if (!Globals.bMobileDevice) + { + _.defer(function () { + Utils.initLayoutResizer('#rl-top-resizer-left', '#rl-top-resizer-right', '#rl-center', + 120, 300, 200, 600, Enums.ClientSideKeyName.FolderListSize); + }); + } + } + else + { + kn.startScreens([AdminLoginScreen]); + } + } + + if (window.SimplePace) + { + window.SimplePace.set(100); + } +}; + +/** + * @type {AdminApp} + */ +RL = new AdminApp(); diff --git a/dev/Boots/RainLoopApp.js b/dev/Boots/RainLoopApp.js new file mode 100644 index 000000000..777c63468 --- /dev/null +++ b/dev/Boots/RainLoopApp.js @@ -0,0 +1,750 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends AbstractApp + */ +function RainLoopApp() +{ + AbstractApp.call(this); + + this.oData = null; + this.oRemote = null; + this.oCache = null; + + this.iSuggestionsLimit = Utils.pInt(this.settingsGet('SuggestionsLimit')); + this.iSuggestionsLimit = 0 === this.iSuggestionsLimit ? 20 : this.iSuggestionsLimit; + + this.quotaDebounce = _.debounce(this.quota, 1000 * 30); +} + +_.extend(RainLoopApp.prototype, AbstractApp.prototype); + +RainLoopApp.prototype.oData = null; +RainLoopApp.prototype.oRemote = null; +RainLoopApp.prototype.oCache = null; + +/** + * @return {WebMailDataStorage} + */ +RainLoopApp.prototype.data = function () +{ + if (null === this.oData) + { + this.oData = new WebMailDataStorage(); + } + + return this.oData; +}; + +/** + * @return {WebMailAjaxRemoteStorage} + */ +RainLoopApp.prototype.remote = function () +{ + if (null === this.oRemote) + { + this.oRemote = new WebMailAjaxRemoteStorage(); + } + + return this.oRemote; +}; + +/** + * @return {WebMailCacheStorage} + */ +RainLoopApp.prototype.cache = function () +{ + if (null === this.oCache) + { + this.oCache = new WebMailCacheStorage(); + } + + return this.oCache; +}; + +RainLoopApp.prototype.reloadFlagsCurrentMessageListAndMessageFromCache = function () +{ + var oCache = RL.cache(); + _.each(RL.data().messageList(), function (oMessage) { + oCache.initMessageFlagsFromCache(oMessage); + }); + + oCache.initMessageFlagsFromCache(RL.data().message()); +}; + +/** + * @param {boolean=} bDropPagePosition = false + * @param {boolean=} bDropCurrenFolderCache = false + */ +RainLoopApp.prototype.reloadMessageList = function (bDropPagePosition, bDropCurrenFolderCache) +{ + var + oRLData = RL.data(), + iOffset = (oRLData.messageListPage() - 1) * oRLData.messagesPerPage() + ; + + if (Utils.isUnd(bDropCurrenFolderCache) ? false : !!bDropCurrenFolderCache) + { + RL.cache().setFolderHash(oRLData.currentFolderFullNameRaw(), ''); + } + + if (Utils.isUnd(bDropPagePosition) ? false : !!bDropPagePosition) + { + oRLData.messageListPage(1); + iOffset = 0; + } + + oRLData.messageListLoading(true); + RL.remote().messageList(function (sResult, oData, bCached) { + + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + oRLData.messageListError(''); + oRLData.messageListLoading(false); + oRLData.setMessageList(oData, bCached); + } + else if (Enums.StorageResultType.Unload === sResult) + { + oRLData.messageListError(''); + oRLData.messageListLoading(false); + } + else if (Enums.StorageResultType.Abort !== sResult) + { + oRLData.messageList([]); + oRLData.messageListLoading(false); + oRLData.messageListError(oData && oData.ErrorCode ? + Utils.getNotification(oData.ErrorCode) : Utils.i18n('NOTIFICATIONS/CANT_GET_MESSAGE_LIST') + ); + } + + }, oRLData.currentFolderFullNameRaw(), iOffset, oRLData.messagesPerPage(), oRLData.messageListSearch()); +}; + +RainLoopApp.prototype.recacheInboxMessageList = function () +{ + RL.remote().messageList(Utils.emptyFunction, 'INBOX', 0, RL.data().messagesPerPage(), '', true); +}; + +/** + * @param {boolean=} bUseCache = true + * @param {Function=} fCallback + */ +RainLoopApp.prototype.folders = function (bUseCache, fCallback) +{ + this.data().foldersLoading(true); + this.remote().folders(_.bind(function (sResult, oData, bCached) { + + RL.data().foldersLoading(false); + if (Enums.StorageResultType.Success === sResult) + { + this.data().setFolders(oData, bCached); + if (fCallback) + { + fCallback(true); + } + } + else + { + if (fCallback) + { + fCallback(false); + } + } + }, this), bUseCache); +}; + +RainLoopApp.prototype.accountsAndIdentities = function () +{ + var oRainLoopData = RL.data(); + + oRainLoopData.accountsLoading(true); + oRainLoopData.identitiesLoading(true); + + RL.remote().accountsAndIdentities(function (sResult, oData) { + + oRainLoopData.accountsLoading(false); + oRainLoopData.identitiesLoading(false); + + if (Enums.StorageResultType.Success === sResult && oData.Result) + { + var + sParentEmail = RL.settingsGet('ParentEmail'), + sAccountEmail = oRainLoopData.accountEmail() + ; + + sParentEmail = '' === sParentEmail ? sAccountEmail : sParentEmail; + + if (Utils.isArray(oData.Result['Accounts'])) + { + oRainLoopData.accounts(_.map(oData.Result['Accounts'], function (sValue) { + return new AccountModel(sValue, sValue !== sParentEmail); + })); + } + + if (Utils.isArray(oData.Result['Identities'])) + { + oRainLoopData.identities(_.map(oData.Result['Identities'], function (oIdentityData) { + + var + sId = Utils.pString(oIdentityData['Id']), + sEmail = Utils.pString(oIdentityData['Email']), + oIdentity = new IdentityModel(sId, sEmail, sId !== sAccountEmail) + ; + + oIdentity.name(Utils.pString(oIdentityData['Name'])); + oIdentity.replyTo(Utils.pString(oIdentityData['ReplyTo'])); + oIdentity.bcc(Utils.pString(oIdentityData['Bcc'])); + + return oIdentity; + })); + } + } + }); +}; + +RainLoopApp.prototype.quota = function () +{ + this.remote().quota(function (sResult, oData) { + if (Enums.StorageResultType.Success === sResult && oData && oData.Result && + Utils.isArray(oData.Result) && 2 === oData.Result.length && + Utils.isPosNumeric(oData.Result[0], true) && Utils.isPosNumeric(oData.Result[1], true)) + { + RL.data().userQuota(Utils.pInt(oData.Result[1]) * 1024); + RL.data().userUsageSize(Utils.pInt(oData.Result[0]) * 1024); + } + }); +}; + +/** + * @param {string} sFolder + * @param {Array=} aList = [] + */ +RainLoopApp.prototype.folderInformation = function (sFolder, aList) +{ + this.remote().folderInformation(function (sResult, oData) { + if (Enums.StorageResultType.Success === sResult) + { + if (oData && oData.Result && oData.Result.Hash && oData.Result.Folder) + { + var + sHash = RL.cache().getFolderHash(oData.Result.Folder), + oFolder = RL.cache().getFolderFromCacheList(oData.Result.Folder), + bCheck = false, + sUid = '', + aList = [], + bUnreadCountChange = false, + oFlags = null + ; + + if (oFolder) + { + if (oData.Result.Hash) + { + RL.cache().setFolderHash(oData.Result.Folder, oData.Result.Hash); + } + + if (Utils.isNormal(oData.Result.MessageCount)) + { + oFolder.messageCountAll(oData.Result.MessageCount); + } + + if (Utils.isNormal(oData.Result.MessageUnseenCount)) + { + if (Utils.pInt(oFolder.messageCountUnread()) !== Utils.pInt(oData.Result.MessageUnseenCount)) + { + bUnreadCountChange = true; + } + + oFolder.messageCountUnread(oData.Result.MessageUnseenCount); + } + + if (bUnreadCountChange) + { + RL.cache().clearMessageFlagsFromCacheByFolder(oFolder.fullNameRaw); + } + + if (oData.Result.Flags) + { + for (sUid in oData.Result.Flags) + { + if (oData.Result.Flags.hasOwnProperty(sUid)) + { + bCheck = true; + oFlags = oData.Result.Flags[sUid]; + RL.cache().storeMessageFlagsToCacheByFolderAndUid(oFolder.fullNameRaw, sUid.toString(), [ + !oFlags['IsSeen'], !!oFlags['IsFlagged'], !!oFlags['IsAnswered'], !!oFlags['IsForwarded'] + ]); + } + } + + if (bCheck) + { + RL.reloadFlagsCurrentMessageListAndMessageFromCache(); + } + } + + RL.data().initUidNextAndNewMessages(oFolder.fullNameRaw, oData.Result.UidNext, oData.Result.NewMessages); + + if (oData.Result.Hash !== sHash || '' === sHash) + { + if (oFolder.fullNameRaw === RL.data().currentFolderFullNameRaw()) + { + RL.reloadMessageList(); + } + else if ('INBOX' === oFolder.fullNameRaw) + { + RL.recacheInboxMessageList(); + } + } + else if (bUnreadCountChange) + { + if (oFolder.fullNameRaw === RL.data().currentFolderFullNameRaw()) + { + aList = RL.data().messageList(); + if (Utils.isNonEmptyArray(aList)) + { + RL.folderInformation(oFolder.fullNameRaw, aList); + } + } + } + } + } + } + }, sFolder, aList); +}; + +RainLoopApp.prototype.setMessageSeen = function (oMessage) +{ + if (oMessage.unseen()) + { + oMessage.unseen(false); + + var oFolder = RL.cache().getFolderFromCacheList(oMessage.folderFullNameRaw); + if (oFolder) + { + oFolder.messageCountUnread(0 <= oFolder.messageCountUnread() - 1 ? + oFolder.messageCountUnread() - 1 : 0); + } + + RL.cache().storeMessageFlagsToCache(oMessage); + RL.reloadFlagsCurrentMessageListAndMessageFromCache(); + } + + RL.remote().messageSetSeen(Utils.emptyFunction, oMessage.folderFullNameRaw, [oMessage.uid], true); +}; + +RainLoopApp.prototype.googleConnect = function () +{ + window.open(RL.link().socialGoogle(), 'Google', 'left=200,top=100,width=650,height=600,menubar=no,status=no,resizable=yes,scrollbars=yes'); +}; + +RainLoopApp.prototype.twitterConnect = function () +{ + window.open(RL.link().socialTwitter(), 'Twitter', 'left=200,top=100,width=650,height=350,menubar=no,status=no,resizable=yes,scrollbars=yes'); +}; + +RainLoopApp.prototype.facebookConnect = function () +{ + window.open(RL.link().socialFacebook(), 'Facebook', 'left=200,top=100,width=650,height=335,menubar=no,status=no,resizable=yes,scrollbars=yes'); +}; + +/** + * @param {boolean=} bFireAllActions + */ +RainLoopApp.prototype.socialUsers = function (bFireAllActions) +{ + var oRainLoopData = RL.data(); + + if (bFireAllActions) + { + oRainLoopData.googleActions(true); + oRainLoopData.facebookActions(true); + oRainLoopData.twitterActions(true); + } + + RL.remote().socialUsers(function (sResult, oData) { + + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + oRainLoopData.googleUserName(oData.Result['Google'] || ''); + oRainLoopData.facebookUserName(oData.Result['Facebook'] || ''); + oRainLoopData.twitterUserName(oData.Result['Twitter'] || ''); + } + else + { + oRainLoopData.googleUserName(''); + oRainLoopData.facebookUserName(''); + oRainLoopData.twitterUserName(''); + } + + oRainLoopData.googleLoggined('' !== oRainLoopData.googleUserName()); + oRainLoopData.facebookLoggined('' !== oRainLoopData.facebookUserName()); + oRainLoopData.twitterLoggined('' !== oRainLoopData.twitterUserName()); + + oRainLoopData.googleActions(false); + oRainLoopData.facebookActions(false); + oRainLoopData.twitterActions(false); + }); +}; + +RainLoopApp.prototype.googleDisconnect = function () +{ + RL.data().googleActions(true); + RL.remote().googleDisconnect(function () { + RL.socialUsers(); + }); +}; + +RainLoopApp.prototype.facebookDisconnect = function () +{ + RL.data().facebookActions(true); + RL.remote().facebookDisconnect(function () { + RL.socialUsers(); + }); +}; + +RainLoopApp.prototype.twitterDisconnect = function () +{ + RL.data().twitterActions(true); + RL.remote().twitterDisconnect(function () { + RL.socialUsers(); + }); +}; + +/** + * @param {Array} aSystem + * @param {Array} aList + * @param {Array=} aDisabled + * @param {Array=} aHeaderLines + * @param {?number=} iUnDeep + * @param {Function=} fDisableCallback + * @param {Function=} fVisibleCallback + * @param {Function=} fRenameCallback + * @param {boolean=} bSystem + * @param {boolean=} bBuildUnvisible + * @return {Array} + */ +RainLoopApp.prototype.folderListOptionsBuilder = function (aSystem, aList, aDisabled, aHeaderLines, iUnDeep, fDisableCallback, fVisibleCallback, fRenameCallback, bSystem, bBuildUnvisible) +{ + var + iIndex = 0, + iLen = 0, + /** + * @type {?FolderModel} + */ + oItem = null, + sDeepPrefix = '\u00A0\u00A0\u00A0', + aResult = [] + ; + + bSystem = !Utils.isNormal(bSystem) ? 0 < aSystem.length : bSystem; + bBuildUnvisible = Utils.isUnd(bBuildUnvisible) ? false : !!bBuildUnvisible; + iUnDeep = !Utils.isNormal(iUnDeep) ? 0 : iUnDeep; + fDisableCallback = Utils.isNormal(fDisableCallback) ? fDisableCallback : null; + fVisibleCallback = Utils.isNormal(fVisibleCallback) ? fVisibleCallback : null; + fRenameCallback = Utils.isNormal(fRenameCallback) ? fRenameCallback : null; + + if (!Utils.isArray(aDisabled)) + { + aDisabled = []; + } + + if (!Utils.isArray(aHeaderLines)) + { + aHeaderLines = []; + } + + for (iIndex = 0, iLen = aHeaderLines.length; iIndex < iLen; iIndex++) + { + aResult.push({ + 'id': aHeaderLines[iIndex][0], + 'name': aHeaderLines[iIndex][1], + 'disable': false + }); + } + + for (iIndex = 0, iLen = aSystem.length; iIndex < iLen; iIndex++) + { + oItem = aSystem[iIndex]; + if (fVisibleCallback ? fVisibleCallback.call(null, oItem) : true) + { + aResult.push({ + 'id': oItem.fullNameRaw, + 'system': true, + 'name': fRenameCallback ? fRenameCallback.call(null, oItem) : oItem.name(), + 'disable': !oItem.selectable || -1 < Utils.inArray(oItem.fullNameRaw, aDisabled) || + (fDisableCallback ? fDisableCallback.call(null, oItem) : false) + }); + } + } + + for (iIndex = 0, iLen = aList.length; iIndex < iLen; iIndex++) + { + oItem = aList[iIndex]; + if (!oItem.isGmailFolder && (oItem.subScribed() || !oItem.existen)) + { + if (fVisibleCallback ? fVisibleCallback.call(null, oItem) : true) + { + if (Enums.FolderType.User === oItem.type() || !bSystem || (!oItem.isNamespaceFolder && 0 < oItem.subFolders().length)) + { + aResult.push({ + 'id': oItem.fullNameRaw, + 'system': false, + 'name': (new window.Array(oItem.deep + 1 - iUnDeep)).join(sDeepPrefix) + + (fRenameCallback ? fRenameCallback.call(null, oItem) : oItem.name()), + 'disable': !oItem.selectable || -1 < Utils.inArray(oItem.fullNameRaw, aDisabled) || + (Enums.FolderType.User !== oItem.type()) || + (fDisableCallback ? fDisableCallback.call(null, oItem) : false) + }); + } + } + } + + if (oItem.subScribed() && 0 < oItem.subFolders().length) + { + aResult = aResult.concat(RL.folderListOptionsBuilder([], oItem.subFolders(), aDisabled, [], + oItem.isUnpaddigFolder ? iUnDeep + 1 : iUnDeep, + fDisableCallback, fVisibleCallback, fRenameCallback, bSystem, bBuildUnvisible)); + } + } + + return aResult; +}; + +/** + * @param {string} sQuery + * @param {number} iPage + * @param {Function} fCallback + */ +RainLoopApp.prototype.getAutocomplete = function (sQuery, iPage, fCallback) +{ + var + aData = [] + ; + + RL.remote().suggestions(function (sResult, oData) { + if (Enums.StorageResultType.Success === sResult && oData && oData.Result && Utils.isArray(oData.Result.List)) + { + aData = _.map(oData.Result.List, function (aItem) { + return aItem && aItem[0] ? new EmailModel(aItem[0], aItem[1]) : null; + }); + + fCallback(_.compact(aData), !!oData.Result.More); + } + else if (Enums.StorageResultType.Abort !== sResult) + { + fCallback([], false); + } + }, sQuery, iPage); +}; + +RainLoopApp.prototype.emailsPicsHashes = function () +{ + RL.remote().emailsPicsHashes(function (sResult, oData) { + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + RL.cache().setEmailsPicsHashesData(oData.Result); + } + }); +}; + +RainLoopApp.prototype.bootstart = function () +{ + AbstractApp.prototype.bootstart.call(this); + + RL.data().populateDataOnStart(); + + var + sCustomLoginLink = '', + sJsHash = this.settingsGet('JsHash'), + bGoogle = this.settingsGet('AllowGoogleSocial'), + bFacebook = this.settingsGet('AllowFacebookSocial'), + bTwitter = this.settingsGet('AllowTwitterSocial') + ; + + if (!this.settingsGet('RemoteChangePassword')) + { + Utils.removeSettingsViewModel(SettingsChangePasswordScreen); + } + + if (!this.settingsGet('AllowAdditionalAccounts')) + { + Utils.removeSettingsViewModel(SettingsAccounts); + } + + if (this.settingsGet('AllowIdentities')) + { + Utils.removeSettingsViewModel(SettingsPersonal); + } + else + { + Utils.removeSettingsViewModel(SettingsIdentities); + } + + if (!bGoogle && !bFacebook && !bTwitter) + { + Utils.removeSettingsViewModel(SettingsSocialScreen); + } + + if (!this.settingsGet('AllowThemes')) + { + Utils.removeSettingsViewModel(SettingsThemes); + } + + Utils.initOnStartOrLangChange(function () { + + $.extend(true, $.magnificPopup.defaults, { + 'tClose': Utils.i18n('MAGNIFIC_POPUP/CLOSE'), + 'tLoading': Utils.i18n('MAGNIFIC_POPUP/LOADING'), + 'gallery': { + 'tPrev': Utils.i18n('MAGNIFIC_POPUP/GALLERY_PREV'), + 'tNext': Utils.i18n('MAGNIFIC_POPUP/GALLERY_NEXT'), + 'tCounter': Utils.i18n('MAGNIFIC_POPUP/GALLERY_COUNTER') + }, + 'image': { + 'tError': Utils.i18n('MAGNIFIC_POPUP/IMAGE_ERROR') + }, + 'ajax': { + 'tError': Utils.i18n('MAGNIFIC_POPUP/AJAX_ERROR') + } + }); + + }, this); + + if (window.SimplePace) + { + window.SimplePace.set(70); + window.SimplePace.sleep(); + } + + if (!!this.settingsGet('Auth')) + { + this.setTitle(Utils.i18n('TITLES/LOADING')); + + this.folders(true, _.bind(function (bValue) { + + kn.hideLoading(); + + if (bValue) + { + kn.startScreens([MailBoxScreen, SettingsScreen]); + + // setup maito protocol + $document.on('mousedown', '#rl-center a', function (oEvent) { + if (oEvent && 3 !== oEvent['which']) + { + var oEmailModel = null, sHref = $(this).attr('href'); + if (sHref && 'mailto:' === sHref.toString().toLowerCase().substr(0, 7)) + { + oEmailModel = new EmailModel(); + oEmailModel.parse(window.decodeURI(sHref.toString().substr(7))); + if (oEmailModel && oEmailModel.email) + { + kn.showScreenPopup(PopupsComposeViewModel, [Enums.ComposeType.Empty, null, [oEmailModel]]); + return false; + } + } + } + + return true; + }); + + if (bGoogle || bFacebook || bTwitter) + { + RL.socialUsers(true); + } + + _.delay(function () { + + RL.emailsPicsHashes(); + + RL.remote().servicesPics(function (sResult, oData) { + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + RL.cache().setServicesData(oData.Result); + } + }); + }, 1000); + + Plugins.runHook('rl-start-user-screens'); + } + else + { + kn.startScreens([LoginScreen]); + Plugins.runHook('rl-start-login-screens'); + } + + if (window.SimplePace) + { + window.SimplePace.set(100); + } + + if (!Globals.bMobileDevice) + { + _.defer(function () { + Utils.initLayoutResizer('#rl-top-resizer-left', '#rl-top-resizer-right', '#rl-center', + 120, 300, 200, 600, Enums.ClientSideKeyName.FolderListSize); + }); + } + + }, this)); + } + else + { + sCustomLoginLink = Utils.pString(this.settingsGet('CustomLoginLink')); + if (!sCustomLoginLink) + { + kn.hideLoading(); + kn.startScreens([LoginScreen]); + + Plugins.runHook('rl-start-login-screens'); + + if (window.SimplePace) + { + window.SimplePace.set(100); + } + } + else + { + kn.routeOff(); + kn.setHash(RL.link().root(), true); + kn.routeOff(); + + _.defer(function () { + window.location.href = sCustomLoginLink; + }); + } + } + + if (bGoogle) + { + window['rl_' + sJsHash + '_google_service'] = function () { + RL.data().googleActions(true); + RL.socialUsers(); + }; + } + + if (bFacebook) + { + window['rl_' + sJsHash + '_facebook_service'] = function () { + RL.data().facebookActions(true); + RL.socialUsers(); + }; + } + + if (bTwitter) + { + window['rl_' + sJsHash + '_twitter_service'] = function () { + RL.data().twitterActions(true); + RL.socialUsers(); + }; + } + + Plugins.runHook('rl-start-screens'); +}; + +/** + * @type {RainLoopApp} + */ +RL = new RainLoopApp(); diff --git a/dev/Common/Base64.js b/dev/Common/Base64.js new file mode 100644 index 000000000..1876dd067 --- /dev/null +++ b/dev/Common/Base64.js @@ -0,0 +1,164 @@ +/*jslint bitwise: true*/ +// Base64 encode / decode +// http://www.webtoolkit.info/ + +Base64 = { + + // private property + _keyStr : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', + + // public method for urlsafe encoding + urlsafe_encode : function (input) { + return Base64.encode(input).replace(/[+]/g, '-').replace(/[\/]/g, '_').replace(/[=]/g, '.'); + }, + + // public method for encoding + encode : function (input) { + var + output = '', + chr1, chr2, chr3, enc1, enc2, enc3, enc4, + i = 0 + ; + + input = Base64._utf8_encode(input); + + while (i < input.length) + { + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + + if (isNaN(chr2)) + { + enc3 = enc4 = 64; + } + else if (isNaN(chr3)) + { + enc4 = 64; + } + + output = output + + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); + } + + return output; + }, + + // public method for decoding + decode : function (input) { + var + output = '', + chr1, chr2, chr3, enc1, enc2, enc3, enc4, + i = 0 + ; + + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); + + while (i < input.length) + { + enc1 = this._keyStr.indexOf(input.charAt(i++)); + enc2 = this._keyStr.indexOf(input.charAt(i++)); + enc3 = this._keyStr.indexOf(input.charAt(i++)); + enc4 = this._keyStr.indexOf(input.charAt(i++)); + + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + + output = output + String.fromCharCode(chr1); + + if (enc3 !== 64) + { + output = output + String.fromCharCode(chr2); + } + + if (enc4 !== 64) + { + output = output + String.fromCharCode(chr3); + } + } + + return Base64._utf8_decode(output); + }, + + // private method for UTF-8 encoding + _utf8_encode : function (string) { + + string = string.replace(/\r\n/g, "\n"); + + var + utftext = '', + n = 0, + l = string.length, + c = 0 + ; + + for (; n < l; n++) { + + c = string.charCodeAt(n); + + if (c < 128) + { + utftext += String.fromCharCode(c); + } + else if ((c > 127) && (c < 2048)) + { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else + { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + } + + return utftext; + }, + + // private method for UTF-8 decoding + _utf8_decode : function (utftext) { + var + string = '', + i = 0, + c = 0, + c2 = 0, + c3 = 0 + ; + + while ( i < utftext.length ) + { + c = utftext.charCodeAt(i); + + if (c < 128) + { + string += String.fromCharCode(c); + i++; + } + else if((c > 191) && (c < 224)) + { + c2 = utftext.charCodeAt(i+1); + string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 2; + } + else + { + c2 = utftext.charCodeAt(i+1); + c3 = utftext.charCodeAt(i+2); + string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + } + + return string; + } +}; + +/*jslint bitwise: false*/ \ No newline at end of file diff --git a/dev/Common/Constants.js b/dev/Common/Constants.js new file mode 100644 index 000000000..063910e6c --- /dev/null +++ b/dev/Common/Constants.js @@ -0,0 +1,101 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +Consts.Defaults = {}; +Consts.Values = {}; +Consts.DataImages = {}; + +/** + * @const + * @type {number} + */ +Consts.Defaults.MessagesPerPage = 20; + +/** + * @const + * @type {Array} + */ +Consts.Defaults.MessagesPerPageArray = [10, 20, 30, 50, 100/*, 150, 200, 300*/]; + +/** + * @const + * @type {number} + */ +Consts.Defaults.DefaultAjaxTimeout = 20000; + +/** + * @const + * @type {number} + */ +Consts.Defaults.SearchAjaxTimeout = 120000; + +/** + * @const + * @type {number} + */ +Consts.Defaults.SendMessageAjaxTimeout = 200000; + +/** + * @const + * @type {number} + */ +Consts.Defaults.SaveMessageAjaxTimeout = 200000; + +/** + * @const + * @type {string} + */ +Consts.Values.UnuseOptionValue = '__UNUSE__'; + +/** + * @const + * @type {string} + */ +Consts.Values.GmailFolderName = '[Gmail]'; + +/** + * @const + * @type {string} + */ +Consts.Values.ClientSideCookieIndexName = 'rlcsc'; + +/** + * @const + * @type {number} + */ +Consts.Values.ImapDefaulPort = 143; + +/** + * @const + * @type {number} + */ +Consts.Values.ImapDefaulSecurePort = 993; + +/** + * @const + * @type {number} + */ +Consts.Values.SmtpDefaulPort = 25; + +/** + * @const + * @type {number} + */ +Consts.Values.SmtpDefaulSecurePort = 465; + +/** + * @const + * @type {number} + */ +Consts.Values.iMessageBodyCacheLimit = 15; + +/** + * @const + * @type {string} + */ +Consts.DataImages.UserDotPic = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2P8DwQACgAD/il4QJ8AAAAASUVORK5CYII='; + +/** + * @const + * @type {string} + */ +Consts.DataImages.TranspPic = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2NkAAIAAAoAAggA9GkAAAAASUVORK5CYII='; diff --git a/dev/Common/Enums.js b/dev/Common/Enums.js new file mode 100644 index 000000000..f8245bb7e --- /dev/null +++ b/dev/Common/Enums.js @@ -0,0 +1,286 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @enum {string} + */ +Enums.StorageResultType = { + 'Success': 'success', + 'Abort': 'abort', + 'Error': 'error', + 'Unload': 'unload' +}; + +/** + * @enum {number} + */ +Enums.State = { + 'Empty': 10, + 'Login': 20, + 'Auth': 30 +}; + +/** + * @enum {number} + */ +Enums.StateType = { + 'Webmail': 0, + 'Admin': 1 +}; + +/** + * @enum {number} + */ +Enums.FolderType = { + 'Inbox': 10, + 'SentItems': 11, + 'Draft': 12, + 'Trash': 13, + 'Spam': 14, + 'User': 99 +}; + +/** + * @enum {string} + */ +Enums.LoginSignMeTypeAsString = { + 'DefaultOff': 'defaultoff', + 'DefaultOn': 'defaulton', + 'Unused': 'unused' +}; + +/** + * @enum {number} + */ +Enums.LoginSignMeType = { + 'DefaultOff': 0, + 'DefaultOn': 1, + 'Unused': 2 +}; + +/** + * @enum {string} + */ +Enums.ComposeType = { + 'Empty': 'empty', + 'Reply': 'reply', + 'ReplyAll': 'replyall', + 'Forward': 'forward', + 'ForwardAsAttachment': 'forward-as-attachment', + 'Draft': 'draft' +}; + +/** + * @enum {number} + */ +Enums.UploadErrorCode = { + 'Normal': 0, + 'FileIsTooBig': 1, + 'FilePartiallyUploaded': 2, + 'FileNoUploaded': 3, + 'MissingTempFolder': 4, + 'FileOnSaveingError': 5, + 'FileType': 98, + 'Unknown': 99 +}; + +/** + * @enum {number} + */ +Enums.SetSystemFoldersNotification = { + 'None': 0, + 'Sent': 1, + 'Draft': 2, + 'Spam': 3, + 'Trash': 4 +}; + +/** + * @enum {number} + */ +Enums.ClientSideKeyName = { + 'FoldersLashHash': 0, + 'MessagesInboxLastHash': 1, + 'MailBoxListSize': 2, + 'ExpandedFolders': 3, + 'FolderListSize': 4 +}; + +/** + * @enum {number} + */ +Enums.EventKeyCode = { + 'Backspace': 8, + 'Enter': 13, + 'Esc': 27, + 'PageUp': 33, + 'PageDown': 34, + 'Left': 37, + 'Right': 39, + 'Up': 38, + 'Down': 40, + 'End': 35, + 'Home': 36, + 'Insert': 45, + 'Delete': 46, + 'A': 65, + 'S': 83 +}; + +/** + * @enum {number} + */ +Enums.MessageSetAction = { + 'SetSeen': 0, + 'UnsetSeen': 1, + 'SetFlag': 2, + 'UnsetFlag': 3 +}; + +/** + * @enum {number} + */ +Enums.MessageSelectAction = { + 'All': 0, + 'None': 1, + 'Invert': 2, + 'Unseen': 3, + 'Seen': 4, + 'Flagged': 5, + 'Unflagged': 6 +}; + +/** + * @enum {number} + */ +Enums.DesktopNotifications = { + 'Allowed': 0, + 'NotAllowed': 1, + 'Denied': 2, + 'NotSupported': 9 +}; + +/** + * @enum {number} + */ +Enums.MessagePriority = { + 'Low': 5, + 'Normal': 3, + 'High': 1 +}; + +/** + * @enum {string} + */ +Enums.EditorDefaultType = { + 'Html': 'Html', + 'Plain': 'Plain' +}; + +/** + * @enum {string} + */ +Enums.CustomThemeType = { + 'Light': 'Light', + 'Dark': 'Dark' +}; + +/** + * @enum {number} + */ +Enums.ServerSecure = { + 'None': 0, + 'SSL': 1, + 'TLS': 2 +}; + +/** + * @enum {number} + */ +Enums.SearchDateType = { + 'All': -1, + 'Days3': 3, + 'Days7': 7, + 'Month': 30 +}; + +/** + * @enum {number} + */ +Enums.EmailType = { + 'Defailt': 0, + 'Facebook': 1, + 'Google': 2 +}; + +/** + * @enum {number} + */ +Enums.SaveSettingsStep = { + 'Animate': -2, + 'Idle': -1, + 'TrueResult': 1, + 'FalseResult': 0 +}; + +/** + * @enum {string} + */ +Enums.InterfaceAnimation = { + 'None': 'None', + 'Normal': 'Normal', + 'Full': 'Full' +}; + +/** + * @enum {number} + */ +Enums.Notification = { + 'InvalidToken': 101, + 'AuthError': 102, + 'AccessError': 103, + 'ConnectionError': 104, + 'CaptchaError': 105, + 'SocialFacebookLoginAccessDisable': 106, + 'SocialTwitterLoginAccessDisable': 107, + 'SocialGoogleLoginAccessDisable': 108, + 'DomainNotAllowed': 109, + 'AccountNotAllowed': 110, + + 'CantGetMessageList': 201, + 'CantGetMessage': 202, + 'CantDeleteMessage': 203, + 'CantMoveMessage': 204, + + 'CantSaveMessage': 301, + 'CantSendMessage': 302, + 'InvalidRecipients': 303, + + 'CantCreateFolder': 400, + 'CantRenameFolder': 401, + 'CantDeleteFolder': 402, + 'CantSubscribeFolder': 403, + 'CantUnsubscribeFolder': 404, + 'CantDeleteNonEmptyFolder': 405, + + 'CantSaveSettings': 501, + 'CantSavePluginSettings': 502, + + 'DomainAlreadyExists': 601, + + 'CantInstallPackage': 701, + 'CantDeletePackage': 702, + 'InvalidPluginPackage': 703, + 'UnsupportedPluginPackage': 704, + + 'LicensingServerIsUnavailable': 710, + 'LicensingExpired': 711, + 'LicensingBanned': 712, + + 'DemoSendMessageError': 750, + + 'AccountAlreadyExists': 801, + + 'MailServerError': 901, + 'UnknownNotification': 999, + 'UnknownError': 999 +}; diff --git a/dev/Common/Globals.js b/dev/Common/Globals.js new file mode 100644 index 000000000..797e09beb --- /dev/null +++ b/dev/Common/Globals.js @@ -0,0 +1,67 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @type {?} + */ +Globals.now = (new Date()).getTime(); + +/** + * @type {?} + */ +Globals.minuteTick = ko.observable(true); + +/** + * @type {?} + */ +Globals.fiveMinuteTick = ko.observable(true); + +/** + * @type {?} + */ +Globals.langChangeTick = ko.observable(true); + +/** + * @type {number} + */ +Globals.iAjaxErrorCount = 0; + +/** + * @type {number} + */ +Globals.iTokenErrorCount = 0; + +/** + * @type {number} + */ +Globals.iMessageBodyCacheCount = 0; + +/** + * @type {boolean} + */ +Globals.bUnload = false; + +/** + * @type {string} + */ +Globals.sUserAgent = (navigator.userAgent || '').toLowerCase(); + +/** + * @type {boolean} + */ +Globals.bIsiOSDevice = -1 < Globals.sUserAgent.indexOf('iphone') || -1 < Globals.sUserAgent.indexOf('ipod') || -1 < Globals.sUserAgent.indexOf('ipad'); + +/** + * @type {boolean} + */ +Globals.bIsAndroidDevice = -1 < Globals.sUserAgent.indexOf('android'); + +/** + * @type {boolean} + */ +Globals.bMobileDevice = Globals.bIsiOSDevice || Globals.bIsAndroidDevice; + +Globals.bDisableNanoScroll = Globals.bMobileDevice; + +Globals.bAnimationSupported = !Globals.bMobileDevice && $html.hasClass('csstransitions'); + +Globals.sAnimationType = ''; diff --git a/dev/Common/HtmlEditor.js b/dev/Common/HtmlEditor.js new file mode 100644 index 000000000..a3a67bfc1 --- /dev/null +++ b/dev/Common/HtmlEditor.js @@ -0,0 +1,897 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function HtmlEditor(oTextAreaElem, oHtmlAreaElem, oToolBarElement, oOptions) +{ + var + oDefOptions = { + 'DisableHtml': false, + 'onSwitch': false, + 'LangSwitcherConferm': 'EDITOR_TEXT_SWITCHER_CONFIRM', + 'LangSwitcherTextLabel': 'EDITOR_SWITCHER_TEXT_LABEL', + 'LangSwitcherHtmlLabel': 'EDITOR_SWITCHER_HTML_LABEL' + } + ; + + this.bIe = !!/msie/.test(navigator.userAgent.toLowerCase()); + + oOptions = $.extend(oDefOptions, Utils.isUnd(oOptions) ? {} : oOptions); + + this.oOptions = oOptions; + this.bOnlyPlain = !!this.oOptions.DisableHtml; + this.fOnSwitch = this.oOptions.onSwitch; + + this.textarea = $(oTextAreaElem).empty().addClass('editorTextArea'); + this.htmlarea = $(oHtmlAreaElem).empty().addClass('editorHtmlArea').prop('contentEditable', 'true'); + this.toolbar = $(oToolBarElement).empty().addClass('editorToolbar'); + + HtmlEditor.htmlInitEditor.apply(this); + HtmlEditor.htmlInitToolbar.apply(this); + HtmlEditor.htmlAttachEditorEvents.apply(this); + + if (this.bOnlyPlain) + { + this.toolbar.hide(); +// this.switchToPlain(false); + } +} + +/** + * @param {string} mA + * @param {string} mB + * @param {string} mC + */ +HtmlEditor.prototype.initLanguage = function (mA, mB, mC) +{ + this.oOptions.LangSwitcherConferm = mA; + this.oOptions.LangSwitcherTextLabel = mB; + this.oOptions.LangSwitcherHtmlLabel = mC; +}; + +/** + * @param {string} mA + * @param {boolean=} mB + * @param {string=} mC + */ +HtmlEditor.prototype.execCom = function (mA, mB, mC) +{ + if (window.document) + { + window.document.execCommand(mA, mB || false, mC || null); + this.updateTextArea(); + } +}; + +HtmlEditor.prototype.getEditorSelection = function () { + var mSelection = null; + if (window.getSelection) + { + mSelection = window.getSelection(); + } + else if (window.document.getSelection) + { + mSelection = window.document.getSelection(); + } + else if (window.document.selection) + { + mSelection = window.document.selection; + } + return mSelection; +}; + +HtmlEditor.prototype.getEditorRange = function () { + var oSelection = this.getEditorSelection(); + if (!oSelection || 0 === oSelection.rangeCount) + { + return null; + } + return (oSelection.getRangeAt) ? oSelection.getRangeAt(0) : oSelection.createRange(); +}; + +/** + * @param {string} mA + * @param {boolean=} mB + * @param {string=} mC + */ +HtmlEditor.prototype.ec = function (mA, mB, mC) +{ + this.execCom(mA, mB, mC); +}; + +/** + * @param {number} iHeading + */ +HtmlEditor.prototype.heading = function (iHeading) +{ + this.ec('formatblock', false, (this.bIe) ? 'Heading ' + iHeading : 'h' + iHeading); +}; + +/** + * @param {string} sSrc + */ +HtmlEditor.prototype.insertImage = function (sSrc) +{ + if (this.isHtml() && !this.bOnlyPlain) + { + this.htmlarea.focus(); + this.ec('insertImage', false, sSrc); + } +}; + +HtmlEditor.prototype.focus = function () +{ + if (this.isHtml() && !this.bOnlyPlain) + { + this.htmlarea.focus(); + } + else + { + this.textarea.focus(); + } +}; + +/** + * @param {string} sType + * @param {string} sColor + */ +HtmlEditor.prototype.setcolor = function (sType, sColor) +{ + var + oRange = null, + sCmd = '' + ; + + if (this.bIe && !document['addEventListener']) + { + oRange = this.getEditorRange(); + if (oRange) + { + oRange.execCommand(('forecolor' === sType) ? 'ForeColor' : 'BackColor', false, sColor); + } + } + else + { + if (this.bIe) + { + sCmd = ('forecolor' === sType) ? 'ForeColor' : 'BackColor'; + } + else + { + sCmd = ('forecolor' === sType) ? 'foreColor' : 'backColor'; + } + + this.ec(sCmd, false, sColor); + } +}; + +/** + * @return {boolean} + */ +HtmlEditor.prototype.isHtml = function () +{ + return (true === this.bOnlyPlain) ? false : this.textarea.is(':hidden'); +}; + +/** + * @return {string} + */ +HtmlEditor.prototype.toHtmlString = function () +{ + return this.editor.innerHTML; +}; + +/** + * @return {string} + */ +HtmlEditor.prototype.toString = function () +{ + return this.editor.innerText; +}; + +HtmlEditor.prototype.updateTextArea = function () +{ + this.textarea.val(this.toHtmlString()); +}; + +HtmlEditor.prototype.updateHtmlArea = function () +{ + this.editor.innerHTML = this.textarea.val(); +}; + +/** + * @param {string} sInnerText + * @param {boolean} bIsHtml + */ +HtmlEditor.prototype.setRawText = function (sInnerText, bIsHtml) +{ + if (bIsHtml && !this.bOnlyPlain) + { + if (!this.isHtml()) + { + this.textarea.val(''); + this.switchToHtml(); + } + + this.textarea.val(sInnerText.toString()); + this.updateHtmlArea(); + } + else + { + this.textarea.val(sInnerText.toString()); + this.updateHtmlArea(); + this.switchToPlain(false); + } +}; + +HtmlEditor.prototype.clear = function () +{ + this.textarea.val(''); + this.editor.innerHTML = ''; + + if (this.bOnlyPlain) + { + this.toolbar.hide(); + this.switchToPlain(false); + } + else + { + this.switchToHtml(); + } +}; + +/** + * @return {string} + */ +HtmlEditor.prototype.getTextForRequest = function () +{ + if (this.isHtml()) + { + this.updateTextArea(); + return this.textarea.val(); + } + + return this.textarea.val(); +}; + +/** + * @param {boolean=} bWrap + * @return {string} + */ +HtmlEditor.prototype.getTextFromHtml = function (bWrap) +{ + var + sText = '', + sQuoteChar = '> ', + + convertBlockquote = function () { + if (arguments && 1 < arguments.length) + { + var sText = Utils.trim(arguments[1]) + .replace(/__bq__start__([\s\S\n\r]*)__bq__end__/gm, convertBlockquote) + ; + + sText = '\n' + sQuoteChar + Utils.trim(sText).replace(/\n/gm, '\n' + sQuoteChar) + '\n>\n'; + + return sText.replace(/\n([> ]+)/gm, function () { + return (arguments && 1 < arguments.length) ? '\n' + Utils.trim(arguments[1].replace(/[\s]/, '')) + ' ' : ''; + }); + } + + return ''; + }, + + convertDivs = function () { + if (arguments && 1 < arguments.length) + { + var sText = Utils.trim(arguments[1]); + if (0 < sText.length) + { + sText = sText.replace(/]*>([\s\S]*)<\/div>/gmi, convertDivs); + sText = '\n' + Utils.trim(sText) + '\n'; + } + return sText; + } + return ''; + }, + + convertLinks = function () { + if (arguments && 1 < arguments.length) + { + var + sName = Utils.trim(arguments[1]) +// sHref = Utils.trim(arguments[0].replace(//gmi, '$1')) + ; + + return sName; +// sName = (0 === Utils.trim(sName).length) ? '' : sName; +// sHref = ('mailto:' === sHref.substr(0, 7)) ? '' : sHref; +// sHref = ('http' === sHref.substr(0, 4)) ? sHref : ''; +// sHref = (sName === sHref) ? '' : sHref; +// sHref = (0 < sHref.length) ? ' (' + sHref + ') ' : ''; +// return (0 < sName.length) ? sName + sHref : sName; + } + return ''; + } + ; + + bWrap = Utils.isUnd(bWrap) ? true : !!bWrap; + + sText = this.toHtmlString() + .replace(/[\s]+/gm, ' ') + .replace(//gmi, '\n') + .replace(/<\/h\d>/gi, '\n') + .replace(/<\/p>/gi, '\n\n') + .replace(/<\/li>/gi, '\n') + .replace(/<\/td>/gi, '\n') + .replace(/<\/tr>/gi, '\n') + .replace(/]*>/gmi, '\n_______________________________\n\n') + .replace(/]*>/gmi, '') + .replace(/]*>([\s\S]*)<\/div>/gmi, convertDivs) + .replace(/]*>/gmi, '\n__bq__start__\n') + .replace(/<\/blockquote>/gmi, '\n__bq__end__\n') + .replace(/]*>([\s\S]*?)<\/a>/gmi, convertLinks) + .replace(/ /gi, ' ') + .replace(/<[^>]*>/gm, '') + .replace(/>/gi, '>') + .replace(/</gi, '<') + .replace(/&/gi, '&') + .replace(/&\w{2,6};/gi, '') + ; + + return (bWrap ? Utils.splitPlainText(sText) : sText) + .replace(/\n[ \t]+/gm, '\n') + .replace(/[\n]{3,}/gm, '\n\n') + .replace(/__bq__start__([\s\S]*)__bq__end__/gm, convertBlockquote) + .replace(/__bq__start__/gm, '') + .replace(/__bq__end__/gm, '') + ; +}; + +/** + * @return {string} + */ +HtmlEditor.prototype.getHtmlFromText = function () +{ + return Utils.convertPlainTextToHtml(this.textarea.val()); +}; + +HtmlEditor.prototype.switchToggle = function () +{ + if (this.isHtml()) + { + this.switchToPlain(); + } + else + { + this.switchToHtml(); + } +}; + +/** +* @param {boolean=} bWithConfirm +*/ +HtmlEditor.prototype.switchToPlain = function (bWithConfirm) +{ + bWithConfirm = Utils.isUnd(bWithConfirm) ? true : bWithConfirm; + + var + sText = this.getTextFromHtml(), + fSwitch = _.bind(function (bValue) { + + if (bValue) + { + this.toolbar.addClass('editorHideToolbar'); + $('.editorSwitcher', this.toolbar).text(this.switcherLinkText(false)); + + this.textarea.val(sText); + this.textarea.show(); +// this.textarea.css({'display': ''}); + this.htmlarea.hide(); + if (this.fOnSwitch) + { + this.fOnSwitch(false); + } + } + + }, this) + ; + + if (!bWithConfirm || 0 === Utils.trim(sText).length) + { + fSwitch(true); + } + else + { + fSwitch(window.confirm(this.oOptions.LangSwitcherConferm)); +// Utils.dialogConfirm(this.oOptions.LangSwitcherConferm, fSwitch); + } +}; + +/** + * @param {boolean} bIsPlain + * @return {string} + */ +HtmlEditor.prototype.switcherLinkText = function (bIsPlain) +{ + return (bIsPlain) ? this.oOptions.LangSwitcherTextLabel : this.oOptions.LangSwitcherHtmlLabel; +// return (bIsPlain) ? '« ' + 'EDITOR_TEXT_SWITCHER_PLAINT_TEXT' : 'EDITOR_TEXT_SWITCHER_RICH_FORMATTING' + ' »'; +}; + +HtmlEditor.prototype.switchToHtml = function () +{ + this.toolbar.removeClass('editorHideToolbar'); + $('.editorSwitcher', this.toolbar).text(this.switcherLinkText(true)); + + this.textarea.val(this.getHtmlFromText()); + this.updateHtmlArea(); + this.textarea.hide(); + this.htmlarea.show(); +// this.htmlarea.css({'display': ''}); + + if (this.fOnSwitch) + { + this.fOnSwitch(true); + } +}; + +/** + * @param {string} sName + * @param {string} sTitle + */ +HtmlEditor.prototype.addButton = function (sName, sTitle) +{ + var self = this; + + $('
').addClass('editorToolbarButtom').append($('').addClass(sName)).attr('title', sTitle).click(function (oEvent) { + if (!Utils.isUnd(HtmlEditor.htmlFunctions[sName])) + { + HtmlEditor.htmlFunctions[sName].apply(self, [$(this), oEvent]); + } + else + { + window.alert(sName); + } + }).appendTo(this.toolbar); +}; + +HtmlEditor.htmlInitToolbar = function () +{ + if (!this.bOnlyPlain) + { +// this.addButton('fontname', 'Select font'); + this.addButton('bold', 'Bold'); + this.addButton('italic', 'Italic'); + this.addButton('underline', 'Underline'); + this.addButton('strikethrough', 'Strikethrough'); + + this.addButton('removeformat', 'removeformat'); + + this.addButton('justifyleft', 'justifyleft'); + this.addButton('justifycenter', 'justifycenter'); + this.addButton('justifyright', 'justifyright'); + + this.addButton('horizontalrule', 'horizontalrule'); + + this.addButton('orderedlist', 'orderedlist'); + this.addButton('unorderedlist', 'unorderedlist'); + + this.addButton('indent', 'indent'); + this.addButton('outdent', 'outdent'); + + this.addButton('forecolor', 'forecolor'); +// this.addButton('backcolor', 'backcolor'); + + (function ($, that) { + + $('').addClass('editorSwitcher').text(that.switcherLinkText(true)).click(function () { + that.switchToggle(); + }).appendTo(that.toolbar); + + }($, this)); + } +}; + +HtmlEditor.htmlInitEditor = function () +{ + this.editor = this.htmlarea[0]; + this.editor.innerHTML = this.textarea.val(); +}; + +HtmlEditor.htmlAttachEditorEvents = function () +{ + var + self = this, + + fIsImage = function (oItem) { + return oItem && oItem.type && 0 === oItem.type.indexOf('image/'); + }, + +// fUpdateHtmlArea = function () { +// self.updateHtmlArea(); +// }, +// +// fUpdateTextArea = function () { +// self.updateTextArea(); +// }, + + fHandleFileSelect = function (oEvent) { + + oEvent = (oEvent && oEvent.originalEvent ? + oEvent.originalEvent : oEvent) || window.event; + + if (oEvent) + { + oEvent.stopPropagation(); + oEvent.preventDefault(); + + var + oReader = null, + oFile = null, + aFiles = (oEvent.files || (oEvent.dataTransfer ? oEvent.dataTransfer.files : null)) + ; + + if (aFiles && 1 === aFiles.length && fIsImage(aFiles[0])) + { + oFile = aFiles[0]; + + oReader = new window.FileReader(); + oReader.onload = (function (oLocalFile) { + return function (oEvent) { + self.insertImage(oEvent.target.result, oLocalFile.name); + }; + }(oFile)); + + oReader.readAsDataURL(oFile); + } + } + + self.htmlarea.removeClass('editorDragOver'); + }, + + fHandleDragLeave = function () { + self.htmlarea.removeClass('editorDragOver'); + }, + + fHandleDragOver = function (oEvent) { + oEvent.stopPropagation(); + oEvent.preventDefault(); + + self.htmlarea.addClass('editorDragOver'); + }, + + fHandlePaste = function (oEvent) { + + var oClipboardData = oEvent && oEvent.clipboardData ? oEvent.clipboardData : + (oEvent && oEvent.originalEvent && oEvent.originalEvent.clipboardData ? oEvent.originalEvent.clipboardData : null); + + if (oClipboardData && oClipboardData.items) + { + _.each(oClipboardData.items, function (oItem) { + if (fIsImage(oItem) && oItem['getAsFile']) { + var oReader = null, oFile = oItem['getAsFile'](); + if (oFile) + { + oReader = new window.FileReader(); + oReader.onload = (function (oLocalFile) { + return function (oEvent) { + self.insertImage(oEvent.target.result, oLocalFile.name); + }; + }(oFile)); + + oReader.readAsDataURL(oFile); + } + } + }); + } + } + ; + + if (!this.bOnlyPlain) + { +// this.textarea.on('click keyup keydown mousedown blur', fUpdateHtmlArea); +// this.htmlarea.on('click keyup keydown mousedown blur', fUpdateTextArea); +// + if (window.File && window.FileReader && window.FileList) + { + this.htmlarea.bind('dragover', fHandleDragOver); + this.htmlarea.bind('dragleave', fHandleDragLeave); + this.htmlarea.bind('drop', fHandleFileSelect); + this.htmlarea.bind('paste', fHandlePaste); + } + } +}; + +HtmlEditor.htmlColorPickerColors = (function () { + + var + aMaps = [], + aColors = [], + iIndex = 0, + iIndexSub = 0, + iIndexSubSub = 0, + iLen = 0, + sMap = '' + ; + + for (iIndex = 0; iIndex < 256; iIndex += 85) + { + sMap = iIndex.toString(16); + aMaps.push(1 === sMap.length ? '0' + sMap : sMap); + } + + iLen = aMaps.length; + for (iIndex = 0; iIndex < iLen; iIndex++) + { + for (iIndexSub = 0; iIndexSub < iLen; iIndexSub++) + { + for (iIndexSubSub = 0; iIndexSubSub < iLen; iIndexSubSub++) + { + aColors.push('#' + aMaps[iIndex] + '' + aMaps[iIndexSub] + '' + aMaps[iIndexSubSub]); + } + } + } + + return aColors; + +}()); + +HtmlEditor.htmlFontPicker = (function () { + + var + jqDoc = $(window.document), + bIsAppented = false, + oFontPickerHolder = $('
'), + oFonts = oFontPickerHolder.find('.editorFpFonts'), + fCurrentFunc = function () {} + ; + + $.each(['Arial', 'Arial Black', 'Courier New', 'Tahoma', 'Times New Roman', 'Verdana'], function (iIndex, sFont) { + oFonts.append( + $('' + sFont + '').click(function () { + fCurrentFunc(sFont); + }) + ); + oFonts.append('
'); + }); + + oFontPickerHolder.hide(); + + return function (oClickObject, fSelectFunc, oTollbar) { + + if (!bIsAppented) + { + oFontPickerHolder.appendTo(oTollbar); + bIsAppented = true; + } + + fCurrentFunc = fSelectFunc; + + jqDoc.unbind('click.fpNamespace'); + window.setTimeout(function () { + jqDoc.one('click.fpNamespace', function () { + oFontPickerHolder.hide(); + }); + }, 500); + + var oPos = $(oClickObject).position(); + oFontPickerHolder + .css('top', (5 + oPos.top + $(oClickObject).height()) + 'px') + .css('left', oPos.left + 'px') + .show(); + }; + +}()); + +HtmlEditor.htmlColorPicker = (function () { + + var + jqDoc = $(window.document), + bIsAppented = false, + oColorPickerHolder = $('
'), + oColors = oColorPickerHolder.find('.editorCpColors'), + fCurrentFunc = function () {} + ; + + $.each(HtmlEditor.htmlColorPickerColors, function (iIndex, sColor) { + oColors.append(''); + }); + + oColorPickerHolder.hide(); + + $('.editorCpColor', oColors).click(function (oEvent) { + + var + iIndex = 1, + sSelectedColor = '#000000', + sRgbString = $(oEvent.target).css('background-color'), + aParts = sRgbString.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/) + ; + + if (aParts !== null) + { + delete (aParts[0]); + for (; iIndex <= 3; ++iIndex) + { + aParts[iIndex] = Utils.pInt(aParts[iIndex]).toString(16); + if (1 === aParts[iIndex].length) + { + aParts[iIndex] = '0' + aParts[iIndex]; + } + } + + sSelectedColor = '#' + aParts.join(''); + } + else + { + sSelectedColor = sRgbString; + } + + fCurrentFunc(sSelectedColor); + }); + + return function (oClickObject, fSelectFunc, oTollbar) { + + if (!bIsAppented) + { + oColorPickerHolder.appendTo(oTollbar); + bIsAppented = true; + } + + var oPos = $(oClickObject).position(); + fCurrentFunc = fSelectFunc; + + jqDoc.unbind('click.cpNamespace'); + window.setTimeout(function () { + jqDoc.one('click.cpNamespace', function () { + oColorPickerHolder.hide(); + }); + }, 100); + + oColorPickerHolder + .css('top', (5 + oPos.top + $(oClickObject).height()) + 'px') + .css('left', oPos.left + 'px') + .show(); + }; + +}()); + +/* ----------- */ + +HtmlEditor.htmlFunctions = { + + /** + * @this {HtmlEditor} + */ + 'bold': function () + { + this.ec('bold'); + }, + + /** + * @this {HtmlEditor} + */ + 'italic': function () + { + this.ec('italic'); + }, + + /** + * @this {HtmlEditor} + */ + 'underline': function () + { + this.ec('underline'); + }, + + /** + * @this {HtmlEditor} + */ + 'strikethrough': function () + { + this.ec('strikethrough'); + }, + + /** + * @this {HtmlEditor} + */ + 'indent': function () + { + this.ec('indent'); + }, + + /** + * @this {HtmlEditor} + */ + 'outdent': function () + { + this.ec('outdent'); + }, + + /** + * @this {HtmlEditor} + */ + 'justifyleft': function () + { + this.ec('justifyLeft'); + }, + + /** + * @this {HtmlEditor} + */ + 'justifycenter': function () + { + this.ec('justifyCenter'); + }, + + /** + * @this {HtmlEditor} + */ + 'justifyright': function () + { + this.ec('justifyRight'); + }, + + /** + * @this {HtmlEditor} + */ + 'horizontalrule': function () + { + this.ec('insertHorizontalRule', false, 'ht'); + }, + + /** + * @this {HtmlEditor} + */ + 'removeformat': function () + { + this.ec('removeFormat'); + }, + + /** + * @this {HtmlEditor} + */ + 'orderedlist': function () + { + this.ec('insertorderedlist'); + }, + + /** + * @this {HtmlEditor} + */ + 'unorderedlist': function () + { + this.ec('insertunorderedlist'); + }, + + /** + * @this {HtmlEditor} + */ + 'forecolor': function (oClickObject) + { + HtmlEditor.htmlColorPicker(oClickObject, _.bind(function (sValue) { + this.setcolor('forecolor', sValue); + }, this), this.toolbar); + }, + + /** + * @this {HtmlEditor} + */ + 'backcolor': function (oClickObject) + { + HtmlEditor.htmlColorPicker(oClickObject, _.bind(function (sValue) { + this.setcolor('backcolor', sValue); + }, this), this.toolbar); + }, + + /** + * @this {HtmlEditor} + */ + 'fontname': function (oClickObject) + { + HtmlEditor.htmlFontPicker(oClickObject, _.bind(function (sValue) { + this.ec('fontname', false, sValue); + }, this), this.toolbar); + } +}; diff --git a/dev/Common/Knockout.js b/dev/Common/Knockout.js new file mode 100644 index 000000000..1c3edb342 --- /dev/null +++ b/dev/Common/Knockout.js @@ -0,0 +1,787 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +ko.bindingHandlers.tooltip = { + 'init': function (oElement, fValueAccessor) { + if (!Globals.bMobileDevice) + { + var + sClass = $(oElement).data('tooltip-class') || '', + sPlacement = $(oElement).data('tooltip-placement') || 'top' + ; + + $(oElement).tooltip({ + 'delay': { + 'show': 500, + 'hide': 100 + }, + 'html': true, + 'placement': sPlacement, + 'trigger': 'hover', + 'title': function () { + return '' + + Utils.i18n(ko.utils.unwrapObservable(fValueAccessor())) + ''; + } + }); + } + } +}; + +ko.bindingHandlers.tooltip2 = { + 'init': function (oElement, fValueAccessor) { + var + sClass = $(oElement).data('tooltip-class') || '', + sPlacement = $(oElement).data('tooltip-placement') || 'top' + ; + $(oElement).tooltip({ + 'delay': { + 'show': 500, + 'hide': 100 + }, + 'html': true, + 'placement': sPlacement, + 'title': function () { + return '' + fValueAccessor()() + ''; + } + }); + } +}; + +ko.bindingHandlers.dropdown = { + 'init': function (oElement) { + $(oElement).closest('.dropdown').on('click', '.e-item', function () { + $(oElement).dropdown('toggle'); + }); + } +}; + +ko.bindingHandlers.popover = { + 'init': function (oElement, fValueAccessor) { + $(oElement).popover(ko.utils.unwrapObservable(fValueAccessor())); + } +}; + +ko.bindingHandlers.resizecrop = { + 'init': function (oElement) { + $(oElement).addClass('resizecrop').resizecrop({ + 'width': '100', + 'height': '100', + 'wrapperCSS': { + 'border-radius': '10px' + } + }); + }, + 'update': function (oElement, fValueAccessor) { + fValueAccessor()(); + $(oElement).resizecrop({ + 'width': '100', + 'height': '100' + }); + } +}; + +ko.bindingHandlers.onEnter = { + 'init': function (oElement, fValueAccessor, fAllBindingsAccessor, oViewModel) { + $(oElement).on('keypress', function (oEvent) { + if (oEvent && 13 === window.parseInt(oEvent.keyCode, 10)) + { + $(oElement).trigger('change'); + fValueAccessor().call(oViewModel); + } + }); + } +}; + +ko.bindingHandlers.onEsc = { + 'init': function (oElement, fValueAccessor, fAllBindingsAccessor, oViewModel) { + $(oElement).on('keypress', function (oEvent) { + if (oEvent && 27 === window.parseInt(oEvent.keyCode, 10)) + { + $(oElement).trigger('change'); + fValueAccessor().call(oViewModel); + } + }); + } +}; + +ko.bindingHandlers.modal = { + 'init': function (oElement, fValueAccessor) { + $(oElement).modal({ + 'keyboard': false, + 'show': ko.utils.unwrapObservable(fValueAccessor()) + }).on('hidden', function () { + fValueAccessor()(false); + }); + }, + 'update': function (oElement, fValueAccessor) { + var bValue = ko.utils.unwrapObservable(fValueAccessor()); + $(oElement).modal(bValue ? 'show' : 'hide'); + + _.delay(function () { + $(oElement).toggleClass('popup-active', bValue); + }, 1); + } +}; + +ko.bindingHandlers.i18nInit = { + 'init': function (oElement) { + Utils.i18nToNode(oElement); + } +}; + +ko.bindingHandlers.i18nUpdate = { + 'update': function (oElement, fValueAccessor) { + ko.utils.unwrapObservable(fValueAccessor()); + Utils.i18nToNode(oElement); + } +}; + +ko.bindingHandlers.link = { + 'update': function (oElement, fValueAccessor) { + $(oElement).attr('href', ko.utils.unwrapObservable(fValueAccessor())); + } +}; + +ko.bindingHandlers.title = { + 'update': function (oElement, fValueAccessor) { + $(oElement).attr('title', ko.utils.unwrapObservable(fValueAccessor())); + } +}; + +ko.bindingHandlers.textF = { + 'init': function (oElement, fValueAccessor) { + $(oElement).text(ko.utils.unwrapObservable(fValueAccessor())); + } +}; + +ko.bindingHandlers.initDom = { + 'init': function (oElement, fValueAccessor) { + fValueAccessor()(oElement); + } +}; + +ko.bindingHandlers.initResizeTrigger = { + 'init': function (oElement, fValueAccessor) { + var aValues = ko.utils.unwrapObservable(fValueAccessor()); + $(oElement).css({ + 'height': aValues[1], + 'min-height': aValues[1] + }); + }, + 'update': function (oElement, fValueAccessor) { + var + aValues = ko.utils.unwrapObservable(fValueAccessor()), + iValue = Utils.pInt(aValues[1]), + iSize = 0, + iOffset = $(oElement).offset().top + ; + + if (0 < iOffset) + { + iOffset += Utils.pInt(aValues[2]); + iSize = $window.height() - iOffset; + + if (iValue < iSize) + { + iValue = iSize; + } + + $(oElement).css({ + 'height': iValue, + 'min-height': iValue + }); + } + } +}; + +ko.bindingHandlers.appendDom = { + 'update': function (oElement, fValueAccessor) { + $(oElement).hide().empty().append(ko.utils.unwrapObservable(fValueAccessor())).show(); + } +}; + +ko.bindingHandlers.draggable = { + 'init': function (oElement, fValueAccessor, fAllBindingsAccessor) { + + if (!Globals.bMobileDevice) + { + var + iTriggerZone = 100, + iScrollSpeed = 3, + fAllValueFunc = fAllBindingsAccessor(), + sDroppableSelector = fAllValueFunc && fAllValueFunc['droppableSelector'] ? fAllValueFunc['droppableSelector'] : '', + oConf = { + 'distance': 20, + 'handle': '.dragHandle', + 'cursorAt': {'top': 22, 'left': 3}, + 'refreshPositions': true, + 'scroll': true + } + ; + + if (sDroppableSelector) + { + oConf['drag'] = function (oEvent) { + + $(sDroppableSelector).each(function () { + var + moveUp = null, + moveDown = null, + $this = $(this), + oOffset = $this.offset(), + bottomPos = oOffset.top + $this.height() + ; + + window.clearInterval($this.data('timerScroll')); + $this.data('timerScroll', false); + + if (oEvent.pageX >= oOffset.left && oEvent.pageX <= oOffset.left + $this.width()) + { + if (oEvent.pageY >= bottomPos - iTriggerZone && oEvent.pageY <= bottomPos) + { + moveUp = function() { + $this.scrollTop($this.scrollTop() + iScrollSpeed); + Utils.windowResize(); + }; + + $this.data('timerScroll', window.setInterval(moveUp, 10)); + moveUp(); + } + + if(oEvent.pageY >= oOffset.top && oEvent.pageY <= oOffset.top + iTriggerZone) + { + moveDown = function() { + $this.scrollTop($this.scrollTop() - iScrollSpeed); + Utils.windowResize(); + }; + + $this.data('timerScroll', window.setInterval(moveDown, 10)); + moveDown(); + } + } + }); + }; + + oConf['stop'] = function() { + $(sDroppableSelector).each(function () { + window.clearInterval($(this).data('timerScroll')); + $(this).data('timerScroll', false); + }); + }; + } + + oConf['helper'] = function (oEvent) { + return fValueAccessor()(oEvent && oEvent.target ? ko.dataFor(oEvent.target) : null); + }; + + $(oElement).draggable(oConf).on('mousedown', function () { + Utils.removeInFocus(); + }); + } + } +}; + +ko.bindingHandlers.droppable = { + 'init': function (oElement, fValueAccessor, fAllBindingsAccessor) { + + if (!Globals.bMobileDevice) + { + var + fValueFunc = fValueAccessor(), + fAllValueFunc = fAllBindingsAccessor(), + fOverCallback = fAllValueFunc && fAllValueFunc['droppableOver'] ? fAllValueFunc['droppableOver'] : null, + fOutCallback = fAllValueFunc && fAllValueFunc['droppableOut'] ? fAllValueFunc['droppableOut'] : null, + oConf = { + 'tolerance': 'pointer', + 'hoverClass': 'droppableHover' + } + ; + + if (fValueFunc) + { + oConf['drop'] = function (oEvent, oUi) { + fValueFunc(oEvent, oUi); + }; + + if (fOverCallback) + { + oConf['over'] = function (oEvent, oUi) { + fOverCallback(oEvent, oUi); + }; + } + + if (fOutCallback) + { + oConf['out'] = function (oEvent, oUi) { + fOutCallback(oEvent, oUi); + }; + } + + $(oElement).droppable(oConf); + } + } + } +}; + +ko.bindingHandlers.nano = { + 'init': function (oElement) { + if (!Globals.bDisableNanoScroll) + { + $(oElement) + .addClass('nano') + .nanoScroller({ + 'iOSNativeScrolling': false, + 'preventPageScrolling': true + }) + ; + } + } +}; + +ko.bindingHandlers.saveTrigger1 = { + 'init': function (oElement) { + + var $oEl = $(oElement); + + $oEl.data('save-trigger-type', $oEl.is('input[type=text]') ? 'input' : 'custom'); + + if ('custom' === $oEl.data('save-trigger-type')) + { + $oEl.append( + '  ' + ).addClass('settings-saved-trigger'); + } + else + { + $oEl.addClass('settings-saved-trigger-input'); + } + }, + 'update': function (oElement, fValueAccessor) { + var + mValue = ko.utils.unwrapObservable(fValueAccessor()), + $oEl = $(oElement), + bCustom = 'custom' === $oEl.data('save-trigger-type'), + sSuffix = bCustom ? '' : '-input' + ; + + switch (mValue.toString()) + { + case '1': + $oEl + .find('.sst-animated' + sSuffix + ',.sst-error' + sSuffix).hide().removeClass('sst-visible' + sSuffix) + .end() + .find('.sst-success' + sSuffix).show().addClass('sst-visible' + sSuffix) + ; + break; + case '0': + $oEl + .find('.sst-animated' + sSuffix + ',.sst-success' + sSuffix).hide().removeClass('sst-visible' + sSuffix) + .end() + .find('.sst-error' + sSuffix).show().addClass('sst-visible' + sSuffix) + ; + break; + case '-2': + $oEl + .find('.sst-error' + sSuffix + ',.sst-success' + sSuffix).hide().removeClass('sst-visible' + sSuffix) + .end() + .find('.sst-animated' + sSuffix).show().addClass('sst-visible' + sSuffix) + ; + break; + default: + $oEl + .find('.sst-animated' + sSuffix).hide() + .end() + .find('.sst-error' + sSuffix + ',.sst-success' + sSuffix).removeClass('sst-visible' + sSuffix) + ; + break; + } + } +}; + +ko.bindingHandlers.saveTrigger = { + 'init': function (oElement) { + + var $oEl = $(oElement); + + $oEl.data('save-trigger-type', $oEl.is('input[type=text],select,textarea') ? 'input' : 'custom'); + + if ('custom' === $oEl.data('save-trigger-type')) + { + $oEl.append( + '  ' + ).addClass('settings-saved-trigger'); + } + else + { + $oEl.addClass('settings-saved-trigger-input'); + } + }, + 'update': function (oElement, fValueAccessor) { + var + mValue = ko.utils.unwrapObservable(fValueAccessor()), + $oEl = $(oElement) + ; + + if ('custom' === $oEl.data('save-trigger-type')) + { + switch (mValue.toString()) + { + case '1': + $oEl + .find('.animated,.error').hide().removeClass('visible') + .end() + .find('.success').show().addClass('visible') + ; + break; + case '0': + $oEl + .find('.animated,.success').hide().removeClass('visible') + .end() + .find('.error').show().addClass('visible') + ; + break; + case '-2': + $oEl + .find('.error,.success').hide().removeClass('visible') + .end() + .find('.animated').show().addClass('visible') + ; + break; + default: + $oEl + .find('.animated').hide() + .end() + .find('.error,.success').removeClass('visible') + ; + break; + } + } + else + { + switch (mValue.toString()) + { + case '1': + $oEl.addClass('success').removeClass('error'); + break; + case '0': + $oEl.addClass('error').removeClass('success'); + break; + case '-2': +// $oEl; + break; + default: + $oEl.removeClass('error success'); + break; + } + } + } +}; + +ko.bindingHandlers.select2 = { + 'init': function(oElement, fValueAccessor) { + + var + iTimer = 0, + iTimeout = 100, + oMatch = null, + oReg = new window.RegExp(/[a-zA-Z0-9\.\-_]+@[a-zA-Z0-9\.\-_]+/), + oReg2 = new window.RegExp(/(.+) [<]?([^\s<@]+@[a-zA-Z0-9\.\-_]+)[>]?/), + sEmptyTranslateFunction = function () { + return ''; + }, + /** + * @param {{term:string, callback:Function, matcher:Function}} oCall + */ + fLazyAutocomplete = function (oCall) { + + RL.getAutocomplete(oCall['term'], oCall['page'], function (aData, bMore) { + oCall.callback({ + 'more': !!bMore, + 'results': _.map(aData, function (oEmailItem) { + var sName = oEmailItem.toLine(false); + return { + 'id': sName, + 'text': sName, + 'c': oEmailItem + }; + }) + }); + }); + } + ; + + $(oElement).addClass('ko-select2').select2({ + + /** + * @param {{term:string, callback:Function, matcher:Function}} oCall + */ + 'query': function (oCall) { + if (!oCall) + { + return; + } + +// if (RL.isLocalAutocomplete && false) +// { +// fLazyAutocomplete(oCall); +// } +// else +// { + if (0 === iTimer) + { + fLazyAutocomplete(oCall); + iTimer = window.setTimeout(Utils.emptyFunction, iTimeout); + } + else + { + window.clearInterval(iTimer); + iTimer = window.setTimeout(function () { + fLazyAutocomplete(oCall); + }, iTimeout); + } +// } + }, + 'formatSelection': function (oItem, oContainer) { + var sR = oItem && oItem.c ? oItem.c.select2Selection(oContainer) : oItem.text; + if (null !== sR) + { + return sR; + } + }, + 'formatResult': function (oItem, oContainer, oQuery, fEscapeMarkup) { + var sR = oItem && oItem.c ? oItem.c.select2Result(oContainer) : ''; + return '' === sR ? fEscapeMarkup(oItem.text) : sR; + }, + 'createSearchChoice': function (sTerm, aList) { + return 0 === aList.length && oReg.test(sTerm) ? { + 'id': sTerm, + 'text': sTerm + } : null; + }, + 'formatNoMatches': sEmptyTranslateFunction, + 'formatSearching': function () { + return Utils.i18n('SUGGESTIONS/SEARCHING_DESC'); + }, + 'formatInputTooShort': sEmptyTranslateFunction, + 'formatSelectionTooBig': sEmptyTranslateFunction, + 'multiple': true, + 'tokenSeparators': [',', ';'], + 'minimumInputLength': 2, + 'selectOnBlur': false, + 'closeOnSelect': true, + 'openOnEnter': false + }); + + ko.utils.domNodeDisposal.addDisposeCallback(oElement, function() { + $(oElement).select2('destroy'); + }); + + $(oElement).on('change', function () { + + var + aTags = $(this).select2('data'), + iIndex = 0, + iLen = aTags.length, + oItem = null, + aResult = [] + ; + + for (; iIndex < iLen; iIndex++) + { + oItem = aTags[iIndex]; + if (oItem && oItem.id) + { + if (!oItem.c) + { + oItem.c = new EmailModel(); + oMatch = oReg2.exec(Utils.trim(oItem.id)); + if (oMatch && !Utils.isUnd(oMatch[2])) + { + oItem.c.name = oMatch[1]; + oItem.c.email = oMatch[2]; + } + else + { + oItem.c.email = oItem.id; + } + } + + aResult.push(oItem.c); + } + } + + fValueAccessor()(aResult); + }); + }, + + 'update': function (oElement, fValueAccessor) { + + var + aTags = ko.utils.unwrapObservable(fValueAccessor()), + iIndex = 0, + iLen = aTags.length, + oItem = null, + sName = '', + aResult = [] + ; + + for (; iIndex < iLen; iIndex++) + { + oItem = aTags[iIndex]; + sName = oItem.toLine(false); + + aResult.push({ + 'id': sName, + 'text': sName, + 'c': oItem + }); + } + + $(oElement).select2('data', aResult); + } +}; + +ko.bindingHandlers.command = { + 'init': function (oElement, fValueAccessor, fAllBindingsAccessor, oViewModel) { + var + jqElement = $(oElement), + oCommand = fValueAccessor() + ; + + if (!oCommand || !oCommand.enabled || !oCommand.canExecute) + { + throw new Error('You are not using command function'); + } + + jqElement.addClass('command'); + ko.bindingHandlers[jqElement.is('form') ? 'submit' : 'click'].init.apply(oViewModel, arguments); + }, + + 'update': function (oElement, fValueAccessor) { + + var + bResult = true, + jqElement = $(oElement), + oCommand = fValueAccessor() + ; + + bResult = oCommand.enabled(); + jqElement.toggleClass('command-not-enabled', !bResult); + + if (bResult) + { + bResult = oCommand.canExecute(); + jqElement.toggleClass('command-can-not-be-execute', !bResult); + } + + jqElement.toggleClass('command-disabled disable disabled', !bResult); + + if (jqElement.is('input') || jqElement.is('button')) + { + jqElement.prop('disabled', !bResult); + } + } +}; + +ko.extenders.trimmer = function (oTarget) +{ + var oResult = ko.computed({ + 'read': oTarget, + 'write': function (sNewValue) { + oTarget(Utils.trim(sNewValue.toString())); + }, + 'owner': this + }); + + oResult(oTarget()); + return oResult; +}; + +ko.extenders.reversible = function (oTarget) +{ + var mValue = oTarget(); + + oTarget.commit = function () + { + mValue = oTarget(); + }; + + oTarget.reverse = function () + { + oTarget(mValue); + }; + + oTarget.commitedValue = function () + { + return mValue; + }; + + return oTarget; +}; + +ko.extenders.toggleSubscribe = function (oTarget, oOptions) +{ + oTarget.subscribe(oOptions[1], oOptions[0], 'beforeChange'); + oTarget.subscribe(oOptions[2], oOptions[0]); + + return oTarget; +}; + +ko.extenders.falseTimeout = function (oTarget, iOption) +{ + oTarget.iTimeout = 0; + oTarget.subscribe(function (bValue) { + if (bValue) + { + window.clearTimeout(oTarget.iTimeout); + oTarget.iTimeout = window.setTimeout(function () { + oTarget(false); + oTarget.iTimeout = 0; + }, Utils.pInt(iOption)); + } + }); + + return oTarget; +}; + +ko.observable.fn.validateEmail = function () +{ + this.hasError = ko.observable(false); + + this.subscribe(function (sValue) { + sValue = Utils.trim(sValue); + this.hasError('' !== sValue && !(/^[^@\s]+@[^@\s]+$/.test(sValue))); + }, this); + + this.valueHasMutated(); + return this; +}; + +ko.observable.fn.validateSimpleEmail = function () +{ + this.hasError = ko.observable(false); + + this.subscribe(function (sValue) { + sValue = Utils.trim(sValue); + this.hasError('' !== sValue && !(/^.+@.+$/.test(sValue))); + }, this); + + this.valueHasMutated(); + return this; +}; + +ko.observable.fn.validateFunc = function (fFunc) +{ + this.hasFuncError = ko.observable(false); + + if (Utils.isFunc(fFunc)) + { + this.subscribe(function (sValue) { + this.hasFuncError(!fFunc(sValue)); + }, this); + + this.valueHasMutated(); + } + + return this; +}; + diff --git a/dev/Common/LinkBuilder.js b/dev/Common/LinkBuilder.js new file mode 100644 index 000000000..56175d83c --- /dev/null +++ b/dev/Common/LinkBuilder.js @@ -0,0 +1,274 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function LinkBuilder() +{ + this.sBase = '#/'; + this.sCdnStaticDomain = RL.settingsGet('CdnStaticDomain'); + this.sVersion = RL.settingsGet('Version'); + this.sSpecSuffix = RL.settingsGet('AuthAccountHash') || '0'; + + this.sServer = (RL.settingsGet('IndexFile') || './') + '?'; + this.sCdnStaticDomain = '' === this.sCdnStaticDomain ? this.sCdnStaticDomain : + ('/' === this.sCdnStaticDomain.substr(-1) ? this.sCdnStaticDomain : this.sCdnStaticDomain + '/'); +} + +/** + * @return {string} + */ +LinkBuilder.prototype.root = function () +{ + return this.sBase; +}; + +/** + * @param {string} sDownload + * @return {string} + */ +LinkBuilder.prototype.attachmentDownload = function (sDownload) +{ + return this.sServer + '/Raw/' + this.sSpecSuffix + '/Download/' + sDownload; +}; + +/** + * @param {string} sDownload + * @return {string} + */ +LinkBuilder.prototype.attachmentPreview = function (sDownload) +{ + return this.sServer + '/Raw/' + this.sSpecSuffix + '/View/' + sDownload; +}; + +/** + * @param {string} sDownload + * @return {string} + */ +LinkBuilder.prototype.attachmentPreviewAsPlain = function (sDownload) +{ + return this.sServer + '/Raw/' + this.sSpecSuffix + '/ViewAsPlain/' + sDownload; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.upload = function () +{ + return this.sServer + '/Upload/' + this.sSpecSuffix + '/'; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.uploadBackground = function () +{ + return this.sServer + '/UploadBackground/' + this.sSpecSuffix + '/'; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.append = function () +{ + return this.sServer + '/Append/' + this.sSpecSuffix + '/'; +}; + +/** + * @param {string} sEmail + * @return {string} + */ +LinkBuilder.prototype.change = function (sEmail) +{ + return this.sServer + '/Change/' + this.sSpecSuffix + '/' + window.encodeURIComponent(sEmail) + '/'; +}; + +/** + * @param {string=} sAdd + * @return {string} + */ +LinkBuilder.prototype.ajax = function (sAdd) +{ + return this.sServer + '/Ajax/' + this.sSpecSuffix + '/' + sAdd; +}; + +/** + * @param {string} sRequestHash + * @return {string} + */ +LinkBuilder.prototype.messageViewLink = function (sRequestHash) +{ + return this.sServer + '/Raw/' + this.sSpecSuffix + '/ViewAsPlain/' + sRequestHash; +}; + +/** + * @param {string} sRequestHash + * @return {string} + */ +LinkBuilder.prototype.messageDownloadLink = function (sRequestHash) +{ + return this.sServer + '/Raw/' + this.sSpecSuffix + '/Download/' + sRequestHash; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.inbox = function () +{ + return this.sBase + 'mailbox/Inbox'; +}; + +/** + * @param {string=} sScreenName + * @return {string} + */ +LinkBuilder.prototype.settings = function (sScreenName) +{ + var sResult = this.sBase + 'settings'; + if (!Utils.isUnd(sScreenName) && '' !== sScreenName) + { + sResult += '/' + sScreenName; + } + + return sResult; +}; + +/** + * @param {string} sScreenName + * @return {string} + */ +LinkBuilder.prototype.admin = function (sScreenName) +{ + var sResult = this.sBase; + switch (sScreenName) { + case 'AdminDomains': + sResult += 'domains'; + break; + case 'AdminSecurity': + sResult += 'security'; + break; + case 'AdminLicensing': + sResult += 'licensing'; + break; + } + + return sResult; +}; + +/** + * @param {string} sFolder + * @param {number=} iPage + * @param {string=} sSearch + * @return {string} + */ +LinkBuilder.prototype.mailBox = function (sFolder, iPage, sSearch) +{ + iPage = Utils.isNormal(iPage) ? Utils.pInt(iPage) : 1; + sSearch = Utils.pString(sSearch); + + var sResult = this.sBase + 'mailbox/'; + if ('' !== sFolder) + { + sResult += encodeURI(sFolder); + } + if (1 < iPage) + { + sResult = sResult.replace(/[\/]+$/, ''); + sResult += '/p' + iPage; + } + if ('' !== sSearch) + { + sResult = sResult.replace(/[\/]+$/, ''); + sResult += '/' + encodeURI(sSearch); + } + + return sResult; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.phpInfo = function () +{ + return this.sServer + 'Info'; +}; + +/** + * @param {string} sLang + * @return {string} + */ +LinkBuilder.prototype.langLink = function (sLang) +{ + return this.sServer + '/Lang/0/' + encodeURI(sLang) + '/' + this.sVersion + '/'; +}; + +/** + * @param {string} sHash + * @return {string} + */ +LinkBuilder.prototype.getUserPicUrlFromHash = function (sHash) +{ + return this.sServer + '/Raw/' + this.sSpecSuffix + '/UserPic/' + sHash + '/' + this.sVersion + '/'; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.emptyContactPic = function () +{ + return ('' === this.sCdnStaticDomain ? 'rainloop/v/' : this.sCdnStaticDomain) + + this.sVersion + '/static/css/images/empty-contact.png'; +}; + +/** + * @param {string} sFileName + * @return {string} + */ +LinkBuilder.prototype.sound = function (sFileName) +{ + return ('' === this.sCdnStaticDomain ? 'rainloop/v/' : this.sCdnStaticDomain) + + this.sVersion + '/static/sounds/' + sFileName; +}; + +/** + * @param {string} sTheme + * @return {string} + */ +LinkBuilder.prototype.themePreviewLink = function (sTheme) +{ + return ('' === this.sCdnStaticDomain ? 'rainloop/v/' : this.sCdnStaticDomain) + + this.sVersion + '/themes/' + encodeURI(sTheme) + '/images/preview.png'; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.notificationMailIcon = function () +{ + return ('' === this.sCdnStaticDomain ? 'rainloop/v/' : this.sCdnStaticDomain) + + this.sVersion + '/static/css/images/icom-message-notification.png'; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.socialGoogle = function () +{ + return this.sServer + 'SocialGoogle' + ('' !== this.sSpecSuffix ? '/' + this.sSpecSuffix + '/' : ''); +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.socialTwitter = function () +{ + return this.sServer + 'SocialTwitter' + ('' !== this.sSpecSuffix ? '/' + this.sSpecSuffix + '/' : ''); +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.socialFacebook = function () +{ + return this.sServer + 'SocialFacebook' + ('' !== this.sSpecSuffix ? '/' + this.sSpecSuffix + '/' : ''); +}; diff --git a/dev/Common/Plugins.js b/dev/Common/Plugins.js new file mode 100644 index 000000000..9f4c821be --- /dev/null +++ b/dev/Common/Plugins.js @@ -0,0 +1,95 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @type {Object} + */ +Plugins.oViewModelsHooks = {}; + +/** + * @type {Object} + */ +Plugins.oSimpleHooks = {}; + +/** + * @param {string} sName + * @param {Function} ViewModel + */ +Plugins.regViewModelHook = function (sName, ViewModel) +{ + if (ViewModel) + { + ViewModel.__hookName = sName; + } +}; + +/** + * @param {string} sName + * @param {Function} fCallback + */ +Plugins.addHook = function (sName, fCallback) +{ + if (Utils.isFunc(fCallback)) + { + if (!Utils.isArray(Plugins.oSimpleHooks[sName])) + { + Plugins.oSimpleHooks[sName] = []; + } + + Plugins.oSimpleHooks[sName].push(fCallback); + } +}; + +/** + * @param {string} sName + * @param {Array=} aArguments + */ +Plugins.runHook = function (sName, aArguments) +{ + if (Utils.isArray(Plugins.oSimpleHooks[sName])) + { + aArguments = aArguments || []; + + _.each(Plugins.oSimpleHooks[sName], function (fCallback) { + fCallback.apply(null, aArguments); + }); + } +}; + +/** + * @param {string} sName + * @return {?} + */ +Plugins.mainSettingsGet = function (sName) +{ + return RL ? RL.settingsGet(sName) : null; +}; + +/** + * @param {Function} fCallback + * @param {string} sAction + * @param {Object=} oParameters + * @param {?number=} iTimeout + * @param {string=} sGetAdd = '' + * @param {Array=} aAbortActions = [] + */ +Plugins.remoteRequest = function (fCallback, sAction, oParameters, iTimeout, sGetAdd, aAbortActions) +{ + if (RL) + { + RL.remote().defaultRequest(fCallback, sAction, oParameters, iTimeout, sGetAdd, aAbortActions); + } +}; + +/** + * @param {string} sPluginSection + * @param {string} sName + * @return {?} + */ +Plugins.settingsGet = function (sPluginSection, sName) +{ + var oPlugin = Plugins.mainSettingsGet('Plugins'); + oPlugin = oPlugin && Utils.isUnd(oPlugin[sPluginSection]) ? null : oPlugin[sPluginSection]; + return oPlugin ? (Utils.isUnd(oPlugin[sName]) ? null : oPlugin[sName]) : null; +}; + + diff --git a/dev/Common/Selector.js b/dev/Common/Selector.js new file mode 100644 index 000000000..d4c8c7e3f --- /dev/null +++ b/dev/Common/Selector.js @@ -0,0 +1,525 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @param {koProperty} oKoList + * @param {koProperty} oKoSelectedItem + * @param {string} sItemSelector + * @param {string} sItemSelectedSelector + * @param {string} sItemCheckedSelector + */ +function Selector(oKoList, oKoSelectedItem, sItemSelector, sItemSelectedSelector, sItemCheckedSelector) +{ + this.list = oKoList; + this.selectedItem = oKoSelectedItem; + + this.selectedItem.extend({'toggleSubscribe': [null, + function (oPrev) { + if (oPrev) + { + oPrev.selected(false); + } + }, function (oNext) { + if (oNext) + { + oNext.selected(true); + } + } + ]}); + + this.oContentVisible = null; + this.oContentScrollable = null; + + this.sItemSelector = sItemSelector; + this.sItemSelectedSelector = sItemSelectedSelector; + this.sItemCheckedSelector = sItemCheckedSelector; + + this.sLastUid = ''; + this.oCallbacks = {}; + this.iSelectTimer = 0; + this.bUseKeyboard = true; + + this.emptyFunction = function () {}; + + this.useItemSelectCallback = true; + this.throttleSelection = false; + + this.selectedItem.subscribe(function (oItem) { + if (this.useItemSelectCallback) + { + if (this.throttleSelection) + { + this.throttleSelection = false; + this.selectItemCallbacksThrottle(oItem); + } + else + { + this.selectItemCallbacks(oItem); + } + } + }, this); + + var + self = this, + aCheckedCache = [], + mSelected = null + ; + + this.list.subscribe(function () { + var self = this, aItems = this.list(); + if (Utils.isArray(aItems)) + { + _.each(aItems, function (oItem) { + if (oItem.checked()) + { + aCheckedCache.push(self.getItemUid(oItem)); + } + + if (null === mSelected && oItem.selected()) + { + mSelected = self.getItemUid(oItem); + } + }); + } + }, this, 'beforeChange'); + + this.list.subscribe(function (aItems) { + + this.useItemSelectCallback = false; + + this.selectedItem(null); + + if (Utils.isArray(aItems)) + { + var self = this, iLen = aCheckedCache.length; + _.each(aItems, function (oItem) { + if (0 < iLen && -1 < Utils.inArray(self.getItemUid(oItem), aCheckedCache)) + { + oItem.checked(true); + iLen--; + } + + if (null !== mSelected && mSelected === self.getItemUid(oItem)) + { + oItem.selected(true); + mSelected = null; + + self.selectedItem(oItem); + } + }); + } + + this.useItemSelectCallback = true; + + aCheckedCache = []; + mSelected = null; + }, this); + + this.list.setSelectedByUid = function (sUid) { + self.selectByUid(sUid, false); + }; + + this.selectItemCallbacksThrottle = _.debounce(this.selectItemCallbacks, 300); +} + +Selector.prototype.selectItemCallbacks = function (oItem) +{ + (this.oCallbacks['onItemSelect'] || this.emptyFunction)(oItem); +}; + +Selector.prototype.init = function (oContentVisible, oContentScrollable) +{ + this.oContentVisible = oContentVisible; + this.oContentScrollable = oContentScrollable; + + if (this.oContentVisible && this.oContentScrollable) + { + var + self = this + ; + + $(this.oContentVisible) + .on('click', this.sItemSelector, function (oEvent) { + self.actionClick(ko.dataFor(this), oEvent); + }).on('click', this.sItemCheckedSelector, function (oEvent) { + var oItem = ko.dataFor(this); + if (oItem) + { + if (oEvent && oEvent.shiftKey) + { + self.actionClick(oItem, oEvent); + } + else + { + self.sLastUid = self.getItemUid(oItem); + if (oItem.selected()) + { + oItem.checked(false); + self.selectedItem(null); + } + else + { + oItem.checked(!oItem.checked()); + } + } + } + }) + ; + + $(window.document).on('keydown', function (oEvent) { + var bResult = true; + if (oEvent && self.bUseKeyboard && !Utils.inFocus()) + { + if (-1 < Utils.inArray(oEvent.keyCode, [Enums.EventKeyCode.Up, Enums.EventKeyCode.Down, Enums.EventKeyCode.Insert, + Enums.EventKeyCode.Home, Enums.EventKeyCode.End, Enums.EventKeyCode.PageUp, Enums.EventKeyCode.PageDown])) + { + self.newSelectPosition(oEvent.keyCode, oEvent.shiftKey); + bResult = false; + } + else if (Enums.EventKeyCode.Delete === oEvent.keyCode && !oEvent.ctrlKey && !oEvent.shiftKey) + { + if (self.oCallbacks['onDelete']) + { + self.oCallbacks['onDelete'](); + } + + bResult = false; + } + } + return bResult; + }); + } +}; + +Selector.prototype.selectByUid = function (mUid, bUseCallback) +{ + bUseCallback = Utils.isUnd(bUseCallback) ? true : !!bUseCallback; + this.useItemSelectCallback = bUseCallback; + + var + oItem = _.find(this.list(), function (oItem) { + return mUid === this.getItemUid(oItem); + }, this) + ; + + if (oItem) + { + this.selectedItem(oItem); + } + + this.useItemSelectCallback = true; +}; + +Selector.prototype.useKeyboard = function (bValue) +{ + this.bUseKeyboard = !!bValue; +}; + +/** + * @param {Object} oItem + * @returns {string} + */ +Selector.prototype.getItemUid = function (oItem) +{ + var + sUid = '', + fGetItemUidCallback = this.oCallbacks['onItemGetUid'] || null + ; + + if (fGetItemUidCallback && oItem) + { + sUid = fGetItemUidCallback(oItem); + } + + return sUid.toString(); +}; + +/** + * @param {number} iEventKeyCode + * @param {boolean} bShiftKey + */ +Selector.prototype.newSelectPosition = function (iEventKeyCode, bShiftKey) +{ + var + self = this, + iIndex = 0, + iPageStep = 10, + bNext = false, + bStop = false, + oResult = null, + aList = this.list(), + iListLen = aList ? aList.length : 0, + oSelected = this.selectedItem() + ; + + if (0 < iListLen) + { + if (!oSelected) + { + if (Enums.EventKeyCode.Down === iEventKeyCode || Enums.EventKeyCode.Insert === iEventKeyCode || Enums.EventKeyCode.Home === iEventKeyCode || Enums.EventKeyCode.PageUp === iEventKeyCode) + { + oResult = aList[0]; + } + else if (Enums.EventKeyCode.Up === iEventKeyCode || Enums.EventKeyCode.End === iEventKeyCode || Enums.EventKeyCode.PageDown === iEventKeyCode) + { + oResult = aList[aList.length - 1]; + } + } + else if (oSelected) + { + if (Enums.EventKeyCode.Down === iEventKeyCode || Enums.EventKeyCode.Up === iEventKeyCode || Enums.EventKeyCode.Insert === iEventKeyCode) + { + _.each(aList, function (oItem) { + if (!bStop) + { + switch (iEventKeyCode) { + case Enums.EventKeyCode.Up: + if (oSelected === oItem) + { + bStop = true; + } + else + { + oResult = oItem; + } + break; + case Enums.EventKeyCode.Down: + case Enums.EventKeyCode.Insert: + if (bNext) + { + oResult = oItem; + bStop = true; + } + else if (oSelected === oItem) + { + bNext = true; + } + break; + } + } + }); + } + else if (Enums.EventKeyCode.Home === iEventKeyCode || Enums.EventKeyCode.End === iEventKeyCode) + { + if (Enums.EventKeyCode.Home === iEventKeyCode) + { + oResult = aList[0]; + } + else if (Enums.EventKeyCode.End === iEventKeyCode) + { + oResult = aList[aList.length - 1]; + } + } + else if (Enums.EventKeyCode.PageDown === iEventKeyCode) + { + for (; iIndex < iListLen; iIndex++) + { + if (oSelected === aList[iIndex]) + { + iIndex += iPageStep; + iIndex = iListLen - 1 < iIndex ? iListLen - 1 : iIndex; + oResult = aList[iIndex]; + break; + } + } + } + else if (Enums.EventKeyCode.PageUp === iEventKeyCode) + { + for (iIndex = iListLen; iIndex >= 0; iIndex--) + { + if (oSelected === aList[iIndex]) + { + iIndex -= iPageStep; + iIndex = 0 > iIndex ? 0 : iIndex; + oResult = aList[iIndex]; + break; + } + } + } + } + } + + if (oResult) + { + if (oSelected) + { + if (bShiftKey) + { + if (Enums.EventKeyCode.Up === iEventKeyCode || Enums.EventKeyCode.Down === iEventKeyCode) + { + oSelected.checked(!oSelected.checked()); + } + } + else if (Enums.EventKeyCode.Insert === iEventKeyCode) + { + oSelected.checked(!oSelected.checked()); + } + } + + this.throttleSelection = true; + this.selectedItem(oResult); + this.throttleSelection = true; + + if (0 !== this.iSelectTimer) + { + window.clearTimeout(this.iSelectTimer); + this.iSelectTimer = window.setTimeout(function () { + self.iSelectTimer = 0; + self.actionClick(oResult); + }, 1000); + } + else + { + this.iSelectTimer = window.setTimeout(function () { + self.iSelectTimer = 0; + }, 200); + + this.actionClick(oResult); + } + + this.scrollToSelected(); + } + else if (oSelected) + { + if (bShiftKey && (Enums.EventKeyCode.Up === iEventKeyCode || Enums.EventKeyCode.Down === iEventKeyCode)) + { + oSelected.checked(!oSelected.checked()); + } + else if (Enums.EventKeyCode.Insert === iEventKeyCode) + { + oSelected.checked(!oSelected.checked()); + } + } +}; + +/** + * @return {boolean} + */ +Selector.prototype.scrollToSelected = function () +{ + if (!this.oContentVisible || !this.oContentScrollable) + { + return false; + } + + var + iOffset = 20, + oSelected = $(this.sItemSelectedSelector, this.oContentScrollable), + oPos = oSelected.position(), + iVisibleHeight = this.oContentVisible.height(), + iSelectedHeight = oSelected.outerHeight() + ; + + if (oPos && (oPos.top < 0 || oPos.top + iSelectedHeight > iVisibleHeight)) + { + if (oPos.top < 0) + { + this.oContentScrollable.scrollTop(this.oContentScrollable.scrollTop() + oPos.top - iOffset); + } + else + { + this.oContentScrollable.scrollTop(this.oContentScrollable.scrollTop() + oPos.top - iVisibleHeight + iSelectedHeight + iOffset); + } + + return true; + } + + return false; +}; + +Selector.prototype.eventClickFunction = function (oItem, oEvent) +{ + var + sUid = this.getItemUid(oItem), + iIndex = 0, + iLength = 0, + oListItem = null, + sLineUid = '', + bChangeRange = false, + bIsInRange = false, + aList = [], + bChecked = false + ; + + if (oEvent && oEvent.shiftKey) + { + if ('' !== sUid && '' !== this.sLastUid && sUid !== this.sLastUid) + { + aList = this.list(); + bChecked = oItem.checked(); + + for (iIndex = 0, iLength = aList.length; iIndex < iLength; iIndex++) + { + oListItem = aList[iIndex]; + sLineUid = this.getItemUid(oListItem); + + bChangeRange = false; + if (sLineUid === this.sLastUid || sLineUid === sUid) + { + bChangeRange = true; + } + + if (bChangeRange) + { + bIsInRange = !bIsInRange; + } + + if (bIsInRange || bChangeRange) + { + oListItem.checked(bChecked); + } + } + } + } + + this.sLastUid = '' === sUid ? '' : sUid; +}; + +/** + * + * @param {Object} oItem + * @param {Object=} oEvent + */ +Selector.prototype.actionClick = function (oItem, oEvent) +{ + if (oItem) + { + var + bClick = true, + sUid = this.getItemUid(oItem) + ; + + if (oEvent) + { + if (oEvent.shiftKey) + { + bClick = false; + if ('' === this.sLastUid) + { + this.sLastUid = sUid; + } + + oItem.checked(!oItem.checked()); + this.eventClickFunction(oItem, oEvent); + } + else if (oEvent.ctrlKey) + { + bClick = false; + this.sLastUid = sUid; + + oItem.checked(!oItem.checked()); + } + } + + if (bClick) + { + this.selectedItem(oItem); + this.sLastUid = sUid; + } + } +}; + +Selector.prototype.on = function (sEventName, fCallback) +{ + this.oCallbacks[sEventName] = fCallback; +}; diff --git a/dev/Common/Utils.js b/dev/Common/Utils.js new file mode 100644 index 000000000..b6f7a3004 --- /dev/null +++ b/dev/Common/Utils.js @@ -0,0 +1,1343 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +Utils.trim = $.trim; +Utils.inArray = $.inArray; +Utils.isArray = _.isArray; +Utils.isFunc = _.isFunction; +Utils.isUnd = _.isUndefined; +Utils.isNull = _.isNull; +Utils.emptyFunction = function () {}; + +/** + * @param {*} oValue + * @return {boolean} + */ +Utils.isNormal = function (oValue) +{ + return !Utils.isUnd(oValue) && !Utils.isNull(oValue); +}; + +Utils.windowResize = _.debounce(function (iTimeout) { + if (Utils.isUnd(iTimeout)) + { + $window.resize(); + } + else + { + window.setTimeout(function () { + $window.resize(); + }, iTimeout); + } +}, 50); + +/** + * @param {(string|number)} mValue + * @param {boolean=} bIncludeZero + * @return {boolean} + */ +Utils.isPosNumeric = function (mValue, bIncludeZero) +{ + return Utils.isNormal(mValue) ? + ((Utils.isUnd(bIncludeZero) ? true : !!bIncludeZero) ? + (/^[0-9]*$/).test(mValue.toString()) : + (/^[1-9]+[0-9]*$/).test(mValue.toString())) : + false; +}; + +/** + * @param {*} iValue + * @return {number} + */ +Utils.pInt = function (iValue) +{ + return Utils.isNormal(iValue) && '' !== iValue ? window.parseInt(iValue, 10) : 0; +}; + +/** + * @param {*} mValue + * @return {string} + */ +Utils.pString = function (mValue) +{ + return Utils.isNormal(mValue) ? '' + mValue : ''; +}; + +/** + * @param {*} aValue + * @return {boolean} + */ +Utils.isNonEmptyArray = function (aValue) +{ + return Utils.isArray(aValue) && 0 < aValue.length; +}; + +/** + * @param {string} sPath + * @param {*=} oObject + * @param {Object=} oObjectToExportTo + */ +Utils.exportPath = function (sPath, oObject, oObjectToExportTo) +{ + var + part = null, + parts = sPath.split('.'), + cur = oObjectToExportTo || window + ; + + for (; parts.length && (part = parts.shift());) + { + if (!parts.length && !Utils.isUnd(oObject)) + { + cur[part] = oObject; + } + else if (cur[part]) + { + cur = cur[part]; + } + else + { + cur = cur[part] = {}; + } + } +}; + +/** + * @param {Object} oObject + * @param {string} sName + * @param {*} mValue + */ +Utils.pImport = function (oObject, sName, mValue) +{ + oObject[sName] = mValue; +}; + +/** + * @param {Object} oObject + * @param {string} sName + * @param {*} mDefault + * @return {*} + */ +Utils.pExport = function (oObject, sName, mDefault) +{ + return Utils.isUnd(oObject[sName]) ? mDefault : oObject[sName]; +}; + +/** + * @param {string} sText + * @return {string} + */ +Utils.encodeHtml = function (sText) +{ + return Utils.isNormal(sText) ? sText.toString() + .replace(/&/g, '&').replace(//g, '>') + .replace(/"/g, '"').replace(/'/g, ''') : ''; +}; + +/** + * @param {string} sText + * @param {number=} iLen + * @return {string} + */ +Utils.splitPlainText = function (sText, iLen) +{ + var + sPrefix = '', + sSubText = '', + sResult = sText, + iSpacePos = 0, + iNewLinePos = 0 + ; + + iLen = Utils.isUnd(iLen) ? 100 : iLen; + + while (sResult.length > iLen) + { + sSubText = sResult.substring(0, iLen); + iSpacePos = sSubText.lastIndexOf(' '); + iNewLinePos = sSubText.lastIndexOf('\n'); + + if (-1 !== iNewLinePos) + { + iSpacePos = iNewLinePos; + } + + if (-1 === iSpacePos) + { + iSpacePos = iLen; + } + + sPrefix += sSubText.substring(0, iSpacePos) + '\n'; + sResult = sResult.substring(iSpacePos + 1); + } + + return sPrefix + sResult; +}; + +Utils.timeOutAction = (function () { + + var + oTimeOuts = {} + ; + + return function (sAction, fFunction, iTimeOut) + { + if (Utils.isUnd(oTimeOuts[sAction])) + { + oTimeOuts[sAction] = 0; + } + + window.clearTimeout(oTimeOuts[sAction]); + oTimeOuts[sAction] = window.setTimeout(fFunction, iTimeOut); + }; +}()); + +Utils.timeOutActionSecond = (function () { + + var + oTimeOuts = {} + ; + + return function (sAction, fFunction, iTimeOut) + { + if (!oTimeOuts[sAction]) + { + oTimeOuts[sAction] = window.setTimeout(function () { + fFunction(); + oTimeOuts[sAction] = 0; + }, iTimeOut); + } + }; +}()); + +Utils.audio = (function () { + + var + oAudio = false + ; + + return function (sMp3File, sOggFile) { + + if (false === oAudio) + { + if (Globals.bIsiOSDevice) + { + oAudio = null; + } + else + { + var + bCanPlayMp3 = false, + bCanPlayOgg = false, + oAudioLocal = window.Audio ? new window.Audio() : null + ; + + if (oAudioLocal && oAudioLocal.canPlayType && oAudioLocal.play) + { + bCanPlayMp3 = '' !== oAudioLocal.canPlayType('audio/mpeg; codecs="mp3"'); + if (!bCanPlayMp3) + { + bCanPlayOgg = '' !== oAudioLocal.canPlayType('audio/ogg; codecs="vorbis"'); + } + + if (bCanPlayMp3 || bCanPlayOgg) + { + oAudio = oAudioLocal; + oAudio.preload = 'none'; + oAudio.loop = false; + oAudio.autoplay = false; + oAudio.muted = false; + oAudio.src = bCanPlayMp3 ? sMp3File : sOggFile; + } + else + { + oAudio = null; + } + } + else + { + oAudio = null; + } + } + } + + return oAudio; + }; +}()); + +/** + * @param {(Object|null|undefined)} oObject + * @param {string} sProp + * @return {boolean} + */ +Utils.hos = function (oObject, sProp) +{ + return oObject && Object.hasOwnProperty ? Object.hasOwnProperty.call(oObject, sProp) : false; +}; + +/** + * @param {string} sKey + * @param {Object=} oValueList + * @param {string=} sDefaulValue + * @return {string} + */ +Utils.i18n = function (sKey, oValueList, sDefaulValue) +{ + var + sValueName = '', + sResult = Utils.isUnd(I18n[sKey]) ? (Utils.isUnd(sDefaulValue) ? sKey : sDefaulValue) : I18n[sKey] + ; + + if (!Utils.isUnd(oValueList) && !Utils.isNull(oValueList)) + { + for (sValueName in oValueList) + { + if (Utils.hos(oValueList, sValueName)) + { + sResult = sResult.replace('%' + sValueName + '%', oValueList[sValueName]); + } + } + } + + return sResult; +}; + +/** + * @param {Object} oElement + */ +Utils.i18nToNode = function (oElement) +{ + _.defer(function () { + $('.i18n', oElement).each(function () { + var + jqThis = $(this), + sKey = '' + ; + + sKey = jqThis.data('i18n-text'); + if (sKey) + { + jqThis.text(Utils.i18n(sKey)); + } + else + { + sKey = jqThis.data('i18n-html'); + if (sKey) + { + jqThis.html(Utils.i18n(sKey)); + } + + sKey = jqThis.data('i18n-placeholder'); + if (sKey) + { + jqThis.attr('placeholder', Utils.i18n(sKey)); + } + } +// sKey = jqThis.data('i18n-title'); +// if (sKey) +// { +// jqThis.attr('title', Utils.i18n(sKey)); +// } + }); + }); +}; + +Utils.i18nToDoc = function () +{ + if (window.rainloopI18N) + { + I18n = window.rainloopI18N || {}; + Utils.i18nToNode($document); + + Globals.langChangeTick(!Globals.langChangeTick()); + } + + window.rainloopI18N = {}; +}; + +/** + * @param {Function} fCallback + * @param {Object} oScope + * @param {Function=} fLangCallback + */ +Utils.initOnStartOrLangChange = function (fCallback, oScope, fLangCallback) +{ + if (fCallback) + { + fCallback.call(oScope); + } + + if (fLangCallback) + { + Globals.langChangeTick.subscribe(function () { + if (fCallback) + { + fCallback.call(oScope); + } + + fLangCallback.call(oScope); + }); + } + else if (fCallback) + { + Globals.langChangeTick.subscribe(fCallback, oScope); + } +}; + +/** + * @return {boolean} + */ +Utils.inFocus = function () +{ + var oActiveObj = document.activeElement; + return (oActiveObj && ('INPUT' === oActiveObj.tagName || + 'TEXTAREA' === oActiveObj.tagName || + 'IFRAME' === oActiveObj.tagName || + ('DIV' === oActiveObj.tagName && 'editorHtmlArea' === oActiveObj.className && oActiveObj.contentEditable))); +}; + +Utils.removeInFocus = function () +{ + if (document && document.activeElement && document.activeElement.blur) + { + var oA = $(document.activeElement); + if (oA.is('input') || oA.is('textarea')) + { + document.activeElement.blur(); + } + } +}; + +Utils.removeSelection = function () +{ + if (window && window.getSelection) + { + var oSel = window.getSelection(); + if (oSel && oSel.removeAllRanges) + { + oSel.removeAllRanges(); + } + } + else if (document && document.selection && document.selection.empty) + { + document.selection.empty(); + } +}; + +/** + * @param {string} sPrefix + * @param {string} sSubject + * @return {string} + */ +Utils.replySubjectAdd = function (sPrefix, sSubject) +{ + var + oMatch = null, + sResult = Utils.trim(sSubject) + ; + + if (null !== (oMatch = (new window.RegExp('^' + sPrefix + '[\\s]?\\:(.*)$', 'gi')).exec(sSubject)) && !Utils.isUnd(oMatch[1])) + { + sResult = sPrefix + '[2]: ' + oMatch[1]; + } + else if (null !== (oMatch = (new window.RegExp('^(' + sPrefix + '[\\s]?[\\[\\(]?)([\\d]+)([\\]\\)]?[\\s]?\\:.*)$', 'gi')).exec(sSubject)) && + !Utils.isUnd(oMatch[1]) && !Utils.isUnd(oMatch[2]) && !Utils.isUnd(oMatch[3])) + { + sResult = oMatch[1] + (Utils.pInt(oMatch[2]) + 1) + oMatch[3]; + sResult = oMatch[1] + (Utils.pInt(oMatch[2]) + 1) + oMatch[3]; + } + else + { + sResult = sPrefix + ': ' + sSubject; + } + + return sResult; +}; + +/** + * @param {number} iNum + * @param {number} iDec + * @return {number} + */ +Utils.roundNumber = function (iNum, iDec) +{ + return Math.round(iNum * Math.pow(10, iDec)) / Math.pow(10, iDec); +}; + +/** + * @param {(number|string)} iSizeInBytes + * @return {string} + */ +Utils.friendlySize = function (iSizeInBytes) +{ + iSizeInBytes = Utils.pInt(iSizeInBytes); + + if (iSizeInBytes >= 1073741824) + { + return Utils.roundNumber(iSizeInBytes / 1073741824, 1) + 'GB'; + } + else if (iSizeInBytes >= 1048576) + { + return Utils.roundNumber(iSizeInBytes / 1048576, 1) + 'MB'; + } + else if (iSizeInBytes >= 1024) + { + return Utils.roundNumber(iSizeInBytes / 1024, 0) + 'KB'; + } + + return iSizeInBytes + 'B'; +}; + +/** + * @param {string} sDesc + */ +Utils.log = function (sDesc) +{ + if (window.console && window.console.log) + { + window.console.log(sDesc); + } +}; + +/** + * @param {number} iCode + * @return {string} + */ +Utils.getNotification = function (iCode) +{ + iCode = Utils.pInt(iCode); + return Utils.isUnd(NotificationI18N[iCode]) ? '' : NotificationI18N[iCode]; +}; + +Utils.initNotificationLanguage = function () +{ + NotificationI18N[Enums.Notification.InvalidToken] = Utils.i18n('NOTIFICATIONS/INVALID_TOKEN'); + NotificationI18N[Enums.Notification.AuthError] = Utils.i18n('NOTIFICATIONS/AUTH_ERROR'); + NotificationI18N[Enums.Notification.AccessError] = Utils.i18n('NOTIFICATIONS/ACCESS_ERROR'); + NotificationI18N[Enums.Notification.ConnectionError] = Utils.i18n('NOTIFICATIONS/CONNECTION_ERROR'); + NotificationI18N[Enums.Notification.CaptchaError] = Utils.i18n('NOTIFICATIONS/CAPTCHA_ERROR'); + NotificationI18N[Enums.Notification.SocialFacebookLoginAccessDisable] = Utils.i18n('NOTIFICATIONS/SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE'); + NotificationI18N[Enums.Notification.SocialTwitterLoginAccessDisable] = Utils.i18n('NOTIFICATIONS/SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE'); + NotificationI18N[Enums.Notification.SocialGoogleLoginAccessDisable] = Utils.i18n('NOTIFICATIONS/SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE'); + NotificationI18N[Enums.Notification.DomainNotAllowed] = Utils.i18n('NOTIFICATIONS/DOMAIN_NOT_ALLOWED'); + NotificationI18N[Enums.Notification.AccountNotAllowed] = Utils.i18n('NOTIFICATIONS/ACCOUNT_NOT_ALLOWED'); + + NotificationI18N[Enums.Notification.CantGetMessageList] = Utils.i18n('NOTIFICATIONS/CANT_GET_MESSAGE_LIST'); + NotificationI18N[Enums.Notification.CantGetMessage] = Utils.i18n('NOTIFICATIONS/CANT_GET_MESSAGE'); + NotificationI18N[Enums.Notification.CantDeleteMessage] = Utils.i18n('NOTIFICATIONS/CANT_DELETE_MESSAGE'); + NotificationI18N[Enums.Notification.CantMoveMessage] = Utils.i18n('NOTIFICATIONS/CANT_MOVE_MESSAGE'); + + NotificationI18N[Enums.Notification.CantSaveMessage] = Utils.i18n('NOTIFICATIONS/CANT_SAVE_MESSAGE'); + NotificationI18N[Enums.Notification.CantSendMessage] = Utils.i18n('NOTIFICATIONS/CANT_SEND_MESSAGE'); + NotificationI18N[Enums.Notification.InvalidRecipients] = Utils.i18n('NOTIFICATIONS/INVALID_RECIPIENTS'); + + NotificationI18N[Enums.Notification.CantCreateFolder] = Utils.i18n('NOTIFICATIONS/CANT_CREATE_FOLDER'); + NotificationI18N[Enums.Notification.CantRenameFolder] = Utils.i18n('NOTIFICATIONS/CANT_RENAME_FOLDER'); + NotificationI18N[Enums.Notification.CantDeleteFolder] = Utils.i18n('NOTIFICATIONS/CANT_DELETE_FOLDER'); + NotificationI18N[Enums.Notification.CantDeleteNonEmptyFolder] = Utils.i18n('NOTIFICATIONS/CANT_DELETE_NON_EMPTY_FOLDER'); + NotificationI18N[Enums.Notification.CantSubscribeFolder] = Utils.i18n('NOTIFICATIONS/CANT_SUBSCRIBE_FOLDER'); + NotificationI18N[Enums.Notification.CantUnsubscribeFolder] = Utils.i18n('NOTIFICATIONS/CANT_UNSUBSCRIBE_FOLDER'); + + NotificationI18N[Enums.Notification.CantSaveSettings] = Utils.i18n('NOTIFICATIONS/CANT_SAVE_SETTINGS'); + NotificationI18N[Enums.Notification.CantSavePluginSettings] = Utils.i18n('NOTIFICATIONS/CANT_SAVE_PLUGIN_SETTINGS'); + + NotificationI18N[Enums.Notification.DomainAlreadyExists] = Utils.i18n('NOTIFICATIONS/DOMAIN_ALREADY_EXISTS'); + + NotificationI18N[Enums.Notification.CantInstallPackage] = Utils.i18n('NOTIFICATIONS/CANT_INSTALL_PACKAGE'); + NotificationI18N[Enums.Notification.CantDeletePackage] = Utils.i18n('NOTIFICATIONS/CANT_DELETE_PACKAGE'); + NotificationI18N[Enums.Notification.InvalidPluginPackage] = Utils.i18n('NOTIFICATIONS/INVALID_PLUGIN_PACKAGE'); + NotificationI18N[Enums.Notification.UnsupportedPluginPackage] = Utils.i18n('NOTIFICATIONS/UNSUPPORTED_PLUGIN_PACKAGE'); + + NotificationI18N[Enums.Notification.LicensingServerIsUnavailable] = Utils.i18n('NOTIFICATIONS/LICENSING_SERVER_IS_UNAVAILABLE'); + NotificationI18N[Enums.Notification.LicensingExpired] = Utils.i18n('NOTIFICATIONS/LICENSING_EXPIRED'); + NotificationI18N[Enums.Notification.LicensingBanned] = Utils.i18n('NOTIFICATIONS/LICENSING_BANNED'); + + NotificationI18N[Enums.Notification.DemoSendMessageError] = Utils.i18n('NOTIFICATIONS/DEMO_SEND_MESSAGE_ERROR'); + + NotificationI18N[Enums.Notification.AccountAlreadyExists] = Utils.i18n('NOTIFICATIONS/ACCOUNT_ALREADY_EXISTS'); + + NotificationI18N[Enums.Notification.MailServerError] = Utils.i18n('NOTIFICATIONS/MAIL_SERVER_ERROR'); + NotificationI18N[Enums.Notification.UnknownNotification] = Utils.i18n('NOTIFICATIONS/UNKNOWN_ERROR'); + NotificationI18N[Enums.Notification.UnknownError] = Utils.i18n('NOTIFICATIONS/UNKNOWN_ERROR'); +}; + +/** + * @param {*} mCode + * @return {string} + */ +Utils.getUploadErrorDescByCode = function (mCode) +{ + var sResult = ''; + switch (Utils.pInt(mCode)) { + case Enums.UploadErrorCode.FileIsTooBig: + sResult = Utils.i18n('UPLOAD/ERROR_FILE_IS_TOO_BIG'); + break; + case Enums.UploadErrorCode.FilePartiallyUploaded: + sResult = Utils.i18n('UPLOAD/ERROR_FILE_PARTIALLY_UPLOADED'); + break; + case Enums.UploadErrorCode.FileNoUploaded: + sResult = Utils.i18n('UPLOAD/ERROR_NO_FILE_UPLOADED'); + break; + case Enums.UploadErrorCode.MissingTempFolder: + sResult = Utils.i18n('UPLOAD/ERROR_MISSING_TEMP_FOLDER'); + break; + case Enums.UploadErrorCode.FileOnSaveingError: + sResult = Utils.i18n('UPLOAD/ERROR_ON_SAVING_FILE'); + break; + case Enums.UploadErrorCode.FileType: + sResult = Utils.i18n('UPLOAD/ERROR_FILE_TYPE'); + break; + default: + sResult = Utils.i18n('UPLOAD/ERROR_UNKNOWN'); + break; + } + + return sResult; +}; + +/** + * @param {?} oEvent + */ +Utils.killCtrlAandS = function (oEvent) +{ + oEvent = oEvent || window.event; + if (oEvent) + { + var + oSender = oEvent.target || oEvent.srcElement, + iKey = oEvent.keyCode || oEvent.which + ; + + if (oEvent.ctrlKey && iKey === Enums.EventKeyCode.S) + { + oEvent.preventDefault(); + return; + } + + if (oSender && oSender.tagName && oSender.tagName.match(/INPUT|TEXTAREA/i)) + { + return; + } + + if (oEvent.ctrlKey && iKey === Enums.EventKeyCode.A) + { + if (window.getSelection) + { + window.getSelection().removeAllRanges(); + } + else if (window.document.selection && window.document.selection.clear) + { + window.document.selection.clear(); + } + + oEvent.preventDefault(); + } + } +}; + +/** + * @param {(Object|null|undefined)} oContext + * @param {Function} fExecute + * @param {(Function|boolean|null)=} fCanExecute + * @return {Function} + */ +Utils.createCommand = function (oContext, fExecute, fCanExecute) +{ + var + fResult = fExecute ? function () { + if (fResult.canExecute && fResult.canExecute()) + { + fExecute.apply(oContext, Array.prototype.slice.call(arguments)); + } + return false; + } : function () {} + ; + + fResult.enabled = ko.observable(true); + + fCanExecute = Utils.isUnd(fCanExecute) ? true : fCanExecute; + if (Utils.isFunc(fCanExecute)) + { + fResult.canExecute = ko.computed(function () { + return fResult.enabled() && fCanExecute.call(oContext); + }); + } + else + { + fResult.canExecute = ko.computed(function () { + return fResult.enabled() && !!fCanExecute; + }); + } + + return fResult; +}; + +/** + * @param {Object} oData + */ +Utils.initDataConstructorBySettings = function (oData) +{ + oData.editorDefaultType = ko.observable(Enums.EditorDefaultType.Html); + oData.showImages = ko.observable(false); + oData.interfaceAnimation = ko.observable(Enums.InterfaceAnimation.Full); + + Globals.sAnimationType = Enums.InterfaceAnimation.Full; + + oData.allowThemes = ko.observable(true); + oData.allowCustomLogin = ko.observable(false); + oData.allowLanguagesOnSettings = ko.observable(true); + oData.allowLanguagesOnLogin = ko.observable(true); + + oData.desktopNotifications = ko.observable(false); + oData.useThreads = ko.observable(true); + oData.replySameFolder = ko.observable(true); + oData.usePreviewPane = ko.observable(true); + oData.useCheckboxesInList = ko.observable(true); + + oData.interfaceAnimation.subscribe(function (sValue) { + if (Globals.bMobileDevice || sValue === Enums.InterfaceAnimation.None) + { + $html.removeClass('rl-anim rl-anim-full').addClass('no-rl-anim'); + + Globals.sAnimationType = Enums.InterfaceAnimation.None; + } + else + { + switch (sValue) + { + case Enums.InterfaceAnimation.Full: + $html.removeClass('no-rl-anim').addClass('rl-anim rl-anim-full'); + Globals.sAnimationType = sValue; + break; + case Enums.InterfaceAnimation.Normal: + $html.removeClass('no-rl-anim rl-anim-full').addClass('rl-anim'); + Globals.sAnimationType = sValue; + break; + } + } + }); + + oData.interfaceAnimation.valueHasMutated(); + + oData.desktopNotificationsPermisions = ko.computed(function () { + oData.desktopNotifications(); + var iResult = Enums.DesktopNotifications.NotSupported; + if (NotificationClass && NotificationClass.permission) + { + switch (NotificationClass.permission.toLowerCase()) + { + case 'granted': + iResult = Enums.DesktopNotifications.Allowed; + break; + case 'denied': + iResult = Enums.DesktopNotifications.Denied; + break; + case 'default': + iResult = Enums.DesktopNotifications.NotAllowed; + break; + } + } + else if (window.webkitNotifications && window.webkitNotifications.checkPermission) + { + iResult = window.webkitNotifications.checkPermission(); + } + + return iResult; + }); + + oData.useDesktopNotifications = ko.computed({ + 'read': function () { + return oData.desktopNotifications() && + Enums.DesktopNotifications.Allowed === oData.desktopNotificationsPermisions(); + }, + 'write': function (bValue) { + if (bValue) + { + var iPermission = oData.desktopNotificationsPermisions(); + if (Enums.DesktopNotifications.Allowed === iPermission) + { + oData.desktopNotifications(true); + } + else if (Enums.DesktopNotifications.NotAllowed === iPermission) + { + NotificationClass.requestPermission(function () { + oData.desktopNotifications.valueHasMutated(); + if (Enums.DesktopNotifications.Allowed === oData.desktopNotificationsPermisions()) + { + if (oData.desktopNotifications()) + { + oData.desktopNotifications.valueHasMutated(); + } + else + { + oData.desktopNotifications(true); + } + } + else + { + if (oData.desktopNotifications()) + { + oData.desktopNotifications(false); + } + else + { + oData.desktopNotifications.valueHasMutated(); + } + } + }); + } + else + { + oData.desktopNotifications(false); + } + } + else + { + oData.desktopNotifications(false); + } + } + }); + + oData.language = ko.observable(''); + oData.languages = ko.observableArray([]); + + oData.mainLanguage = ko.computed({ + 'read': oData.language, + 'write': function (sValue) { + if (sValue !== oData.language()) + { + if (-1 < Utils.inArray(sValue, oData.languages())) + { + oData.language(sValue); + } + else if (0 < oData.languages().length) + { + oData.language(oData.languages()[0]); + } + } + else + { + oData.language.valueHasMutated(); + } + } + }); + + oData.theme = ko.observable(''); + oData.themes = ko.observableArray([]); + + oData.mainTheme = ko.computed({ + 'read': oData.theme, + 'write': function (sValue) { + if (sValue !== oData.theme()) + { + var aThemes = oData.themes(); + if (-1 < Utils.inArray(sValue, aThemes)) + { + oData.theme(sValue); + } + else if (0 < aThemes.length) + { + oData.theme(aThemes[0]); + } + } + else + { + oData.theme.valueHasMutated(); + } + } + }); + + oData.allowCustomTheme = ko.observable(false); + oData.allowAdditionalAccounts = ko.observable(false); + oData.allowIdentities = ko.observable(false); + oData.determineUserLanguage = ko.observable(false); + + oData.messagesPerPage = ko.observable(Consts.Defaults.MessagesPerPage);//.extend({'throttle': 200}); + + oData.mainMessagesPerPage = oData.messagesPerPage; + oData.mainMessagesPerPage = ko.computed({ + 'read': oData.messagesPerPage, + 'write': function (iValue) { + if (-1 < Utils.inArray(Utils.pInt(iValue), Consts.Defaults.MessagesPerPageArray)) + { + if (iValue !== oData.messagesPerPage()) + { + oData.messagesPerPage(iValue); + } + } + else + { + oData.messagesPerPage.valueHasMutated(); + } + } + }); + + oData.facebookEnable = ko.observable(false); + oData.facebookAppID = ko.observable(''); + oData.facebookAppSecret = ko.observable(''); + + oData.twitterEnable = ko.observable(false); + oData.twitterConsumerKey = ko.observable(''); + oData.twitterConsumerSecret = ko.observable(''); + + oData.googleEnable = ko.observable(false); + oData.googleClientID = ko.observable(''); + oData.googleClientSecret = ko.observable(''); + + oData.dropboxEnable = ko.observable(false); + oData.dropboxApiKey = ko.observable(''); + + oData.contactsIsSupported = ko.observable(false); + oData.contactsIsAllowed = ko.observable(false); +}; + +/** + * @param {{moment:Function}} oObject + */ +Utils.createMomentDate = function (oObject) +{ + return ko.computed(function () { + Globals.minuteTick(); + return this.moment().fromNow(); + }, oObject); +}; + +/** + * @param {{moment:Function, momentDate:Function}} oObject + */ +Utils.createMomentShortDate = function (oObject) +{ + return ko.computed(function () { + var + sResult = '', + oMomentNow = moment(), + oMoment = this.moment(), + sMomentDate = this.momentDate() + ; + + if (4 >= oMomentNow.diff(oMoment, 'hours')) + { + sResult = sMomentDate; + } + else if (oMomentNow.format('L') === oMoment.format('L')) + { + sResult = Utils.i18n('MESSAGE_LIST/TODAY_AT', { + 'TIME': oMoment.format('LT') + }); + } + else if (oMomentNow.clone().subtract('days', 1).format('L') === oMoment.format('L')) + { + sResult = Utils.i18n('MESSAGE_LIST/YESTERDAY_IN', { + 'TIME': oMoment.format('LT') + }); + } + + else if (oMomentNow.year() === oMoment.year()) + { + sResult = oMoment.format('D MMM.'); + } + else + { + sResult = oMoment.format('LL'); + } + + return sResult; + + }, oObject); +}; + +/** + * @param {string} sFullNameHash + * @return {boolean} + */ +Utils.isFolderExpanded = function (sFullNameHash) +{ + var aExpandedList = /** @type {Array|null} */ RL.local().get(Enums.ClientSideKeyName.ExpandedFolders); + return _.isArray(aExpandedList) && -1 !== _.indexOf(aExpandedList, sFullNameHash); +}; + +/** + * @param {string} sFullNameHash + * @param {boolean} bExpanded + */ +Utils.setExpandedFolder = function (sFullNameHash, bExpanded) +{ + var aExpandedList = /** @type {Array|null} */ RL.local().get(Enums.ClientSideKeyName.ExpandedFolders); + if (!_.isArray(aExpandedList)) + { + aExpandedList = []; + } + + if (bExpanded) + { + aExpandedList.push(sFullNameHash); + aExpandedList = _.uniq(aExpandedList); + } + else + { + aExpandedList = _.without(aExpandedList, sFullNameHash); + } + + RL.local().set(Enums.ClientSideKeyName.ExpandedFolders, aExpandedList); +}; + +Utils.initLayoutResizer = function (sLeft, sRight, sParent/*, koSwither*/, + iLimitL, iMaxL, iDefL, iLimitR, sClientSideKeyName) +{ + iLimitL = iLimitL || 300; + iMaxL = iMaxL || 500; + iDefL = iDefL || (iMaxL - iLimitL / 2); + iLimitR = iLimitR || 300; + + var + iTemp = 0, + oLeft = $(sLeft), + oRight = $(sRight), + oParent = $(sParent), + iLeftWidth = RL.local().get(sClientSideKeyName) || iDefL, + fFunction = function (oEvent, oObject, bForce) { + + if (oObject || bForce) + { + var + iWidth = oParent.width(), + iProc = oObject ? oObject.size.width / iWidth * 100 : null + ; + + if (null === iProc && bForce) + { + iProc = oLeft.width() / iWidth * 100; + } + + if (null !== iProc) + { + oLeft.css({ + 'width': '', + 'height': '', + 'right': '' + (100 - iProc) + '%' + }); + + oRight.css({ + 'width': '', + 'height': '', + 'left': '' + iProc + '%' + }); + } + } + }, + fResiseFunction = function (oEvent, oObject) + { + if (/*koSwither && koSwither() && */oObject && oObject.element && + oObject.element[0]['id'] && '#' + oObject.element[0]['id'] === '' + sLeft) + { + var iWidth = oParent.width(); + iTemp = iWidth - iLimitR; + iTemp = iMaxL > iTemp ? iTemp : iMaxL; + oLeft.resizable('option', 'maxWidth', iTemp); + if (oObject.size && oObject.size.width) + { + RL.local().set(sClientSideKeyName, oObject.size.width); + } + + fFunction(null, null, true); + } + } + ; + + if (iLeftWidth) + { + oLeft.width(iLeftWidth); + } + + iTemp = oParent.width() - iLimitR; + iTemp = iMaxL > iTemp ? iTemp : iMaxL; + + oLeft.resizable({ + 'minWidth': iLimitL, + 'maxWidth': iTemp, + 'handles': 'e', + 'resize': fFunction, + 'stop': fFunction + }); + + fFunction(null, null, true); + $window.resize(_.throttle(fResiseFunction, 400)); +}; + +/** + * @param {Object} oMessageTextBody + */ +Utils.initBlockquoteSwitcher = function (oMessageTextBody) +{ + if (oMessageTextBody) + { + var $oList = $('blockquote:not(.rl-bq-switcher)', oMessageTextBody).filter(function () { + return 0 === $(this).parent().closest('blockquote', oMessageTextBody).length; + }); + + if ($oList && 0 < $oList.length) + { + $oList.each(function () { + var $self = $(this), iH = $self.height(); + if (0 === iH || 100 < iH) + { + $self.addClass('rl-bq-switcher hidden-bq'); + $('') + .insertBefore($self) + .click(function () { + $self.toggleClass('hidden-bq'); + Utils.windowResize(); + }) + .after('
') + .before('
') + ; + } + }); + } + } +}; + +/** + * @param {Object} oMessageTextBody + */ +Utils.removeBlockquoteSwitcher = function (oMessageTextBody) +{ + if (oMessageTextBody) + { + $(oMessageTextBody).find('blockquote.rl-bq-switcher').each(function () { + $(this).removeClass('rl-bq-switcher hidden-bq'); + }); + + $(oMessageTextBody).find('.rlBlockquoteSwitcher').each(function () { + $(this).remove(); + }); + } +}; + +/** + * @param {string} sName + * @param {Function} ViewModelClass + */ +Utils.extendAsViewModel = function (sName, ViewModelClass) +{ + if (ViewModelClass) + { + ViewModelClass.__name = sName; + Plugins.regViewModelHook(sName, ViewModelClass); + _.extend(ViewModelClass.prototype, KnoinAbstractViewModel.prototype); + } +}; + +/** + * @param {Function} SettingsViewModelClass + * @param {string} sLabelName + * @param {string} sTemplate + * @param {string} sRoute + * @param {boolean=} bDefault + */ +Utils.addSettingsViewModel = function (SettingsViewModelClass, sTemplate, sLabelName, sRoute, bDefault) +{ + SettingsViewModelClass.__rlSettingsData = { + 'Label': sLabelName, + 'Template': sTemplate, + 'Route': sRoute, + 'IsDefault': !!bDefault + }; + + ViewModels['settings'].push(SettingsViewModelClass); +}; + +/** + * @param {Function} SettingsViewModelClass + */ +Utils.removeSettingsViewModel = function (SettingsViewModelClass) +{ + ViewModels['settings-removed'].push(SettingsViewModelClass); +}; + +/** + * @param {Function} SettingsViewModelClass + */ +Utils.disableSettingsViewModel = function (SettingsViewModelClass) +{ + ViewModels['settings-disabled'].push(SettingsViewModelClass); +}; + +Utils.convertThemeName = function (sTheme) +{ + return Utils.trim(sTheme.replace(/[^a-zA-Z]/g, ' ').replace(/([A-Z])/g, ' $1').replace(/[\s]+/g, ' ')); +}; + +/** + * @param {string} sName + * @return {string} + */ +Utils.quoteName = function (sName) +{ + return sName.replace(/["]/g, '\\"'); +}; + +/** + * @return {number} + */ +Utils.microtime = function () +{ + return (new Date()).getTime(); +}; + +/** + * + * @param {string} sLanguage + * @return {string} + */ +Utils.convertLangName = function (sLanguage) +{ + return Utils.i18n('LANGS_NAMES/LANG_' + sLanguage.toUpperCase().replace(/[^a-zA-Z0-9]+/, '_'), null, sLanguage); +}; + +/** + * @param {number=} iLen + * @return {string} + */ +Utils.fakeMd5 = function(iLen) +{ + var + sResult = '', + sLine = '0123456789abcdefghijklmnopqrstuvwxyz' + ; + + iLen = Utils.isUnd(iLen) ? 32 : Utils.pInt(iLen); + + while (sResult.length < iLen) + { + sResult += sLine.substr(window.Math.round(window.Math.random() * sLine.length), 1); + } + + return sResult; +}; + +Utils.convertPlainTextToHtml = function (sPlain) +{ + return sPlain.toString() + .replace(/&/g, '&').replace(/>/g, '>').replace(/'); +}; + +Utils.draggeblePlace = function () +{ + return $('
 
').appendTo('#rl-hidden'); +}; + +Utils.defautOptionsAfterRender = function (oOption, oItem) +{ + if (oItem && !Utils.isUnd(oItem.disable)) + { + ko.applyBindingsToNode(oOption, { + 'disable': oItem.disable + }, oItem); + } +}; + +/** + * @param {Object} oViewModel + * @param {string} sTemplateID + * @param {string} sTitle + * @param {Function=} fCallback + */ +Utils.windowPopupKnockout = function (oViewModel, sTemplateID, sTitle, fCallback) +{ + var + oScript = null, + oWin = window.open(''), + sFunc = '__OpenerApplyBindingsUid' + Utils.fakeMd5() + '__', + oTemplate = $('#' + sTemplateID) + ; + + window[sFunc] = function () { + + if (oWin && oWin.document.body && oTemplate && oTemplate[0]) + { + var oBody = $(oWin.document.body); + + $('#rl-content', oBody).html(oTemplate.html()); + $('html', oWin.document).addClass('external ' + $('html').attr('class')); + + Utils.i18nToNode(oBody); + + Knoin.prototype.applyExternal(oViewModel, $('#rl-content', oBody)[0]); + + window[sFunc] = null; + + fCallback(oWin); + } + }; + + oWin.document.open(); + oWin.document.write('' + +'' + +'' + +'' + +'' + +'' + +'' + Utils.encodeHtml(sTitle) + '' + +'
'); + oWin.document.close(); + + oScript = oWin.document.createElement('script'); + oScript.type = 'text/javascript'; + oScript.innerHTML = 'if(window&&window.opener&&window.opener[\'' + sFunc + '\']){window.opener[\'' + sFunc + '\']();window.opener[\'' + sFunc + '\']=null}'; + oWin.document.getElementsByTagName('head')[0].appendChild(oScript); +}; + +Utils.settingsSaveHelperFunction = function (fCallback, koTrigger, oContext, iTimer) +{ + oContext = oContext || null; + iTimer = Utils.isUnd(iTimer) ? 1000 : Utils.pInt(iTimer); + return function (sType, mData, bCached, sRequestAction, oRequestParameters) { + koTrigger.call(oContext, mData && mData['Result'] ? Enums.SaveSettingsStep.TrueResult : Enums.SaveSettingsStep.FalseResult); + if (fCallback) + { + fCallback.call(oContext, sType, mData, bCached, sRequestAction, oRequestParameters); + } + _.delay(function () { + koTrigger.call(oContext, Enums.SaveSettingsStep.Idle); + }, iTimer); + }; +}; + +Utils.settingsSaveHelperSimpleFunction = function (koTrigger, oContext) +{ + return Utils.settingsSaveHelperFunction(null, koTrigger, oContext, 1000); +}; + +Utils.resizeAndCrop = function (sUrl, iValue, fCallback) +{ + var oTempImg = new Image(); + oTempImg.onload = function() { + + var + aDiff = [0, 0], + oCanvas = document.createElement('canvas'), + oCtx = oCanvas.getContext('2d') + ; + + oCanvas.width = iValue; + oCanvas.height = iValue; + + if (this.width > this.height) + { + aDiff = [this.width - this.height, 0]; + } + else + { + aDiff = [0, this.height - this.width]; + } + + oCtx.fillStyle = '#fff'; + oCtx.fillRect(0, 0, iValue, iValue); + oCtx.drawImage(this, aDiff[0] / 2, aDiff[1] / 2, this.width - aDiff[0], this.height - aDiff[1], 0, 0, iValue, iValue); + + fCallback(oCanvas.toDataURL('image/jpeg')); + }; + + oTempImg.src = sUrl; +}; diff --git a/dev/Common/_Begin.js b/dev/Common/_Begin.js new file mode 100644 index 000000000..7ec597282 --- /dev/null +++ b/dev/Common/_Begin.js @@ -0,0 +1,71 @@ + +'use strict'; + +var + /** + * @type {Object} + */ + Consts = {}, + + /** + * @type {Object} + */ + Enums = {}, + + /** + * @type {Object} + */ + NotificationI18N = {}, + + /** + * @type {Object.} + */ + Utils = {}, + + /** + * @type {Object.} + */ + Plugins = {}, + + /** + * @type {Object.} + */ + Base64 = {}, + + /** + * @type {Object} + */ + Globals = {}, + + /** + * @type {Object} + */ + ViewModels = { + 'settings': [], + 'settings-removed': [], + 'settings-disabled': [] + }, + + /** + * @type {*} + */ + kn = null, + + /** + * @type {Object} + */ + AppData = window['rainloopAppData'] || {}, + + /** + * @type {Object} + */ + I18n = window['rainloopI18N'] || {}, + + $html = $('html'), + + $window = $(window), + + $document = $(window.document), + + NotificationClass = window.Notification && window.Notification.requestPermission ? window.Notification : null +; \ No newline at end of file diff --git a/dev/Common/_BeginA.js b/dev/Common/_BeginA.js new file mode 100644 index 000000000..69d8350bf --- /dev/null +++ b/dev/Common/_BeginA.js @@ -0,0 +1,6 @@ +/*jshint onevar: false*/ +/** + * @type {?AdminApp} + */ +var RL = null; +/*jshint onevar: true*/ diff --git a/dev/Common/_BeginW.js b/dev/Common/_BeginW.js new file mode 100644 index 000000000..b4b00eeaa --- /dev/null +++ b/dev/Common/_BeginW.js @@ -0,0 +1,6 @@ +/*jshint onevar: false*/ +/** + * @type {?RainLoopApp} + */ +var RL = null; +/*jshint onevar: true*/ diff --git a/dev/Common/_BootEnd.js b/dev/Common/_BootEnd.js new file mode 100644 index 000000000..d75189860 --- /dev/null +++ b/dev/Common/_BootEnd.js @@ -0,0 +1,3 @@ +if (window.SimplePace) { + window.SimplePace.add(10); +} \ No newline at end of file diff --git a/dev/Common/_CoreEnd.js b/dev/Common/_CoreEnd.js new file mode 100644 index 000000000..d75189860 --- /dev/null +++ b/dev/Common/_CoreEnd.js @@ -0,0 +1,3 @@ +if (window.SimplePace) { + window.SimplePace.add(10); +} \ No newline at end of file diff --git a/dev/Common/_End.js b/dev/Common/_End.js new file mode 100644 index 000000000..dd63ed39d --- /dev/null +++ b/dev/Common/_End.js @@ -0,0 +1,57 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +$html.addClass(Globals.bMobileDevice ? 'mobile' : 'no-mobile'); + +$window.keydown(Utils.killCtrlAandS).keyup(Utils.killCtrlAandS); +$window.unload(function () { + Globals.bUnload = true; +}); + +// export +window.rl = window.rl || {}; +window.rl.addHook = Plugins.addHook; +window.rl.settingsGet = Plugins.mainSettingsGet; +window.rl.remoteRequest = Plugins.remoteRequest; +window.rl.pluginSettingsGet = Plugins.settingsGet; +window.rl.addSettingsViewModel = Utils.addSettingsViewModel; +window.rl.createCommand = Utils.createCommand; + +window.rl.EmailModel = EmailModel; +window.rl.Enums = Enums; + +window['__RLBOOT'] = function (fCall) { + + // boot + $(function () { + + if (window['rainloopTEMPLATES'] && window['rainloopTEMPLATES'][0]) + { + $('#rl-templates').html(window['rainloopTEMPLATES'][0]); + + window.setInterval(function () { + Globals.minuteTick(!Globals.minuteTick()); + }, 1000 * 60); + + window.setInterval(function () { + Globals.fiveMinuteTick(!Globals.fiveMinuteTick()); + }, 1000 * 60 * 5); + + _.delay(function () { + window['rainloopAppData'] = {}; + window['rainloopI18N'] = {}; + window['rainloopTEMPLATES'] = {}; + + kn.setBoot(RL).bootstart(); + + $html.addClass('rl-started'); + + }, 50); + } + else + { + fCall(false); + } + + window['__RLBOOT'] = null; + }); +}; diff --git a/dev/Common/_LibsEnd.js b/dev/Common/_LibsEnd.js new file mode 100644 index 000000000..bac9923b7 --- /dev/null +++ b/dev/Common/_LibsEnd.js @@ -0,0 +1,3 @@ +if (window.SimplePace) { + window.SimplePace.add(20); +} diff --git a/dev/Knoin/AbstractBoot.js b/dev/Knoin/AbstractBoot.js new file mode 100644 index 000000000..274e5690d --- /dev/null +++ b/dev/Knoin/AbstractBoot.js @@ -0,0 +1,14 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function KnoinAbstractBoot() +{ + +} + +KnoinAbstractBoot.prototype.bootstart = function () +{ + +}; diff --git a/dev/Knoin/AbstractScreen.js b/dev/Knoin/AbstractScreen.js new file mode 100644 index 000000000..27270ba47 --- /dev/null +++ b/dev/Knoin/AbstractScreen.js @@ -0,0 +1,77 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @param {string} sScreenName + * @param {?=} aViewModels = [] + * @constructor + */ +function KnoinAbstractScreen(sScreenName, aViewModels) +{ + this.sScreenName = sScreenName; + this.aViewModels = Utils.isArray(aViewModels) ? aViewModels : []; +} + +/** + * @type {Array} + */ +KnoinAbstractScreen.prototype.oCross = null; + +/** + * @type {string} + */ +KnoinAbstractScreen.prototype.sScreenName = ''; + +/** + * @type {Array} + */ +KnoinAbstractScreen.prototype.aViewModels = []; + +/** + * @return {Array} + */ +KnoinAbstractScreen.prototype.viewModels = function () +{ + return this.aViewModels; +}; + +/** + * @return {string} + */ +KnoinAbstractScreen.prototype.screenName = function () +{ + return this.sScreenName; +}; + +KnoinAbstractScreen.prototype.routes = function () +{ + return null; +}; + +/** + * @return {?Object} + */ +KnoinAbstractScreen.prototype.__cross = function () +{ + return this.oCross; +}; + +KnoinAbstractScreen.prototype.__start = function () +{ + var + aRoutes = this.routes(), + oRoute = null, + fMatcher = null + ; + + if (Utils.isNonEmptyArray(aRoutes)) + { + fMatcher = _.bind(this.onRoute || Utils.emptyFunction, this); + oRoute = crossroads.create(); + + _.each(aRoutes, function (aItem) { + oRoute.addRoute(aItem[0], fMatcher).rules = aItem[1]; + }); + + this.oCross = oRoute; + } +}; diff --git a/dev/Knoin/AbstractViewModel.js b/dev/Knoin/AbstractViewModel.js new file mode 100644 index 000000000..b1218b00c --- /dev/null +++ b/dev/Knoin/AbstractViewModel.js @@ -0,0 +1,61 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @param {string=} sPosition = '' + * @param {string=} sTemplate = '' + * @constructor + */ +function KnoinAbstractViewModel(sPosition, sTemplate) +{ + this.sPosition = Utils.pString(sPosition); + this.sTemplate = Utils.pString(sTemplate); + + this.viewModelName = ''; + this.viewModelVisibility = ko.observable(false); + if ('Popups' === this.sPosition) + { + this.modalVisibility = ko.observable(false); + } + + this.viewModelDom = null; +} + +/** + * @type {string} + */ +KnoinAbstractViewModel.prototype.sPosition = ''; + +/** + * @type {string} + */ +KnoinAbstractViewModel.prototype.sTemplate = ''; + +/** + * @type {string} + */ +KnoinAbstractViewModel.prototype.viewModelName = ''; + +/** + * @type {?} + */ +KnoinAbstractViewModel.prototype.viewModelDom = null; + +/** + * @return {string} + */ +KnoinAbstractViewModel.prototype.viewModelTemplate = function () +{ + return this.sTemplate; +}; + +/** + * @return {string} + */ +KnoinAbstractViewModel.prototype.viewModelPosition = function () +{ + return this.sPosition; +}; + +KnoinAbstractViewModel.prototype.cancelCommand = KnoinAbstractViewModel.prototype.closeCommand = function () +{ +}; diff --git a/dev/Knoin/Knoin.js b/dev/Knoin/Knoin.js new file mode 100644 index 000000000..dde11224c --- /dev/null +++ b/dev/Knoin/Knoin.js @@ -0,0 +1,382 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function Knoin() +{ + this.sDefaultScreenName = ''; + this.oScreens = {}; + this.oBoot = null; + this.oCurrentScreen = null; + + this.popupVisibility = ko.observable(false); + + this.popupVisibility.subscribe(function (bValue) { + if (RL) + { + RL.popupVisibility(bValue); + } + }); +} + +Knoin.prototype.sDefaultScreenName = ''; +Knoin.prototype.oScreens = {}; +Knoin.prototype.oBoot = null; +Knoin.prototype.oCurrentScreen = null; + +Knoin.prototype.showLoading = function () +{ + $('#rl-loading').show(); +}; + +Knoin.prototype.hideLoading = function () +{ + $('#rl-loading').hide(); +}; + +Knoin.prototype.routeOff = function () +{ + hasher.changed.active = false; +}; + +Knoin.prototype.routeOn = function () +{ + hasher.changed.active = true; +}; + +/** + * @param {Object} oBoot + * @return {Knoin} + */ +Knoin.prototype.setBoot = function (oBoot) +{ + if (Utils.isNormal(oBoot)) + { + this.oBoot = oBoot; + } + + return this; +}; + +/** + * @param {string} sScreenName + * @return {?Object} + */ +Knoin.prototype.screen = function (sScreenName) +{ + return ('' !== sScreenName && !Utils.isUnd(this.oScreens[sScreenName])) ? this.oScreens[sScreenName] : null; +}; + +/** + * @param {?} oViewModel + * @param {string} sDelegateName + * @param {Array=} aParameters + */ +Knoin.prototype.delegateRun = function (oViewModel, sDelegateName, aParameters) +{ + if (oViewModel && oViewModel[sDelegateName]) + { + oViewModel[sDelegateName].apply(oViewModel, Utils.isArray(aParameters) ? aParameters : []); + } +}; + +/** + * @param {Function} ViewModelClass + * @param {Object=} oScreen + */ +Knoin.prototype.buildViewModel = function (ViewModelClass, oScreen) +{ + if (ViewModelClass && !ViewModelClass.__builded) + { + var + oViewModel = new ViewModelClass(oScreen), + sPosition = oViewModel.viewModelPosition(), + oViewModelPlace = $('#rl-content #rl-' + sPosition.toLowerCase()), + oViewModelDom = null + ; + + ViewModelClass.__builded = true; + ViewModelClass.__vm = oViewModel; + oViewModel.data = RL.data(); + + oViewModel.viewModelName = ViewModelClass.__name; + + if (oViewModelPlace && 1 === oViewModelPlace.length) + { + oViewModelDom = $('
').addClass('rl-view-model').addClass('RL-' + oViewModel.viewModelTemplate()).hide().attr('data-bind', + 'template: {name: "' + oViewModel.viewModelTemplate() + '"}, i18nInit: true'); + + oViewModelDom.appendTo(oViewModelPlace); + oViewModel.viewModelDom = oViewModelDom; + ViewModelClass.__dom = oViewModelDom; + + if ('Popups' === sPosition) + { + oViewModel.cancelCommand = oViewModel.closeCommand = Utils.createCommand(oViewModel, function () { + kn.hideScreenPopup(ViewModelClass); + }); + } + + Plugins.runHook('view-model-pre-build', [ViewModelClass.__name, oViewModel, oViewModelDom]); + + ko.applyBindings(oViewModel, oViewModelDom[0]); + this.delegateRun(oViewModel, 'onBuild', [oViewModelDom]); + + Plugins.runHook('view-model-post-build', [ViewModelClass.__name, oViewModel, oViewModelDom]); + } + else + { + Utils.log('Cannot find view model position: ' + sPosition); + } + } + + return ViewModelClass ? ViewModelClass.__vm : null; +}; + +/** + * @param {Object} oViewModel + * @param {Object} oViewModelDom + */ +Knoin.prototype.applyExternal = function (oViewModel, oViewModelDom) +{ + if (oViewModel && oViewModelDom) + { + ko.applyBindings(oViewModel, oViewModelDom); + } +}; + +/** + * @param {Function} ViewModelClassToHide + */ +Knoin.prototype.hideScreenPopup = function (ViewModelClassToHide) +{ + if (ViewModelClassToHide && ViewModelClassToHide.__vm && ViewModelClassToHide.__dom) + { + ViewModelClassToHide.__dom.hide(); + ViewModelClassToHide.__vm.modalVisibility(false); + this.delegateRun(ViewModelClassToHide.__vm, 'onHide'); + this.popupVisibility(false); + + _.defer(function () { + ViewModelClassToHide.__dom.find('.ko-select2').select2('close'); + }); + } +}; + +/** + * @param {Function} ViewModelClassToShow + * @param {Array=} aParameters + */ +Knoin.prototype.showScreenPopup = function (ViewModelClassToShow, aParameters) +{ + if (ViewModelClassToShow) + { + this.buildViewModel(ViewModelClassToShow); + + if (ViewModelClassToShow.__vm && ViewModelClassToShow.__dom) + { + ViewModelClassToShow.__dom.show(); + ViewModelClassToShow.__vm.modalVisibility(true); + this.delegateRun(ViewModelClassToShow.__vm, 'onShow', aParameters || []); + this.popupVisibility(true); + + Plugins.runHook('view-model-on-show', [ViewModelClassToShow.__name, ViewModelClassToShow.__vm, aParameters || []]); + } + } +}; + +/** + * @param {string} sScreenName + * @param {string} sSubPart + */ +Knoin.prototype.screenOnRoute = function (sScreenName, sSubPart) +{ + var + self = this, + oScreen = null, + oCross = null + ; + + if ('' === Utils.pString(sScreenName)) + { + sScreenName = this.sDefaultScreenName; + } + + if ('' !== sScreenName) + { + oScreen = this.screen(sScreenName); + if (!oScreen) + { + oScreen = this.screen(this.sDefaultScreenName); + if (oScreen) + { + sSubPart = sScreenName + '/' + sSubPart; + sScreenName = this.sDefaultScreenName; + } + } + + if (oScreen && oScreen.__started) + { + if (!oScreen.__builded) + { + oScreen.__builded = true; + + if (Utils.isNonEmptyArray(oScreen.viewModels())) + { + _.each(oScreen.viewModels(), function (ViewModelClass) { + this.buildViewModel(ViewModelClass, oScreen); + }, this); + } + + this.delegateRun(oScreen, 'onBuild'); + } + + _.defer(function () { + + // hide screen + if (self.oCurrentScreen) + { + self.delegateRun(self.oCurrentScreen, 'onHide'); + + if (Utils.isNonEmptyArray(self.oCurrentScreen.viewModels())) + { + _.each(self.oCurrentScreen.viewModels(), function (ViewModelClass) { + + if (ViewModelClass.__vm && ViewModelClass.__dom && + 'Popups' !== ViewModelClass.__vm.viewModelPosition()) + { + ViewModelClass.__dom.hide(); + ViewModelClass.__vm.viewModelVisibility(false); + self.delegateRun(ViewModelClass.__vm, 'onHide'); + } + + }); + } + } + // -- + + self.oCurrentScreen = oScreen; + + // show screen + if (self.oCurrentScreen) + { + + self.delegateRun(self.oCurrentScreen, 'onShow'); + + Plugins.runHook('screen-on-show', [self.oCurrentScreen.screenName(), self.oCurrentScreen]); + + if (Utils.isNonEmptyArray(self.oCurrentScreen.viewModels())) + { + _.each(self.oCurrentScreen.viewModels(), function (ViewModelClass) { + + if (ViewModelClass.__vm && ViewModelClass.__dom && + 'Popups' !== ViewModelClass.__vm.viewModelPosition()) + { + ViewModelClass.__dom.show(); + ViewModelClass.__vm.viewModelVisibility(true); + self.delegateRun(ViewModelClass.__vm, 'onShow'); + + Plugins.runHook('view-model-on-show', [ViewModelClass.__name, ViewModelClass.__vm]); + } + + }, self); + } + } + // -- + + oCross = oScreen.__cross(); + if (oCross) + { + oCross.parse(sSubPart); + } + }); + } + } +}; + +/** + * @param {Array} aScreensClasses + */ +Knoin.prototype.startScreens = function (aScreensClasses) +{ + _.each(aScreensClasses, function (CScreen) { + + var + oScreen = new CScreen(), + sScreenName = oScreen ? oScreen.screenName() : '' + ; + + if (oScreen && '' !== sScreenName) + { + if ('' === this.sDefaultScreenName) + { + this.sDefaultScreenName = sScreenName; + } + + this.oScreens[sScreenName] = oScreen; + } + + }, this); + + + _.each(this.oScreens, function (oScreen) { + if (oScreen && !oScreen.__started && oScreen.__start) + { + oScreen.__started = true; + oScreen.__start(); + + Plugins.runHook('screen-pre-start', [oScreen.screenName(), oScreen]); + this.delegateRun(oScreen, 'onStart'); + Plugins.runHook('screen-post-start', [oScreen.screenName(), oScreen]); + } + }, this); + + var oCross = crossroads.create(); + oCross.addRoute(/^([a-zA-Z0-9\-]*)\/?(.*)$/, _.bind(this.screenOnRoute, this)); + + hasher.initialized.add(oCross.parse, oCross); + hasher.changed.add(oCross.parse, oCross); + hasher.init(); +}; + +/** + * @param {string} sHash + * @param {boolean=} bSilence = false + * @param {boolean=} bReplace = false + */ +Knoin.prototype.setHash = function (sHash, bSilence, bReplace) +{ + sHash = '#' === sHash.substr(0, 1) ? sHash.substr(1) : sHash; + sHash = '/' === sHash.substr(0, 1) ? sHash.substr(1) : sHash; + + bReplace = Utils.isUnd(bReplace) ? false : !!bReplace; + + if (Utils.isUnd(bSilence) ? false : !!bSilence) + { + hasher.changed.active = false; + hasher[bReplace ? 'replaceHash' : 'setHash'](sHash); + hasher.changed.active = true; + } + else + { + hasher.changed.active = true; + hasher[bReplace ? 'replaceHash' : 'setHash'](sHash); + hasher.setHash(sHash); + } +}; + +/** + * @return {Knoin} + */ +Knoin.prototype.bootstart = function () +{ + if (this.oBoot && this.oBoot.bootstart) + { + this.oBoot.bootstart(); + } + + return this; +}; + +kn = new Knoin(); diff --git a/dev/Models/AccountModel.js b/dev/Models/AccountModel.js new file mode 100644 index 000000000..48f70a913 --- /dev/null +++ b/dev/Models/AccountModel.js @@ -0,0 +1,23 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @param {string} sEmail + * @param {boolean=} bCanBeDelete = true + * @constructor + */ +function AccountModel(sEmail, bCanBeDelete) +{ + this.email = sEmail; + this.deleteAccess = ko.observable(false); + this.canBeDalete = ko.observable(bCanBeDelete); +} + +AccountModel.prototype.email = ''; + +/** + * @return {string} + */ +AccountModel.prototype.changeAccountLink = function () +{ + return RL.link().change(this.email); +}; \ No newline at end of file diff --git a/dev/Models/AttachmentModel.js b/dev/Models/AttachmentModel.js new file mode 100644 index 000000000..ae4d48404 --- /dev/null +++ b/dev/Models/AttachmentModel.js @@ -0,0 +1,228 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function AttachmentModel() +{ + this.mimeType = ''; + this.fileName = ''; + this.estimatedSize = 0; + this.friendlySize = ''; + this.isInline = false; + this.isLinked = false; + this.cid = ''; + this.cidWithOutTags = ''; + this.contentLocation = ''; + this.download = ''; + this.folder = ''; + this.uid = ''; + this.mimeIndex = ''; +} + +/** + * @static + * @param {AjaxJsonAttachment} oJsonAttachment + * @return {?AttachmentModel} + */ +AttachmentModel.newInstanceFromJson = function (oJsonAttachment) +{ + var oAttachmentModel = new AttachmentModel(); + return oAttachmentModel.initByJson(oJsonAttachment) ? oAttachmentModel : null; +}; + +AttachmentModel.prototype.mimeType = ''; +AttachmentModel.prototype.fileName = ''; +AttachmentModel.prototype.estimatedSize = 0; +AttachmentModel.prototype.friendlySize = ''; +AttachmentModel.prototype.isInline = false; +AttachmentModel.prototype.isLinked = false; +AttachmentModel.prototype.cid = ''; +AttachmentModel.prototype.cidWithOutTags = ''; +AttachmentModel.prototype.contentLocation = ''; +AttachmentModel.prototype.download = ''; +AttachmentModel.prototype.folder = ''; +AttachmentModel.prototype.uid = ''; +AttachmentModel.prototype.mimeIndex = ''; + +/** + * @param {AjaxJsonAttachment} oJsonAttachment + */ +AttachmentModel.prototype.initByJson = function (oJsonAttachment) +{ + var bResult = false; + if (oJsonAttachment && 'Object/Attachment' === oJsonAttachment['@Object']) + { + this.mimeType = oJsonAttachment.MimeType; + this.fileName = oJsonAttachment.FileName; + this.estimatedSize = Utils.pInt(oJsonAttachment.EstimatedSize); + this.isInline = !!oJsonAttachment.IsInline; + this.isLinked = !!oJsonAttachment.IsLinked; + this.cid = oJsonAttachment.CID; + this.contentLocation = oJsonAttachment.ContentLocation; + this.download = oJsonAttachment.Download; + + this.folder = oJsonAttachment.Folder; + this.uid = oJsonAttachment.Uid; + this.mimeIndex = oJsonAttachment.MimeIndex; + + this.friendlySize = Utils.friendlySize(this.estimatedSize); + this.cidWithOutTags = this.cid.replace(/^<+/, '').replace(/>+$/, ''); + + bResult = true; + } + + return bResult; +}; + +/** + * @return {boolean} + */ +AttachmentModel.prototype.isImage = function () +{ + return -1 < Utils.inArray(this.mimeType.toLowerCase(), + ['image/png', 'image/jpg', 'image/jpeg', 'image/gif'] + ); +}; + +/** + * @return {boolean} + */ +AttachmentModel.prototype.isText = function () +{ + return 'text/' === this.mimeType.substr(0, 5); +}; + +/** + * @return {string} + */ +AttachmentModel.prototype.linkDownload = function () +{ + return RL.link().attachmentDownload(this.download); +}; + +/** + * @return {string} + */ +AttachmentModel.prototype.linkPreview = function () +{ + return RL.link().attachmentPreview(this.download); +}; + +/** + * @return {string} + */ +AttachmentModel.prototype.linkPreviewAsPlain = function () +{ + return RL.link().attachmentPreviewAsPlain(this.download); +}; + +/** + * @return {string} + */ +AttachmentModel.prototype.generateTransferDownloadUrl = function () +{ + var sLink = this.linkDownload(); + if ('http' !== sLink.substr(0, 4)) + { + sLink = window.location.protocol + '//' + window.location.host + window.location.pathname + sLink; + } + + return this.mimeType + ':' + this.fileName + ':' + sLink; +}; + +/** + * @param {AttachmentModel} oAttachment + * @param {*} oEvent + * @return {boolean} + */ +AttachmentModel.prototype.eventDragStart = function (oAttachment, oEvent) +{ + var oLocalEvent = oEvent.originalEvent || oEvent; + if (oAttachment && oLocalEvent && oLocalEvent.dataTransfer && oLocalEvent.dataTransfer.setData) + { + oLocalEvent.dataTransfer.setData('DownloadURL', this.generateTransferDownloadUrl()); + } + + return true; +}; + +AttachmentModel.prototype.iconClass = function () +{ + var + aParts = this.mimeType.toLocaleString().split('/'), + sClass = 'icon-file' + ; + + if (aParts && aParts[1]) + { + if ('image' === aParts[0]) + { + sClass = 'icon-image'; + } + else if ('text' === aParts[0]) + { + sClass = 'icon-file-xml'; + } + else if ('audio' === aParts[0]) + { + sClass = 'icon-music'; + } + else if ('video' === aParts[0]) + { + sClass = 'icon-film'; + } + else if (-1 < Utils.inArray(aParts[1], + ['zip', '7z', 'tar', 'rar', 'gzip', 'bzip', 'bzip2', 'x-zip', 'x-7z', 'x-rar', 'x-tar', 'x-gzip', 'x-bzip', 'x-bzip2', 'x-zip-compressed', 'x-7z-compressed', 'x-rar-compressed'])) + { + sClass = 'icon-file-zip'; + } + else if (-1 < Utils.inArray(aParts[1], + ['pdf', 'x-pdf'])) + { + sClass = 'icon-file-pdf'; + } + else if (-1 < Utils.inArray(aParts[1], [ + 'exe', 'x-exe', 'x-winexe', 'bat' + ])) + { + sClass = 'icon-console'; + } + else if (-1 < Utils.inArray(aParts[1], [ + 'rtf', 'msword', 'vnd.msword', 'vnd.openxmlformats-officedocument.wordprocessingml.document', + 'vnd.openxmlformats-officedocument.wordprocessingml.template', + 'vnd.ms-word.document.macroEnabled.12', + 'vnd.ms-word.template.macroEnabled.12' + ])) + { + sClass = 'icon-file-word'; + } + else if (-1 < Utils.inArray(aParts[1], [ + 'excel', 'ms-excel', 'vnd.ms-excel', + 'vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'vnd.openxmlformats-officedocument.spreadsheetml.template', + 'vnd.ms-excel.sheet.macroEnabled.12', + 'vnd.ms-excel.template.macroEnabled.12', + 'vnd.ms-excel.addin.macroEnabled.12', + 'vnd.ms-excel.sheet.binary.macroEnabled.12' + ])) + { + sClass = 'icon-file-excel'; + } + else if (-1 < Utils.inArray(aParts[1], [ + 'powerpoint', 'ms-powerpoint', 'vnd.ms-powerpoint', + 'vnd.openxmlformats-officedocument.presentationml.presentation', + 'vnd.openxmlformats-officedocument.presentationml.template', + 'vnd.openxmlformats-officedocument.presentationml.slideshow', + 'vnd.ms-powerpoint.addin.macroEnabled.12', + 'vnd.ms-powerpoint.presentation.macroEnabled.12', + 'vnd.ms-powerpoint.template.macroEnabled.12', + 'vnd.ms-powerpoint.slideshow.macroEnabled.12' + ])) + { + sClass = 'icon-file-powerpoint'; + } + } + + return sClass; +}; diff --git a/dev/Models/ComposeAttachmentModel.js b/dev/Models/ComposeAttachmentModel.js new file mode 100644 index 000000000..37dcdd96a --- /dev/null +++ b/dev/Models/ComposeAttachmentModel.js @@ -0,0 +1,63 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @param {string} sId + * @param {string} sFileName + * @param {?number=} nSize + * @param {boolean=} bInline + * @param {boolean=} bLinked + * @param {string=} sCID + * @param {string=} sContentLocation + */ +function ComposeAttachmentModel(sId, sFileName, nSize, bInline, bLinked, sCID, sContentLocation) +{ + this.id = sId; + this.isInline = Utils.isUnd(bInline) ? false : !!bInline; + this.isLinked = Utils.isUnd(bLinked) ? false : !!bLinked; + this.CID = Utils.isUnd(sCID) ? '' : sCID; + this.contentLocation = Utils.isUnd(sContentLocation) ? '' : sContentLocation; + this.fromMessage = false; + + this.fileName = ko.observable(sFileName); + this.size = ko.observable(Utils.isUnd(nSize) ? null : nSize); + this.tempName = ko.observable(''); + + this.progress = ko.observable(''); + this.error = ko.observable(''); + this.waiting = ko.observable(true); + this.uploading = ko.observable(false); + this.enabled = ko.observable(true); + + this.friendlySize = ko.computed(function () { + var mSize = this.size(); + return null === mSize ? '' : Utils.friendlySize(this.size()); + }, this); +} + +ComposeAttachmentModel.prototype.id = ''; +ComposeAttachmentModel.prototype.isInline = false; +ComposeAttachmentModel.prototype.isLinked = false; +ComposeAttachmentModel.prototype.CID = ''; +ComposeAttachmentModel.prototype.contentLocation = ''; +ComposeAttachmentModel.prototype.fromMessage = false; +ComposeAttachmentModel.prototype.cancel = Utils.emptyFunction; + +/** + * @param {AjaxJsonComposeAttachment} oJsonAttachment + */ +ComposeAttachmentModel.prototype.initByUploadJson = function (oJsonAttachment) +{ + var bResult = false; + if (oJsonAttachment) + { + this.fileName(oJsonAttachment.Name); + this.size(Utils.isUnd(oJsonAttachment.Size) ? 0 : Utils.pInt(oJsonAttachment.Size)); + this.tempName(Utils.isUnd(oJsonAttachment.TempName) ? '' : oJsonAttachment.TempName); + this.isInline = false; + + bResult = true; + } + + return bResult; +}; \ No newline at end of file diff --git a/dev/Models/ContactModel.js b/dev/Models/ContactModel.js new file mode 100644 index 000000000..e887b87ab --- /dev/null +++ b/dev/Models/ContactModel.js @@ -0,0 +1,73 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function ContactModel() +{ + this.idContact = 0; + this.imageHash = ''; + this.listName = ''; + this.name = ''; + this.emails = []; + + this.checked = ko.observable(false); + this.selected = ko.observable(false); + this.deleted = ko.observable(false); +} + +ContactModel.prototype.parse = function (oItem) +{ + var bResult = false; + if (oItem && 'Object/Contact' === oItem['@Object']) + { + this.idContact = Utils.pInt(oItem['IdContact']); + this.listName = Utils.pString(oItem['ListName']); + this.name = Utils.pString(oItem['Name']); + this.emails = Utils.isNonEmptyArray(oItem['Emails']) ? oItem['Emails'] : []; + this.imageHash = Utils.pString(oItem['ImageHash']); + + bResult = true; + } + + return bResult; +}; + +/** + * @return {string} + */ +ContactModel.prototype.srcAttr = function () +{ + return '' === this.imageHash ? RL.link().emptyContactPic() : + RL.link().getUserPicUrlFromHash(this.imageHash); +}; + +/** + * @return {string} + */ +ContactModel.prototype.generateUid = function () +{ + return '' + this.idContact; +}; + +/** + * @return string + */ +ContactModel.prototype.lineAsCcc = function () +{ + var aResult = []; + if (this.deleted()) + { + aResult.push('deleted'); + } + if (this.selected()) + { + aResult.push('selected'); + } + if (this.checked()) + { + aResult.push('checked'); + } + + return aResult.join(' '); +}; diff --git a/dev/Models/EmailModel.js b/dev/Models/EmailModel.js new file mode 100644 index 000000000..43d72bbb6 --- /dev/null +++ b/dev/Models/EmailModel.js @@ -0,0 +1,240 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @param {string=} sEmail + * @param {string=} sName + * + * @constructor + */ +function EmailModel(sEmail, sName) +{ + this.email = sEmail || ''; + this.name = sName || ''; + this.privateType = null; + + this.clearDuplicateName(); +} + +/** + * @static + * @param {AjaxJsonEmail} oJsonEmail + * @return {?EmailModel} + */ +EmailModel.newInstanceFromJson = function (oJsonEmail) +{ + var oEmailModel = new EmailModel(); + return oEmailModel.initByJson(oJsonEmail) ? oEmailModel : null; +}; + +/** + * @type {string} + */ +EmailModel.prototype.name = ''; + +/** + * @type {string} + */ +EmailModel.prototype.email = ''; + +/** + * @type {(number|null)} + */ +EmailModel.prototype.privateType = null; + +/** + * @returns {boolean} + */ +EmailModel.prototype.validate = function () +{ + return '' !== this.name || '' !== this.email; +}; + +/** + * @param {boolean} bWithoutName = false + * @return {string} + */ +EmailModel.prototype.hash = function (bWithoutName) +{ + return '#' + (bWithoutName ? '' : this.name) + '#' + this.email + '#'; +}; + +EmailModel.prototype.clearDuplicateName = function () +{ + if (this.name === this.email) + { + this.name = ''; + } +}; + +/** + * @return {number} + */ +EmailModel.prototype.type = function () +{ + if (null === this.privateType) + { + if (this.email && '@facebook.com' === this.email.substr(-13)) + { + this.privateType = Enums.EmailType.Facebook; + } + + if (null === this.privateType) + { + this.privateType = Enums.EmailType.Default; + } + } + + return this.privateType; +}; + +/** + * @param {string} sQuery + * @return {boolean} + */ +EmailModel.prototype.search = function (sQuery) +{ + return -1 < (this.name + ' ' + this.email).toLowerCase().indexOf(sQuery.toLowerCase()); +}; + +/** + * @param {string} sString + */ +EmailModel.prototype.parse = function (sString) +{ + sString = Utils.trim(sString); + + var + mRegex = /(?:"([^"]+)")? ?,]+)>?,? ?/g, + mMatch = mRegex.exec(sString) + ; + + if (mMatch) + { + this.name = mMatch[1] || ''; + this.email = mMatch[2] || ''; + + this.clearDuplicateName(); + } + else if ((/^[^@]+@[^@]+$/).test(sString)) + { + this.name = ''; + this.email = sString; + } +}; + +/** + * @param {AjaxJsonEmail} oJsonEmail + * @return {boolean} + */ +EmailModel.prototype.initByJson = function (oJsonEmail) +{ + var bResult = false; + if (oJsonEmail && 'Object/Email' === oJsonEmail['@Object']) + { + this.name = Utils.trim(oJsonEmail.Name); + this.email = Utils.trim(oJsonEmail.Email); + + bResult = '' !== this.email; + this.clearDuplicateName(); + } + + return bResult; +}; + +/** + * @param {boolean} bFriendlyView + * @param {boolean=} bWrapWithLink = false + * @return {string} + */ +EmailModel.prototype.toLine = function (bFriendlyView, bWrapWithLink) +{ + var sResult = ''; + if ('' !== this.email) + { + bWrapWithLink = Utils.isUnd(bWrapWithLink) ? false : !!bWrapWithLink; + if (bFriendlyView && '' !== this.name) + { + sResult = bWrapWithLink ? '') + + '" target="_blank" tabindex="-1">' + Utils.encodeHtml(this.name) + '' : this.name; + } + else + { + sResult = this.email; + if ('' !== this.name) + { + if (bWrapWithLink) + { + sResult = Utils.encodeHtml('"' + this.name + '" <') + + '') + '" target="_blank" tabindex="-1">' + Utils.encodeHtml(sResult) + '' + Utils.encodeHtml('>'); + } + else + { + sResult = '"' + this.name + '" <' + sResult + '>'; + } + } + else if (bWrapWithLink) + { + sResult = '' + Utils.encodeHtml(this.email) + ''; + } + } + } + + return sResult; +}; + +/** + * @return {string} + */ +EmailModel.prototype.select2Result = function () +{ + var + sResult = '', + sImg = RL.cache().getUserPic(this.email) + ; + + if ('' !== sImg) + { + sResult += ''; + } + else + { + sResult += ''; + } + + if (Enums.EmailType.Facebook === this.type()) + { + sResult += '' + (0 < this.name.length ? this.name : this.email); + sResult += ''; + } + else + { + sResult += '' + (0 < this.name.length ? this.email + ' (' + this.name + ')' : this.email); + } + + return sResult + ''; +}; + +/** + * @param {Object} oContainer + * @return {string|null} + */ +EmailModel.prototype.select2Selection = function (oContainer) +{ + var sResult = ''; + if (Enums.EmailType.Facebook === this.type()) + { + sResult = 0 < this.name.length ? this.name : this.email; + if ('' !== sResult) + { + $('').text(sResult).appendTo(oContainer); + oContainer.append(''); + return null; + } + } + else + { + sResult = 0 < this.name.length ? this.name + ' (' + this.email + ')' : this.email; + } + + return sResult; +}; diff --git a/dev/Models/FolderModel.js b/dev/Models/FolderModel.js new file mode 100644 index 000000000..8e5c4c35d --- /dev/null +++ b/dev/Models/FolderModel.js @@ -0,0 +1,305 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function FolderModel() +{ + this.name = ko.observable(''); + this.fullName = ''; + this.fullNameRaw = ''; + this.fullNameHash = ''; + this.delimiter = ''; + this.namespace = ''; + this.deep = 0; + + this.selectable = false; + this.existen = true; + + this.isNamespaceFolder = false; + this.isGmailFolder = false; + this.isUnpaddigFolder = false; + + this.type = ko.observable(Enums.FolderType.User); + + this.selected = ko.observable(false); + this.edited = ko.observable(false); + this.collapsed = ko.observable(true); + this.subScribed = ko.observable(true); + this.subFolders = ko.observableArray([]); + this.deleteAccess = ko.observable(false); + this.actionBlink = ko.observable(false).extend({'falseTimeout': 1000}); + + this.nameForEdit = ko.observable(''); + + this.name.subscribe(function (sValue) { + this.nameForEdit(sValue); + }, this); + + this.edited.subscribe(function (bValue) { + if (bValue) + { + this.nameForEdit(this.name()); + } + }, this); + + this.canBeEdited = ko.computed(function () { + return Enums.FolderType.User === this.type(); + }, this); + + this.privateMessageCountAll = ko.observable(0); + this.privateMessageCountUnread = ko.observable(0); + + this.collapsedPrivate = ko.observable(true); +} + +/** + * @static + * @param {AjaxJsonFolder} oJsonFolder + * @return {?FolderModel} + */ +FolderModel.newInstanceFromJson = function (oJsonFolder) +{ + var oFolderModel = new FolderModel(); + return oFolderModel.initByJson(oJsonFolder) ? oFolderModel.initComputed() : null; +}; + +/** + * @return {FolderModel} + */ +FolderModel.prototype.initComputed = function () +{ + this.hasSubScribedSubfolders = ko.computed(function () { + return !!_.find(this.subFolders(), function (oFolder) { + return oFolder.subScribed(); + }); + }, this); + + this.visible = ko.computed(function () { + var + bSubScribed = this.subScribed(), + bSubFolders = this.hasSubScribedSubfolders() + ; + + return (bSubScribed || (bSubFolders && (!this.existen || !this.selectable))); + }, this); + + this.isSystemFolder = ko.computed(function () { + return Enums.FolderType.User !== this.type(); + }, this); + + this.hidden = ko.computed(function () { + var + bSystem = this.isSystemFolder(), + bSubFolders = this.hasSubScribedSubfolders() + ; + + return this.isGmailFolder || (bSystem && this.isNamespaceFolder) || (bSystem && !bSubFolders); + }, this); + + this.selectableForFolderList = ko.computed(function () { + return !this.isSystemFolder() && this.selectable; + }, this); + + this.messageCountAll = ko.computed({ + 'read': this.privateMessageCountAll, + 'write': function (iValue) { + if (Utils.isPosNumeric(iValue, true)) + { + this.privateMessageCountAll(iValue); + } + else + { + this.privateMessageCountAll.valueHasMutated(); + } + }, + 'owner': this + }); + + this.messageCountUnread = ko.computed({ + 'read': this.privateMessageCountUnread, + 'write': function (iValue) { + if (Utils.isPosNumeric(iValue, true)) + { + this.privateMessageCountUnread(iValue); + } + else + { + this.privateMessageCountUnread.valueHasMutated(); + } + }, + 'owner': this + }); + + this.printableUnreadCount = ko.computed(function () { + var + iCount = this.messageCountAll(), + iUnread = this.messageCountUnread(), + iType = this.type() + ; +// return 0 < iUnread ? '' + iUnread : ''; +// return 0 < iUnread && 'INBOX' === this.fullNameRaw ? '' + iUnread : ''; + return 0 < iUnread && (Enums.FolderType.Inbox === iType || Enums.FolderType.Spam === iType) ? '' + iUnread : + (0 < iCount && Enums.FolderType.Draft === iType ? '' + iCount : ''); + }, this); + + this.canBeDeleted = ko.computed(function () { + var + bSystem = this.isSystemFolder() + ; + return !bSystem && 0 === this.subFolders().length && 'INBOX' !== this.fullNameRaw; + }, this); + + this.canBeSubScribed = ko.computed(function () { + return !this.isSystemFolder() && this.selectable && 'INBOX' !== this.fullNameRaw; + }, this); + + this.visible.subscribe(function () { + Utils.timeOutAction('folder-list-folder-visibility-change', function () { + $window.trigger('folder-list-folder-visibility-change'); + }, 100); + }); + + this.localName = ko.computed(function () { + + Globals.langChangeTick(); + + var + iType = this.type(), + sName = this.name() + ; + + if (this.isSystemFolder()) + { + switch (iType) + { + case Enums.FolderType.Inbox: + sName = Utils.i18n('FOLDER_LIST/INBOX_NAME'); + break; + case Enums.FolderType.SentItems: + sName = Utils.i18n('FOLDER_LIST/SENT_NAME'); + break; + case Enums.FolderType.Draft: + sName = Utils.i18n('FOLDER_LIST/DRAFTS_NAME'); + break; + case Enums.FolderType.Spam: + sName = Utils.i18n('FOLDER_LIST/SPAM_NAME'); + break; + case Enums.FolderType.Trash: + sName = Utils.i18n('FOLDER_LIST/TRASH_NAME'); + break; + } + } + + return sName; + + }, this); + + this.manageFolderSystemName = ko.computed(function () { + + Globals.langChangeTick(); + + var + sSuffix = '', + iType = this.type(), + sName = this.name() + ; + + if (this.isSystemFolder()) + { + switch (iType) + { + case Enums.FolderType.Inbox: + sSuffix = '(' + Utils.i18n('FOLDER_LIST/INBOX_NAME') + ')'; + break; + case Enums.FolderType.SentItems: + sSuffix = '(' + Utils.i18n('FOLDER_LIST/SENT_NAME') + ')'; + break; + case Enums.FolderType.Draft: + sSuffix = '(' + Utils.i18n('FOLDER_LIST/DRAFTS_NAME') + ')'; + break; + case Enums.FolderType.Spam: + sSuffix = '(' + Utils.i18n('FOLDER_LIST/SPAM_NAME') + ')'; + break; + case Enums.FolderType.Trash: + sSuffix = '(' + Utils.i18n('FOLDER_LIST/TRASH_NAME') + ')'; + break; + } + } + + if ('' !== sSuffix && '(' + sName + ')' === sSuffix || '(inbox)' === sSuffix.toLowerCase()) + { + sSuffix = ''; + } + + return sSuffix; + + }, this); + + this.collapsed = ko.computed({ + 'read': function () { + return !this.hidden() && this.collapsedPrivate(); + }, + 'write': function (mValue) { + this.collapsedPrivate(mValue); + }, + 'owner': this + }); + + return this; +}; + +FolderModel.prototype.fullName = ''; +FolderModel.prototype.fullNameRaw = ''; +FolderModel.prototype.fullNameHash = ''; +FolderModel.prototype.delimiter = ''; +FolderModel.prototype.namespace = ''; +FolderModel.prototype.deep = 0; + +FolderModel.prototype.isNamespaceFolder = false; +FolderModel.prototype.isGmailFolder = false; +FolderModel.prototype.isUnpaddigFolder = false; + +/** + * @return {string} + */ +FolderModel.prototype.collapsedCss = function () +{ + return this.hasSubScribedSubfolders() ? + (this.collapsed() ? 'icon-arrow-right-3 e-collapsed-sign' : 'icon-arrow-down-3 e-collapsed-sign') : 'icon-none e-collapsed-sign'; +}; + +/** + * @param {AjaxJsonFolder} oJsonFolder + * @return {boolean} + */ +FolderModel.prototype.initByJson = function (oJsonFolder) +{ + var bResult = false; + if (oJsonFolder && 'Object/Folder' === oJsonFolder['@Object']) + { + this.name(oJsonFolder.Name); + this.delimiter = oJsonFolder.Delimiter; + this.fullName = oJsonFolder.FullName; + this.fullNameRaw = oJsonFolder.FullNameRaw; + this.fullNameHash = oJsonFolder.FullNameHash; + this.deep = oJsonFolder.FullNameRaw.split(this.delimiter).length - 1; + this.selectable = !!oJsonFolder.IsSelectable; + this.existen = !!oJsonFolder.IsExisten; + + this.subScribed(!!oJsonFolder.IsSubscribed); + this.type('INBOX' === this.fullNameRaw ? Enums.FolderType.Inbox : Enums.FolderType.User); + + bResult = true; + } + + return bResult; +}; + +/** + * @return {string} + */ +FolderModel.prototype.printableFullName = function () +{ + return this.fullName.split(this.delimiter).join(' / '); +}; diff --git a/dev/Models/IdentityModel.js b/dev/Models/IdentityModel.js new file mode 100644 index 000000000..394405f67 --- /dev/null +++ b/dev/Models/IdentityModel.js @@ -0,0 +1,37 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @param {string} sId + * @param {string} sEmail + * @param {boolean=} bCanBeDelete = true + * @constructor + */ +function IdentityModel(sId, sEmail, bCanBeDelete) +{ + this.id = sId; + this.email = ko.observable(sEmail); + this.name = ko.observable(''); + this.replyTo = ko.observable(''); + this.bcc = ko.observable(''); + + this.deleteAccess = ko.observable(false); + this.canBeDalete = ko.observable(bCanBeDelete); +} + +IdentityModel.prototype.formattedName = function () +{ + var sName = this.name(); + return '' === sName ? this.email() : sName + ' <' + this.email() + '>'; +}; + +IdentityModel.prototype.formattedNameForCompose = function () +{ + var sName = this.name(); + return '' === sName ? this.email() : sName + ' (' + this.email() + ')'; +}; + +IdentityModel.prototype.formattedNameForEmail = function () +{ + var sName = this.name(); + return '' === sName ? this.email() : '"' + Utils.quoteName(sName) + '" <' + this.email() + '>'; +}; diff --git a/dev/Models/MessageModel.js b/dev/Models/MessageModel.js new file mode 100644 index 000000000..446ef35d7 --- /dev/null +++ b/dev/Models/MessageModel.js @@ -0,0 +1,897 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function MessageModel() +{ + this.folderFullNameRaw = ''; + this.uid = ''; + this.requestHash = ''; + this.subject = ko.observable(''); + this.size = ko.observable(0); + this.dateTimeStampInUTC = ko.observable(0); + this.priority = ko.observable(Enums.MessagePriority.Normal); + + this.fromEmailString = ko.observable(''); + this.toEmailsString = ko.observable(''); + this.senderEmailsString = ko.observable(''); + + this.prefetched = false; + + this.emails = []; + + this.from = []; + this.to = []; + this.cc = []; + this.bcc = []; + this.replyTo = []; + + this.newForAnimation = ko.observable(false); + + this.deleted = ko.observable(false); + this.unseen = ko.observable(false); + this.flagged = ko.observable(false); + this.answered = ko.observable(false); + this.forwarded = ko.observable(false); + + this.selected = ko.observable(false); + this.checked = ko.observable(false); + this.hasAttachments = ko.observable(false); + this.attachmentsMainType = ko.observable(''); + + this.moment = ko.observable(moment()); + + this.attachmentIconClass = ko.computed(function () { + var sClass = ''; + if (this.hasAttachments()) + { + sClass = 'icon-attachment'; + switch (this.attachmentsMainType()) + { + case 'image': + sClass = 'icon-image'; + break; + case 'archive': + sClass = 'icon-file-zip'; + break; + case 'doc': + sClass = 'icon-file'; + break; + case 'pdf': + sClass = 'icon-file-pdf'; + break; + } + } + return sClass; + }, this); + + this.fullFormatDateValue = ko.computed(function () { + return MessageModel.calculateFullFromatDateValue(this.dateTimeStampInUTC()); + }, this); + + this.fullFormatDateValue = ko.computed(function () { + return MessageModel.calculateFullFromatDateValue(this.dateTimeStampInUTC()); + }, this); + + this.momentDate = Utils.createMomentDate(this); + this.momentShortDate = Utils.createMomentShortDate(this); + + this.dateTimeStampInUTC.subscribe(function (iValue) { + var iNow = moment().unix(); + this.moment(moment.unix(iNow < iValue ? iNow : iValue)); + }, this); + + this.body = null; + this.isRtl = ko.observable(false); + this.isHtml = ko.observable(false); + this.hasImages = ko.observable(false); + this.attachments = ko.observableArray([]); + + this.priority = ko.observable(Enums.MessagePriority.Normal); + this.aDraftInfo = []; + this.sMessageId = ''; + this.sInReplyTo = ''; + this.sReferences = ''; + + this.parentUid = ko.observable(0); + this.threads = ko.observableArray([]); + this.threadsLen = ko.observable(0); + this.hasUnseenSubMessage = ko.observable(false); + this.hasFlaggedSubMessage = ko.observable(false); + + this.lastInCollapsedThread = ko.observable(false); + this.lastInCollapsedThreadLoading = ko.observable(false); + + this.threadsLenResult = ko.computed(function () { + var iCount = this.threadsLen(); + return 0 === this.parentUid() && 0 < iCount ? iCount + 1 : ''; + }, this); +} + +/** + * @static + * @param {AjaxJsonMessage} oJsonMessage + * @return {?MessageModel} + */ +MessageModel.newInstanceFromJson = function (oJsonMessage) +{ + var oMessageModel = new MessageModel(); + return oMessageModel.initByJson(oJsonMessage) ? oMessageModel : null; +}; + +/** + * @static + * @param {number} iTimeStampInUTC + * @return {string} + */ +MessageModel.calculateFullFromatDateValue = function (iTimeStampInUTC) +{ + return moment.unix(iTimeStampInUTC).format('LLL'); +}; + +/** + * @static + * @param {Array} aEmail + * @param {boolean=} bFriendlyView + * @param {boolean=} bWrapWithLink = false + * @return {string} + */ +MessageModel.emailsToLine = function (aEmail, bFriendlyView, bWrapWithLink) +{ + var + aResult = [], + iIndex = 0, + iLen = 0 + ; + + if (Utils.isNonEmptyArray(aEmail)) + { + for (iIndex = 0, iLen = aEmail.length; iIndex < iLen; iIndex++) + { + aResult.push(aEmail[iIndex].toLine(bFriendlyView, bWrapWithLink)); + } + } + + return aResult.join(', '); +}; + +/** + * @static + * @param {?Array} aJsonEmails + * @return {Array} + */ +MessageModel.initEmailsFromJson = function (aJsonEmails) +{ + var + iIndex = 0, + iLen = 0, + oEmailModel = null, + aResult = [] + ; + + if (Utils.isNonEmptyArray(aJsonEmails)) + { + for (iIndex = 0, iLen = aJsonEmails.length; iIndex < iLen; iIndex++) + { + oEmailModel = EmailModel.newInstanceFromJson(aJsonEmails[iIndex]); + if (oEmailModel) + { + aResult.push(oEmailModel); + } + } + } + + return aResult; +}; + +/** + * @static + * @param {Array.} aMessageEmails + * @param {Object} oLocalUnic + * @param {Array} aLocalEmails + */ +MessageModel.replyHelper = function (aMessageEmails, oLocalUnic, aLocalEmails) +{ + if (aMessageEmails && 0 < aMessageEmails.length) + { + var + iIndex = 0, + iLen = aMessageEmails.length + ; + + for (; iIndex < iLen; iIndex++) + { + if (Utils.isUnd(oLocalUnic[aMessageEmails[iIndex].email])) + { + oLocalUnic[aMessageEmails[iIndex].email] = true; + aLocalEmails.push(aMessageEmails[iIndex]); + } + } + } +}; + +/** + * @param {AjaxJsonMessage} oJsonMessage + * @return {boolean} + */ +MessageModel.prototype.initByJson = function (oJsonMessage) +{ + var bResult = false; + if (oJsonMessage && 'Object/Message' === oJsonMessage['@Object']) + { + this.folderFullNameRaw = oJsonMessage.Folder; + this.uid = oJsonMessage.Uid; + this.requestHash = oJsonMessage.RequestHash; + + this.prefetched = false; + + this.size(Utils.pInt(oJsonMessage.Size)); + + this.from = MessageModel.initEmailsFromJson(oJsonMessage.From); + this.to = MessageModel.initEmailsFromJson(oJsonMessage.To); + this.cc = MessageModel.initEmailsFromJson(oJsonMessage.Cc); + this.bcc = MessageModel.initEmailsFromJson(oJsonMessage.Bcc); + this.replyTo = MessageModel.initEmailsFromJson(oJsonMessage.ReplyTo); + + this.subject(oJsonMessage.Subject); + this.dateTimeStampInUTC(Utils.pInt(oJsonMessage.DateTimeStampInUTC)); + this.hasAttachments(!!oJsonMessage.HasAttachments); + this.attachmentsMainType(oJsonMessage.AttachmentsMainType); + + this.fromEmailString(MessageModel.emailsToLine(this.from, true)); + this.toEmailsString(MessageModel.emailsToLine(this.to, true)); + + this.parentUid(Utils.pInt(oJsonMessage.ParentThread)); + this.threads(Utils.isArray(oJsonMessage.Threads) ? oJsonMessage.Threads : []); + this.threadsLen(Utils.pInt(oJsonMessage.ThreadsLen)); + + this.initFlagsByJson(oJsonMessage); + this.computeSenderEmail(); + + bResult = true; + } + + return bResult; +}; + +MessageModel.prototype.computeSenderEmail = function () +{ + var + sSent = RL.data().sentFolder(), + sDraft = RL.data().draftFolder() + ; + + this.senderEmailsString(this.folderFullNameRaw === sSent || this.folderFullNameRaw === sDraft ? + this.toEmailsString() : this.fromEmailString()); +}; + +/** + * @param {AjaxJsonMessage} oJsonMessage + * @return {boolean} + */ +MessageModel.prototype.initUpdateByMessageJson = function (oJsonMessage) +{ + var + bResult = false, + iPriority = Enums.MessagePriority.Normal + ; + + if (oJsonMessage && 'Object/Message' === oJsonMessage['@Object']) + { + iPriority = Utils.pInt(oJsonMessage.Priority); + this.priority(-1 < Utils.inArray(iPriority, [Enums.MessagePriority.High, Enums.MessagePriority.Low]) ? + iPriority : Enums.MessagePriority.Normal); + + this.aDraftInfo = oJsonMessage.DraftInfo; + + this.sMessageId = oJsonMessage.MessageId; + this.sInReplyTo = oJsonMessage.InReplyTo; + this.sReferences = oJsonMessage.References; + + this.hasAttachments(!!oJsonMessage.HasAttachments); + this.attachmentsMainType(oJsonMessage.AttachmentsMainType); + + this.foundedCIDs = Utils.isArray(oJsonMessage.FoundedCIDs) ? oJsonMessage.FoundedCIDs : []; + this.attachments(this.initAttachmentsFromJson(oJsonMessage.Attachments)); + + this.computeSenderEmail(); + + bResult = true; + } + + return bResult; +}; + +/** + * @param {(AjaxJsonAttachment|null)} oJsonAttachments + * @return {Array} + */ +MessageModel.prototype.initAttachmentsFromJson = function (oJsonAttachments) +{ + var + iIndex = 0, + iLen = 0, + oAttachmentModel = null, + aResult = [] + ; + + if (oJsonAttachments && 'Collection/AttachmentCollection' === oJsonAttachments['@Object'] && + Utils.isNonEmptyArray(oJsonAttachments['@Collection'])) + { + for (iIndex = 0, iLen = oJsonAttachments['@Collection'].length; iIndex < iLen; iIndex++) + { + oAttachmentModel = AttachmentModel.newInstanceFromJson(oJsonAttachments['@Collection'][iIndex]); + if (oAttachmentModel) + { + if ('' !== oAttachmentModel.cidWithOutTags && 0 < this.foundedCIDs.length && + 0 <= Utils.inArray(oAttachmentModel.cidWithOutTags, this.foundedCIDs)) + { + oAttachmentModel.isLinked = true; + } + + aResult.push(oAttachmentModel); + } + } + } + + return aResult; +}; + +/** + * @param {AjaxJsonMessage} oJsonMessage + * @return {boolean} + */ +MessageModel.prototype.initFlagsByJson = function (oJsonMessage) +{ + var bResult = false; + + if (oJsonMessage && 'Object/Message' === oJsonMessage['@Object']) + { + this.unseen(!oJsonMessage.IsSeen); + this.flagged(!!oJsonMessage.IsFlagged); + this.answered(!!oJsonMessage.IsAnswered); + this.forwarded(!!oJsonMessage.IsForwarded); + + bResult = true; + } + + return bResult; +}; + +/** + * @param {boolean} bFriendlyView + * @param {boolean=} bWrapWithLink = false + * @return {string} + */ +MessageModel.prototype.fromToLine = function (bFriendlyView, bWrapWithLink) +{ + return MessageModel.emailsToLine(this.from, bFriendlyView, bWrapWithLink); +}; + +/** + * @param {boolean} bFriendlyView + * @param {boolean=} bWrapWithLink = false + * @return {string} + */ +MessageModel.prototype.toToLine = function (bFriendlyView, bWrapWithLink) +{ + return MessageModel.emailsToLine(this.to, bFriendlyView, bWrapWithLink); +}; + +/** + * @param {boolean} bFriendlyView + * @param {boolean=} bWrapWithLink = false + * @return {string} + */ +MessageModel.prototype.ccToLine = function (bFriendlyView, bWrapWithLink) +{ + return MessageModel.emailsToLine(this.cc, bFriendlyView, bWrapWithLink); +}; + +/** + * @param {boolean} bFriendlyView + * @param {boolean=} bWrapWithLink = false + * @return {string} + */ +MessageModel.prototype.bccToLine = function (bFriendlyView, bWrapWithLink) +{ + return MessageModel.emailsToLine(this.bcc, bFriendlyView, bWrapWithLink); +}; + +/** + * @return string + */ +MessageModel.prototype.lineAsCcc = function () +{ + var aResult = []; + if (this.deleted()) + { + aResult.push('deleted'); + } + if (this.selected()) + { + aResult.push('selected'); + } + if (this.checked()) + { + aResult.push('checked'); + } + if (this.flagged()) + { + aResult.push('flagged'); + } + if (this.unseen()) + { + aResult.push('unseen'); + } + if (this.answered()) + { + aResult.push('answered'); + } + if (this.forwarded()) + { + aResult.push('forwarded'); + } + if (this.hasAttachments()) + { + aResult.push('withAttachments'); + switch (this.attachmentsMainType()) + { + case 'image': + aResult.push('imageOnlyAttachments'); + break; + case 'archive': + aResult.push('archiveOnlyAttachments'); + break; + } + } + if (this.newForAnimation()) + { + aResult.push('new'); + } + if ('' === this.subject()) + { + aResult.push('emptySubject'); + } + if (0 < this.parentUid()) + { + aResult.push('hasParentMessage'); + } + if (0 < this.threadsLen() && 0 === this.parentUid()) + { + aResult.push('hasChildrenMessage'); + } + if (this.hasUnseenSubMessage()) + { + aResult.push('hasUnseenSubMessage'); + } + if (this.hasFlaggedSubMessage()) + { + aResult.push('hasFlaggedSubMessage'); + } + + return aResult.join(' '); +}; + +/** + * @return {boolean} + */ +MessageModel.prototype.hasVisibleAttachments = function () +{ + return !!_.find(this.attachments(), function (oAttachment) { + return !oAttachment.isLinked; + }); +// return 0 < this.attachments().length; +}; + +/** + * @param {string} sCid + * @return {*} + */ +MessageModel.prototype.findAttachmentByCid = function (sCid) +{ + var + oResult = null, + aAttachments = this.attachments() + ; + + if (Utils.isNonEmptyArray(aAttachments)) + { + sCid = sCid.replace(/^<+/, '').replace(/>+$/, ''); + oResult = _.find(aAttachments, function (oAttachment) { + return sCid === oAttachment.cidWithOutTags; + }); + } + + return oResult || null; +}; + +/** + * @param {string} sContentLocation + * @return {*} + */ +MessageModel.prototype.findAttachmentByContentLocation = function (sContentLocation) +{ + var + oResult = null, + aAttachments = this.attachments() + ; + + if (Utils.isNonEmptyArray(aAttachments)) + { + oResult = _.find(aAttachments, function (oAttachment) { + return sContentLocation === oAttachment.contentLocation; + }); + } + + return oResult || null; +}; + + +/** + * @return {string} + */ +MessageModel.prototype.messageId = function () +{ + return this.sMessageId; +}; + +/** + * @return {string} + */ +MessageModel.prototype.inReplyTo = function () +{ + return this.sInReplyTo; +}; + +/** + * @return {string} + */ +MessageModel.prototype.references = function () +{ + return this.sReferences; +}; + +/** + * @return {string} + */ +MessageModel.prototype.fromAsSingleEmail = function () +{ + return Utils.isArray(this.from) && this.from[0] ? this.from[0].email : ''; +}; + +/** + * @return {string} + */ +MessageModel.prototype.viewLink = function () +{ + return RL.link().messageViewLink(this.requestHash); +}; + +/** + * @return {string} + */ +MessageModel.prototype.downloadLink = function () +{ + return RL.link().messageDownloadLink(this.requestHash); +}; + +/** + * @param {Object} oExcludeEmails + * @return {Array} + */ +MessageModel.prototype.replyEmails = function (oExcludeEmails) +{ + var + aResult = [], + oUnic = Utils.isUnd(oExcludeEmails) ? {} : oExcludeEmails + ; + + MessageModel.replyHelper(this.replyTo, oUnic, aResult); + if (0 === aResult.length) + { + MessageModel.replyHelper(this.from, oUnic, aResult); + } + + return aResult; +}; + +/** + * @param {Object} oExcludeEmails + * @return {Array.} + */ +MessageModel.prototype.replyAllEmails = function (oExcludeEmails) +{ + var + aToResult = [], + aCcResult = [], + oUnic = Utils.isUnd(oExcludeEmails) ? {} : oExcludeEmails + ; + + MessageModel.replyHelper(this.replyTo, oUnic, aToResult); + if (0 === aToResult.length) + { + MessageModel.replyHelper(this.from, oUnic, aToResult); + } + + MessageModel.replyHelper(this.to, oUnic, aToResult); + MessageModel.replyHelper(this.cc, oUnic, aCcResult); + + return [aToResult, aCcResult]; +}; + +/** + * @return {string} + */ +MessageModel.prototype.textBodyToString = function () +{ + return this.body ? this.body.html() : ''; +}; + +/** + * @return {string} + */ +MessageModel.prototype.attachmentsToStringLine = function () +{ + var aAttachLines = _.map(this.attachments(), function (oItem) { + return oItem.fileName + ' (' + oItem.friendlySize + ')'; + }); + + return aAttachLines && 0 < aAttachLines.length ? aAttachLines.join(', ') : ''; +}; + +/** + * @return {Object} + */ +MessageModel.prototype.getDataForWindowPopup = function () +{ + return { + 'popupFrom': this.fromToLine(false), + 'popupTo': this.toToLine(false), + 'popupCc': this.ccToLine(false), + 'popupBcc': this.bccToLine(false), + 'popupSubject': this.subject(), + 'popupDate': this.fullFormatDateValue(), + 'popupAttachments': this.attachmentsToStringLine(), + 'popupBody': this.textBodyToString() + }; +}; + +/** + * @param {boolean=} bPrint = false + */ +MessageModel.prototype.viewPopupMessage = function (bPrint) +{ + Utils.windowPopupKnockout(this.getDataForWindowPopup(), 'PopupsWindowSimpleMessage', this.subject(), function (oPopupWin) { + if (oPopupWin && oPopupWin.document && oPopupWin.document.body) + { + $('img.lazy', oPopupWin.document.body).each(function (iIndex, oImg) { + + var + $oImg = $(oImg), + sOrig = $oImg.data('original'), + sSrc = $oImg.attr('src') + ; + + if (0 <= iIndex && sOrig && !sSrc) + { + $oImg.attr('src', sOrig); + } + }); + + if (bPrint) + { + window.setTimeout(function () { + oPopupWin.print(); + }, 100); + } + } + }); +}; + +MessageModel.prototype.printMessage = function () +{ + this.viewPopupMessage(true); +}; + +/** + * @returns {string} + */ +MessageModel.prototype.generateUid = function () +{ + return this.folderFullNameRaw + '/' + this.uid; +}; + +/** + * @param {MessageModel} oMessage + * @return {MessageModel} + */ +MessageModel.prototype.populateByMessageListItem = function (oMessage) +{ + this.folderFullNameRaw = oMessage.folderFullNameRaw; + this.uid = oMessage.uid; + this.requestHash = oMessage.requestHash; + this.subject(oMessage.subject()); + this.size(oMessage.size()); + this.dateTimeStampInUTC(oMessage.dateTimeStampInUTC()); + this.priority(oMessage.priority()); + + this.fromEmailString(oMessage.fromEmailString()); + this.toEmailsString(oMessage.toEmailsString()); + + this.emails = oMessage.emails; + + this.from = oMessage.from; + this.to = oMessage.to; + this.cc = oMessage.cc; + this.bcc = oMessage.bcc; + this.replyTo = oMessage.replyTo; + + this.unseen(oMessage.unseen()); + this.flagged(oMessage.flagged()); + this.answered(oMessage.answered()); + this.forwarded(oMessage.forwarded()); + + this.selected(oMessage.selected()); + this.checked(oMessage.checked()); + this.hasAttachments(oMessage.hasAttachments()); + this.attachmentsMainType(oMessage.attachmentsMainType()); + + this.moment(oMessage.moment()); + + this.body = null; +// this.isRtl(oMessage.isRtl()); +// this.isHtml(false); +// this.hasImages(false); +// this.attachments([]); + + this.priority(Enums.MessagePriority.Normal); + this.aDraftInfo = []; + this.sMessageId = ''; + this.sInReplyTo = ''; + this.sReferences = ''; + + this.parentUid(oMessage.parentUid()); + this.threads(oMessage.threads()); + this.threadsLen(oMessage.threadsLen()); + + this.computeSenderEmail(); + + return this; +}; + +MessageModel.prototype.showExternalImages = function (bLazy) +{ + if (this.body && this.body.data('rl-has-images')) + { + bLazy = Utils.isUnd(bLazy) ? false : bLazy; + + this.hasImages(false); + this.body.data('rl-has-images', false); + + $('[data-x-src]', this.body).each(function () { + if (bLazy && $(this).is('img')) + { + $(this) + .addClass('lazy') + .attr('data-original', $(this).attr('data-x-src')) + .removeAttr('data-x-src') + ; + } + else + { + $(this).attr('src', $(this).attr('data-x-src')).removeAttr('data-x-src'); + } + }); + + $('[data-x-style-url]', this.body).each(function () { + var sStyle = Utils.trim($(this).attr('style')); + sStyle = '' === sStyle ? '' : (';' === sStyle.substr(-1) ? sStyle + ' ' : sStyle + '; '); + $(this).attr('style', sStyle + $(this).attr('data-x-style-url')).removeAttr('data-x-style-url'); + }); + + if (bLazy) + { + $('img.lazy', this.body).addClass('lazy-inited').lazyload({ + 'threshold' : 400, + 'effect' : 'fadeIn', + 'skip_invisible' : false, + 'container': $('.RL-MailMessageView .messageView .messageItem .content')[0] + }); + + $window.resize(); + } + + Utils.windowResize(500); + } +}; + +MessageModel.prototype.showInternalImages = function (bLazy) +{ + if (this.body && !this.body.data('rl-init-internal-images')) + { + bLazy = Utils.isUnd(bLazy) ? false : bLazy; + + var self = this; + + this.body.data('rl-init-internal-images', true); + + $('[data-x-src-cid]', this.body).each(function () { + + var oAttachment = self.findAttachmentByCid($(this).attr('data-x-src-cid')); + if (oAttachment && oAttachment.download) + { + if (bLazy && $(this).is('img')) + { + $(this) + .addClass('lazy') + .attr('data-original', oAttachment.linkPreview()); + } + else + { + $(this).attr('src', oAttachment.linkPreview()); + } + } + }); + + $('[data-x-src-location]', this.body).each(function () { + + var oAttachment = self.findAttachmentByContentLocation($(this).attr('data-x-src-location')); + if (!oAttachment) + { + oAttachment = self.findAttachmentByCid($(this).attr('data-x-src-location')); + } + + if (oAttachment && oAttachment.download) + { + if (bLazy && $(this).is('img')) + { + $(this) + .addClass('lazy') + .attr('data-original', oAttachment.linkPreview()); + } + else + { + $(this).attr('src', oAttachment.linkPreview()); + } + } + }); + + $('[data-x-style-cid]', this.body).each(function () { + + var + sStyle = '', + sName = '', + oAttachment = self.findAttachmentByCid($(this).attr('data-x-style-cid')) + ; + + if (oAttachment && oAttachment.linkPreview) + { + sName = $(this).attr('data-x-style-cid-name'); + if ('' !== sName) + { + sStyle = Utils.trim($(this).attr('style')); + sStyle = '' === sStyle ? '' : (';' === sStyle.substr(-1) ? sStyle + ' ' : sStyle + '; '); + $(this).attr('style', sStyle + sName + ': url(\'' + oAttachment.linkPreview() + '\')'); + } + } + }); + + if (bLazy) + { + (function ($oImg, oContainer) { + _.delay(function () { + $oImg.addClass('lazy-inited').lazyload({ + 'threshold' : 400, + 'effect' : 'fadeIn', + 'skip_invisible' : false, + 'container': oContainer + }); + }, 300); + }($('img.lazy', self.body), $('.RL-MailMessageView .messageView .messageItem .content')[0])); + } + + Utils.windowResize(500); + } +}; diff --git a/dev/Screens/AbstractSettings.js b/dev/Screens/AbstractSettings.js new file mode 100644 index 000000000..9e385efcc --- /dev/null +++ b/dev/Screens/AbstractSettings.js @@ -0,0 +1,178 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @param {Array} aViewModels + * @constructor + * @extends KnoinAbstractScreen + */ +function AbstractSettings(aViewModels) +{ + KnoinAbstractScreen.call(this, 'settings', aViewModels); + + this.menu = ko.observableArray([]); + + this.oCurrentSubScreen = null; + this.oViewModelPlace = null; +} + +_.extend(AbstractSettings.prototype, KnoinAbstractScreen.prototype); + +AbstractSettings.prototype.onRoute = function (sSubName) +{ + var + self = this, + oSettingsScreen = null, + RoutedSettingsViewModel = null, + oViewModelPlace = null, + oViewModelDom = null + ; + + RoutedSettingsViewModel = _.find(ViewModels['settings'], function (SettingsViewModel) { + return SettingsViewModel && SettingsViewModel.__rlSettingsData && + sSubName === SettingsViewModel.__rlSettingsData.Route; + }); + + if (RoutedSettingsViewModel) + { + if (_.find(ViewModels['settings-removed'], function (DisabledSettingsViewModel) { + return DisabledSettingsViewModel && DisabledSettingsViewModel === RoutedSettingsViewModel; + })) + { + RoutedSettingsViewModel = null; + } + + if (RoutedSettingsViewModel && _.find(ViewModels['settings-disabled'], function (DisabledSettingsViewModel) { + return DisabledSettingsViewModel && DisabledSettingsViewModel === RoutedSettingsViewModel; + })) + { + RoutedSettingsViewModel = null; + } + } + + if (RoutedSettingsViewModel) + { + if (RoutedSettingsViewModel.__builded && RoutedSettingsViewModel.__vm) + { + oSettingsScreen = RoutedSettingsViewModel.__vm; + } + else + { + oViewModelPlace = this.oViewModelPlace; + if (oViewModelPlace && 1 === oViewModelPlace.length) + { + RoutedSettingsViewModel = /** @type {?Function} */ RoutedSettingsViewModel; + oSettingsScreen = new RoutedSettingsViewModel(); + + oViewModelDom = $('
').addClass('rl-settings-view-model').hide().attr('data-bind', + 'template: {name: "' + RoutedSettingsViewModel.__rlSettingsData.Template + '"}, i18nInit: true'); + + oViewModelDom.appendTo(oViewModelPlace); + + oSettingsScreen.data = RL.data(); + oSettingsScreen.viewModelDom = oViewModelDom; + + oSettingsScreen.__rlSettingsData = RoutedSettingsViewModel.__rlSettingsData; + + RoutedSettingsViewModel.__dom = oViewModelDom; + RoutedSettingsViewModel.__builded = true; + RoutedSettingsViewModel.__vm = oSettingsScreen; + + ko.applyBindings(oSettingsScreen, oViewModelDom[0]); + kn.delegateRun(oSettingsScreen, 'onBuild', [oViewModelDom]); + } + else + { + Utils.log('Cannot find sub settings view model position: SettingsSubScreen'); + } + } + + if (oSettingsScreen) + { + _.defer(function () { + // hide + if (self.oCurrentSubScreen) + { + kn.delegateRun(self.oCurrentSubScreen, 'onHide'); + self.oCurrentSubScreen.viewModelDom.hide(); + } + // -- + + self.oCurrentSubScreen = oSettingsScreen; + + // show + if (self.oCurrentSubScreen) + { + self.oCurrentSubScreen.viewModelDom.show(); + kn.delegateRun(self.oCurrentSubScreen, 'onShow'); + + _.each(self.menu(), function (oItem) { + oItem.selected(oSettingsScreen && oSettingsScreen.__rlSettingsData && oItem.route === oSettingsScreen.__rlSettingsData.Route); + }); + + $('#rl-content .b-settings .b-content .content').scrollTop(0); + } + // -- + + Utils.windowResize(); + }); + } + } + else + { + kn.setHash(RL.link().settings(), false, true); + } +}; + +AbstractSettings.prototype.onHide = function () +{ + if (this.oCurrentSubScreen && this.oCurrentSubScreen.viewModelDom) + { + kn.delegateRun(this.oCurrentSubScreen, 'onHide'); + this.oCurrentSubScreen.viewModelDom.hide(); + } +}; + +AbstractSettings.prototype.onBuild = function () +{ + _.each(ViewModels['settings'], function (SettingsViewModel) { + if (SettingsViewModel && SettingsViewModel.__rlSettingsData && + !_.find(ViewModels['settings-removed'], function (RemoveSettingsViewModel) { + return RemoveSettingsViewModel && RemoveSettingsViewModel === SettingsViewModel; + })) + { + this.menu.push({ + 'route': SettingsViewModel.__rlSettingsData.Route, + 'label': SettingsViewModel.__rlSettingsData.Label, + 'selected': ko.observable(false), + 'disabled': !!_.find(ViewModels['settings-disabled'], function (DisabledSettingsViewModel) { + return DisabledSettingsViewModel && DisabledSettingsViewModel === SettingsViewModel; + }) + }); + } + }, this); + + this.oViewModelPlace = $('#rl-content #rl-settings-subscreen'); +}; + +AbstractSettings.prototype.routes = function () +{ + var + DefaultViewModel = _.find(ViewModels['settings'], function (SettingsViewModel) { + return SettingsViewModel && SettingsViewModel.__rlSettingsData && SettingsViewModel.__rlSettingsData['IsDefault']; + }), + sDefaultRoute = DefaultViewModel ? DefaultViewModel.__rlSettingsData['Route'] : 'general', + oRules = { + 'subname': /^(.*)$/, + 'normalize_': function (oRequest, oVals) { + oVals.subname = Utils.isUnd(oVals.subname) ? sDefaultRoute : Utils.pString(oVals.subname); + return [oVals.subname]; + } + } + ; + + return [ + ['{subname}/', oRules], + ['{subname}', oRules], + ['', oRules] + ]; +}; diff --git a/dev/Screens/AdminLogin.js b/dev/Screens/AdminLogin.js new file mode 100644 index 000000000..a1ad92095 --- /dev/null +++ b/dev/Screens/AdminLogin.js @@ -0,0 +1,17 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractScreen + */ +function AdminLoginScreen() +{ + KnoinAbstractScreen.call(this, 'login', [AdminLoginViewModel]); +} + +_.extend(AdminLoginScreen.prototype, KnoinAbstractScreen.prototype); + +AdminLoginScreen.prototype.onShow = function () +{ + RL.setTitle(''); +}; \ No newline at end of file diff --git a/dev/Screens/AdminSettings.js b/dev/Screens/AdminSettings.js new file mode 100644 index 000000000..aff41adb7 --- /dev/null +++ b/dev/Screens/AdminSettings.js @@ -0,0 +1,22 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends AbstractSettings + */ +function AdminSettingsScreen() +{ + AbstractSettings.call(this, [ + AdminMenuViewModel, + AdminPaneViewModel + ]); +} + +_.extend(AdminSettingsScreen.prototype, AbstractSettings.prototype); + +AdminSettingsScreen.prototype.onShow = function () +{ +// AbstractSettings.prototype.onShow.call(this); + + RL.setTitle(''); +}; \ No newline at end of file diff --git a/dev/Screens/Login.js b/dev/Screens/Login.js new file mode 100644 index 000000000..23a5cbbbe --- /dev/null +++ b/dev/Screens/Login.js @@ -0,0 +1,17 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractScreen + */ +function LoginScreen() +{ + KnoinAbstractScreen.call(this, 'login', [LoginViewModel]); +} + +_.extend(LoginScreen.prototype, KnoinAbstractScreen.prototype); + +LoginScreen.prototype.onShow = function () +{ + RL.setTitle(Utils.i18n('TITLES/LOGIN')); +}; \ No newline at end of file diff --git a/dev/Screens/MailBox.js b/dev/Screens/MailBox.js new file mode 100644 index 000000000..a4e302f5f --- /dev/null +++ b/dev/Screens/MailBox.js @@ -0,0 +1,165 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractScreen + */ +function MailBoxScreen() +{ + KnoinAbstractScreen.call(this, 'mailbox', [ + MailBoxSystemDropDownViewModel, + MailBoxFolderListViewModel, + MailBoxMessageListViewModel, + MailBoxMessageViewViewModel + ]); + + this.oLastRoute = {}; +} + +_.extend(MailBoxScreen.prototype, KnoinAbstractScreen.prototype); + +MailBoxScreen.prototype.oLastRoute = {}; + +MailBoxScreen.prototype.onShow = function () +{ + var sEmail = RL.data().accountEmail(); + RL.setTitle(('' === sEmail ? '' : sEmail + ' - ') + Utils.i18n('TITLES/MAILBOX')); +}; + +MailBoxScreen.prototype.onRoute = function (sFolderHash, iPage, sSearch) +{ + var + oData = RL.data(), + sFolderFullNameRaw = RL.cache().getFolderFullNameRaw(sFolderHash), + oFolder = RL.cache().getFolderFromCacheList(sFolderFullNameRaw) + ; + + if (oFolder) + { + oData + .currentFolder(oFolder) + .messageListPage(iPage) + .messageListSearch(sSearch) + ; + + if (!oData.usePreviewPane() && oData.message()) + { + oData.message(null); + } + + RL.reloadMessageList(); + } +}; + +MailBoxScreen.prototype.onStart = function () +{ + var + oData = RL.data(), + fResizeFunction = function () { + Utils.windowResize(); + } + ; + + if (RL.settingsGet('AllowAdditionalAccounts') || RL.settingsGet('AllowIdentities')) + { + RL.accountsAndIdentities(); + } + + _.delay(function () { + RL.quota(); + }, 1000 * 5); + + _.delay(function () { + if ('INBOX' !== oData.currentFolderFullNameRaw()) + { + RL.folderInformation('INBOX'); + } + }, 1000); + + _.delay(function () { + var sFolder = RL.data().spamFolder(); + if (sFolder !== oData.currentFolderFullNameRaw()) + { + RL.folderInformation(sFolder); + } + }, 1500); + + _.delay(function () { + var sFolder = RL.data().draftFolder(); + if (sFolder !== oData.currentFolderFullNameRaw()) + { + RL.folderInformation(sFolder); + } + }, 2000); + + _.delay(function () { + RL.remote().appDelayStart(Utils.emptyFunction); + }, 1000 * 35); + + window.setInterval(function () { + RL.folderInformation('INBOX'); + }, 1000 * 60 * 2); + + window.setInterval(function () { + RL.quota(); + }, 1000 * 60 * 5); + + $html.toggleClass('rl-no-preview-pane', !oData.usePreviewPane()); + + oData.folderList.subscribe(fResizeFunction); + oData.messageList.subscribe(fResizeFunction); + oData.message.subscribe(fResizeFunction); + + oData.usePreviewPane.subscribe(function (bValue) { + $html.toggleClass('rl-no-preview-pane', !bValue); + }); +}; + +MailBoxScreen.prototype.onBuild = function () +{ + if (!Globals.bMobileDevice) + { + _.defer(function () { + Utils.initLayoutResizer('#rl-resizer-left', '#rl-resizer-right', '#rl-right', + 350, 800, 350, 350, Enums.ClientSideKeyName.MailBoxListSize); + }); + } +}; + +MailBoxScreen.prototype.routes = function () +{ + var + fNormS = function (oRequest, oVals) { + oVals[0] = Utils.pString(oVals[0]); + oVals[1] = Utils.pInt(oVals[1]); + oVals[1] = 0 >= oVals[1] ? 1 : oVals[1]; + oVals[2] = Utils.pString(oVals[2]); + + if ('' === oRequest) + { + oVals[0] = 'Inbox'; + oVals[1] = 1; + } + + return [decodeURI(oVals[0]), oVals[1], decodeURI(oVals[2])]; + }, + fNormD = function (oRequest, oVals) { + oVals[0] = Utils.pString(oVals[0]); + oVals[1] = Utils.pString(oVals[1]); + + if ('' === oRequest) + { + oVals[0] = 'Inbox'; + } + + return [decodeURI(oVals[0]), 1, decodeURI(oVals[1])]; + } + ; + + return [ + [/^([a-zA-Z0-9]+)\/p([1-9][0-9]*)\/(.+)\/?$/, {'normalize_': fNormS}], + [/^([a-zA-Z0-9]+)\/p([1-9][0-9]*)\/?$/, {'normalize_': fNormS}], + [/^([a-zA-Z0-9]+)\/(.+)\/?$/, {'normalize_': fNormD}], + [/^([^\/]*)$/, {'normalize_': fNormS}] + ]; +}; diff --git a/dev/Screens/Settings.js b/dev/Screens/Settings.js new file mode 100644 index 000000000..191022348 --- /dev/null +++ b/dev/Screens/Settings.js @@ -0,0 +1,29 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends AbstractSettings + */ +function SettingsScreen() +{ + AbstractSettings.call(this, [ + SettingsSystemDropDownViewModel, + SettingsMenuViewModel, + SettingsPaneViewModel + ]); + + Utils.initOnStartOrLangChange(function () { + this.sSettingsTitle = Utils.i18n('TITLES/SETTINGS'); + }, this, function () { + RL.setTitle(this.sSettingsTitle); + }); +} + +_.extend(SettingsScreen.prototype, AbstractSettings.prototype); + +SettingsScreen.prototype.onShow = function () +{ +// AbstractSettings.prototype.onShow.call(this); + + RL.setTitle(this.sSettingsTitle); +}; diff --git a/dev/Settings/Accounts.js b/dev/Settings/Accounts.js new file mode 100644 index 000000000..488fbcb77 --- /dev/null +++ b/dev/Settings/Accounts.js @@ -0,0 +1,67 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function SettingsAccounts() +{ + var oData = RL.data(); + + this.accounts = oData.accounts; + + this.processText = ko.computed(function () { + return oData.accountsLoading() ? Utils.i18n('SETTINGS_ACCOUNTS/LOADING_PROCESS') : ''; + }, this); + + this.visibility = ko.computed(function () { + return '' === this.processText() ? 'hidden' : 'visible'; + }, this); + + this.accountForDeletion = ko.observable(null).extend({'falseTimeout': 3000}).extend({'toggleSubscribe': [this, + function (oPrev) { + if (oPrev) + { + oPrev.deleteAccess(false); + } + }, function (oNext) { + if (oNext) + { + oNext.deleteAccess(true); + } + } + ]}); +} + +Utils.addSettingsViewModel(SettingsAccounts, 'SettingsAccounts', 'SETTINGS_LABELS/LABEL_ACCOUNTS_NAME', 'accounts'); + +SettingsAccounts.prototype.addNewAccount = function () +{ + kn.showScreenPopup(PopupsAddAccountViewModel); +}; + +/** + * + * @param {AccountModel} oAccountToRemove + */ +SettingsAccounts.prototype.deleteAccount = function (oAccountToRemove) +{ + if (oAccountToRemove && oAccountToRemove.deleteAccess()) + { + this.accountForDeletion(null); + + var + fRemoveAccount = function (oAccount) { + return oAccountToRemove === oAccount; + } + ; + + if (oAccountToRemove) + { + this.accounts.remove(fRemoveAccount); + + RL.remote().accountDelete(function () { + RL.accountsAndIdentities(); + }, oAccountToRemove.email); + } + } +}; diff --git a/dev/Settings/ChangePassword.js b/dev/Settings/ChangePassword.js new file mode 100644 index 000000000..5959704a8 --- /dev/null +++ b/dev/Settings/ChangePassword.js @@ -0,0 +1,65 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function SettingsChangePasswordScreen() +{ + this.changeProcess = ko.observable(false); + + this.passwordUpdateError = ko.observable(false); + this.passwordUpdateSuccess = ko.observable(false); + + this.currentPassword = ko.observable(''); + this.newPassword = ko.observable(''); + + this.currentPassword.subscribe(function () { + this.passwordUpdateError(false); + this.passwordUpdateSuccess(false); + }, this); + + this.newPassword.subscribe(function () { + this.passwordUpdateError(false); + this.passwordUpdateSuccess(false); + }, this); + + this.saveNewPasswordCommand = Utils.createCommand(this, function () { + + this.changeProcess(true); + + this.passwordUpdateError(false); + this.passwordUpdateSuccess(false); + + RL.remote().changePassword(this.onChangePasswordResponse, this.currentPassword(), this.newPassword()); + + }, function () { + return !this.changeProcess() && '' !== this.currentPassword() && '' !== this.newPassword(); + }); + + this.onChangePasswordResponse = _.bind(this.onChangePasswordResponse, this); +} + +Utils.addSettingsViewModel(SettingsChangePasswordScreen, 'SettingsChangePassword', 'SETTINGS_LABELS/LABEL_CHANGE_PASSWORD_NAME', 'change-password'); + +SettingsChangePasswordScreen.prototype.onHide = function () +{ + this.changeProcess(false); + this.currentPassword(''); + this.newPassword(''); +}; + +SettingsChangePasswordScreen.prototype.onChangePasswordResponse = function (sResult, oData) +{ + this.changeProcess(false); + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + this.currentPassword(''); + this.newPassword(''); + + this.passwordUpdateSuccess(true); + } + else + { + this.passwordUpdateError(true); + } +}; diff --git a/dev/Settings/Folders.js b/dev/Settings/Folders.js new file mode 100644 index 000000000..68c006e4a --- /dev/null +++ b/dev/Settings/Folders.js @@ -0,0 +1,196 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function SettingsFolders() +{ + var oData = RL.data(); + + this.foldersListError = oData.foldersListError; + this.folderList = oData.folderList; + + this.processText = ko.computed(function () { + + var + oData = RL.data(), + bLoading = oData.foldersLoading(), + bCreating = oData.foldersCreating(), + bDeleting = oData.foldersDeleting(), + bRenaming = oData.foldersRenaming() + ; + + if (bCreating) + { + return Utils.i18n('SETTINGS_FOLDERS/CREATING_PROCESS'); + } + else if (bDeleting) + { + return Utils.i18n('SETTINGS_FOLDERS/DELETING_PROCESS'); + } + else if (bRenaming) + { + return Utils.i18n('SETTINGS_FOLDERS/RENAMING_PROCESS'); + } + else if (bLoading) + { + return Utils.i18n('SETTINGS_FOLDERS/LOADING_PROCESS'); + } + + return ''; + + }, this); + + this.visibility = ko.computed(function () { + return '' === this.processText() ? 'hidden' : 'visible'; + }, this); + + this.folderForDeletion = ko.observable(null).extend({'falseTimeout': 3000}).extend({'toggleSubscribe': [this, + function (oPrev) { + if (oPrev) + { + oPrev.deleteAccess(false); + } + }, function (oNext) { + if (oNext) + { + oNext.deleteAccess(true); + } + } + ]}); + + this.folderForEdit = ko.observable(null).extend({'toggleSubscribe': [this, + function (oPrev) { + if (oPrev) + { + oPrev.edited(false); + } + }, function (oNext) { + if (oNext && oNext.canBeEdited()) + { + oNext.edited(true); + } + } + ]}); + + this.useImapSubscribe = !!RL.settingsGet('UseImapSubscribe'); +} + +Utils.addSettingsViewModel(SettingsFolders, 'SettingsFolders', 'SETTINGS_LABELS/LABEL_FOLDERS_NAME', 'folders'); + +SettingsFolders.prototype.folderEditOnEnter = function (oFolder) +{ + var sEditName = oFolder ? Utils.trim(oFolder.nameForEdit()) : ''; + if ('' !== sEditName && oFolder.name() !== sEditName) + { + RL.local().set(Enums.ClientSideKeyName.FoldersLashHash, ''); + + RL.data().foldersRenaming(true); + RL.remote().folderRename(function (sResult, oData) { + + RL.data().foldersRenaming(false); + if (Enums.StorageResultType.Success !== sResult || !oData || !oData.Result) + { + RL.data().foldersListError( + oData && oData.ErrorCode ? Utils.getNotification(oData.ErrorCode) : Utils.i18n('NOTIFICATIONS/CANT_RENAME_FOLDER')); + } + + RL.folders(false); + + }, oFolder.fullNameRaw, sEditName); + + RL.cache().removeFolderFromCacheList(oFolder.fullNameRaw); + + oFolder.name(sEditName); + } + + oFolder.edited(false); +}; + +SettingsFolders.prototype.folderEditOnEsc = function (oFolder) +{ + if (oFolder) + { + oFolder.edited(false); + } +}; + +SettingsFolders.prototype.onShow = function () +{ + RL.data().foldersListError(''); +}; + +SettingsFolders.prototype.createFolder = function () +{ + kn.showScreenPopup(PopupsFolderCreateViewModel); +}; + +SettingsFolders.prototype.systemFolder = function () +{ + kn.showScreenPopup(PopupsFolderSystemViewModel); +}; + +SettingsFolders.prototype.deleteFolder = function (oFolderToRemove) +{ + if (oFolderToRemove && oFolderToRemove.canBeDeleted() && oFolderToRemove.deleteAccess() && + 0 === oFolderToRemove.privateMessageCountAll()) + { + this.folderForDeletion(null); + + var + fRemoveFolder = function (oFolder) { + + if (oFolderToRemove === oFolder) + { + return true; + } + + oFolder.subFolders.remove(fRemoveFolder); + return false; + } + ; + + if (oFolderToRemove) + { + RL.local().set(Enums.ClientSideKeyName.FoldersLashHash, ''); + + RL.data().folderList.remove(fRemoveFolder); + + RL.data().foldersDeleting(true); + RL.remote().folderDelete(function (sResult, oData) { + + RL.data().foldersDeleting(false); + if (Enums.StorageResultType.Success !== sResult || !oData || !oData.Result) + { + RL.data().foldersListError( + oData && oData.ErrorCode ? Utils.getNotification(oData.ErrorCode) : Utils.i18n('NOTIFICATIONS/CANT_DELETE_FOLDER')); + } + + RL.folders(false); + + }, oFolderToRemove.fullNameRaw); + + RL.cache().removeFolderFromCacheList(oFolderToRemove.fullNameRaw); + } + } + else if (0 < oFolderToRemove.privateMessageCountAll()) + { + RL.data().foldersListError(Utils.getNotification(Enums.Notification.CantDeleteNonEmptyFolder)); + } +}; + +SettingsFolders.prototype.subscribeFolder = function (oFolder) +{ + RL.local().set(Enums.ClientSideKeyName.FoldersLashHash, ''); + RL.remote().folderSetSubscribe(Utils.emptyFunction, oFolder.fullNameRaw, true); + + oFolder.subScribed(true); +}; + +SettingsFolders.prototype.unSubscribeFolder = function (oFolder) +{ + RL.local().set(Enums.ClientSideKeyName.FoldersLashHash, ''); + RL.remote().folderSetSubscribe(Utils.emptyFunction, oFolder.fullNameRaw, false); + + oFolder.subScribed(false); +}; diff --git a/dev/Settings/General.js b/dev/Settings/General.js new file mode 100644 index 000000000..ee19158c6 --- /dev/null +++ b/dev/Settings/General.js @@ -0,0 +1,155 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function SettingsGeneral() +{ + var oData = RL.data(); + + this.mainLanguage = oData.mainLanguage; + this.mainMessagesPerPage = oData.mainMessagesPerPage; + this.mainMessagesPerPageArray = Consts.Defaults.MessagesPerPageArray; + this.editorDefaultType = oData.editorDefaultType; + this.showImages = oData.showImages; + this.interfaceAnimation = oData.interfaceAnimation; + this.useDesktopNotifications = oData.useDesktopNotifications; + this.threading = oData.threading; + this.useThreads = oData.useThreads; + this.replySameFolder = oData.replySameFolder; + this.usePreviewPane = oData.usePreviewPane; + this.useCheckboxesInList = oData.useCheckboxesInList; + this.allowLanguagesOnSettings = oData.allowLanguagesOnSettings; + + this.isDesktopNotificationsSupported = ko.computed(function () { + return Enums.DesktopNotifications.NotSupported !== oData.desktopNotificationsPermisions(); + }); + + this.isDesktopNotificationsDenied = ko.computed(function () { + return Enums.DesktopNotifications.NotSupported === oData.desktopNotificationsPermisions() || + Enums.DesktopNotifications.Denied === oData.desktopNotificationsPermisions(); + }); + + this.mainLanguageFullName = ko.computed(function () { + return Utils.convertLangName(this.mainLanguage()); + }, this); + + this.languageTrigger = ko.observable(Enums.SaveSettingsStep.Idle).extend({'throttle': 100}); + this.mppTrigger = ko.observable(Enums.SaveSettingsStep.Idle); + + this.isAnimationSupported = Globals.bAnimationSupported; +} + +Utils.addSettingsViewModel(SettingsGeneral, 'SettingsGeneral', 'SETTINGS_LABELS/LABEL_GENERAL_NAME', 'general', true); + +SettingsGeneral.prototype.onBuild = function () +{ + var self = this; + + _.delay(function () { + + var + oData = RL.data(), + f1 = Utils.settingsSaveHelperSimpleFunction(self.mppTrigger, self) + ; + + oData.language.subscribe(function (sValue) { + + self.languageTrigger(Enums.SaveSettingsStep.Animate); + + $.ajax({ + 'url': RL.link().langLink(sValue), + 'dataType': 'script', + 'cache': true + }).done(function() { + Utils.i18nToDoc(); + self.languageTrigger(Enums.SaveSettingsStep.TrueResult); + }).fail(function() { + self.languageTrigger(Enums.SaveSettingsStep.FalseResult); + }).always(function() { + _.delay(function () { + self.languageTrigger(Enums.SaveSettingsStep.Idle); + }, 1000); + }); + + RL.remote().saveSettings(Utils.emptyFunction, { + 'Language': sValue + }); + }); + + oData.editorDefaultType.subscribe(function (sValue) { + RL.remote().saveSettings(Utils.emptyFunction, { + 'EditorDefaultType': sValue + }); + }); + + oData.messagesPerPage.subscribe(function (iValue) { + RL.remote().saveSettings(f1, { + 'MPP': iValue + }); + }); + + oData.showImages.subscribe(function (bValue) { + RL.remote().saveSettings(Utils.emptyFunction, { + 'ShowImages': bValue ? '1' : '0' + }); + }); + + oData.interfaceAnimation.subscribe(function (sValue) { + RL.remote().saveSettings(Utils.emptyFunction, { + 'InterfaceAnimation': sValue + }); + }); + + oData.useDesktopNotifications.subscribe(function (bValue) { + Utils.timeOutAction('SaveDesktopNotifications', function () { + RL.remote().saveSettings(Utils.emptyFunction, { + 'DesktopNotifications': bValue ? '1' : '0' + }); + }, 3000); + }); + + oData.replySameFolder.subscribe(function (bValue) { + Utils.timeOutAction('SaveReplySameFolder', function () { + RL.remote().saveSettings(Utils.emptyFunction, { + 'ReplySameFolder': bValue ? '1' : '0' + }); + }, 3000); + }); + + oData.useThreads.subscribe(function (bValue) { + + oData.messageList([]); + + RL.remote().saveSettings(Utils.emptyFunction, { + 'UseThreads': bValue ? '1' : '0' + }); + }); + + oData.usePreviewPane.subscribe(function (bValue) { + + oData.messageList([]); + + RL.remote().saveSettings(Utils.emptyFunction, { + 'UsePreviewPane': bValue ? '1' : '0' + }); + }); + + oData.useCheckboxesInList.subscribe(function (bValue) { + RL.remote().saveSettings(Utils.emptyFunction, { + 'UseCheckboxesInList': bValue ? '1' : '0' + }); + }); + + }, 50); +}; + +SettingsGeneral.prototype.onShow = function () +{ + RL.data().desktopNotifications.valueHasMutated(); +}; + +SettingsGeneral.prototype.selectLanguage = function () +{ + kn.showScreenPopup(PopupsLanguagesViewModel); +}; diff --git a/dev/Settings/Identities.js b/dev/Settings/Identities.js new file mode 100644 index 000000000..2f89a3d71 --- /dev/null +++ b/dev/Settings/Identities.js @@ -0,0 +1,109 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function SettingsIdentities() +{ + var oData = RL.data(); + + this.identities = oData.identities; + + this.legent = ko.computed(function () { + return Utils.i18n('SETTINGS_IDENTITIES/LEGEND_IDENTITIES_FOR', {'EMAIL': oData.accountEmail()}); + }, this); + + this.processText = ko.computed(function () { + return oData.identitiesLoading() ? Utils.i18n('SETTINGS_IDENTITIES/LOADING_PROCESS') : ''; + }, this); + + this.visibility = ko.computed(function () { + return '' === this.processText() ? 'hidden' : 'visible'; + }, this); + + this.identityForDeletion = ko.observable(null).extend({'falseTimeout': 3000}).extend({'toggleSubscribe': [this, + function (oPrev) { + if (oPrev) + { + oPrev.deleteAccess(false); + } + }, function (oNext) { + if (oNext) + { + oNext.deleteAccess(true); + } + } + ]}); + + this.signature = oData.signature; + this.signatureTrigger = ko.observable(Enums.SaveSettingsStep.Idle); +} + +Utils.addSettingsViewModel(SettingsIdentities, 'SettingsIdentities', 'SETTINGS_LABELS/LABEL_IDENTITIES_NAME', 'identities'); + +SettingsIdentities.prototype.addNewIdentity = function () +{ + kn.showScreenPopup(PopupsIdentityViewModel); +}; + +SettingsIdentities.prototype.editIdentity = function (oIdentity) +{ + kn.showScreenPopup(PopupsIdentityViewModel, [oIdentity]); +}; + +/** + * + * @param {IdentityModel} oIdentityToRemove + */ +SettingsIdentities.prototype.deleteIdentity = function (oIdentityToRemove) +{ + if (oIdentityToRemove && oIdentityToRemove.deleteAccess()) + { + this.identityForDeletion(null); + + var + fRemoveFolder = function (oIdentity) { + return oIdentityToRemove === oIdentity; + } + ; + + if (oIdentityToRemove) + { + this.identities.remove(fRemoveFolder); + + RL.remote().identityDelete(function () { + RL.accountsAndIdentities(); + }, oIdentityToRemove.id); + } + } +}; + +SettingsIdentities.prototype.onBuild = function (oDom) +{ + var self = this; + + oDom + .on('click', '.identity-item .e-action', function () { + var oIdentityItem = ko.dataFor(this); + if (oIdentityItem) + { + self.editIdentity(oIdentityItem); + } + }) + ; + + _.delay(function () { + + var + oData = RL.data(), + f1 = Utils.settingsSaveHelperSimpleFunction(self.signatureTrigger, self) + ; + + oData.signature.subscribe(function (sValue) { + RL.remote().saveSettings(f1, { + 'Signature': sValue + }); + }); + + }, 50); +}; \ No newline at end of file diff --git a/dev/Settings/Personal.js b/dev/Settings/Personal.js new file mode 100644 index 000000000..3cd18dc91 --- /dev/null +++ b/dev/Settings/Personal.js @@ -0,0 +1,52 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function SettingsPersonal() +{ + var oData = RL.data(); + + this.displayName = oData.displayName; + this.replyTo = oData.replyTo; + this.signature = oData.signature; + + this.nameTrigger = ko.observable(Enums.SaveSettingsStep.Idle); + this.replyTrigger = ko.observable(Enums.SaveSettingsStep.Idle); + this.signatureTrigger = ko.observable(Enums.SaveSettingsStep.Idle); +} + +Utils.addSettingsViewModel(SettingsPersonal, 'SettingsPersonal', 'SETTINGS_LABELS/LABEL_PERSONAL_NAME', 'personal'); + +SettingsPersonal.prototype.onBuild = function () +{ + var self = this; + _.delay(function () { + + var + oData = RL.data(), + f1 = Utils.settingsSaveHelperSimpleFunction(self.nameTrigger, self), + f2 = Utils.settingsSaveHelperSimpleFunction(self.replyTrigger, self), + f3 = Utils.settingsSaveHelperSimpleFunction(self.signatureTrigger, self) + ; + + oData.displayName.subscribe(function (sValue) { + RL.remote().saveSettings(f1, { + 'DisplayName': sValue + }); + }); + + oData.replyTo.subscribe(function (sValue) { + RL.remote().saveSettings(f2, { + 'ReplyTo': sValue + }); + }); + + oData.signature.subscribe(function (sValue) { + RL.remote().saveSettings(f3, { + 'Signature': sValue + }); + }); + + }, 50); +}; diff --git a/dev/Settings/Social.js b/dev/Settings/Social.js new file mode 100644 index 000000000..3c4deaaaa --- /dev/null +++ b/dev/Settings/Social.js @@ -0,0 +1,68 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function SettingsSocialScreen() +{ + var oData = RL.data(); + + this.googleEnable = oData.googleEnable; + + this.googleActions = oData.googleActions; + this.googleLoggined = oData.googleLoggined; + this.googleUserName = oData.googleUserName; + + this.facebookEnable = oData.facebookEnable; + + this.facebookActions = oData.facebookActions; + this.facebookLoggined = oData.facebookLoggined; + this.facebookUserName = oData.facebookUserName; + + this.twitterEnable = oData.twitterEnable; + + this.twitterActions = oData.twitterActions; + this.twitterLoggined = oData.twitterLoggined; + this.twitterUserName = oData.twitterUserName; + + this.connectGoogle = Utils.createCommand(this, function () { + if (!this.googleLoggined()) + { + RL.googleConnect(); + } + }, function () { + return !this.googleLoggined() && !this.googleActions(); + }); + + this.disconnectGoogle = Utils.createCommand(this, function () { + RL.googleDisconnect(); + }); + + this.connectFacebook = Utils.createCommand(this, function () { + if (!this.facebookLoggined()) + { + RL.facebookConnect(); + } + }, function () { + return !this.facebookLoggined() && !this.facebookActions(); + }); + + this.disconnectFacebook = Utils.createCommand(this, function () { + RL.facebookDisconnect(); + }); + + this.connectTwitter = Utils.createCommand(this, function () { + if (!this.twitterLoggined()) + { + RL.twitterConnect(); + } + }, function () { + return !this.twitterLoggined() && !this.twitterActions(); + }); + + this.disconnectTwitter = Utils.createCommand(this, function () { + RL.twitterDisconnect(); + }); +} + +Utils.addSettingsViewModel(SettingsSocialScreen, 'SettingsSocial', 'SETTINGS_LABELS/LABEL_SOCIAL_NAME', 'social'); diff --git a/dev/Settings/Themes.js b/dev/Settings/Themes.js new file mode 100644 index 000000000..aee7fd104 --- /dev/null +++ b/dev/Settings/Themes.js @@ -0,0 +1,216 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function SettingsThemes() +{ + var + self = this, + oData = RL.data() + ; + + this.mainTheme = oData.mainTheme; + this.customThemeType = ko.observable(RL.settingsGet('CustomThemeType')); + this.customThemeImg = ko.observable(RL.settingsGet('CustomThemeImg')); + + this.themesObjects = ko.observableArray([]); + + this.customThemeUploaderProgress = ko.observable(false); + this.customThemeUploaderButton = ko.observable(null); + + this.showCustomThemeConfig = ko.computed(function () { + return 'Custom' === this.mainTheme(); + }, this); + + this.showCustomThemeConfig.subscribe(function () { + Utils.windowResize(); + }); + + this.themeTrigger = ko.observable(Enums.SaveSettingsStep.Idle).extend({'throttle': 100}); + + this.oLastAjax = null; + this.iTimer = 0; + + RL.data().theme.subscribe(function (sValue) { + + _.each(this.themesObjects(), function (oTheme) { + oTheme.selected(sValue === oTheme.name); + }); + + var + oThemeLink = $('#rlThemeLink'), + oThemeStyle = $('#rlThemeStyle'), + sUrl = oThemeLink.attr('href') + ; + + if (!sUrl) + { + sUrl = oThemeStyle.attr('data-href'); + } + + if (sUrl) + { + sUrl = sUrl.toString().replace(/\/-\/[^\/]+\/\-\//, '/-/' + sValue + '/-/'); + sUrl = sUrl.toString().replace(/\/Css\/[^\/]+\/User\//, '/Css/' + ('Custom' === sValue && window.__rlah ? window.__rlah() || '0' : '0') + '/User/'); + + if ('Json/' !== sUrl.substring(sUrl.length - 5, sUrl.length)) + { + sUrl += 'Json/'; + } + + window.clearTimeout(self.iTimer); + self.themeTrigger(Enums.SaveSettingsStep.Animate); + + if (this.oLastAjax && this.oLastAjax.abort) + { + this.oLastAjax.abort(); + } + + this.oLastAjax = $.ajax({ + 'url': sUrl, + 'dataType': 'json' + }).done(function(aData) { + if (aData && Utils.isArray(aData) && 2 === aData.length) + { + if (oThemeLink && oThemeLink[0] && (!oThemeStyle || !oThemeStyle[0])) + { + oThemeStyle = $(''); + oThemeLink.after(oThemeStyle); + oThemeLink.remove(); + } + + if (oThemeStyle && oThemeStyle[0]) + { + oThemeStyle.attr('data-href', sUrl).attr('data-theme', aData[0]).text(aData[1]); + } + + self.themeTrigger(Enums.SaveSettingsStep.TrueResult); + } + + }).always(function() { + + self.iTimer = window.setTimeout(function () { + self.themeTrigger(Enums.SaveSettingsStep.Idle); + }, 1000); + + self.oLastAjax = null; + }); + } + + RL.remote().saveSettings(null, { + 'Theme': sValue + }); + + }, this); +} + +Utils.addSettingsViewModel(SettingsThemes, 'SettingsThemes', 'SETTINGS_LABELS/LABEL_THEMES_NAME', 'themes'); + +SettingsThemes.prototype.removeCustomThemeImg = function () +{ + this.customThemeImg(''); +}; + +SettingsThemes.prototype.onBuild = function () +{ + var + self = this, + sCurrentTheme = RL.data().theme() + ; + + this.themesObjects(_.map(RL.data().themes(), function (sTheme) { + return { + 'name': sTheme, + 'nameDisplay': Utils.convertThemeName(sTheme), + 'selected': ko.observable(sTheme === sCurrentTheme), + 'themePreviewSrc': RL.link().themePreviewLink(sTheme) + }; + })); + + _.delay(function () { + + self.customThemeType.subscribe(function (sValue) { + RL.remote().saveSettings(function () { + RL.data().theme.valueHasMutated(); + }, { + 'CustomThemeType': sValue + }); + }); + + self.customThemeImg.subscribe(function (sValue) { + RL.remote().saveSettings(function () { + RL.data().theme.valueHasMutated(); + }, { + 'CustomThemeImg': sValue + }); + }); + + }, 50); + + this.initCustomThemeUploader(); +}; + +SettingsThemes.prototype.initCustomThemeUploader = function () +{ + if (this.customThemeUploaderButton()) + { + var + oJua = new Jua({ + 'action': RL.link().uploadBackground(), + 'name': 'uploader', + 'queueSize': 1, + 'multipleSizeLimit': 1, + 'disableFolderDragAndDrop': true, + 'clickElement': this.customThemeUploaderButton(), + 'onSelect': _.bind(function (sId, oData) { + + var + sFileName = Utils.isUnd(oData.FileName) ? '' : oData.FileName.toString(), + sFileNameExt = sFileName.substring(sFileName.length - 4, sFileName.length), + mSize = Utils.isNormal(oData.Size) ? Utils.pInt(oData.Size) : null + ; + + if (-1 === Utils.inArray(sFileNameExt, ['jpeg', '.jpg', '.png'])) + { + window.alert(Utils.i18n('SETTINGS_THEMES/ERROR_FILE_TYPE_ERROR')); + return false; + } + + if (1024 * 1024 < mSize) + { + window.alert(Utils.i18n('SETTINGS_THEMES/ERROR_FILE_IS_TOO_BIG')); + return false; + } + + return true; + + }, this), + + 'onStart': _.bind(function () { + this.customThemeUploaderProgress(true); + }, this), + + 'onComplete': _.bind(function (sId, bResult, oData) { + if (!bResult || !oData || !oData.Result) + { + window.alert( + oData && oData.ErrorCode ? Utils.getUploadErrorDescByCode(oData.ErrorCode) : Utils.getUploadErrorDescByCode(Enums.UploadErrorCode.Unknown) + ); + } + else + { + this.customThemeImg(oData.Result); + } + + this.customThemeUploaderProgress(false); + }, this) + }) + ; + + return !!oJua; + } + + return false; +}; + diff --git a/dev/Storages/AbstractAjaxRemote.js b/dev/Storages/AbstractAjaxRemote.js new file mode 100644 index 000000000..323fa8435 --- /dev/null +++ b/dev/Storages/AbstractAjaxRemote.js @@ -0,0 +1,249 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function AbstractAjaxRemoteStorage() +{ + this.oRequests = {}; +} + +AbstractAjaxRemoteStorage.prototype.oRequests = {}; + +/** + * @param {?Function} fCallback + * @param {string} sRequestAction + * @param {string} sType + * @param {?AjaxJsonDefaultResponse} oData + * @param {boolean} bCached + * @param {*=} oRequestParameters + */ +AbstractAjaxRemoteStorage.prototype.defaultResponse = function (fCallback, sRequestAction, sType, oData, bCached, oRequestParameters) +{ + var + fCall = function () { + if (Enums.StorageResultType.Success !== sType && Globals.bUnload) + { + sType = Enums.StorageResultType.Unload; + } + + if (Enums.StorageResultType.Success === sType && oData && !oData.Result) + { + if (oData && -1 < Utils.inArray(oData.ErrorCode, [ + Enums.Notification.AuthError, Enums.Notification.AccessError, + Enums.Notification.ConnectionError, Enums.Notification.DomainNotAllowed, Enums.Notification.AccountNotAllowed, + Enums.Notification.MailServerError, Enums.Notification.UnknownNotification, Enums.Notification.UnknownError + ])) + { + Globals.iAjaxErrorCount++; + } + + if (oData && Enums.Notification.InvalidToken === oData.ErrorCode) + { + Globals.iTokenErrorCount++; + } + + if (10 < Globals.iTokenErrorCount) + { + RL.loginAndLogoutReload(true); + } + + if (oData.Logout || 7 < Globals.iAjaxErrorCount) + { + if (window.__rlah_clear) + { + window.__rlah_clear(); + } + + RL.loginAndLogoutReload(true); + } + } + else if (Enums.StorageResultType.Success === sType && oData && oData.Result) + { + Globals.iAjaxErrorCount = 0; + Globals.iTokenErrorCount = 0; + } + + if (fCallback) + { + Plugins.runHook('ajax-default-response', [sRequestAction, Enums.StorageResultType.Success === sType ? oData : null, sType, bCached, oRequestParameters]); + + fCallback( + sType, + Enums.StorageResultType.Success === sType ? oData : null, + bCached, + sRequestAction, + oRequestParameters + ); + } + } + ; + + switch (sType) + { + case 'success': + sType = Enums.StorageResultType.Success; + break; + case 'abort': + sType = Enums.StorageResultType.Abort; + break; + default: + sType = Enums.StorageResultType.Error; + break; + } + + if (Enums.StorageResultType.Error === sType) + { + _.delay(fCall, 300); + } + else + { + fCall(); + } +}; + +/** + * @param {?Function} fResultCallback + * @param {Object} oParameters + * @param {?number=} iTimeOut = 20000 + * @param {string=} sGetAdd = '' + * @param {Array=} aAbortActions = [] + * @return {jQuery.jqXHR} + */ +AbstractAjaxRemoteStorage.prototype.ajaxRequest = function (fResultCallback, oParameters, iTimeOut, sGetAdd, aAbortActions) +{ + var + self = this, + bPost = '' === sGetAdd, + oHeaders = {}, + iStart = (new window.Date()).getTime(), + oDefAjax = null, + sAction = '' + ; + + oParameters = oParameters || {}; + iTimeOut = Utils.isNormal(iTimeOut) ? iTimeOut : 20000; + sGetAdd = Utils.isUnd(sGetAdd) ? '' : Utils.pString(sGetAdd); + aAbortActions = Utils.isArray(aAbortActions) ? aAbortActions : []; + + sAction = oParameters.Action || ''; + + if (sAction && 0 < aAbortActions.length) + { + _.each(aAbortActions, function (sActionToAbort) { + if (self.oRequests[sActionToAbort]) + { + self.oRequests[sActionToAbort].__aborted = true; + if (self.oRequests[sActionToAbort].abort) + { + self.oRequests[sActionToAbort].abort(); + } + self.oRequests[sActionToAbort] = null; + } + }); + } + + if (bPost) + { + oParameters['XToken'] = RL.settingsGet('Token'); + } + + oDefAjax = $.ajax({ + 'type': bPost ? 'POST' : 'GET', + 'url': RL.link().ajax(sGetAdd) , + 'async': true, + 'dataType': 'json', + 'data': bPost ? oParameters : {}, + 'headers': oHeaders, + 'timeout': iTimeOut, + 'global': true + }); + + oDefAjax.always(function (oData, sType) { + + var bCached = false; + if (oData && oData['Time']) + { + bCached = Utils.pInt(oData['Time']) > (new window.Date()).getTime() - iStart; + } + + if (sAction && self.oRequests[sAction]) + { + if (self.oRequests[sAction].__aborted) + { + sType = 'abort'; + } + + self.oRequests[sAction] = null; + } + + self.defaultResponse(fResultCallback, sAction, sType, oData, bCached, oParameters); + }); + + if (sAction && 0 < aAbortActions.length && -1 < Utils.inArray(sAction, aAbortActions)) + { + if (this.oRequests[sAction]) + { + this.oRequests[sAction].__aborted = true; + if (this.oRequests[sAction].abort) + { + this.oRequests[sAction].abort(); + } + this.oRequests[sAction] = null; + } + + this.oRequests[sAction] = oDefAjax; + } + + return oDefAjax; +}; + +/** + * @param {?Function} fCallback + * @param {string} sAction + * @param {Object=} oParameters + * @param {?number=} iTimeout + * @param {string=} sGetAdd = '' + * @param {Array=} aAbortActions = [] + */ +AbstractAjaxRemoteStorage.prototype.defaultRequest = function (fCallback, sAction, oParameters, iTimeout, sGetAdd, aAbortActions) +{ + oParameters = oParameters || {}; + oParameters.Action = sAction; + + sGetAdd = Utils.pString(sGetAdd); + + Plugins.runHook('ajax-default-request', [sAction, oParameters, sGetAdd]); + + this.ajaxRequest(fCallback, oParameters, + Utils.isUnd(iTimeout) ? Consts.Defaults.DefaultAjaxTimeout : Utils.pInt(iTimeout), sGetAdd, aAbortActions); +}; + +/** + * @param {?Function} fCallback + */ +AbstractAjaxRemoteStorage.prototype.noop = function (fCallback) +{ + this.defaultRequest(fCallback, 'Noop'); +}; + +/** + * @param {?Function} fCallback + * @param {string} sMessage + * @param {string} sFileName + * @param {number} iLineNo + * @param {string} sLocation + * @param {string} sHtmlCapa + * @param {number} iTime + */ +AbstractAjaxRemoteStorage.prototype.jsError = function (fCallback, sMessage, sFileName, iLineNo, sLocation, sHtmlCapa, iTime) +{ + this.defaultRequest(fCallback, 'JsError', { + 'Message': sMessage, + 'FileName': sFileName, + 'LineNo': iLineNo, + 'Location': sLocation, + 'HtmlCapa': sHtmlCapa, + 'TimeOnPage': iTime + }); +}; diff --git a/dev/Storages/AbstractCache.js b/dev/Storages/AbstractCache.js new file mode 100644 index 000000000..1e2f5a58d --- /dev/null +++ b/dev/Storages/AbstractCache.js @@ -0,0 +1,67 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function AbstractCacheStorage() +{ + this.oEmailsPicsHashes = {}; + this.oServices = {}; +} +/** + * @type {Object} + */ +AbstractCacheStorage.prototype.oEmailsPicsHashes = {}; + +/** + * @type {Object} + */ +AbstractCacheStorage.prototype.oServices = {}; + +AbstractCacheStorage.prototype.clear = function () +{ + this.oServices = {}; + this.oEmailsPicsHashes = {}; +}; + +/** + * @param {string} sEmail + * @return {string} + */ +AbstractCacheStorage.prototype.getUserPic = function (sEmail) +{ + var + sUrl = '', + sService = '', + sEmailLower = sEmail.toLowerCase(), + sPicHash = Utils.isUnd(this.oEmailsPicsHashes[sEmail]) ? '' : this.oEmailsPicsHashes[sEmail] + ; + + if ('' === sPicHash) + { + sService = sEmailLower.substr(sEmail.indexOf('@') + 1); + sUrl = '' !== sService && this.oServices[sService] ? this.oServices[sService] : ''; + } + else + { + sUrl = RL.link().getUserPicUrlFromHash(sPicHash); + } + + return sUrl; +}; + +/** + * @param {Object} oData + */ +AbstractCacheStorage.prototype.setServicesData = function (oData) +{ + this.oServices = oData; +}; + +/** + * @param {Object} oData + */ +AbstractCacheStorage.prototype.setEmailsPicsHashesData = function (oData) +{ + this.oEmailsPicsHashes = oData; +}; diff --git a/dev/Storages/AbstractData.js b/dev/Storages/AbstractData.js new file mode 100644 index 000000000..b2adde0d3 --- /dev/null +++ b/dev/Storages/AbstractData.js @@ -0,0 +1,70 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function AbstractData() +{ + Utils.initDataConstructorBySettings(this); +} + +AbstractData.prototype.populateDataOnStart = function() +{ + var + aLanguages = RL.settingsGet('Languages'), + aThemes = RL.settingsGet('Themes') + ; + + if (Utils.isArray(aLanguages)) + { + this.languages(aLanguages); + } + + if (Utils.isArray(aThemes)) + { + this.themes(aThemes); + } + + this.mainLanguage(RL.settingsGet('Language')); + this.mainTheme(RL.settingsGet('Theme')); + + this.allowCustomTheme(!!RL.settingsGet('AllowCustomTheme')); + this.allowAdditionalAccounts(!!RL.settingsGet('AllowAdditionalAccounts')); + this.allowIdentities(!!RL.settingsGet('AllowIdentities')); + this.determineUserLanguage(!!RL.settingsGet('DetermineUserLanguage')); + + this.allowThemes(!!RL.settingsGet('AllowThemes')); + this.allowCustomLogin(!!RL.settingsGet('AllowCustomLogin')); + this.allowLanguagesOnLogin(!!RL.settingsGet('AllowLanguagesOnLogin')); + this.allowLanguagesOnSettings(!!RL.settingsGet('AllowLanguagesOnSettings')); + + this.editorDefaultType(RL.settingsGet('EditorDefaultType')); + this.showImages(!!RL.settingsGet('ShowImages')); + this.interfaceAnimation(RL.settingsGet('InterfaceAnimation')); + + this.mainMessagesPerPage(RL.settingsGet('MPP')); + + this.desktopNotifications(!!RL.settingsGet('DesktopNotifications')); + this.useThreads(!!RL.settingsGet('UseThreads')); + this.replySameFolder(!!RL.settingsGet('ReplySameFolder')); + this.usePreviewPane(!!RL.settingsGet('UsePreviewPane')); + this.useCheckboxesInList(!!RL.settingsGet('UseCheckboxesInList')); + + this.facebookEnable(!!RL.settingsGet('AllowFacebookSocial')); + this.facebookAppID(RL.settingsGet('FacebookAppID')); + this.facebookAppSecret(RL.settingsGet('FacebookAppSecret')); + + this.twitterEnable(!!RL.settingsGet('AllowTwitterSocial')); + this.twitterConsumerKey(RL.settingsGet('TwitterConsumerKey')); + this.twitterConsumerSecret(RL.settingsGet('TwitterConsumerSecret')); + + this.googleEnable(!!RL.settingsGet('AllowGoogleSocial')); + this.googleClientID(RL.settingsGet('GoogleClientID')); + this.googleClientSecret(RL.settingsGet('GoogleClientSecret')); + + this.dropboxEnable(!!RL.settingsGet('AllowDropboxSocial')); + this.dropboxApiKey(RL.settingsGet('DropboxApiKey')); + + this.contactsIsSupported(!!RL.settingsGet('ContactsIsSupported')); + this.contactsIsAllowed(!!RL.settingsGet('ContactsIsAllowed')); +}; diff --git a/dev/Storages/AdminAjaxRemote.js b/dev/Storages/AdminAjaxRemote.js new file mode 100644 index 000000000..661449869 --- /dev/null +++ b/dev/Storages/AdminAjaxRemote.js @@ -0,0 +1,236 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends AbstractAjaxRemoteStorage + */ +function AdminAjaxRemoteStorage() +{ + AbstractAjaxRemoteStorage.call(this); + + this.oRequests = {}; +} + +_.extend(AdminAjaxRemoteStorage.prototype, AbstractAjaxRemoteStorage.prototype); + +/** + * @param {?Function} fCallback + * @param {string} sLogin + * @param {string} sPassword + */ +AdminAjaxRemoteStorage.prototype.adminLogin = function (fCallback, sLogin, sPassword) +{ + this.defaultRequest(fCallback, 'AdminLogin', { + 'Login': sLogin, + 'Password': sPassword + }); +}; + +/** + * @param {?Function} fCallback + */ +AdminAjaxRemoteStorage.prototype.adminLogout = function (fCallback) +{ + this.defaultRequest(fCallback, 'AdminLogout'); +}; + +/** + * @param {?Function} fCallback + * @param {?} oData + */ +AdminAjaxRemoteStorage.prototype.saveAdminConfig = function (fCallback, oData) +{ + this.defaultRequest(fCallback, 'AdminSettingsUpdate', oData); +}; + +/** + * @param {?Function} fCallback + */ +AdminAjaxRemoteStorage.prototype.domainList = function (fCallback) +{ + this.defaultRequest(fCallback, 'AdminDomainList'); +}; + +/** + * @param {?Function} fCallback + */ +AdminAjaxRemoteStorage.prototype.pluginList = function (fCallback) +{ + this.defaultRequest(fCallback, 'AdminPluginList'); +}; + +/** + * @param {?Function} fCallback + */ +AdminAjaxRemoteStorage.prototype.packagesList = function (fCallback) +{ + this.defaultRequest(fCallback, 'AdminPackagesList'); +}; + +/** + * @param {?Function} fCallback + * @param {Object} oPackage + */ +AdminAjaxRemoteStorage.prototype.packageInstall = function (fCallback, oPackage) +{ + this.defaultRequest(fCallback, 'AdminPackageInstall', { + 'Id': oPackage.id, + 'Type': oPackage.type, + 'File': oPackage.file + }, 60000); +}; + +/** + * @param {?Function} fCallback + * @param {Object} oPackage + */ +AdminAjaxRemoteStorage.prototype.packageDelete = function (fCallback, oPackage) +{ + this.defaultRequest(fCallback, 'AdminPackageDelete', { + 'Id': oPackage.id + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sName + */ +AdminAjaxRemoteStorage.prototype.domain = function (fCallback, sName) +{ + this.defaultRequest(fCallback, 'AdminDomainLoad', { + 'Name': sName + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sName + */ +AdminAjaxRemoteStorage.prototype.plugin = function (fCallback, sName) +{ + this.defaultRequest(fCallback, 'AdminPluginLoad', { + 'Name': sName + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sName + */ +AdminAjaxRemoteStorage.prototype.domainDelete = function (fCallback, sName) +{ + this.defaultRequest(fCallback, 'AdminDomainDelete', { + 'Name': sName + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sName + * @param {boolean} bDisabled + */ +AdminAjaxRemoteStorage.prototype.domainDisable = function (fCallback, sName, bDisabled) +{ + return this.defaultRequest(fCallback, 'AdminDomainDisable', { + 'Name': sName, + 'Disabled': !!bDisabled ? '1' : '0' + }); +}; + +/** + * @param {?Function} fCallback + * @param {Object} oConfig + */ +AdminAjaxRemoteStorage.prototype.pluginSettingsUpdate = function (fCallback, oConfig) +{ + return this.defaultRequest(fCallback, 'AdminPluginSettingsUpdate', oConfig); +}; + +/** + * @param {?Function} fCallback + * @param {boolean} bForce + */ +AdminAjaxRemoteStorage.prototype.licensing = function (fCallback, bForce) +{ + return this.defaultRequest(fCallback, 'AdminLicensing', { + 'Force' : bForce ? '1' : '0' + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sDomain + * @param {string} sKey + */ +AdminAjaxRemoteStorage.prototype.licensingActivate = function (fCallback, sDomain, sKey) +{ + return this.defaultRequest(fCallback, 'AdminLicensingActivate', { + 'Domain' : sDomain, + 'Key' : sKey + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sName + * @param {boolean} bDisabled + */ +AdminAjaxRemoteStorage.prototype.pluginDisable = function (fCallback, sName, bDisabled) +{ + return this.defaultRequest(fCallback, 'AdminPluginDisable', { + 'Name': sName, + 'Disabled': !!bDisabled ? '1' : '0' + }); +}; + +AdminAjaxRemoteStorage.prototype.createOrUpdateDomain = function (fCallback, + bCreate, sName, sIncHost, iIncPort, sIncSecure, bIncShortLogin, + sOutHost, iOutPort, sOutSecure, bOutShortLogin, bOutAuth, sWhiteList) +{ + this.defaultRequest(fCallback, 'AdminDomainSave', { + 'Create': bCreate ? '1' : '0', + 'Name': sName, + 'IncHost': sIncHost, + 'IncPort': iIncPort, + 'IncSecure': sIncSecure, + 'IncShortLogin': bIncShortLogin ? '1' : '0', + 'OutHost': sOutHost, + 'OutPort': iOutPort, + 'OutSecure': sOutSecure, + 'OutShortLogin': bOutShortLogin ? '1' : '0', + 'OutAuth': bOutAuth ? '1' : '0', + 'WhiteList': sWhiteList + }); +}; + +AdminAjaxRemoteStorage.prototype.testConnectionForDomain = function (fCallback, + sIncHost, iIncPort, sIncSecure, + sOutHost, iOutPort, sOutSecure, bOutAuth) +{ + this.defaultRequest(fCallback, 'AdminDomainTest', { + 'IncHost': sIncHost, + 'IncPort': iIncPort, + 'IncSecure': sIncSecure, + 'OutHost': sOutHost, + 'OutPort': iOutPort, + 'OutSecure': sOutSecure, + 'OutAuth': bOutAuth ? '1' : '0' + }); +}; + +/** + * @param {?Function} fCallback + * @param {?} oData + */ +AdminAjaxRemoteStorage.prototype.saveNewAdminPassword = function (fCallback, oData) +{ + this.defaultRequest(fCallback, 'AdminPasswordUpdate', oData); +}; + +/** + * @param {?Function} fCallback + */ +AdminAjaxRemoteStorage.prototype.adminPing = function (fCallback) +{ + this.defaultRequest(fCallback, 'AdminPing'); +}; diff --git a/dev/Storages/AdminCache.js b/dev/Storages/AdminCache.js new file mode 100644 index 000000000..152e99ab7 --- /dev/null +++ b/dev/Storages/AdminCache.js @@ -0,0 +1,12 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends AbstractCacheStorage + */ +function AdminCacheStorage() +{ + AbstractCacheStorage.call(this); +} + +_.extend(AdminCacheStorage.prototype, AbstractCacheStorage.prototype); diff --git a/dev/Storages/AdminData.js b/dev/Storages/AdminData.js new file mode 100644 index 000000000..b738a7f31 --- /dev/null +++ b/dev/Storages/AdminData.js @@ -0,0 +1,36 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends AbstractData + */ +function AdminDataStorage() +{ + AbstractData.call(this); + + this.domainsLoading = ko.observable(false).extend({'throttle': 100}); + this.domains = ko.observableArray([]); + + this.pluginsLoading = ko.observable(false).extend({'throttle': 100}); + this.plugins = ko.observableArray([]); + + this.packagesReal = ko.observable(true); + this.packagesMainUpdatable = ko.observable(true); + this.packagesLoading = ko.observable(false).extend({'throttle': 100}); + this.packages = ko.observableArray([]); + + this.licensing = ko.observable(false); + this.licensingProcess = ko.observable(false); + this.licenseValid = ko.observable(false); + this.licenseExpired = ko.observable(0); + this.licenseError = ko.observable(''); + + this.licenseTrigger = ko.observable(false); +} + +_.extend(AdminDataStorage.prototype, AbstractData.prototype); + +AdminDataStorage.prototype.populateDataOnStart = function() +{ + AbstractData.prototype.populateDataOnStart.call(this); +}; \ No newline at end of file diff --git a/dev/Storages/LocalStorage.js b/dev/Storages/LocalStorage.js new file mode 100644 index 000000000..988460812 --- /dev/null +++ b/dev/Storages/LocalStorage.js @@ -0,0 +1,44 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function LocalStorage() +{ + var + sStorages = [ + LocalStorageDriver, + CookieDriver + ], + NextStorageDriver = _.find(sStorages, function (NextStorageDriver) { + return NextStorageDriver.supported(); + }) + ; + + if (NextStorageDriver) + { + NextStorageDriver = /** @type {?Function} */ NextStorageDriver; + this.oDriver = new NextStorageDriver(); + } +} + +LocalStorage.prototype.oDriver = null; + +/** + * @param {number} iKey + * @param {*} mData + * @return {boolean} + */ +LocalStorage.prototype.set = function (iKey, mData) +{ + return this.oDriver ? this.oDriver.set('p' + iKey, mData) : false; +}; + +/** + * @param {number} iKey + * @return {*} + */ +LocalStorage.prototype.get = function (iKey) +{ + return this.oDriver ? this.oDriver.get('p' + iKey) : null; +}; diff --git a/dev/Storages/LocalStorages/CookieDriver.js b/dev/Storages/LocalStorages/CookieDriver.js new file mode 100644 index 000000000..fb4f46698 --- /dev/null +++ b/dev/Storages/LocalStorages/CookieDriver.js @@ -0,0 +1,75 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function CookieDriver() +{ + +} + +CookieDriver.supported = function () +{ + return true; +}; + +/** + * @param {string} sKey + * @param {*} mData + * @returns {boolean} + */ +CookieDriver.prototype.set = function (sKey, mData) +{ + var + mCokieValue = $.cookie(Consts.Values.ClientSideCookieIndexName), + bResult = false, + mResult = null + ; + + try + { + mResult = null === mCokieValue ? null : JSON.parse(mCokieValue); + if (!mResult) + { + mResult = {}; + } + + mResult[sKey] = mData; + $.cookie(Consts.Values.ClientSideCookieIndexName, JSON.stringify(mResult), { + 'expires': 30 + }); + + bResult = true; + } + catch (oException) {} + + return bResult; +}; + +/** + * @param {string} sKey + * @returns {*} + */ +CookieDriver.prototype.get = function (sKey) +{ + var + mCokieValue = $.cookie(Consts.Values.ClientSideCookieIndexName), + mResult = null + ; + + try + { + mResult = null === mCokieValue ? null : JSON.parse(mCokieValue); + if (mResult && !Utils.isUnd(mResult[sKey])) + { + mResult = mResult[sKey]; + } + else + { + mResult = null; + } + } + catch (oException) {} + + return mResult; +}; diff --git a/dev/Storages/LocalStorages/LocalStorageDriver.js b/dev/Storages/LocalStorages/LocalStorageDriver.js new file mode 100644 index 000000000..7692cb255 --- /dev/null +++ b/dev/Storages/LocalStorages/LocalStorageDriver.js @@ -0,0 +1,73 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + */ +function LocalStorageDriver() +{ +} + +LocalStorageDriver.supported = function () +{ + return !!window.localStorage; +}; + + +/** + * @param {string} sKey + * @param {*} mData + * @returns {boolean} + */ +LocalStorageDriver.prototype.set = function (sKey, mData) +{ + var + mCokieValue = window.localStorage[Consts.Values.ClientSideCookieIndexName] || null, + bResult = false, + mResult = null + ; + + try + { + mResult = null === mCokieValue ? null : JSON.parse(mCokieValue); + if (!mResult) + { + mResult = {}; + } + + mResult[sKey] = mData; + window.localStorage[Consts.Values.ClientSideCookieIndexName] = JSON.stringify(mResult); + + bResult = true; + } + catch (oException) {} + + return bResult; +}; + +/** + * @param {string} sKey + * @returns {*} + */ +LocalStorageDriver.prototype.get = function (sKey) +{ + var + mCokieValue = window.localStorage[Consts.Values.ClientSideCookieIndexName] || null, + mResult = null + ; + + try + { + mResult = null === mCokieValue ? null : JSON.parse(mCokieValue); + if (mResult && !Utils.isUnd(mResult[sKey])) + { + mResult = mResult[sKey]; + } + else + { + mResult = null; + } + } + catch (oException) {} + + return mResult; +}; diff --git a/dev/Storages/WebMailAjaxRemote.js b/dev/Storages/WebMailAjaxRemote.js new file mode 100644 index 000000000..207323ff3 --- /dev/null +++ b/dev/Storages/WebMailAjaxRemote.js @@ -0,0 +1,660 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends AbstractAjaxRemoteStorage + */ +function WebMailAjaxRemoteStorage() +{ + AbstractAjaxRemoteStorage.call(this); + + this.oRequests = {}; +} + +_.extend(WebMailAjaxRemoteStorage.prototype, AbstractAjaxRemoteStorage.prototype); + +/** + * @param {?Function} fCallback + * @param {boolean=} bUseCache = true + */ +WebMailAjaxRemoteStorage.prototype.folders = function (fCallback, bUseCache) +{ + var sFoldersHash = RL.data().lastFoldersHash; + + bUseCache = Utils.isUnd(bUseCache) ? false : !!bUseCache; + if (bUseCache && '' !== sFoldersHash) + { + this.defaultRequest(fCallback, 'Folders', {}, null, 'Folders/' + RL.data().projectHash() + '-' + sFoldersHash, ['Folders']); + } + else + { + this.defaultRequest(fCallback, 'Folders', {}, null, '', ['Folders']); + } +}; + +/** + * @param {?Function} fCallback + * @param {string} sEmail + * @param {string} sLogin + * @param {string} sPassword + * @param {boolean} bSignMe + * @param {string=} sLanguage + */ +WebMailAjaxRemoteStorage.prototype.login = function (fCallback, sEmail, sLogin, sPassword, bSignMe, sLanguage) +{ + this.defaultRequest(fCallback, 'Login', { + 'Email': sEmail, + 'Login': sLogin, + 'Password': sPassword, + 'Language': sLanguage || '', + 'SignMe': bSignMe ? '1' : '0' + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sEmail + * @param {string} sLogin + * @param {string} sPassword + */ +WebMailAjaxRemoteStorage.prototype.accountAdd = function (fCallback, sEmail, sLogin, sPassword) +{ + this.defaultRequest(fCallback, 'AccountAdd', { + 'Email': sEmail, + 'Login': sLogin, + 'Password': sPassword + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sEmailToDelete + */ +WebMailAjaxRemoteStorage.prototype.accountDelete = function (fCallback, sEmailToDelete) +{ + this.defaultRequest(fCallback, 'AccountDelete', { + 'EmailToDelete': sEmailToDelete + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sId + * @param {string} sEmail + * @param {string} sName + * @param {string} sReplyTo + * @param {string} sBcc + */ +WebMailAjaxRemoteStorage.prototype.identityUpdate = function (fCallback, sId, sEmail, sName, sReplyTo, sBcc) +{ + this.defaultRequest(fCallback, 'IdentityUpdate', { + 'Id': sId, + 'Email': sEmail, + 'Name': sName, + 'ReplyTo': sReplyTo, + 'Bcc': sBcc + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sIdToDelete + */ +WebMailAjaxRemoteStorage.prototype.identityDelete = function (fCallback, sIdToDelete) +{ + this.defaultRequest(fCallback, 'IdentityDelete', { + 'IdToDelete': sIdToDelete + }); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.accountsAndIdentities = function (fCallback) +{ + this.defaultRequest(fCallback, 'AccountsAndIdentities'); +}; + +/** + * @param {?Function} fCallback + * @param {string} sFolderFullNameRaw + * @param {number=} iOffset = 0 + * @param {number=} iLimit = 20 + * @param {string=} sSearch = '' + * @param {boolean=} bSilent = false + */ +WebMailAjaxRemoteStorage.prototype.messageList = function (fCallback, sFolderFullNameRaw, iOffset, iLimit, sSearch, bSilent) +{ + sFolderFullNameRaw = Utils.pString(sFolderFullNameRaw); + + var + oData = RL.data(), + sFolderHash = RL.cache().getFolderHash(sFolderFullNameRaw) + ; + + bSilent = Utils.isUnd(bSilent) ? false : !!bSilent; + iOffset = Utils.isUnd(iOffset) ? 0 : Utils.pInt(iOffset); + iLimit = Utils.isUnd(iOffset) ? 20 : Utils.pInt(iLimit); + sSearch = Utils.pString(sSearch); + + if ('' !== sFolderHash) + { + this.defaultRequest(fCallback, 'MessageList', {}, + '' === sSearch ? Consts.Defaults.DefaultAjaxTimeout : Consts.Defaults.SearchAjaxTimeout, + 'MessageList/' + Base64.urlsafe_encode([ + sFolderFullNameRaw, + iOffset, + iLimit, + sSearch, + oData.projectHash(), + sFolderHash, + 'INBOX' === sFolderFullNameRaw ? RL.cache().getFolderUidNext(sFolderFullNameRaw) : '', + oData.threading() && oData.useThreads() ? '1' : '0', + oData.threading() && sFolderFullNameRaw === oData.messageListThreadFolder() ? oData.messageListThreadUids().join(',') : '' + ].join(String.fromCharCode(0))), bSilent ? [] : ['MessageList']); + } + else + { + this.defaultRequest(fCallback, 'MessageList', { + 'Folder': sFolderFullNameRaw, + 'Offset': iOffset, + 'Limit': iLimit, + 'Search': sSearch, + 'UidNext': 'INBOX' === sFolderFullNameRaw ? RL.cache().getFolderUidNext(sFolderFullNameRaw) : '', + 'UseThreads': RL.data().threading() && RL.data().useThreads() ? '1' : '0', + 'ExpandedThreadUid': oData.threading() && sFolderFullNameRaw === oData.messageListThreadFolder() ? oData.messageListThreadUids().join(',') : '' + }, '' === sSearch ? Consts.Defaults.DefaultAjaxTimeout : Consts.Defaults.SearchAjaxTimeout, '', bSilent ? [] : ['MessageList']); + } +}; + +/** + * @param {?Function} fCallback + * @param {Array} aDownloads + */ +WebMailAjaxRemoteStorage.prototype.messageUploadAttachments = function (fCallback, aDownloads) +{ + this.defaultRequest(fCallback, 'MessageUploadAttachments', { + 'Attachments': aDownloads + }, 999000); +}; + +/** + * @param {?Function} fCallback + * @param {string} sFolderFullNameRaw + * @param {number} iUid + * @return {boolean} + */ +WebMailAjaxRemoteStorage.prototype.message = function (fCallback, sFolderFullNameRaw, iUid) +{ + sFolderFullNameRaw = Utils.pString(sFolderFullNameRaw); + iUid = Utils.pInt(iUid); + + if (RL.cache().getFolderFromCacheList(sFolderFullNameRaw) && 0 < iUid) + { + this.defaultRequest(fCallback, 'Message', {}, null, + 'Message/' + Base64.urlsafe_encode([ + sFolderFullNameRaw, + iUid, + RL.data().projectHash(), + RL.data().threading() && RL.data().useThreads() ? '1' : '0' + ].join(String.fromCharCode(0))), ['Message']); + + return true; + } + + return false; +}; + +/** + * @param {?Function} fCallback + * @param {Array} aExternals + */ +WebMailAjaxRemoteStorage.prototype.composeUploadExternals = function (fCallback, aExternals) +{ + this.defaultRequest(fCallback, 'ComposeUploadExternals', { + 'Externals': aExternals + }, 999000); +}; + +/** + * @param {?Function} fCallback + * @param {string} sFolder + * @param {Array=} aList = [] + */ +WebMailAjaxRemoteStorage.prototype.folderInformation = function (fCallback, sFolder, aList) +{ + var + bRequest = true, + oCache = RL.cache(), + aUids = [] + ; + + if (Utils.isArray(aList) && 0 < aList.length) + { + bRequest = false; + _.each(aList, function (oMessageListItem) { + if (!oCache.getMessageFlagsFromCache(oMessageListItem.folderFullNameRaw, oMessageListItem.uid)) + { + aUids.push(oMessageListItem.uid); + } + + if (0 < oMessageListItem.threads().length) + { + _.each(oMessageListItem.threads(), function (sUid) { + if (!oCache.getMessageFlagsFromCache(oMessageListItem.folderFullNameRaw, sUid)) + { + aUids.push(sUid); + } + }); + } + }); + + if (0 < aUids.length) + { + bRequest = true; + } + } + + if (bRequest) + { + this.defaultRequest(fCallback, 'FolderInformation', { + 'Folder': sFolder, + 'FlagsUids': Utils.isArray(aUids) ? aUids.join(',') : '', + 'UidNext': 'INBOX' === sFolder ? RL.cache().getFolderUidNext(sFolder) : '' + }); + } + else if (RL.data().useThreads()) + { + RL.reloadFlagsCurrentMessageListAndMessageFromCache(); + } +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.logout = function (fCallback) +{ + this.defaultRequest(fCallback, 'Logout'); +}; + +/** + * @param {?Function} fCallback + * @param {string} sFolderFullNameRaw + * @param {Array} aUids + * @param {boolean} bSetFlagged + */ +WebMailAjaxRemoteStorage.prototype.messageSetFlagged = function (fCallback, sFolderFullNameRaw, aUids, bSetFlagged) +{ + this.defaultRequest(fCallback, 'MessageSetFlagged', { + 'Folder': sFolderFullNameRaw, + 'Uids': aUids.join(','), + 'SetAction': bSetFlagged ? '1' : '0' + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sFolderFullNameRaw + * @param {Array} aUids + * @param {boolean} bSetSeen + */ +WebMailAjaxRemoteStorage.prototype.messageSetSeen = function (fCallback, sFolderFullNameRaw, aUids, bSetSeen) +{ + this.defaultRequest(fCallback, 'MessageSetSeen', { + 'Folder': sFolderFullNameRaw, + 'Uids': aUids.join(','), + 'SetAction': bSetSeen ? '1' : '0' + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sFolderFullNameRaw + * @param {boolean} bSetSeen + */ +WebMailAjaxRemoteStorage.prototype.messageSetSeenToAll = function (fCallback, sFolderFullNameRaw, bSetSeen) +{ + this.defaultRequest(fCallback, 'MessageSetSeenToAll', { + 'Folder': sFolderFullNameRaw, + 'SetAction': bSetSeen ? '1' : '0' + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sMessageFolder + * @param {string} sMessageUid + * @param {string} sMessageID + * @param {string} sDraftFolder + * @param {string} sFrom + * @param {string} sTo + * @param {string} sCc + * @param {string} sBcc + * @param {string} sSubject + * @param {boolean} bTextIsHtml + * @param {string} sText + * @param {Array} aAttachments + * @param {(Array|null)} aDraftInfo + * @param {string} sInReplyTo + * @param {string} sReferences + */ +WebMailAjaxRemoteStorage.prototype.saveMessage = function (fCallback, sMessageFolder, sMessageUid, sMessageID, sDraftFolder, + sFrom, sTo, sCc, sBcc, sSubject, bTextIsHtml, sText, aAttachments, aDraftInfo, sInReplyTo, sReferences) +{ + this.defaultRequest(fCallback, 'SaveMessage', { + 'MessageFolder': sMessageFolder, + 'MessageUid': sMessageUid, + 'MessageID': sMessageID, + 'DraftFolder': sDraftFolder, + 'From': sFrom, + 'To': sTo, + 'Cc': sCc, + 'Bcc': sBcc, + 'Subject': sSubject, + 'TextIsHtml': bTextIsHtml ? '1' : '0', + 'Text': sText, + 'DraftInfo': aDraftInfo, + 'InReplyTo': sInReplyTo, + 'References': sReferences, + 'Attachments': aAttachments + }, Consts.Defaults.SaveMessageAjaxTimeout); +}; + +/** + * @param {?Function} fCallback + * @param {string} sMessageFolder + * @param {string} sMessageUid + * @param {string} sMessageID + * @param {string} sSentFolder + * @param {string} sFrom + * @param {string} sTo + * @param {string} sCc + * @param {string} sBcc + * @param {string} sSubject + * @param {boolean} bTextIsHtml + * @param {string} sText + * @param {Array} aAttachments + * @param {(Array|null)} aDraftInfo + * @param {string} sInReplyTo + * @param {string} sReferences + */ +WebMailAjaxRemoteStorage.prototype.sendMessage = function (fCallback, sMessageFolder, sMessageUid, sMessageID, sSentFolder, + sFrom, sTo, sCc, sBcc, sSubject, bTextIsHtml, sText, aAttachments, aDraftInfo, sInReplyTo, sReferences) +{ + this.defaultRequest(fCallback, 'SendMessage', { + 'MessageFolder': sMessageFolder, + 'MessageUid': sMessageUid, + 'MessageID': sMessageID, + 'SentFolder': sSentFolder, + 'From': sFrom, + 'To': sTo, + 'Cc': sCc, + 'Bcc': sBcc, + 'Subject': sSubject, + 'TextIsHtml': bTextIsHtml ? '1' : '0', + 'Text': sText, + 'DraftInfo': aDraftInfo, + 'InReplyTo': sInReplyTo, + 'References': sReferences, + 'Attachments': aAttachments + }, Consts.Defaults.SendMessageAjaxTimeout); +}; + +/** + * @param {?Function} fCallback + * @param {Object} oData + */ +WebMailAjaxRemoteStorage.prototype.saveSystemFolders = function (fCallback, oData) +{ + this.defaultRequest(fCallback, 'SystemFoldersUpdate', oData); +}; + +/** + * @param {?Function} fCallback + * @param {Object} oData + */ +WebMailAjaxRemoteStorage.prototype.saveSettings = function (fCallback, oData) +{ + this.defaultRequest(fCallback, 'SettingsUpdate', oData); +}; + +/** + * @param {?Function} fCallback + * @param {string} sPrevPassword + * @param {string} sNewPassword + */ +WebMailAjaxRemoteStorage.prototype.changePassword = function (fCallback, sPrevPassword, sNewPassword) +{ + this.defaultRequest(fCallback, 'ChangePassword', { + 'PrevPassword': sPrevPassword, + 'NewPassword': sNewPassword + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sNewFolderName + * @param {string} sParentName + */ +WebMailAjaxRemoteStorage.prototype.folderCreate = function (fCallback, sNewFolderName, sParentName) +{ + this.defaultRequest(fCallback, 'FolderCreate', { + 'Folder': sNewFolderName, + 'Parent': sParentName + }, null, '', ['Folders']); +}; + +/** + * @param {?Function} fCallback + * @param {string} sFolderFullNameRaw + */ +WebMailAjaxRemoteStorage.prototype.folderDelete = function (fCallback, sFolderFullNameRaw) +{ + this.defaultRequest(fCallback, 'FolderDelete', { + 'Folder': sFolderFullNameRaw + }, null, '', ['Folders']); +}; + +/** + * @param {?Function} fCallback + * @param {string} sPrevFolderFullNameRaw + * @param {string} sNewFolderName + */ +WebMailAjaxRemoteStorage.prototype.folderRename = function (fCallback, sPrevFolderFullNameRaw, sNewFolderName) +{ + this.defaultRequest(fCallback, 'FolderRename', { + 'Folder': sPrevFolderFullNameRaw, + 'NewFolderName': sNewFolderName + }, null, '', ['Folders']); +}; + +/** + * @param {?Function} fCallback + * @param {string} sFolderFullNameRaw + */ +WebMailAjaxRemoteStorage.prototype.folderClear = function (fCallback, sFolderFullNameRaw) +{ + this.defaultRequest(fCallback, 'FolderClear', { + 'Folder': sFolderFullNameRaw + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sFolderFullNameRaw + * @param {boolean} bSubscribe + */ +WebMailAjaxRemoteStorage.prototype.folderSetSubscribe = function (fCallback, sFolderFullNameRaw, bSubscribe) +{ + this.defaultRequest(fCallback, 'FolderSubscribe', { + 'Folder': sFolderFullNameRaw, + 'Subscribe': bSubscribe ? '1' : '0' + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sFolder + * @param {string} sToFolder + * @param {Array} aUids + */ +WebMailAjaxRemoteStorage.prototype.messagesMove = function (fCallback, sFolder, sToFolder, aUids) +{ + this.defaultRequest(fCallback, 'MessageMove', { + 'FromFolder': sFolder, + 'ToFolder': sToFolder, + 'Uids': aUids.join(',') + }, null, '', ['MessageList', 'Message']); +}; + +/** + * @param {?Function} fCallback + * @param {string} sFolder + * @param {Array} aUids + */ +WebMailAjaxRemoteStorage.prototype.messagesDelete = function (fCallback, sFolder, aUids) +{ + this.defaultRequest(fCallback, 'MessageDelete', { + 'Folder': sFolder, + 'Uids': aUids.join(',') + }, null, '', ['MessageList', 'Message']); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.appDelayStart = function (fCallback) +{ + this.defaultRequest(fCallback, 'AppDelayStart'); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.quota = function (fCallback) +{ + this.defaultRequest(fCallback, 'Quota'); +}; + +/** + * @param {?Function} fCallback + * @param {string} sSearch + */ +WebMailAjaxRemoteStorage.prototype.contacts = function (fCallback, sSearch) +{ + this.defaultRequest(fCallback, 'Contacts', { + 'Search': sSearch + }, null, '', ['Contacts']); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.contactSave = function (fCallback, sRequestUid, sUid, sName, sEmail, sImageData) +{ + sUid = Utils.trim(sUid); + this.defaultRequest(fCallback, 'ContactSave', { + 'RequestUid': sRequestUid, + 'Uid': sUid, + 'Name': sName, + 'Email': sEmail, + 'ImageData': sImageData + }); +}; + +/** + * @param {?Function} fCallback + * @param {Array} aUids + */ +WebMailAjaxRemoteStorage.prototype.contactsDelete = function (fCallback, aUids) +{ + this.defaultRequest(fCallback, 'ContactsDelete', { + 'Uids': aUids.join(',') + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sQuery + * @param {number} iPage + */ +WebMailAjaxRemoteStorage.prototype.suggestions = function (fCallback, sQuery, iPage) +{ + this.defaultRequest(fCallback, 'Suggestions', { + 'Query': sQuery, + 'Page': iPage + }, null, '', ['Suggestions']); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.servicesPics = function (fCallback) +{ + this.defaultRequest(fCallback, 'ServicesPics'); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.emailsPicsHashes = function (fCallback) +{ + this.defaultRequest(fCallback, 'EmailsPicsHashes'); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.facebookUser = function (fCallback) +{ + this.defaultRequest(fCallback, 'SocialFacebookUserInformation'); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.facebookDisconnect = function (fCallback) +{ + this.defaultRequest(fCallback, 'SocialFacebookDisconnect'); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.twitterUser = function (fCallback) +{ + this.defaultRequest(fCallback, 'SocialTwitterUserInformation'); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.twitterDisconnect = function (fCallback) +{ + this.defaultRequest(fCallback, 'SocialTwitterDisconnect'); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.googleUser = function (fCallback) +{ + this.defaultRequest(fCallback, 'SocialGoogleUserInformation'); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.googleDisconnect = function (fCallback) +{ + this.defaultRequest(fCallback, 'SocialGoogleDisconnect'); +}; + +/** + * @param {?Function} fCallback + */ +WebMailAjaxRemoteStorage.prototype.socialUsers = function (fCallback) +{ + this.defaultRequest(fCallback, 'SocialUsers'); +}; + diff --git a/dev/Storages/WebMailCache.js b/dev/Storages/WebMailCache.js new file mode 100644 index 000000000..06c2053eb --- /dev/null +++ b/dev/Storages/WebMailCache.js @@ -0,0 +1,318 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends AbstractCacheStorage + */ +function WebMailCacheStorage() +{ + AbstractCacheStorage.call(this); + + this.oFoldersCache = {}; + this.oFoldersNamesCache = {}; + this.oFolderHashCache = {}; + this.oFolderUidNextCache = {}; + this.oMessageListHashCache = {}; + this.oMessageFlagsCache = {}; + this.oNewMessage = {}; + this.oRequestedMessage = {}; +} + +_.extend(WebMailCacheStorage.prototype, AbstractCacheStorage.prototype); + +/** + * @type {Object} + */ +WebMailCacheStorage.prototype.oFoldersCache = {}; + +/** + * @type {Object} + */ +WebMailCacheStorage.prototype.oFoldersNamesCache = {}; + +/** + * @type {Object} + */ +WebMailCacheStorage.prototype.oFolderHashCache = {}; + +/** + * @type {Object} + */ +WebMailCacheStorage.prototype.oFolderUidNextCache = {}; + +/** + * @type {Object} + */ +WebMailCacheStorage.prototype.oMessageListHashCache = {}; + +/** + * @type {Object} + */ +WebMailCacheStorage.prototype.oMessageFlagsCache = {}; + +/** + * @type {Object} + */ +WebMailCacheStorage.prototype.oBodies = {}; + +/** + * @type {Object} + */ +WebMailCacheStorage.prototype.oNewMessage = {}; + +/** + * @type {Object} + */ +WebMailCacheStorage.prototype.oRequestedMessage = {}; + +WebMailCacheStorage.prototype.clear = function () +{ + AbstractCacheStorage.prototype.clear.call(this); + + this.oFoldersCache = {}; + this.oFoldersNamesCache = {}; + this.oFolderHashCache = {}; + this.oFolderUidNextCache = {}; + this.oMessageListHashCache = {}; + this.oMessageFlagsCache = {}; + this.oBodies = {}; +}; + +/** + * @param {string} sFolderFullNameRaw + * @param {string} sUid + * @return {string} + */ +WebMailCacheStorage.prototype.getMessageKey = function (sFolderFullNameRaw, sUid) +{ + return sFolderFullNameRaw + '#' + sUid; +}; + +/** + * @param {string} sFolder + * @param {string} sUid + */ +WebMailCacheStorage.prototype.addRequestedMessage = function (sFolder, sUid) +{ + this.oRequestedMessage[this.getMessageKey(sFolder, sUid)] = true; +}; + +/** + * @param {string} sFolder + * @param {string} sUid + * @return {boolean} + */ +WebMailCacheStorage.prototype.hasRequestedMessage = function (sFolder, sUid) +{ + return true === this.oRequestedMessage[this.getMessageKey(sFolder, sUid)]; +}; + +/** + * @param {string} sFolderFullNameRaw + * @param {string} sUid + */ +WebMailCacheStorage.prototype.addNewMessageCache = function (sFolderFullNameRaw, sUid) +{ + this.oNewMessage[this.getMessageKey(sFolderFullNameRaw, sUid)] = true; +}; + +/** + * @param {string} sFolderFullNameRaw + * @param {string} sUid + */ +WebMailCacheStorage.prototype.hasNewMessageAndRemoveFromCache = function (sFolderFullNameRaw, sUid) +{ + if (this.oNewMessage[this.getMessageKey(sFolderFullNameRaw, sUid)]) + { + this.oNewMessage[this.getMessageKey(sFolderFullNameRaw, sUid)] = null; + return true; + } + + return false; +}; + +WebMailCacheStorage.prototype.clearNewMessageCache = function () +{ + this.oNewMessage = {}; +}; + +/** + * @param {string} sFolderHash + * @return {string} + */ +WebMailCacheStorage.prototype.getFolderFullNameRaw = function (sFolderHash) +{ + return '' !== sFolderHash && this.oFoldersNamesCache[sFolderHash] ? this.oFoldersNamesCache[sFolderHash] : ''; +}; + +/** + * @param {string} sFolderHash + * @param {string} sFolderFullNameRaw + */ +WebMailCacheStorage.prototype.setFolderFullNameRaw = function (sFolderHash, sFolderFullNameRaw) +{ + this.oFoldersNamesCache[sFolderHash] = sFolderFullNameRaw; +}; + +/** + * @param {string} sFolderFullNameRaw + * @return {string} + */ +WebMailCacheStorage.prototype.getFolderHash = function (sFolderFullNameRaw) +{ + return '' !== sFolderFullNameRaw && this.oFolderHashCache[sFolderFullNameRaw] ? this.oFolderHashCache[sFolderFullNameRaw] : ''; +}; + +/** + * @param {string} sFolderFullNameRaw + * @param {string} sFolderHash + */ +WebMailCacheStorage.prototype.setFolderHash = function (sFolderFullNameRaw, sFolderHash) +{ + this.oFolderHashCache[sFolderFullNameRaw] = sFolderHash; +}; + +/** + * @param {string} sFolderFullNameRaw + * @return {string} + */ +WebMailCacheStorage.prototype.getFolderUidNext = function (sFolderFullNameRaw) +{ + return '' !== sFolderFullNameRaw && this.oFolderUidNextCache[sFolderFullNameRaw] ? this.oFolderUidNextCache[sFolderFullNameRaw] : ''; +}; + +/** + * @param {string} sFolderFullNameRaw + * @param {string} sUidNext + */ +WebMailCacheStorage.prototype.setFolderUidNext = function (sFolderFullNameRaw, sUidNext) +{ + this.oFolderUidNextCache[sFolderFullNameRaw] = sUidNext; +}; + +/** + * @param {string} sFolderFullNameRaw + * @return {?FolderModel} + */ +WebMailCacheStorage.prototype.getFolderFromCacheList = function (sFolderFullNameRaw) +{ + return '' !== sFolderFullNameRaw && this.oFoldersCache[sFolderFullNameRaw] ? this.oFoldersCache[sFolderFullNameRaw] : null; +}; + +/** + * @param {string} sFolderFullNameRaw + * @param {?FolderModel} oFolder + */ +WebMailCacheStorage.prototype.setFolderToCacheList = function (sFolderFullNameRaw, oFolder) +{ + this.oFoldersCache[sFolderFullNameRaw] = oFolder; +}; + +/** + * @param {string} sFolderFullNameRaw + */ +WebMailCacheStorage.prototype.removeFolderFromCacheList = function (sFolderFullNameRaw) +{ + this.setFolderToCacheList(sFolderFullNameRaw, null); +}; + +/** + * @param {string} sFolderFullName + * @param {string} sUid + * @return {?Array} + */ +WebMailCacheStorage.prototype.getMessageFlagsFromCache = function (sFolderFullName, sUid) +{ + return this.oMessageFlagsCache[sFolderFullName] && this.oMessageFlagsCache[sFolderFullName][sUid] ? + this.oMessageFlagsCache[sFolderFullName][sUid] : null; +}; + +/** + * @param {string} sFolderFullName + * @param {string} sUid + * @param {Array} aFlagsCache + */ +WebMailCacheStorage.prototype.setMessageFlagsToCache = function (sFolderFullName, sUid, aFlagsCache) +{ + if (!this.oMessageFlagsCache[sFolderFullName]) + { + this.oMessageFlagsCache[sFolderFullName] = {}; + } + + this.oMessageFlagsCache[sFolderFullName][sUid] = aFlagsCache; +}; + +/** + * @param {string} sFolderFullName + */ +WebMailCacheStorage.prototype.clearMessageFlagsFromCacheByFolder = function (sFolderFullName) +{ + this.oMessageFlagsCache[sFolderFullName] = {}; +}; + +/** + * @param {(MessageModel|null)} oMessage + */ +WebMailCacheStorage.prototype.initMessageFlagsFromCache = function (oMessage) +{ + if (oMessage) + { + var + self = this, + aFlags = this.getMessageFlagsFromCache(oMessage.folderFullNameRaw, oMessage.uid), + mUnseenSubUid = null, + mFlaggedSubUid = null + ; + + if (aFlags && 4 === aFlags.length) + { + oMessage.unseen(aFlags[0]); + oMessage.flagged(aFlags[1]); + oMessage.answered(aFlags[2]); + oMessage.forwarded(aFlags[3]); + } + + if (0 < oMessage.threads().length) + { + mUnseenSubUid = _.find(oMessage.threads(), function (iSubUid) { + var aFlags = self.getMessageFlagsFromCache(oMessage.folderFullNameRaw, iSubUid); + return aFlags && 4 === aFlags.length && !!aFlags[0]; + }); + + mFlaggedSubUid = _.find(oMessage.threads(), function (iSubUid) { + var aFlags = self.getMessageFlagsFromCache(oMessage.folderFullNameRaw, iSubUid); + return aFlags && 4 === aFlags.length && !!aFlags[1]; + }); + + oMessage.hasUnseenSubMessage(mUnseenSubUid && 0 < Utils.pInt(mUnseenSubUid)); + oMessage.hasFlaggedSubMessage(mFlaggedSubUid && 0 < Utils.pInt(mFlaggedSubUid)); + } + } +}; + +/** + * @param {(MessageModel|null)} oMessage + */ +WebMailCacheStorage.prototype.storeMessageFlagsToCache = function (oMessage) +{ + if (oMessage) + { + this.setMessageFlagsToCache( + oMessage.folderFullNameRaw, + oMessage.uid, + [oMessage.unseen(), oMessage.flagged(), oMessage.answered(), oMessage.forwarded()] + ); + } +}; +/** + * @param {string} sFolder + * @param {string} sUid + * @param {Array} aFlags + */ +WebMailCacheStorage.prototype.storeMessageFlagsToCacheByFolderAndUid = function (sFolder, sUid, aFlags) +{ + if (Utils.isArray(aFlags) && 4 === aFlags.length) + { + this.setMessageFlagsToCache(sFolder, sUid, aFlags); + } +}; diff --git a/dev/Storages/WebMailData.js b/dev/Storages/WebMailData.js new file mode 100644 index 000000000..c36b8edb8 --- /dev/null +++ b/dev/Storages/WebMailData.js @@ -0,0 +1,896 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends AbstractData + */ +function WebMailDataStorage() +{ + AbstractData.call(this); + + var + fRemoveSystemFolderType = function (observable) { + return function () { + var oFolder = RL.cache().getFolderFromCacheList(observable()); + if (oFolder) + { + oFolder.type(Enums.FolderType.User); + } + }; + }, + fSetSystemFolderType = function (iType) { + return function (sValue) { + var oFolder = RL.cache().getFolderFromCacheList(sValue); + if (oFolder) + { + oFolder.type(iType); + } + }; + } + ; + + this.devEmail = ''; + this.devLogin = ''; + this.devPassword = ''; + + this.accountEmail = ko.observable(''); + this.accountLogin = ko.observable(''); + this.projectHash = ko.observable(''); + + this.threading = ko.observable(false); + this.lastFoldersHash = ''; + + this.remoteSuggestions = false; + this.remoteChangePassword = false; + + // system folders + this.sentFolder = ko.observable(''); + this.draftFolder = ko.observable(''); + this.spamFolder = ko.observable(''); + this.trashFolder = ko.observable(''); + + this.sentFolder.subscribe(fRemoveSystemFolderType(this.sentFolder), this, 'beforeChange'); + this.draftFolder.subscribe(fRemoveSystemFolderType(this.draftFolder), this, 'beforeChange'); + this.spamFolder.subscribe(fRemoveSystemFolderType(this.spamFolder), this, 'beforeChange'); + this.trashFolder.subscribe(fRemoveSystemFolderType(this.trashFolder), this, 'beforeChange'); + + this.sentFolder.subscribe(fSetSystemFolderType(Enums.FolderType.SentItems), this); + this.draftFolder.subscribe(fSetSystemFolderType(Enums.FolderType.Draft), this); + this.spamFolder.subscribe(fSetSystemFolderType(Enums.FolderType.Spam), this); + this.trashFolder.subscribe(fSetSystemFolderType(Enums.FolderType.Trash), this); + + this.draftFolderNotEnabled = ko.computed(function () { + return '' === this.draftFolder() || Consts.Values.UnuseOptionValue === this.draftFolder(); + }, this); + + // personal + this.displayName = ko.observable(''); + this.signature = ko.observable(''); + this.replyTo = ko.observable(''); + + // accounts + this.accounts = ko.observableArray([]); + this.accountsLoading = ko.observable(false).extend({'throttle': 100}); + + // identities + this.identities = ko.observableArray([]); + this.identitiesLoading = ko.observable(false).extend({'throttle': 100}); + + // folders + this.namespace = ''; + this.folderList = ko.observableArray([]); + + this.foldersListError = ko.observable(''); + + this.foldersLoading = ko.observable(false); + this.foldersCreating = ko.observable(false); + this.foldersDeleting = ko.observable(false); + this.foldersRenaming = ko.observable(false); + + this.currentFolder = ko.observable(null).extend({'toggleSubscribe': [null, + function (oPrev) { + if (oPrev) + { + oPrev.selected(false); + } + }, function (oNext) { + if (oNext) + { + oNext.selected(true); + } + } + ]}); + + this.currentFolderFullNameRaw = ko.computed(function () { + return this.currentFolder() ? this.currentFolder().fullNameRaw : ''; + }, this); + + this.currentFolderFullName = ko.computed(function () { + return this.currentFolder() ? this.currentFolder().fullName : ''; + }, this); + + this.currentFolderFullNameHash = ko.computed(function () { + return this.currentFolder() ? this.currentFolder().fullNameHash : ''; + }, this); + + this.currentFolderName = ko.computed(function () { + return this.currentFolder() ? this.currentFolder().name() : ''; + }, this); + + this.folderListSystemNames = ko.computed(function () { + + var + aList = ['INBOX'], + aFolders = this.folderList(), + sSentFolder = this.sentFolder(), + sDraftFolder = this.draftFolder(), + sSpamFolder = this.spamFolder(), + sTrashFolder = this.trashFolder() + ; + + if (Utils.isArray(aFolders) && 0 < aFolders.length) + { + if ('' !== sSentFolder && Consts.Values.UnuseOptionValue !== sSentFolder) + { + aList.push(sSentFolder); + } + if ('' !== sDraftFolder && Consts.Values.UnuseOptionValue !== sDraftFolder) + { + aList.push(sDraftFolder); + } + if ('' !== sSpamFolder && Consts.Values.UnuseOptionValue !== sSpamFolder) + { + aList.push(sSpamFolder); + } + if ('' !== sTrashFolder && Consts.Values.UnuseOptionValue !== sTrashFolder) + { + aList.push(sTrashFolder); + } + } + + return aList; + + }, this); + + this.folderListSystem = ko.computed(function () { + return _.compact(_.map(this.folderListSystemNames(), function (sName) { + return RL.cache().getFolderFromCacheList(sName); + })); + }, this); + + this.folderMenuForMove = ko.computed(function () { + return RL.folderListOptionsBuilder(this.folderListSystem(), this.folderList(), [ + this.currentFolderFullNameRaw() + ], null, null, null, null, function (oItem) { + return oItem ? oItem.localName() : ''; + }); + }, this); + + // message list + this.staticMessageList = []; + + this.messageList = ko.observableArray([]); + + this.messageListCount = ko.observable(0); + this.messageListSearch = ko.observable(''); + this.messageListPage = ko.observable(1); + + this.messageListThreadFolder = ko.observable(''); + this.messageListThreadUids = ko.observableArray([]); + + this.messageListThreadFolder.subscribe(function () { + this.messageListThreadUids([]); + }, this); + + this.messageListEndSearch = ko.observable(''); + this.messageListEndFolder = ko.observable(''); + + this.messageListPageCount = ko.computed(function () { + var iPage = Math.ceil(this.messageListCount() / this.messagesPerPage()); + return 0 === iPage ? 1 : iPage; + }, this); + + this.mainMessageListSearch = ko.computed({ + 'read': this.messageListSearch, + 'write': function (sValue) { + kn.setHash(RL.link().mailBox( + this.currentFolderFullNameHash(), 1, Utils.trim(sValue.toString()) + )); + }, + 'owner': this + }); + + this.messageListError = ko.observable(''); + + this.messageListLoading = ko.observable(false); + this.messageListIsNotCompleted = ko.observable(false); + this.messageListCompleteLoadingThrottle = ko.observable(false).extend({'throttle': 200}); + + this.messageListCompleteLoading = ko.computed(function () { + var + bOne = this.messageListLoading(), + bTwo = this.messageListIsNotCompleted() + ; + return bOne || bTwo; + }, this); + + this.messageListCompleteLoading.subscribe(function (bValue) { + this.messageListCompleteLoadingThrottle(bValue); + }, this); + + this.messageList.subscribe(_.debounce(function (aList) { + _.each(aList, function (oItem) { + if (oItem.newForAnimation()) + { + oItem.newForAnimation(false); + } + }); + }, 500)); + + // message preview + this.staticMessageList = new MessageModel(); + this.message = ko.observable(null); + this.messageLoading = ko.observable(false); + this.messageLoadingThrottle = ko.observable(false).extend({'throttle': 50}); + + this.messageLoading.subscribe(function (bValue) { + this.messageLoadingThrottle(bValue); + }, this); + + this.messageFullScreenMode = ko.observable(false); + + this.messageError = ko.observable(''); + + this.messagesBodiesDom = ko.observable(null); + + this.messagesBodiesDom.subscribe(function (oDom) { + if (oDom && !(oDom instanceof jQuery)) + { + this.messagesBodiesDom($(oDom)); + } + }, this); + + this.messageActiveDom = ko.observable(null); + + this.isMessageSelected = ko.computed(function () { + return null !== this.message(); + }, this); + + this.currentMessage = ko.observable(null); + + this.message.subscribe(function (oMessage) { + if (null === oMessage) + { + this.currentMessage(null); + this.hideMessageBodies(); + } + }, this); + + this.messageListChecked = ko.computed(function () { + return _.filter(this.messageList(), function (oMessage) { + return oMessage.checked(); + }); + }, this); + + this.messageListCheckedOrSelected = ko.computed(function () { + + var + aChecked = this.messageListChecked(), + oSelectedMessage = this.currentMessage() + ; + + return _.union(aChecked, oSelectedMessage ? [oSelectedMessage] : []); + + }, this); + + this.messageListCheckedUids = ko.computed(function () { + var aList = []; + _.each(this.messageListChecked(), function (oMessage) { + if (oMessage) + { + aList.push(oMessage.uid); + if (0 < oMessage.threadsLen() && 0 === oMessage.parentUid() && oMessage.lastInCollapsedThread()) + { + aList = _.union(aList, oMessage.threads()); + } + } + }); + return aList; + }, this); + + this.messageListCheckedOrSelectedUidsWithSubMails = ko.computed(function () { + var aList = []; + _.each(this.messageListCheckedOrSelected(), function (oMessage) { + if (oMessage) + { + aList.push(oMessage.uid); + if (0 < oMessage.threadsLen() && 0 === oMessage.parentUid() && oMessage.lastInCollapsedThread()) + { + aList = _.union(aList, oMessage.threads()); + } + } + }); + return aList; + }, this); + + // quota + this.userQuota = ko.observable(0); + this.userUsageSize = ko.observable(0); + this.userUsageProc = ko.computed(function () { + + var + iQuota = this.userQuota(), + iUsed = this.userUsageSize() + ; + + return 0 < iQuota ? Math.ceil((iUsed / iQuota) * 100) : 0; + + }, this); + + // other + this.useKeyboardShortcuts = ko.observable(true); + + // google + this.googleActions = ko.observable(false); + this.googleLoggined = ko.observable(false); + this.googleUserName = ko.observable(''); + + // facebook + this.facebookActions = ko.observable(false); + this.facebookLoggined = ko.observable(false); + this.facebookUserName = ko.observable(''); + + // twitter + this.twitterActions = ko.observable(false); + this.twitterLoggined = ko.observable(false); + this.twitterUserName = ko.observable(''); + + this.customThemeType = ko.observable(Enums.CustomThemeType.Light); + + this.purgeMessageBodyCacheThrottle = _.throttle(this.purgeMessageBodyCache, 1000 * 30); +} + +_.extend(WebMailDataStorage.prototype, AbstractData.prototype); + +WebMailDataStorage.prototype.purgeMessageBodyCache = function() +{ + var + iCount = 0, + oMessagesBodiesDom = null, + iEnd = Globals.iMessageBodyCacheCount - Consts.Values.iMessageBodyCacheLimit + ; + + if (0 < iEnd) + { + oMessagesBodiesDom = this.messagesBodiesDom(); + if (oMessagesBodiesDom) + { + oMessagesBodiesDom.find('.rl-cache-class').each(function () { + var oItem = $(this); + if (iEnd > oItem.data('rl-cache-count')) + { + oItem.addClass('rl-cache-purge'); + iCount++; + } + }); + + if (0 < iCount) + { + _.delay(function () { + oMessagesBodiesDom.find('.rl-cache-purge').remove(); + }, 300); + } + } + } +}; + +WebMailDataStorage.prototype.populateDataOnStart = function() +{ + AbstractData.prototype.populateDataOnStart.call(this); + + this.accountEmail(RL.settingsGet('Email')); + this.accountLogin(RL.settingsGet('Login')); + this.projectHash(RL.settingsGet('ProjectHash')); + + this.displayName(RL.settingsGet('DisplayName')); + this.replyTo(RL.settingsGet('ReplyTo')); + this.signature(RL.settingsGet('Signature')); + + this.lastFoldersHash = RL.local().get(Enums.ClientSideKeyName.FoldersLashHash) || ''; + + this.remoteSuggestions = !!RL.settingsGet('RemoteSuggestions'); + this.remoteChangePassword = !!RL.settingsGet('RemoteChangePassword'); + + this.devEmail = RL.settingsGet('DevEmail'); + this.devLogin = RL.settingsGet('DevLogin'); + this.devPassword = RL.settingsGet('DevPassword'); +}; + +WebMailDataStorage.prototype.initUidNextAndNewMessages = function (sFolder, sUidNext, aNewMessages) +{ + if ('INBOX' === sFolder && Utils.isNormal(sUidNext) && sUidNext !== '') + { + if (Utils.isArray(aNewMessages) && 0 < aNewMessages.length) + { + var + oCache = RL.cache(), + iIndex = 0, + iLen = aNewMessages.length, + fNotificationHelper = function (sImageSrc, sTitle, sText) + { + var oNotification = null; + if (NotificationClass && RL.data().useDesktopNotifications()) + { + oNotification = new NotificationClass(sTitle, { + 'body': sText, + 'icon': sImageSrc + }); + + if (oNotification) + { + if (oNotification.show) + { + oNotification.show(); + } + + window.setTimeout((function (oLocalNotifications) { + return function () { + if (oLocalNotifications.cancel) + { + oLocalNotifications.cancel(); + } + else if (oLocalNotifications.close) + { + oLocalNotifications.close(); + } + }; + }(oNotification)), 7000); + } + } + } + ; + + _.each(aNewMessages, function (oItem) { + oCache.addNewMessageCache(sFolder, oItem.Uid); + }); + + if (3 < iLen) + { + fNotificationHelper( + RL.link().notificationMailIcon(), + RL.data().accountEmail(), + Utils.i18n('MESSAGE_LIST/NEW_MESSAGE_NOTIFICATION', { + 'COUNT': iLen + }) + ); + } + else + { + for (; iIndex < iLen; iIndex++) + { + fNotificationHelper( + RL.link().notificationMailIcon(), + MessageModel.emailsToLine(MessageModel.initEmailsFromJson(aNewMessages[iIndex].From), false), + aNewMessages[iIndex].Subject + ); + } + } + } + + RL.cache().setFolderUidNext(sFolder, sUidNext); + } +}; + +/** + * @param {string} sNamespace + * @param {Array} aFolders + * @param {boolean} bCached + * @return {Array} + */ +WebMailDataStorage.prototype.folderResponseParseRec = function (sNamespace, aFolders, bCached) +{ + var + iIndex = 0, + iLen = 0, + oFolder = null, + oCacheFolder = null, + sFolderFullNameRaw = '', + aSubFolders = [], + aList = [] + ; + + bCached = !!bCached; + + for (iIndex = 0, iLen = aFolders.length; iIndex < iLen; iIndex++) + { + oFolder = aFolders[iIndex]; + if (oFolder) + { + sFolderFullNameRaw = oFolder.FullNameRaw; + + oCacheFolder = RL.cache().getFolderFromCacheList(sFolderFullNameRaw); + if (!oCacheFolder) + { + oCacheFolder = FolderModel.newInstanceFromJson(oFolder); + if (oCacheFolder) + { + RL.cache().setFolderToCacheList(sFolderFullNameRaw, oCacheFolder); + RL.cache().setFolderFullNameRaw(oCacheFolder.fullNameHash, sFolderFullNameRaw); + + oCacheFolder.isGmailFolder = Consts.Values.GmailFolderName.toLowerCase() === sFolderFullNameRaw.toLowerCase(); + if ('' !== sNamespace && sNamespace === oCacheFolder.fullNameRaw + oCacheFolder.delimiter) + { + oCacheFolder.isNamespaceFolder = true; + } + + if (oCacheFolder.isNamespaceFolder || oCacheFolder.isGmailFolder) + { + oCacheFolder.isUnpaddigFolder = true; + } + } + } + + if (oCacheFolder) + { + oCacheFolder.collapsed(!Utils.isFolderExpanded(oCacheFolder.fullNameHash)); + + if (!bCached && oFolder.Extended) + { + if (oFolder.Extended.Hash) + { + RL.cache().setFolderHash(oCacheFolder.fullNameRaw, oFolder.Extended.Hash); + } + + if (Utils.isNormal(oFolder.Extended.MessageCount)) + { + oCacheFolder.messageCountAll(oFolder.Extended.MessageCount); + } + + if (Utils.isNormal(oFolder.Extended.MessageUnseenCount)) + { + oCacheFolder.messageCountUnread(oFolder.Extended.MessageUnseenCount); + } + } + + aSubFolders = oFolder['SubFolders']; + if (aSubFolders && 'Collection/FolderCollection' === aSubFolders['@Object'] && + aSubFolders['@Collection'] && Utils.isArray(aSubFolders['@Collection'])) + { + oCacheFolder.subFolders( + this.folderResponseParseRec(sNamespace, aSubFolders['@Collection'], bCached)); + } + + aList.push(oCacheFolder); + } + } + } + + return aList; +}; + +/** + * @param {*} oData + * @param {boolean=} bCached = false + */ +WebMailDataStorage.prototype.setFolders = function (oData, bCached) +{ + var + aList = [], + bUpdate = false, + oRLData = RL.data(), + aFolders = oRLData.folderList(), + bFoldersFirst = 0 === aFolders.length, + fNormalizeFolder = function (sFolderFullNameRaw) { + return ('' === sFolderFullNameRaw || Consts.Values.UnuseOptionValue === sFolderFullNameRaw || + null !== RL.cache().getFolderFromCacheList(sFolderFullNameRaw)) ? sFolderFullNameRaw : ''; + } + ; + + if (oData && oData.Result && 'Collection/FolderCollection' === oData.Result['@Object'] && + oData.Result['@Collection'] && Utils.isArray(oData.Result['@Collection'])) + { + if (!Utils.isUnd(oData.Result.Namespace)) + { + oRLData.namespace = oData.Result.Namespace; + } + + this.threading(!!RL.settingsGet('UseImapThread') && oData.Result.IsThreadsSupported && true); + + aList = this.folderResponseParseRec(oRLData.namespace, oData.Result['@Collection'], !!bCached); + oRLData.folderList(aList); + + if (oData.Result['SystemFolders'] && + '' === '' + RL.settingsGet('SentFolder') + RL.settingsGet('DraftFolder') + + RL.settingsGet('SpamFolder') + RL.settingsGet('TrashFolder')) + { + // TODO Magic Numbers + RL.settingsSet('SentFolder', oData.Result['SystemFolders'][2] || null); + RL.settingsSet('DraftFolder', oData.Result['SystemFolders'][3] || null); + RL.settingsSet('SpamFolder', oData.Result['SystemFolders'][4] || null); + RL.settingsSet('TrashFolder', oData.Result['SystemFolders'][5] || null); + + bUpdate = true; + } + + oRLData.sentFolder(fNormalizeFolder(RL.settingsGet('SentFolder'))); + oRLData.draftFolder(fNormalizeFolder(RL.settingsGet('DraftFolder'))); + oRLData.spamFolder(fNormalizeFolder(RL.settingsGet('SpamFolder'))); + oRLData.trashFolder(fNormalizeFolder(RL.settingsGet('TrashFolder'))); + + if (bUpdate) + { + RL.remote().saveSystemFolders(Utils.emptyFunction, { + 'SentFolder': oRLData.sentFolder(), + 'DraftFolder': oRLData.draftFolder(), + 'SpamFolder': oRLData.spamFolder(), + 'TrashFolder': oRLData.trashFolder() + }); + } + + if (!bCached) + { + RL.local().set(Enums.ClientSideKeyName.FoldersLashHash, oData.Result.FoldersHash); + } + + if (bFoldersFirst && bCached) + { + RL.folders(false); + } + } +}; + +WebMailDataStorage.prototype.hideMessageBodies = function () +{ + var oMessagesBodiesDom = this.messagesBodiesDom(); + if (oMessagesBodiesDom) + { + oMessagesBodiesDom.find('.b-text-part').hide(); + } +}; + +WebMailDataStorage.prototype.setMessage = function (oData, bCached) +{ + var + bIsHtml = false, + bHasExternals = false, + bHasInternals = false, + oBody = null, + oTextBody = null, + sId = '', + oMessagesBodiesDom = this.messagesBodiesDom(), + oMessage = this.message() + ; + + if (oData && oMessage && oData.Result && 'Object/Message' === oData.Result['@Object'] && + oMessage.folderFullNameRaw === oData.Result.Folder && oMessage.uid === oData.Result.Uid) + { + this.messageError(''); + + oMessage.initUpdateByMessageJson(oData.Result); + RL.cache().addRequestedMessage(oMessage.folderFullNameRaw, oMessage.uid); + + if (!bCached) + { + oMessage.initFlagsByJson(oData.Result); + } + + oMessagesBodiesDom = oMessagesBodiesDom && oMessagesBodiesDom[0] ? oMessagesBodiesDom : null; + if (oMessagesBodiesDom) + { + sId = 'rl-' + oMessage.requestHash.replace(/[^a-zA-Z0-9]/g, ''); + oTextBody = oMessagesBodiesDom.find('#' + sId); + if (!oTextBody || !oTextBody[0]) + { + bHasExternals = !!oData.Result.HasExternals; + bHasInternals = !!oData.Result.HasInternals; + + oBody = $('
').hide().addClass('rl-cache-class'); + oBody.data('rl-cache-count', ++Globals.iMessageBodyCacheCount); + + if (Utils.isNormal(oData.Result.Html) && '' !== oData.Result.Html) + { + bIsHtml = true; + oBody.html(oData.Result.Html.toString()).addClass('b-text-part html'); + } + else if (Utils.isNormal(oData.Result.Plain) && '' !== oData.Result.Plain) + { + bIsHtml = false; + oBody.html(oData.Result.Plain.toString()).addClass('b-text-part plain'); + } + else + { + bIsHtml = false; + } + + if (oData.Result.Rtl) + { + oBody.data('rl-is-rtl', true); + oBody.addClass('rtl-text-part'); + } + + oMessagesBodiesDom.append(oBody); + + oBody.data('rl-is-html', bIsHtml); + oBody.data('rl-has-images', bHasExternals); + + oMessage.isRtl(!!oBody.data('rl-is-rtl')); + oMessage.isHtml(!!oBody.data('rl-is-html')); + oMessage.hasImages(!!oBody.data('rl-has-images')); + oMessage.body = oBody; + + if (bHasInternals) + { + oMessage.showInternalImages(true); + } + + if (oMessage.hasImages() && this.showImages()) + { + oMessage.showExternalImages(true); + } + + this.purgeMessageBodyCacheThrottle(); + } + else + { + oTextBody.data('rl-cache-count', ++Globals.iMessageBodyCacheCount); + + oMessage.isRtl(!!oTextBody.data('rl-is-rtl')); + oMessage.isHtml(!!oTextBody.data('rl-is-html')); + oMessage.hasImages(!!oTextBody.data('rl-has-images')); + oMessage.body = oTextBody; + } + + this.messageActiveDom(oMessage.body); + + this.hideMessageBodies(); + oMessage.body.show(); + + if (oBody) + { + Utils.initBlockquoteSwitcher(oBody); + } + } + + RL.cache().initMessageFlagsFromCache(oMessage); + if (oMessage.unseen()) + { + RL.setMessageSeen(oMessage); + } + + Utils.windowResize(); + } +}; + +WebMailDataStorage.prototype.setMessageList = function (oData, bCached) +{ + if (oData && oData.Result && 'Collection/MessageCollection' === oData.Result['@Object'] && + oData.Result['@Collection'] && Utils.isArray(oData.Result['@Collection'])) + { + var + oRainLoopData = RL.data(), + oCache = RL.cache(), + mLastCollapsedThreadUids = null, + iIndex = 0, + iLen = 0, + iCount = 0, + iOffset = 0, + aList = [], + aStaticList = oRainLoopData.staticMessageList, + oJsonMessage = null, + oMessage = null, + oFolder = null, + iNewCount = 0, + bUnreadCountChange = false + ; + + iCount = Utils.pInt(oData.Result.MessageResultCount); + iOffset = Utils.pInt(oData.Result.Offset); + + if (Utils.isNonEmptyArray(oData.Result.LastCollapsedThreadUids)) + { + mLastCollapsedThreadUids = oData.Result.LastCollapsedThreadUids; + } + + oFolder = RL.cache().getFolderFromCacheList( + Utils.isNormal(oData.Result.Folder) ? oData.Result.Folder : ''); + + if (oFolder && !bCached) + { + RL.cache().setFolderHash(oData.Result.Folder, oData.Result.FolderHash); + + if (Utils.isNormal(oData.Result.MessageCount)) + { + oFolder.messageCountAll(oData.Result.MessageCount); + } + + if (Utils.isNormal(oData.Result.MessageUnseenCount)) + { + if (Utils.pInt(oFolder.messageCountUnread()) !== Utils.pInt(oData.Result.MessageUnseenCount)) + { + bUnreadCountChange = true; + } + + oFolder.messageCountUnread(oData.Result.MessageUnseenCount); + } + + this.initUidNextAndNewMessages(oFolder.fullNameRaw, oData.Result.UidNext, oData.Result.NewMessages); + } + + if (bUnreadCountChange && oFolder) + { + RL.cache().clearMessageFlagsFromCacheByFolder(oFolder.fullNameRaw); + } + + for (iIndex = 0, iLen = oData.Result['@Collection'].length; iIndex < iLen; iIndex++) + { + oJsonMessage = oData.Result['@Collection'][iIndex]; + if (oJsonMessage && 'Object/Message' === oJsonMessage['@Object']) + { + oMessage = aStaticList[iIndex]; + if (!oMessage || !oMessage.initByJson(oJsonMessage)) + { + oMessage = MessageModel.newInstanceFromJson(oJsonMessage); + } + + if (oMessage) + { + if (oCache.hasNewMessageAndRemoveFromCache(oMessage.folderFullNameRaw, oMessage.uid) && 5 >= iNewCount) + { + iNewCount++; + oMessage.newForAnimation(true); + } + + oMessage.deleted(false); + + if (bCached) + { + RL.cache().initMessageFlagsFromCache(oMessage); + } + else + { + RL.cache().storeMessageFlagsToCache(oMessage); + } + + oMessage.lastInCollapsedThread(mLastCollapsedThreadUids && -1 < Utils.inArray(Utils.pInt(oMessage.uid), mLastCollapsedThreadUids) ? true : false); + + aList.push(oMessage); + } + } + } + + oRainLoopData.messageListCount(iCount); + oRainLoopData.messageListSearch(Utils.isNormal(oData.Result.Search) ? oData.Result.Search : ''); + oRainLoopData.messageListEndSearch(Utils.isNormal(oData.Result.Search) ? oData.Result.Search : ''); + oRainLoopData.messageListEndFolder(Utils.isNormal(oData.Result.Folder) ? oData.Result.Folder : ''); + oRainLoopData.messageListPage(Math.ceil((iOffset / oRainLoopData.messagesPerPage()) + 1)); + + oRainLoopData.messageList(aList); + oRainLoopData.messageListIsNotCompleted(false); + + oMessage = oRainLoopData.message(); + if (oMessage && oRainLoopData.messageList.setSelectedByUid) + { + oRainLoopData.messageList.setSelectedByUid(oMessage.generateUid()); + } + + if (aStaticList.length < aList.length) + { + oRainLoopData.staticMessageList = aList; + } + + oCache.clearNewMessageCache(); + + if (oFolder && (bCached || bUnreadCountChange || RL.data().useThreads())) + { + RL.folderInformation(oFolder.fullNameRaw, aList); + } + } + else + { + RL.data().messageListCount(0); + RL.data().messageList([]); + RL.data().messageListError(Utils.getNotification( + oData && oData.ErrorCode ? oData.ErrorCode : Enums.Notification.CantGetMessageList + )); + } +}; diff --git a/dev/Styles/@Main.less b/dev/Styles/@Main.less new file mode 100644 index 000000000..26214f131 --- /dev/null +++ b/dev/Styles/@Main.less @@ -0,0 +1,73 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +@import "../../vendors/bootstrap/less/variables.less"; +@import "../../vendors/bootstrap/less/mixins.less"; + +@import "_Values.less"; + +@import "../../vendors/bootstrap/less/scaffolding.less"; +@import "../../vendors/bootstrap/less/grid.less"; +@import "../../vendors/bootstrap/less/layouts.less"; + +@import "../../vendors/bootstrap/less/type.less"; +@import "../../vendors/bootstrap/less/code.less"; +@import "../../vendors/bootstrap/less/forms.less"; +@import "../../vendors/bootstrap/less/tables.less"; + +@import "../../vendors/bootstrap/less/dropdowns.less"; +@import "../../vendors/bootstrap/less/wells.less"; +@import "../../vendors/bootstrap/less/component-animations.less"; +@import "../../vendors/bootstrap/less/close.less"; + +@import "../../vendors/bootstrap/less/buttons.less"; +@import "../../vendors/bootstrap/less/button-groups.less"; +@import "../../vendors/bootstrap/less/alerts.less"; + +@import "../../vendors/bootstrap/less/modals.less"; +@import "../../vendors/bootstrap/less/tooltip.less"; +@import "../../vendors/bootstrap/less/popovers.less"; +@import "../../vendors/bootstrap/less/labels-badges.less"; +@import "../../vendors/bootstrap/less/progress-bars.less"; +@import "../../vendors/bootstrap/less/utilities.less"; + +@import "_IcoMoonToBoot.less"; +@import "_BootstrapFix.less"; +@import "_Select2Fix.less"; + +@import "Ui.less"; +@import "Main.less"; +@import "Layout.less"; +@import "Scroll.less"; +@import "SystemDropDown.less"; +@import "Login.less"; +@import "FolderList.less"; +@import "FolderClear.less"; +@import "FolderCreate.less"; +@import "FolderSystem.less"; +@import "Languages.less"; +@import "AddAccount.less"; +@import "Identity.less"; +@import "AdvancedSearch.less"; +@import "MessageList.less"; +@import "MessageView.less"; +@import "Contacts.less"; +@import "Compose.less"; +@import "Admin.less"; +@import "AdminGeneral.less"; +@import "AdminDomains.less"; +@import "AdminDomain.less"; +@import "AdminPackages.less"; +@import "AdminPlugins.less"; +@import "AdminPlugin.less"; +@import "Activate.less"; +@import "Settings.less"; +@import "SettingsPersonal.less"; +@import "SettingsGeneral.less"; +@import "SettingsAccounts.less"; +@import "SettingsIdentities.less"; +@import "SettingsFolders.less"; +@import "SettingsThemes.less"; + +@import "Animations.less"; +@import "Editor.less"; +@import "_End.less"; diff --git a/dev/Styles/Activate.less b/dev/Styles/Activate.less new file mode 100644 index 000000000..da07aa38e --- /dev/null +++ b/dev/Styles/Activate.less @@ -0,0 +1,12 @@ +.popups { + .b-activate-content { + width: 700px; + .modal-header { + background-color: #fff; + } + + .help-inline { + padding-left: 0px; + } + } +} diff --git a/dev/Styles/AddAccount.less b/dev/Styles/AddAccount.less new file mode 100644 index 000000000..46ad6813d --- /dev/null +++ b/dev/Styles/AddAccount.less @@ -0,0 +1,7 @@ +.popups { + .b-account-add-content { + .modal-header { + background-color: #fff; + } + } +} diff --git a/dev/Styles/Admin.less b/dev/Styles/Admin.less new file mode 100644 index 000000000..add24e504 --- /dev/null +++ b/dev/Styles/Admin.less @@ -0,0 +1,101 @@ + +.b-admin-left { + + .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 34px; + padding: 8px 0 0 @rlLowMargin; + } + + .b-content { + position: absolute; + top: 50px + @rlLowMargin + 10px; + bottom: @rlLowMargin; + left: 0; + right: 0; + overflow: hidden; + + .content { + -webkit-overflow-scrolling: touch; + } + } +} + +.b-admin-menu { + + .e-item { + overflow: hidden; + text-decoration: none; + outline: 0; + } + + .e-link { + position: relative; + display: block; + height: 30px; + line-height: 29px; + cursor: pointer; + font-size: 18px; + z-index: 1; + cursor: default; + + background-color: transparent; + color: #888; + + padding: 4px 10px; + + outline: 0; + text-decoration: none; + } + + .e-item.selectable .e-link { + cursor: pointer; + } + + .e-item.selectable { + &:hover .e-link, &.selected .e-link { + background-color: #555; + color: #fff; + } + } +} + +.b-admin-right { + + .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 34px; + padding: 8px @rlLowMargin; + color: #fff; + } + + .b-content { + position: absolute; + top: 50px + @rlLowMargin; + bottom: @rlLowMargin; + left: 0; + right: @rlLowMargin; + overflow-y: auto; + z-index: 2; + + background-color: #fff; + border: @rlMainBorderSize solid @rlMainDarkColor; + + .box-shadow(@rlMainShadow); + .border-radius(@rlMainBorderRadius); + + .content { + -webkit-overflow-scrolling: touch; + } + } + + .b-settings-content { + padding: 20px; + } +} diff --git a/dev/Styles/AdminDomain.less b/dev/Styles/AdminDomain.less new file mode 100644 index 000000000..ea5579f1e --- /dev/null +++ b/dev/Styles/AdminDomain.less @@ -0,0 +1,43 @@ +.b-domain-content { + + &.modal { + width: 645px; + } + + .modal-header { + background-color: #fff; + } + + .modal-body { + position: relative; + overflow: hidden; + width: 1300px; + height: 390px; + } + + &.domain-edit .modal-body { + height: 350px; + } + + &.domain-white-list-page .modal-body { + left: -640px; + } + + .error-desc { + color: red; + margin-left: 10px; + } + + .testing-done { + .imap-header, .smtp-header { + color: green; + font-weight: bold; + } + } + + .testing-error { + .imap-header, .smtp-header { + color: red; + } + } +} \ No newline at end of file diff --git a/dev/Styles/AdminDomains.less b/dev/Styles/AdminDomains.less new file mode 100644 index 000000000..bf10bc53c --- /dev/null +++ b/dev/Styles/AdminDomains.less @@ -0,0 +1,60 @@ + +.b-admin-domains { + .process-place { + width: 600px; + padding: 14px 0; + text-align: center; + visibility: hidden; + } +} + +.b-admin-domains-list-table { + + width: 600px; + + .e-item { + + .e-action { + cursor: pointer; + } + + .domain-name { + display: inline-block; + word-break: break-all; + .box-sizing(border-box); + } + + &.disabled .domain-name { + color: #bbb; + } + + .button-delete { + margin-right: 15px; + visibility: hidden; + .opacity(0); + } + + .delete-access { + &.button-delete { + visibility: visible; + margin-right: 0; + .opacity(100); + } + } + + .delete-domain, .disable-domain { + cursor: pointer; + .opacity(50); + } + + &.disabled .disable-domain { + .opacity(50); + } + + .delete-domain, .disable-domain { + &:hover { + .opacity(100); + } + } + } +} diff --git a/dev/Styles/AdminGeneral.less b/dev/Styles/AdminGeneral.less new file mode 100644 index 000000000..5b8845153 --- /dev/null +++ b/dev/Styles/AdminGeneral.less @@ -0,0 +1,4 @@ + +.b-admin-general { +} + diff --git a/dev/Styles/AdminPackages.less b/dev/Styles/AdminPackages.less new file mode 100644 index 000000000..f4c6291b4 --- /dev/null +++ b/dev/Styles/AdminPackages.less @@ -0,0 +1,43 @@ + +.b-admin-packages { + + .alert { + width: 650px; + } + + .process-place { + visibility: hidden; + } +} + +.b-admin-packages-list-table { + + width: 700px; + + .e-item { + + .package-img { + font-size: 12px; + margin-right: 2px; + } + + .package-name.core { + font-weight: bold; + } + .package-desc { + color: #999; + font-size: 12px; + } + + .e-action { + cursor: pointer; + } + + .package-release-parent, .package-actions-parent { + text-align: center; + } + .package-actions-parent { + vertical-align: middle; + } + } +} diff --git a/dev/Styles/AdminPlugin.less b/dev/Styles/AdminPlugin.less new file mode 100644 index 000000000..4e6dcb53d --- /dev/null +++ b/dev/Styles/AdminPlugin.less @@ -0,0 +1,30 @@ +.b-plugin-content { + + &.modal { + width: 660px; + + .modal-body { + overflow: auto; + } + } + + .modal-header { + background-color: #fff; + } + + .information { + display: inline-block; + background-color: #ddd; + border-radius: 10px; + cursor: pointer; + height: 25px; + width: 30px; + text-align: center; + padding-top: 5px; + } + + textarea { + width: 400px; + height: 50px; + } +} \ No newline at end of file diff --git a/dev/Styles/AdminPlugins.less b/dev/Styles/AdminPlugins.less new file mode 100644 index 000000000..e66c75d45 --- /dev/null +++ b/dev/Styles/AdminPlugins.less @@ -0,0 +1,40 @@ + +.b-admin-plugins { + .process-place { + visibility: hidden; + } +} + +.b-admin-plugins-list-table { + + &.disabled { + .opacity(50); + background-color: #eee; + } + + .e-item { + .e-action { + cursor: pointer; + } + + .plugin-img { + font-size: 12px; + margin-right: 2px; + } + + &.disabled { + .plugin-img, .plugin-name { + color: #bbb; + } + .disable-plugin { + .opacity(50); + } + } + } +} + +.b-admin-plugin-property { + .help-block { + margin-bottom: 5px; + } +} diff --git a/dev/Styles/AdvancedSearch.less b/dev/Styles/AdvancedSearch.less new file mode 100644 index 000000000..dc9609d5a --- /dev/null +++ b/dev/Styles/AdvancedSearch.less @@ -0,0 +1,16 @@ +.popups { + .b-advanced-search-content { + &.modal { + width: 750px; + .control-label { + width: 100px; + } + .controls { + margin-left: 110px; + } + } + .modal-header { + background-color: #fff; + } + } +} diff --git a/dev/Styles/Animations.less b/dev/Styles/Animations.less new file mode 100644 index 000000000..0d41433c9 --- /dev/null +++ b/dev/Styles/Animations.less @@ -0,0 +1,179 @@ + +.rl-strip-animation(@rgba, @stripOpacity) { + background-image: -webkit-linear-gradient(135deg, rgba(@rgba, @rgba, @rgba, @stripOpacity) 25%, transparent 25%, + transparent 50%, rgba(@rgba, @rgba, @rgba, @stripOpacity) 50%, rgba(@rgba, @rgba, @rgba, @stripOpacity) 75%, + transparent 75%, transparent); + background-image: -moz-linear-gradient(135deg, rgba(@rgba, @rgba, @rgba, @stripOpacity) 25%, transparent 25%, + transparent 50%, rgba(@rgba, @rgba, @rgba, @stripOpacity) 50%, rgba(@rgba, @rgba, @rgba, @stripOpacity) 75%, + transparent 75%, transparent); + background-image: -ms-linear-gradient(135deg, rgba(@rgba, @rgba, @rgba, @stripOpacity) 25%, transparent 25%, + transparent 50%, rgba(@rgba, @rgba, @rgba, @stripOpacity) 50%, rgba(@rgba, @rgba, @rgba, @stripOpacity) 75%, + transparent 75%, transparent); + background-image: -o-linear-gradient(135deg, rgba(@rgba, @rgba, @rgba, @stripOpacity) 25%, transparent 25%, + transparent 50%, rgba(@rgba, @rgba, @rgba, @stripOpacity) 50%, rgba(@rgba, @rgba, @rgba, @stripOpacity) 75%, + transparent 75%, transparent); + background-image: linear-gradient(135deg, rgba(@rgba, @rgba, @rgba, @stripOpacity) 25%, transparent 25%, + transparent 50%, rgba(@rgba, @rgba, @rgba, @stripOpacity) 50%, rgba(@rgba, @rgba, @rgba, @stripOpacity) 75%, + transparent 75%, transparent); +} + +@keyframes highlight-folder-row { + 0% {transform: scale(1); } 50% { transform: scale(1.1); } 100% { transform: scale(1); } +} +@-moz-keyframes highlight-folder-row { + 0% { -moz-transform: scale(1); } 50% { -moz-transform: scale(1.1); } 100% { -moz-transform: scale(1); } +} +@-webkit-keyframes highlight-folder-row { + 0% { -webkit-transform: scale(1); } 50% { -webkit-transform: scale(1.1); } 100% { -webkit-transform: scale(1); } +} + +@-webkit-keyframes textLoadingAnimationKeyFrame { + 0% { opacity: 1; } 33% { opacity: 0; } 100% { opacity: 1; } +} + +@-moz-keyframes textLoadingAnimationKeyFrame { + 0% { opacity: 1; } 33% { opacity: 0; } 100% { opacity: 1; } +} + +@keyframes textLoadingAnimationKeyFrame { + 0% { opacity: 1; } 33% { opacity: 0; } 100% { opacity: 1; } +} + +@-webkit-keyframes animate-stripes { + 0% {background-position: 0 0;} 100% {background-position: 60px 0;} +} + +@-moz-keyframes animate-stripes { + 0% {background-position: 0 0;} 100% {background-position: 60px 0;} +} + +@keyframes animate-stripes { + 0% {background-position: 0 0;} 100% {background-position: 60px 0;} +} + +.rl-anim { + + &.rgba.cssanimations.backgroundsize .e-strip-animation { + -webkit-background-size: 60px 60px; + -moz-background-size: 60px 60px; + background-size: 60px 60px; + + .rl-strip-animation(0, 0.1); + + -webkit-animation: animate-stripes 2s linear infinite; + -moz-animation: animate-stripes 2s linear infinite; + animation: animate-stripes 2s linear infinite; + } + + &.csstransitions .b-settings-folders { + .folder-item { + .button-delete { + .transition(all 0.2s linear); + } + } + } + + &.csstransitions .b-settings-accounts { + .account-item { + .button-delete { + .transition(all 0.2s linear); + } + } + } + + &.csstransitions .b-settings-identities { + .identity-item { + .button-delete { + .transition(all 0.2s linear); + } + } + } + + &.csstransitions .b-admin-domains { + .e-item { + .button-delete { + .transition(all 0.2s linear); + } + } + } + + &.csstransitions .b-compose { + .button-delete { + .transition(margin-left 0.2s linear); + } + } + + &.cssanimations .b-folders .e-item .anim-action-class { + -webkit-animation: highlight-folder-row 0.5s linear; + -moz-animation: highlight-folder-row 0.5s linear; + animation: highlight-folder-row 0.5s linear; + } + + &.csstransitions .messageList { + .messageListItem { + .transition(max-height 400ms ease); + } + .listDragOver { + .transition(all 400ms ease); + } + } + + &.csstransitions .b-list-content { + .e-contact-item { + .transition(max-height 400ms ease); + } + } + + &.csstransitions .modal.b-domain-content { + .modal-body { + .transition(left 500ms ease); + } + } + + &.csstransitions .modal-open .popups .modal { + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + transform-origin: 50% 50%; + + .transition(~"0.3s all cubic-bezier(0.250, 0.460, 0.450, 0.940)"); + .scale(0.9); + } + + .modal-open .popups .popup-active.modal { + -webkit-transform: none; + -moz-transform: none; + -o-transform: none; + transform: none; + } + + &.cssanimations .b-compose.loading .b-header-toolbar { + -webkit-background-size: 60px 60px; + -moz-background-size: 60px 60px; + background-size: 60px 60px; + + .rl-strip-animation(255, 0.2); + + -webkit-animation: animate-stripes 2s linear infinite; + -moz-animation: animate-stripes 2s linear infinite; + animation: animate-stripes 2s linear infinite; + } +} + +.textLoadingAnimationD1, .textLoadingAnimationD2, .textLoadingAnimationD3 { + -webkit-animation: textLoadingAnimationKeyFrame 1s linear infinite 0s; + -moz-animation: textLoadingAnimationKeyFrame 1s linear infinite 0s; + animation: textLoadingAnimationKeyFrame 1s linear infinite 0s; +} + +.textLoadingAnimationD2 { + -webkit-animation-delay: 0.3s; + -moz-animation-delay: 0.3s; + animation-delay: 0.3s; +} + +.textLoadingAnimationD3 { + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + animation-delay: 0.6s; +} diff --git a/dev/Styles/Compose.less b/dev/Styles/Compose.less new file mode 100644 index 000000000..745b08a0c --- /dev/null +++ b/dev/Styles/Compose.less @@ -0,0 +1,177 @@ + +.b-compose { + + &.modal { + + width: 850px; + margin: 10px auto; + + .modal-body { + overflow: auto; + padding: 0px; + } + } + + .b-header-toolbar { + + height: 40px; + + background-color: @rlMainDarkColor; + color: #fff; + + background-color: #333; + background-color: rgba(0,0,0,0.8) !important; + + .close { + color: #fff; + .opacity(100); + } + + .btn.disable { + &.button-delete { + visibility: hidden; + } + } + + .button-save, .button-delete, .saved-text { + margin-left: 8px; + } + + .disable.button-delete { + margin-left: 0px; + } + } + + .b-header { + + padding: 10px; + border-bottom: 1px solid #333; + background-color: #eee; + color: #333; + + .e-identity { + font-weight: bold; + + &.multiply { + cursor: pointer; + border-bottom: 1px dashed #555; + } + } + + .e-row { + line-height: 30px; + } + + .e-delimiter-row { + line-height: 2px; + height: 5px; + } + + .e-label { + text-align: right; + width: 1%; + min-width: 70px; + padding: 6px 10px; + } + + .e-value { + + padding: 2px 0px; + + textarea, input[type="text"] { + width: 98%; + } + textarea { + height: 40px; + } + .select2-container { + width: 100%; + } + } + + .error-desc { + color: red; + } + + .b-appachments { + + .b-attacment { + display: inline-block; + line-height: 20px; + } + + .b-attacment-in-process { + + display: inline-block; + line-height: 20px; + + .uploading { + display: none; + padding-right: 5px; + } + + &.uploading .uploading { + display: inline; + } + + .upload-progress { + font-weight: bold; + } + + &.error .namedStr { + color: #888; + } + .error { + color: red; + } + .close { + float: left; + padding-right: 13px; + } + } + } + } + + .b-attachment-button { + display: inline-block; + } + + .b-attachment-place { + + position: absolute; + height: 120px; + border: 2px #777 dashed; + line-height: 119px; + text-align: center; + background-color: #fff; + z-index: 300; + left: 20px; + right: 20px; + font-size: 24px; + + &.drag-and-drop-over { + background: #777; + color: #fff; + } + } + + .editorTextArea, .editorHtmlArea { + + background: #fff; + color: #000; + font-family: Arial, Verdana, Geneva, sans-serif; + font-size: 14px; + + table { + border-collapse: separate; + } + + blockquote { + border: 0; + border-left: solid 2px #444; + margin-left: 5px; + margin: 5px 0; + padding-left: 5px; + } + } +} \ No newline at end of file diff --git a/dev/Styles/Contacts.less b/dev/Styles/Contacts.less new file mode 100644 index 000000000..7567c58c6 --- /dev/null +++ b/dev/Styles/Contacts.less @@ -0,0 +1,303 @@ + +@contacts-popup-left-width: 250px; + +.b-contacts-content { + + &.modal { + + position: absolute; + right: 0; + top: 0; + bottom: 0; + left: 0; + width: 900px; + min-height: 300px; + max-height: 700px; + margin: auto; + + .modal-body { + overflow: auto; + height: 100%; + background-color: #f5f5f5; + padding: 0; + } + + .b-header-toolbar { + + height: 40px; + + background-color: @rlMainDarkColor; + color: #fff; + + background-color: #333; + background-color: rgba(0,0,0,0.8) !important; + + .close { + color: #fff; + .opacity(100); + } + + .btn { + margin-top: 4px; + } + + .button-new-message { + margin-left: 8px; + } + .button-delete { + margin-left: 8px; + } + } + + .b-list-toopbar { + padding: 0; + height: 45px; + text-align: center; + width: @contacts-popup-left-width; + .box-shadow(inset 0 -1px 0 #ccc); + + .e-search { + margin-top: 7px; + } + } + + .b-list-content { + position: absolute; + top: 45px; + bottom: 60px; + left: 0; + width: @contacts-popup-left-width; + overflow: hidden; + overflow-y: auto; + + .content { + -webkit-overflow-scrolling: touch; + } + + .listClear { + color: #333; + text-align: center; + padding: 10px; + font-size: 14px; + line-height: 13px; + background-color: #fff; + } + + .listEmptyList, .listEmptyListLoading, .listEmptySearchList { + color: #999; + text-align: center; + padding: 60px 10px; + font-size: 24px; + line-height: 30px; + } + + &.hideContactListCheckbox { + .checkedParent, .checkboxCkeckAll { + display: none !important; + } + .sidebarParent { + margin-right: 10px !important; + } + } + + .e-contact-foreach { + border-bottom: 1px solid #ddd; + } + + .e-contact-item { + position: relative; + height: 45px; + max-height: 45px; + line-height: 45px; + overflow: hidden; + cursor: pointer; + + margin: 0px; + border: 0px solid transparent; + z-index: 100; + + .delimiter { + position: relative; + display: block; + height: 1px; + background-color: #999; + .opacity(20); + } + + .wrapper { + padding: 0; + } + + .sidebarParent { + display: inline-block; + width: 6px; + background-color: #eee; + float: left; + height: 100%; + } + + &.deleted { + max-height: 0px; + border-color: transparent !important; + } + + .checkedParent { + display: inline-block; + float: left; + padding: 0 8px 0 6px; + } + + .nameParent { + display: block; + overflow: hidden; + text-overflow: ellipsis; + color: #333; + font-size: 16px; + } + + .nameParent, .emailParent { + white-space: nowrap; + } + + .displayName, .displayEmail { + overflow: hidden; + text-overflow: ellipsis; + } + + .displayImg { + display: inline-block; + float: right; + position: relative; + margin: 0 5px; + } + + &.checked { + z-index: 101; + + .sidebarParent { + background-color: #69A8F5; + } + } + + &.selected { + background-color: #fff; + z-index: 102; + + .sidebarParent { + background-color: #398CF2; + } + } + } + } + + .b-view-content { + position: absolute; + top: 0; + bottom: 60px; + left: @contacts-popup-left-width; + right: 0; + overflow: hidden; + overflow-y: auto; + + background-color: #fff; + border-left: 1px solid #ddd; + + .content { + -webkit-overflow-scrolling: touch; + } + + .b-contact-view-desc { + text-align: center; + font-size: 24px; + line-height: 30px; + padding-top: 120px; + color: #999; + } + + .top-part { + margin-top: 20px; + + .control-label { + text-align: center; + } + } + + .image-wrapper { + margin-left: 30px; + border-radius: 10px; + + img { + border-radius: 10px; + } + } + + .top-row { + padding: 10px 0; + height: 30px; + } + + .contactEmptyValueClick, .contactValueClick, .contactValueInput { + display: inline-block; + font-size: 24px; + line-height: 28px; + height: 28px; + } + + .contactEmptyValueClick, .contactValueClick { + color: #ddd; + cursor: pointer; + margin: 5px 0 0 7px; + } + + .contactValueInput { + padding-left: 6px; + } + + .contactEmptyValueClick { + border-bottom: 1px dashed #ddd; + } + + .contactValueClick { + color: #555; + border-bottom: 11px dashed transparent; + } + + .contactValueClick:hover { + color: #000; + border-bottom: 1px dashed #000; + } + + .contactValueInput { + + } + + .hasError { + .contactValueClick, .contactValueInput { + color: #ee5f5b; + border: 1px solid #ee5f5b; + } + } + + .button-save-contact { + position: absolute; + bottom: 20px; + right: 20px; + } + } + } + + .e-contact-item { + + position: relative; + height: 55px; + max-height: 60px; + line-height: 22px; + overflow: hidden; + cursor: pointer; + + margin: 0px; + border: 0px solid transparent; + z-index: 100; + + } +} diff --git a/dev/Styles/Editor.less b/dev/Styles/Editor.less new file mode 100644 index 000000000..31994e4b2 --- /dev/null +++ b/dev/Styles/Editor.less @@ -0,0 +1,173 @@ +.editorToolbar { + + position: relative; + height: 20px; + margin-top: 10px; + line-height: 19px; + + &.editorHideToolbar .editorToolbarButtom { + display: none; + } + + .editorSwitcher { + display: inline-block; + vertical-align: middle; + } + + .editorToolbarButtom { + + display: inline-block; + width: 16px; + height: 16px; + padding: 3px; + + a { + display: inline-block; + border: 0px; + margin: 0px; + padding: 0px; + width: 16px; + height: 16px; + + cursor: default; + background: url('@{editor-sprite}'); + + &.bold { background-position: 0 0; } + &.italic { background-position: -16px 0; } + &.underline { background-position: -32px 0; } + &.strikethrough { background-position: -48px 0; } + &.link { background-position: -64px 0; } + &.unlink { background-position: -80px 0; } + &.orderedlist { background-position: -96px 0; } + &.unorderedlist { background-position: -112px 0; } + &.image { background-position: -128px 0; } + + &.h1 { background-position: 0 -16px;} + &.h2 { background-position: -16px -16px;} + &.h3 { background-position: -32px -16px;} + &.h4 { background-position: -48px -16px;} + &.h5 { background-position: -64px -16px;} + &.h6 { background-position: -80px -16px;} + + &.subscript { background-position: -96px -16px;} + &.superscript { background-position: -112px -16px;} + &.indent { background-position: -128px -16px;} + &.outdent { background-position: -144px -16px;} + &.horizontalrule { background-position: -160px -16px;} + &.p { background-position: -176px -16px;} + + &.justifyleft { background-position: 0 -32px;} + &.justifycenter { background-position: -16px -32px;} + &.justifyright { background-position: -32px -32px;} + &.increasefontsize { background-position: -48px -32px;} + &.decreasefontsize { background-position: -64px -32px;} + &.forecolor { background-position: -80px -32px;} + &.backcolor { background-position: -80px -32px;} + &.removeformat { background-position: -144px 0;} + } + } +} + +.textAreaParent { + + padding: 0px; + + .editorHtmlArea { + + .box-sizing(border-box); + + border: 0px !important; + overflow: auto; + overflow-y: scroll; + font-family: arial, sans-serif; + font-size: 13px; + line-height: 16px; + margin: 0px; + padding: 8px; + + ul { + + padding-left: 40px; + + li { + list-style-type: disc !important; + } + } + + ol { + padding-left: 40px; + li { + list-style-type: decimal !important; + } + } + + blockquote { + border-left: solid 2px #444; + margin-left: 5px; + padding-left: 5px + } + + img { + vertical-align: bottom; + } + + &.editorDragOver { + background: #ffffef; + } + } + + .editorTextArea { + .box-sizing(border-box); + + display: block; + border: 0px !important; + width: 100%; + line-height: 16px; + margin: 0px; + padding: 8px; + + overflow: auto; + overflow-y: scroll; + } +} + +.editorColorPicker { + + .editorCpColors { + + float: left; + margin: 0; + clear: both; + width: 128px; + border: 1px solid #000; + backgroud: #000; + + .editorCpColor { + border: 1px solid #fff; + float: left; + width: 14px; + height: 14px; + } + } +} + +.editorSwitcher { + .g-ui-link; + .pull-right; + + padding-bottom: 6px; +} + +.editorFontStylePicker { + + .editorFpFonts { + + padding: 5px; + border: 1px solid #000; + background-color: #fff; + + .editorFpFont { + padding: 5px; + } + } +} diff --git a/dev/Styles/FolderClear.less b/dev/Styles/FolderClear.less new file mode 100644 index 000000000..31bebce2a --- /dev/null +++ b/dev/Styles/FolderClear.less @@ -0,0 +1,7 @@ +.popups { + .b-folder-clear-content { + .modal-header { + background-color: #fff; + } + } +} diff --git a/dev/Styles/FolderCreate.less b/dev/Styles/FolderCreate.less new file mode 100644 index 000000000..0fd7a1c98 --- /dev/null +++ b/dev/Styles/FolderCreate.less @@ -0,0 +1,7 @@ +.popups { + .b-folder-create-content { + .modal-header { + background-color: #fff; + } + } +} diff --git a/dev/Styles/FolderList.less b/dev/Styles/FolderList.less new file mode 100644 index 000000000..adcc78be3 --- /dev/null +++ b/dev/Styles/FolderList.less @@ -0,0 +1,141 @@ + +@folderItemPadding: 10px; +@subPadding: 15px; + +.b-folders { + + .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 30px; + padding: 10px 10px 0 @rlLowMargin; + color: #fff; + } + + .b-content { + position: absolute; + top: 50px + @rlLowMargin; + bottom: @rlLowMargin + @rlBottomMargin; +// left: @rlLowMargin; + left: 0; + right: 0; + overflow: hidden; + overflow-y: auto; +// padding: 5px; + + .content { + -webkit-overflow-scrolling: touch; + } + } + + .b-list-delimiter { + margin: 10px; + border-top: 0px solid #000; + border-bottom: 1px solid #999; + } + + .e-item { + + overflow: hidden; + white-space: nowrap; + + .e-link { + display: block; + position: relative; + z-index: 1; + height: 34px; + line-height: 34px; + background-color: transparent; + vertical-align: middle; + color: grey; + cursor: not-allowed; + font-size: 14px; + + padding: 0; + padding-left: @folderItemPadding; + padding-right: @folderItemPadding; + + outline: 0; + text-decoration: none; + + &.selectable { + + color: #000; + cursor: pointer; + + &:hover, &.selected, &.droppableHover { + background-color: #555; + color: #fff; + } + } + + &.system { + cursor: default; + color: grey; + } + + .count { + display: none; + margin-top: 5px; + line-height: 19px; + } + + &.print-count { + font-weight: bold; + .count { + display: inline; + } + } + + .e-collapsed-sign { + cursor: pointer; + width: 22px; + height: 30px; + line-height: 30px; + text-align: center; + vertical-align: inherit; + } + } + + .hidden.e-link { + display: none; + } + + .b-sub-folders.collapsed { + max-height: 0; + height: 0; + display: none; + } + } + + .b-folder-system-item { + font-weight: bold; + } + + .b-sub-folders .e-item .e-link { + padding-left: @subPadding * 1 + @folderItemPadding; + } + .b-sub-folders.unpaddig-folder .e-item .e-link { + padding-left: @folderItemPadding; + } + .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: @subPadding * 2 + @folderItemPadding; + } + .b-sub-folders.unpaddig-folder .b-sub-folders .e-item .e-link { + padding-left: @subPadding * 1 + @folderItemPadding; + } + .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: @subPadding * 3 + @folderItemPadding; + } + .b-sub-folders.unpaddig-folder .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: @subPadding * 2 + @folderItemPadding; + } + .b-sub-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: @subPadding * 4 + @folderItemPadding; + } + .b-sub-folders.unpaddig-folder .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: @subPadding * 3 + @folderItemPadding; + } +} diff --git a/dev/Styles/FolderSystem.less b/dev/Styles/FolderSystem.less new file mode 100644 index 000000000..d315d2379 --- /dev/null +++ b/dev/Styles/FolderSystem.less @@ -0,0 +1,10 @@ +.popups { + .b-folder-system-content { + &.modal { + z-index: 1102; + } + .modal-header { + background-color: #fff; + } + } +} diff --git a/dev/Styles/Identity.less b/dev/Styles/Identity.less new file mode 100644 index 000000000..5de93b5d9 --- /dev/null +++ b/dev/Styles/Identity.less @@ -0,0 +1,12 @@ +.popups { + .b-identity-content { + .modal-header { + background-color: #fff; + } + + .textEmail { + margin-top: 5px; + font-weight: bold; + } + } +} diff --git a/dev/Styles/Languages.less b/dev/Styles/Languages.less new file mode 100644 index 000000000..ed8340af6 --- /dev/null +++ b/dev/Styles/Languages.less @@ -0,0 +1,34 @@ +.popups { + .b-languages-content { + + &.modal { + z-index: 1103; + width: 520px; + } + + &.exp { + width: 521px; + } + + .modal-header { + background-color: #fff; + } + + .lang-item { + display: inline-block; + padding: 5px 15px; + margin: 2px 5px; + width: 200px; + background-color: #fff; + text-align: left; + + &.selected { + background-color: #f5f5f5; + } + } + + .lang-item:hover { + background-color: #eee; + } + } +} diff --git a/dev/Styles/Layout.less b/dev/Styles/Layout.less new file mode 100644 index 000000000..5152a49e4 --- /dev/null +++ b/dev/Styles/Layout.less @@ -0,0 +1,123 @@ + +#rl-content { + height: 100%; + width: 100%; +} + +#rl-center { + .g-ui-absolute-reset; + min-width: 900px; + min-height: 400px; +} + +#rl-top { + .g-ui-absolute-reset; + bottom: auto; + z-index: 2; +} + +#rl-bottom { + .g-ui-absolute-reset; + top: auto; + z-index: 1; +} + +#rl-left { + .g-ui-absolute-reset; + + right: auto; + width: 100%; +} + +#rl-right { + .g-ui-absolute-reset; + + z-index: 1; +} + +#rl-resizer-right { + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 35%; +} + +#rl-resizer-left { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 65%; + min-width: 350px; +} + +#rl-top-resizer-right { + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: @rlLeftWidth; +} + +#rl-top-resizer-left { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: auto; +// width: @rlLeftWidth; + min-width: 120px; +} + +html.mobile { + #rl-top-resizer-left { + width: @rlLeftWidth - 60; + } + #rl-top-resizer-right { + left: @rlLeftWidth - 60; + } + #rl-resizer-left { + width: 350px; + } + #rl-resizer-right { + left: 350px; + } +} + +html.rl-no-preview-pane { + + #rl-resizer-left { + right: @rlBottomMargin !important; + width: inherit; + } + + #rl-resizer-right { + left: 0 !important; + } + + #rl-right .ui-resizable-handle { + display: none !important; + } +} + +#rl-loading, #rl-loading-error { + position: absolute; + font: 30px Tahoma; + top: 50%; + width: 100%; + height: 65px; + margin: 0; + margin-top: -60px; + background-color: transparent; + background-repeat: no-repeat; + background-position: center 50px; + background-image: url('@{rlLoaderBlack}'); + text-align: center; + color: #000; +} + +#rl-loading-error { + background-image: none; + display: none; +} diff --git a/dev/Styles/Login.less b/dev/Styles/Login.less new file mode 100644 index 000000000..a339bb9f0 --- /dev/null +++ b/dev/Styles/Login.less @@ -0,0 +1,96 @@ + +.rl-view-model { + &.RL-Login, &.RL-LoginNew, &.RL-AdminLogin { + height: 100%; + } +} + +.b-login-content { + + height: 100%; + text-align: center; + margin-left: -230px; + + .loginFormWrapper { + + display: inline-block; + vertical-align: middle; + text-align: center; + width: 380px; + + .loginForm { + background-color: #efefef; + text-align: left; + color: #333; + margin: 0; + float: none; + } + + .control-label { + font-size: 16px; + line-height: 30px; + } + + .control-group { + margin-bottom: 25px; + } + + .wrapper { + padding: 40px 40px 10px 40px; + } + + #recaptcha_image img { + border: 1px solid #ccc; + .border-radius(3px); + } + + .inputLoginForm, .inputEmail, .inputLogin, .inputPassword { + font-size: 18px; + height: 30px; + line-height: 29px; + } + + .signMeLabel { + margin-top: 5px; + } + + .input-append .add-on { + position: relative; + height: 30px; + background: none; + margin-left: -35px; + z-index: 1000; + border: 0px; + } + + .input-append .add-on i { + font-size: 17px; + line-height: 29px; + color: #999; + } + + .control-group.error .add-on i { + color: #b94a48; + } + } + + .buttonLogin { + margin: 0; + } + + .alert { + margin: 0 0 20px 0; + text-align: left; + } + + .loginAfter { + display: inline-block; + height: 90%; + vertical-align: middle; + width: 0px; + } + + .flag-selector { + margin-bottom: 0; + } +} diff --git a/dev/Styles/Main.less b/dev/Styles/Main.less new file mode 100644 index 000000000..e0bddd268 --- /dev/null +++ b/dev/Styles/Main.less @@ -0,0 +1,54 @@ +html { + margin: 0; + padding: 0; + overflow: hidden; + font-family: Arial, Verdana, Geneva, sans-serif; +} + +body { + margin: 0; + padding: 0; + overflow: hidden; + background-color: #e3e3e3; + font-family: Arial, Verdana, Geneva, sans-serif; + + -webkit-touch-callout: none; + + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; +} + +textarea { + resize: none; +} + +option:disabled { + color: #aaa; + cursor: not-allowed; +} + +body:before { + content: ""; + position: fixed; + top: -10px; + left: 0; + width: 100%; + height: 8px; + z-index: 100; + .box-shadow(0px 0px 10px rgba(0,0,0,.6)); +} + +* { + outline: none; +} + +select:focus { + outline: none; +} + +html.mobile * { + -webkit-tap-highlight-color: rgba(0,0,0,0); +} \ No newline at end of file diff --git a/dev/Styles/MessageList.less b/dev/Styles/MessageList.less new file mode 100644 index 000000000..14552fe8e --- /dev/null +++ b/dev/Styles/MessageList.less @@ -0,0 +1,523 @@ +html.rl-no-preview-pane { + + .messageList.message-selected { + display: none; + } +} + +.messageList { + + .toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 30px; + padding: 10px @rlMainBorderSize; + min-width: 280px; + z-index: 102; + } + + .b-footer { + position: absolute; + bottom: 0; + right: 0; + left: 0; + height: 29px; + padding: 10px; + min-width: 300px; + z-index: 101; + + background-color: #eee; +// #gradient > .vertical(#f4f4f4, #dfdfdf); + + .border-bottom-right-radius(@rlMainBorderRadius); + .border-bottom-left-radius(@rlMainBorderRadius); + + .e-quota { + display: inline-block; + margin-left: 10px; + font-size: 18px; + cursor: help; + } + .e-quota:hover { + border-bottom: 1px dashed #333; + } + } + + .inputSearch { + width: 258px; + } + + .btn.buttonMoreSearch { + padding-left: 8px; + padding-right: 8px; + } + + .b-message-list-wrapper { + position: absolute; + top: 50px; + right: 0; + left: 0; + bottom: @rlBottomMargin; + + border: @rlMainBorderSize solid @rlMainDarkColor; + + .box-shadow(@rlMainShadow); + .border-radius(@rlMainBorderRadius); + z-index: 101; + } + + .second-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 29px; + padding: 10px 8px 10px 11px; + min-width: 280px; + z-index: 101; + + background-color: #eee; +// #gradient > .vertical(#f4f4f4, #dfdfdf); + + .border-top-right-radius(@rlMainBorderRadius); + .border-top-left-radius(@rlMainBorderRadius); + + .checkboxCkeckAll { + margin: 5px 0; + } + } + + .mainDelimiter { + position: absolute; + left: 0; + right: 0; + height: 1px; + z-index: 101; + background-color: #bbb; + } + + .toolbarDelimiter { + top: 49px; + } + + .footerDelimiter { + bottom: 49px; + } + + .b-content { + position: absolute; + top: 50px; + bottom: 50px; + left: 0; + right: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + z-index: 101; + min-width: 300px; + + .box-sizing(border-box); + + background-color: #fff; + + .content { + -webkit-overflow-scrolling: touch; + } + + .listClear { + color: #333; + text-align: center; + padding: 10px; + font-size: 14px; + line-height: 13px; + } + + .listEmptyList, .listEmptyListLoading, .listDragOver, .listError, .listEmptySearchList { + color: #999; + text-align: center; + padding: 60px 10px; + font-size: 24px; + line-height: 30px; + + .e-icon { + font-size: 24px; + line-height: 30px; + } + } + + .listDragOver { + max-height: 0; + overflow: hidden; + padding: 0 10px; + } + + .listDragOver.viewAppendArea { + max-height: 120px; + padding: 30px 10px; + } + .listDragOver.dragOverEnter { + background-color: #e0fdda; + color: #333; + } + + .listError { + color: #DA4F49; + } + + .listSearchDesc { + font-size: 20px; + padding: 20px; + border-bottom: 1px solid #eee; + } + + .delimiter { + display: block; + height: 1px; + background-color: #e5e5e5; + } + + .messageListItem:last-child { + border-bottom: 1px solid #e5e5e5; + &.selected { + border-bottom: 1px solid #bfd5ef; + } + } + + .fullThreadsParent { + height: 25px; + padding: 3px 5px; + background-color: #f4f4f4; + text-align: center; + } + + .messageListItem { + + position: relative; + height: 52px; + max-height: 60px; + font-size: 12px; + line-height: 21px; + overflow: hidden; + cursor: pointer; + + margin: 0px; + border: 0px solid transparent; + z-index: 100; + + background-color: #f9f9f9; + + .delimiter { + position: relative; + display: block; + height: 1px; + background-color: #999; + .opacity(20); + } + + .wrapper { + padding: 5px 0; + } + + .sidebarParent { + display: inline-block; + width: 6px; + background-color: #eee; + float: left; + height: 100%; + } + + &.e-single-line { + height: 35px; + } + + &.e-single-line .wrapper { + line-height: 25px; + padding: 5px; + } + + &.new { + max-height: 0px; + } + + &.deleted { + max-height: 0px; + border-color: transparent !important; + } + + .checkedParent { + display: inline-block; + float: left; + margin-top: 11px; + padding: 0 8px 0 6px; + font-size: 14px; + } + + &.e-single-line .checkedParent { + margin-top: 1px; + } + + .flagParent { + display: inline-block; + float: right; + padding: 0 8px 0 5px; + } + + &.e-single-line .flagParent { + float: left; + padding: 0 8px 0 2px; + } + + .dateParent { + display: inline-block; + float: right; + position: relative; + margin: 0 5px; + color: #999; + font-size: 11px; + } + + &.e-single-line .dateParent { + } + + .attachmentParent { + display: inline-block; + float: right; + position: relative; + margin: 2px 8px 0 5px; + } + + &.e-single-line .attachmentParent { + float: left; + margin: 0 5px 0 0; + } + + .senderParent { + display: block; + overflow: hidden; + text-overflow: ellipsis; + } + + .threadsCountParent { + display: inline; + overflow: hidden; + background-color: #eee; + padding: 1px 5px; + margin-right: 5px; + border: 1px solid #ccc; + .border-radius(5px); + } + + .threadsCountParent.lastSelected { + background-color: #999; + border-color: #999; + color: #fff; + } + + .threadsCountParent:hover { + border-color: #666; + } + + &.e-single-line .senderParent { + display: inline-block; + text-overflow: none; + width: 200px; + float: left; + font-weight: normal; + } + + .subjectParent { + display: block; + overflow: hidden; + text-overflow: ellipsis; + color: #000; + } + + &.e-single-line .subjectParent { + } + + .senderParent, .subjectParent, .dateParent { + white-space: nowrap; + } + + .subjectParent .emptySubjectText { + display: none; + font-style: italic; + color: #999; + } + + &.emptySubject .subjectParent { + .subject { + display: none; + } + .emptySubjectText { + display: inline; + } + } + + .sender, .subject { + overflow: hidden; + text-overflow: ellipsis; + } + + .attachment { + display: none; + } + + .flagOff, .flagOn, .flagOnHalf { + cursor: pointer; + display: inline-block; + } + + .flagOff { + .opacity(50); + &:hover { + .opacity(100); + } + } + + .flagOn, .flagOnHalf { + display: none; + color: orange; + } + + .replyFlag, .forwardFlag { + display: none; + } + + &.answered .replyFlag { + display: inline-block; + } + + &.forwarded .forwardFlag { + display: inline-block; + } + + &.withAttachments .attachment { + display: inline-block; + color: #666; + text-shadow: 0px 1px 0px #eee; + } + + &.unseen { + background-color: #FFFFD9; + .sender, .subject { + font-weight: bold; + } + .sidebarParent { + background-color: orange; + } + } + + &.hasUnseenSubMessage { + background-color: #FFFFD9; + .sidebarParent { + background-color: lighten(orange, 30%); + } + } + + &.hasParentMessage { + background-color: #ecf0f1; + + .sidebarParent { + background-color: #bdc3c7; + } + + &.unseen { + background-color: darken(#ecf0f1, 5%); + .sidebarParent { + background-color: darken(#bdc3c7, 30%); + } + } + } + + &.checked { + .sidebarParent { + background-color: lighten(#398CF2, 10%) !important; + } + } + + &.selected { + background-color: #DFEFFF; + z-index: 102; + + .sidebarParent { + background-color: #398CF2 !important; + } + + .delimiter { + background-color: #398CF2; + .opacity(20); + } + + + .messageListItem .delimiter { + background-color: #398CF2; + .opacity(30); + } + } + + &.hasFlaggedSubMessage { + .flagOff, .flagOn { + display: none; + } + .flagOnHalf { + display: inline-block; + } + } + + &.flagged { + .flagOff, .flagOnHalf { + display: none; + } + .flagOn { + display: inline-block; + } + } + } + } + + &.hideMessageListCheckbox { + .checkedParent, .checkboxCkeckAll { + display: none !important; + } + .sidebarParent { + margin-right: 10px !important; + } + } + + .pagenator { + + .page { + + display: inline-block; + color: #999; + text-decoration: none; + font-size: 24px; + padding: 3px; + cursor: pointer; + + &:hover .pageNumber { + color: #555; + } + + &.current .pageNumber { + font-size: 28px; + color: #333; + border-bottom: 2px solid #000; + } + } + } +} + +.draggablePlace { + z-index: 10002; + color: #fff; + background-color: #333; + background-color: rgba(0,0,0,0.5); + padding: 4px 10px; + min-width: 30px; + height: 20px; + cursor: pointer; + cursor: move; +} diff --git a/dev/Styles/MessageView.less b/dev/Styles/MessageView.less new file mode 100644 index 000000000..5250b3935 --- /dev/null +++ b/dev/Styles/MessageView.less @@ -0,0 +1,381 @@ + +html.rl-no-preview-pane { + + .messageView { + display: none; + + &.message-selected { + display: block; + } + } +} + +.messageView { + + z-index: 100; + + .toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 30px; + padding: 10px 0; + color: #fff; + } + + .b-content { + + position: absolute; + margin: 0; + top: 50px + @rlLowMargin; + bottom: @rlLowMargin + @rlBottomMargin; + right: @rlLowMargin; + left: 0; + overflow: hidden; + border: @rlLowBorderSize solid @rlMainDarkColor; + border-left: 0px; + .border-top-right-radius(@rlLowBorderRadius); + .border-bottom-right-radius(@rlLowBorderRadius); + + background-color: #fff; + + .b-message-view-desc { + text-align: center; + font-size: 24px; + line-height: 30px; + padding-top: 120px; + color: #999; + } + + .b-message-view-desc.error { + color: #DA4F49; + } + + .content { + -webkit-overflow-scrolling: touch; + } + + .messageItem { + + position: absolute; + top: 0px; + bottom: 0; + left: 0; + right: 0; + overflow: auto; + -webkit-overflow-scrolling: touch; + .border-radius(@rlLowBorderRadius); + + .emptySubjectText { + display: none; + font-style: italic; + color: #999; + } + + &.emptySubject .emptySubjectText { + display: inline; + } + + .buttonUp, .buttonUnFull, .buttonFull { + display: inline-block; + position: fixed; + right: 30px; + top: 90px; + height: 30px; + width: 30px; + text-align: center; + vertical-align: middle; + line-height: 30px; + background-color: transparent; + background-color: #fff; + border: 1px solid #333; + color: #333; + z-index: 2; + cursor: pointer; + .border-radius(5px); + .opacity(30); + + &:hover { + .opacity(80); + border-color: #000; + background-color: #888; + color: #fff; + } + } + + .buttonUp { + right: 70px; + z-index: 0; + } + + .buttonUnFull { + display: none; + } + + .messageItemHeader { + + position: relative; + padding: 10px; + background-color: #f8f8f8; + border-top: 0px; + border-bottom: 1px solid #ddd; + z-index: 1; + + .date { + } + + .fromPic { + display: inline-block; + width: 50px; + height: 50px; + float: left; + padding: 2px; + margin: 0 5px 0 0; + background: #fff; + border: 1px solid #ccc; + border-radius: 10px; + .box-sizing(border-box); + } + + .subjectParent { + font-size: 16px; + font-weight: bold; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + margin-left: 3px; + } + + .senderParent { + margin-top: 10px; + } + + .messageButtons { + margin-top: 5px; + } + + .informationShort { + margin-left: 15px; + a { + .g-ui-link; + } + } + .informationFull { + margin-top: 10px; + border: 1px solid #ddd; + background-color: #fff; + border-radius: 5px; + padding: 10px 15px; + } + } + + .loading { + text-align: center; + font-size: 24px; + color: grey; + padding-top: 50px; + } + + .line-loading { + height: 0px; + } + + .showImages { + cursor: pointer; + background-color: #eee; + padding: 10px 15px; + border-bottom: 1px solid #ccc; + } + + .attachmentsPlace { + + padding: 10px; + + .attachmentList { + + margin: 0; + + .attachmentItem { + + display: inline-block; + margin: 5px; + padding: 5px; + max-width: 170px; + min-width: 60px; + overflow: hidden; + cursor: pointer; + list-style: none; + line-height: 24px; + border: 2px solid grey; + background-color: #fff; + box-shadow: 1px 1px 5px #ccc; + box-shadow: 1px 1px 5px rgba(0,0,0,0.1); + + .border-radius(6px); + + .attachmentIcon { + font-size: 23px; + width: 23px; + height: 23px; + } + + .attachmentPreview { + color: #999; + margin: 0px 5px; + } + .attachmentPreview:hover { + color: #333; + } + } + } + } + + .rlBlockquoteSwitcher { + + background-color: #eee; + border: 1px solid #999; + display: inline-block; + width: 30px; + height: 14px; + line-height: 14px; + text-align: center; + cursor: pointer; + margin: 10px 0px; + + .opacity(50); + &:hover { + .opacity(100); + } + } + + .bodyText { + + color: #000; + font-family: arial, sans-serif; + + .b-text-part { + + a { + color: blue; + text-decoration: underline; + + &:visited { + color: #609; + } + &:active { + color: red; + } + } + + table { + border-collapse: separate; + } + + blockquote { + border-left: 2px solid #000; + margin: 0; + padding: 0px 10px; + } + + .rl-bq-switcher.hidden-bq { + display: none; + } + + &.rtl-text-part { + direction: rtl; + } + + &.html { + .mailso-body { + margin: 15px; + } + } + + &.plain { + + padding: 15px; + + pre { + margin: 0px; + padding: 0px; + font-family: arial, sans-serif; + background: #fff; + border: none; + white-space: normal; + } + + blockquote { + border-left: 2px solid blue; + color: blue; + } + + blockquote blockquote { + border-left: 2px solid green; + color: green; + } + + blockquote blockquote blockquote { + border-left: 2px solid red; + color: red; + } + } + } + } + } + } +} + +html.rl-no-preview-pane .messageView { + .toolbar { + padding-left: @rlMainBorderSize; + } + .b-content { + top: 50px; + bottom: @rlBottomMargin; + right: @rlBottomMargin; + border: @rlMainBorderSize solid @rlMainDarkColor; + .box-shadow(@rlMainShadow); + .border-radius(@rlMainBorderRadius); + + .buttonUp, .buttonUnFull, .buttonFull { + top: 70px; + } + } +} + +html.cssanimations.rl-anim .line-loading { + height: 5px !important; +} + +html.rl-message-fullscreen { + + #rl-left, #rl-bottom { + display: none !important; + } + + #rl-right { + .RL-MailMessageList, .RL-SettingsPane, .RL-SystemDropDown, .RL-MailMessageView .messageView .toolbar { + display: none !important; + } + } + + .messageView .b-content { + position: fixed; + margin: 5px; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 10000; + + .buttonUp, .buttonUnFull { + display: inline-block; + top: 36px; + } + + .buttonFull { + display: none; + } + } +} diff --git a/dev/Styles/Scroll.less b/dev/Styles/Scroll.less new file mode 100644 index 000000000..578a31184 --- /dev/null +++ b/dev/Styles/Scroll.less @@ -0,0 +1,29 @@ +/** +::-webkit-scrollbar { + height: 10px; + width: 10px; + overflow: visible; +} + +::-webkit-scrollbar-button { + height: 0; + width: 0; +} + +::-webkit-scrollbar-thumb, ::-webkit-scrollbar-track { + background-color: transparent; + background-clip: padding-box; + border-width: 1px 1px 1px 6px; + min-height: 18px; +} + +::-webkit-scrollbar-thumb { + background-color: #bbb; + background-color: rgba(0, 0, 0, 0.2); + border: 2px solid transparent; +} + +::-webkit-scrollbar-corner { + background: transparent; +} +/**/ \ No newline at end of file diff --git a/dev/Styles/Settings.less b/dev/Styles/Settings.less new file mode 100644 index 000000000..de312e96f --- /dev/null +++ b/dev/Styles/Settings.less @@ -0,0 +1,99 @@ + +.b-settins-left { + + .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 34px; + padding: 8px 0 0 @rlLowMargin; + } + + .b-content { + position: absolute; + top: 50px + @rlLowMargin + 10px; + bottom: @rlLowMargin; + left: 0; + right: 0; + overflow: hidden; + + .content { + -webkit-overflow-scrolling: touch; + } + } +} + +.b-settings-menu { + + .e-item { + overflow: hidden; + text-decoration: none; + outline: 0; + } + + .e-link { + position: relative; + display: block; + height: 30px; + line-height: 29px; + font-size: 18px; + z-index: 1; + cursor: default; + + background-color: transparent; + color: #888; + + padding: 4px 10px; + + outline: 0; + text-decoration: none; + } + + .e-item.selectable .e-link { + cursor: pointer; + } + + .e-item.selectable { + &:hover .e-link, &.selected .e-link { + background-color: #555; + color: #fff; + } + } +} + +.b-settins-right { + + .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 34px; + padding: 8px 5px; + color: #fff; + } + + .b-content { + position: absolute; + top: 50px + @rlLowMargin; + bottom: @rlLowMargin; + left: 0; + right: @rlLowMargin; + overflow-y: auto; + z-index: 2; + + background-color: #fff; + border: @rlMainBorderSize solid @rlMainDarkColor; + .box-shadow(@rlMainShadow); + .border-radius(@rlMainBorderRadius); + + .content { + -webkit-overflow-scrolling: touch; + } + } + + .b-settings-content { + padding: 20px; + } +} diff --git a/dev/Styles/SettingsAccounts.less b/dev/Styles/SettingsAccounts.less new file mode 100644 index 000000000..7246ba0dc --- /dev/null +++ b/dev/Styles/SettingsAccounts.less @@ -0,0 +1,55 @@ + +.b-settings-accounts { + + .process-place { + text-align: center; + width: 600px; + padding: 14px 0; + } + + .list-table { + + width: 600px; + + td { + padding: 4px 8px; + line-height: 30px; + } + + .account-img { + font-size: 12px; + margin-right: 5px; + } + + .account-name { + display: inline-block; + word-break: break-all; + .box-sizing(border-box); + line-height: 22px; + cursor: default; + } + } + + .account-item { + + .button-delete { + margin-right: 15px; + margin-top: 5px; + visibility: hidden; + .opacity(0); + } + + .delete-access { + &.button-delete { + visibility: visible; + margin-right: 0; + .opacity(100); + } + } + + .delete-account { + cursor: pointer; + .opacity(50); + } + } +} \ No newline at end of file diff --git a/dev/Styles/SettingsFolders.less b/dev/Styles/SettingsFolders.less new file mode 100644 index 000000000..7c0b52468 --- /dev/null +++ b/dev/Styles/SettingsFolders.less @@ -0,0 +1,104 @@ + +.folderPaddingHelper(@i) { + (~".folder-padding.deep-@{i}") { + width: 15px * @i + 10px; + } +} + +.b-settings-folders { + + &.ignore-folder-subscribe { + .subscribe-folder, .unsubscribe-folder { + display: none; + } + } + + .process-place { + text-align: center; + width: 600px; + padding: 14px 0; + } + + .folders-list-error { + width: 550px; + margin: 10px 0px; + } + + .list-table { + + width: 600px; + + .e-action { + cursor: pointer; + } + + td { + padding: 4px 8px; + line-height: 30px; + } + + .folder-padding { + display: inline-block; + width: 0; + } + + .folder-name { + display: inline-block; + word-break: break-all; + .box-sizing(border-box); + margin-left: 7px; + line-height: 22px; + cursor: default; + } + + .folder-system-name { + display: inline-block; + line-height: 22px; + color: #999; + cursor: default; + } + + .folder-name.can-be-edited:hover { + border-bottom: 1px dashed #333; + cursor: pointer; + } + + .folder-name-input { + border-width: 1px; + margin-bottom: 0; + } + } + + .folder-item { + + .button-delete { + margin-right: 15px; + margin-top: 5px; + visibility: hidden; + .opacity(0); + } + + .delete-access { + &.button-delete { + visibility: visible; + margin-right: 0; + .opacity(100); + } + } + + .delete-folder, .subscribe-folder, .unsubscribe-folder { + cursor: pointer; + .opacity(60); + } + + .unsubscribe-folder { + .opacity(25); + } + } + + .folderPaddingHelper(1); + .folderPaddingHelper(2); + .folderPaddingHelper(3); + .folderPaddingHelper(4); + .folderPaddingHelper(5); +} \ No newline at end of file diff --git a/dev/Styles/SettingsGeneral.less b/dev/Styles/SettingsGeneral.less new file mode 100644 index 000000000..4c82170e3 --- /dev/null +++ b/dev/Styles/SettingsGeneral.less @@ -0,0 +1,25 @@ + +.b-settings-general { + + .notification-desc-denied { + color: #999; + display: none; + } + + .denied-by-browser { + .notification-desc-denied { + display: inline; + } + .notification-desc { + color: #999; + } + } + + .flag-selector { + padding-top: 5px; + } + + .flag-name { + border-bottom: 1px dashed #555; + } +} diff --git a/dev/Styles/SettingsIdentities.less b/dev/Styles/SettingsIdentities.less new file mode 100644 index 000000000..3dd6ac35a --- /dev/null +++ b/dev/Styles/SettingsIdentities.less @@ -0,0 +1,59 @@ + +.b-settings-identities { + + .process-place { + text-align: center; + width: 600px; + padding: 14px 0; + } + + .list-table { + + width: 600px; + + td { + padding: 4px 8px; + line-height: 30px; + } + + .identity-img { + font-size: 12px; + margin-right: 5px; + } + + .identity-name { + display: inline-block; + word-break: break-all; + .box-sizing(border-box); + line-height: 22px; + cursor: pointer; + } + } + + .identity-item { + + .e-action { + cursor: pointer; + } + + .button-delete { + margin-right: 15px; + margin-top: 5px; + visibility: hidden; + .opacity(0); + } + + .delete-access { + &.button-delete { + visibility: visible; + margin-right: 0; + .opacity(100); + } + } + + .delete-identity { + cursor: pointer; + .opacity(50); + } + } +} diff --git a/dev/Styles/SettingsPersonal.less b/dev/Styles/SettingsPersonal.less new file mode 100644 index 000000000..e234ffda2 --- /dev/null +++ b/dev/Styles/SettingsPersonal.less @@ -0,0 +1,4 @@ + +.b-settings-personal { + +} diff --git a/dev/Styles/SettingsThemes.less b/dev/Styles/SettingsThemes.less new file mode 100644 index 000000000..415059ae6 --- /dev/null +++ b/dev/Styles/SettingsThemes.less @@ -0,0 +1,33 @@ + +.b-settings-themes { +} + +.b-themes-list { + + .e-item { + + display: inline-block; + border: 2px solid transparent; + cursor: pointer; + + color: #000; + background-color: #fff; + padding: 16px; + margin: 5px; + + &:hover { + border: 2px solid grey; + } + + &.selected { + background-color: #eee; + border: 2px solid #000; + } + + .e-image { + width: 100px; + height: 100px; + border: 1px solid #ddd; + } + } +} diff --git a/dev/Styles/SystemDropDown.less b/dev/Styles/SystemDropDown.less new file mode 100644 index 000000000..404be4649 --- /dev/null +++ b/dev/Styles/SystemDropDown.less @@ -0,0 +1,34 @@ + +.b-system-drop-down { + + .b-toolbar { + position: absolute; + top: 0; + right: 0; + height: 30px; + padding: 10px @rlLowMargin; + z-index: 103; + } + + .e-facebook-name { + display: inline-block; + padding-top: 4px; + } + + .btn.system-dropdown { + padding-left: 10px; + padding-right: 10px; + } + + .button-fb-logout { + margin: 5px; + } + + .email-title { + display: inline-block; + max-width: 200px; + text-align: left; + text-overflow: ellipsis; + overflow: hidden; + } +} \ No newline at end of file diff --git a/dev/Styles/Ui.less b/dev/Styles/Ui.less new file mode 100644 index 000000000..d290cf585 --- /dev/null +++ b/dev/Styles/Ui.less @@ -0,0 +1,130 @@ + +.g-ui-user-select-none { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -o-user-select: none; + user-select: none; + -webkit-touch-callout: none; +} + +.g-ui-clearfix { + .clearfix(); +} + +.g-ui-link { + color: #336699; + text-decoration: underline; + cursor: pointer; +} + +.g-ui-min-height-300 { + min-height: 300px; +} + +.g-ui-absolute-reset { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; +} + +.g-ui-menu { + + max-height: 400px; + max-width: 300px; + overflow-y: auto; + overflow-x: hidden; + + .e-link { + text-decoration: none; + cursor: pointer; + } + + .e-item > .e-link:hover { + background-color: #555; + background-image: none; + color: #fff; + } + + .e-item.disable > .e-link { + cursor: not-allowed; + background-color: #fff; + background-image: none; + color: grey; + } + + .e-item.disable [class^="icon-"] { + color: grey; + } +} + +.g-ui-table { + + display: table; + width: 100%; + + .e-row { + display: table-row; + } + + .e-cell { + display: table-cell; + vertical-align: top; + text-align: left; + } +} + +.g-ui-resizable-delimiter-highlight { + border: none; + border-right: 6px solid #aaa; +} + +html.rgba .g-ui-resizable-delimiter-highlight { + border-right-color: rgba(0, 0, 0, 0.2); +} + +.settings-saved-trigger { + + display: inline-block; + line-height: 17px; + font-size: 16px; + + .animated { + color: green; + } + + .success { + color: green; + .transition(opacity 0.5s linear); + .opacity(0); + } + + .error { + color: red; + .transition(opacity 0.5s linear); + .opacity(0); + } + + .visible { + .opacity(100); + } +} + +.settings-saved-trigger-input { + &.success { + border-color: green !important; + .transition(border-color 0.5s linear); + } + + &.error { + border-color: red !important; + .transition(border-color 0.5s linear); + } +} + diff --git a/dev/Styles/_BootstrapFix.less b/dev/Styles/_BootstrapFix.less new file mode 100644 index 000000000..1b0bfbf0b --- /dev/null +++ b/dev/Styles/_BootstrapFix.less @@ -0,0 +1,228 @@ + +body { + background-color: transparent; +} + +label { + cursor: pointer; +} + +.legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: @baseLineHeight; + font-size: @baseFontSize * 1.5; + line-height: @baseLineHeight * 2; + color: @grayDark; + border: 0; + border-bottom: 1px solid #e5e5e5; + + // Small + small { + font-size: @baseLineHeight * .75; + color: @grayLight; + }; +} + +.legend + .control-group { + margin-top: @baseLineHeight; + -webkit-margin-top-collapse: separate; +} + +.input-append input, .input-append select, .input-append .uneditable-input { + .border-radius(3px); +} + +select { + width: 223px; +} + +.btn-small.btn-small-small { + padding: 3px 9px; + font-size: 11px; + line-height: 11px; +} + +.btn.btn-ellipsis { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.btn.btn-narrow { + padding-left: 12px; + padding-right: 12px; +} + +.dropdown-menu { + .border-radius(@btnBorderRadius); +} + +.btn { + .border-radius(@btnBorderRadius); + background-image: none; + + &.disabled, &[disabled] { + .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)"); + } + + text-shadow: 0 1px 0 #fff; + + &:active { +// .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.3), 0 0 0 rgba(0,0,0,.1)"); + } +} + +.btn-group.open { + .dropdown-toggle { +// .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.3), 0 0 0 rgba(0,0,0,.1)"); + } +} + +html.rgba.textshadow { + .btn.btn-danger, .btn.btn-success, .btn.btn-primary { + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.3); + } +} + +.btn-toolbar { + margin-top: 0; + margin-bottom: 0; +} + +.dropdown-menu { + .border-radius(0); + .box-shadow(0px 1px 2px rgba(0,0,0,0.2)); +} + +.tooltip { + font-size: 14px; + &.in { + .opacity(100); + } + + .tooltip-class { + } + + .tooltip-big { + font-size: 18px; + padding: 0 10px; + } +} + +.tooltip-inner { + padding: 5px 10px; + .border-radius(2px); +} + +// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match +.btn-group > .btn:first-child { + -webkit-border-top-left-radius: @btnBorderRadius; + -moz-border-radius-topleft: @btnBorderRadius; + border-top-left-radius: @btnBorderRadius; + -webkit-border-bottom-left-radius: @btnBorderRadius; + -moz-border-radius-bottomleft: @btnBorderRadius; + border-bottom-left-radius: @btnBorderRadius; +} +// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: @btnBorderRadius; + -moz-border-radius-topright: @btnBorderRadius; + border-top-right-radius: @btnBorderRadius; + -webkit-border-bottom-right-radius: @btnBorderRadius; + -moz-border-radius-bottomright: @btnBorderRadius; + border-bottom-right-radius: @btnBorderRadius; +} +// Reset corners for large buttons +.btn-group > .btn.large:first-child { + -webkit-border-top-left-radius: @btnBorderRadius; + -moz-border-radius-topleft: @btnBorderRadius; + border-top-left-radius: @btnBorderRadius; + -webkit-border-bottom-left-radius: @btnBorderRadius; + -moz-border-radius-bottomleft: @btnBorderRadius; + border-bottom-left-radius: @btnBorderRadius; +} +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: @btnBorderRadius; + -moz-border-radius-topright: @btnBorderRadius; + border-top-right-radius: @btnBorderRadius; + -webkit-border-bottom-right-radius: @btnBorderRadius; + -moz-border-radius-bottomright: @btnBorderRadius; + border-bottom-right-radius: @btnBorderRadius; +} + +textarea, input[type="text"], input[type="password"], input[type="email"], input[type="search"] { + + border: @rlInputBorderSize solid @inputBorder; + + &:focus { + background-color: #fff; + border: @rlInputBorderSize solid darken(@inputBorder, 20%); + .box-shadow(none); + } +} +input[type="text"], input[type="password"], input[type="email"], input[type="search"] { + height: @baseLineHeight - (@rlInputBorderSize - 1) * 2; + line-height: @baseLineHeight - (@rlInputBorderSize - 1) * 2; +} + +select { + border: @rlInputBorderSize solid @inputBorder; +} + +.alert.alert-null-left-margin { + margin-left: 0; +} +.alert.alert-error a { + color: #b94a48; +} + +html.no-rgba .modal { + border-width: 0px !important; +} + +.modal-backdrop, .modal-backdrop.fade.in { + .opacity(10); +} + +.popups { + + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 1100; + overflow: auto; +// -webkit-overflow-scrolling: touch; + + .modal { + position: static; + z-index: 1101; + margin: 5% auto; + background-color: transparent; + overflow: hidden; + + .modal-body { + background-color: #fff; + max-height: none; + } + + .box-shadow(0 5px 80px rgba(0,0,0,0.3)); + } +} + +.modal.loginContent .modal-body, .modal.loginAdminContent .modal-body { + background-color: transparent !important; +} + +.picker.modal-dialog-bg, .picker.picker-dialog-bg { + z-index: 2000 !important; +} + +.picker.modal-dialog, .picker.picker-dialog { + z-index: 2001 !important; +} diff --git a/dev/Styles/_End.less b/dev/Styles/_End.less new file mode 100644 index 000000000..99a809136 --- /dev/null +++ b/dev/Styles/_End.less @@ -0,0 +1,2 @@ + + diff --git a/dev/Styles/_IcoMoonToBoot.less b/dev/Styles/_IcoMoonToBoot.less new file mode 100644 index 000000000..bacd9f4bb --- /dev/null +++ b/dev/Styles/_IcoMoonToBoot.less @@ -0,0 +1,142 @@ + +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'icomoon'; + src: url('fonts/icomoon.svg#icomoon') format('svg'); + } +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + font-size: 15px; + .ie7-restore-right-whitespace(); + vertical-align: text-top; +} + +/* White icons with optional class, or on hover/active states of certain elements */ +.icon-white, +.nav > .active > a > [class^="icon-"], +.nav > .active > a > [class*=" icon-"] { + color: #fff; +} + +.g-ui-menu .e-item:hover [class^="icon-"], +.g-ui-menu .e-item:hover [class*=" icon-"] { + color: #fff; +} + +[class^="icon2-"], +[class*=" icon2-"] { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + font-size: 15px; + .ie7-restore-right-whitespace(); + vertical-align: text-top; + background-repeat: no-repeat; +} + +.icon2-none { + background-image: none; +} + +.icon3-as-button { + cursor: pointer; +} + +.icon-checkbox-checked, .icon-checkbox-unchecked, .icon-checkbox-partial, .icon-radio-checked, .icon-radio-unchecked { + cursor: pointer; + color: #555; + font-size: 1em; + + &:hover, &:active { + color: #000; + } +} +.icon-white { + &.icon-checkbox-checked, &.icon-checkbox-unchecked, &.icon-checkbox-partial, &.icon-radio-checked, &.icon-radio-unchecked { + color: #eee; + + &:hover, &:active { + color: #fff; + } + } +} + +.icon-refresh.in-process { + background-position: 0px 0px; + background-image: url('@{sync-file}'); +} + +.denied-by-browser { + cursor: default; + .icon-checkbox-checked, icon-checkbox-unchecked { + cursor: default; + } +} + +.icon-arrow-right-3, .icon-arrow-down-3 { + width: 16px; + line-height: 20px; +} + +.icon2-reload { + background-image: url('@{sync-file-stop}'); + background-repeat: no-repeat; +} + +.icon2-aminate-reload { + background-image: url('@{sync-file}'); + background-repeat: no-repeat; +} + +@-webkit-keyframes rotation { + from {-webkit-transform: rotate(0deg);} + to {-webkit-transform: rotate(359deg);} +} + +@-moz-keyframes rotation { + from {-moz-transform: rotate(0deg);} + to {-moz-transform: rotate(359deg);} +} + +@keyframes rotation { + from {transform: rotate(0deg);} + to {transform: rotate(359deg);} +} + +.icon-repeat, .icon-spinner, .icon-spinner-2 { + width: 16px; + height: 16px; +} +.icon-repeat:before, .icon-spinner:before, .icon-spinner-2:before { + font-size: 16px; + line-height: 100%; +} + +html.no-cssanimations { + .icon-repeat, .icon-spinner, .icon-spinner-2 { + background-image: url('@{sync-file-stop}'); + background-repeat: no-repeat; + font-family: Arial; + &:before { + content: ""; + } + &.animated { + background-image: url('@{sync-file}'); + } + } +} + +html.cssanimations { + .icon-repeat.animated, .icon-spinner.animated, .icon-spinner-2.animated { + -webkit-animation: rotation 1s infinite linear; + -moz-animation: rotation 1s infinite linear; + animation: rotation 1s infinite linear; + } +} diff --git a/dev/Styles/_Select2Fix.less b/dev/Styles/_Select2Fix.less new file mode 100644 index 000000000..e90af3a6a --- /dev/null +++ b/dev/Styles/_Select2Fix.less @@ -0,0 +1,72 @@ + +.select2-container-multi { + + .select2-choices { + + background-image: none; + border: @rlInputBorderSize solid @inputBorder; + + .border-radius(@inputBorderRadius); + + .select2-search-choice { + line-height: 15px; + font-size: 16px; + } + } + + &.select2-container-active { + .select2-choices { + border: @rlInputBorderSize solid darken(@inputBorder, 20%); + .box-shadow(none); + } + } +} + +.select2-drop { + + .box-shadow(none); + + .select2-subname { + color: #777; + } + + .select2-highlighted .select2-subname { + color: #eee; + } +} + +.select2-results { + + margin: 0; + padding: 0; + max-height: 400px; + + .select2-searching { + padding: 1px 4px; + } +} + +.select2-icon { + line-height: 20px; + padding: 0 0 0 7px +} + +.select2-icon-result { + line-height: 40px; +} + +.select2-result-label { + margin: 0px !important; + padding: 5px !important; + font-size: 16px; + + height: 40px; + line-height: 40px; + + .select2-user-pic { + display: inline-block; + height: 40px; + width: 40px; + margin-right: 10px; + } +} diff --git a/dev/Styles/_Values.less b/dev/Styles/_Values.less new file mode 100644 index 000000000..84ef697d3 --- /dev/null +++ b/dev/Styles/_Values.less @@ -0,0 +1,34 @@ +@loader-white: "images/loader-white.gif"; +@loader-black: "images/loader-black.gif"; +@editor-sprite: "images/editor.png"; +@sync-file-stop: "images/sync.png"; +@sync-file: "images/sync.gif"; + +@rlLoaderWhite: "images/loader-white.gif"; +@rlLoaderBlack: "images/loader-black.gif"; +@rlEditorSprite: "images/editor.png"; + +@rlLeftWidth: 230px; +@rlInputBorderSize: 1px; +@rlMainBorderSize: 1px; +@rlLowBorderSize: 1px; + +@rlMainBorderRadius: 5px; +@rlLowBorderRadius: 3px; + +@rlMainShadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + +@rlLowMargin: 8px; +@rlBottomMargin: 5px; + +@rlMainDarkColor: #aaa; +@rlMessageDelimiterColor: #999; + +// bootstart +@btnBorderRadius: 2px; + +@tooltipColor: #eee; +@tooltipBackground: #333; +@tooltipArrowWidth: 5px; +@tooltipArrowColor: #333; + diff --git a/dev/ViewModels/AbstractSystemDropDownViewModel.js b/dev/ViewModels/AbstractSystemDropDownViewModel.js new file mode 100644 index 000000000..76a8699c8 --- /dev/null +++ b/dev/ViewModels/AbstractSystemDropDownViewModel.js @@ -0,0 +1,69 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function AbstractSystemDropDownViewModel() +{ + KnoinAbstractViewModel.call(this, 'Right', 'SystemDropDown'); + + var oData = RL.data(); + + this.accounts = oData.accounts; + this.accountEmail = oData.accountEmail; + this.accountsLoading = oData.accountsLoading; + this.allowAddAccount = RL.settingsGet('AllowAdditionalAccounts'); + + this.loading = ko.computed(function () { + return this.accountsLoading(); + }, this); + + this.accountClick = _.bind(this.accountClick, this); +} + +_.extend(AbstractSystemDropDownViewModel.prototype, KnoinAbstractViewModel.prototype); + +AbstractSystemDropDownViewModel.prototype.accountClick = function (oAccount, oEvent) +{ + if (oAccount && oEvent && !Utils.isUnd(oEvent.which) && 1 === oEvent.which) + { + var self = this; + this.accountsLoading(true); + _.delay(function () { + self.accountsLoading(false); + }, 1000); + } + + return true; +}; + +AbstractSystemDropDownViewModel.prototype.emailTitle = function () +{ + return RL.data().accountEmail(); +}; + +AbstractSystemDropDownViewModel.prototype.settingsClick = function () +{ + kn.setHash(RL.link().settings()); +}; + +AbstractSystemDropDownViewModel.prototype.addAccountClick = function () +{ + if (this.allowAddAccount) + { + kn.showScreenPopup(PopupsAddAccountViewModel); + } +}; + +AbstractSystemDropDownViewModel.prototype.logoutClick = function () +{ + RL.remote().logout(function () { + if (window.__rlah_clear) + { + window.__rlah_clear(); + } + + RL.loginAndLogoutReload(true, RL.settingsGet('ParentEmail') && 0 < RL.settingsGet('ParentEmail').length); + }); +}; \ No newline at end of file diff --git a/dev/ViewModels/AdminLoginViewModel.js b/dev/ViewModels/AdminLoginViewModel.js new file mode 100644 index 000000000..e84f6625a --- /dev/null +++ b/dev/ViewModels/AdminLoginViewModel.js @@ -0,0 +1,86 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function AdminLoginViewModel() +{ + KnoinAbstractViewModel.call(this, 'Right', 'AdminLogin'); + + this.login = ko.observable(''); + this.password = ko.observable(''); + + this.loginError = ko.observable(false); + this.passwordError = ko.observable(false); + + this.loginFocus = ko.observable(false); + + this.login.subscribe(function () { + this.loginError(false); + }, this); + + this.password.subscribe(function () { + this.passwordError(false); + }, this); + + this.submitRequest = ko.observable(false); + this.submitError = ko.observable(''); + + this.submitCommand = Utils.createCommand(this, function () { + + this.loginError('' === Utils.trim(this.login())); + this.passwordError('' === Utils.trim(this.password())); + + if (this.loginError() || this.passwordError()) + { + return false; + } + + this.submitRequest(true); + + RL.remote().adminLogin(_.bind(function (sResult, oData) { + + if (Enums.StorageResultType.Success === sResult && oData&& 'AdminLogin' === oData.Action) + { + if (oData.Result) + { + RL.loginAndLogoutReload(); + } + else if (oData.ErrorCode) + { + this.submitRequest(false); + this.submitError(Utils.getNotification(oData.ErrorCode)); + } + } + else + { + this.submitRequest(false); + this.submitError(Utils.getNotification(Enums.Notification.UnknownError)); + } + + }, this), this.login(), this.password()); + + return true; + + }, function () { + return !this.submitRequest(); + }); +} + +Utils.extendAsViewModel('AdminLoginViewModel', AdminLoginViewModel); + +AdminLoginViewModel.prototype.onShow = function () +{ + kn.routeOff(); + + _.delay(_.bind(function () { + this.loginFocus(true); + }, this), 100); + +}; + +AdminLoginViewModel.prototype.onHide = function () +{ + this.loginFocus(false); +}; diff --git a/dev/ViewModels/AdminMenuViewModel.js b/dev/ViewModels/AdminMenuViewModel.js new file mode 100644 index 000000000..6faff7d40 --- /dev/null +++ b/dev/ViewModels/AdminMenuViewModel.js @@ -0,0 +1,21 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @param {?} oScreen + * + * @constructor + * @extends KnoinAbstractViewModel + */ +function AdminMenuViewModel(oScreen) +{ + KnoinAbstractViewModel.call(this, 'Left', 'AdminMenu'); + + this.menu = oScreen.menu; +} + +Utils.extendAsViewModel('AdminMenuViewModel', AdminMenuViewModel); + +AdminMenuViewModel.prototype.link = function (sRoute) +{ + return '#/' + sRoute; +}; diff --git a/dev/ViewModels/AdminPaneViewModel.js b/dev/ViewModels/AdminPaneViewModel.js new file mode 100644 index 000000000..93b1e5240 --- /dev/null +++ b/dev/ViewModels/AdminPaneViewModel.js @@ -0,0 +1,22 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function AdminPaneViewModel() +{ + KnoinAbstractViewModel.call(this, 'Right', 'AdminPane'); + + this.adminDomain = ko.observable(RL.settingsGet('AdminDomain')); + this.version = ko.observable(RL.settingsGet('Version')); +} + +Utils.extendAsViewModel('AdminPaneViewModel', AdminPaneViewModel); + +AdminPaneViewModel.prototype.logoutClick = function () +{ + RL.remote().adminLogout(function () { + RL.loginAndLogoutReload(); + }); +}; \ No newline at end of file diff --git a/dev/ViewModels/LoginViewModel.js b/dev/ViewModels/LoginViewModel.js new file mode 100644 index 000000000..d9c2571ee --- /dev/null +++ b/dev/ViewModels/LoginViewModel.js @@ -0,0 +1,269 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function LoginViewModel() +{ + KnoinAbstractViewModel.call(this, 'Right', 'Login'); + + var oData = RL.data(); + + this.email = ko.observable(''); + this.login = ko.observable(''); + this.password = ko.observable(''); + this.signMe = ko.observable(false); + + this.logoMain = ko.observable('RainLoop'); + + this.emailError = ko.observable(false); + this.loginError = ko.observable(false); + this.passwordError = ko.observable(false); + + this.emailFocus = ko.observable(false); + this.loginFocus = ko.observable(false); + this.submitFocus = ko.observable(false); + + this.email.subscribe(function () { + this.emailError(false); + }, this); + + this.login.subscribe(function () { + this.loginError(false); + }, this); + + this.password.subscribe(function () { + this.passwordError(false); + }, this); + + this.submitRequest = ko.observable(false); + this.submitError = ko.observable(''); + + this.allowCustomLogin = oData.allowCustomLogin; + this.allowLanguagesOnLogin = oData.allowLanguagesOnLogin; + + this.langRequest = ko.observable(false); + this.mainLanguage = oData.mainLanguage; + this.bSendLanguage = false; + + this.mainLanguageFullName = ko.computed(function () { + return Utils.convertLangName(this.mainLanguage()); + }, this); + + this.signMeType = ko.observable(Enums.LoginSignMeType.Unused); + + this.signMeType.subscribe(function (iValue) { + this.signMe(Enums.LoginSignMeType.DefaultOn === iValue); + }, this); + + this.signMeVisibility = ko.computed(function () { + return Enums.LoginSignMeType.Unused !== this.signMeType(); + }, this); + + this.submitCommand = Utils.createCommand(this, function () { + + this.emailError('' === Utils.trim(this.email())); + this.passwordError('' === Utils.trim(this.password())); + + if (this.emailError() || this.passwordError()) + { + return false; + } + + this.submitRequest(true); + + RL.remote().login(_.bind(function (sResult, oData) { + + if (Enums.StorageResultType.Success === sResult && oData && 'Login' === oData.Action) + { + if (oData.Result) + { + RL.loginAndLogoutReload(); + } + else if (oData.ErrorCode) + { + this.submitRequest(false); + this.submitError(Utils.getNotification(oData.ErrorCode)); + } + else + { + this.submitRequest(false); + } + } + else + { + this.submitRequest(false); + this.submitError(Utils.getNotification(Enums.Notification.UnknownError)); + } + + }, this), this.email(), this.login(), this.password(), !!this.signMe(), + this.bSendLanguage ? this.mainLanguage() : ''); + + return true; + + }, function () { + return !this.submitRequest(); + }); + + this.facebookLoginEnabled = ko.observable(false); + + this.facebookCommand = Utils.createCommand(this, function () { + + window.open(RL.link().socialFacebook(), 'Facebook', 'left=200,top=100,width=650,height=335,menubar=no,status=no,resizable=yes,scrollbars=yes'); + return true; + + }, function () { + return !this.submitRequest() && this.facebookLoginEnabled(); + }); + + this.googleLoginEnabled = ko.observable(false); + + this.googleCommand = Utils.createCommand(this, function () { + + window.open(RL.link().socialGoogle(), 'Google', 'left=200,top=100,width=650,height=335,menubar=no,status=no,resizable=yes,scrollbars=yes'); + return true; + + }, function () { + return !this.submitRequest() && this.googleLoginEnabled(); + }); + + this.twitterLoginEnabled = ko.observable(false); + + this.twitterCommand = Utils.createCommand(this, function () { + + window.open(RL.link().socialTwitter(), 'Twitter', 'left=200,top=100,width=650,height=335,menubar=no,status=no,resizable=yes,scrollbars=yes'); + return true; + + }, function () { + return !this.submitRequest() && this.twitterLoginEnabled(); + }); + + this.loginFocus.subscribe(function (bValue) { + if (bValue && '' === this.login() && '' !== this.email()) + { + this.login(this.email()); + } + }, this); + + this.socialLoginEnabled = ko.computed(function () { + + var + bF = this.facebookLoginEnabled(), + bG = this.googleLoginEnabled(), + bT = this.twitterLoginEnabled() + ; + + return bF || bG || bT; + }, this); +} + +Utils.extendAsViewModel('LoginViewModel', LoginViewModel); + +LoginViewModel.prototype.onShow = function () +{ + kn.routeOff(); + + _.delay(_.bind(function () { + if ('' !== this.email() && '' !== this.password()) + { + this.submitFocus(true); + } + else + { + this.emailFocus(true); + } + + if (RL.settingsGet('UserLanguage')) + { + $.cookie('rllang', RL.data().language(), {'expires': 30}); + } + + }, this), 100); +}; + +LoginViewModel.prototype.onHide = function () +{ + this.submitFocus(false); + this.emailFocus(false); +}; + +LoginViewModel.prototype.onBuild = function () +{ + var + self = this, + sJsHash = RL.settingsGet('JsHash'), + fSocial = function (iErrorCode) { + iErrorCode = Utils.pInt(iErrorCode); + if (0 === iErrorCode) + { + self.submitRequest(true); + RL.loginAndLogoutReload(); + } + else + { + self.submitError(Utils.getNotification(iErrorCode)); + } + } + ; + + this.facebookLoginEnabled(!!RL.settingsGet('AllowFacebookSocial')); + this.twitterLoginEnabled(!!RL.settingsGet('AllowTwitterSocial')); + this.googleLoginEnabled(!!RL.settingsGet('AllowGoogleSocial')); + + switch ((RL.settingsGet('SignMe') || 'unused').toLowerCase()) + { + case Enums.LoginSignMeTypeAsString.DefaultOff: + this.signMeType(Enums.LoginSignMeType.DefaultOff); + break; + case Enums.LoginSignMeTypeAsString.DefaultOn: + this.signMeType(Enums.LoginSignMeType.DefaultOn); + break; + default: + case Enums.LoginSignMeTypeAsString.Unused: + this.signMeType(Enums.LoginSignMeType.Unused); + break; + } + + this.email(RL.data().devEmail); + this.login(RL.data().devLogin); + this.password(RL.data().devPassword); + + if (this.googleLoginEnabled()) + { + window['rl_' + sJsHash + '_google_login_service'] = fSocial; + } + + if (this.facebookLoginEnabled()) + { + window['rl_' + sJsHash + '_facebook_login_service'] = fSocial; + } + + if (this.twitterLoginEnabled()) + { + window['rl_' + sJsHash + '_twitter_login_service'] = fSocial; + } + + _.delay(function () { + RL.data().language.subscribe(function (sValue) { + self.langRequest(true); + $.ajax({ + 'url': RL.link().langLink(sValue), + 'dataType': 'script', + 'cache': true + }).done(function() { + self.bSendLanguage = true; + Utils.i18nToDoc(); + $.cookie('rllang', RL.data().language(), {'expires': 30}); + }).always(function() { + self.langRequest(false); + }); + }); + }, 50); +}; + +LoginViewModel.prototype.selectLanguage = function () +{ + kn.showScreenPopup(PopupsLanguagesViewModel); +}; + diff --git a/dev/ViewModels/MailBoxFolderListViewModel.js b/dev/ViewModels/MailBoxFolderListViewModel.js new file mode 100644 index 000000000..9415cb30d --- /dev/null +++ b/dev/ViewModels/MailBoxFolderListViewModel.js @@ -0,0 +1,113 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function MailBoxFolderListViewModel() +{ + KnoinAbstractViewModel.call(this, 'Left', 'MailFolderList'); + + this.folderList = RL.data().folderList; + this.folderListSystem = RL.data().folderListSystem; + + this.iDropOverTimer = 0; + + this.allowContacts = !!RL.settingsGet('ContactsIsSupported') && !!RL.settingsGet('ContactsIsAllowed'); +} + +Utils.extendAsViewModel('MailBoxFolderListViewModel', MailBoxFolderListViewModel); + +MailBoxFolderListViewModel.prototype.onBuild = function (oDom) +{ + oDom + .on('click', '.b-folders .e-item .e-link .e-collapsed-sign', function (oEvent) { + var + oFolder = ko.dataFor(this), + bCollapsed = false + ; + if (oFolder && oEvent) + { + bCollapsed = oFolder.collapsed(); + Utils.setExpandedFolder(oFolder.fullNameHash, bCollapsed); + + oFolder.collapsed(!bCollapsed); + oEvent.preventDefault(); + oEvent.stopPropagation(); + } + }) + .on('click', '.b-folders .e-item .e-link.selectable', function (oEvent) { + + oEvent.preventDefault(); + + var oFolder = ko.dataFor(this); + if (oFolder) + { + if (!RL.data().usePreviewPane()) + { + RL.data().message(null); + } + + if (oFolder.fullNameRaw === RL.data().currentFolderFullNameRaw()) + { + RL.cache().setFolderHash(oFolder.fullNameRaw, ''); + } + + kn.setHash(RL.link().mailBox(oFolder.fullNameHash)); + } + }) + ; +}; + +MailBoxFolderListViewModel.prototype.messagesDropOver = function (oFolder) +{ + window.clearTimeout(this.iDropOverTimer); + if (oFolder && oFolder.collapsed()) + { + this.iDropOverTimer = window.setTimeout(function () { + oFolder.collapsed(false); + Utils.setExpandedFolder(oFolder.fullNameHash, true); + Utils.windowResize(); + }, 500); + } +}; + +MailBoxFolderListViewModel.prototype.messagesDropOut = function () +{ + window.clearTimeout(this.iDropOverTimer); +}; + +/** + * + * @param {FolderModel} oToFolder + * @param {{helper:jQuery}} oUi + */ +MailBoxFolderListViewModel.prototype.messagesDrop = function (oToFolder, oUi) +{ + if (oToFolder && oUi && oUi.helper) + { + var + sFromFolderFullNameRaw = oUi.helper.data('rl-folder'), + aUids = oUi.helper.data('rl-uids') + ; + + if (MailBoxMessageListViewModel && MailBoxMessageListViewModel.__vm && Utils.isNormal(sFromFolderFullNameRaw) && Utils.isArray(aUids)) + { + MailBoxMessageListViewModel.__vm.moveMessagesToFolder( + sFromFolderFullNameRaw, aUids, oToFolder.fullNameRaw); + } + } +}; + +MailBoxFolderListViewModel.prototype.composeClick = function () +{ + kn.showScreenPopup(PopupsComposeViewModel); +}; + +MailBoxFolderListViewModel.prototype.contactsClick = function () +{ + if (this.allowContacts) + { + kn.showScreenPopup(PopupsContactsViewModel); + } +}; diff --git a/dev/ViewModels/MailBoxMessageListViewModel.js b/dev/ViewModels/MailBoxMessageListViewModel.js new file mode 100644 index 000000000..4cceecd46 --- /dev/null +++ b/dev/ViewModels/MailBoxMessageListViewModel.js @@ -0,0 +1,935 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function MailBoxMessageListViewModel() +{ + KnoinAbstractViewModel.call(this, 'Right', 'MailMessageList'); + + this.sLastUid = null; + this.emptySubjectValue = ''; + + var oData = RL.data(); + + this.popupVisibility = RL.popupVisibility; + + this.messageList = oData.messageList; + this.currentMessage = oData.currentMessage; + this.isMessageSelected = oData.isMessageSelected; + this.messageListSearch = oData.messageListSearch; + this.messageListError = oData.messageListError; + this.folderMenuForMove = oData.folderMenuForMove; + + this.useCheckboxesInList = oData.useCheckboxesInList; + + this.mainMessageListSearch = oData.mainMessageListSearch; + this.messageListEndFolder = oData.messageListEndFolder; + + this.messageListChecked = oData.messageListChecked; + this.messageListCheckedOrSelected = oData.messageListCheckedOrSelected; + this.messageListCheckedOrSelectedUidsWithSubMails = oData.messageListCheckedOrSelectedUidsWithSubMails; + this.messageListCompleteLoadingThrottle = oData.messageListCompleteLoadingThrottle; + + Utils.initOnStartOrLangChange(function () { + this.emptySubjectValue = Utils.i18n('MESSAGE_LIST/EMPTY_SUBJECT_TEXT'); + }, this); + + this.userQuota = oData.userQuota; + this.userUsageSize = oData.userUsageSize; + this.userUsageProc = oData.userUsageProc; + + // append drag and drop + this.dragOver = ko.observable(false).extend({'throttle': 1}); + this.dragOverEnter = ko.observable(false).extend({'throttle': 1}); + this.dragOverArea = ko.observable(null); + this.dragOverBodyArea = ko.observable(null); + + this.messageListItemTemplate = ko.computed(function () { + return oData.usePreviewPane() ? + 'MailMessageListItem' : 'MailMessageListItemNoPreviewPane'; + }); + + this.messageListSearchDesc = ko.computed(function () { + var sValue = oData.messageListEndSearch(); + return '' === sValue ? '' : Utils.i18n('MESSAGE_LIST/SEARCH_RESULT_FOR', {'SEARCH': sValue}); + }); + + this.messageListPagenator = ko.computed(function () { + + var + iPrev = 0, + iNext = 0, + iLimit = 2, + aResult = [], + iCurrentPage = oData.messageListPage(), + iPageCount = oData.messageListPageCount(), + + /** + * @param {number} iIndex + * @param {boolean=} bPush + * @param {string=} sCustomName + */ + fAdd = function (iIndex, bPush, sCustomName) { + + var oData = { + 'current': iIndex === iCurrentPage, + 'name': Utils.isUnd(sCustomName) ? iIndex.toString() : sCustomName.toString(), + 'custom': Utils.isUnd(sCustomName) ? false : true, + 'title': Utils.isUnd(sCustomName) ? '' : iIndex.toString(), + 'value': iIndex.toString() + }; + + if (Utils.isUnd(bPush) ? true : !!bPush) + { + aResult.push(oData); + } + else + { + aResult.unshift(oData); + } + } + ; + + if (1 < iPageCount || (0 < iPageCount && iPageCount < iCurrentPage)) +// if (0 < iPageCount && 0 < iCurrentPage) + { + if (iPageCount < iCurrentPage) + { + fAdd(iPageCount); + iPrev = iPageCount; + iNext = iPageCount; + } + else + { + if (3 >= iCurrentPage || iPageCount - 2 <= iCurrentPage) + { + iLimit += 2; + } + + fAdd(iCurrentPage); + iPrev = iCurrentPage; + iNext = iCurrentPage; + } + + while (0 < iLimit) { + + iPrev -= 1; + iNext += 1; + + if (0 < iPrev) + { + fAdd(iPrev, false); + iLimit--; + } + + if (iPageCount >= iNext) + { + fAdd(iNext, true); + iLimit--; + } + else if (0 >= iPrev) + { + break; + } + } + + if (3 === iPrev) + { + fAdd(2, false); + } + else if (3 < iPrev) + { + fAdd(Math.round((iPrev - 1) / 2), false, '...'); + } + + if (iPageCount - 2 === iNext) + { + fAdd(iPageCount - 1, true); + } + else if (iPageCount - 2 > iNext) + { + fAdd(Math.round((iPageCount + iNext) / 2), true, '...'); + } + + // first and last + if (1 < iPrev) + { + fAdd(1, false); + } + + if (iPageCount > iNext) + { + fAdd(iPageCount, true); + } + } + + return aResult; + + }, this); + + this.checkAll = ko.computed({ + 'read': function () { + return 0 < RL.data().messageListCheckedOrSelected().length; + }, + + 'write': function (bValue) { + bValue = !!bValue; + _.each(RL.data().messageList(), function (oMessage) { + oMessage.checked(bValue); + }); + + if (!bValue) + { + RL.data().message(null); + } + } + }); + + this.inputMessageListSearchFocus = ko.observable(false); + + this.sLastSearchValue = ''; + this.inputProxyMessageListSearch = ko.computed({ + 'read': this.mainMessageListSearch, + 'write': function (sValue) { + this.sLastSearchValue = sValue; + }, + 'owner': this + }); + + this.isIncompleteChecked = ko.computed(function () { + var + iM = RL.data().messageList().length, + iC = RL.data().messageListCheckedOrSelected().length + ; + return 0 < iM && 0 < iC && iM > iC; + }, this); + + this.hasMessages = ko.computed(function () { + return 0 < this.messageList().length; + }, this); + + this.hasCheckedLines = ko.computed(function () { + return 0 < this.messageListChecked().length; + }, this); + + this.hasCheckedOrSelectedLines = ko.computed(function () { + return 0 < this.messageListCheckedOrSelected().length; + }, this); + + this.isSpamFolder = ko.computed(function () { + return RL.data().spamFolder() === this.messageListEndFolder(); + }, this); + + this.isTrashFolder = ko.computed(function () { + return RL.data().trashFolder() === this.messageListEndFolder(); + }, this); + + this.canBeMoved = this.hasCheckedOrSelectedLines; + + this.clearCommand = Utils.createCommand(this, function () { + kn.showScreenPopup(PopupsFolderClearViewModel, [RL.data().currentFolder()]); + }); + + this.multyForwardCommand = Utils.createCommand(this, function () { + kn.showScreenPopup(PopupsComposeViewModel, [Enums.ComposeType.ForwardAsAttachment, RL.data().messageListCheckedOrSelected()]); + }, this.canBeMoved); + + this.deleteWithoutMoveCommand = Utils.createCommand(this, function () { + this.deleteSelectedMessageFromCurrentFolder(Enums.FolderType.Trash, false); + }, this.canBeMoved); + + this.deleteCommand = Utils.createCommand(this, function () { + this.deleteSelectedMessageFromCurrentFolder(Enums.FolderType.Trash, true); + }, this.canBeMoved); + + this.spamCommand = Utils.createCommand(this, function () { + this.deleteSelectedMessageFromCurrentFolder(Enums.FolderType.Spam, true); + }, this.canBeMoved); + + this.moveCommand = Utils.createCommand(this, Utils.emptyFunction, this.canBeMoved); + + this.setCommand = Utils.createCommand(this, Utils.emptyFunction, this.hasCheckedLines); + + this.checkCommand = Utils.createCommand(this, Utils.emptyFunction, this.hasCheckedLines); + + this.reloadCommand = Utils.createCommand(this, function () { + if (!RL.data().messageListCompleteLoadingThrottle()) + { + RL.reloadMessageList(false, true); + } + }); + + this.quotaTooltip = _.bind(this.quotaTooltip, this); + + this.selector = new Selector(this.messageList, this.currentMessage, + '.messageListItem .actionHandle', '.messageListItem.selected', '.messageListItem .checkboxMessage'); + + this.selector.on('onItemSelect', _.bind(function (oMessage) { + if (oMessage) + { + oData.message(oData.staticMessageList.populateByMessageListItem(oMessage)); + this.populateMessageBody(oData.message()); + } + else + { + oData.message(null); + } + }, this)); + + this.selector.on('onItemGetUid', function (oMessage) { + return oMessage ? oMessage.generateUid() : ''; + }); + + this.selector.on('onDelete', _.bind(function () { + if (0 < RL.data().messageListCheckedOrSelected().length) + { + this.deleteCommand(); + } + }, this)); +} + +Utils.extendAsViewModel('MailBoxMessageListViewModel', MailBoxMessageListViewModel); + +/** + * @type {string} + */ +MailBoxMessageListViewModel.prototype.emptySubjectValue = ''; + +MailBoxMessageListViewModel.prototype.searchEnterAction = function () +{ + this.mainMessageListSearch(this.sLastSearchValue); + this.inputMessageListSearchFocus(false); +}; + +MailBoxMessageListViewModel.prototype.cancelSearch = function () +{ + this.mainMessageListSearch(''); + this.inputMessageListSearchFocus(false); +}; + +/** + * @param {string} sFromFolderFullNameRaw + * @param {Array} aUidForRemove + * @param {string=} sToFolderFullNameRaw + * @param {boolean=} bVisialEffectOnly = false + */ +MailBoxMessageListViewModel.prototype.removeMessagesFromList = function (sFromFolderFullNameRaw, aUidForRemove, sToFolderFullNameRaw, bVisialEffectOnly) +{ + sToFolderFullNameRaw = Utils.isNormal(sToFolderFullNameRaw) ? sToFolderFullNameRaw : ''; + bVisialEffectOnly = Utils.isUnd(bVisialEffectOnly) ? false : !!bVisialEffectOnly; + + var + iUnseenCount = 0 , + oData = RL.data(), + oFromFolder = RL.cache().getFolderFromCacheList(sFromFolderFullNameRaw), + oToFolder = '' === sToFolderFullNameRaw ? null : RL.cache().getFolderFromCacheList(sToFolderFullNameRaw || ''), + sCurrentFolderFullNameRaw = oData.currentFolderFullNameRaw(), + oCurrentMessage = oData.message(), + aMessages = sCurrentFolderFullNameRaw === sFromFolderFullNameRaw ? _.filter(oData.messageList(), function (oMessage) { + return oMessage && -1 < Utils.inArray(oMessage.uid, aUidForRemove); + }) : [] + ; + + if (!bVisialEffectOnly) + { + _.each(aMessages, function (oMessage) { + if (oMessage && oMessage.unseen()) + { + iUnseenCount++; + } + }); + } + + if (oFromFolder && !bVisialEffectOnly) + { + oFromFolder.messageCountAll(0 <= oFromFolder.messageCountAll() - aUidForRemove.length ? + oFromFolder.messageCountAll() - aUidForRemove.length : 0); + + if (0 < iUnseenCount) + { + oFromFolder.messageCountUnread(0 <= oFromFolder.messageCountUnread() - iUnseenCount ? + oFromFolder.messageCountUnread() - iUnseenCount : 0); + } + } + + if (oToFolder && !bVisialEffectOnly) + { + oToFolder.messageCountAll(oToFolder.messageCountAll() + aUidForRemove.length); + if (0 < iUnseenCount) + { + oToFolder.messageCountUnread(oToFolder.messageCountUnread() + iUnseenCount); + } + } + + if (0 < aMessages.length) + { + _.each(aMessages, function (oMessage) { + if (oCurrentMessage && oCurrentMessage.requestHash === oMessage.requestHash) + { + oCurrentMessage = null; + oData.message(null); + } + + oMessage.deleted(true); + }); + + _.delay(function () { + _.each(aMessages, function (oMessage) { + oData.messageList.remove(oMessage); + }); + }, 400); + + if (!bVisialEffectOnly) + { + RL.data().messageListIsNotCompleted(true); + RL.cache().setFolderHash(sFromFolderFullNameRaw, ''); + + if (Utils.isNormal(sToFolderFullNameRaw)) + { + RL.cache().setFolderHash(sToFolderFullNameRaw || '', ''); + } + } + } +}; + +/** + * @param {string=} sToFolderFullNameRaw + */ +MailBoxMessageListViewModel.prototype.removeCheckedOrSelectedMessagesFromList = function (sToFolderFullNameRaw) +{ + this.removeMessagesFromList(RL.data().currentFolderFullNameRaw(), _.map(RL.data().messageListCheckedOrSelected(), function (oMessage) { + return oMessage.uid; + }), sToFolderFullNameRaw); +}; + +MailBoxMessageListViewModel.prototype.moveOrDeleteResponse = function (sResult, oData) +{ + if (Enums.StorageResultType.Success === sResult && RL.data().currentFolder()) + { + if (oData && Utils.isArray(oData.Result) && 2 === oData.Result.length) + { + RL.cache().setFolderHash(oData.Result[0], oData.Result[1]); + } + else + { + if (oData && Enums.Notification.CantMoveMessage === oData.ErrorCode) + { + window.alert(Utils.getNotification(Enums.Notification.CantMoveMessage)); + } + + RL.cache().setFolderHash(RL.data().currentFolderFullNameRaw(), ''); + } + + RL.reloadMessageList(); + + RL.quotaDebounce(); + } +}; + +/** + * @param {string} sFromFolderFullNameRaw + * @param {Array} aUidForRemove + * @param {string} sToFolderFullNameRaw + */ +MailBoxMessageListViewModel.prototype.moveMessagesToFolder = function (sFromFolderFullNameRaw, aUidForRemove, sToFolderFullNameRaw) +{ + if (sFromFolderFullNameRaw !== sToFolderFullNameRaw && Utils.isArray(aUidForRemove) && 0 < aUidForRemove.length) + { + var + oFromFolder = RL.cache().getFolderFromCacheList(sFromFolderFullNameRaw), + oToFolder = RL.cache().getFolderFromCacheList(sToFolderFullNameRaw) + ; + + if (oFromFolder && oToFolder) + { + RL.remote().messagesMove( + _.bind(this.moveOrDeleteResponse, this), + oFromFolder.fullNameRaw, + oToFolder.fullNameRaw, + aUidForRemove + ); + + oToFolder.actionBlink(true); + + this.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove, sToFolderFullNameRaw); + return true; + } + } + + return false; +}; + +/** + * @param {string} sToFolderFullNameRaw + * @return {boolean} + */ +MailBoxMessageListViewModel.prototype.moveSelectedMessagesToFolder = function (sToFolderFullNameRaw) +{ + if (this.canBeMoved()) + { + return this.moveMessagesToFolder(RL.data().currentFolderFullNameRaw(), + RL.data().messageListCheckedOrSelectedUidsWithSubMails(), sToFolderFullNameRaw); + } + + return false; +}; + +/** + * @param {number} iType + * @param {boolean=} bUseFolder = true + */ +MailBoxMessageListViewModel.prototype.deleteSelectedMessageFromCurrentFolder = function (iType, bUseFolder) +{ + if (this.canBeMoved()) + { + bUseFolder = Utils.isUnd(bUseFolder) ? true : !!bUseFolder; + var oTrashOrSpamFolder = RL.cache().getFolderFromCacheList( + Enums.FolderType.Spam === iType ? RL.data().spamFolder() : RL.data().trashFolder()); + + if (!oTrashOrSpamFolder && bUseFolder) + { + kn.showScreenPopup(PopupsFolderSystemViewModel, [ + Enums.FolderType.Spam === iType ? Enums.SetSystemFoldersNotification.Spam : Enums.SetSystemFoldersNotification.Trash]); + } + else if (!bUseFolder || (oTrashOrSpamFolder && (Consts.Values.UnuseOptionValue === oTrashOrSpamFolder.fullNameRaw || + RL.data().currentFolderFullNameRaw() === oTrashOrSpamFolder.fullNameRaw))) + { + RL.remote().messagesDelete( + _.bind(this.moveOrDeleteResponse, this), + RL.data().currentFolderFullNameRaw(), + RL.data().messageListCheckedOrSelectedUidsWithSubMails() + ); + + this.removeCheckedOrSelectedMessagesFromList(); + } + else if (oTrashOrSpamFolder) + { + RL.remote().messagesMove( + _.bind(this.moveOrDeleteResponse, this), + RL.data().currentFolderFullNameRaw(), + oTrashOrSpamFolder.fullNameRaw, + RL.data().messageListCheckedOrSelectedUidsWithSubMails() + ); + + oTrashOrSpamFolder.actionBlink(true); + this.removeCheckedOrSelectedMessagesFromList(oTrashOrSpamFolder.fullNameRaw); + } + } +}; + +MailBoxMessageListViewModel.prototype.dragAndDronHelper = function (oMessageListItem) +{ + if (oMessageListItem) + { + oMessageListItem.checked(true); + } + + var oEl = Utils.draggeblePlace(); + oEl.data('rl-folder', RL.data().currentFolderFullNameRaw()); + oEl.data('rl-uids', RL.data().messageListCheckedOrSelectedUidsWithSubMails()); + oEl.find('.text').text(RL.data().messageListCheckedOrSelectedUidsWithSubMails().length); + + return oEl; +}; + +/** + * @param {string} sResult + * @param {AjaxJsonDefaultResponse} oData + * @param {boolean} bCached + */ +MailBoxMessageListViewModel.prototype.onMessageResponse = function (sResult, oData, bCached) +{ + var oRainLoopData = RL.data(); + + oRainLoopData.messageLoading(false); + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + oRainLoopData.setMessage(oData, bCached); + } + else if (Enums.StorageResultType.Unload === sResult) + { + oRainLoopData.message(null); + oRainLoopData.messageError(''); + } + else if (Enums.StorageResultType.Abort !== sResult) + { + oRainLoopData.message(null); + oRainLoopData.messageError((oData && oData.ErrorCode ? + Utils.getNotification(oData.ErrorCode) : + Utils.getNotification(Enums.Notification.UnknownError))); + } +}; + +MailBoxMessageListViewModel.prototype.populateMessageBody = function (oMessage) +{ + if (oMessage) + { + if (RL.remote().message(this.onMessageResponse, oMessage.folderFullNameRaw, oMessage.uid)) + { + RL.data().messageLoading(true); + } + else + { + Utils.log('Error: Unknown message request: ' + oMessage.folderFullNameRaw + ' ~ ' + oMessage.uid + ' [e-101]'); + } + } +}; + +/** + * @param {string} sFolderFullNameRaw + * @param {number} iSetAction + * @param {Array=} aMessages = null + */ +MailBoxMessageListViewModel.prototype.setAction = function (sFolderFullNameRaw, iSetAction, aMessages) +{ + var + aUids = [], + oFolder = null, + oCache = RL.cache(), + iAlreadyUnread = 0 + ; + + if (Utils.isUnd(aMessages)) + { + aMessages = RL.data().messageListChecked(); + } + + aUids = _.map(aMessages, function (oMessage) { + return oMessage.uid; + }); + + if ('' !== sFolderFullNameRaw && 0 < aUids.length) + { + switch (iSetAction) { + case Enums.MessageSetAction.SetSeen: + _.each(aMessages, function (oMessage) { + if (oMessage.unseen()) + { + iAlreadyUnread++; + } + + oMessage.unseen(false); + oCache.storeMessageFlagsToCache(oMessage); + }); + + oFolder = oCache.getFolderFromCacheList(sFolderFullNameRaw); + if (oFolder) + { + oFolder.messageCountUnread(oFolder.messageCountUnread() - iAlreadyUnread); + } + + RL.remote().messageSetSeen(Utils.emptyFunction, sFolderFullNameRaw, aUids, true); + break; + case Enums.MessageSetAction.UnsetSeen: + _.each(aMessages, function (oMessage) { + if (oMessage.unseen()) + { + iAlreadyUnread++; + } + + oMessage.unseen(true); + oCache.storeMessageFlagsToCache(oMessage); + }); + + oFolder = oCache.getFolderFromCacheList(sFolderFullNameRaw); + if (oFolder) + { + oFolder.messageCountUnread(oFolder.messageCountUnread() - iAlreadyUnread + aUids.length); + } + RL.remote().messageSetSeen(Utils.emptyFunction, sFolderFullNameRaw, aUids, false); + break; + case Enums.MessageSetAction.SetFlag: + _.each(aMessages, function (oMessage) { + oMessage.flagged(true); + oCache.storeMessageFlagsToCache(oMessage); + }); + RL.remote().messageSetFlagged(Utils.emptyFunction, sFolderFullNameRaw, aUids, true); + break; + case Enums.MessageSetAction.UnsetFlag: + _.each(aMessages, function (oMessage) { + oMessage.flagged(false); + oCache.storeMessageFlagsToCache(oMessage); + }); + RL.remote().messageSetFlagged(Utils.emptyFunction, sFolderFullNameRaw, aUids, false); + break; + } + + RL.reloadFlagsCurrentMessageListAndMessageFromCache(); + } +}; + +/** + * @param {string} sFolderFullNameRaw + * @param {number} iSetAction + */ +MailBoxMessageListViewModel.prototype.setActionForAll = function (sFolderFullNameRaw, iSetAction) +{ + var + oFolder = null, + aMessages = RL.data().messageList(), + oCache = RL.cache() + ; + + if ('' !== sFolderFullNameRaw) + { + oFolder = oCache.getFolderFromCacheList(sFolderFullNameRaw); + + if (oFolder) + { + switch (iSetAction) { + case Enums.MessageSetAction.SetSeen: + oFolder = oCache.getFolderFromCacheList(sFolderFullNameRaw); + if (oFolder) + { + _.each(aMessages, function (oMessage) { + oMessage.unseen(false); + }); + + oFolder.messageCountUnread(0); + oCache.clearMessageFlagsFromCacheByFolder(sFolderFullNameRaw); + } + + RL.remote().messageSetSeenToAll(Utils.emptyFunction, sFolderFullNameRaw, true); + break; + case Enums.MessageSetAction.UnsetSeen: + oFolder = oCache.getFolderFromCacheList(sFolderFullNameRaw); + if (oFolder) + { + _.each(aMessages, function (oMessage) { + oMessage.unseen(true); + }); + + oFolder.messageCountUnread(oFolder.messageCountAll()); + oCache.clearMessageFlagsFromCacheByFolder(sFolderFullNameRaw); + } + RL.remote().messageSetSeenToAll(Utils.emptyFunction, sFolderFullNameRaw, false); + break; + } + + RL.reloadFlagsCurrentMessageListAndMessageFromCache(); + } + } +}; + +MailBoxMessageListViewModel.prototype.listSetSeen = function () +{ + this.setAction(RL.data().currentFolderFullNameRaw(), Enums.MessageSetAction.SetSeen, RL.data().messageListCheckedOrSelected()); +}; + +MailBoxMessageListViewModel.prototype.listSetAllSeen = function () +{ + this.setActionForAll(RL.data().currentFolderFullNameRaw(), Enums.MessageSetAction.SetSeen); +}; + +MailBoxMessageListViewModel.prototype.listUnsetSeen = function () +{ + this.setAction(RL.data().currentFolderFullNameRaw(), Enums.MessageSetAction.UnsetSeen, RL.data().messageListCheckedOrSelected()); +}; + +MailBoxMessageListViewModel.prototype.listSetFlags = function () +{ + this.setAction(RL.data().currentFolderFullNameRaw(), Enums.MessageSetAction.SetFlag, RL.data().messageListCheckedOrSelected()); +}; + +MailBoxMessageListViewModel.prototype.listUnsetFlags = function () +{ + this.setAction(RL.data().currentFolderFullNameRaw(), Enums.MessageSetAction.UnsetFlag, RL.data().messageListCheckedOrSelected()); +}; + +MailBoxMessageListViewModel.prototype.onBuild = function (oDom) +{ + var + self = this, + oData = RL.data() + ; + + this.oContentVisible = $('.b-content', oDom); + this.oContentScrollable = $('.content', this.oContentVisible); + + this.oContentVisible.on('click', '.fullThreadHandle', function () { + var + aList = [], + oMessage = ko.dataFor(this) + ; + + if (oMessage && !oMessage.lastInCollapsedThreadLoading()) + { + RL.data().messageListThreadFolder(oMessage.folderFullNameRaw); + + aList = RL.data().messageListThreadUids(); + + if (oMessage.lastInCollapsedThread()) + { + aList.push(0 < oMessage.parentUid() ? oMessage.parentUid() : oMessage.uid); + } + else + { + aList = _.without(aList, 0 < oMessage.parentUid() ? oMessage.parentUid() : oMessage.uid); + } + + RL.data().messageListThreadUids(_.uniq(aList)); + + oMessage.lastInCollapsedThreadLoading(true); + oMessage.lastInCollapsedThread(!oMessage.lastInCollapsedThread()); + RL.reloadMessageList(); + } + + return false; + }); + + this.selector.init(this.oContentVisible, this.oContentScrollable); + + $document.on('keydown', function (oEvent) { + + var + bResult = true, + iKeyCode = oEvent ? oEvent.keyCode : 0 + ; + + if (oEvent && self.viewModelVisibility() && oData.useKeyboardShortcuts() && !RL.popupVisibility() && !oData.messageFullScreenMode() && !Utils.inFocus()) + { + if (oData.usePreviewPane() || (!oData.message() && (Enums.EventKeyCode.Delete === iKeyCode || Enums.EventKeyCode.A === iKeyCode))) + { + if (oEvent.ctrlKey && Enums.EventKeyCode.A === iKeyCode) + { + self.checkAll(!(self.checkAll() && !self.isIncompleteChecked())); + bResult = false; + } + } + } + + return bResult; + }); + + oDom + .on('click', '.pagenator .page', function () { + var oPage = ko.dataFor(this); + if (oPage) + { + kn.setHash(RL.link().mailBox( + oData.currentFolderFullNameHash(), + oPage.value, + oData.messageListSearch() + )); + } + }) + .on('click', '.messageList .checkboxCkeckAll', function () { + self.checkAll(!self.checkAll()); + }) + .on('click', '.messageList .messageListItem .flagParent', function () { + + var + oMessage = ko.dataFor(this), + aChecked = oData.messageListCheckedOrSelected(), + aCheckedUids = [] + ; + + if (oMessage) + { + if (0 < aChecked.length) + { + aCheckedUids = _.map(aChecked, function (oMessage) { + return oMessage.uid; + }); + } + + if (0 < aCheckedUids.length && -1 < Utils.inArray(oMessage.uid, aCheckedUids)) + { + self.setAction(oMessage.folderFullNameRaw, oMessage.flagged() ? + Enums.MessageSetAction.UnsetFlag : Enums.MessageSetAction.SetFlag, aChecked); + } + else + { + self.setAction(oMessage.folderFullNameRaw, oMessage.flagged() ? + Enums.MessageSetAction.UnsetFlag : Enums.MessageSetAction.SetFlag, [oMessage]); + } + } + }) + ; + + ko.computed(function () { + + var + oData = RL.data(), + bViewModelVisibility = this.viewModelVisibility(), + bPopupVisibility = RL.popupVisibility(), + bUseKeyboardShortcuts = oData.useKeyboardShortcuts(), + bMessageFullScreenMode = oData.messageFullScreenMode() + ; + + this.selector.useKeyboard(bViewModelVisibility && bUseKeyboardShortcuts && !bMessageFullScreenMode && !bPopupVisibility); + + }, this).extend({'notify': 'always'}); + + this.initUploaderForAppend(); +}; + +MailBoxMessageListViewModel.prototype.composeClick = function () +{ + kn.showScreenPopup(PopupsComposeViewModel); +}; + +MailBoxMessageListViewModel.prototype.advancedSearchClick = function () +{ + kn.showScreenPopup(PopupsAdvancedSearchViewModel); +}; + +MailBoxMessageListViewModel.prototype.quotaTooltip = function () +{ + return Utils.i18n('MESSAGE_LIST/QUOTA_SIZE', { + 'SIZE': Utils.friendlySize(this.userUsageSize()), + 'PROC': this.userUsageProc(), + 'LIMIT': Utils.friendlySize(this.userQuota()) + }); +}; + +MailBoxMessageListViewModel.prototype.initUploaderForAppend = function () +{ + if (!RL.settingsGet('AllowAppendMessage') || !this.dragOverArea()) + { + return false; + } + + var oJua = new Jua({ + 'action': RL.link().append(), + 'name': 'AppendFile', + 'queueSize': 1, + 'multipleSizeLimit': 1, + 'disableFolderDragAndDrop': true, + 'hidden': { + 'Folder': function () { + return RL.data().currentFolderFullNameRaw(); + } + }, + 'dragAndDropElement': this.dragOverArea(), + 'dragAndDropBodyElement': this.dragOverBodyArea(), + 'onDragEnter': _.bind(function () { + this.dragOverEnter(true); + }, this), + 'onDragLeave': _.bind(function () { + this.dragOverEnter(false); + }, this), + 'onBodyDragEnter': _.bind(function () { + this.dragOver(true); + }, this), + 'onBodyDragLeave': _.bind(function () { + this.dragOver(false); + }, this), + 'onSelect': _.bind(function (sUid, oData) { + if (sUid && oData && 'message/rfc822' === oData['Type']) + { + RL.data().messageListLoading(true); + return true; + } + + return false; + }), + 'onComplete': _.bind(function () { + RL.reloadMessageList(true, true); + }, this) + }); + + return !!oJua; +}; \ No newline at end of file diff --git a/dev/ViewModels/MailBoxMessageViewViewModel.js b/dev/ViewModels/MailBoxMessageViewViewModel.js new file mode 100644 index 000000000..0cb5a3842 --- /dev/null +++ b/dev/ViewModels/MailBoxMessageViewViewModel.js @@ -0,0 +1,320 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function MailBoxMessageViewViewModel() +{ + KnoinAbstractViewModel.call(this, 'Right', 'MailMessageView'); + + var + sPic = '', + oData = RL.data(), + self = this, + createCommandHelper = function (sType) { + return Utils.createCommand(self, function () { + this.replyOrforward(sType); + }, self.canBeRepliedOrForwarded); + } + ; + + this.oMessageScrollerDom = null; + + this.message = oData.message; + this.messageLoading = oData.messageLoading; + this.messageLoadingThrottle = oData.messageLoadingThrottle; + this.messagesBodiesDom = oData.messagesBodiesDom; + this.useThreads = oData.useThreads; + this.replySameFolder = oData.replySameFolder; + this.usePreviewPane = oData.usePreviewPane; + this.isMessageSelected = oData.isMessageSelected; + this.messageActiveDom = oData.messageActiveDom; + this.messageError = oData.messageError; + + this.fullScreenMode = oData.messageFullScreenMode; + + this.showFullInfo = ko.observable(false); + + this.messageVisibility = ko.computed(function () { + return !this.messageLoadingThrottle() && !!this.message(); + }, this); + + this.canBeRepliedOrForwarded = this.messageVisibility; + + // commands + this.closeMessage = Utils.createCommand(this, function () { + oData.message(null); + }); + + this.replyCommand = createCommandHelper(Enums.ComposeType.Reply); + this.replyAllCommand = createCommandHelper(Enums.ComposeType.ReplyAll); + this.forwardCommand = createCommandHelper(Enums.ComposeType.Forward); + this.forwardAsAttachmentCommand = createCommandHelper(Enums.ComposeType.ForwardAsAttachment); + + this.messageVisibilityCommand = Utils.createCommand(this, Utils.emptyFunction, this.messageVisibility); + + this.messageEditCommand = Utils.createCommand(this, function () { + this.editMessage(); + }, this.messageVisibility); + + // viewer + this.viewSubject = ko.observable(''); + this.viewFromShort = ko.observable(''); + this.viewToShort = ko.observable(''); + this.viewFrom = ko.observable(''); + this.viewTo = ko.observable(''); + this.viewCc = ko.observable(''); + this.viewBcc = ko.observable(''); + this.viewDate = ko.observable(''); + this.viewMoment = ko.observable(''); + this.viewLineAsCcc = ko.observable(''); + this.viewHasImages = ko.observable(false); + this.viewHasVisibleAttachments = ko.observable(false); + this.viewAttachments = ko.observableArray([]); + this.viewIsHtml = ko.observable(false); + this.viewIsRtl = ko.observable(false); + this.viewViewLink = ko.observable(''); + this.viewDownloadLink = ko.observable(''); + this.viewUserPic = ko.observable(Consts.DataImages.UserDotPic); + this.viewUserPicVisible = ko.observable(false); + + this.message.subscribe(function (oMessage) { + + this.messageActiveDom(null); + + if (oMessage) + { + this.viewSubject(oMessage.subject()); + this.viewFromShort(oMessage.fromToLine(true, true)); + this.viewToShort(oMessage.toToLine(true, true)); + this.viewFrom(oMessage.fromToLine(false)); + this.viewTo(oMessage.toToLine(false)); + this.viewCc(oMessage.ccToLine(false)); + this.viewBcc(oMessage.bccToLine(false)); + this.viewDate(oMessage.fullFormatDateValue()); + this.viewMoment(oMessage.momentDate()); + this.viewLineAsCcc(oMessage.lineAsCcc()); + this.viewHasImages(oMessage.hasImages()); + this.viewHasVisibleAttachments(oMessage.hasVisibleAttachments()); + this.viewAttachments(oMessage.attachments()); + this.viewIsHtml(oMessage.isHtml()); + this.viewIsRtl(oMessage.isRtl()); + this.viewViewLink(oMessage.viewLink()); + this.viewDownloadLink(oMessage.downloadLink()); + + sPic = RL.cache().getUserPic(oMessage.fromAsSingleEmail()); + if (sPic !== this.viewUserPic()) + { + this.viewUserPicVisible(false); + this.viewUserPic(Consts.DataImages.UserDotPic); + if ('' !== sPic) + { + this.viewUserPicVisible(true); + this.viewUserPic(sPic); + } + } + } + + }, this); + + this.fullScreenMode.subscribe(function (bValue) { + if (bValue) + { + $html.addClass('rl-message-fullscreen'); + } + else + { + $html.removeClass('rl-message-fullscreen'); + } + + Utils.windowResize(); + }); + + this.messageLoadingThrottle.subscribe(function (bV) { + if (bV) + { + Utils.windowResize(); + } + }); + + this.messageActiveDom.subscribe(function () { + this.scrollMessageToTop(); + }, this); +} + +Utils.extendAsViewModel('MailBoxMessageViewViewModel', MailBoxMessageViewViewModel); + +MailBoxMessageViewViewModel.prototype.scrollToTop = function () +{ + var oCont = $('.messageItem.nano .content', this.viewModelDom); + if (oCont && oCont[0]) + { +// oCont.animate({'scrollTop': 0}, 300); + oCont.scrollTop(0); + } + else + { +// $('.messageItem', this.viewModelDom).animate({'scrollTop': 0}, 300); + $('.messageItem', this.viewModelDom).scrollTop(0); + } + + Utils.windowResize(); +}; + +MailBoxMessageViewViewModel.prototype.fullScreen = function () +{ + this.fullScreenMode(true); + Utils.windowResize(); +}; + +MailBoxMessageViewViewModel.prototype.unFullScreen = function () +{ + this.fullScreenMode(false); + Utils.windowResize(); +}; + +MailBoxMessageViewViewModel.prototype.toggleFullScreen = function () +{ + Utils.removeSelection(); + + this.fullScreenMode(!this.fullScreenMode()); + Utils.windowResize(); +}; + +/** + * @param {string} sType + */ +MailBoxMessageViewViewModel.prototype.replyOrforward = function (sType) +{ + kn.showScreenPopup(PopupsComposeViewModel, [sType, RL.data().message()]); +}; + +MailBoxMessageViewViewModel.prototype.onBuild = function (oDom) +{ + var + self = this, + oData = RL.data() + ; + + $document.on('keydown', function (oEvent) { + + var + bResult = true, + iKeyCode = oEvent ? oEvent.keyCode : 0 + ; + + if (0 < iKeyCode && (Enums.EventKeyCode.Backspace === iKeyCode || Enums.EventKeyCode.Esc === iKeyCode) && + self.viewModelVisibility() && oData.useKeyboardShortcuts() && !Utils.inFocus() && oData.message()) + { + self.fullScreenMode(false); + if (!oData.usePreviewPane()) + { + oData.message(null); + } + + bResult = false; + } + + return bResult; + }); + + $('.attachmentsPlace', oDom).magnificPopup({ + 'delegate': '.magnificPopupImage:visible', + 'type': 'image', + 'gallery': { + 'enabled': true, + 'preload': [1, 1], + 'navigateByImgClick': true + }, + 'callbacks': { + 'open': function() { + oData.useKeyboardShortcuts(false); + }, + 'close': function() { + oData.useKeyboardShortcuts(true); + } + }, + 'mainClass': 'mfp-fade', + 'removalDelay': 400 + }); + + oDom + .on('click', '.attachmentsPlace .attachmentPreview', function (oEvent) { + if (oEvent && oEvent.stopPropagation) + { + oEvent.stopPropagation(); + } + }) + .on('click', '.attachmentsPlace .attachmentItem', function () { + + var + oAttachment = ko.dataFor(this) + ; + + if (oAttachment && oAttachment.download) + { + RL.download(oAttachment.linkDownload()); + } + }) + ; + + this.oMessageScrollerDom = oDom.find('.messageItem .content'); + this.oMessageScrollerDom = this.oMessageScrollerDom && this.oMessageScrollerDom[0] ? this.oMessageScrollerDom : null; +}; + +/** + * @return {boolean} + */ +MailBoxMessageViewViewModel.prototype.isDraftFolder = function () +{ + return RL.data().message() && RL.data().draftFolder() === RL.data().message().folderFullNameRaw; +}; + +/** + * @return {boolean} + */ +MailBoxMessageViewViewModel.prototype.isSentFolder = function () +{ + return RL.data().message() && RL.data().sentFolder() === RL.data().message().folderFullNameRaw; +}; + +/** + * @return {boolean} + */ +MailBoxMessageViewViewModel.prototype.isDraftOrSentFolder = function () +{ + return this.isDraftFolder() || this.isSentFolder(); +}; + +MailBoxMessageViewViewModel.prototype.composeClick = function () +{ + kn.showScreenPopup(PopupsComposeViewModel); +}; + +MailBoxMessageViewViewModel.prototype.editMessage = function () +{ + if (RL.data().message()) + { + kn.showScreenPopup(PopupsComposeViewModel, [Enums.ComposeType.Draft, RL.data().message()]); + } +}; + +MailBoxMessageViewViewModel.prototype.scrollMessageToTop = function () +{ + if (this.oMessageScrollerDom) + { + this.oMessageScrollerDom.scrollTop(0); + } +}; + +/** + * @param {MessageModel} oMessage + */ +MailBoxMessageViewViewModel.prototype.showImages = function (oMessage) +{ + if (oMessage && oMessage.showExternalImages) + { + oMessage.showExternalImages(true); + } +}; diff --git a/dev/ViewModels/MailBoxSystemDropDownViewModel.js b/dev/ViewModels/MailBoxSystemDropDownViewModel.js new file mode 100644 index 000000000..c9e0152a4 --- /dev/null +++ b/dev/ViewModels/MailBoxSystemDropDownViewModel.js @@ -0,0 +1,12 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends AbstractSystemDropDownViewModel + */ +function MailBoxSystemDropDownViewModel() +{ + AbstractSystemDropDownViewModel.call(this); +} + +_.extend(MailBoxSystemDropDownViewModel.prototype, AbstractSystemDropDownViewModel.prototype); diff --git a/dev/ViewModels/PopupsActivateViewModel.js b/dev/ViewModels/PopupsActivateViewModel.js new file mode 100644 index 000000000..46c5a90d8 --- /dev/null +++ b/dev/ViewModels/PopupsActivateViewModel.js @@ -0,0 +1,110 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsActivateViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsActivate'); + + var self = this; + + this.domain = ko.observable(''); + this.key = ko.observable(''); + this.key.focus = ko.observable(false); + this.activationSuccessed = ko.observable(false); + + this.licenseTrigger = RL.data().licenseTrigger; + + this.activateProcess = ko.observable(false); + this.activateText = ko.observable(''); + this.activateText.isError = ko.observable(false); + + this.key.subscribe(function () { + this.activateText(''); + this.activateText.isError(false); + }, this); + + this.activationSuccessed.subscribe(function (bValue) { + if (bValue) + { + this.licenseTrigger(!this.licenseTrigger()); + } + }, this); + + this.activateCommand = Utils.createCommand(this, function () { + + this.activateProcess(true); + if (this.validateSubscriptionKey()) + { + RL.remote().licensingActivate(function (sResult, oData) { + + self.activateProcess(false); + if (Enums.StorageResultType.Success === sResult && oData.Result) + { + if (true === oData.Result) + { + self.activationSuccessed(true); + self.activateText('Subscription Key Activated Successfully'); + self.activateText.isError(false); + } + else + { + self.activateText(oData.Result); + self.activateText.isError(true); + self.key.focus(true); + } + } + else if (oData.ErrorCode) + { + self.activateText(Utils.getNotification(oData.ErrorCode)); + self.activateText.isError(true); + self.key.focus(true); + } + else + { + self.activateText(Utils.getNotification(Enums.Notification.UnknownError)); + self.activateText.isError(true); + self.key.focus(true); + } + + }, this.domain(), this.key()); + } + else + { + this.activateProcess(false); + this.activateText('Invalid Subscription Key'); + this.activateText.isError(true); + this.key.focus(true); + } + + }, function () { + return !this.activateProcess() && '' !== this.domain() && '' !== this.key() && !this.activationSuccessed(); + }); +} + +Utils.extendAsViewModel('PopupsActivateViewModel', PopupsActivateViewModel); + +PopupsActivateViewModel.prototype.onShow = function () +{ + this.domain(RL.settingsGet('AdminDomain')); + if (!this.activateProcess()) + { + this.key(''); + this.activateText(''); + this.activateText.isError(false); + this.activationSuccessed(false); + + this.key.focus(true); + } +}; + +/** + * @returns {boolean} + */ +PopupsActivateViewModel.prototype.validateSubscriptionKey = function () +{ + var sValue = this.key(); + return '' === sValue || !!/^RL[\d]+-[A-Z0-9\-]+Z$/.test(Utils.trim(sValue)); +}; \ No newline at end of file diff --git a/dev/ViewModels/PopupsAddAccountViewModel.js b/dev/ViewModels/PopupsAddAccountViewModel.js new file mode 100644 index 000000000..f98771e70 --- /dev/null +++ b/dev/ViewModels/PopupsAddAccountViewModel.js @@ -0,0 +1,113 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsAddAccountViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsAddAccount'); + + this.email = ko.observable(''); + this.login = ko.observable(''); + this.password = ko.observable(''); + + this.emailError = ko.observable(false); + this.loginError = ko.observable(false); + this.passwordError = ko.observable(false); + + this.email.subscribe(function () { + this.emailError(false); + }, this); + + this.login.subscribe(function () { + this.loginError(false); + }, this); + + this.password.subscribe(function () { + this.passwordError(false); + }, this); + + this.allowCustomLogin = ko.observable(false); + + this.submitRequest = ko.observable(false); + this.submitError = ko.observable(''); + + this.emailFocus = ko.observable(false); + this.loginFocus = ko.observable(false); + + this.addAccountCommand = Utils.createCommand(this, function () { + + this.emailError('' === Utils.trim(this.email())); + this.passwordError('' === Utils.trim(this.password())); + + if (this.emailError() || this.passwordError()) + { + return false; + } + + this.submitRequest(true); + + RL.remote().accountAdd(_.bind(function (sResult, oData) { + + this.submitRequest(false); + if (Enums.StorageResultType.Success === sResult && oData && 'AccountAdd' === oData.Action) + { + if (oData.Result) + { + RL.accountsAndIdentities(); + this.cancelCommand(); + } + else if (oData.ErrorCode) + { + this.submitError(Utils.getNotification(oData.ErrorCode)); + } + } + else + { + this.submitError(Utils.getNotification(Enums.Notification.UnknownError)); + } + + }, this), this.email(), this.login(), this.password()); + + return true; + + }, function () { + return !this.submitRequest(); + }); + + this.loginFocus.subscribe(function (bValue) { + if (bValue && '' === this.login() && '' !== this.email()) + { + this.login(this.email()); + } + }, this); +} + +Utils.extendAsViewModel('PopupsAddAccountViewModel', PopupsAddAccountViewModel); + +PopupsAddAccountViewModel.prototype.clearPopup = function () +{ + this.email(''); + this.login(''); + this.password(''); + + this.emailError(false); + this.loginError(false); + this.passwordError(false); + + this.submitRequest(false); + this.submitError(''); +}; + +PopupsAddAccountViewModel.prototype.onShow = function () +{ + this.clearPopup(); + this.emailFocus(true); +}; + + +PopupsAddAccountViewModel.prototype.onBuild = function () +{ + this.allowCustomLogin(!!RL.settingsGet('AllowCustomLogin')); +}; diff --git a/dev/ViewModels/PopupsAdvancedSearchViewModel.js b/dev/ViewModels/PopupsAdvancedSearchViewModel.js new file mode 100644 index 000000000..f81b47341 --- /dev/null +++ b/dev/ViewModels/PopupsAdvancedSearchViewModel.js @@ -0,0 +1,105 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsAdvancedSearchViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsAdvancedSearch'); + + this.fromFocus = ko.observable(false); + + this.from = ko.observable(''); + this.to = ko.observable(''); + this.subject = ko.observable(''); + this.text = ko.observable(''); + this.selectedDateValue = ko.observable(-1); + this.hasAttachments = ko.observable(false); + + this.searchCommand = Utils.createCommand(this, function () { + + var sSearch = this.buildSearchString(); + if ('' !== sSearch) + { + RL.data().mainMessageListSearch(sSearch); + } + + this.cancelCommand(); + }); +} + +Utils.extendAsViewModel('PopupsAdvancedSearchViewModel', PopupsAdvancedSearchViewModel); + +PopupsAdvancedSearchViewModel.prototype.buildSearchStringValue = function (sValue) +{ + if (-1 < sValue.indexOf(' ')) + { + sValue = '"' + sValue + '"'; + } + + return sValue; +}; + +PopupsAdvancedSearchViewModel.prototype.buildSearchString = function () +{ + var + aResult = [], + sFrom = Utils.trim(this.from()), + sTo = Utils.trim(this.to()), + sSubject = Utils.trim(this.subject()), + sText = Utils.trim(this.text()) + ; + + if (sFrom && '' !== sFrom) + { + aResult.push('from:' + this.buildSearchStringValue(sFrom)); + } + + if (sTo && '' !== sTo) + { + aResult.push('to:' + this.buildSearchStringValue(sTo)); + } + + if (sSubject && '' !== sSubject) + { + aResult.push('subject:' + this.buildSearchStringValue(sSubject)); + } + + if (this.hasAttachments()) + { + aResult.push('has:attachments'); + } + + if (-1 < this.selectedDateValue()) + { + aResult.push('date:' + moment().subtract('days', this.selectedDateValue()).format('YYYY.MM.DD') + '/'); + } + + if (sText && '' !== sText) + { + aResult.push('text:' + this.buildSearchStringValue(sText)); + } + + return Utils.trim(aResult.join(' ')); +}; + +PopupsAdvancedSearchViewModel.prototype.clearPopup = function () +{ + this.from(''); + this.to(''); + this.subject(''); + this.text(''); + + this.selectedDateValue(-1); + this.hasAttachments(false); + + this.fromFocus(true); +}; + +PopupsAdvancedSearchViewModel.prototype.onShow = function () +{ + this.clearPopup(); + + this.fromFocus(true); +}; diff --git a/dev/ViewModels/PopupsComposeViewModel.js b/dev/ViewModels/PopupsComposeViewModel.js new file mode 100644 index 000000000..1589ca429 --- /dev/null +++ b/dev/ViewModels/PopupsComposeViewModel.js @@ -0,0 +1,1367 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsComposeViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsCompose'); + + this.oEditor = null; + this.aDraftInfo = null; + this.sInReplyTo = ''; + this.bFromDraft = false; + this.sReferences = ''; + + this.bReloadFolder = false; + this.bAllowIdentities = RL.settingsGet('AllowIdentities'); + + var + self = this, + fEmailArrayToStringLineHelper = function (aList) { + + var + iIndex = 0, + iLen = aList.length, + aResult = [] + ; + + for (; iIndex < iLen; iIndex++) + { + aResult.push(aList[iIndex].toLine(false)); + } + + return aResult.join(', '); + }, + + fCcAndBccCheckHelper = function (aValue) { + if (false === this.showCcAndBcc() && 0 < aValue.length) + { + this.showCcAndBcc(true); + } + } + ; + + this.resizer = ko.observable(false).extend({'throttle': 50}); + + this.to = ko.observableArray([]); + this.cc = ko.observableArray([]); + this.bcc = ko.observableArray([]); + + this.replyTo = ko.observable(''); + this.subject = ko.observable(''); + + this.sendError = ko.observable(false); + this.sendSuccessButSaveError = ko.observable(false); + this.savedError = ko.observable(false); + + this.savedTime = ko.observable(0); + this.savedOrSendingText = ko.observable(''); + + this.emptyToError = ko.observable(false); + this.showCcAndBcc = ko.observable(false); + + this.cc.subscribe(fCcAndBccCheckHelper, this); + this.bcc.subscribe(fCcAndBccCheckHelper, this); + + this.draftFolder = ko.observable(''); + this.draftUid = ko.observable(''); + this.draftID = ko.observable(''); + this.sending = ko.observable(false); + this.saving = ko.observable(false); + this.attachments = ko.observableArray([]); + + this.attachmentsInProcess = ko.computed(function () { + return _.filter(this.attachments(), function (oItem) { + return oItem && '' === oItem.tempName(); + }); + }, this); + + this.attachmentsInReady = ko.computed(function () { + return _.filter(this.attachments(), function (oItem) { + return oItem && '' !== oItem.tempName(); + }); + }, this); + + this.attachments.subscribe(function () { + this.triggerForResize(); + }, this); + + this.isDraftFolderMessage = ko.computed(function () { + return '' !== this.draftFolder() && '' !== this.draftUid() && '' !== this.draftID(); + }, this); + + this.composeUploaderButton = ko.observable(null); + this.composeUploaderDropPlace = ko.observable(null); + this.dragAndDropEnabled = ko.observable(false); + this.dragAndDropOver = ko.observable(false).extend({'throttle': 1}); + this.dragAndDropVisible = ko.observable(false).extend({'throttle': 1}); + this.attacheMultipleAllowed = ko.observable(false); + this.addAttachmentEnabled = ko.observable(false); + + this.composeEditorTextArea = ko.observable(null); + this.composeEditorHtmlArea = ko.observable(null); + this.composeEditorToolbar = ko.observable(null); + + this.identities = RL.data().identities; + + this.currentIdentityID = ko.observable(''); + + this.currentIdentityString = ko.observable(''); + this.currentIdentityResultEmail = ko.observable(''); + + this.identitiesOptions = ko.computed(function () { + return _.map(RL.data().identities(), function (oItem) { + return { + 'optValue': oItem.id, + 'optText': oItem.formattedNameForCompose() + }; + }); + }, this); + + ko.computed(function () { + + var + sResult = '', + sResultEmail = '', + oItem = null, + aList = this.identities(), + sID = this.currentIdentityID() + ; + + if (this.bAllowIdentities && sID) + { + oItem = _.find(aList, function (oItem) { + return oItem && sID === oItem['id']; + }); + + sResult = oItem ? oItem.formattedNameForCompose() : ''; + sResultEmail = oItem ? oItem.formattedNameForEmail() : ''; + + if ('' === sResult && aList[0]) + { + this.currentIdentityID(aList[0]['id']); + } + } + else + { + sResult = this.formattedFrom(false); + sResultEmail = this.formattedFrom(true); + } + + this.currentIdentityString(sResult); + this.currentIdentityResultEmail(sResultEmail); + + return sResult; + + }, this); + + this.to.subscribe(function (aValue) { + if (this.emptyToError() && 0 < aValue.length) + { + this.emptyToError(false); + } + }, this); + + this.canBeSended = ko.computed(function () { + return !this.sending() && + !this.saving() && + 0 === this.attachmentsInProcess().length && + 0 < this.to().length + ; + }, this); + + this.canBeSendedOrSaved = ko.computed(function () { + return !this.sending() && !this.saving(); + }, this); + + this.deleteCommand = Utils.createCommand(this, function () { + + var + oMessage = null, + sDraftFolder = this.draftFolder(), + sDraftUid = this.draftUid() + ; + + if (this.bFromDraft) + { + oMessage = RL.data().message(); + if (oMessage && sDraftFolder === oMessage.folderFullNameRaw && sDraftUid === oMessage.uid) + { + RL.data().message(null); + } + } + + if (RL.data().currentFolderFullNameRaw() === this.draftFolder()) + { + _.each(RL.data().messageList(), function (oMessage) { + if (oMessage && sDraftFolder === oMessage.folderFullNameRaw && sDraftUid === oMessage.uid) + { + oMessage.deleted(true); + } + }); + } + + RL.data().messageListIsNotCompleted(true); + RL.remote().messagesDelete(function () { + RL.cache().setFolderHash(sDraftFolder, ''); + RL.reloadMessageList(); + }, this.draftFolder(), [this.draftUid()]); + + this.bReloadFolder = false; + kn.hideScreenPopup(PopupsComposeViewModel); + + }, function () { + return this.isDraftFolderMessage(); + }); + + this.sendMessageResponse = _.bind(this.sendMessageResponse, this); + this.saveMessageResponse = _.bind(this.saveMessageResponse, this); + + this.sendCommand = Utils.createCommand(this, function () { + var + aTo = this.to(), + sSentFolder = RL.data().sentFolder(), + aFlagsCache = [] + ; + + if (0 === aTo.length) + { + this.emptyToError(true); + } + else + { + if (RL.data().replySameFolder()) + { + if (Utils.isArray(this.aDraftInfo) && 3 === this.aDraftInfo.length && Utils.isNormal(this.aDraftInfo[2]) && 0 < this.aDraftInfo[2].length) + { + sSentFolder = this.aDraftInfo[2]; + } + } + + if ('' === sSentFolder) + { + kn.showScreenPopup(PopupsFolderSystemViewModel, [Enums.SetSystemFoldersNotification.Sent]); + } + else + { + this.sendError(false); + this.sending(true); + this.bReloadFolder = true; + + if (Utils.isArray(this.aDraftInfo) && 3 === this.aDraftInfo.length) + { + aFlagsCache = RL.cache().getMessageFlagsFromCache(this.aDraftInfo[2], this.aDraftInfo[1]); + if (aFlagsCache) + { + if ('forward' === this.aDraftInfo[0]) + { + aFlagsCache[3] = true; + } + else + { + aFlagsCache[2] = true; + } + + RL.cache().setMessageFlagsToCache(this.aDraftInfo[2], this.aDraftInfo[1], aFlagsCache); + RL.reloadFlagsCurrentMessageListAndMessageFromCache(); + } + } + + sSentFolder = Consts.Values.UnuseOptionValue === sSentFolder ? '' : sSentFolder; + + RL.cache().setFolderHash(this.draftFolder(), ''); + RL.cache().setFolderHash(sSentFolder, ''); + + RL.remote().sendMessage( + this.sendMessageResponse, + this.draftFolder(), + this.draftUid(), + this.draftID(), + sSentFolder, + this.currentIdentityResultEmail(), + fEmailArrayToStringLineHelper(aTo), + fEmailArrayToStringLineHelper(this.cc()), + fEmailArrayToStringLineHelper(this.bcc()), + this.subject(), + this.oEditor.isHtml(), + this.oEditor.getTextForRequest(), + this.prepearAttachmentsForSendOrSave(), + this.aDraftInfo, + this.sInReplyTo, + this.sReferences + ); + } + } + }, this.canBeSendedOrSaved); + + this.saveCommand = Utils.createCommand(this, function () { + + if (RL.data().draftFolderNotEnabled()) + { + kn.showScreenPopup(PopupsFolderSystemViewModel, [Enums.SetSystemFoldersNotification.Draft]); + } + else + { + this.savedError(false); + this.saving(true); + this.bReloadFolder = true; + + RL.cache().setFolderHash(RL.data().draftFolder(), ''); + + RL.remote().saveMessage( + this.saveMessageResponse, + this.draftFolder(), + this.draftUid(), + this.draftID(), + RL.data().draftFolder(), + this.currentIdentityResultEmail(), + fEmailArrayToStringLineHelper(this.to()), + fEmailArrayToStringLineHelper(this.cc()), + fEmailArrayToStringLineHelper(this.bcc()), + this.subject(), + this.oEditor.isHtml(), + this.oEditor.getTextForRequest(), + this.prepearAttachmentsForSendOrSave(), + this.aDraftInfo, + this.sInReplyTo, + this.sReferences + ); + } + + }, this.canBeSendedOrSaved); + + Globals.minuteTick.subscribe(function () { + if (this.modalVisibility() && !RL.data().draftFolderNotEnabled() && !this.isEmptyForm(false) && + !this.saving() && !this.sending() && !this.savedError()) + { + this.saveCommand(); + } + }, this); + + Utils.initOnStartOrLangChange(null, this, function () { + if (this.oEditor) + { + this.oEditor.initLanguage( + Utils.i18n('EDITOR/TEXT_SWITCHER_CONFIRM'), + Utils.i18n('EDITOR/TEXT_SWITCHER_PLAINT_TEXT'), + Utils.i18n('EDITOR/TEXT_SWITCHER_RICH_FORMATTING') + ); + } + }); + + this.showCcAndBcc.subscribe(function () { + this.triggerForResize(); + }, this); + + this.dropboxEnabled = ko.observable(RL.settingsGet('DropboxApiKey') ? true : false); + + this.dropboxCommand = Utils.createCommand(this, function () { + + if (window.Dropbox) + { + window.Dropbox.choose({ + //'iframe': true, + 'success': function(aFiles) { + + if (aFiles && aFiles[0] && aFiles[0]['link']) + { + self.addDropboxAttachment(aFiles[0]); + } + }, + 'linkType': "direct", + 'multiselect': false + }); + } + + return true; + + }, function () { + return this.dropboxEnabled(); + }); + + this.modalVisibility.subscribe(function (bValue) { + if (!bValue && this.bReloadFolder) + { + this.bReloadFolder = false; + RL.reloadMessageList(); + } + }, this); + + this.driveEnabled = ko.observable(false); + + this.driveCommand = Utils.createCommand(this, function () { + +// this.driveOpenPopup(); + return true; + + }, function () { + return this.driveEnabled(); + }); + +// this.driveCallback = _.bind(this.driveCallback, this); +} + +Utils.extendAsViewModel('PopupsComposeViewModel', PopupsComposeViewModel); + +PopupsComposeViewModel.prototype.findIdentityIdByMessage = function (sComposeType, oMessage) +{ + var + oIDs = {}, + sResult = '', + fFindHelper = function (oItem) { + if (oItem && oItem.email && oIDs[oItem.email]) + { + sResult = oIDs[oItem.email]; + return true; + } + + return false; + } + ; + + if (this.bAllowIdentities) + { + _.each(this.identities(), function (oItem) { + oIDs[oItem.email()] = oItem['id']; + }); + } + else + { + oIDs[RL.data().accountEmail()] = RL.data().accountEmail(); + } + + switch (sComposeType) + { + case Enums.ComposeType.Empty: + sResult = RL.data().accountEmail(); + break; + case Enums.ComposeType.Reply: + case Enums.ComposeType.ReplyAll: + case Enums.ComposeType.Forward: + case Enums.ComposeType.ForwardAsAttachment: + _.find(_.union(oMessage.to, oMessage.ÑÑ, oMessage.bÑÑ), fFindHelper); + break; + case Enums.ComposeType.Draft: + _.find(_.union(oMessage.from, oMessage.replyTo), fFindHelper); + break; + } + + return sResult; +}; + +PopupsComposeViewModel.prototype.selectIdentity = function (oIdentity) +{ + if (oIdentity) + { + this.currentIdentityID(oIdentity.optValue); + } +}; + +/** + * + * @param {boolean=} bHeaderResult = false + * @returns {string} + */ +PopupsComposeViewModel.prototype.formattedFrom = function (bHeaderResult) +{ + var + sDisplayName = RL.data().displayName(), + sEmail = RL.data().accountEmail() + ; + + return '' === sDisplayName ? sEmail : + ((Utils.isUnd(bHeaderResult) ? false : !!bHeaderResult) ? + '"' + Utils.quoteName(sDisplayName) + '" <' + sEmail + '>' : + sDisplayName + ' (' + sEmail + ')') + ; +}; + +PopupsComposeViewModel.prototype.sendMessageResponse = function (sResult, oData) +{ + var bResult = false; + + this.sending(false); + + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + bResult = true; + if (this.modalVisibility()) + { + kn.delegateRun(this, 'closeCommand'); + } + } + + if (this.modalVisibility() && !bResult) + { + if (oData && Enums.Notification.CantSaveMessage === oData.ErrorCode) + { + this.sendSuccessButSaveError(true); + window.alert(Utils.trim(Utils.i18n('COMPOSE/SAVED_ERROR_ON_SEND'))); + } + else + { + this.sendError(true); + window.alert(Utils.getNotification(oData.ErrorCode ? oData.ErrorCode : Enums.Notification.CantSendMessage)); + } + } +}; + +PopupsComposeViewModel.prototype.saveMessageResponse = function (sResult, oData) +{ + var + bResult = false, + oMessage = null + ; + + this.saving(false); + + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + if (oData.Result.NewFolder && oData.Result.NewUid) + { + if (this.bFromDraft) + { + oMessage = RL.data().message(); + if (oMessage && this.draftFolder() === oMessage.folderFullNameRaw && this.draftUid() === oMessage.uid) + { + RL.data().message(null); + } + } + + this.draftFolder(oData.Result.NewFolder); + this.draftUid(oData.Result.NewUid); + this.draftID(oData.Result.NewID); + + if (this.modalVisibility()) + { + this.savedTime(window.Math.round((new window.Date()).getTime() / 1000)); + + this.savedOrSendingText( + 0 < this.savedTime() ? Utils.i18n('COMPOSE/SAVED_TIME', { + 'TIME': moment.unix(this.savedTime() - 1).format('LT') + }) : '' + ); + + bResult = true; + + if (this.bFromDraft) + { + RL.cache().setFolderHash(this.draftFolder(), ''); + } + } + } + } + + if (!this.modalVisibility() && !bResult) + { + this.savedError(true); + this.savedOrSendingText(Utils.getNotification(Enums.Notification.CantSaveMessage)); + } +}; + +PopupsComposeViewModel.prototype.onHide = function () +{ + kn.routeOn(); +}; + +/** + * @param {string=} sType = Enums.ComposeType.Empty + * @param {?MessageModel|Array=} oMessageOrArray = null + * @param {Array=} aToEmails = null + */ +PopupsComposeViewModel.prototype.onShow = function (sType, oMessageOrArray, aToEmails) +{ + kn.routeOff(); + + var + self = this, + sFrom = '', + sTo = '', + sCc = '', + sDate = '', + sSubject = '', + oText = null, + sText = '', + sReplyTitle = '', + aResplyAllParts = [], + oExcludeEmail = {}, + mEmail = RL.data().accountEmail(), + aDownloads = [], + aDraftInfo = null, + oMessage = null, + bFocusOnBody = false, + sComposeType = sType || Enums.ComposeType.Empty + ; + + oMessageOrArray = oMessageOrArray || null; + if (oMessageOrArray && Utils.isNormal(oMessageOrArray)) + { + oMessage = Utils.isArray(oMessageOrArray) && 1 === oMessageOrArray.length ? oMessageOrArray[0] : + (!Utils.isArray(oMessageOrArray) ? oMessageOrArray : null); + } + + if (null !== mEmail) + { + oExcludeEmail[mEmail] = true; + this.currentIdentityID(this.findIdentityIdByMessage(sComposeType, oMessage)); + } + + this.reset(); + + if (Utils.isNonEmptyArray(aToEmails)) + { + this.to(aToEmails); + } + + if ('' !== sComposeType && oMessage) + { + sDate = oMessage.fullFormatDateValue(); + sSubject = oMessage.subject(); + aDraftInfo = oMessage.aDraftInfo; + + oText = $(oMessage.body).clone(); + Utils.removeBlockquoteSwitcher(oText); + sText = oText.html(); + + switch (sComposeType) + { + case Enums.ComposeType.Empty: + break; + case Enums.ComposeType.Reply: + this.to(oMessage.replyEmails(oExcludeEmail)); + this.subject(Utils.replySubjectAdd('Re', sSubject)); + this.prepearMessageAttachments(oMessage, sComposeType); + this.aDraftInfo = ['reply', oMessage.uid, oMessage.folderFullNameRaw]; + this.sInReplyTo = oMessage.sMessageId; + this.sReferences = Utils.trim(this.sInReplyTo + ' ' + oMessage.sReferences); + bFocusOnBody = true; + break; + + case Enums.ComposeType.ReplyAll: + aResplyAllParts = oMessage.replyAllEmails(oExcludeEmail); + this.to(aResplyAllParts[0]); + this.cc(aResplyAllParts[1]); + this.subject(Utils.replySubjectAdd('Re', sSubject)); + this.prepearMessageAttachments(oMessage, sComposeType); + this.aDraftInfo = ['reply', oMessage.uid, oMessage.folderFullNameRaw]; + this.sInReplyTo = oMessage.sMessageId; + this.sReferences = Utils.trim(this.sInReplyTo + ' ' + oMessage.references()); + bFocusOnBody = true; + break; + + case Enums.ComposeType.Forward: + this.subject(Utils.replySubjectAdd('Fwd', sSubject)); + this.prepearMessageAttachments(oMessage, sComposeType); + this.aDraftInfo = ['forward', oMessage.uid, oMessage.folderFullNameRaw]; + this.sInReplyTo = oMessage.sMessageId; + this.sReferences = Utils.trim(this.sInReplyTo + ' ' + oMessage.sReferences); + break; + + case Enums.ComposeType.ForwardAsAttachment: + this.subject(Utils.replySubjectAdd('Fwd', sSubject)); + this.prepearMessageAttachments(oMessage, sComposeType); + this.aDraftInfo = ['forward', oMessage.uid, oMessage.folderFullNameRaw]; + this.sInReplyTo = oMessage.sMessageId; + this.sReferences = Utils.trim(this.sInReplyTo + ' ' + oMessage.sReferences); + break; + + case Enums.ComposeType.Draft: + this.to(oMessage.to); + this.cc(oMessage.cc); + this.bcc(oMessage.bcc); + + this.bFromDraft = true; + + this.draftFolder(oMessage.folderFullNameRaw); + this.draftUid(oMessage.uid); + this.draftID(oMessage.messageId()); + + this.subject(sSubject); + this.prepearMessageAttachments(oMessage, sComposeType); + + this.aDraftInfo = Utils.isNonEmptyArray(aDraftInfo) && 3 === aDraftInfo.length ? aDraftInfo : null; + this.sInReplyTo = oMessage.sInReplyTo; + this.sReferences = oMessage.sReferences; + break; + } + + if (this.oEditor) + { + switch (sComposeType) + { + case Enums.ComposeType.Reply: + case Enums.ComposeType.ReplyAll: + sFrom = oMessage.fromToLine(false, true); + sReplyTitle = Utils.i18n('COMPOSE/REPLY_MESSAGE_TITLE', { + 'DATETIME': sDate, + 'EMAIL': sFrom + }); + + sText = '

' + sReplyTitle + ':' + + '

' + sText + '
'; + + break; + + case Enums.ComposeType.Forward: + sFrom = oMessage.fromToLine(false, true); + sTo = oMessage.toToLine(false, true); + sCc = oMessage.ccToLine(false, true); + sText = '


' + Utils.i18n('COMPOSE/FORWARD_MESSAGE_TOP_TITLE') + + '
' + Utils.i18n('COMPOSE/FORWARD_MESSAGE_TOP_FROM') + ': ' + sFrom + + '
' + Utils.i18n('COMPOSE/FORWARD_MESSAGE_TOP_TO') + ': ' + sTo + + (0 < sCc.length ? '
' + Utils.i18n('COMPOSE/FORWARD_MESSAGE_TOP_CC') + ': ' + sCc : '') + + '
' + Utils.i18n('COMPOSE/FORWARD_MESSAGE_TOP_SENT') + ': ' + Utils.encodeHtml(sDate) + + '
' + Utils.i18n('COMPOSE/FORWARD_MESSAGE_TOP_SUBJECT') + ': ' + Utils.encodeHtml(sSubject) + + '

' + sText; + break; + case Enums.ComposeType.ForwardAsAttachment: + sText = ''; + break; + } + + this.oEditor.setRawText(sText, oMessage.isHtml()); + } + } + else if (this.oEditor && Enums.ComposeType.Empty === sComposeType) + { + this.oEditor.setRawText('
' + Utils.convertPlainTextToHtml(RL.data().signature()), Enums.EditorDefaultType.Html === RL.data().editorDefaultType()); + } + else if (Utils.isNonEmptyArray(oMessageOrArray)) + { + _.each(oMessageOrArray, function (oMessage) { + self.addMessageAsAttachment(oMessage); + }); + } + + aDownloads = this.getAttachmentsDownloadsForUpload(); + if (Utils.isNonEmptyArray(aDownloads)) + { + RL.remote().messageUploadAttachments(function (sResult, oData) { + + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + var + oAttachment = null, + sTempName = '' + ; + + if (!self.viewModelVisibility()) + { + for (sTempName in oData.Result) + { + if (oData.Result.hasOwnProperty(sTempName)) + { + oAttachment = self.getAttachmentById(oData.Result[sTempName]); + if (oAttachment) + { + oAttachment.tempName(sTempName); + } + } + } + } + } + else + { + self.setMessageAttachmentFailedDowbloadText(); + } + + }, aDownloads); + } + + if (bFocusOnBody && this.oEditor) + { + this.oEditor.focus(); + } + + this.triggerForResize(); +}; + +PopupsComposeViewModel.prototype.onBuild = function () +{ + this.initEditor(); + this.initUploader(); + + var + self = this, + oScript = null + ; + + $window.on('keydown', function (oEvent) { + var bResult = true; + + if (oEvent && self.modalVisibility() && RL.data().useKeyboardShortcuts()) + { + if (oEvent.ctrlKey && Enums.EventKeyCode.S === oEvent.keyCode) + { + self.saveCommand(); + bResult = false; + } + else if (oEvent.ctrlKey && Enums.EventKeyCode.Enter === oEvent.keyCode) + { + self.sendCommand(); + bResult = false; + } + } + + return bResult; + }); + + $window.on('resize', function () { + self.triggerForResize(); + }); + + if (this.dropboxEnabled()) + { + oScript = document.createElement('script'); + oScript.type = 'text/javascript'; + oScript.src = 'https://www.dropbox.com/static/api/1/dropins.js'; + $(oScript).attr('id', 'dropboxjs').attr('data-app-key', RL.settingsGet('DropboxApiKey')); + + document.body.appendChild(oScript); + } + +// TODO (Google Drive) +// if (false) +// { +// $.getScript('http://www.google.com/jsapi', function () { +// if (window.google) +// { +// window.google.load('picker', '1', { +// 'callback': Utils.emptyFunction +// }); +// } +// }); +// } +}; + +//PopupsComposeViewModel.prototype.driveCallback = function (oData) +//{ +// if (oData && window.google && oData['action'] === window.google.picker.Action.PICKED) +// { +// } +//}; +// +//PopupsComposeViewModel.prototype.driveOpenPopup = function () +//{ +// if (window.google) +// { +// var +// oPicker = new window.google.picker.PickerBuilder() +// .enableFeature(window.google.picker.Feature.NAV_HIDDEN) +// .addView(new window.google.picker.View(window.google.picker.ViewId.DOCS)) +// .setCallback(this.driveCallback).build() +// ; +// +// oPicker.setVisible(true); +// } +//}; + +/** + * @param {string} sId + * @return {?Object} + */ +PopupsComposeViewModel.prototype.getAttachmentById = function (sId) +{ + var + aAttachments = this.attachments(), + iIndex = 0, + iLen = aAttachments.length + ; + + for (; iIndex < iLen; iIndex++) + { + if (aAttachments[iIndex] && sId === aAttachments[iIndex].id) + { + return aAttachments[iIndex]; + } + } + + return null; +}; + +PopupsComposeViewModel.prototype.initEditor = function () +{ + if (this.composeEditorTextArea() && this.composeEditorHtmlArea() && this.composeEditorToolbar()) + { + var self = this; + this.oEditor = new HtmlEditor(this.composeEditorTextArea(), this.composeEditorHtmlArea(), this.composeEditorToolbar(), { + 'onSwitch': function (bHtml) { + if (!bHtml) + { + self.removeLinkedAttachments(); + } + } + }); + + this.oEditor.initLanguage( + Utils.i18n('EDITOR/TEXT_SWITCHER_CONFIRM'), + Utils.i18n('EDITOR/TEXT_SWITCHER_PLAINT_TEXT'), + Utils.i18n('EDITOR/TEXT_SWITCHER_RICH_FORMATTING') + ); + } +}; + +PopupsComposeViewModel.prototype.initUploader = function () +{ + if (this.composeUploaderButton()) + { + var + oUploadCache = {}, + iAttachmentSizeLimit = Utils.pInt(RL.settingsGet('AttachmentLimit')), + oJua = new Jua({ + 'action': RL.link().upload(), + 'name': 'uploader', + 'queueSize': 2, + 'multipleSizeLimit': 50, + 'disableFolderDragAndDrop': false, + 'clickElement': this.composeUploaderButton(), + 'dragAndDropElement': this.composeUploaderDropPlace(), +// 'onLimitReached': function (iLimit) { +// alert(iLimit); +// }, + 'onDragEnter': _.bind(function () { + this.dragAndDropOver(true); + }, this), + 'onDragLeave': _.bind(function () { + this.dragAndDropOver(false); + }, this), + 'onBodyDragEnter': _.bind(function () { + this.dragAndDropVisible(true); + }, this), + 'onBodyDragLeave': _.bind(function () { + this.dragAndDropVisible(false); + }, this), + 'onProgress': _.bind(function (sId, iLoaded, iTotal) { + var oItem = null; + if (Utils.isUnd(oUploadCache[sId])) + { + oItem = this.getAttachmentById(sId); + if (oItem) + { + oUploadCache[sId] = oItem; + } + } + else + { + oItem = oUploadCache[sId]; + } + + if (oItem) + { + oItem.progress(' - ' + Math.floor(iLoaded / iTotal * 100) + '%'); + } + + }, this), + + 'onSelect': _.bind(function (sId, oData) { + + this.dragAndDropOver(false); + + var + that = this, + sFileName = Utils.isUnd(oData.FileName) ? '' : oData.FileName.toString(), + mSize = Utils.isNormal(oData.Size) ? Utils.pInt(oData.Size) : null, + oAttachment = new ComposeAttachmentModel(sId, sFileName, mSize) + ; + + oAttachment.cancel = (function (sId) { + + return function () { + that.attachments.remove(function (oItem) { + return oItem && oItem.id === sId; + }); + + if (oJua) + { + oJua.cancel(sId); + } + }; + + }(sId)); + + this.attachments.push(oAttachment); + + if (0 < mSize && 0 < iAttachmentSizeLimit && iAttachmentSizeLimit < mSize) + { + oAttachment.error(Utils.i18n('UPLOAD/ERROR_FILE_IS_TOO_BIG')); + return false; + } + + return true; + + }, this), + + 'onStart': _.bind(function (sId) { + + var + oItem = null + ; + + if (Utils.isUnd(oUploadCache[sId])) + { + oItem = this.getAttachmentById(sId); + if (oItem) + { + oUploadCache[sId] = oItem; + } + } + else + { + oItem = oUploadCache[sId]; + } + + if (oItem) + { + oItem.waiting(false); + oItem.uploading(true); + } + + }, this), + + 'onComplete': _.bind(function (sId, bResult, oData) { + + var + sError = '', + mErrorCode = null, + oAttachmentJson = null, + oAttachment = this.getAttachmentById(sId) + ; + + oAttachmentJson = bResult && oData && oData.Result && oData.Result.Attachment ? oData.Result.Attachment : null; + mErrorCode = oData && oData.Result && oData.Result.ErrorCode ? oData.Result.ErrorCode : null; + + if (null !== mErrorCode) + { + sError = Utils.getUploadErrorDescByCode(mErrorCode); + } + else if (!oAttachmentJson) + { + sError = Utils.i18n('UPLOAD/ERROR_UNKNOWN'); + } + + if (oAttachment) + { + if ('' !== sError && 0 < sError.length) + { + oAttachment + .waiting(false) + .uploading(false) + .error(sError) + ; + } + else if (oAttachmentJson) + { + oAttachment + .waiting(false) + .uploading(false) + ; + + oAttachment.initByUploadJson(oAttachmentJson); + } + + if (Utils.isUnd(oUploadCache[sId])) + { + delete (oUploadCache[sId]); + } + } + + }, this) + }) + ; + + if (oJua) + { + this + .addAttachmentEnabled(true) + .dragAndDropEnabled(oJua.isDragAndDropSupported()) + ; + } + else + { + this + .addAttachmentEnabled(false) + .dragAndDropEnabled(false) + ; + } + } +}; + +/** + * @return {Object} + */ +PopupsComposeViewModel.prototype.prepearAttachmentsForSendOrSave = function () +{ + var oResult = {}; + _.each(this.attachmentsInReady(), function (oItem) { + if (oItem && '' !== oItem.tempName() && oItem.enabled()) + { + oResult[oItem.tempName()] = [ + oItem.fileName(), + oItem.isInline ? '1' : '0', + oItem.CID, + oItem.contentLocation + ]; + } + }); + + return oResult; +}; + +/** + * @param {MessageModel} oMessage + */ +PopupsComposeViewModel.prototype.addMessageAsAttachment = function (oMessage) +{ + if (oMessage) + { + var + self = this, + oAttachment = null, + sTemp = oMessage.subject(), + fCancelFunc = function (sId) { + return function () { + self.attachments.remove(function (oItem) { + return oItem && oItem.id === sId; + }); + }; + } + ; + + sTemp = '.eml' === sTemp.substr(-4).toLowerCase() ? sTemp : sTemp + '.eml'; + oAttachment = new ComposeAttachmentModel( + oMessage.requestHash, sTemp, oMessage.size() + ); + + oAttachment.fromMessage = true; + oAttachment.cancel = fCancelFunc(oMessage.requestHash); + oAttachment.waiting(false).uploading(true); + + this.attachments.push(oAttachment); + } +}; + +/** + * @param {Object} oDropboxFile + * @return {boolean} + */ +PopupsComposeViewModel.prototype.addDropboxAttachment = function (oDropboxFile) +{ + var + self = this, + fCancelFunc = function (sId) { + return function () { + self.attachments.remove(function (oItem) { + return oItem && oItem.id === sId; + }); + }; + }, + iAttachmentSizeLimit = Utils.pInt(RL.settingsGet('AttachmentLimit')), + oAttachment = null, + mSize = oDropboxFile['bytes'] + ; + + oAttachment = new ComposeAttachmentModel( + oDropboxFile['link'], oDropboxFile['name'], mSize + ); + + oAttachment.fromMessage = false; + oAttachment.cancel = fCancelFunc(oDropboxFile['link']); + oAttachment.waiting(false).uploading(true); + + this.attachments.push(oAttachment); + + if (0 < mSize && 0 < iAttachmentSizeLimit && iAttachmentSizeLimit < mSize) + { + oAttachment.uploading(false); + oAttachment.error(Utils.i18n('UPLOAD/ERROR_FILE_IS_TOO_BIG')); + return false; + } + + RL.remote().composeUploadExternals(function (sResult, oData) { + + var bResult = false; + oAttachment.uploading(false); + + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + if (oData.Result[oAttachment.id]) + { + bResult = true; + oAttachment.tempName(oData.Result[oAttachment.id]); + } + } + + if (!bResult) + { + oAttachment.error(Utils.getUploadErrorDescByCode(Enums.UploadErrorCode.FileNoUploaded)); + } + + }, [oDropboxFile['link']]); + + return true; +}; + +/** + * @param {MessageModel} oMessage + * @param {string} sType + */ +PopupsComposeViewModel.prototype.prepearMessageAttachments = function (oMessage, sType) +{ + if (oMessage) + { + var + self = this, + aAttachments = Utils.isNonEmptyArray(oMessage.attachments()) ? oMessage.attachments() : [], + iIndex = 0, + iLen = aAttachments.length, + oAttachment = null, + oItem = null, + bAdd = false, + fCancelFunc = function (sId) { + return function () { + self.attachments.remove(function (oItem) { + return oItem && oItem.id === sId; + }); + }; + } + ; + + if (Enums.ComposeType.ForwardAsAttachment === sType) + { + this.addMessageAsAttachment(oMessage); + } + else + { + for (; iIndex < iLen; iIndex++) + { + oItem = aAttachments[iIndex]; + + bAdd = false; + switch (sType) { + case Enums.ComposeType.Reply: + case Enums.ComposeType.ReplyAll: + bAdd = oItem.isLinked; + break; + + case Enums.ComposeType.Forward: + case Enums.ComposeType.Draft: + bAdd = true; + break; + } + + bAdd = true; + if (bAdd) + { + oAttachment = new ComposeAttachmentModel( + oItem.download, oItem.fileName, oItem.estimatedSize, + oItem.isInline, oItem.isLinked, oItem.cid, oItem.contentLocation + ); + + oAttachment.fromMessage = true; + oAttachment.cancel = fCancelFunc(oItem.download); + oAttachment.waiting(false).uploading(true); + + this.attachments.push(oAttachment); + } + } + } + } +}; + +PopupsComposeViewModel.prototype.removeLinkedAttachments = function () +{ + this.attachments.remove(function (oItem) { + return oItem && oItem.isLinked; + }); +}; + +PopupsComposeViewModel.prototype.setMessageAttachmentFailedDowbloadText = function () +{ + _.each(this.attachments(), function(oAttachment) { + if (oAttachment && oAttachment.fromMessage) + { + oAttachment + .waiting(false) + .uploading(false) + .error(Utils.getUploadErrorDescByCode(Enums.UploadErrorCode.FileNoUploaded)) + ; + } + }, this); +}; + +/** + * @param {boolean=} bIncludeAttachmentInProgress = true + * @return {boolean} + */ +PopupsComposeViewModel.prototype.isEmptyForm = function (bIncludeAttachmentInProgress) +{ + bIncludeAttachmentInProgress = Utils.isUnd(bIncludeAttachmentInProgress) ? true : !!bIncludeAttachmentInProgress; + var bAttach = bIncludeAttachmentInProgress ? + 0 === this.attachments().length : 0 === this.attachmentsInReady().length; + + return 0 === this.to().length && + 0 === this.cc().length && + 0 === this.bcc().length && + 0 === this.subject().length && + bAttach && + '' === this.oEditor.getTextForRequest() + ; +}; + +PopupsComposeViewModel.prototype.reset = function () +{ + this.to([]); + this.cc([]); + this.bcc([]); + this.subject(''); + + this.aDraftInfo = null; + this.sInReplyTo = ''; + this.bFromDraft = false; + this.sReferences = ''; + this.bReloadFolder = false; + + this.sendError(false); + this.sendSuccessButSaveError(false); + this.savedError(false); + this.savedTime(0); + this.savedOrSendingText(''); + this.emptyToError(false); + this.showCcAndBcc(false); + + this.attachments([]); + this.dragAndDropOver(false); + this.dragAndDropVisible(false); + + this.draftFolder(''); + this.draftUid(''); + this.draftID(''); + + this.sending(false); + this.saving(false); + + if (this.oEditor) + { + this.oEditor.clear(); + } +}; + +/** + * @return {Array} + */ +PopupsComposeViewModel.prototype.getAttachmentsDownloadsForUpload = function () +{ + return _.map(_.filter(this.attachments(), function (oItem) { + return oItem && '' === oItem.tempName(); + }), function (oItem) { + return oItem.id; + }); +}; + +PopupsComposeViewModel.prototype.triggerForResize = function () +{ + this.resizer(!this.resizer()); +}; + diff --git a/dev/ViewModels/PopupsContactsViewModel.js b/dev/ViewModels/PopupsContactsViewModel.js new file mode 100644 index 000000000..05a99a46f --- /dev/null +++ b/dev/ViewModels/PopupsContactsViewModel.js @@ -0,0 +1,385 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsContactsViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsContacts'); + + var self = this; + + this.imageUploader = ko.observable(null); + this.imageDom = ko.observable(null); + this.imageTrigger = ko.observable(false); + + this.search = ko.observable(''); + this.contacts = ko.observableArray([]); + this.contacts.loading = ko.observable(false).extend({'throttle': 200}); + this.currentContact = ko.observable(null); + + this.emptySelection = ko.observable(true); + this.viewClearSearch = ko.observable(false); + + this.viewID = ko.observable(''); + this.viewName = ko.observable(''); + this.viewName.focused = ko.observable(false); + this.viewEmail = ko.observable('').validateEmail(); + this.viewEmail.focused = ko.observable(false); + this.viewImageUrl = ko.observable(RL.link().emptyContactPic()); + + this.viewSaving = ko.observable(false); + + this.useCheckboxesInList = RL.data().useCheckboxesInList; + + this.search.subscribe(function () { + this.reloadContactList(); + }, this); + + this.contacts.subscribe(function () { + Utils.windowResize(); + }, this); + + this.viewImageUrl.subscribe(function (sUrl) { + this.imageDom()['src'] = sUrl; + }, this); + + this.contactsChecked = ko.computed(function () { + return _.filter(this.contacts(), function (oItem) { + return oItem.checked(); + }); + }, this); + + this.contactsCheckedOrSelected = ko.computed(function () { + + var + aChecked = this.contactsChecked(), + oSelected = this.currentContact() + ; + + return _.union(aChecked, oSelected ? [oSelected] : []); + + }, this); + + this.contactsCheckedOrSelectedUids = ko.computed(function () { + return _.map(this.contactsCheckedOrSelected(), function (oContact) { + return oContact.idContact; + }); + }, this); + + this.newCommand = Utils.createCommand(this, function () { + this.populateViewContact(null); + }); + + this.selector = new Selector(this.contacts, this.currentContact, + '.e-contact-item .actionHandle', '.e-contact-item.selected', '.e-contact-item .checkboxItem'); + + this.selector.on('onItemSelect', _.bind(function (oContact) { + this.populateViewContact(oContact ? oContact : null); + }, this)); + + this.selector.on('onItemGetUid', function (oContact) { + return oContact ? oContact.generateUid() : ''; + }); + + this.selector.on('onDelete', _.bind(function () { + this.deleteCommand(); + }, this)); + + this.newCommand = Utils.createCommand(this, function () { + this.populateViewContact(null); + this.currentContact(null); + }); + + this.deleteCommand = Utils.createCommand(this, function () { + this.deleteSelectedContacts(); + }, function () { + return 0 < this.contactsCheckedOrSelected().length; + }); + + this.newMessageCommand = Utils.createCommand(this, function () { + var aC = this.contactsCheckedOrSelected(), aE = []; + if (Utils.isNonEmptyArray(aC)) + { + aE = _.map(aC, function (oItem) { + if (oItem && oItem['emails']) + { + var oEmail = new EmailModel(oItem['emails'][0] || '', oItem['name']); + if (oEmail.validate()) + { + return oEmail; + } + } + + return null; + }); + + aE = _.compact(aE); + } + + if (Utils.isNonEmptyArray(aC)) + { + kn.hideScreenPopup(PopupsContactsViewModel); + kn.showScreenPopup(PopupsComposeViewModel, [Enums.ComposeType.Empty, null, aE]); + } + + }, function () { + return 0 < this.contactsCheckedOrSelected().length; + }); + + this.clearCommand = Utils.createCommand(this, function () { + this.search(''); + }); + + this.saveCommand = Utils.createCommand(this, function () { + var + sRequestUid = Utils.fakeMd5(), + bImageTrigger = this.imageTrigger() + ; + + this.viewSaving(true); + RL.remote().contactSave(function (sResult, oData) { + + self.viewSaving(false); + if (Enums.StorageResultType.Success === sResult && oData && oData.Result && + oData.Result.RequestUid === sRequestUid && 0 < Utils.pInt(oData.Result.ResultID)) + { + if ('' === self.viewID()) + { + self.viewID(Utils.pInt(oData.Result.ResultID)); + } + + self.reloadContactList(); + if (bImageTrigger) + { + RL.emailsPicsHashes(); + } + } +// else +// { +// // TODO +// } + + }, sRequestUid, this.viewID(), this.viewName(), this.viewEmail(), bImageTrigger ? this.imageDom()['src'] : ''); + + }, function () { + var + sViewName = this.viewName(), + sViewEmail = this.viewEmail() + ; + + return !this.viewSaving() && + ('' !== sViewName || '' !== sViewEmail); + }); +} + +Utils.extendAsViewModel('PopupsContactsViewModel', PopupsContactsViewModel); + +PopupsContactsViewModel.prototype.removeCheckedOrSelectedContactsFromList = function () +{ + var + self = this, + oKoContacts = this.contacts, + oCurrentContact = this.currentContact(), + aContacts = this.contactsCheckedOrSelected() + ; + + if (0 < aContacts.length) + { + _.each(aContacts, function (oContact) { + + if (oCurrentContact && oCurrentContact.idContact === oContact.idContact) + { + oCurrentContact = null; + self.currentContact(null); + } + + oContact.deleted(true); + }); + + _.delay(function () { + + _.each(aContacts, function (oContact) { + oKoContacts.remove(oContact); + }); + + }, 500); + } +}; + +PopupsContactsViewModel.prototype.deleteSelectedContacts = function () +{ + if (0 < this.contactsCheckedOrSelected().length) + { + RL.remote().contactsDelete( + _.bind(this.deleteResponse, this), + this.contactsCheckedOrSelectedUids() + ); + + this.removeCheckedOrSelectedContactsFromList(); + } +}; + +/** + * @param {string} sResult + * @param {AjaxJsonDefaultResponse} oData + */ +PopupsContactsViewModel.prototype.deleteResponse = function (sResult, oData) +{ + if (500 < (Enums.StorageResultType.Success === sResult && oData && oData.Time ? Utils.pInt(oData.Time) : 0)) + { + this.reloadContactList(); + } + else + { + _.delay((function (self) { + return function () { + self.reloadContactList(); + }; + }(this)), 500); + } +}; + +/** + * @param {?ContactModel} oContact + */ +PopupsContactsViewModel.prototype.populateViewContact = function (oContact) +{ + this.imageTrigger(false); + this.emptySelection(false); + + if (oContact) + { + this.viewID(oContact.idContact); + this.viewName(oContact.name); + this.viewEmail(oContact.emails[0] || ''); + this.viewImageUrl(oContact.srcAttr()); + } + else + { + this.viewID(''); + this.viewName(''); + this.viewEmail(''); + this.viewImageUrl(RL.link().emptyContactPic()); + } +}; + +PopupsContactsViewModel.prototype.reloadContactList = function () +{ + var self = this; + this.contacts.loading(true); + RL.remote().contacts(function (sResult, oData) { + var aList = []; + if (Enums.StorageResultType.Success === sResult && oData && oData.Result && oData.Result.List) + { + if (Utils.isNonEmptyArray(oData.Result.List)) + { + aList = _.map(oData.Result.List, function (oItem) { + var oContact = new ContactModel(); + return oContact.parse(oItem) ? oContact : null; + }); + + aList = _.compact(aList); + } + } + + self.contacts(aList); + self.viewClearSearch('' !== self.search()); + self.contacts.loading(false); + + if ('' !== self.viewID() && !self.currentContact() && self.contacts.setSelectedByUid) + { + self.contacts.setSelectedByUid('' + self.viewID()); + } + + }, this.search()); +}; + +PopupsContactsViewModel.prototype.onBuild = function (oDom) +{ + this.initUploader(); + + this.oContentVisible = $('.b-list-content', oDom); + this.oContentScrollable = $('.content', this.oContentVisible); + + this.selector.init(this.oContentVisible, this.oContentScrollable); + + this.viewImageUrl.valueHasMutated(); + + ko.computed(function () { + var + bModalVisibility = this.modalVisibility(), + bUseKeyboardShortcuts = RL.data().useKeyboardShortcuts() + ; + this.selector.useKeyboard(bModalVisibility && bUseKeyboardShortcuts); + }, this).extend({'notify': 'always'}); +}; + +PopupsContactsViewModel.prototype.initUploader = function () +{ + var self = this, oJua = null; + if (window.File && window.FileReader && this.imageUploader()) + { + oJua = new Jua({ + 'queueSize': 1, + 'multipleSizeLimit': 1, + 'clickElement': this.imageUploader(), + 'disableDragAndDrop': true, + 'disableMultiple': true, + 'onSelect': function (sId, oData) { + + if (oData && oData['File'] && oData['File']['type']) + { + var + oReader = null, + oFile = oData['File'], + sType = oData['File']['type'] + ; + + if (!sType.match(/image.*/)) + { + window.alert('this file is not an image.'); + } + else + { + oReader = new window.FileReader(); + oReader.onload = function (oEvent) { + if (oEvent && oEvent.target && oEvent.target.result) + { + Utils.resizeAndCrop(oEvent.target.result, 150, function (sUrl) { + self.viewImageUrl(sUrl); + self.imageTrigger(true); + }); + } + }; + + oReader.readAsDataURL(oFile); + } + } + + return false; + } + }); + } + + return oJua; +}; + +PopupsContactsViewModel.prototype.onShow = function () +{ + kn.routeOff(); + this.reloadContactList(); +}; + +PopupsContactsViewModel.prototype.onHide = function () +{ + kn.routeOn(); + this.currentContact(null); + this.emptySelection(true); + this.search(''); + + _.each(this.contacts(), function (oItem) { + oItem.checked(false); + }); +}; diff --git a/dev/ViewModels/PopupsDomainViewModel.js b/dev/ViewModels/PopupsDomainViewModel.js new file mode 100644 index 000000000..62dc75772 --- /dev/null +++ b/dev/ViewModels/PopupsDomainViewModel.js @@ -0,0 +1,205 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsDomainViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsDomain'); + + this.edit = ko.observable(false); + this.saving = ko.observable(false); + this.savingError = ko.observable(''); + this.whiteListPage = ko.observable(false); + + this.testing = ko.observable(false); + this.testingDone = ko.observable(false); + this.testingImapError = ko.observable(false); + this.testingSmtpError = ko.observable(false); + + this.imapServerFocus = ko.observable(false); + this.smtpServerFocus = ko.observable(false); + + this.name = ko.observable(''); + this.imapServer = ko.observable(''); + this.imapPort = ko.observable(Consts.Values.ImapDefaulPort); + this.imapSecure = ko.observable(Enums.ServerSecure.None); + this.imapShortLogin = ko.observable(false); + this.smtpServer = ko.observable(''); + this.smtpPort = ko.observable(Consts.Values.SmtpDefaulPort); + this.smtpSecure = ko.observable(Enums.ServerSecure.None); + this.smtpShortLogin = ko.observable(false); + this.smtpAuth = ko.observable(true); + this.whiteList = ko.observable(''); + + this.imapServerFocus.subscribe(function (bValue) { + if (bValue && '' !== this.name() && '' === this.imapServer()) + { + this.imapServer(this.name()); + } + }, this); + + this.smtpServerFocus.subscribe(function (bValue) { + if (bValue && '' !== this.imapServer() && '' === this.smtpServer()) + { + this.smtpServer(this.imapServer()); + } + }, this); + + this.headerText = ko.computed(function () { + var sName = this.name(); + return this.edit() ? 'Edit Domain "' + sName + '"' : + 'Add Domain' + ('' === sName ? '' : ' "' + sName + '"'); + }, this); + + this.domainIsComputed = ko.computed(function () { + return '' !== this.name() && + '' !== this.imapServer() && + '' !== this.imapPort() && + '' !== this.smtpServer() && + '' !== this.smtpPort(); + }, this); + + this.canBeTested = ko.computed(function () { + return !this.testing() && this.domainIsComputed(); + }, this); + + this.canBeSaved = ko.computed(function () { + return !this.saving() && this.domainIsComputed(); + }, this); + + this.createOrAddCommand = Utils.createCommand(this, function () { + this.saving(true); + RL.remote().createOrUpdateDomain( + _.bind(this.onDomainCreateOrSaveResponse, this), + !this.edit(), + this.name(), + this.imapServer(), + this.imapPort(), + this.imapSecure(), + this.imapShortLogin(), + this.smtpServer(), + this.smtpPort(), + this.smtpSecure(), + this.smtpShortLogin(), + this.smtpAuth(), + this.whiteList() + ); + }, this.canBeSaved); + + this.testConnectionCommand = Utils.createCommand(this, function () { + this.whiteListPage(false); + this.testingDone(false); + this.testingImapError(false); + this.testingSmtpError(false); + this.testing(true); + RL.remote().testConnectionForDomain( + _.bind(this.onTestConnectionResponse, this), + this.imapServer(), + this.imapPort(), + this.imapSecure(), + this.smtpServer(), + this.smtpPort(), + this.smtpSecure(), + this.smtpAuth() + ); + }, this.canBeTested); + + this.whiteListCommand = Utils.createCommand(this, function () { + this.whiteListPage(!this.whiteListPage()); + }); +} + +Utils.extendAsViewModel('PopupsDomainViewModel', PopupsDomainViewModel); + +PopupsDomainViewModel.prototype.onTestConnectionResponse = function (sResult, oData) +{ + this.testing(false); + if (Enums.StorageResultType.Success === sResult && oData.Result) + { + this.testingDone(true); + this.testingImapError(false === oData.Result.Imap); + this.testingSmtpError(false === oData.Result.Smtp); + } + else + { + this.testingImapError(true); + this.testingSmtpError(true); + } +}; + +PopupsDomainViewModel.prototype.onDomainCreateOrSaveResponse = function (sResult, oData) +{ + this.saving(false); + if (Enums.StorageResultType.Success === sResult && oData) + { + if (oData.Result) + { + RL.reloadDomainList(); + this.closeCommand(); + } + else if (Enums.Notification.DomainAlreadyExists === oData.ErrorCode) + { + this.savingError('Domain already exists'); + } + } + else + { + this.savingError('Unknown error'); + } +}; + +PopupsDomainViewModel.prototype.onHide = function () +{ + this.whiteListPage(false); +}; + +PopupsDomainViewModel.prototype.onShow = function (oDomain) +{ + this.saving(false); + this.whiteListPage(false); + + this.testing(false); + this.testingDone(false); + this.testingImapError(false); + this.testingSmtpError(false); + + this.clearForm(); + if (oDomain) + { + this.edit(true); + + this.name(Utils.trim(oDomain.Name)); + this.imapServer(Utils.trim(oDomain.IncHost)); + this.imapPort(Utils.pInt(oDomain.IncPort)); + this.imapSecure(Utils.trim(oDomain.IncSecure)); + this.imapShortLogin(!!oDomain.IncShortLogin); + this.smtpServer(Utils.trim(oDomain.OutHost)); + this.smtpPort(Utils.pInt(oDomain.OutPort)); + this.smtpSecure(Utils.trim(oDomain.OutSecure)); + this.smtpShortLogin(!!oDomain.OutShortLogin); + this.smtpAuth(!!oDomain.OutAuth); + this.whiteList(Utils.trim(oDomain.WhiteList)); + } +}; + +PopupsDomainViewModel.prototype.clearForm = function () +{ + this.edit(false); + this.whiteListPage(false); + + this.savingError(''); + + this.name(''); + this.imapServer(''); + this.imapPort(Consts.Values.ImapDefaulPort); + this.imapSecure(Enums.ServerSecure.None); + this.imapShortLogin(false); + this.smtpServer(''); + this.smtpPort(Consts.Values.SmtpDefaulPort); + this.smtpSecure(Enums.ServerSecure.None); + this.smtpShortLogin(false); + this.smtpAuth(true); + this.whiteList(''); +}; diff --git a/dev/ViewModels/PopupsFolderClearViewModel.js b/dev/ViewModels/PopupsFolderClearViewModel.js new file mode 100644 index 000000000..f0f61b210 --- /dev/null +++ b/dev/ViewModels/PopupsFolderClearViewModel.js @@ -0,0 +1,95 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsFolderClearViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsFolderClear'); + + this.selectedFolder = ko.observable(null); + this.clearingProcess = ko.observable(false); + this.clearingError = ko.observable(''); + + this.folderFullNameForClear = ko.computed(function () { + var oFolder = this.selectedFolder(); + return oFolder ? oFolder.printableFullName() : ''; + }, this); + + this.folderNameForClear = ko.computed(function () { + var oFolder = this.selectedFolder(); + return oFolder ? oFolder.localName() : ''; + }, this); + + this.dangerDescHtml = ko.computed(function () { + return Utils.i18n('POPUPS_CLEAR_FOLDER/DANGER_DESC_HTML_1', { + 'FOLDER': this.folderNameForClear() + }); + }, this); + + this.clearCommand = Utils.createCommand(this, function () { + + var + self = this, + oFolderToClear = this.selectedFolder() + ; + + if (oFolderToClear) + { + RL.data().message(null); + RL.data().messageList([]); + + this.clearingProcess(true); + + RL.cache().setFolderHash(oFolderToClear.fullNameRaw, ''); + RL.remote().folderClear(function (sResult, oData) { + + self.clearingProcess(false); + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + RL.reloadMessageList(true); + self.cancelCommand(); + } + else + { + if (oData && oData.ErrorCode) + { + self.clearingError(Utils.getNotification(oData.ErrorCode)); + } + else + { + self.clearingError(Utils.getNotification(Enums.Notification.MailServerError)); + } + } + }, oFolderToClear.fullNameRaw); + } + + }, function () { + + var + oFolder = this.selectedFolder(), + bIsClearing = this.clearingProcess() + ; + + return !bIsClearing && null !== oFolder; + + }); +} + +Utils.extendAsViewModel('PopupsFolderClearViewModel', PopupsFolderClearViewModel); + +PopupsFolderClearViewModel.prototype.clearPopup = function () +{ + this.clearingProcess(false); + this.selectedFolder(null); +}; + +PopupsFolderClearViewModel.prototype.onShow = function (oFolder) +{ + this.clearPopup(); + if (oFolder) + { + this.selectedFolder(oFolder); + } +}; diff --git a/dev/ViewModels/PopupsFolderCreateViewModel.js b/dev/ViewModels/PopupsFolderCreateViewModel.js new file mode 100644 index 000000000..f744005ac --- /dev/null +++ b/dev/ViewModels/PopupsFolderCreateViewModel.js @@ -0,0 +1,105 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsFolderCreateViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsFolderCreate'); + + Utils.initOnStartOrLangChange(function () { + this.sNoParentText = Utils.i18n('POPUPS_CREATE_FOLDER/SELECT_NO_PARENT'); + }, this); + + this.folderName = ko.observable(''); + this.focusTrigger = ko.observable(false); + + this.selectedParentValue = ko.observable(Consts.Values.UnuseOptionValue); + + this.parentFolderSelectList = ko.computed(function () { + + var + oData = RL.data(), + aTop = [], + fDisableCallback = null, + fVisibleCallback = null, + aList = oData.folderList(), + fRenameCallback = function (oItem) { + return oItem ? (oItem.isSystemFolder() ? oItem.name() + ' ' + oItem.manageFolderSystemName() : oItem.name()) : ''; + } + ; + + aTop.push(['', this.sNoParentText]); + + if ('' !== oData.namespace) + { + fDisableCallback = function (oItem) + { + return oData.namespace !== oItem.fullNameRaw.substr(0, oData.namespace.length); + }; + } + + return RL.folderListOptionsBuilder([], aList, [], aTop, null, fDisableCallback, fVisibleCallback, fRenameCallback); + + }, this); + + // commands + this.createFolder = Utils.createCommand(this, function () { + + var + oData = RL.data(), + sParentFolderName = this.selectedParentValue() + ; + + if ('' === sParentFolderName && 1 < oData.namespace.length) + { + sParentFolderName = oData.namespace.substr(0, oData.namespace.length - 1); + } + + oData.foldersCreating(true); + RL.remote().folderCreate(function (sResult, oData) { + + RL.data().foldersCreating(false); + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + RL.folders(false); + } + else + { + RL.data().foldersListError( + oData && oData.ErrorCode ? Utils.getNotification(oData.ErrorCode) : Utils.i18n('NOTIFICATIONS/CANT_CREATE_FOLDER')); + } + + }, this.folderName(), sParentFolderName); + + this.cancelCommand(); + + }, function () { + return this.simpleFolderNameValidation(this.folderName()); + }); + + this.defautOptionsAfterRender = Utils.defautOptionsAfterRender; +} + +Utils.extendAsViewModel('PopupsFolderCreateViewModel', PopupsFolderCreateViewModel); + +PopupsFolderCreateViewModel.prototype.sNoParentText = ''; + +PopupsFolderCreateViewModel.prototype.simpleFolderNameValidation = function (sName) +{ + return (/^[^\\\/]+$/g).test(Utils.trim(sName)); +}; + +PopupsFolderCreateViewModel.prototype.clearPopup = function () +{ + this.folderName(''); + this.selectedParentValue(''); + this.focusTrigger(false); +}; + +PopupsFolderCreateViewModel.prototype.onShow = function () +{ + this.clearPopup(); + this.focusTrigger(true); +}; diff --git a/dev/ViewModels/PopupsFolderSystemViewModel.js b/dev/ViewModels/PopupsFolderSystemViewModel.js new file mode 100644 index 000000000..39d074db9 --- /dev/null +++ b/dev/ViewModels/PopupsFolderSystemViewModel.js @@ -0,0 +1,103 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsFolderSystemViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsFolderSystem'); + + Utils.initOnStartOrLangChange(function () { + this.sChooseOnText = Utils.i18n('POPUPS_SYSTEM_FOLDERS/SELECT_CHOOSE_ONE'); + this.sUnuseText = Utils.i18n('POPUPS_SYSTEM_FOLDERS/SELECT_UNUSE_NAME'); + }, this); + + this.notification = ko.observable(''); + + this.folderSelectList = ko.computed(function () { + return RL.folderListOptionsBuilder([], RL.data().folderList(), RL.data().folderListSystemNames(), [ + ['', this.sChooseOnText], + [Consts.Values.UnuseOptionValue, this.sUnuseText] + ]); + }, this); + + var + oData = RL.data(), + self = this, + fSaveSystemFolders = null, + fCallback = null + ; + + this.sentFolder = oData.sentFolder; + this.draftFolder = oData.draftFolder; + this.spamFolder = oData.spamFolder; + this.trashFolder = oData.trashFolder; + + fSaveSystemFolders = _.debounce(function () { + + RL.settingsSet('SentFolder', self.sentFolder()); + RL.settingsSet('DraftFolder', self.draftFolder()); + RL.settingsSet('SpamFolder', self.spamFolder()); + RL.settingsSet('TrashFolder', self.trashFolder()); + + RL.remote().saveSystemFolders(Utils.emptyFunction, { + 'SentFolder': self.sentFolder(), + 'DraftFolder': self.draftFolder(), + 'SpamFolder': self.spamFolder(), + 'TrashFolder': self.trashFolder() + }); + + }, 1000); + + fCallback = function () { + + RL.settingsSet('SentFolder', self.sentFolder()); + RL.settingsSet('DraftFolder', self.draftFolder()); + RL.settingsSet('SpamFolder', self.spamFolder()); + RL.settingsSet('TrashFolder', self.trashFolder()); + + fSaveSystemFolders(); + }; + + this.sentFolder.subscribe(fCallback); + this.draftFolder.subscribe(fCallback); + this.spamFolder.subscribe(fCallback); + this.trashFolder.subscribe(fCallback); + + this.defautOptionsAfterRender = Utils.defautOptionsAfterRender; +} + +Utils.extendAsViewModel('PopupsFolderSystemViewModel', PopupsFolderSystemViewModel); + +PopupsFolderSystemViewModel.prototype.sChooseOnText = ''; +PopupsFolderSystemViewModel.prototype.sUnuseText = ''; + +/** + * @param {number=} iNotificationType = Enums.SetSystemFoldersNotification.None + */ +PopupsFolderSystemViewModel.prototype.onShow = function (iNotificationType) +{ + var sNotification = ''; + + iNotificationType = Utils.isUnd(iNotificationType) ? Enums.SetSystemFoldersNotification.None : iNotificationType; + + switch (iNotificationType) + { + case Enums.SetSystemFoldersNotification.Sent: + sNotification = Utils.i18n('POPUPS_SYSTEM_FOLDERS/NOTIFICATION_SENT'); + break; + case Enums.SetSystemFoldersNotification.Draft: + sNotification = Utils.i18n('POPUPS_SYSTEM_FOLDERS/NOTIFICATION_DRAFTS'); + break; + case Enums.SetSystemFoldersNotification.Spam: + sNotification = Utils.i18n('POPUPS_SYSTEM_FOLDERS/NOTIFICATION_SPAM'); + break; + case Enums.SetSystemFoldersNotification.Trash: + sNotification = Utils.i18n('POPUPS_SYSTEM_FOLDERS/NOTIFICATION_TRASH'); + break; + } + + this.notification(sNotification); +}; + diff --git a/dev/ViewModels/PopupsIdentityViewModel.js b/dev/ViewModels/PopupsIdentityViewModel.js new file mode 100644 index 000000000..6b6dc56a1 --- /dev/null +++ b/dev/ViewModels/PopupsIdentityViewModel.js @@ -0,0 +1,145 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsIdentityViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsIdentity'); + + this.id = ''; + this.edit = ko.observable(false); + this.owner = ko.observable(false); + + this.email = ko.observable('').validateEmail(); + this.email.focused = ko.observable(false); + this.name = ko.observable(''); + this.name.focused = ko.observable(false); + this.replyTo = ko.observable('').validateSimpleEmail(); + this.replyTo.focused = ko.observable(false); + this.bcc = ko.observable('').validateSimpleEmail(); + this.bcc.focused = ko.observable(false); + +// this.email.subscribe(function () { +// this.email.hasError(false); +// }, this); + + this.submitRequest = ko.observable(false); + this.submitError = ko.observable(''); + + this.addOrEditIdentityCommand = Utils.createCommand(this, function () { + + if (!this.email.hasError()) + { + this.email.hasError('' === Utils.trim(this.email())); + } + + if (this.email.hasError()) + { + if (!this.owner()) + { + this.email.focused(true); + } + + return false; + } + + if (this.replyTo.hasError()) + { + this.replyTo.focused(true); + return false; + } + + if (this.bcc.hasError()) + { + this.bcc.focused(true); + return false; + } + + this.submitRequest(true); + + RL.remote().identityUpdate(_.bind(function (sResult, oData) { + + this.submitRequest(false); + if (Enums.StorageResultType.Success === sResult && oData) + { + if (oData.Result) + { + RL.accountsAndIdentities(); + this.cancelCommand(); + } + else if (oData.ErrorCode) + { + this.submitError(Utils.getNotification(oData.ErrorCode)); + } + } + else + { + this.submitError(Utils.getNotification(Enums.Notification.UnknownError)); + } + + }, this), this.id, this.email(), this.name(), this.replyTo(), this.bcc()); + + return true; + + }, function () { + return !this.submitRequest(); + }); + + this.label = ko.computed(function () { + return Utils.i18n('POPUPS_IDENTITIES/' + (this.edit() ? 'TITLE_UPDATE_IDENTITY': 'TITLE_ADD_IDENTITY')); + }, this); + + this.button = ko.computed(function () { + return Utils.i18n('POPUPS_IDENTITIES/' + (this.edit() ? 'BUTTON_UPDATE_IDENTITY': 'BUTTON_ADD_IDENTITY')); + }, this); +} + +Utils.extendAsViewModel('PopupsIdentityViewModel', PopupsIdentityViewModel); + +PopupsIdentityViewModel.prototype.clearPopup = function () +{ + this.id = ''; + this.edit(false); + this.owner(false); + + this.name(''); + this.email(''); + this.replyTo(''); + this.bcc(''); + + this.email.hasError(false); + this.replyTo.hasError(false); + this.bcc.hasError(false); + + this.submitRequest(false); + this.submitError(''); +}; + +/** + * + * @param {?IdentityModel} oIdentity + */ +PopupsIdentityViewModel.prototype.onShow = function (oIdentity) +{ + this.clearPopup(); + + if (oIdentity) + { + this.edit(true); + + this.id = oIdentity.id; + this.name(oIdentity.name()); + this.email(oIdentity.email()); + this.replyTo(oIdentity.replyTo()); + this.bcc(oIdentity.bcc()); + + this.owner(this.id === RL.data().accountEmail()); + } + + if (!this.owner()) + { + this.email.focused(true); + } +}; diff --git a/dev/ViewModels/PopupsLanguagesViewModel.js b/dev/ViewModels/PopupsLanguagesViewModel.js new file mode 100644 index 000000000..b5a0eb3eb --- /dev/null +++ b/dev/ViewModels/PopupsLanguagesViewModel.js @@ -0,0 +1,45 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsLanguagesViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsLanguages'); + + this.exp = ko.observable(false); + + this.languages = ko.computed(function () { + var sCurrent = RL.data().mainLanguage(); + return _.map(RL.data().languages(), function (sLanguage) { + return { + 'key': sLanguage, + 'selected': sLanguage === sCurrent, + 'fullName': Utils.convertLangName(sLanguage) + }; + }); + }); +} + +Utils.extendAsViewModel('PopupsLanguagesViewModel', PopupsLanguagesViewModel); + +PopupsLanguagesViewModel.prototype.onShow = function () +{ +// var self = this; +// _.defer(function () { +// self.exp(true); +// }); + this.exp(true); +}; + +PopupsLanguagesViewModel.prototype.onHide = function () +{ + this.exp(false); +}; + +PopupsLanguagesViewModel.prototype.changeLanguage = function (sLang) +{ + RL.data().mainLanguage(sLang); + this.cancelCommand(); +}; diff --git a/dev/ViewModels/PopupsPluginViewModel.js b/dev/ViewModels/PopupsPluginViewModel.js new file mode 100644 index 000000000..5de8e16e6 --- /dev/null +++ b/dev/ViewModels/PopupsPluginViewModel.js @@ -0,0 +1,111 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsPluginViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsPlugin'); + + var self = this; + + this.onPluginSettingsUpdateResponse = _.bind(this.onPluginSettingsUpdateResponse, this); + + this.saveError = ko.observable(''); + + this.name = ko.observable(''); + this.readme = ko.observable(''); + + this.configures = ko.observableArray([]); + + this.hasReadme = ko.computed(function () { + return '' !== this.readme(); + }, this); + + this.hasConfiguration = ko.computed(function () { + return 0 < this.configures().length; + }, this); + + this.readmePopoverConf = { + 'placement': 'top', + 'trigger': 'hover', + 'title': 'About', + 'content': function () { + return self.readme(); + } + }; + + this.saveCommand = Utils.createCommand(this, function () { + + var oList = {}; + + oList['Name'] = this.name(); + + _.each(this.configures(), function (oItem) { + + var mValue = oItem.value(); + if (false === mValue || true === mValue) + { + mValue = mValue ? '1' : '0'; + } + + oList['_' + oItem['Name']] = mValue; + + }, this); + + this.saveError(''); + RL.remote().pluginSettingsUpdate(this.onPluginSettingsUpdateResponse, oList); + + }, this.hasConfiguration); +} + +Utils.extendAsViewModel('PopupsPluginViewModel', PopupsPluginViewModel); + +PopupsPluginViewModel.prototype.onPluginSettingsUpdateResponse = function (sResult, oData) +{ + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + this.cancelCommand(); + } + else + { + this.saveError(''); + if (oData && oData.ErrorCode) + { + this.saveError(Utils.getNotification(oData.ErrorCode)); + } + else + { + this.saveError(Utils.getNotification(Enums.Notification.CantSavePluginSettings)); + } + } +}; + +PopupsPluginViewModel.prototype.onShow = function (oPlugin) +{ + this.name(); + this.readme(); + this.configures([]); + + if (oPlugin) + { + this.name(oPlugin['Name']); + this.readme(oPlugin['Readme']); + + var aConfig = oPlugin['Config']; + if (Utils.isNonEmptyArray(aConfig)) + { + this.configures(_.map(aConfig, function (aItem) { + return { + 'value': ko.observable(aItem[0]), + 'Name': aItem[1], + 'Type': aItem[2], + 'Label': aItem[3], + 'Default': aItem[4], + 'Desc': aItem[5] + }; + })); + } + } +}; diff --git a/dev/ViewModels/SettingsMenuViewModel.js b/dev/ViewModels/SettingsMenuViewModel.js new file mode 100644 index 000000000..1745c7466 --- /dev/null +++ b/dev/ViewModels/SettingsMenuViewModel.js @@ -0,0 +1,26 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @param {?} oScreen + * + * @constructor + * @extends KnoinAbstractViewModel + */ +function SettingsMenuViewModel(oScreen) +{ + KnoinAbstractViewModel.call(this, 'Left', 'SettingsMenu'); + + this.menu = oScreen.menu; +} + +Utils.extendAsViewModel('SettingsMenuViewModel', SettingsMenuViewModel); + +SettingsMenuViewModel.prototype.link = function (sRoute) +{ + return RL.link().settings(sRoute); +}; + +SettingsMenuViewModel.prototype.backToMailBoxClick = function () +{ + kn.setHash(RL.link().inbox()); +}; diff --git a/dev/ViewModels/SettingsPaneViewModel.js b/dev/ViewModels/SettingsPaneViewModel.js new file mode 100644 index 000000000..ff226ab74 --- /dev/null +++ b/dev/ViewModels/SettingsPaneViewModel.js @@ -0,0 +1,22 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function SettingsPaneViewModel() +{ + KnoinAbstractViewModel.call(this, 'Right', 'SettingsPane'); +} + +Utils.extendAsViewModel('SettingsPaneViewModel', SettingsPaneViewModel); + +SettingsPaneViewModel.prototype.onShow = function () +{ + RL.data().message(null); +}; + +SettingsPaneViewModel.prototype.backToMailBoxClick = function () +{ + kn.setHash(RL.link().inbox()); +}; diff --git a/dev/ViewModels/SettingsSystemDropDownViewModel.js b/dev/ViewModels/SettingsSystemDropDownViewModel.js new file mode 100644 index 000000000..589a89f60 --- /dev/null +++ b/dev/ViewModels/SettingsSystemDropDownViewModel.js @@ -0,0 +1,12 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ + +/** + * @constructor + * @extends AbstractSystemDropDownViewModel + */ +function SettingsSystemDropDownViewModel() +{ + AbstractSystemDropDownViewModel.call(this); +} + +_.extend(SettingsSystemDropDownViewModel.prototype, AbstractSystemDropDownViewModel.prototype); diff --git a/package.json b/package.json new file mode 100644 index 000000000..f029f6a85 --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "RainLoop", + "title": "RainLoop Webmail", + "version": "0.0.0", + "description": "Simple, modern & fast web-based email client", + "homepage": "http://rainloop.net", + "main": "Gruntfile.js", + "author": { + "name": "RainLoop Team", + "email": "support@rainloop.net", + "web": "http://rainloop.net" + }, + "repository": { + "type": "git", + "url": "git://github.com/RainLoop/rainloop-webmail.git" + }, + "licenses": [ + { + "type": "CC BY-NC-SA 3.0", + "ulr": "http://creativecommons.org/licenses/by-nc-sa/3.0/" + } + ], + "bugs": { + "url": "https://github.com/RainLoop/rainloop-webmail/issues" + }, + "keywords": [ + "webmail", + "php", + "simple", + "modern", + "mail", + "web-based", + "email", + "client", + "plugins" + ], + "readmeFilename": "README.md", + "devDependencies": { + "grunt": "~0.4.1", + "grunt-css": ">0.0.0", + "grunt-contrib-jshint": "~0.4.0", + "grunt-contrib-concat": ">0.0.0", + "grunt-contrib-less": "~0.5.0", + "grunt-contrib-uglify": "~0.2.4", + "grunt-contrib-watch": "~0.5.3" + } +} \ No newline at end of file diff --git a/rainloop/v/0.0.0/VERSION b/rainloop/v/0.0.0/VERSION new file mode 100644 index 000000000..bd52db81d --- /dev/null +++ b/rainloop/v/0.0.0/VERSION @@ -0,0 +1 @@ +0.0.0 \ No newline at end of file diff --git a/rainloop/v/1.3.10.492/app/.htaccess b/rainloop/v/0.0.0/app/.htaccess similarity index 100% rename from rainloop/v/1.3.10.492/app/.htaccess rename to rainloop/v/0.0.0/app/.htaccess diff --git a/rainloop/v/1.3.10.492/app/domains/disabled b/rainloop/v/0.0.0/app/domains/disabled similarity index 100% rename from rainloop/v/1.3.10.492/app/domains/disabled rename to rainloop/v/0.0.0/app/domains/disabled diff --git a/rainloop/v/1.3.10.492/app/domains/gmail.com.ini b/rainloop/v/0.0.0/app/domains/gmail.com.ini similarity index 100% rename from rainloop/v/1.3.10.492/app/domains/gmail.com.ini rename to rainloop/v/0.0.0/app/domains/gmail.com.ini diff --git a/rainloop/v/1.3.10.492/app/domains/outlook.com.ini b/rainloop/v/0.0.0/app/domains/outlook.com.ini similarity index 100% rename from rainloop/v/1.3.10.492/app/domains/outlook.com.ini rename to rainloop/v/0.0.0/app/domains/outlook.com.ini diff --git a/rainloop/v/1.3.10.492/app/domains/yahoo.com.ini b/rainloop/v/0.0.0/app/domains/yahoo.com.ini similarity index 100% rename from rainloop/v/1.3.10.492/app/domains/yahoo.com.ini rename to rainloop/v/0.0.0/app/domains/yahoo.com.ini diff --git a/rainloop/v/1.3.10.492/app/handle.php b/rainloop/v/0.0.0/app/handle.php similarity index 100% rename from rainloop/v/1.3.10.492/app/handle.php rename to rainloop/v/0.0.0/app/handle.php diff --git a/rainloop/v/1.3.10.492/app/i18n/langs.ini b/rainloop/v/0.0.0/app/i18n/langs.ini similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/langs.ini rename to rainloop/v/0.0.0/app/i18n/langs.ini diff --git a/rainloop/v/0.0.0/app/i18n/moment/CONTRIBUTING.md b/rainloop/v/0.0.0/app/i18n/moment/CONTRIBUTING.md new file mode 100644 index 000000000..980d7ec4d --- /dev/null +++ b/rainloop/v/0.0.0/app/i18n/moment/CONTRIBUTING.md @@ -0,0 +1,45 @@ +All pull requests to the `master` branch will be closed. +======================================================== + +Please submit all pull requests to the `develop` branch. + +Language translations will not be merged without unit tests. +============================================================ + +See [the British english unit tests](https://github.com/moment/moment/blob/develop/test/lang/en-gb.js) for an example. + +Submitting Issues +================= + +If you are submitting a bug, please create a [jsfiddle](http://jsfiddle.net/) demonstrating the issue. + +Contributing +============ + +To contribute, fork the library and install grunt. + + npm install grunt -g + +You can add tests to the files in `/test/moment` or add a new test file if you are adding a new feature. + +To run the tests, do `grunt` to run all tests. + +To check the filesize, you can use `grunt size`. + +To minify all the files, use `grunt release`. + +If your code passes the unit tests (including the ones you wrote), submit a pull request. + +Submitting pull requests +======================== + +Moment.js now uses [git-flow](https://github.com/nvie/gitflow). If you're not familiar with git-flow, please read up on it, you'll be glad you did. + +When submitting new features, please create a new feature branch using `git flow feature start ` and submit the pull request to the `develop` branch. + +Pull requests for enhancements for features should be submitted to the `develop` branch as well. + +When submitting a bugfix, please check if there is an existing bugfix branch. If the latest stable version is `1.5.0`, the bugfix branch would be `hotfix/1.5.1`. All pull requests for bug fixes should be on a `hotfix` branch, unless the bug fix depends on a new feature. + +The `master` branch should always have the latest stable version. When bugfix or minor releases are needed, the develop/hotfix branch will be merged into master and released. + diff --git a/rainloop/v/0.0.0/app/i18n/moment/LICENSE b/rainloop/v/0.0.0/app/i18n/moment/LICENSE new file mode 100644 index 000000000..b44e3a68c --- /dev/null +++ b/rainloop/v/0.0.0/app/i18n/moment/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2011-2013 Tim Wood, Iskren Chernev, Moment.js contributors + +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. diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/ar-ma.js b/rainloop/v/0.0.0/app/i18n/moment/ar-ma.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/ar-ma.js rename to rainloop/v/0.0.0/app/i18n/moment/ar-ma.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/ar.js b/rainloop/v/0.0.0/app/i18n/moment/ar.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/ar.js rename to rainloop/v/0.0.0/app/i18n/moment/ar.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/bg.js b/rainloop/v/0.0.0/app/i18n/moment/bg.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/bg.js rename to rainloop/v/0.0.0/app/i18n/moment/bg.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/br.js b/rainloop/v/0.0.0/app/i18n/moment/br.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/br.js rename to rainloop/v/0.0.0/app/i18n/moment/br.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/bs.js b/rainloop/v/0.0.0/app/i18n/moment/bs.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/bs.js rename to rainloop/v/0.0.0/app/i18n/moment/bs.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/ca.js b/rainloop/v/0.0.0/app/i18n/moment/ca.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/ca.js rename to rainloop/v/0.0.0/app/i18n/moment/ca.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/cs.js b/rainloop/v/0.0.0/app/i18n/moment/cs.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/cs.js rename to rainloop/v/0.0.0/app/i18n/moment/cs.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/cv.js b/rainloop/v/0.0.0/app/i18n/moment/cv.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/cv.js rename to rainloop/v/0.0.0/app/i18n/moment/cv.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/da.js b/rainloop/v/0.0.0/app/i18n/moment/da.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/da.js rename to rainloop/v/0.0.0/app/i18n/moment/da.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/de.js b/rainloop/v/0.0.0/app/i18n/moment/de.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/de.js rename to rainloop/v/0.0.0/app/i18n/moment/de.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/el.js b/rainloop/v/0.0.0/app/i18n/moment/el.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/el.js rename to rainloop/v/0.0.0/app/i18n/moment/el.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/en-au.js b/rainloop/v/0.0.0/app/i18n/moment/en-au.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/en-au.js rename to rainloop/v/0.0.0/app/i18n/moment/en-au.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/en-ca.js b/rainloop/v/0.0.0/app/i18n/moment/en-ca.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/en-ca.js rename to rainloop/v/0.0.0/app/i18n/moment/en-ca.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/en-gb.js b/rainloop/v/0.0.0/app/i18n/moment/en-gb.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/en-gb.js rename to rainloop/v/0.0.0/app/i18n/moment/en-gb.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/eo.js b/rainloop/v/0.0.0/app/i18n/moment/eo.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/eo.js rename to rainloop/v/0.0.0/app/i18n/moment/eo.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/es.js b/rainloop/v/0.0.0/app/i18n/moment/es.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/es.js rename to rainloop/v/0.0.0/app/i18n/moment/es.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/et.js b/rainloop/v/0.0.0/app/i18n/moment/et.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/et.js rename to rainloop/v/0.0.0/app/i18n/moment/et.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/eu.js b/rainloop/v/0.0.0/app/i18n/moment/eu.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/eu.js rename to rainloop/v/0.0.0/app/i18n/moment/eu.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/fa.js b/rainloop/v/0.0.0/app/i18n/moment/fa.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/fa.js rename to rainloop/v/0.0.0/app/i18n/moment/fa.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/fi.js b/rainloop/v/0.0.0/app/i18n/moment/fi.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/fi.js rename to rainloop/v/0.0.0/app/i18n/moment/fi.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/fr-ca.js b/rainloop/v/0.0.0/app/i18n/moment/fr-ca.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/fr-ca.js rename to rainloop/v/0.0.0/app/i18n/moment/fr-ca.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/fr.js b/rainloop/v/0.0.0/app/i18n/moment/fr.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/fr.js rename to rainloop/v/0.0.0/app/i18n/moment/fr.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/gl.js b/rainloop/v/0.0.0/app/i18n/moment/gl.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/gl.js rename to rainloop/v/0.0.0/app/i18n/moment/gl.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/he.js b/rainloop/v/0.0.0/app/i18n/moment/he.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/he.js rename to rainloop/v/0.0.0/app/i18n/moment/he.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/hi.js b/rainloop/v/0.0.0/app/i18n/moment/hi.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/hi.js rename to rainloop/v/0.0.0/app/i18n/moment/hi.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/hr.js b/rainloop/v/0.0.0/app/i18n/moment/hr.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/hr.js rename to rainloop/v/0.0.0/app/i18n/moment/hr.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/hu.js b/rainloop/v/0.0.0/app/i18n/moment/hu.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/hu.js rename to rainloop/v/0.0.0/app/i18n/moment/hu.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/id.js b/rainloop/v/0.0.0/app/i18n/moment/id.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/id.js rename to rainloop/v/0.0.0/app/i18n/moment/id.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/is.js b/rainloop/v/0.0.0/app/i18n/moment/is.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/is.js rename to rainloop/v/0.0.0/app/i18n/moment/is.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/it.js b/rainloop/v/0.0.0/app/i18n/moment/it.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/it.js rename to rainloop/v/0.0.0/app/i18n/moment/it.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/ja.js b/rainloop/v/0.0.0/app/i18n/moment/ja.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/ja.js rename to rainloop/v/0.0.0/app/i18n/moment/ja.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/ka.js b/rainloop/v/0.0.0/app/i18n/moment/ka.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/ka.js rename to rainloop/v/0.0.0/app/i18n/moment/ka.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/ko.js b/rainloop/v/0.0.0/app/i18n/moment/ko.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/ko.js rename to rainloop/v/0.0.0/app/i18n/moment/ko.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/lt.js b/rainloop/v/0.0.0/app/i18n/moment/lt.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/lt.js rename to rainloop/v/0.0.0/app/i18n/moment/lt.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/lv.js b/rainloop/v/0.0.0/app/i18n/moment/lv.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/lv.js rename to rainloop/v/0.0.0/app/i18n/moment/lv.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/ml.js b/rainloop/v/0.0.0/app/i18n/moment/ml.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/ml.js rename to rainloop/v/0.0.0/app/i18n/moment/ml.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/mr.js b/rainloop/v/0.0.0/app/i18n/moment/mr.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/mr.js rename to rainloop/v/0.0.0/app/i18n/moment/mr.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/ms-my.js b/rainloop/v/0.0.0/app/i18n/moment/ms-my.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/ms-my.js rename to rainloop/v/0.0.0/app/i18n/moment/ms-my.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/nb.js b/rainloop/v/0.0.0/app/i18n/moment/nb.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/nb.js rename to rainloop/v/0.0.0/app/i18n/moment/nb.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/ne.js b/rainloop/v/0.0.0/app/i18n/moment/ne.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/ne.js rename to rainloop/v/0.0.0/app/i18n/moment/ne.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/nl.js b/rainloop/v/0.0.0/app/i18n/moment/nl.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/nl.js rename to rainloop/v/0.0.0/app/i18n/moment/nl.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/nn.js b/rainloop/v/0.0.0/app/i18n/moment/nn.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/nn.js rename to rainloop/v/0.0.0/app/i18n/moment/nn.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/pl.js b/rainloop/v/0.0.0/app/i18n/moment/pl.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/pl.js rename to rainloop/v/0.0.0/app/i18n/moment/pl.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/pt-br.js b/rainloop/v/0.0.0/app/i18n/moment/pt-br.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/pt-br.js rename to rainloop/v/0.0.0/app/i18n/moment/pt-br.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/pt.js b/rainloop/v/0.0.0/app/i18n/moment/pt.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/pt.js rename to rainloop/v/0.0.0/app/i18n/moment/pt.js diff --git a/rainloop/v/0.0.0/app/i18n/moment/readme.md b/rainloop/v/0.0.0/app/i18n/moment/readme.md new file mode 100644 index 000000000..afd38007d --- /dev/null +++ b/rainloop/v/0.0.0/app/i18n/moment/readme.md @@ -0,0 +1,283 @@ +A lightweight javascript date library for parsing, validating, manipulating, and formatting dates. + +# [Documentation](http://momentjs.com/docs/) + +Upgrading to 2.0.0 +================== + +There are a number of small backwards incompatible changes with version 2.0.0. + +[See them and their descriptions here](https://gist.github.com/timrwood/e72f2eef320ed9e37c51#backwards-incompatible-changes) + +Changed language ordinal method to return the number + ordinal instead of just the ordinal. + +Changed two digit year parsing cutoff to match strptime. + +Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`. + +Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`. + +Removed the lang data objects from the top level namespace. + +Duplicate `Date` passed to `moment()` instead of referencing it. + +Travis Build Status +=================== + +Develop [![Build Status](https://travis-ci.org/moment/moment.png?branch=develop)](https://travis-ci.org/moment/moment) + +Master [![Build Status](https://travis-ci.org/moment/moment.png?branch=master)](https://travis-ci.org/moment/moment) + +Changelog +========= + +### 2.3.1 + +Removed a trailing comma [1169] and fixed a bug with `months`, `weekdays` getters [1171]. + +### 2.3.0 [See changelog](https://gist.github.com/ichernev/6864354) + +Changed isValid, added strict parsing. +Week tokens parsing. + +### 2.2.1 + +Fixed bug in string prototype test. +Updated authors and contributors. + +### 2.2.0 [See changelog](https://gist.github.com/ichernev/00f837a9baf46a3565e4) + +Added bower support. + +Language files now use UMD. + +Creating moment defaults to current date/month/year. + +Added a bundle of moment and all language files. + +### 2.1.0 [See changelog](https://gist.github.com/timrwood/b8c2d90d528eddb53ab5) + +Added better week support. + +Added ability to set offset with `moment#zone`. + +Added ability to set month or weekday from a string. + +Added `moment#min` and `moment#max` + +### 2.0.0 [See changelog](https://gist.github.com/timrwood/e72f2eef320ed9e37c51) + +Added short form localized tokens. + +Added ability to define language a string should be parsed in. + +Added support for reversed add/subtract arguments. + +Added support for `endOf('week')` and `startOf('week')`. + +Fixed the logic for `moment#diff(Moment, 'months')` and `moment#diff(Moment, 'years')` + +`moment#diff` now floors instead of rounds. + +Normalized `moment#toString`. + +Added `isSame`, `isAfter`, and `isBefore` methods. + +Added better week support. + +Added `moment#toJSON` + +Bugfix: Fixed parsing of first century dates + +Bugfix: Parsing 10Sep2001 should work as expected + +Bugfix: Fixed wierdness with `moment.utc()` parsing. + +Changed language ordinal method to return the number + ordinal instead of just the ordinal. + +Changed two digit year parsing cutoff to match strptime. + +Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`. + +Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`. + +Removed the lang data objects from the top level namespace. + +Duplicate `Date` passed to `moment()` instead of referencing it. + +### 1.7.2 [See discussion](https://github.com/timrwood/moment/issues/456) + +Bugfixes + +### 1.7.1 [See discussion](https://github.com/timrwood/moment/issues/384) + +Bugfixes + +### 1.7.0 [See discussion](https://github.com/timrwood/moment/issues/288) + +Added `moment.fn.endOf()` and `moment.fn.startOf()`. + +Added validation via `moment.fn.isValid()`. + +Made formatting method 3x faster. http://jsperf.com/momentjs-cached-format-functions + +Add support for month/weekday callbacks in `moment.fn.format()` + +Added instance specific languages. + +Added two letter weekday abbreviations with the formatting token `dd`. + +Various language updates. + +Various bugfixes. + +### 1.6.0 [See discussion](https://github.com/timrwood/moment/pull/268) + +Added Durations. + +Revamped parser to support parsing non-separated strings (YYYYMMDD vs YYYY-MM-DD). + +Added support for millisecond parsing and formatting tokens (S SS SSS) + +Added a getter for `moment.lang()` + +Various bugfixes. + +There are a few things deprecated in the 1.6.0 release. + +1. The format tokens `z` and `zz` (timezone abbreviations like EST CST MST etc) will no longer be supported. Due to inconsistent browser support, we are unable to consistently produce this value. See [this issue](https://github.com/timrwood/moment/issues/162) for more background. + +2. The method `moment.fn.native` is deprecated in favor of `moment.fn.toDate`. There continue to be issues with Google Closure Compiler throwing errors when using `native`, even in valid instances. + +3. The way to customize am/pm strings is being changed. This would only affect you if you created a custom language file. For more information, see [this issue](https://github.com/timrwood/moment/pull/222). + +### 1.5.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=10&page=1&state=closed) + +Added UTC mode. + +Added automatic ISO8601 parsing. + +Various bugfixes. + +### 1.4.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=8&state=closed) + +Added `moment.fn.toDate` as a replacement for `moment.fn.native`. + +Added `moment.fn.sod` and `moment.fn.eod` to get the start and end of day. + +Various bugfixes. + +### 1.3.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=7&state=closed) + +Added support for parsing month names in the current language. + +Added escape blocks for parsing tokens. + +Added `moment.fn.calendar` to format strings like 'Today 2:30 PM', 'Tomorrow 1:25 AM', and 'Last Sunday 4:30 AM'. + +Added `moment.fn.day` as a setter. + +Various bugfixes + +### 1.2.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=4&state=closed) + +Added timezones to parser and formatter. + +Added `moment.fn.isDST`. + +Added `moment.fn.zone` to get the timezone offset in minutes. + +### 1.1.2 [See milestone](https://github.com/timrwood/moment/issues?milestone=6&state=closed) + +Various bugfixes + +### 1.1.1 [See milestone](https://github.com/timrwood/moment/issues?milestone=5&state=closed) + +Added time specific diffs (months, days, hours, etc) + +### 1.1.0 + +Added `moment.fn.format` localized masks. 'L LL LLL LLLL' [issue 29](https://github.com/timrwood/moment/pull/29) + +Fixed [issue 31](https://github.com/timrwood/moment/pull/31). + +### 1.0.1 + +Added `moment.version` to get the current version. + +Removed `window !== undefined` when checking if module exists to support browserify. [issue 25](https://github.com/timrwood/moment/pull/25) + +### 1.0.0 + +Added convenience methods for getting and setting date parts. + +Added better support for `moment.add()`. + +Added better lang support in NodeJS. + +Renamed library from underscore.date to Moment.js + +### 0.6.1 + +Added Portuguese, Italian, and French language support + +### 0.6.0 + +Added _date.lang() support. +Added support for passing multiple formats to try to parse a date. _date("07-10-1986", ["MM-DD-YYYY", "YYYY-MM-DD"]); +Made parse from string and single format 25% faster. + +### 0.5.2 + +Bugfix for [issue 8](https://github.com/timrwood/underscore.date/pull/8) and [issue 9](https://github.com/timrwood/underscore.date/pull/9). + +### 0.5.1 + +Bugfix for [issue 5](https://github.com/timrwood/underscore.date/pull/5). + +### 0.5.0 + +Dropped the redundant `_date.date()` in favor of `_date()`. +Removed `_date.now()`, as it is a duplicate of `_date()` with no parameters. +Removed `_date.isLeapYear(yearNumber)`. Use `_date([yearNumber]).isLeapYear()` instead. +Exposed customization options through the `_date.relativeTime`, `_date.weekdays`, `_date.weekdaysShort`, `_date.months`, `_date.monthsShort`, and `_date.ordinal` variables instead of the `_date.customize()` function. + +### 0.4.1 + +Added date input formats for input strings. + +### 0.4.0 + +Added underscore.date to npm. Removed dependencies on underscore. + +### 0.3.2 + +Added `'z'` and `'zz'` to `_.date().format()`. Cleaned up some redundant code to trim off some bytes. + +### 0.3.1 + +Cleaned up the namespace. Moved all date manipulation and display functions to the _.date() object. + +### 0.3.0 + +Switched to the Underscore methodology of not mucking with the native objects' prototypes. +Made chaining possible. + +### 0.2.1 + +Changed date names to be a more pseudo standardized 'dddd, MMMM Do YYYY, h:mm:ss a'. +Added `Date.prototype` functions `add`, `subtract`, `isdst`, and `isleapyear`. + +### 0.2.0 + +Changed function names to be more concise. +Changed date format from php date format to custom format. + +### 0.1.0 + +Initial release + +License +======= + +Moment.js is freely distributable under the terms of the MIT license. diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/ro.js b/rainloop/v/0.0.0/app/i18n/moment/ro.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/ro.js rename to rainloop/v/0.0.0/app/i18n/moment/ro.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/ru.js b/rainloop/v/0.0.0/app/i18n/moment/ru.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/ru.js rename to rainloop/v/0.0.0/app/i18n/moment/ru.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/sk.js b/rainloop/v/0.0.0/app/i18n/moment/sk.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/sk.js rename to rainloop/v/0.0.0/app/i18n/moment/sk.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/sl.js b/rainloop/v/0.0.0/app/i18n/moment/sl.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/sl.js rename to rainloop/v/0.0.0/app/i18n/moment/sl.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/sq.js b/rainloop/v/0.0.0/app/i18n/moment/sq.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/sq.js rename to rainloop/v/0.0.0/app/i18n/moment/sq.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/sv.js b/rainloop/v/0.0.0/app/i18n/moment/sv.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/sv.js rename to rainloop/v/0.0.0/app/i18n/moment/sv.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/th.js b/rainloop/v/0.0.0/app/i18n/moment/th.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/th.js rename to rainloop/v/0.0.0/app/i18n/moment/th.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/tr.js b/rainloop/v/0.0.0/app/i18n/moment/tr.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/tr.js rename to rainloop/v/0.0.0/app/i18n/moment/tr.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/tzm-la.js b/rainloop/v/0.0.0/app/i18n/moment/tzm-la.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/tzm-la.js rename to rainloop/v/0.0.0/app/i18n/moment/tzm-la.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/tzm.js b/rainloop/v/0.0.0/app/i18n/moment/tzm.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/tzm.js rename to rainloop/v/0.0.0/app/i18n/moment/tzm.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/uk.js b/rainloop/v/0.0.0/app/i18n/moment/uk.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/uk.js rename to rainloop/v/0.0.0/app/i18n/moment/uk.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/uz.js b/rainloop/v/0.0.0/app/i18n/moment/uz.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/uz.js rename to rainloop/v/0.0.0/app/i18n/moment/uz.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/vn.js b/rainloop/v/0.0.0/app/i18n/moment/vn.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/vn.js rename to rainloop/v/0.0.0/app/i18n/moment/vn.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/zh-cn.js b/rainloop/v/0.0.0/app/i18n/moment/zh-cn.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/zh-cn.js rename to rainloop/v/0.0.0/app/i18n/moment/zh-cn.js diff --git a/rainloop/v/1.3.10.492/app/i18n/moment/zh-tw.js b/rainloop/v/0.0.0/app/i18n/moment/zh-tw.js similarity index 100% rename from rainloop/v/1.3.10.492/app/i18n/moment/zh-tw.js rename to rainloop/v/0.0.0/app/i18n/moment/zh-tw.js diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Collection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Collection.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Collection.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/Collection.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Crypt.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Crypt.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Crypt.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/Crypt.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/DateTimeHelper.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/DateTimeHelper.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/DateTimeHelper.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/DateTimeHelper.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Enumerations/Charset.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Enumerations/Charset.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Enumerations/Charset.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/Enumerations/Charset.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Enumerations/Encoding.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Enumerations/Encoding.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Enumerations/Encoding.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/Enumerations/Encoding.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Exceptions/Exception.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Exceptions/Exception.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Exceptions/Exception.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/Exceptions/Exception.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/Exceptions/InvalidArgumentException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/HtmlUtils.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/HtmlUtils.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Http.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Http.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/LinkFinder.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/LinkFinder.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/LinkFinder.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/LinkFinder.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Loader.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Loader.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Loader.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/Loader.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/ResourceRegistry.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/ResourceRegistry.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/ResourceRegistry.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/ResourceRegistry.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/StreamWrappers/Binary.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/Binary.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/StreamWrappers/Binary.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/Binary.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/StreamWrappers/Literal.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/Literal.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/StreamWrappers/Literal.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/Literal.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/SubStreams.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/StreamWrappers/Test.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/Test.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/StreamWrappers/Test.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/StreamWrappers/Test.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Utils.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Utils.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Validator.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Validator.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Base/Validator.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Base/Validator.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Cache/CacheClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Cache/CacheClient.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Cache/CacheClient.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Cache/CacheClient.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Cache/DriverInterface.php b/rainloop/v/0.0.0/app/libraries/MailSo/Cache/DriverInterface.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Cache/DriverInterface.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Cache/DriverInterface.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Cache/Drivers/APC.php b/rainloop/v/0.0.0/app/libraries/MailSo/Cache/Drivers/APC.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Cache/Drivers/APC.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Cache/Drivers/APC.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Cache/Drivers/File.php b/rainloop/v/0.0.0/app/libraries/MailSo/Cache/Drivers/File.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Cache/Drivers/File.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Cache/Drivers/File.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Cache/Drivers/Memcache.php b/rainloop/v/0.0.0/app/libraries/MailSo/Cache/Drivers/Memcache.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Cache/Drivers/Memcache.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Cache/Drivers/Memcache.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/BodyStructure.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/BodyStructure.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/BodyStructure.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/BodyStructure.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/FetchType.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/FetchType.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/FetchType.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/FetchType.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/FolderResponseStatus.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/FolderResponseStatus.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/FolderResponseStatus.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/FolderResponseStatus.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/FolderStatus.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/FolderStatus.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/FolderStatus.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/FolderStatus.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/FolderType.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/FolderType.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/FolderType.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/FolderType.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/MessageFlag.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/MessageFlag.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/MessageFlag.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/MessageFlag.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/ResponseStatus.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/ResponseStatus.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/ResponseStatus.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/ResponseStatus.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/ResponseType.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/ResponseType.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/ResponseType.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/ResponseType.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/StoreAction.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/StoreAction.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Enumerations/StoreAction.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Enumerations/StoreAction.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/Exception.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/Exception.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/Exception.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/Exception.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/InvalidResponseException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/InvalidResponseException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/InvalidResponseException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/InvalidResponseException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/LoginBadCredentialsException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/LoginBadCredentialsException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/LoginBadCredentialsException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/LoginBadCredentialsException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/LoginBadMethodException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/LoginBadMethodException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/LoginBadMethodException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/LoginBadMethodException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/LoginException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/LoginException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/LoginException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/LoginException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/NegativeResponseException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/NegativeResponseException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/NegativeResponseException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/NegativeResponseException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/ResponseException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/ResponseException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/ResponseException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/ResponseException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/ResponseNotFoundException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/RuntimeException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/RuntimeException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Exceptions/RuntimeException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Exceptions/RuntimeException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/FetchResponse.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/FetchResponse.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/FetchResponse.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/FetchResponse.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Folder.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Folder.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Folder.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Folder.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/FolderInformation.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/FolderInformation.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/FolderInformation.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/FolderInformation.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/ImapClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php similarity index 96% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/ImapClient.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php index 9eb843950..3f7efd830 100644 --- a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/ImapClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php @@ -995,10 +995,21 @@ class ImapClient extends \MailSo\Net\NetClient foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType - && $sCmd === $oImapResponse->StatusOrIndex - && is_array($oImapResponse->ResponseList) && 2 < count($oImapResponse->ResponseList)) + && ($sCmd === $oImapResponse->StatusOrIndex || + ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex) && !empty($oImapResponse->ResponseList[2]) && + $sCmd === $oImapResponse->ResponseList[2]) + && is_array($oImapResponse->ResponseList) + && 2 < count($oImapResponse->ResponseList)) { - for ($iIndex = 2, $iLen = count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) + $iStart = 2; + if ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex && + !empty($oImapResponse->ResponseList[2]) && + $sCmd === $oImapResponse->ResponseList[2]) + { + $iStart = 3; + } + + for ($iIndex = $iStart, $iLen = count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) { $aReturn[] = (int) $oImapResponse->ResponseList[$iIndex]; } @@ -1045,10 +1056,21 @@ class ImapClient extends \MailSo\Net\NetClient foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType - && $sCmd === $oImapResponse->StatusOrIndex - && is_array($oImapResponse->ResponseList) && 2 < count($oImapResponse->ResponseList)) + && ($sCmd === $oImapResponse->StatusOrIndex || + ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex) && !empty($oImapResponse->ResponseList[2]) && + $sCmd === $oImapResponse->ResponseList[2]) + && is_array($oImapResponse->ResponseList) + && 2 < count($oImapResponse->ResponseList)) { - for ($iIndex = 2, $iLen = count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) + $iStart = 2; + if ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex && + !empty($oImapResponse->ResponseList[2]) && + $sCmd === $oImapResponse->ResponseList[2]) + { + $iStart = 3; + } + + for ($iIndex = $iStart, $iLen = count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) { $aReturn[] = (int) $oImapResponse->ResponseList[$iIndex]; } @@ -1142,12 +1164,23 @@ class ImapClient extends \MailSo\Net\NetClient foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oImapResponse->ResponseType - && $sCmd === $oImapResponse->StatusOrIndex - && is_array($oImapResponse->ResponseList) && 2 < count($oImapResponse->ResponseList)) + && ($sCmd === $oImapResponse->StatusOrIndex || + ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex) && !empty($oImapResponse->ResponseList[2]) && + $sCmd === $oImapResponse->ResponseList[2]) + && is_array($oImapResponse->ResponseList) + && 2 < count($oImapResponse->ResponseList)) { - for ($iI = 2, $iC = count($oImapResponse->ResponseList); $iI < $iC; $iI++) + $iStart = 2; + if ($bReturnUid && 'UID' === $oImapResponse->StatusOrIndex && + !empty($oImapResponse->ResponseList[2]) && + $sCmd === $oImapResponse->ResponseList[2]) { - $aNewValue = $this->validateThreadItem($oImapResponse->ResponseList[$iI]); + $iStart = 3; + } + + for ($iIndex = $iStart, $iLen = count($oImapResponse->ResponseList); $iIndex < $iLen; $iIndex++) + { + $aNewValue = $this->validateThreadItem($oImapResponse->ResponseList[$iIndex]); if (false !== $aNewValue) { $aReturn[] = $aNewValue; diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/NamespaceResult.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/NamespaceResult.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/NamespaceResult.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/NamespaceResult.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Response.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/Response.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/Response.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/Response.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/SearchBuilder.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/SearchBuilder.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Imap/SearchBuilder.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Imap/SearchBuilder.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Driver.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Driver.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Driver.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Log/Driver.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Drivers/Callback.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/Callback.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Drivers/Callback.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/Callback.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Drivers/File.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/File.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Drivers/File.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/File.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Drivers/Inline.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/Inline.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Drivers/Inline.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Log/Drivers/Inline.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Enumerations/Type.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Enumerations/Type.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Enumerations/Type.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Log/Enumerations/Type.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Logger.php b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php similarity index 83% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Logger.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php index 24a924545..cdb01ce8e 100644 --- a/rainloop/v/1.3.10.492/app/libraries/MailSo/Log/Logger.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Log/Logger.php @@ -211,4 +211,35 @@ class Logger extends \MailSo\Base\Collection return false; } + + /** + * @param \Exception $oException + * @param int $iDescType = \MailSo\Log\Enumerations\Type::NOTICE + * @param string $sName = '' + * @param bool $bSearchSecretWords = true + * + * @return bool + */ + public function WriteMixed($mData, $iDescType = null, $sName = '', $bSearchSecretWords = true) + { + $iType = null === $iDescType ? \MailSo\Log\Enumerations\Type::INFO : $iType; + if (\is_array($mData) || \is_object($mData)) + { + if ($mData instanceof \Exception) + { + $iType = null === $iDescType ? \MailSo\Log\Enumerations\Type::NOTICE : $iType; + return $this->WriteException($mData, $iType, $sName, $bSearchSecretWords); + } + else + { + return $this->WriteDump($mData, $iType, $sName, $bSearchSecretWords); + } + } + else + { + return $this->Write($mData, $iType, $sName, $bSearchSecretWords); + } + + return false; + } } diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/Attachment.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Attachment.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/Attachment.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mail/Attachment.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/AttachmentCollection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/AttachmentCollection.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/AttachmentCollection.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mail/AttachmentCollection.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/Exceptions/Exception.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Exceptions/Exception.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/Exceptions/Exception.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mail/Exceptions/Exception.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/Exceptions/NonEmptyFolder.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Exceptions/NonEmptyFolder.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/Exceptions/NonEmptyFolder.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mail/Exceptions/NonEmptyFolder.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/Exceptions/RuntimeException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Exceptions/RuntimeException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/Exceptions/RuntimeException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mail/Exceptions/RuntimeException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/Folder.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Folder.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/Folder.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mail/Folder.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/FolderCollection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/FolderCollection.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/FolderCollection.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mail/FolderCollection.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/MailClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php similarity index 96% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/MailClient.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index b274fb8fc..44674b49f 100644 --- a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/MailClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -1771,6 +1771,20 @@ class MailClient return $this; } + /** + * @param string $sPrevFolderFullNameRaw + * @param string $sNextFolderFullNameInUtf + * @param bool $bSubscribeOnMove = true + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function FolderMove($sPrevFolderFullNameRaw, $sNextFolderFullNameInUtf, $bSubscribeOnRename = true) + { + return $this->folderModify($sPrevFolderFullNameRaw, $sNextFolderFullNameInUtf, false, $bSubscribeOnRename); + } + /** * @param string $sPrevFolderFullNameRaw * @param string $sNewTopFolderNameInUtf @@ -1782,7 +1796,22 @@ class MailClient */ public function FolderRename($sPrevFolderFullNameRaw, $sNewTopFolderNameInUtf, $bSubscribeOnRename = true) { - if (0 === \strlen($sPrevFolderFullNameRaw) || 0 === \strlen($sNewTopFolderNameInUtf)) + return $this->folderModify($sPrevFolderFullNameRaw, $sNewTopFolderNameInUtf, true, $bSubscribeOnRename); + } + + /** + * @param string $sPrevFolderFullNameRaw + * @param string $sNextFolderNameInUtf + * @param bool $bRenameOrMove + * @param bool $bSubscribeOnModify + * + * @return \MailSo\Mail\MailClient + * + * @throws \MailSo\Base\Exceptions\InvalidArgumentException + */ + public function folderModify($sPrevFolderFullNameRaw, $sNextFolderNameInUtf, $bRenameOrMove, $bSubscribeOnModify) + { + if (0 === \strlen($sPrevFolderFullNameRaw) || 0 === \strlen($sNextFolderNameInUtf)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } @@ -1796,10 +1825,9 @@ class MailClient $sDelimiter = $aFolders[0]->Delimiter(); $iLast = \strrpos($sPrevFolderFullNameRaw, $sDelimiter); - $sFolderParentFullNameRaw = false === $iLast ? '' : \substr($sPrevFolderFullNameRaw, 0, $iLast + 1); $mSubscribeFolders = null; - if ($bSubscribeOnRename) + if ($bSubscribeOnModify) { $mSubscribeFolders = $this->oImapClient->FolderSubscribeList($sPrevFolderFullNameRaw, '*'); if (\is_array($mSubscribeFolders) && 0 < count($mSubscribeFolders)) @@ -1811,18 +1839,22 @@ class MailClient } } - $sNewFolderFullNameRaw = \MailSo\Base\Utils::ConvertEncoding($sNewTopFolderNameInUtf, - \MailSo\Base\Enumerations\Charset::UTF_8, - \MailSo\Base\Enumerations\Charset::UTF_7_IMAP); + $sNewFolderFullNameRaw = \MailSo\Base\Utils::ConvertEncoding($sNextFolderNameInUtf, + \MailSo\Base\Enumerations\Charset::UTF_8, + \MailSo\Base\Enumerations\Charset::UTF_7_IMAP); - if (0 < \strlen($sDelimiter) && false !== \strpos($sNewFolderFullNameRaw, $sDelimiter)) - { - // TODO - throw new \MailSo\Mail\Exceptions\RuntimeException( - 'New folder name contain delimiter'); - } + if($bRenameOrMove) + { + if (0 < \strlen($sDelimiter) && false !== \strpos($sNewFolderFullNameRaw, $sDelimiter)) + { + // TODO + throw new \MailSo\Mail\Exceptions\RuntimeException( + 'New folder name contain delimiter'); + } - $sNewFolderFullNameRaw = $sFolderParentFullNameRaw.$sNewFolderFullNameRaw; + $sFolderParentFullNameRaw = false === $iLast ? '' : \substr($sPrevFolderFullNameRaw, 0, $iLast + 1); + $sNewFolderFullNameRaw = $sFolderParentFullNameRaw.$sNewFolderFullNameRaw; + } $this->oImapClient->FolderRename($sPrevFolderFullNameRaw, $sNewFolderFullNameRaw); @@ -1842,7 +1874,7 @@ class MailClient } return $this; - } + } /** * @param string $sFolderFullNameRaw diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/Message.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/Message.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/Message.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mail/Message.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/MessageCollection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MessageCollection.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mail/MessageCollection.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mail/MessageCollection.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/MailSo.php b/rainloop/v/0.0.0/app/libraries/MailSo/MailSo.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/MailSo.php rename to rainloop/v/0.0.0/app/libraries/MailSo/MailSo.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Attachment.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Attachment.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Attachment.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Attachment.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/AttachmentCollection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/AttachmentCollection.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/AttachmentCollection.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/AttachmentCollection.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Email.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Email.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/EmailCollection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/EmailCollection.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/EmailCollection.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/EmailCollection.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Enumerations/Constants.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/Constants.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Enumerations/Constants.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/Constants.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Enumerations/Header.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/Header.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Enumerations/Header.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/Header.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Enumerations/MessagePriority.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/MessagePriority.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Enumerations/MessagePriority.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/MessagePriority.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Enumerations/MimeType.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/MimeType.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Enumerations/MimeType.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/MimeType.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Enumerations/Parameter.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/Parameter.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Enumerations/Parameter.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/Parameter.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Enumerations/Sensitivity.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/Sensitivity.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Enumerations/Sensitivity.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Enumerations/Sensitivity.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Header.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Header.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Header.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Header.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/HeaderCollection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/HeaderCollection.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/HeaderCollection.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/HeaderCollection.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Message.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Message.php similarity index 90% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Message.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Message.php index 004e58f71..cefa3aa0f 100644 --- a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Message.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Message.php @@ -24,19 +24,14 @@ class Message private $oAttachmentCollection; /** - * @var string + * @var bool */ - private $sMessageId; - - /** - * @var string - */ - private $sCustomXMailer; + private $bAddEmptyTextPart; /** * @var bool */ - private $bNeedRewind; + private $bAddDefaultXMailer; /** * @access private @@ -46,10 +41,8 @@ class Message $this->aHeadersValue = array(); $this->aAlternativeParts = array(); $this->oAttachmentCollection = AttachmentCollection::NewInstance(); - $this->sMessageId = ''; - $this->sCustomXMailer = ''; $this->bAddEmptyTextPart = true; - $this->bNeedRewind = false; + $this->bAddDefaultXMailer = true; } /** @@ -61,11 +54,23 @@ class Message } /** - * @return void + * @return \MailSo\Mime\Message */ public function DoesNotCreateEmptyTextPart() { $this->bAddEmptyTextPart = false; + + return $this; + } + + /** + * @return \MailSo\Mime\Message + */ + public function DoesNotAddDefaultXMailer() + { + $this->bAddDefaultXMailer = false; + + return $this; } /** @@ -83,7 +88,7 @@ class Message */ public function SetMessageId($sMessageId) { - $this->sMessageId = $sMessageId; + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID] = $sMessageId; } /** @@ -104,6 +109,22 @@ class Message return $this->oAttachmentCollection; } + /** + * @return \MailSo\Mime\Email|null + */ + public function GetFrom() + { + $oResult = null; + + if (isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_]) && + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_] instanceof \MailSo\Mime\Email) + { + $oResult = $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::FROM_]; + } + + return $oResult; + } + /** * @return \MailSo\Mime\EmailCollection */ @@ -279,7 +300,7 @@ class Message */ public function SetXMailer($sXMailer) { - $this->sCustomXMailer = $sXMailer; + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_MAILER] = $sXMailer; return $this; } @@ -307,6 +328,18 @@ class Message return $this; } + + /** + * @param $iDateTime $iDateTime + * + * @return \MailSo\Mime\Message + */ + public function SetDate($iDateTime) + { + $this->aHeadersValue[\MailSo\Mime\Enumerations\Header::DATE] = gmdate('r', $iDateTime); + + return $this; + } /** * @param \MailSo\Mime\EmailCollection $oEmails @@ -754,16 +787,25 @@ class Message */ private function setDefaultHeaders($oIncPart, $bWithoutBcc = false) { - $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::DATE, \gmdate('r'), true); - if (0 < \strlen($this->sMessageId)) + if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::DATE])) { - $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::MESSAGE_ID, $this->sMessageId, true); + $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::DATE, \gmdate('r'), true); } - $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::X_MAILER, - 0 === \strlen($this->sCustomXMailer) ? \MailSo\Version::XMailer() : $this->sCustomXMailer, true); + if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MESSAGE_ID])) + { + $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::MESSAGE_ID, $this->generateNewMessageId(), true); + } - $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::MIME_VERSION, '1.0', true); + if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::X_MAILER]) && $this->bAddDefaultXMailer) + { + $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::X_MAILER, \MailSo\Version::XMailer(), true); + } + + if (!isset($this->aHeadersValue[\MailSo\Mime\Enumerations\Header::MIME_VERSION])) + { + $oIncPart->Headers->SetByName(\MailSo\Mime\Enumerations\Header::MIME_VERSION, '1.0', true); + } foreach ($this->aHeadersValue as $sName => $mValue) { @@ -787,22 +829,16 @@ class Message /** * @param bool $bWithoutBcc = false - * @param bool $bRewind = false * * @return \MailSo\Mime\Part */ - public function ToPart($bWithoutBcc = false, $bRewind = false) + public function ToPart($bWithoutBcc = false) { $oPart = $this->createNewMessageSimpleOrAlternativeBody(); $oPart = $this->createNewMessageRelatedBody($oPart); $oPart = $this->createNewMessageMixedBody($oPart); $oPart = $this->setDefaultHeaders($oPart, $bWithoutBcc); - if ($bRewind) - { - $oPart->Rewind(); - } - return $oPart; } @@ -813,10 +849,7 @@ class Message */ public function ToStream($bWithoutBcc = false) { - $bNeedRewind = $this->bNeedRewind; - - $this->bNeedRewind = true; - return $this->ToPart($bWithoutBcc, $bNeedRewind)->ToStream(); + return $this->ToPart($bWithoutBcc)->ToStream(); } /** diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Parameter.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Parameter.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Parameter.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Parameter.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/ParameterCollection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/ParameterCollection.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/ParameterCollection.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/ParameterCollection.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Parser/ParserEmpty.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Parser/ParserEmpty.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Parser/ParserEmpty.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Parser/ParserEmpty.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Parser/ParserInterface.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Parser/ParserInterface.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Parser/ParserInterface.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Parser/ParserInterface.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Parser/ParserMemory.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Parser/ParserMemory.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Parser/ParserMemory.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Parser/ParserMemory.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Part.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Part.php similarity index 98% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Part.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/Part.php index 79a806faa..556f38466 100644 --- a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/Part.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Part.php @@ -93,21 +93,6 @@ class Part return $this; } - - /** - * @return \MailSo\Mime\Part - */ - public function Rewind() - { - if (\is_resource($this->Body)) - { - \rewind($this->Body); - } - - $this->SubParts->Rewind(); - - return $this; - } /** * @return string diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/PartCollection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/PartCollection.php similarity index 80% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/PartCollection.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Mime/PartCollection.php index ef710ef44..910aab997 100644 --- a/rainloop/v/1.3.10.492/app/libraries/MailSo/Mime/PartCollection.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/PartCollection.php @@ -53,18 +53,4 @@ class PartCollection extends \MailSo\Base\Collection return $rResult; } - - /** - * @return \MailSo\Mime\PartCollection - */ - public function Rewind() - { - $aParts =& $this->GetAsArray(); - foreach ($aParts as /* @var $oPart \MailSo\Mime\Part */ &$oPart) - { - $oPart->Rewind(); - } - - return $this; - } } diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/Enumerations/ConnectionSecurityType.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/ConnectionException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/ConnectionException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/ConnectionException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/ConnectionException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/Exception.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/Exception.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/Exception.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/Exception.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/InvalidArgumentException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/InvalidArgumentException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/InvalidArgumentException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/InvalidArgumentException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketAlreadyConnectedException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketAlreadyConnectedException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketAlreadyConnectedException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketAlreadyConnectedException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketCanNotConnectToHostException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketCanNotConnectToHostException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketCanNotConnectToHostException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketCanNotConnectToHostException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketConnectionDoesNotAvailableException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketReadException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketReadException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketReadException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketReadException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketReadTimeoutException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketReadTimeoutException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketReadTimeoutException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketReadTimeoutException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketUnreadBufferException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketUnreadBufferException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketUnreadBufferException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketUnreadBufferException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketUnsuppoterdSecureConnectionException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketUnsuppoterdSecureConnectionException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketUnsuppoterdSecureConnectionException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketUnsuppoterdSecureConnectionException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketWriteException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketWriteException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/Exceptions/SocketWriteException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/Exceptions/SocketWriteException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Net/NetClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Net/NetClient.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Net/NetClient.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Net/NetClient.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Pop3/Exceptions/Exception.php b/rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/Exception.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Pop3/Exceptions/Exception.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/Exception.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Pop3/Exceptions/LoginBadCredentialsException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/LoginBadCredentialsException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Pop3/Exceptions/LoginBadCredentialsException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/LoginBadCredentialsException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Pop3/Exceptions/NegativeResponseException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/NegativeResponseException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Pop3/Exceptions/NegativeResponseException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/NegativeResponseException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Pop3/Exceptions/ResponseException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/ResponseException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Pop3/Exceptions/ResponseException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/ResponseException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Exceptions/RuntimeException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Pop3/Pop3Client.php b/rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Pop3Client.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Pop3/Pop3Client.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Pop3/Pop3Client.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Poppassd/Exceptions/Exception.php b/rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/Exceptions/Exception.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Poppassd/Exceptions/Exception.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/Exceptions/Exception.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Poppassd/Exceptions/LoginBadCredentialsException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/Exceptions/LoginBadCredentialsException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Poppassd/Exceptions/LoginBadCredentialsException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/Exceptions/LoginBadCredentialsException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Poppassd/Exceptions/NegativeResponseException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/Exceptions/NegativeResponseException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Poppassd/Exceptions/NegativeResponseException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/Exceptions/NegativeResponseException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Poppassd/Exceptions/ResponseException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/Exceptions/ResponseException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Poppassd/Exceptions/ResponseException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/Exceptions/ResponseException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/Exceptions/RuntimeException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Poppassd/PoppassdClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/PoppassdClient.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Poppassd/PoppassdClient.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Poppassd/PoppassdClient.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/Exception.php b/rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/Exception.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/Exception.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/Exception.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/LoginBadCredentialsException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/LoginBadCredentialsException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/LoginBadCredentialsException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/LoginBadCredentialsException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/LoginBadMethodException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/LoginBadMethodException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/LoginBadMethodException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/LoginBadMethodException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/LoginException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/LoginException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/LoginException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/LoginException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/NegativeResponseException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/NegativeResponseException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/NegativeResponseException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/NegativeResponseException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/ResponseException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/ResponseException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/ResponseException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/ResponseException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Sieve/Exceptions/RuntimeException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/ManageSieveClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Sieve/ManageSieveClient.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Sieve/ManageSieveClient.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Sieve/ManageSieveClient.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/Exception.php b/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/Exception.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/Exception.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/Exception.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/LoginBadCredentialsException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/LoginBadCredentialsException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/LoginBadCredentialsException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/LoginBadCredentialsException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/LoginBadMethodException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/LoginBadMethodException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/LoginBadMethodException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/LoginBadMethodException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/LoginException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/LoginException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/LoginException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/LoginException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/NegativeResponseException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/NegativeResponseException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/NegativeResponseException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/NegativeResponseException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/ResponseException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/ResponseException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/ResponseException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/ResponseException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php b/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Smtp/Exceptions/RuntimeException.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/SmtpClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/SmtpClient.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Smtp/SmtpClient.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Smtp/SmtpClient.php diff --git a/rainloop/v/1.3.10.492/app/libraries/MailSo/Version.php b/rainloop/v/0.0.0/app/libraries/MailSo/Version.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/MailSo/Version.php rename to rainloop/v/0.0.0/app/libraries/MailSo/Version.php diff --git a/rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/Client.php b/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/Client.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/Client.php rename to rainloop/v/0.0.0/app/libraries/PHP-OAuth2/Client.php diff --git a/rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php b/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php rename to rainloop/v/0.0.0/app/libraries/PHP-OAuth2/GrantType/AuthorizationCode.php diff --git a/rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/GrantType/ClientCredentials.php b/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/GrantType/ClientCredentials.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/GrantType/ClientCredentials.php rename to rainloop/v/0.0.0/app/libraries/PHP-OAuth2/GrantType/ClientCredentials.php diff --git a/rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/GrantType/IGrantType.php b/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/GrantType/IGrantType.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/GrantType/IGrantType.php rename to rainloop/v/0.0.0/app/libraries/PHP-OAuth2/GrantType/IGrantType.php diff --git a/rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/GrantType/Password.php b/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/GrantType/Password.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/GrantType/Password.php rename to rainloop/v/0.0.0/app/libraries/PHP-OAuth2/GrantType/Password.php diff --git a/rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/GrantType/RefreshToken.php b/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/GrantType/RefreshToken.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/GrantType/RefreshToken.php rename to rainloop/v/0.0.0/app/libraries/PHP-OAuth2/GrantType/RefreshToken.php diff --git a/rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/README b/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/README similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/PHP-OAuth2/README rename to rainloop/v/0.0.0/app/libraries/PHP-OAuth2/README diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Account.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Account.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Account.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Account.php diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php similarity index 95% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Actions.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 851628e23..f4b59c142 100644 --- a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -2,9 +2,8 @@ namespace RainLoop; -use RainLoop\Providers\Storage\Enumerations\StorageType; -use RainLoop\Providers\Storage\Enumerations\UploadError; -use RainLoop\Providers\Storage\Enumerations\UploadClientError; +use RainLoop\Enumerations\UploadError; +use RainLoop\Enumerations\UploadClientError; define('RL_CONTACTS_PER_PAGE', 30); define('RL_CONTACTS_MAX', 300); @@ -52,16 +51,16 @@ class Actions */ private $oCacher; - /** - * @var \MailSo\Cache\CacheClient - */ - private $oCacherFile; - /** * @var \RainLoop\Providers\Storage */ private $oStorageProvider; + /** + * @var \RainLoop\Providers\Files + */ + private $oFilesProvider; + /** * @var \RainLoop\Providers\Domain */ @@ -116,9 +115,9 @@ class Actions $this->oSocial = null; $this->oConfig = null; $this->oCacher = null; - $this->oCacherFile = null; $this->oStorageProvider = null; + $this->oFilesProvider = null; $this->oSettingsProvider = null; $this->oDomainProvider = null; $this->oLoginProvider = null; @@ -201,6 +200,10 @@ class Actions { switch ($sName) { + case 'files': + // RainLoop\Providers\Files\FilesInterface + $oResult = new \RainLoop\Providers\Files\DefaultStorage(APP_PRIVATE_DATA.'storage/files'); + break; case 'storage': // RainLoop\Providers\Storage\StorageInterface $oResult = new \RainLoop\Providers\Storage\DefaultStorage(APP_PRIVATE_DATA.'storage'); @@ -483,6 +486,20 @@ class Actions return $this->oStorageProvider; } + /** + * @return \RainLoop\Providers\Files + */ + public function FilesProvider() + { + if (null === $this->oFilesProvider) + { + $this->oFilesProvider = new \RainLoop\Providers\Files( + $this->fabrica('files')); + } + + return $this->oFilesProvider; + } + /** * @return \RainLoop\Providers\Domain */ @@ -622,21 +639,6 @@ class Actions return false === $oFacebook ? null : $oFacebook; } - /** - * @return \MailSo\Cache\CacheClient - */ - public function CacherFile() - { - if (null === $this->oCacherFile) - { - $this->oCacherFile = \MailSo\Cache\CacheClient::NewInstance(); - $this->oCacherFile->SetDriver(\MailSo\Cache\Drivers\File::NewInstance(APP_PRIVATE_DATA.'cache')); - $this->oCacherFile->SetCacheIndex($this->Config()->Get('cache', 'index', '')); - } - - return $this->oCacherFile; - } - /** * @return \MailSo\Cache\CacheClient */ @@ -860,6 +862,7 @@ class Actions 'AuthAccountHash' => '', 'Email' => '', 'Title' => $oConfig->Get('webmail', 'title', ''), + 'LoadingDescription' => $oConfig->Get('webmail', 'loading_description', ''), 'Token' => $oConfig->Get('security', 'csrf_protection', false) ? \RainLoop\Utils::GetCsrfToken() : '', 'InIframe' => (bool) $oConfig->Get('labs', 'in_iframe', false), 'AllowAdminPanel' => (bool) $oConfig->Get('labs', 'allow_admin_panel', true), @@ -967,6 +970,12 @@ class Actions $aResult['DropboxApiKey'] = (string) $oConfig->Get('social', 'dropbox_api_key', ''); $aResult['SubscriptionEnabled'] = \MailSo\Base\Utils::ValidateDomain($aResult['AdminDomain']); + + $aResult['WeakPassword'] = false; + if ($aResult['Auth']) + { + $aResult['WeakPassword'] = $oConfig->ValidatePassword('12345'); + } } $aResult['ProjectHash'] = \md5($aResult['AccountHash'].APP_VERSION.$this->Plugins()->Hash()); @@ -1275,7 +1284,8 @@ class Actions { $sParentEmail = $oAccount->ParentEmailHelper(); - $sAccounts = $this->StorageProvider()->Get(null, \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, + $sAccounts = $this->StorageProvider()->Get(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Webmail/Accounts/'.$sParentEmail.'/Array', null); $aAccounts = $sAccounts ? @\unserialize($sAccounts) : array(); @@ -1644,62 +1654,85 @@ class Actions { \RainLoop\Utils::UpdateConnectionToken(); - $bUserCache = false; $bMainCache = false; + $bFilesCache = false; + $bActivity = false; + $bPing = false; - if ($this->CacherFile()->IsInited()) + $iOneDay1 = 60 * 60 * 23; + $iOneDay2 = 60 * 60 * 25; + + $sTimers = $this->StorageProvider()->Get(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Cache/Timers', ''); + + $aTimers = \explode(',', $sTimers); + + $iMainCacheTime = !empty($aTimers[0]) && \is_numeric($aTimers[0]) ? (int) $aTimers[0] : 0; + $iFilesCacheTime = !empty($aTimers[1]) && \is_numeric($aTimers[1]) ? (int) $aTimers[1] : 0; + $iActivityTime = !empty($aTimers[2]) && \is_numeric($aTimers[2]) ? (int) $aTimers[2] : 0; + $iPingTime = !empty($aTimers[3]) && \is_numeric($aTimers[3]) ? (int) $aTimers[3] : 0; + + if (0 === $iMainCacheTime || $iMainCacheTime + $iOneDay1 < \time()) { - $iTime = $this->CacherFile()->GetTimer('Cache/LastMainCache'); - if (0 === $iTime || $iTime + 60 * 60 * 24 < \time()) - { - if ($this->CacherFile()->SetTimer('Cache/LastMainCache')) - { - $bUserCache = true; - } - } + $bMainCache = true; + $iMainCacheTime = \time(); + } - if ($this->Config()->Get('labs', 'usage_statistics', true)) - { - $iTime = $this->CacherFile()->GetTimer('Statistic/Activity') ; - if (0 === $iTime || $iTime + 60 * 60 * 24 < \time()) - { - if ($this->CacherFile()->SetTimer('Statistic/Activity')) - { - $this->KeenIO('Statistic', array( - 'rainloop' => $this->setupInformation() - )); - } - } - } + if (0 === $iFilesCacheTime || $iFilesCacheTime + $iOneDay2 < \time()) + { + $bFilesCache = true; + $iFilesCacheTime = \time(); + } - $iTime = $this->CacherFile()->GetTimer('Statistic/Ping') ; - if (0 === $iTime || $iTime + 60 * 60 * 24 < \time()) - { - if ($this->CacherFile()->SetTimer('Statistic/Ping')) - { - $this->KeenIO('Ping'); - } - } + if (0 === $iActivityTime || $iActivityTime + $iOneDay1 < \time()) + { + $bActivity = true; + $iActivityTime = \time(); + } - $iTime = $this->CacherFile()->GetTimer('Cache/LastUserCache'); - if (0 === $iTime || $iTime + 60 * 60 * 24 < \time()) + if (0 === $iPingTime || $iPingTime + $iOneDay1 < \time()) + { + $bPing = true; + $iPingTime = \time(); + } + + if ($bMainCache || $bFilesCache || $bActivity || $bPing) + { + if (!$this->StorageProvider()->Put(null, + \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, 'Cache/Timers', + \implode(',', array($iMainCacheTime, $iFilesCacheTime, $iActivityTime, $iPingTime)))) { - if ($this->CacherFile()->SetTimer('Cache/LastUserCache')) - { - $bMainCache = true; - } + $bMainCache = $bFilesCache = $bActivity = $bPing = false; } } - $mData = array( - 'Version' => APP_VERSION, - 'Debug' => !!$this->Config()->Get('debug', 'enable', false), - 'UserCache' => $bUserCache ? $this->StorageProvider()->GC(48) : false, - 'MainCache' => $bMainCache ? $this->CacherFile()->GC(48) : false - ); + if ($bMainCache) + { + $this->Logger()->Write('Cacher GC: Begin'); + $this->Cacher()->GC(48); + $this->Logger()->Write('Cacher GC: End'); + } - $mData = true; - return $this->DefaultResponse(__FUNCTION__, $mData); + if ($bFilesCache) + { + $this->Logger()->Write('Files GC: Begin'); + $this->FilesProvider()->GC(48); + $this->Logger()->Write('Files GC: End'); + } + + if ($bActivity && $this->Config()->Get('labs', 'usage_statistics', true)) + { + $this->KeenIO('Statistic', array( + 'rainloop' => $this->setupInformation() + )); + } + + if ($bPing) + { + $this->KeenIO('Ping'); + } + + return $this->TrueResponse(__FUNCTION__); } /** @@ -1799,6 +1832,8 @@ class Actions */ public function DoAdminSettingsUpdate() { +// return $this->DefaultResponse(__FUNCTION__, false); + $this->IsAdminLoggined(); $oConfig = $this->Config(); @@ -1826,6 +1861,8 @@ class Actions $this->setConfigFromParams($oConfig, 'DetermineUserLanguage', 'labs', 'determine_user_language', 'bool'); $this->setConfigFromParams($oConfig, 'Title', 'webmail', 'title', 'string'); + $this->setConfigFromParams($oConfig, 'LoadingDescription', 'webmail', 'loading_description', 'string'); + $this->setConfigFromParams($oConfig, 'TokenProtection', 'security', 'csrf_protection', 'bool'); $this->setConfigFromParams($oConfig, 'UsageStatistics', 'labs', 'usage_statistics', 'bool'); $this->setConfigFromParams($oConfig, 'EnabledPlugins', 'plugins', 'enable', 'bool'); @@ -2408,11 +2445,18 @@ class Actions $aItem['canBeUpdated'] = $aItem['compare']; $aItem['canBeInstalled'] = true; - if (!$bRainLoopUpdatable && 'plugin' !== $aItem['type']) + if ('plugin' !== $aItem['type']) { - $aItem['canBeInstalled'] = false; - $aItem['canBeUpdated'] = false; - $aItem['compare'] = false; + if (!$bRainLoopUpdatable) + { + $aItem['canBeInstalled'] = false; + $aItem['canBeUpdated'] = false; + $aItem['compare'] = false; + } + else if (APP_VERSION === APP_DEV_VERSION) + { + $aItem['canBeUpdated'] = false; + } } } @@ -2896,7 +2940,8 @@ class Actions if ('' === $oSettings->GetConf('CustomThemeImg', '')) { - $this->StorageProvider()->Clear($oAccount, StorageType::USER, 'CustomThemeBackground'); + $this->StorageProvider()->Clear($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::USER, 'CustomThemeBackground'); } return $this->DefaultResponse(__FUNCTION__, @@ -3500,10 +3545,10 @@ class Actions $sCID = (string) $aData[2]; $sContentLocation = isset($aData[3]) ? (string) $aData[3] : ''; - $rResource = $this->StorageProvider()->GetFile($oAccount, StorageType::TEMP, $sTempName); - if (is_resource($rResource)) + $rResource = $this->FilesProvider()->GetFile($oAccount, $sTempName); + if (\is_resource($rResource)) { - $iFileSize = $this->StorageProvider()->FileSize($oAccount, StorageType::TEMP, $sTempName); + $iFileSize = $this->FilesProvider()->FileSize($oAccount, $sTempName); $oMessage->Attachments()->Add( \MailSo\Mime\Attachment::NewInstance($rResource, $sFileName, $iFileSize, $bIsInline, @@ -3653,13 +3698,16 @@ class Actions { $oSmtpClient = \MailSo\Smtp\SmtpClient::NewInstance()->SetLogger($this->Logger()); + $oFrom = $oMessage->GetFrom(); + $sFrom = $oFrom instanceof \MailSo\Mime\Email ? $oFrom->GetEmail() : ''; + $aSmtpCredentials = array( 'Ehlo' => \function_exists('gethostname') ? \gethostname() : 'localhost', 'Host' => $oAccount->Domain()->OutHost(), 'Port' => $oAccount->Domain()->OutPort(), 'Secure' => $oAccount->Domain()->OutSecure(), 'UseAuth' => $oAccount->Domain()->OutAuth(), - 'From' => $oAccount->Email(), + 'From' => empty($sFrom) ? $oAccount->Email() : $sFrom, 'Login' => $oAccount->Login(), 'Password' => $oAccount->Password(), 'UseShortLogin' => $oAccount->Domain()->OutShortLogin(), @@ -3668,40 +3716,60 @@ class Actions $this->Plugins()->RunHook('filter.smtp-credentials', array($oAccount, &$aSmtpCredentials)); - $oSmtpClient->Connect($aSmtpCredentials['Host'], $aSmtpCredentials['Port'], - $aSmtpCredentials['Ehlo'], $aSmtpCredentials['Secure']); + $bHookConnect = $bHookAuth = $bHookFrom = $bHookFrom = $bHookTo = $bHookData = false; + $this->Plugins()->RunHook('filter.smtp-connect', array($oAccount, $aSmtpCredentials, + &$oSmtpClient, $oMessage, &$oRcpt, + &$bHookConnect, &$bHookAuth, &$bHookFrom, &$bHookTo, &$bHookData)); - if ($aSmtpCredentials['UseAuth']) + if (!$bHookConnect) { - $sLogin = $aSmtpCredentials['Login']; - if ($aSmtpCredentials['UseShortLogin']) + $oSmtpClient->Connect($aSmtpCredentials['Host'], $aSmtpCredentials['Port'], + $aSmtpCredentials['Ehlo'], $aSmtpCredentials['Secure']); + } + + if (!$bHookAuth) + { + if ($aSmtpCredentials['UseAuth']) { - $sLogin = \MailSo\Base\Utils::GetAccountNameFromEmail($sLogin); + $sLogin = $aSmtpCredentials['Login']; + if ($aSmtpCredentials['UseShortLogin']) + { + $sLogin = \MailSo\Base\Utils::GetAccountNameFromEmail($sLogin); + } + + $oSmtpClient->Login($sLogin, $aSmtpCredentials['Password']); + } + } + + if (!$bHookFrom) + { + $oSmtpClient->MailFrom($aSmtpCredentials['From']); + } + + if (!$bHookTo) + { + $aRcpt =& $oRcpt->GetAsArray(); + foreach ($aRcpt as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) + { + $oSmtpClient->Rcpt($oEmail->GetEmail()); } - $oSmtpClient->Login($sLogin, $aSmtpCredentials['Password']); - } - - $oSmtpClient->MailFrom($aSmtpCredentials['From']); - - $aRcpt =& $oRcpt->GetAsArray(); - foreach ($aRcpt as /* @var $oEmail \MailSo\Mime\Email */ $oEmail) - { - $oSmtpClient->Rcpt($oEmail->GetEmail()); - } - - if (isset($aSmtpCredentials['HiddenRcpt']) && is_array($aSmtpCredentials['HiddenRcpt'])) - { - foreach ($aSmtpCredentials['HiddenRcpt'] as $sEmail) + if (isset($aSmtpCredentials['HiddenRcpt']) && is_array($aSmtpCredentials['HiddenRcpt'])) { - if (\preg_match('/^[^@\s]+@[^@\s]+$/', $sEmail)) + foreach ($aSmtpCredentials['HiddenRcpt'] as $sEmail) { - $oSmtpClient->Rcpt($sEmail); + if (\preg_match('/^[^@\s]+@[^@\s]+$/', $sEmail)) + { + $oSmtpClient->Rcpt($sEmail); + } } } } - $oSmtpClient->DataWithStream($rMessageStream); + if (!$bHookData) + { + $oSmtpClient->DataWithStream($rMessageStream); + } $oSmtpClient->LogoutAndDisconnect(); } @@ -3977,7 +4045,8 @@ class Actions \preg_match('/^data:(image\/(jpeg|jpg|png|bmp));base64,(.+)$/i', $sImageData, $aMatches) && !empty($aMatches[1]) && !empty($aMatches[3])) { - $this->StorageProvider()->Put($oAccount, StorageType::USER, + $this->StorageProvider()->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::USER, 'contacts/'.$oContact->ImageHash, $aMatches[1].'|||'.$aMatches[3]); } } @@ -4319,7 +4388,7 @@ class Actions $sMimeIndex = (string) isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''; $sTempName = md5($sAttachment); - if (!$this->StorageProvider()->FileExists($oAccount, StorageType::TEMP, $sTempName)) + if (!$this->FilesProvider()->FileExists($oAccount, $sTempName)) { $this->MailClient()->MessageMimeStream( function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ($oAccount, &$mResult, $sTempName, $sAttachment, $self) { @@ -4328,7 +4397,7 @@ class Actions $sContentType = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); $sFileName = $self->MainClearFileName($sFileName, $sContentType, $sMimeIndex); - if ($self->StorageProvider()->PutFile($oAccount, StorageType::TEMP, $sTempName, $rResource)) + if ($self->FilesProvider()->PutFile($oAccount, $sTempName, $rResource)) { $mResult[$sTempName] = $sAttachment; } @@ -4374,7 +4443,7 @@ class Actions $iCode = 0; $sContentType = ''; - $rFile = $this->StorageProvider()->GetFile($oAccount, StorageType::TEMP, $sTempName, 'wb+'); + $rFile = $this->FilesProvider()->GetFile($oAccount, $sTempName, 'wb+'); if ($rFile && $oHttp->SaveUrlToFile($sUrl, $rFile, '', $sContentType, $iCode, $this->Logger())) { $mResult[$sUrl] = $sTempName; @@ -4525,8 +4594,7 @@ class Actions if (UPLOAD_ERR_OK === $iError) { - if (!$this->StorageProvider()->MoveUploadedFile($oAccount, StorageType::TEMP, - $sSavedName, $_FILES[$sInputName]['tmp_name'])) + if (!$this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $_FILES[$sInputName]['tmp_name'])) { $iError = UploadError::ON_SAVING; } @@ -4601,22 +4669,29 @@ class Actions if (UPLOAD_ERR_OK === $iError) { - if (!$this->StorageProvider()->MoveUploadedFile($oAccount, StorageType::TEMP, - $sSavedName, $_FILES[$sInputName]['tmp_name'])) + if (!$this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $_FILES[$sInputName]['tmp_name'])) { $iError = UploadError::ON_SAVING; } - $mData = $this->StorageProvider()->Get($oAccount, StorageType::TEMP, $sSavedName); - if (!empty($mData)) + $mData = $this->FilesProvider()->GetFile($oAccount, $sSavedName); + if ($mData) { - $this->StorageProvider()->Put($oAccount, StorageType::USER, 'CustomThemeBackground', - 'data:'.$_FILES[$sInputName]['type'].';base64,'.base64_encode($mData) + $this->StorageProvider()->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::USER, 'CustomThemeBackground', + 'data:'.$_FILES[$sInputName]['type'].';base64,'.base64_encode( + \stream_get_contents($mData) + ) ); } + + if (\is_resource($mData)) + { + \fclose($mData); + } unset($mData); - $this->StorageProvider()->Clear($oAccount, StorageType::TEMP, $sSavedName); + $this->FilesProvider()->Clear($oAccount, $sSavedName); $mResponse = $_FILES[$sInputName]['name']; } @@ -4694,12 +4769,11 @@ class Actions { $sSavedName = 'append-post-'.md5($sFolderFullNameRaw.$_FILES['AppendFile']['name'].$_FILES['AppendFile']['tmp_name']); - if ($this->StorageProvider()->MoveUploadedFile($oAccount, - \RainLoop\Providers\Storage\Enumerations\StorageType::TEMP, + if ($this->FilesProvider()->MoveUploadedFile($oAccount, $sSavedName, $_FILES['AppendFile']['tmp_name'])) { - $iMessageStreamSize = $this->StorageProvider()->FileSize($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::TEMP, $sSavedName); - $rMessageStream = $this->StorageProvider()->GetFile($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::TEMP, $sSavedName); + $iMessageStreamSize = $this->FilesProvider()->FileSize($oAccount, $sSavedName); + $rMessageStream = $this->FilesProvider()->GetFile($oAccount, $sSavedName); $this->MailClient()->MessageAppendStream($rMessageStream, $iMessageStreamSize, $sFolderFullNameRaw); } @@ -4845,7 +4919,8 @@ class Actions $oAccount = $this->getAccountFromToken(); - $sData = $this->StorageProvider()->Get($oAccount, StorageType::USER, 'contacts/'.$sRawKey); + $sData = $this->StorageProvider()->Get($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::USER, 'contacts/'.$sRawKey); if ($sData) { $aData = \explode('|||', $sData, 2); diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Config/AbstractConfig.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/AbstractConfig.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Config/AbstractConfig.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Config/AbstractConfig.php diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Config/Application.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php similarity index 98% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Config/Application.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php index 634d22abd..c675ec74b 100644 --- a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Config/Application.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php @@ -58,6 +58,7 @@ class Application extends \RainLoop\Config\AbstractConfig 'webmail' => array( 'title' => array('RainLoop Webmail', 'Text displayed as page title'), + 'loading_description' => array('RainLoop', 'Text displayed on startup'), 'theme' => array('Default', 'Theme used by default'), 'allow_themes' => array(true, 'Allow theme selection on settings screen'), diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Config/Plugin.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Plugin.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Config/Plugin.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Config/Plugin.php diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Domain.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Domain.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Domain.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Domain.php diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Enumerations/CustomThemeType.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/CustomThemeType.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Enumerations/CustomThemeType.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/CustomThemeType.php diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Enumerations/InterfaceAnimation.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/InterfaceAnimation.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Enumerations/InterfaceAnimation.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/InterfaceAnimation.php diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Enumerations/PluginPropertyType.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/PluginPropertyType.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Enumerations/PluginPropertyType.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/PluginPropertyType.php diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Enumerations/SignMeType.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/SignMeType.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Enumerations/SignMeType.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/SignMeType.php diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Enumerations/TimeFormat.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/TimeFormat.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Enumerations/TimeFormat.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/TimeFormat.php diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/Enumerations/UploadClientError.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/UploadClientError.php similarity index 83% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/Enumerations/UploadClientError.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/UploadClientError.php index a7a13bb8b..8f146eb27 100644 --- a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/Enumerations/UploadClientError.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/UploadClientError.php @@ -1,6 +1,6 @@ oDriver = $oDriver; + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * @param resource $rSource + * + * @return bool + */ + public function PutFile($oAccount, $sKey, $rSource) + { + return $this->oDriver->PutFile($oAccount, $sKey, $rSource); + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * @param string $sSource + * + * @return bool + */ + public function MoveUploadedFile($oAccount, $sKey, $sSource) + { + return $this->oDriver->MoveUploadedFile($oAccount, $sKey, $sSource); + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * @param string $sOpenMode = 'rb' + * + * @return resource|bool + */ + public function GetFile($oAccount, $sKey, $sOpenMode = 'rb') + { + return $this->oDriver->GetFile($oAccount, $sKey, $sOpenMode); + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * + * @return string | bool + */ + public function GetFileName($oAccount, $sKey) + { + return $this->oDriver->GetFileName($oAccount, $sKey); + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * + * @return bool + */ + public function Clear($oAccount, $sKey) + { + return $this->oDriver->Clear($oAccount, $sKey); + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * + * @return int|bool + */ + public function FileSize($oAccount, $sKey) + { + return $this->oDriver->FileSize($oAccount, $sKey); + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * + * @return bool + */ + public function FileExists($oAccount, $sKey) + { + return $this->oDriver->FileExists($oAccount, $sKey); + } + + /** + * @param int $iTimeToClearInHours = 24 + * + * @return bool + */ + public function GC($iTimeToClearInHours = 24) + { + return $this->oDriver ? $this->oDriver->GC($iTimeToClearInHours) : false; + } + + /** + * @return bool + */ + public function IsActive() + { + return $this->oDriver instanceof \RainLoop\Providers\Files\FilesInterface; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/DefaultStorage.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/DefaultStorage.php new file mode 100644 index 000000000..293813e33 --- /dev/null +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/DefaultStorage.php @@ -0,0 +1,186 @@ +sDataPath = \rtrim(\trim($sStoragePath), '\\/'); + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * @param resource $rSource + * + * @return bool + */ + public function PutFile($oAccount, $sKey, $rSource) + { + $bResult = false; + if ($rSource) + { + $rOpenOutput = @\fopen($this->generateFileName($oAccount, $sKey, true), 'w+b'); + if ($rOpenOutput) + { + $bResult = (false !== \MailSo\Base\Utils::MultipleStreamWriter($rSource, array($rOpenOutput))); + @\fclose($rOpenOutput); + } + } + return $bResult; + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * @param string $sSource + * + * @return bool + */ + public function MoveUploadedFile($oAccount, $sKey, $sSource) + { + return @\move_uploaded_file($sSource, + $this->generateFileName($oAccount, $sKey, true)); + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * @param string $sOpenMode = 'rb' + * + * @return resource|bool + */ + public function GetFile($oAccount, $sKey, $sOpenMode = 'rb') + { + $mResult = false; + $bCreate = !!\preg_match('/[wac]/', $sOpenMode); + + $sFileName = $this->generateFileName($oAccount, $sKey, $bCreate); + if ($bCreate || \file_exists($sFileName)) + { + $mResult = @\fopen($sFileName, $sOpenMode); + } + + return $mResult; + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * + * @return string|bool + */ + public function GetFileName($oAccount, $sKey) + { + $mResult = false; + $sFileName = $this->generateFileName($oAccount, $sKey); + if (\file_exists($sFileName)) + { + $mResult = $sFileName; + } + + return $mResult; + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * + * @return bool + */ + public function Clear($oAccount, $sKey) + { + $mResult = true; + $sFileName = $this->generateFileName($oAccount, $sKey); + if (\file_exists($sFileName)) + { + $mResult = @\unlink($sFileName); + } + + return $mResult; + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * + * @return int|bool + */ + public function FileSize($oAccount, $sKey) + { + $mResult = false; + $sFileName = $this->generateFileName($oAccount, $sKey); + if (\file_exists($sFileName)) + { + $mResult = \filesize($sFileName); + } + + return $mResult; + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * + * @return bool + */ + public function FileExists($oAccount, $sKey) + { + return @\file_exists($this->generateFileName($oAccount, $sKey)); + } + + /** + * @param int $iTimeToClearInHours = 24 + * + * @return bool + */ + public function GC($iTimeToClearInHours = 24) + { + if (0 < $iTimeToClearInHours) + { + \MailSo\Base\Utils::RecTimeDirRemove($this->sDataPath, 60 * 60 * $iTimeToClearInHours, \time()); + return true; + } + + return false; + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sKey + * @param bool $bMkDir = false + * + * @return string + */ + private function generateFileName($oAccount, $sKey, $bMkDir = false) + { + $sEmail = \preg_replace('/[^a-z0-9\-\.@]+/', '_', + ('' === $oAccount->ParentEmail() ? '' : $oAccount->ParentEmail().'/').$oAccount->Email()); + + $sKeyPath = \sha1($sKey); + $sKeyPath = \substr($sKeyPath, 0, 2).'/'.\substr($sKeyPath, 2, 2).'/'.$sKeyPath; + + $sFilePath = $this->sDataPath.'/'.rtrim(substr($sEmail, 0, 2), '@').'/'.$sEmail.'/'.$sKeyPath; + + if ($bMkDir && !empty($sFilePath) && !@\is_dir(\dirname($sFilePath))) + { + if (!@\mkdir(\dirname($sFilePath), 0755, true)) + { + throw new \RainLoop\Exceptions\Exception('Can\'t make storage directory "'.$sFilePath.'"'); + } + } + + return $sFilePath; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/FilesInterface.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/FilesInterface.php new file mode 100644 index 000000000..a0a9e0a87 --- /dev/null +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Files/FilesInterface.php @@ -0,0 +1,72 @@ +oDriver = $oDriver; + } + + /** + * @param \RainLoop\Account|null $oAccount + * @param int $iStorageType + * @param string $iStorageType + * @param string $sValue + * + * @return bool + */ + public function Put($oAccount, $iStorageType, $sKey, $sValue) + { + if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY !== $iStorageType && !($oAccount instanceof \RainLoop\Account)) + { + return false; + } + + return $this->oDriver->Put($oAccount, $iStorageType, $sKey, $sValue); + } + + /** + * @param \RainLoop\Account|null $oAccount + * @param int $iStorageType + * @param string $sKey + * @param mixed $mDefault = false + * + * @return mixed + */ + public function Get($oAccount, $iStorageType, $sKey, $mDefault = false) + { + if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY !== $iStorageType && !($oAccount instanceof \RainLoop\Account)) + { + return $mDefault; + } + + return $this->oDriver->Get($oAccount, $iStorageType, $sKey, $mDefault); + } + + /** + * @param \RainLoop\Account|null $oAccount + * @param int $iStorageType + * @param string $sKey + * + * @return bool + */ + public function Clear($oAccount, $iStorageType, $sKey) + { + if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY !== $iStorageType && !($oAccount instanceof \RainLoop\Account)) + { + return false; + } + + return $this->oDriver->Clear($oAccount, $iStorageType, $sKey); + } + + /** + * @return bool + */ + public function IsActive() + { + return $this->oDriver instanceof \RainLoop\Providers\Storage\StorageInterface; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Storage/DefaultStorage.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Storage/DefaultStorage.php new file mode 100644 index 000000000..f0cd186e3 --- /dev/null +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Storage/DefaultStorage.php @@ -0,0 +1,129 @@ +sDataPath = \rtrim(\trim($sStoragePath), '\\/'); + } + + /** + * @param \RainLoop\Account|null $oAccount + * @param int $iStorageType + * @param string $sKey + * @param string $sValue + * + * @return bool + */ + public function Put($oAccount, $iStorageType, $sKey, $sValue) + { + return false !== @\file_put_contents( + $this->generateFileName($oAccount, $iStorageType, $sKey, true), $sValue); + } + + /** + * @param \RainLoop\Account|null $oAccount + * @param int $iStorageType + * @param string $sKey + * @param mixed $mDefault = false + * + * @return mixed + */ + public function Get($oAccount, $iStorageType, $sKey, $mDefault = false) + { + $mValue = false; + $sFileName = $this->generateFileName($oAccount, $iStorageType, $sKey); + if (\file_exists($sFileName)) + { + $mValue = \file_get_contents($sFileName); + } + + return false === $mValue ? $mDefault : $mValue; + } + + /** + * @param \RainLoop\Account|null $oAccount + * @param int $iStorageType + * @param string $sKey + * + * @return bool + */ + public function Clear($oAccount, $iStorageType, $sKey) + { + $mResult = true; + $sFileName = $this->generateFileName($oAccount, $iStorageType, $sKey); + if (\file_exists($sFileName)) + { + $mResult = @\unlink($sFileName); + } + + return $mResult; + } + + /** + * @param \RainLoop\Account|null $oAccount + * @param int $iStorageType + * @param string $sKey + * @param bool $bMkDir = false + * + * @return string + */ + private function generateFileName($oAccount, $iStorageType, $sKey, $bMkDir = false) + { + if (!$oAccount) + { + $iStorageType = \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY; + } + + $sEmail = $oAccount ? \preg_replace('/[^a-z0-9\-\.@]+/', '_', + ('' === $oAccount->ParentEmail() ? '' : $oAccount->ParentEmail().'/').$oAccount->Email()) : ''; + + $sTypePath = $sKeyPath = ''; + switch ($iStorageType) + { + default: + case \RainLoop\Providers\Storage\Enumerations\StorageType::USER: + case \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY: + $sTypePath = 'data'; + $sKeyPath = \md5($sKey); + $sKeyPath = \substr($sKeyPath, 0, 2).'/'.$sKeyPath; + break; + case \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG: + $sTypePath = 'cfg'; + $sKeyPath = \preg_replace('/[_]+/', '_', \preg_replace('/[^a-zA-Z0-9\/]/', '_', $sKey)); + break; + } + + $sFilePath = ''; + if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY === $iStorageType) + { + $sFilePath = $this->sDataPath.'/'.$sTypePath.'/__nobody__/'.$sKeyPath; + } + else if (!empty($sEmail)) + { + $sFilePath = $this->sDataPath.'/'.$sTypePath.'/'.rtrim(substr($sEmail, 0, 2), '@').'/'.$sEmail.'/'.$sKeyPath; + } + + if ($bMkDir && !empty($sFilePath) && !@\is_dir(\dirname($sFilePath))) + { + if (!@\mkdir(\dirname($sFilePath), 0755, true)) + { + throw new \RainLoop\Exceptions\Exception('Can\'t make storage directory "'.$sFilePath.'"'); + } + } + + return $sFilePath; + } +} diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/Enumerations/StorageType.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Storage/Enumerations/StorageType.php similarity index 82% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/Enumerations/StorageType.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Storage/Enumerations/StorageType.php index 7fef10005..f7173f972 100644 --- a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/Enumerations/StorageType.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/Storage/Enumerations/StorageType.php @@ -1,11 +1,10 @@ - ($bAdmin ? APP_INDEX_FILE.'?/AdminAppData/' : APP_INDEX_FILE.'?/AppData/'), '{{BaseAppIndexFile}}' => APP_INDEX_FILE, '{{BaseAppFaviconFile}}' => $aData['FaviconLink'], '{{BaseAppMainCssLink}}' => $aData['AppCssLink'], - '{{BaseAppBootScriptLink}}' => $aData['BootJsLink'], - '{{BaseAppJqueryScriptLink}}' => $aData['JqueryJsLink'], + '{{BaseAppBootScriptSource}}' => $sJsBoot, '{{BaseAppLibsScriptLink}}' => $aData['LibJsLink'], '{{BaseAppMainScriptLink}}' => $aData['AppJsLink'], + '{{BaseAppLoadingDescription}}' => \htmlspecialchars($aData['LoadingDescription'], ENT_QUOTES|ENT_IGNORE, 'UTF-8'), '{{BaseDir}}' => \in_array($aData['Language'], array('ar', 'he', 'ur')) ? 'rtl' : 'ltr' )); @@ -194,6 +195,7 @@ class Service private function generateIndexCacheHash($bAppJsDebug, $bAdmin) { return \md5(APP_WEB_PATH. + $this->oActions->Config()->Get('webmail', 'loading_description', 'RainLoop'). $this->oActions->Config()->Get('labs', 'cdn_static_domain', ''). \md5($this->oActions->Config()->Get('cache', 'index', '')). $this->oActions->Plugins()->Hash(). @@ -232,10 +234,9 @@ class Service 'Language' => $sLanguage, 'Theme' => $sTheme, 'Hash' => $this->generateIndexCacheHash($bAppJsDebug, $bAdmin), + 'LoadingDescription' => $this->oActions->Config()->Get('webmail', 'loading_description', 'RainLoop'), 'FaviconLink' => $sStaticPrefix.'favicon.png', 'AppCssLink' => $sStaticPrefix.'css/app'.($bAppCssDebug ? '' : '.min').'.css', - 'BootJsLink' => $sStaticPrefix.'js/boot.js', - 'JqueryJsLink' => $sStaticPrefix.'js/jquery.js', 'LibJsLink' => $sStaticPrefix.'js/libs.js', 'AppJsLink' => $sStaticPrefix.'js/'.($bAdmin ? 'admin' : 'app').($bAppJsDebug ? '' : '.min').'.js' ); diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/ServiceActions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/ServiceActions.php similarity index 99% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/ServiceActions.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/ServiceActions.php index e6bb4b953..b9756aa63 100644 --- a/rainloop/v/1.3.10.492/app/libraries/RainLoop/ServiceActions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/ServiceActions.php @@ -2,8 +2,6 @@ namespace RainLoop; -use RainLoop\Providers\Storage\Enumerations\StorageType; - class ServiceActions { /** @@ -610,7 +608,7 @@ class ServiceActions if ($bCustom && $oAccount) { - $mData = $this->oActions->StorageProvider()->Get($oAccount, StorageType::USER, 'CustomThemeBackground', ''); + $mData = $this->oActions->StorageProvider()->Get($oAccount, \RainLoop\Providers\Storage\Enumerations\StorageType::USER, 'CustomThemeBackground', ''); if (!empty($mData) && 'data:' === \substr($mData, 0, 5)) { $sResult = \str_replace('background-image:link', 'background-image:url("'.$mData.'")', $sResult); diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Settings.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Settings.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Settings.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Settings.php diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Social.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Social.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Social.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Social.php diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Utils.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/RainLoop/Utils.php rename to rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php diff --git a/rainloop/v/1.3.10.492/app/libraries/facebook/base_facebook.php b/rainloop/v/0.0.0/app/libraries/facebook/base_facebook.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/facebook/base_facebook.php rename to rainloop/v/0.0.0/app/libraries/facebook/base_facebook.php diff --git a/rainloop/v/1.3.10.492/app/libraries/facebook/facebook.php b/rainloop/v/0.0.0/app/libraries/facebook/facebook.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/facebook/facebook.php rename to rainloop/v/0.0.0/app/libraries/facebook/facebook.php diff --git a/rainloop/v/1.3.10.492/app/libraries/facebook/fb_ca_chain_bundle.crt b/rainloop/v/0.0.0/app/libraries/facebook/fb_ca_chain_bundle.crt similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/facebook/fb_ca_chain_bundle.crt rename to rainloop/v/0.0.0/app/libraries/facebook/fb_ca_chain_bundle.crt diff --git a/rainloop/v/1.3.10.492/app/libraries/lessphp/LICENSE b/rainloop/v/0.0.0/app/libraries/lessphp/LICENSE similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/lessphp/LICENSE rename to rainloop/v/0.0.0/app/libraries/lessphp/LICENSE diff --git a/rainloop/v/1.3.10.492/app/libraries/lessphp/README.md b/rainloop/v/0.0.0/app/libraries/lessphp/README.md similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/lessphp/README.md rename to rainloop/v/0.0.0/app/libraries/lessphp/README.md diff --git a/rainloop/v/1.3.10.492/app/libraries/lessphp/ctype.php b/rainloop/v/0.0.0/app/libraries/lessphp/ctype.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/lessphp/ctype.php rename to rainloop/v/0.0.0/app/libraries/lessphp/ctype.php diff --git a/rainloop/v/1.3.10.492/app/libraries/lessphp/lessc.inc.php b/rainloop/v/0.0.0/app/libraries/lessphp/lessc.inc.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/lessphp/lessc.inc.php rename to rainloop/v/0.0.0/app/libraries/lessphp/lessc.inc.php diff --git a/rainloop/v/1.3.10.492/app/libraries/pclzip/gnu-lgpl.txt b/rainloop/v/0.0.0/app/libraries/pclzip/gnu-lgpl.txt similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/pclzip/gnu-lgpl.txt rename to rainloop/v/0.0.0/app/libraries/pclzip/gnu-lgpl.txt diff --git a/rainloop/v/1.3.10.492/app/libraries/pclzip/pclzip.lib.php b/rainloop/v/0.0.0/app/libraries/pclzip/pclzip.lib.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/pclzip/pclzip.lib.php rename to rainloop/v/0.0.0/app/libraries/pclzip/pclzip.lib.php diff --git a/rainloop/v/1.3.10.492/app/libraries/pclzip/readme.txt b/rainloop/v/0.0.0/app/libraries/pclzip/readme.txt similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/pclzip/readme.txt rename to rainloop/v/0.0.0/app/libraries/pclzip/readme.txt diff --git a/rainloop/v/1.3.10.492/app/libraries/tmhOAuth/LICENSE b/rainloop/v/0.0.0/app/libraries/tmhOAuth/LICENSE similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/tmhOAuth/LICENSE rename to rainloop/v/0.0.0/app/libraries/tmhOAuth/LICENSE diff --git a/rainloop/v/1.3.10.492/app/libraries/tmhOAuth/README.md b/rainloop/v/0.0.0/app/libraries/tmhOAuth/README.md similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/tmhOAuth/README.md rename to rainloop/v/0.0.0/app/libraries/tmhOAuth/README.md diff --git a/rainloop/v/1.3.10.492/app/libraries/tmhOAuth/cacert.pem b/rainloop/v/0.0.0/app/libraries/tmhOAuth/cacert.pem similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/tmhOAuth/cacert.pem rename to rainloop/v/0.0.0/app/libraries/tmhOAuth/cacert.pem diff --git a/rainloop/v/1.3.10.492/app/libraries/tmhOAuth/tmhOAuth.php b/rainloop/v/0.0.0/app/libraries/tmhOAuth/tmhOAuth.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/tmhOAuth/tmhOAuth.php rename to rainloop/v/0.0.0/app/libraries/tmhOAuth/tmhOAuth.php diff --git a/rainloop/v/1.3.10.492/app/libraries/tmhOAuth/tmhUtilities.php b/rainloop/v/0.0.0/app/libraries/tmhOAuth/tmhUtilities.php similarity index 100% rename from rainloop/v/1.3.10.492/app/libraries/tmhOAuth/tmhUtilities.php rename to rainloop/v/0.0.0/app/libraries/tmhOAuth/tmhUtilities.php diff --git a/rainloop/v/1.3.10.492/app/templates/BadBrowser.html b/rainloop/v/0.0.0/app/templates/BadBrowser.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/BadBrowser.html rename to rainloop/v/0.0.0/app/templates/BadBrowser.html diff --git a/rainloop/v/1.3.10.492/app/templates/Error.html b/rainloop/v/0.0.0/app/templates/Error.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Error.html rename to rainloop/v/0.0.0/app/templates/Error.html diff --git a/rainloop/v/0.0.0/app/templates/Index.html b/rainloop/v/0.0.0/app/templates/Index.html new file mode 100644 index 000000000..c4889550a --- /dev/null +++ b/rainloop/v/0.0.0/app/templates/Index.html @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + +
{{BaseAppLoadingDescription}}
+
+ An Error occurred,
please refresh the page and try again. +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + diff --git a/rainloop/v/1.3.10.492/app/templates/Themes/custom-values-dark.less b/rainloop/v/0.0.0/app/templates/Themes/custom-values-dark.less similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Themes/custom-values-dark.less rename to rainloop/v/0.0.0/app/templates/Themes/custom-values-dark.less diff --git a/rainloop/v/1.3.10.492/app/templates/Themes/custom-values-light.less b/rainloop/v/0.0.0/app/templates/Themes/custom-values-light.less similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Themes/custom-values-light.less rename to rainloop/v/0.0.0/app/templates/Themes/custom-values-light.less diff --git a/rainloop/v/1.3.10.492/app/templates/Themes/template.less b/rainloop/v/0.0.0/app/templates/Themes/template.less similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Themes/template.less rename to rainloop/v/0.0.0/app/templates/Themes/template.less diff --git a/rainloop/v/1.3.10.492/app/templates/Themes/values.less b/rainloop/v/0.0.0/app/templates/Themes/values.less similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Themes/values.less rename to rainloop/v/0.0.0/app/templates/Themes/values.less diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminLogin.html b/rainloop/v/0.0.0/app/templates/Views/AdminLogin.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminLogin.html rename to rainloop/v/0.0.0/app/templates/Views/AdminLogin.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminMenu.html b/rainloop/v/0.0.0/app/templates/Views/AdminMenu.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminMenu.html rename to rainloop/v/0.0.0/app/templates/Views/AdminMenu.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminPane.html b/rainloop/v/0.0.0/app/templates/Views/AdminPane.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminPane.html rename to rainloop/v/0.0.0/app/templates/Views/AdminPane.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminDomainListItem.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsDomainListItem.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminDomainListItem.html rename to rainloop/v/0.0.0/app/templates/Views/AdminSettingsDomainListItem.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminDomains.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsDomains.html similarity index 87% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminDomains.html rename to rainloop/v/0.0.0/app/templates/Views/AdminSettingsDomains.html index 72a22c37a..32fd3b016 100644 --- a/rainloop/v/1.3.10.492/app/templates/Views/AdminDomains.html +++ b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsDomains.html @@ -25,7 +25,7 @@ - +
\ No newline at end of file diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminGeneral.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsGeneral.html similarity index 68% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminGeneral.html rename to rainloop/v/0.0.0/app/templates/Views/AdminSettingsGeneral.html index 2ef714d2c..2cee5daee 100644 --- a/rainloop/v/1.3.10.492/app/templates/Views/AdminGeneral.html +++ b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsGeneral.html @@ -1,4 +1,14 @@
+
+
+

Warning!

+
+ You are using the default admin password. +
+ For security reasons please change + password to something else now. +
+

Notice!

@@ -17,16 +27,25 @@ Title
- +
+
+ +
+ +
+
+
- +


@@ -41,7 +60,7 @@ Theme
- +
@@ -70,35 +89,4 @@
-
-
- Login Screen -
-
- -
- -
-
-
-
-
- - -
- -
-
-
\ No newline at end of file diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminLicensing.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsLicensing.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminLicensing.html rename to rainloop/v/0.0.0/app/templates/Views/AdminSettingsLicensing.html diff --git a/rainloop/v/0.0.0/app/templates/Views/AdminSettingsLogin.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsLogin.html new file mode 100644 index 000000000..c746fe615 --- /dev/null +++ b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsLogin.html @@ -0,0 +1,33 @@ +
+
+
+ Login Screen +
+
+ +
+ +
+
+
+
+
+ + +
+ +
+
+
+
\ No newline at end of file diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminPackages.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsPackages.html similarity index 78% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminPackages.html rename to rainloop/v/0.0.0/app/templates/Views/AdminSettingsPackages.html index 22475ec34..87e467279 100644 --- a/rainloop/v/1.3.10.492/app/templates/Views/AdminPackages.html +++ b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsPackages.html @@ -25,7 +25,7 @@
Available for Update ()
-
+

@@ -33,7 +33,7 @@
Installed Packages
-
+

@@ -41,7 +41,7 @@
Available for Installation
-
+

diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminPackagesListItem.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsPackagesListItem.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminPackagesListItem.html rename to rainloop/v/0.0.0/app/templates/Views/AdminSettingsPackagesListItem.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminPackagesTable.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsPackagesTable.html similarity index 71% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminPackagesTable.html rename to rainloop/v/0.0.0/app/templates/Views/AdminSettingsPackagesTable.html index b8e7617f1..72d3cee1e 100644 --- a/rainloop/v/1.3.10.492/app/templates/Views/AdminPackagesTable.html +++ b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsPackagesTable.html @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminPluginListItem.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsPluginListItem.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminPluginListItem.html rename to rainloop/v/0.0.0/app/templates/Views/AdminSettingsPluginListItem.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminPluginProperty.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsPluginProperty.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminPluginProperty.html rename to rainloop/v/0.0.0/app/templates/Views/AdminSettingsPluginProperty.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminPlugins.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsPlugins.html similarity index 93% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminPlugins.html rename to rainloop/v/0.0.0/app/templates/Views/AdminSettingsPlugins.html index 612c496e0..e847f8a3a 100644 --- a/rainloop/v/1.3.10.492/app/templates/Views/AdminPlugins.html +++ b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsPlugins.html @@ -41,7 +41,7 @@ - + diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminSecurity.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsSecurity.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminSecurity.html rename to rainloop/v/0.0.0/app/templates/Views/AdminSettingsSecurity.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/AdminSocial.html b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsSocial.html similarity index 92% rename from rainloop/v/1.3.10.492/app/templates/Views/AdminSocial.html rename to rainloop/v/0.0.0/app/templates/Views/AdminSettingsSocial.html index 53cab699d..9cfe480f6 100644 --- a/rainloop/v/1.3.10.492/app/templates/Views/AdminSocial.html +++ b/rainloop/v/0.0.0/app/templates/Views/AdminSettingsSocial.html @@ -22,7 +22,7 @@ Client ID
- +
@@ -31,7 +31,7 @@ Client Secret
- +
@@ -51,7 +51,7 @@ App ID
- +
@@ -60,7 +60,7 @@ App Secret
- +
@@ -80,7 +80,7 @@ Consumer Key
- +
@@ -89,7 +89,7 @@ Consumer Secret
- +
@@ -109,7 +109,7 @@ Api Key
- +
diff --git a/rainloop/v/1.3.10.492/app/templates/Views/ComposeAttachment.html b/rainloop/v/0.0.0/app/templates/Views/ComposeAttachment.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/ComposeAttachment.html rename to rainloop/v/0.0.0/app/templates/Views/ComposeAttachment.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/ComposeAttachmentInProcess.html b/rainloop/v/0.0.0/app/templates/Views/ComposeAttachmentInProcess.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/ComposeAttachmentInProcess.html rename to rainloop/v/0.0.0/app/templates/Views/ComposeAttachmentInProcess.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/Login.html b/rainloop/v/0.0.0/app/templates/Views/Login.html similarity index 97% rename from rainloop/v/1.3.10.492/app/templates/Views/Login.html rename to rainloop/v/0.0.0/app/templates/Views/Login.html index 733334310..d51e1af33 100644 --- a/rainloop/v/1.3.10.492/app/templates/Views/Login.html +++ b/rainloop/v/0.0.0/app/templates/Views/Login.html @@ -1,99 +1,99 @@ - + diff --git a/rainloop/v/1.3.10.492/app/templates/Views/MailFolderList.html b/rainloop/v/0.0.0/app/templates/Views/MailFolderList.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/MailFolderList.html rename to rainloop/v/0.0.0/app/templates/Views/MailFolderList.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/MailFolderListItem.html b/rainloop/v/0.0.0/app/templates/Views/MailFolderListItem.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/MailFolderListItem.html rename to rainloop/v/0.0.0/app/templates/Views/MailFolderListItem.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/MailFolderListSystemItem.html b/rainloop/v/0.0.0/app/templates/Views/MailFolderListSystemItem.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/MailFolderListSystemItem.html rename to rainloop/v/0.0.0/app/templates/Views/MailFolderListSystemItem.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/MailMessageList.html b/rainloop/v/0.0.0/app/templates/Views/MailMessageList.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/MailMessageList.html rename to rainloop/v/0.0.0/app/templates/Views/MailMessageList.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/MailMessageListItem.html b/rainloop/v/0.0.0/app/templates/Views/MailMessageListItem.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/MailMessageListItem.html rename to rainloop/v/0.0.0/app/templates/Views/MailMessageListItem.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/MailMessageListItemNoPreviewPane.html b/rainloop/v/0.0.0/app/templates/Views/MailMessageListItemNoPreviewPane.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/MailMessageListItemNoPreviewPane.html rename to rainloop/v/0.0.0/app/templates/Views/MailMessageListItemNoPreviewPane.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/MailMessageView.html b/rainloop/v/0.0.0/app/templates/Views/MailMessageView.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/MailMessageView.html rename to rainloop/v/0.0.0/app/templates/Views/MailMessageView.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsActivate.html b/rainloop/v/0.0.0/app/templates/Views/PopupsActivate.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsActivate.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsActivate.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsAddAccount.html b/rainloop/v/0.0.0/app/templates/Views/PopupsAddAccount.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsAddAccount.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsAddAccount.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsAdvancedSearch.html b/rainloop/v/0.0.0/app/templates/Views/PopupsAdvancedSearch.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsAdvancedSearch.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsAdvancedSearch.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsCompose.html b/rainloop/v/0.0.0/app/templates/Views/PopupsCompose.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsCompose.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsCompose.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsContacts.html b/rainloop/v/0.0.0/app/templates/Views/PopupsContacts.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsContacts.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsContacts.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsDomain.html b/rainloop/v/0.0.0/app/templates/Views/PopupsDomain.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsDomain.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsDomain.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsFolderClear.html b/rainloop/v/0.0.0/app/templates/Views/PopupsFolderClear.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsFolderClear.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsFolderClear.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsFolderCreate.html b/rainloop/v/0.0.0/app/templates/Views/PopupsFolderCreate.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsFolderCreate.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsFolderCreate.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsFolderSystem.html b/rainloop/v/0.0.0/app/templates/Views/PopupsFolderSystem.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsFolderSystem.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsFolderSystem.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsIdentity.html b/rainloop/v/0.0.0/app/templates/Views/PopupsIdentity.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsIdentity.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsIdentity.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsLanguages.html b/rainloop/v/0.0.0/app/templates/Views/PopupsLanguages.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsLanguages.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsLanguages.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsPlugin.html b/rainloop/v/0.0.0/app/templates/Views/PopupsPlugin.html similarity index 91% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsPlugin.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsPlugin.html index 8ce406404..cfa6d760a 100644 --- a/rainloop/v/1.3.10.492/app/templates/Views/PopupsPlugin.html +++ b/rainloop/v/0.0.0/app/templates/Views/PopupsPlugin.html @@ -16,7 +16,7 @@
-
+
diff --git a/rainloop/v/1.3.10.492/app/templates/Views/PopupsWindowSimpleMessage.html b/rainloop/v/0.0.0/app/templates/Views/PopupsWindowSimpleMessage.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/PopupsWindowSimpleMessage.html rename to rainloop/v/0.0.0/app/templates/Views/PopupsWindowSimpleMessage.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SettingsAccounts.html b/rainloop/v/0.0.0/app/templates/Views/SettingsAccounts.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/SettingsAccounts.html rename to rainloop/v/0.0.0/app/templates/Views/SettingsAccounts.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SettingsChangePassword.html b/rainloop/v/0.0.0/app/templates/Views/SettingsChangePassword.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/SettingsChangePassword.html rename to rainloop/v/0.0.0/app/templates/Views/SettingsChangePassword.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SettingsCustom.html b/rainloop/v/0.0.0/app/templates/Views/SettingsCustom.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/SettingsCustom.html rename to rainloop/v/0.0.0/app/templates/Views/SettingsCustom.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SettingsFolderItem.html b/rainloop/v/0.0.0/app/templates/Views/SettingsFolderItem.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/SettingsFolderItem.html rename to rainloop/v/0.0.0/app/templates/Views/SettingsFolderItem.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SettingsFolders.html b/rainloop/v/0.0.0/app/templates/Views/SettingsFolders.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/SettingsFolders.html rename to rainloop/v/0.0.0/app/templates/Views/SettingsFolders.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SettingsGeneral.html b/rainloop/v/0.0.0/app/templates/Views/SettingsGeneral.html similarity index 98% rename from rainloop/v/1.3.10.492/app/templates/Views/SettingsGeneral.html rename to rainloop/v/0.0.0/app/templates/Views/SettingsGeneral.html index dea273784..8b78de780 100644 --- a/rainloop/v/1.3.10.492/app/templates/Views/SettingsGeneral.html +++ b/rainloop/v/0.0.0/app/templates/Views/SettingsGeneral.html @@ -70,7 +70,7 @@
- +
diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SettingsIdentities.html b/rainloop/v/0.0.0/app/templates/Views/SettingsIdentities.html similarity index 93% rename from rainloop/v/1.3.10.492/app/templates/Views/SettingsIdentities.html rename to rainloop/v/0.0.0/app/templates/Views/SettingsIdentities.html index ee57d83be..d342f12de 100644 --- a/rainloop/v/1.3.10.492/app/templates/Views/SettingsIdentities.html +++ b/rainloop/v/0.0.0/app/templates/Views/SettingsIdentities.html @@ -47,7 +47,7 @@
- +
\ No newline at end of file diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SettingsMenu.html b/rainloop/v/0.0.0/app/templates/Views/SettingsMenu.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/SettingsMenu.html rename to rainloop/v/0.0.0/app/templates/Views/SettingsMenu.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SettingsPane.html b/rainloop/v/0.0.0/app/templates/Views/SettingsPane.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/SettingsPane.html rename to rainloop/v/0.0.0/app/templates/Views/SettingsPane.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SettingsPersonal.html b/rainloop/v/0.0.0/app/templates/Views/SettingsPersonal.html similarity index 86% rename from rainloop/v/1.3.10.492/app/templates/Views/SettingsPersonal.html rename to rainloop/v/0.0.0/app/templates/Views/SettingsPersonal.html index 93851460a..2e4f8f7b8 100644 --- a/rainloop/v/1.3.10.492/app/templates/Views/SettingsPersonal.html +++ b/rainloop/v/0.0.0/app/templates/Views/SettingsPersonal.html @@ -8,7 +8,7 @@
- +
@@ -25,7 +25,7 @@
- +
diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SettingsSocial.html b/rainloop/v/0.0.0/app/templates/Views/SettingsSocial.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/SettingsSocial.html rename to rainloop/v/0.0.0/app/templates/Views/SettingsSocial.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SettingsThemes.html b/rainloop/v/0.0.0/app/templates/Views/SettingsThemes.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/SettingsThemes.html rename to rainloop/v/0.0.0/app/templates/Views/SettingsThemes.html diff --git a/rainloop/v/1.3.10.492/app/templates/Views/SystemDropDown.html b/rainloop/v/0.0.0/app/templates/Views/SystemDropDown.html similarity index 100% rename from rainloop/v/1.3.10.492/app/templates/Views/SystemDropDown.html rename to rainloop/v/0.0.0/app/templates/Views/SystemDropDown.html diff --git a/rainloop/v/1.3.10.492/check.php b/rainloop/v/0.0.0/check.php similarity index 100% rename from rainloop/v/1.3.10.492/check.php rename to rainloop/v/0.0.0/check.php diff --git a/rainloop/v/1.3.10.492/index.php b/rainloop/v/0.0.0/index.php similarity index 100% rename from rainloop/v/1.3.10.492/index.php rename to rainloop/v/0.0.0/index.php diff --git a/rainloop/v/1.3.10.492/langs/de.ini b/rainloop/v/0.0.0/langs/de.ini similarity index 99% rename from rainloop/v/1.3.10.492/langs/de.ini rename to rainloop/v/0.0.0/langs/de.ini index bea0d750f..edd777d7d 100644 --- a/rainloop/v/1.3.10.492/langs/de.ini +++ b/rainloop/v/0.0.0/langs/de.ini @@ -156,7 +156,7 @@ ATTACH_DROP_FILES_DESC = "Fügen Sie hier Dateien ein" ATTACH_ITEM_CANCEL = "Abbrechen" DROPBOX = "Dropbox" GOOGLE_DRIVE = "Google Drive" -REPLY_MESSAGE_TITLE = "%DATETIME% %EMAIL% schrieb" +REPLY_MESSAGE_TITLE = "%DATETIME%, %EMAIL% schrieb" FORWARD_MESSAGE_TOP_TITLE = "-------- Forwarded message -------" FORWARD_MESSAGE_TOP_FROM = "Von" FORWARD_MESSAGE_TOP_TO = "An" diff --git a/rainloop/v/1.3.10.492/langs/en.ini b/rainloop/v/0.0.0/langs/en.ini similarity index 99% rename from rainloop/v/1.3.10.492/langs/en.ini rename to rainloop/v/0.0.0/langs/en.ini index 6e29d2ff1..4b5657e64 100644 --- a/rainloop/v/1.3.10.492/langs/en.ini +++ b/rainloop/v/0.0.0/langs/en.ini @@ -156,7 +156,7 @@ ATTACH_DROP_FILES_DESC = "Drop files here" ATTACH_ITEM_CANCEL = "Cancel" DROPBOX = "Dropbox" GOOGLE_DRIVE = "Google Drive" -REPLY_MESSAGE_TITLE = "%DATETIME% %EMAIL% wrote" +REPLY_MESSAGE_TITLE = "%DATETIME%, %EMAIL% wrote" FORWARD_MESSAGE_TOP_TITLE = "-------- Forwarded message -------" FORWARD_MESSAGE_TOP_FROM = "From" FORWARD_MESSAGE_TOP_TO = "To" diff --git a/rainloop/v/1.3.10.492/langs/es.ini b/rainloop/v/0.0.0/langs/es.ini similarity index 99% rename from rainloop/v/1.3.10.492/langs/es.ini rename to rainloop/v/0.0.0/langs/es.ini index 71861890f..422669a66 100644 --- a/rainloop/v/1.3.10.492/langs/es.ini +++ b/rainloop/v/0.0.0/langs/es.ini @@ -156,7 +156,7 @@ ATTACH_DROP_FILES_DESC = "Arrastre sus archivos aquí" ATTACH_ITEM_CANCEL = "Cancelar" DROPBOX = "Dropbox" GOOGLE_DRIVE = "Google Drive" -REPLY_MESSAGE_TITLE = "%DATETIME% %EMAIL% escribió" +REPLY_MESSAGE_TITLE = "%DATETIME%, %EMAIL% escribió" FORWARD_MESSAGE_TOP_TITLE = "-------- Mensaje reenviado -------" FORWARD_MESSAGE_TOP_FROM = "De" FORWARD_MESSAGE_TOP_TO = "Para" diff --git a/rainloop/v/1.3.10.492/langs/fr.ini b/rainloop/v/0.0.0/langs/fr.ini similarity index 100% rename from rainloop/v/1.3.10.492/langs/fr.ini rename to rainloop/v/0.0.0/langs/fr.ini diff --git a/rainloop/v/1.3.10.492/langs/is.ini b/rainloop/v/0.0.0/langs/is.ini similarity index 99% rename from rainloop/v/1.3.10.492/langs/is.ini rename to rainloop/v/0.0.0/langs/is.ini index b312e1e3e..4a9980e34 100644 --- a/rainloop/v/1.3.10.492/langs/is.ini +++ b/rainloop/v/0.0.0/langs/is.ini @@ -156,7 +156,7 @@ ATTACH_DROP_FILES_DESC = "Setja skrár hér" ATTACH_ITEM_CANCEL = "Hætta við" DROPBOX = "Dropbox" GOOGLE_DRIVE = "Google Drive" -REPLY_MESSAGE_TITLE = "%DATETIME% %EMAIL% skrifaði" +REPLY_MESSAGE_TITLE = "%DATETIME%, %EMAIL% skrifaði" FORWARD_MESSAGE_TOP_TITLE = "-------- Ãframsenda skilaboð -------" FORWARD_MESSAGE_TOP_FROM = "Frá" FORWARD_MESSAGE_TOP_TO = "Til" diff --git a/rainloop/v/1.3.10.492/langs/lv.ini b/rainloop/v/0.0.0/langs/lv.ini similarity index 99% rename from rainloop/v/1.3.10.492/langs/lv.ini rename to rainloop/v/0.0.0/langs/lv.ini index ce3de1680..b78fc97bc 100644 --- a/rainloop/v/1.3.10.492/langs/lv.ini +++ b/rainloop/v/0.0.0/langs/lv.ini @@ -156,7 +156,7 @@ ATTACH_DROP_FILES_DESC = "Iemet failus Å¡eit" ATTACH_ITEM_CANCEL = "Atcelt" DROPBOX = "Dropbox" GOOGLE_DRIVE = "Google Drive" -REPLY_MESSAGE_TITLE = "%DATETIME% %EMAIL% rakstija" +REPLY_MESSAGE_TITLE = "%DATETIME%, %EMAIL% rakstija" FORWARD_MESSAGE_TOP_TITLE = "-------- Forwarded message -------" FORWARD_MESSAGE_TOP_FROM = "No" FORWARD_MESSAGE_TOP_TO = "Kam" diff --git a/rainloop/v/1.3.10.492/langs/nl.ini b/rainloop/v/0.0.0/langs/nl.ini similarity index 99% rename from rainloop/v/1.3.10.492/langs/nl.ini rename to rainloop/v/0.0.0/langs/nl.ini index 3ae1f2d9d..827f334f4 100644 --- a/rainloop/v/1.3.10.492/langs/nl.ini +++ b/rainloop/v/0.0.0/langs/nl.ini @@ -156,7 +156,7 @@ ATTACH_DROP_FILES_DESC = "Sleep bestanden hier op" ATTACH_ITEM_CANCEL = "Annuleer" DROPBOX = "Dropbox" GOOGLE_DRIVE = "Google Drive" -REPLY_MESSAGE_TITLE = "%DATETIME% %EMAIL% schreef" +REPLY_MESSAGE_TITLE = "%DATETIME%, %EMAIL% schreef" FORWARD_MESSAGE_TOP_TITLE = "-------- Doorgestuurd bericht -------" FORWARD_MESSAGE_TOP_FROM = "Van" FORWARD_MESSAGE_TOP_TO = "Naar" diff --git a/rainloop/v/1.3.10.492/langs/pt-br.ini b/rainloop/v/0.0.0/langs/pt-br.ini similarity index 99% rename from rainloop/v/1.3.10.492/langs/pt-br.ini rename to rainloop/v/0.0.0/langs/pt-br.ini index 77fe8c1fb..c6d2aa0d0 100644 --- a/rainloop/v/1.3.10.492/langs/pt-br.ini +++ b/rainloop/v/0.0.0/langs/pt-br.ini @@ -156,7 +156,7 @@ ATTACH_DROP_FILES_DESC = "Coloque os arquivos aqui" ATTACH_ITEM_CANCEL = "Cancelar" DROPBOX = "Dropbox" GOOGLE_DRIVE = "Google Drive" -REPLY_MESSAGE_TITLE = "%DATETIME% %EMAIL% escreveu" +REPLY_MESSAGE_TITLE = "%DATETIME%, %EMAIL% escreveu" FORWARD_MESSAGE_TOP_TITLE = "-------- Mensagem Encaminhada -------" FORWARD_MESSAGE_TOP_FROM = "De" FORWARD_MESSAGE_TOP_TO = "Para" diff --git a/rainloop/v/1.3.10.492/langs/ru.ini b/rainloop/v/0.0.0/langs/ru.ini similarity index 99% rename from rainloop/v/1.3.10.492/langs/ru.ini rename to rainloop/v/0.0.0/langs/ru.ini index 2144e11b7..606ffb292 100644 --- a/rainloop/v/1.3.10.492/langs/ru.ini +++ b/rainloop/v/0.0.0/langs/ru.ini @@ -156,7 +156,7 @@ ATTACH_DROP_FILES_DESC = "ПомеÑтите файлы Ñюда" ATTACH_ITEM_CANCEL = "Отменить" DROPBOX = "Dropbox" GOOGLE_DRIVE = "Google Drive" -REPLY_MESSAGE_TITLE = "%DATETIME% %EMAIL% напиÑал" +REPLY_MESSAGE_TITLE = "%DATETIME%, %EMAIL% напиÑал" FORWARD_MESSAGE_TOP_TITLE = "-------- ПереÑланное Ñообщение -------" FORWARD_MESSAGE_TOP_FROM = "От" FORWARD_MESSAGE_TOP_TO = "Кому" diff --git a/rainloop/v/1.3.10.492/static/browsers/chrome.gif b/rainloop/v/0.0.0/static/browsers/chrome.gif similarity index 100% rename from rainloop/v/1.3.10.492/static/browsers/chrome.gif rename to rainloop/v/0.0.0/static/browsers/chrome.gif diff --git a/rainloop/v/1.3.10.492/static/browsers/firefox.gif b/rainloop/v/0.0.0/static/browsers/firefox.gif similarity index 100% rename from rainloop/v/1.3.10.492/static/browsers/firefox.gif rename to rainloop/v/0.0.0/static/browsers/firefox.gif diff --git a/rainloop/v/1.3.10.492/static/browsers/opera.gif b/rainloop/v/0.0.0/static/browsers/opera.gif similarity index 100% rename from rainloop/v/1.3.10.492/static/browsers/opera.gif rename to rainloop/v/0.0.0/static/browsers/opera.gif diff --git a/rainloop/v/1.3.10.492/static/browsers/safari.gif b/rainloop/v/0.0.0/static/browsers/safari.gif similarity index 100% rename from rainloop/v/1.3.10.492/static/browsers/safari.gif rename to rainloop/v/0.0.0/static/browsers/safari.gif diff --git a/rainloop/v/1.3.10.492/static/css/app.css b/rainloop/v/0.0.0/static/css/app.css similarity index 94% rename from rainloop/v/1.3.10.492/static/css/app.css rename to rainloop/v/0.0.0/static/css/app.css index 005b13c68..0302637b2 100644 --- a/rainloop/v/1.3.10.492/static/css/app.css +++ b/rainloop/v/0.0.0/static/css/app.css @@ -1,7 +1,7 @@ /*! jQuery UI - v1.10.3 - 2013-11-02 * http://jqueryui.com * Includes: jquery.ui.core.css, jquery.ui.resizable.css -* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ +* Copyright 2013 jQuery Foundation and other contributors; Licensed under MIT */ /* Layout helpers ----------------------------------*/ @@ -154,7 +154,6 @@ top: -5px; } - /*! normalize.css 2012-03-11T12:53 UTC - http://github.com/necolas/normalize.css */ /* ============================================================================= @@ -660,7 +659,6 @@ table { border-spacing: 0; } - @font-face { font-family: 'icomoon'; src:url('fonts/icomoon.eot'); @@ -965,9 +963,8 @@ you can use the generic selector below, but it's slower: content: "\e057"; } - /* -Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 +Version: 3.4.5 Timestamp: Mon Nov 4 08:22:42 PST 2013 */ .select2-container { margin: 0; @@ -982,7 +979,7 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 .select2-container, .select2-drop, .select2-search, -.select2-search input{ +.select2-search input { /* Force border-box so that % widths fit the parent container without overlap because of margin/padding. @@ -990,9 +987,7 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 More Info : http://www.quirksmode.org/css/box.html */ -webkit-box-sizing: border-box; /* webkit */ - -khtml-box-sizing: border-box; /* konqueror */ -moz-box-sizing: border-box; /* firefox */ - -ms-box-sizing: border-box; /* ie */ box-sizing: border-box; /* css3 */ } @@ -1009,45 +1004,34 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 color: #444; text-decoration: none; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; + border-radius: 4px; - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; + background-clip: padding-box; -webkit-touch-callout: none; -webkit-user-select: none; - -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; background-color: #fff; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white)); - background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%); - background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%); - background-image: -o-linear-gradient(bottom, #eeeeee 0%, #ffffff 50%); - background-image: -ms-linear-gradient(top, #ffffff 0%, #eeeeee 50%); + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff)); + background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%); + background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0); - background-image: linear-gradient(top, #ffffff 0%, #eeeeee 50%); + background-image: linear-gradient(top, #fff 0%, #eee 50%); } .select2-container.select2-drop-above .select2-choice { border-bottom-color: #aaa; - -webkit-border-radius:0 0 4px 4px; - -moz-border-radius:0 0 4px 4px; - border-radius:0 0 4px 4px; + border-radius: 0 0 4px 4px; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.9, white)); - background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 90%); - background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 90%); - background-image: -o-linear-gradient(bottom, #eeeeee 0%, white 90%); - background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 90%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #eeeeee 0%,#ffffff 90%); + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff)); + background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%); + background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); + background-image: linear-gradient(top, #eee 0%, #fff 90%); } .select2-container.select2-allowclear .select2-choice .select2-chosen { @@ -1061,9 +1045,7 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 white-space: nowrap; - -ms-text-overflow: ellipsis; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; + text-overflow: ellipsis; } .select2-container .select2-choice abbr { @@ -1092,29 +1074,21 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 cursor: pointer; } -.select2-drop-undermask { - border: 0; - margin: 0; - padding: 0; - position: absolute; - left: 0; - top: 0; - z-index: 9998; - background-color: transparent; - filter: alpha(opacity=0); -} - .select2-drop-mask { border: 0; margin: 0; padding: 0; - position: absolute; + position: fixed; left: 0; top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; z-index: 9998; /* styles required for IE to work */ background-color: #fff; - opacity: 0; filter: alpha(opacity=0); } @@ -1130,12 +1104,9 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 border: 1px solid #aaa; border-top: 0; - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); - -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); box-shadow: 0 4px 5px rgba(0, 0, 0, .15); } @@ -1153,12 +1124,9 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 border-top: 1px solid #aaa; border-bottom: 0; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); - -moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); } @@ -1180,22 +1148,16 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 top: 0; border-left: 1px solid #aaa; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; + background-clip: padding-box; background: #ccc; background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee)); background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%); background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%); - background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%); - background-image: -ms-linear-gradient(top, #cccccc 0%, #eeeeee 60%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0); - background-image: linear-gradient(top, #cccccc 0%, #eeeeee 60%); + background-image: linear-gradient(top, #ccc 0%, #eee 60%); } .select2-container .select2-choice .select2-arrow b { @@ -1231,21 +1193,16 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 font-size: 1em; border: 1px solid #aaa; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; + border-radius: 0; -webkit-box-shadow: none; - -moz-box-shadow: none; box-shadow: none; background: #fff url('select2.png') no-repeat 100% -22px; - background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background: url('select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%); - background: url('select2.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%); + background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); + background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2.png') no-repeat 100% -22px, linear-gradient(top, #fff 85%, #eee 99%); } .select2-drop.select2-drop-above .select2-search input { @@ -1254,12 +1211,10 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 .select2-search input.select2-active { background: #fff url('select2-spinner.gif') no-repeat 100%; - background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('select2-spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background: url('select2-spinner.gif') no-repeat 100%, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%); - background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(top, #ffffff 85%, #eeeeee 99%); + background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); + background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(top, #fff 85%, #eee 99%); } .select2-container-active .select2-choice, @@ -1267,33 +1222,24 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 border: 1px solid #5897fb; outline: none; - -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3); - -moz-box-shadow: 0 0 5px rgba(0,0,0,.3); - box-shadow: 0 0 5px rgba(0,0,0,.3); + -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3); + box-shadow: 0 0 5px rgba(0, 0, 0, .3); } .select2-dropdown-open .select2-choice { border-bottom-color: transparent; -webkit-box-shadow: 0 1px 0 #fff inset; - -moz-box-shadow: 0 1px 0 #fff inset; box-shadow: 0 1px 0 #fff inset; - -webkit-border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; - border-bottom-left-radius: 0; - - -webkit-border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; - border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; background-color: #eee; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee)); - background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%); - background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%); - background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%); - background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 ); - background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%); + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee)); + background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%); + background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0); + background-image: linear-gradient(top, #fff 0%, #eee 50%); } .select2-dropdown-open.select2-drop-above .select2-choice, @@ -1301,13 +1247,11 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 border: 1px solid #5897fb; border-top-color: transparent; - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, white), color-stop(0.5, #eeeeee)); - background-image: -webkit-linear-gradient(center top, white 0%, #eeeeee 50%); - background-image: -moz-linear-gradient(center top, white 0%, #eeeeee 50%); - background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: -ms-linear-gradient(bottom, #ffffff 0%,#eeeeee 50%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 ); - background-image: linear-gradient(bottom, #ffffff 0%,#eeeeee 50%); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee)); + background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%); + background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0); + background-image: linear-gradient(bottom, #fff 0%, #eee 50%); } .select2-dropdown-open .select2-choice .select2-arrow { @@ -1327,7 +1271,7 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 position: relative; overflow-x: hidden; overflow-y: auto; - -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .select2-results ul.select2-result-sub { @@ -1362,7 +1306,6 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 -webkit-touch-callout: none; -webkit-user-select: none; - -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; @@ -1383,7 +1326,7 @@ Version: 3.4.1 Timestamp: Thu Jun 27 18:02:10 PDT 2013 } .select2-results .select2-highlighted ul { - background: white; + background: #fff; color: #000; } @@ -1457,12 +1400,10 @@ disabled look for disabled choices in the results dropdown overflow: hidden; background-color: #fff; - background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); - background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); - background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); - background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); - background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); - background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff)); + background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%); + background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%); + background-image: linear-gradient(top, #eee 1%, #fff 15%); } .select2-locked { @@ -1477,9 +1418,8 @@ disabled look for disabled choices in the results dropdown border: 1px solid #5897fb; outline: none; - -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3); - -moz-box-shadow: 0 0 5px rgba(0,0,0,.3); - box-shadow: 0 0 5px rgba(0,0,0,.3); + -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3); + box-shadow: 0 0 5px rgba(0, 0, 0, .3); } .select2-container-multi .select2-choices li { float: left; @@ -1501,7 +1441,6 @@ disabled look for disabled choices in the results dropdown outline: 0; border: 0; -webkit-box-shadow: none; - -moz-box-shadow: none; box-shadow: none; background: transparent !important; } @@ -1524,33 +1463,25 @@ disabled look for disabled choices in the results dropdown cursor: default; border: 1px solid #aaaaaa; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; + border-radius: 3px; - -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); - -moz-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); - box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); + -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05); + box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; + background-clip: padding-box; -webkit-touch-callout: none; -webkit-user-select: none; - -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; background-color: #e4e4e4; - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0 ); - background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); - background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); - background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); - background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); - background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); - background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee)); + background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); + background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); + background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); } .select2-container-multi .select2-choices .select2-search-choice .select2-chosen { cursor: default; @@ -1584,7 +1515,7 @@ disabled look for disabled choices in the results dropdown } /* disabled styles */ -.select2-container-multi.select2-container-disabled .select2-choices{ +.select2-container-multi.select2-container-disabled .select2-choices { background-color: #f4f4f4; background-image: none; border: 1px solid #ddd; @@ -1599,7 +1530,7 @@ disabled look for disabled choices in the results dropdown } .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none; - background:none; + background: none; } /* end multiselect */ @@ -1610,16 +1541,17 @@ disabled look for disabled choices in the results dropdown } .select2-offscreen, .select2-offscreen:focus { - clip: rect(0 0 0 0); - width: 1px; - height: 1px; - border: 0; - margin: 0; - padding: 0; - overflow: hidden; - position: absolute; - outline: 0; - left: 0px; + clip: rect(0 0 0 0) !important; + width: 1px !important; + height: 1px !important; + border: 0 !important; + margin: 0 !important; + padding: 0 !important; + overflow: hidden !important; + position: absolute !important; + outline: 0 !important; + left: 0px !important; + top: 0px !important; } .select2-display-none { @@ -1647,6 +1579,93 @@ disabled look for disabled choices in the results dropdown } } +.form-control .select2-choice { + border: 0; + border-radius: 2px; +} + +.form-control .select2-choice .select2-arrow { + border-radius: 0 2px 2px 0; +} + +.form-control.select2-container { + height: auto !important; + padding: 0px; +} + +.form-control.select2-container.select2-dropdown-open { + border-color: #5897FB; + border-radius: 3px 3px 0 0; +} + +.form-control .select2-container.select2-dropdown-open .select2-choices { + border-radius: 3px 3px 0 0; +} + +.form-control.select2-container .select2-choices { + border: 0 !important; + border-radius: 3px; +} + +.control-group.warning .select2-container .select2-choice, +.control-group.warning .select2-container .select2-choices, +.control-group.warning .select2-container-active .select2-choice, +.control-group.warning .select2-container-active .select2-choices, +.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice, +.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices, +.control-group.warning .select2-container-multi.select2-container-active .select2-choices { + border: 1px solid #C09853 !important; +} + +.control-group.warning .select2-container .select2-choice div { + border-left: 1px solid #C09853 !important; + background: #FCF8E3 !important; +} + +.control-group.error .select2-container .select2-choice, +.control-group.error .select2-container .select2-choices, +.control-group.error .select2-container-active .select2-choice, +.control-group.error .select2-container-active .select2-choices, +.control-group.error .select2-dropdown-open.select2-drop-above .select2-choice, +.control-group.error .select2-dropdown-open.select2-drop-above .select2-choices, +.control-group.error .select2-container-multi.select2-container-active .select2-choices { + border: 1px solid #B94A48 !important; +} + +.control-group.error .select2-container .select2-choice div { + border-left: 1px solid #B94A48 !important; + background: #F2DEDE !important; +} + +.control-group.info .select2-container .select2-choice, +.control-group.info .select2-container .select2-choices, +.control-group.info .select2-container-active .select2-choice, +.control-group.info .select2-container-active .select2-choices, +.control-group.info .select2-dropdown-open.select2-drop-above .select2-choice, +.control-group.info .select2-dropdown-open.select2-drop-above .select2-choices, +.control-group.info .select2-container-multi.select2-container-active .select2-choices { + border: 1px solid #3A87AD !important; +} + +.control-group.info .select2-container .select2-choice div { + border-left: 1px solid #3A87AD !important; + background: #D9EDF7 !important; +} + +.control-group.success .select2-container .select2-choice, +.control-group.success .select2-container .select2-choices, +.control-group.success .select2-container-active .select2-choice, +.control-group.success .select2-container-active .select2-choices, +.control-group.success .select2-dropdown-open.select2-drop-above .select2-choice, +.control-group.success .select2-dropdown-open.select2-drop-above .select2-choices, +.control-group.success .select2-container-multi.select2-container-active .select2-choices { + border: 1px solid #468847 !important; +} + +.control-group.success .select2-container .select2-choice div { + border-left: 1px solid #468847 !important; + background: #DFF0D8 !important; +} /** initial setup **/ .nano { @@ -1765,14 +1784,13 @@ disabled look for disabled choices in the results dropdown background-color: rgba(0, 0, 0, 0.4); } - /* Magnific Popup CSS */ .mfp-bg { top: 0; left: 0; width: 100%; height: 100%; - z-index: 502; + z-index: 1042; overflow: hidden; position: fixed; background: #0b0b0b; @@ -1784,13 +1802,12 @@ disabled look for disabled choices in the results dropdown left: 0; width: 100%; height: 100%; - z-index: 503; + z-index: 1043; position: fixed; outline: none !important; -webkit-backface-visibility: hidden; } .mfp-container { - height: 100%; text-align: center; position: absolute; width: 100%; @@ -1817,25 +1834,20 @@ disabled look for disabled choices in the results dropdown vertical-align: middle; margin: 0 auto; text-align: left; - z-index: 505; } + z-index: 1045; } -.mfp-inline-holder .mfp-content, -.mfp-ajax-holder .mfp-content { +.mfp-inline-holder .mfp-content, .mfp-ajax-holder .mfp-content { width: 100%; cursor: auto; } .mfp-ajax-cur { cursor: progress; } -.mfp-zoom-out-cur { +.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close { cursor: -moz-zoom-out; cursor: -webkit-zoom-out; cursor: zoom-out; } -.mfp-zoom-out-cur, -.mfp-zoom-out-cur .mfp-image-holder .mfp-close { - cursor: pointer; } - .mfp-zoom { cursor: pointer; cursor: -webkit-zoom-in; @@ -1845,10 +1857,7 @@ disabled look for disabled choices in the results dropdown .mfp-auto-cursor .mfp-content { cursor: auto; } -.mfp-close, -.mfp-arrow, -.mfp-preloader, -.mfp-counter { +.mfp-close, .mfp-arrow, .mfp-preloader, .mfp-counter { -webkit-user-select: none; -moz-user-select: none; user-select: none; } @@ -1868,13 +1877,11 @@ disabled look for disabled choices in the results dropdown margin-top: -0.8em; left: 8px; right: 8px; - z-index: 504; } - -.mfp-preloader a { - color: #cccccc; } - -.mfp-preloader a:hover { - color: white; } + z-index: 1044; } + .mfp-preloader a { + color: #cccccc; } + .mfp-preloader a:hover { + color: white; } .mfp-s-ready .mfp-preloader { display: none; } @@ -1882,17 +1889,18 @@ disabled look for disabled choices in the results dropdown .mfp-s-error .mfp-content { display: none; } -button.mfp-close, -button.mfp-arrow { +button.mfp-close, button.mfp-arrow { overflow: visible; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; display: block; + outline: none; padding: 0; - z-index: 506; } - + z-index: 1046; + -webkit-box-shadow: none; + box-shadow: none; } button::-moz-focus-inner { padding: 0; border: 0; } @@ -1920,8 +1928,7 @@ button::-moz-focus-inner { .mfp-close-btn-in .mfp-close { color: #333333; } -.mfp-image-holder .mfp-close, -.mfp-iframe-holder .mfp-close { +.mfp-image-holder .mfp-close, .mfp-iframe-holder .mfp-close { color: white; right: -6px; text-align: right; @@ -1938,7 +1945,6 @@ button::-moz-focus-inner { .mfp-arrow { position: absolute; - top: 0; opacity: 0.65; margin: 0; top: 50%; @@ -1947,85 +1953,70 @@ button::-moz-focus-inner { width: 90px; height: 110px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } - -.mfp-arrow:active { - margin-top: -54px; } - -.mfp-arrow:hover, -.mfp-arrow:focus { - opacity: 1; } - -.mfp-arrow:before, .mfp-arrow:after, -.mfp-arrow .mfp-b, -.mfp-arrow .mfp-a { - content: ''; - display: block; - width: 0; - height: 0; - position: absolute; - left: 0; - top: 0; - margin-top: 35px; - margin-left: 35px; - border: solid transparent; } -.mfp-arrow:after, -.mfp-arrow .mfp-a { - opacity: 0.8; - border-top-width: 12px; - border-bottom-width: 12px; - top: 8px; } -.mfp-arrow:before, -.mfp-arrow .mfp-b { - border-top-width: 20px; - border-bottom-width: 20px; } + .mfp-arrow:active { + margin-top: -54px; } + .mfp-arrow:hover, .mfp-arrow:focus { + opacity: 1; } + .mfp-arrow:before, .mfp-arrow:after, .mfp-arrow .mfp-b, .mfp-arrow .mfp-a { + content: ''; + display: block; + width: 0; + height: 0; + position: absolute; + left: 0; + top: 0; + margin-top: 35px; + margin-left: 35px; + border: medium inset transparent; } + .mfp-arrow:after, .mfp-arrow .mfp-a { + border-top-width: 13px; + border-bottom-width: 13px; + top: 8px; } + .mfp-arrow:before, .mfp-arrow .mfp-b { + border-top-width: 21px; + border-bottom-width: 21px; } .mfp-arrow-left { left: 0; } - .mfp-arrow-left:after, - .mfp-arrow-left .mfp-a { - border-right: 12px solid black; - left: 5px; } - .mfp-arrow-left:before, - .mfp-arrow-left .mfp-b { - border-right: 20px solid white; } + .mfp-arrow-left:after, .mfp-arrow-left .mfp-a { + border-right: 17px solid white; + margin-left: 31px; } + .mfp-arrow-left:before, .mfp-arrow-left .mfp-b { + margin-left: 25px; + border-right: 27px solid #3f3f3f; } .mfp-arrow-right { right: 0; } - .mfp-arrow-right:after, - .mfp-arrow-right .mfp-a { - border-left: 12px solid black; - left: 3px; } - .mfp-arrow-right:before, - .mfp-arrow-right .mfp-b { - border-left: 20px solid white; } + .mfp-arrow-right:after, .mfp-arrow-right .mfp-a { + border-left: 17px solid white; + margin-left: 39px; } + .mfp-arrow-right:before, .mfp-arrow-right .mfp-b { + border-left: 27px solid #3f3f3f; } .mfp-iframe-holder { padding-top: 40px; padding-bottom: 40px; } - -.mfp-iframe-holder .mfp-content { - line-height: 0; - width: 100%; - max-width: 900px; } + .mfp-iframe-holder .mfp-content { + line-height: 0; + width: 100%; + max-width: 900px; } + .mfp-iframe-holder .mfp-close { + top: -40px; } .mfp-iframe-scaler { width: 100%; height: 0; overflow: hidden; padding-top: 56.25%; } - -.mfp-iframe-scaler iframe { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); - background: black; } - -.mfp-iframe-holder .mfp-close { - top: -40px; } + .mfp-iframe-scaler iframe { + position: absolute; + display: block; + top: 0; + left: 0; + width: 100%; + height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); + background: black; } /* Main image in popup */ img.mfp-img { @@ -2041,21 +2032,26 @@ img.mfp-img { margin: 0 auto; } /* The shadow behind the image */ -.mfp-figure:after { - content: ''; - position: absolute; - left: 0; - top: 40px; - bottom: 40px; - display: block; - right: 0; - width: auto; - height: auto; - z-index: -1; - box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); } - .mfp-figure { line-height: 0; } + .mfp-figure:after { + content: ''; + position: absolute; + left: 0; + top: 40px; + bottom: 40px; + display: block; + right: 0; + width: auto; + height: auto; + z-index: -1; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); + background: #444444; } + .mfp-figure small { + color: #bdbdbd; + display: block; + font-size: 12px; + line-height: 14px; } .mfp-bottom-bar { margin-top: -36px; @@ -2069,15 +2065,9 @@ img.mfp-img { text-align: left; line-height: 18px; color: #f3f3f3; - word-break: break-word; + word-wrap: break-word; padding-right: 36px; } -.mfp-figure small { - color: #bdbdbd; - display: block; - font-size: 12px; - line-height: 14px; } - .mfp-image-holder .mfp-content { max-width: 100%; } @@ -2086,20 +2076,21 @@ img.mfp-img { @media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) { /** - * Remove all paddings around the image on small screen - */ + * Remove all paddings around the image on small screen + */ .mfp-img-mobile .mfp-image-holder { padding-left: 0; padding-right: 0; } - .mfp-img-mobile img.mfp-img { padding: 0; } - - /* The shadow behind the image */ - .mfp-img-mobile .mfp-figure:after { - top: 0; - bottom: 0; } - + .mfp-img-mobile .mfp-figure { + /* The shadow behind the image */ } + .mfp-img-mobile .mfp-figure:after { + top: 0; + bottom: 0; } + .mfp-img-mobile .mfp-figure small { + display: inline; + margin-left: 5px; } .mfp-img-mobile .mfp-bottom-bar { background: rgba(0, 0, 0, 0.6); bottom: 0; @@ -2110,14 +2101,11 @@ img.mfp-img { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } - - .mfp-img-mobile .mfp-bottom-bar:empty { - padding: 0; } - + .mfp-img-mobile .mfp-bottom-bar:empty { + padding: 0; } .mfp-img-mobile .mfp-counter { right: 5px; top: 3px; } - .mfp-img-mobile .mfp-close { top: 0; right: 0; @@ -2127,27 +2115,22 @@ img.mfp-img { background: rgba(0, 0, 0, 0.6); position: fixed; text-align: center; - padding: 0; } + padding: 0; } } - .mfp-img-mobile .mfp-figure small { - display: inline; - margin-left: 5px; } } -@media all and (max-width: 800px) { +@media all and (max-width: 900px) { .mfp-arrow { -webkit-transform: scale(0.75); transform: scale(0.75); } - .mfp-arrow-left { -webkit-transform-origin: 0; transform-origin: 0; } - .mfp-arrow-right { -webkit-transform-origin: 100%; transform-origin: 100%; } - .mfp-container { padding-left: 6px; padding-right: 6px; } } + .mfp-ie7 .mfp-img { padding: 0; } .mfp-ie7 .mfp-bottom-bar { @@ -2165,14 +2148,15 @@ img.mfp-img { right: 0; padding-top: 0; } + /* overlay at start */ .mfp-fade.mfp-bg { opacity: 0; - -webkit-transition: all 0.15s ease-out; - -moz-transition: all 0.15s ease-out; - transition: all 0.15s ease-out; + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; } /* overlay animate in */ .mfp-fade.mfp-bg.mfp-ready { @@ -2190,75 +2174,26 @@ img.mfp-img { -webkit-transition: all 0.15s ease-out; -moz-transition: all 0.15s ease-out; transition: all 0.15s ease-out; + + -webkit-transform: translateX(-50px); + -moz-transform: translateX(-50px); + transform: translateX(-50px); } + /* content animate it */ .mfp-fade.mfp-wrap.mfp-ready .mfp-content { opacity: 1; + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + transform: translateX(0); } /* content animate out */ .mfp-fade.mfp-wrap.mfp-removing .mfp-content { opacity: 0; + -webkit-transform: translateX(50px); + -moz-transform: translateX(50px); + transform: translateX(50px); } - -/** - * Fade-zoom animation for first dialog - */ - -/* start state */ -.my-mfp-zoom-in .zoom-anim-dialog { - opacity: 0; - - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; - - -webkit-transform: scale(0.8); - -moz-transform: scale(0.8); - -ms-transform: scale(0.8); - -o-transform: scale(0.8); - transform: scale(0.8); -} - -/* animate in */ -.my-mfp-zoom-in.mfp-ready .zoom-anim-dialog { - opacity: 1; - - -webkit-transform: scale(1); - -moz-transform: scale(1); - -ms-transform: scale(1); - -o-transform: scale(1); - transform: scale(1); -} - -/* animate out */ -.my-mfp-zoom-in.mfp-removing .zoom-anim-dialog { - -webkit-transform: scale(0.8); - -moz-transform: scale(0.8); - -ms-transform: scale(0.8); - -o-transform: scale(0.8); - transform: scale(0.8); - - opacity: 0; -} - -/* Dark overlay, start state */ -.my-mfp-zoom-in.mfp-bg { - opacity: 0; - -webkit-transition: opacity 0.3s ease-out; - -moz-transition: opacity 0.3s ease-out; - -o-transition: opacity 0.3s ease-out; - transition: opacity 0.3s ease-out; -} -/* animate in */ -.my-mfp-zoom-in.mfp-ready.mfp-bg { - opacity: 0.8; -} -/* animate out */ -.my-mfp-zoom-in.mfp-removing.mfp-bg { - opacity: 0; -} - .simple-pace { -webkit-pointer-events: none; @@ -2331,7 +2266,6 @@ img.mfp-img { 0% { transform: none; transform: none; } 100% { transform: translate(-32px, 0); transform: translate(-32px, 0); } } - .flag-wrapper { width: 24px; height: 16px; @@ -2365,7 +2299,7 @@ img.mfp-img { .flag.flag-pt, .flag.flag-pt-pt {background-position: -112px -121px} .flag.flag-pt-br {background-position: -192px -11px} - +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ .clearfix { *zoom: 1; } @@ -5767,6 +5701,9 @@ select { .alert.alert-null-left-margin { margin-left: 0; } +.alert.alert-error a { + color: #b94a48; +} html.no-rgba .modal { border-width: 0px !important; } @@ -5978,9 +5915,19 @@ html.rgba .g-ui-resizable-delimiter-highlight { opacity: 1; filter: alpha(opacity=100); } -* { - outline: none; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +.settings-saved-trigger-input.success { + border-color: green !important; + -webkit-transition: border-color 0.5s linear; + -moz-transition: border-color 0.5s linear; + -o-transition: border-color 0.5s linear; + transition: border-color 0.5s linear; +} +.settings-saved-trigger-input.error { + border-color: red !important; + -webkit-transition: border-color 0.5s linear; + -moz-transition: border-color 0.5s linear; + -o-transition: border-color 0.5s linear; + transition: border-color 0.5s linear; } html { margin: 0; @@ -6020,6 +5967,15 @@ body:before { -moz-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.6); box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.6); } +* { + outline: none; +} +select:focus { + outline: none; +} +html.mobile * { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} #rl-content { height: 100%; width: 100%; @@ -6145,22 +6101,19 @@ html.rl-no-preview-pane #rl-right .ui-resizable-handle { position: absolute; font: 30px Tahoma; top: 50%; - left: 50%; - width: 120px; - height: 60px; + width: 100%; + height: 65px; margin: 0; margin-top: -60px; - margin-left: -25px; background-color: transparent; background-repeat: no-repeat; - background-position: 40px 40px; + background-position: center 50px; background-image: url('images/loader-black.gif'); + text-align: center; color: #000; } #rl-loading-error { background-image: none; - width: 600px; - margin-left: -200px; display: none; } /** diff --git a/rainloop/v/0.0.0/static/css/app.min.css b/rainloop/v/0.0.0/static/css/app.min.css new file mode 100644 index 000000000..d8b12f736 --- /dev/null +++ b/rainloop/v/0.0.0/static/css/app.min.css @@ -0,0 +1,4 @@ +/*! jQuery UI - v1.10.3 - 2013-11-02 +* http://jqueryui.com +* Includes: jquery.ui.core.css, jquery.ui.resizable.css +* Copyright 2013 jQuery Foundation and other contributors; Licensed under MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}/*! normalize.css 2012-03-11T12:53 UTC - http://github.com/necolas/normalize.css */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:hover,a:active{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.75em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:1em 40px}dfn{font-style:italic}mark{background:#ff0;color:#000}p,pre{margin:1em 0}pre,code,kbd,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:75%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@font-face{font-family:icomoon;src:url(fonts/icomoon.eot);src:url(fonts/icomoon.eot?#iefix) format('embedded-opentype'),url(fonts/icomoon.woff) format('woff'),url(fonts/icomoon.ttf) format('truetype'),url(fonts/icomoon.svg#icomoon) format('svg');font-weight:400;font-style:normal}[data-icon]:before{font-family:icomoon;content:attr(data-icon);speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased}.icon-paperplane,.icon-reply,.icon-reply-all,.icon-forward,.icon-search,.icon-add-to-list,.icon-info,.icon-arrow-right,.icon-arrow-down,.icon-ellipsis,.icon-pencil,.icon-image,.icon-music,.icon-film,.icon-print,.icon-calendar,.icon-key,.icon-cog,.icon-fire,.icon-rocket,.icon-checkbox-checked,.icon-checkbox-unchecked,.icon-checkbox-partial,.icon-radio-checked,.icon-radio-unchecked,.icon-google,.icon-google-plus,.icon-facebook,.icon-twitter,.icon-youtube,.icon-file-pdf,.icon-file-word,.icon-file-excel,.icon-file-powerpoint,.icon-file-xml,.icon-file-css,.icon-warning,.icon-switch,.icon-wrench,.icon-remove,.icon-ok,.icon-plus,.icon-minus,.icon-attachment,.icon-arrow-left,.icon-arrow-up--upload,.icon-arrow-right-2,.icon-arrow-down-2,.icon-file,.icon-file-zip,.icon-console,.icon-floppy,.icon-user,.icon-envelope,.icon-user-add,.icon-eye,.icon-arrow-right-3,.icon-arrow-down-3,.icon-facebook-2,.icon-spinner,.icon-lightning,.icon-trash,.icon-download,.icon-upload,.icon-settings5,.icon-bug,.icon-libreoffice,.icon-file-openoffice,.icon-google-drive,.icon-edit2,.icon-phonebook,.icon-book,.icon-spinner-2,.icon-bell,.icon-cart,.icon-cog-2,.icon-legacyfilemanager,.icon-favorite,.icon-favorite2,.icon-loved,.icon-love,.icon-scaleup,.icon-scaledown,.icon-opennewwindow,.icon-repeat,.icon-reorder,.icon-skype,.icon-dropbox{font-family:icomoon;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased}.icon-paperplane:before{content:"\e000"}.icon-reply:before{content:"\e001"}.icon-reply-all:before{content:"\e002"}.icon-forward:before{content:"\e003"}.icon-search:before{content:"\e004"}.icon-add-to-list:before{content:"\e005"}.icon-info:before{content:"\e006"}.icon-arrow-right:before{content:"\e007"}.icon-arrow-down:before{content:"\e008"}.icon-ellipsis:before{content:"\e009"}.icon-pencil:before{content:"\e00a"}.icon-image:before{content:"\e00b"}.icon-music:before{content:"\e00c"}.icon-film:before{content:"\e00d"}.icon-print:before{content:"\e00e"}.icon-calendar:before{content:"\e00f"}.icon-key:before{content:"\e010"}.icon-cog:before{content:"\e011"}.icon-fire:before{content:"\e012"}.icon-rocket:before{content:"\e013"}.icon-checkbox-checked:before{content:"\e014"}.icon-checkbox-unchecked:before{content:"\e015"}.icon-checkbox-partial:before{content:"\e016"}.icon-radio-checked:before{content:"\e017"}.icon-radio-unchecked:before{content:"\e018"}.icon-google:before{content:"\e019"}.icon-google-plus:before{content:"\e01a"}.icon-facebook:before{content:"\e01b"}.icon-twitter:before{content:"\e01c"}.icon-youtube:before{content:"\e01d"}.icon-file-pdf:before{content:"\e01e"}.icon-file-word:before{content:"\e01f"}.icon-file-excel:before{content:"\e020"}.icon-file-powerpoint:before{content:"\e021"}.icon-file-xml:before{content:"\e022"}.icon-file-css:before{content:"\e023"}.icon-warning:before{content:"\e024"}.icon-switch:before{content:"\e025"}.icon-wrench:before{content:"\e026"}.icon-remove:before{content:"\e027"}.icon-ok:before{content:"\e028"}.icon-plus:before{content:"\e029"}.icon-minus:before{content:"\e02a"}.icon-attachment:before{content:"\e02b"}.icon-arrow-left:before{content:"\e02c"}.icon-arrow-up--upload:before{content:"\e02d"}.icon-arrow-right-2:before{content:"\e02e"}.icon-arrow-down-2:before{content:"\e02f"}.icon-file:before{content:"\e030"}.icon-file-zip:before{content:"\e031"}.icon-console:before{content:"\e032"}.icon-floppy:before{content:"\e033"}.icon-user:before{content:"\e034"}.icon-envelope:before{content:"\e035"}.icon-user-add:before{content:"\e036"}.icon-eye:before{content:"\e037"}.icon-arrow-right-3:before{content:"\e038"}.icon-arrow-down-3:before{content:"\e039"}.icon-facebook-2:before{content:"\e03a"}.icon-spinner:before{content:"\e03b"}.icon-lightning:before{content:"\e03c"}.icon-trash:before{content:"\e03d"}.icon-download:before{content:"\e03e"}.icon-upload:before{content:"\e03f"}.icon-settings5:before{content:"\e040"}.icon-bug:before{content:"\e041"}.icon-libreoffice:before{content:"\e042"}.icon-file-openoffice:before{content:"\e043"}.icon-google-drive:before{content:"\e044"}.icon-edit2:before{content:"\e045"}.icon-phonebook:before{content:"\e046"}.icon-book:before{content:"\e047"}.icon-spinner-2:before{content:"\e048"}.icon-bell:before{content:"\e049"}.icon-cart:before{content:"\e04a"}.icon-cog-2:before{content:"\e04b"}.icon-legacyfilemanager:before{content:"\e04c"}.icon-favorite:before{content:"\e04d"}.icon-favorite2:before{content:"\e04e"}.icon-loved:before{content:"\e04f"}.icon-love:before{content:"\e050"}.icon-scaleup:before{content:"\e051"}.icon-scaledown:before{content:"\e052"}.icon-opennewwindow:before{content:"\e053"}.icon-repeat:before{content:"\e054"}.icon-reorder:before{content:"\e055"}.icon-skype:before{content:"\e056"}.icon-dropbox:before{content:"\e057"}.select2-container{margin:0;position:relative;display:inline-block;zoom:1;*display:inline;vertical-align:middle}.select2-container,.select2-drop,.select2-search,.select2-search input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.select2-container .select2-choice{display:block;height:26px;padding:0 0 0 8px;overflow:hidden;position:relative;border:1px solid #aaa;white-space:nowrap;line-height:26px;color:#444;text-decoration:none;border-radius:4px;background-clip:padding-box;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#eee),color-stop(0.5,#fff));background-image:-webkit-linear-gradient(center bottom,#eee 0,#fff 50%);background-image:-moz-linear-gradient(center bottom,#eee 0,#fff 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);background-image:linear-gradient(top,#fff 0,#eee 50%)}.select2-container.select2-drop-above .select2-choice{border-bottom-color:#aaa;border-radius:0 0 4px 4px;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#eee),color-stop(0.9,#fff));background-image:-webkit-linear-gradient(center bottom,#eee 0,#fff 90%);background-image:-moz-linear-gradient(center bottom,#eee 0,#fff 90%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);background-image:linear-gradient(top,#eee 0,#fff 90%)}.select2-container.select2-allowclear .select2-choice .select2-chosen{margin-right:42px}.select2-container .select2-choice>.select2-chosen{margin-right:26px;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.select2-container .select2-choice abbr{display:none;width:12px;height:12px;position:absolute;right:24px;top:8px;font-size:1px;text-decoration:none;border:0;background:url(select2.png) right top no-repeat;cursor:pointer;outline:0}.select2-container.select2-allowclear .select2-choice abbr{display:inline-block}.select2-container .select2-choice abbr:hover{background-position:right -11px;cursor:pointer}.select2-drop-mask{border:0;margin:0;padding:0;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:9998;background-color:#fff;filter:alpha(opacity=0)}.select2-drop{width:100%;margin-top:-1px;position:absolute;z-index:9999;top:100%;background:#fff;color:#000;border:1px solid #aaa;border-top:0;border-radius:0 0 4px 4px;-webkit-box-shadow:0 4px 5px rgba(0,0,0,.15);box-shadow:0 4px 5px rgba(0,0,0,.15)}.select2-drop-auto-width{border-top:1px solid #aaa;width:auto}.select2-drop-auto-width .select2-search{padding-top:4px}.select2-drop.select2-drop-above{margin-top:1px;border-top:1px solid #aaa;border-bottom:0;border-radius:4px 4px 0 0;-webkit-box-shadow:0 -4px 5px rgba(0,0,0,.15);box-shadow:0 -4px 5px rgba(0,0,0,.15)}.select2-drop-active{border:1px solid #5897fb;border-top:0}.select2-drop.select2-drop-above.select2-drop-active{border-top:1px solid #5897fb}.select2-container .select2-choice .select2-arrow{display:inline-block;width:18px;height:100%;position:absolute;right:0;top:0;border-left:1px solid #aaa;border-radius:0 4px 4px 0;background-clip:padding-box;background:#ccc;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#ccc),color-stop(0.6,#eee));background-image:-webkit-linear-gradient(center bottom,#ccc 0,#eee 60%);background-image:-moz-linear-gradient(center bottom,#ccc 0,#eee 60%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#cccccc', GradientType=0);background-image:linear-gradient(top,#ccc 0,#eee 60%)}.select2-container .select2-choice .select2-arrow b{display:block;width:100%;height:100%;background:url(select2.png) no-repeat 0 1px}.select2-search{display:inline-block;width:100%;min-height:26px;margin:0;padding-left:4px;padding-right:4px;position:relative;z-index:10000;white-space:nowrap}.select2-search input{width:100%;height:auto!important;min-height:26px;padding:4px 20px 4px 5px;margin:0;outline:0;font-family:sans-serif;font-size:1em;border:1px solid #aaa;border-radius:0;-webkit-box-shadow:none;box-shadow:none;background:#fff url(select2.png) no-repeat 100% -22px;background:url(select2.png) no-repeat 100% -22px,-webkit-gradient(linear,left bottom,left top,color-stop(0.85,#fff),color-stop(0.99,#eee));background:url(select2.png) no-repeat 100% -22px,-webkit-linear-gradient(center bottom,#fff 85%,#eee 99%);background:url(select2.png) no-repeat 100% -22px,-moz-linear-gradient(center bottom,#fff 85%,#eee 99%);background:url(select2.png) no-repeat 100% -22px,linear-gradient(top,#fff 85%,#eee 99%)}.select2-drop.select2-drop-above .select2-search input{margin-top:4px}.select2-search input.select2-active{background:#fff url(select2-spinner.gif) no-repeat 100%;background:url(select2-spinner.gif) no-repeat 100%,-webkit-gradient(linear,left bottom,left top,color-stop(0.85,#fff),color-stop(0.99,#eee));background:url(select2-spinner.gif) no-repeat 100%,-webkit-linear-gradient(center bottom,#fff 85%,#eee 99%);background:url(select2-spinner.gif) no-repeat 100%,-moz-linear-gradient(center bottom,#fff 85%,#eee 99%);background:url(select2-spinner.gif) no-repeat 100%,linear-gradient(top,#fff 85%,#eee 99%)}.select2-container-active .select2-choice,.select2-container-active .select2-choices{border:1px solid #5897fb;outline:0;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.select2-dropdown-open .select2-choice{border-bottom-color:transparent;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;border-bottom-left-radius:0;border-bottom-right-radius:0;background-color:#eee;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#fff),color-stop(0.5,#eee));background-image:-webkit-linear-gradient(center bottom,#fff 0,#eee 50%);background-image:-moz-linear-gradient(center bottom,#fff 0,#eee 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);background-image:linear-gradient(top,#fff 0,#eee 50%)}.select2-dropdown-open.select2-drop-above .select2-choice,.select2-dropdown-open.select2-drop-above .select2-choices{border:1px solid #5897fb;border-top-color:transparent;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(0.5,#eee));background-image:-webkit-linear-gradient(center top,#fff 0,#eee 50%);background-image:-moz-linear-gradient(center top,#fff 0,#eee 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);background-image:linear-gradient(bottom,#fff 0,#eee 50%)}.select2-dropdown-open .select2-choice .select2-arrow{background:transparent;border-left:0;filter:none}.select2-dropdown-open .select2-choice .select2-arrow b{background-position:-18px 1px}.select2-results{max-height:200px;padding:0 0 0 4px;margin:4px 4px 4px 0;position:relative;overflow-x:hidden;overflow-y:auto;-webkit-tap-highlight-color:rgba(0,0,0,0)}.select2-results ul.select2-result-sub{margin:0;padding-left:0}.select2-results ul.select2-result-sub>li .select2-result-label{padding-left:20px}.select2-results ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:40px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:60px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:80px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:100px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:110px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:120px}.select2-results li{list-style:none;display:list-item;background-image:none}.select2-results li.select2-result-with-children>.select2-result-label{font-weight:700}.select2-results .select2-result-label{padding:3px 7px 4px;margin:0;cursor:pointer;min-height:1em;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select2-results .select2-highlighted{background:#3875d7;color:#fff}.select2-results li em{background:#feffde;font-style:normal}.select2-results .select2-highlighted em{background:transparent}.select2-results .select2-highlighted ul{background:#fff;color:#000}.select2-results .select2-no-results,.select2-results .select2-searching,.select2-results .select2-selection-limit{background:#f4f4f4;display:list-item}.select2-results .select2-disabled.select2-highlighted{color:#666;background:#f4f4f4;display:list-item;cursor:default}.select2-results .select2-disabled{background:#f4f4f4;display:list-item;cursor:default}.select2-results .select2-selected{display:none}.select2-more-results.select2-active{background:#f4f4f4 url(select2-spinner.gif) no-repeat 100%}.select2-more-results{background:#f4f4f4;display:list-item}.select2-container.select2-container-disabled .select2-choice{background-color:#f4f4f4;background-image:none;border:1px solid #ddd;cursor:default}.select2-container.select2-container-disabled .select2-choice .select2-arrow{background-color:#f4f4f4;background-image:none;border-left:0}.select2-container.select2-container-disabled .select2-choice abbr{display:none}.select2-container-multi .select2-choices{height:auto!important;height:1%;margin:0;padding:0;position:relative;border:1px solid #aaa;cursor:text;overflow:hidden;background-color:#fff;background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(1%,#eee),color-stop(15%,#fff));background-image:-webkit-linear-gradient(top,#eee 1%,#fff 15%);background-image:-moz-linear-gradient(top,#eee 1%,#fff 15%);background-image:linear-gradient(top,#eee 1%,#fff 15%)}.select2-locked{padding:3px 5px!important}.select2-container-multi .select2-choices{min-height:26px}.select2-container-multi.select2-container-active .select2-choices{border:1px solid #5897fb;outline:0;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.select2-container-multi .select2-choices li{float:left;list-style:none}.select2-container-multi .select2-choices .select2-search-field{margin:0;padding:0;white-space:nowrap}.select2-container-multi .select2-choices .select2-search-field input{padding:5px;margin:1px 0;font-family:sans-serif;font-size:100%;color:#666;outline:0;border:0;-webkit-box-shadow:none;box-shadow:none;background:transparent!important}.select2-container-multi .select2-choices .select2-search-field input.select2-active{background:#fff url(select2-spinner.gif) no-repeat 100%!important}.select2-default{color:#999!important}.select2-container-multi .select2-choices .select2-search-choice{padding:3px 5px 3px 18px;margin:3px 0 3px 5px;position:relative;line-height:13px;color:#333;cursor:default;border:1px solid #aaa;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);background-clip:padding-box;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#e4e4e4;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%)}.select2-container-multi .select2-choices .select2-search-choice .select2-chosen{cursor:default}.select2-container-multi .select2-choices .select2-search-choice-focus{background:#d4d4d4}.select2-search-choice-close{display:block;width:12px;height:13px;position:absolute;right:3px;top:4px;font-size:1px;outline:0;background:url(select2.png) right top no-repeat}.select2-container-multi .select2-search-choice-close{left:3px}.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover{background-position:right -11px}.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close{background-position:right -11px}.select2-container-multi.select2-container-disabled .select2-choices{background-color:#f4f4f4;background-image:none;border:1px solid #ddd;cursor:default}.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice{padding:3px 5px;border:1px solid #ddd;background-image:none;background-color:#f4f4f4}.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close{display:none;background:0}.select2-result-selectable .select2-match,.select2-result-unselectable .select2-match{text-decoration:underline}.select2-offscreen,.select2-offscreen:focus{clip:rect(0 0 0 0)!important;width:1px!important;height:1px!important;border:0!important;margin:0!important;padding:0!important;overflow:hidden!important;position:absolute!important;outline:0!important;left:0!important;top:0!important}.select2-display-none{display:none}.select2-measure-scrollbar{position:absolute;top:-10000px;left:-10000px;width:100px;height:100px;overflow:scroll}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:144dpi){.select2-search input,.select2-search-choice-close,.select2-container .select2-choice abbr,.select2-container .select2-choice .select2-arrow b{background-image:url(select2x2.png)!important;background-repeat:no-repeat!important;background-size:60px 40px!important}.select2-search input{background-position:100% -21px!important}}.form-control .select2-choice{border:0;border-radius:2px}.form-control .select2-choice .select2-arrow{border-radius:0 2px 2px 0}.form-control.select2-container{height:auto!important;padding:0}.form-control.select2-container.select2-dropdown-open{border-color:#5897FB;border-radius:3px 3px 0 0}.form-control .select2-container.select2-dropdown-open .select2-choices{border-radius:3px 3px 0 0}.form-control.select2-container .select2-choices{border:0!important;border-radius:3px}.control-group.warning .select2-container .select2-choice,.control-group.warning .select2-container .select2-choices,.control-group.warning .select2-container-active .select2-choice,.control-group.warning .select2-container-active .select2-choices,.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,.control-group.warning .select2-container-multi.select2-container-active .select2-choices{border:1px solid #C09853!important}.control-group.warning .select2-container .select2-choice div{border-left:1px solid #C09853!important;background:#FCF8E3!important}.control-group.error .select2-container .select2-choice,.control-group.error .select2-container .select2-choices,.control-group.error .select2-container-active .select2-choice,.control-group.error .select2-container-active .select2-choices,.control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,.control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,.control-group.error .select2-container-multi.select2-container-active .select2-choices{border:1px solid #B94A48!important}.control-group.error .select2-container .select2-choice div{border-left:1px solid #B94A48!important;background:#F2DEDE!important}.control-group.info .select2-container .select2-choice,.control-group.info .select2-container .select2-choices,.control-group.info .select2-container-active .select2-choice,.control-group.info .select2-container-active .select2-choices,.control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,.control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,.control-group.info .select2-container-multi.select2-container-active .select2-choices{border:1px solid #3A87AD!important}.control-group.info .select2-container .select2-choice div{border-left:1px solid #3A87AD!important;background:#D9EDF7!important}.control-group.success .select2-container .select2-choice,.control-group.success .select2-container .select2-choices,.control-group.success .select2-container-active .select2-choice,.control-group.success .select2-container-active .select2-choices,.control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,.control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,.control-group.success .select2-container-multi.select2-container-active .select2-choices{border:1px solid #468847!important}.control-group.success .select2-container .select2-choice div{border-left:1px solid #468847!important;background:#DFF0D8!important}.nano{overflow :hidden!important}.nano .content{position :absolute;overflow :scroll;top :0;right :0;bottom :0;left :0;-webkit-overflow-scrolling:touch}.nano .content .content-wrapper{height:100%}.nano .content::-webkit-scrollbar{visibility:hidden}.has-scrollbar .content::-webkit-scrollbar{visibility:hidden}.nano-visibility-hidden::-webkit-scrollbar{visibility:hidden}.nano>.pane{background :none;position :absolute;width :5px;right :0;top :1px;bottom :1px;opacity :.01;filter:alpha(opacity=1);-webkit-transition :.4s;-moz-transition :.4s;-o-transition :.4s;transition :.4s;-moz-border-radius :5px;-webkit-border-radius :5px;border-radius :5px;z-index:10000;margin :2px}.nano>.pane2{background :none;position :absolute;height :5px;right :1px;left :1px;bottom :0;opacity :.01;filter:alpha(opacity=1);-webkit-transition :.4s;-moz-transition :.4s;-o-transition :.4s;transition :.4s;-moz-border-radius :5px;-webkit-border-radius :5px;border-radius :5px;z-index:10000;margin :2px}.nano>.pane>.slider{background-color:#999;background-color:rgba(0,0,0,.3);position :relative;margin :0;-moz-border-radius :3px;-webkit-border-radius :3px;border-radius :3px;width :5px}.nano>.pane2>.slider2{background-color:#999;background-color:rgba(0,0,0,.3);position :relative;margin :0;-moz-border-radius :3px;-webkit-border-radius :3px;border-radius :3px;height :5px}.nano:hover>.pane,.nano:hover>.pane2,.pane.active,.pane2.active,.pane.flashed,.pane2.flashed{visibility :visible\9;opacity :.99;filter:alpha(opacity=99)}.nano>.pane:hover,.nano>.pane.active{background-color:rgba(0,0,0,.15)}.nano>.pane2:hover,.nano>.pane2.active{background-color:rgba(0,0,0,.15)}.nano>.pane:hover>.slider,.nano>.pane.active>.slider{background-color:rgba(0,0,0,.4)}.nano>.pane2:hover>.slider2,.nano>.pane2.active>.slider2{background-color:rgba(0,0,0,.4)}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#0b0b0b;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:0!important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{content:'';display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none!important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;display:block;outline:0;padding:0;z-index:1046;-webkit-box-shadow:none;box-shadow:none}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:.65;padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Arial,Baskerville,monospace}.mfp-close:hover,.mfp-close:focus{opacity:1}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#333}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-arrow{position:absolute;opacity:.65;margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1}.mfp-arrow:before,.mfp-arrow:after,.mfp-arrow .mfp-b,.mfp-arrow .mfp-a{content:'';display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset transparent}.mfp-arrow:after,.mfp-arrow .mfp-a{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before,.mfp-arrow .mfp-b{border-top-width:21px;border-bottom-width:21px}.mfp-arrow-left{left:0}.mfp-arrow-left:after,.mfp-arrow-left .mfp-a{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before,.mfp-arrow-left .mfp-b{margin-left:25px;border-right:27px solid #3f3f3f}.mfp-arrow-right{right:0}.mfp-arrow-right:after,.mfp-arrow-right .mfp-a{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before,.mfp-arrow-right .mfp-b{border-left:27px solid #3f3f3f}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:'';position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width:800px) and (orientation:landscape),screen and (max-height:300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure{}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width:900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}.mfp-fade.mfp-bg{opacity:0;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;transition:all .2s ease-out}.mfp-fade.mfp-bg.mfp-ready{opacity:.8}.mfp-fade.mfp-bg.mfp-removing{opacity:0}.mfp-fade.mfp-wrap .mfp-content{opacity:0;-webkit-transition:all .15s ease-out;-moz-transition:all .15s ease-out;transition:all .15s ease-out;-webkit-transform:translateX(-50px);-moz-transform:translateX(-50px);transform:translateX(-50px)}.mfp-fade.mfp-wrap.mfp-ready .mfp-content{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);transform:translateX(0)}.mfp-fade.mfp-wrap.mfp-removing .mfp-content{opacity:0;-webkit-transform:translateX(50px);-moz-transform:translateX(50px);transform:translateX(50px)}.simple-pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.simple-pace-inactive{display:none}.simple-pace .simple-pace-progress{background-color:#939595;position:fixed;z-index:2000;top:0;left:0;height:3px;overflow:hidden;-webkit-transition:width .5s;-moz-transition:width .5s;-o-transition:width .5s;transition:width .5s}.simple-pace .simple-pace-progress-inner{position:absolute;top:0;left:0;right:-32px;bottom:0;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.3)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.3)),color-stop(0.75,rgba(255,255,255,.3)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.3) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.3) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.3) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.3) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.3) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.3) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.3) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.3) 75%,transparent 75%,transparent);-webkit-background-size:32px 32px;-moz-background-size:32px 32px;-o-background-size:32px 32px;background-size:32px 32px;-webkit-animation:simple-pace-stripe-animation 500ms linear infinite;-moz-animation:simple-pace-stripe-animation 500ms linear infinite;-ms-animation:simple-pace-stripe-animation 500ms linear infinite;-o-animation:simple-pace-stripe-animation 500ms linear infinite;animation:simple-pace-stripe-animation 500ms linear infinite}@-webkit-keyframes simple-pace-stripe-animation{0%{-webkit-transform:none;transform:none}100%{-webkit-transform:translate(-32px,0);transform:translate(-32px,0)}}@-moz-keyframes simple-pace-stripe-animation{0%{-moz-transform:none;transform:none}100%{-moz-transform:translate(-32px,0);transform:translate(-32px,0)}}@-o-keyframes simple-pace-stripe-animation{0%{-o-transform:none;transform:none}100%{-o-transform:translate(-32px,0);transform:translate(-32px,0)}}@-ms-keyframes simple-pace-stripe-animation{0%{-ms-transform:none;transform:none}100%{-ms-transform:translate(-32px,0);transform:translate(-32px,0)}}@keyframes simple-pace-stripe-animation{0%{transform:none;transform:none}100%{transform:translate(-32px,0);transform:translate(-32px,0)}}.flag-wrapper{width:24px;height:16px;display:inline-block}.flag{width:16px;height:11px;display:inline-block;background:url(flags.png) no-repeat}.flag.flag-en{background-position:-144px -154px}.flag.flag-en-us{background-position:-144px -154px}.flag.flag-en-gb{background-position:-240px -33px}.flag.flag-en-ca{background-position:-48px -22px}.flag.flag-nl,.flag.flag-nl-nl{background-position:-80px -110px}.flag.flag-ru,.flag.flag-ru-ru{background-position:-224px -121px}.flag.flag-de,.flag.flag-de-de{background-position:-80px -33px}.flag.flag-it,.flag.flag-it-it{background-position:-208px -66px}.flag.flag-is,.flag.flag-is-is{background-position:-192px -66px}.flag.flag-lv,.flag.flag-lv-lv{background-position:-112px -88px}.flag.flag-fr,.flag.flag-fr-fr,.flag.flag-fr-ca{background-position:-144px -44px}.flag.flag-es,.flag.flag-es-es,.flag.flag-es-la{background-position:-16px -44px}.flag.flag-ja,.flag.flag-jp,.flag.flag-ja-jp{background-position:-16px -77px}.flag.flag-pt,.flag.flag-pt-pt{background-position:-112px -121px}.flag.flag-pt-br{background-position:-192px -11px}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;content:"";line-height:0}.row:after{clear:both}[class*=span]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*=span]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%}.row-fluid [class*=span]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*=span].hide,.row-fluid [class*=span].hide{display:none}[class*=span].pull-right,.row-fluid [class*=span].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:20px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:700}em{font-style:italic}cite{font-style:normal}.muted{color:#999}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:700;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:700}dd{margin-left:10px}.dl-horizontal dt{float:left;width:120px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:130px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:400;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],input[type=email],input[type=url],input[type=search],input[type=tel],input[type=color],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}input,textarea{width:210px}textarea{height:auto}textarea,input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],input[type=email],input[type=url],input[type=search],input[type=tel],input[type=color],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type=text]:focus,input[type=password]:focus,input[type=datetime]:focus,input[type=datetime-local]:focus,input[type=date]:focus,input[type=month]:focus,input[type=time]:focus,input[type=week]:focus,input[type=number]:focus,input[type=email]:focus,input[type=url]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=color]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type=radio],input[type=checkbox]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;cursor:pointer}input[type=file],input[type=image],input[type=submit],input[type=reset],input[type=button],input[type=radio],input[type=checkbox]{width:auto}select,input[type=file]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;border:1px solid #bbb;background-color:#fff}select[multiple],select[size]{height:auto}select:focus,input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.025);box-shadow:inset 0 1px 2px rgba(0,0,0,.025);cursor:not-allowed}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type=radio],.checkbox input[type=checkbox]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*=span],select[class*=span],textarea[class*=span],.uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span],.row-fluid .uneditable-input[class*=span]{float:none;margin-left:0}.input-append input[class*=span],.input-append .uneditable-input[class*=span],.input-prepend input[class*=span],.input-prepend .uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span],.row-fluid .uneditable-input[class*=span],.row-fluid .input-prepend [class*=span],.row-fluid .input-append [class*=span]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*=span]+[class*=span]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0}.controls-row:after{clear:both}.controls-row [class*=span]{float:left}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio][readonly],input[type=checkbox][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:400;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{margin-left:-1px;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type=radio],.form-search .checkbox input[type=checkbox],.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:160px}.form-horizontal .help-block{margin-top:10px;margin-bottom:0}.form-horizontal .form-actions{padding-left:160px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:700}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-right-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0}table .span1{float:none;width:44px;margin-left:0}table .span2{float:none;width:124px;margin-left:0}table .span3{float:none;width:204px;margin-left:0}table .span4{float:none;width:284px;margin-left:0}table .span5{float:none;width:364px;margin-left:0}table .span6{float:none;width:444px;margin-left:0}table .span7{float:none;width:524px;margin-left:0}table .span8{float:none;width:604px;margin-left:0}table .span9{float:none;width:684px;margin-left:0}table .span10{float:none;width:764px;margin-left:0}table .span11{float:none;width:844px;margin-left:0}table .span12{float:none;width:924px;margin-left:0}table .span13{float:none;width:1004px;margin-left:0}table .span14{float:none;width:1084px;margin-left:0}table .span15{float:none;width:1164px;margin-left:0}table .span16{float:none;width:1244px;margin-left:0}table .span17{float:none;width:1324px;margin-left:0}table .span18{float:none;width:1404px;margin-left:0}table .span19{float:none;width:1484px;margin-left:0}table .span20{float:none;width:1564px;margin-left:0}table .span21{float:none;width:1644px;margin-left:0}table .span22{float:none;width:1724px;margin-left:0}table .span23{float:none;width:1804px;margin-left:0}table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.info td{background-color:#d9edf7}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{text-decoration:none;color:#fff;background-color:#08c;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#08c;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:"\2191"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px;-moz-border-radius:0 6px 6px;border-radius:0 6px 6px}.dropdown-submenu:hover .dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#ccc;margin-top:5px;margin-right:-10px}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;overflow:visible \9;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:700;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 14px;margin-bottom:0;font-size:14px;line-height:20px;*line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border:1px solid #bbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^=icon-]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^=icon-]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:16px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,.15) rgba(0,0,0,.15) rgba(0,0,0,.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#04c;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#da4f49;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#49afcd;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#363636;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222 #222 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#222;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type=submit].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type=submit].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type=submit].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type=submit].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{border-color:transparent;cursor:pointer;color:#08c;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-group{position:relative;font-size:0;white-space:nowrap;*margin-left:.3em}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px}.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px}.dropup .btn-large .caret{border-bottom:5px solid #000;border-top:0}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-left:0;margin-top:-1px}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.modal-open .dropdown-menu{z-index:2050}.modal-open .dropdown.open{*z-index:2050}.modal-open .popover{z-index:2060}.modal-open .tooltip{z-index:2080}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,.3);box-shadow:0 3px 7px rgba(0,0,0,.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out;top:-25%}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{overflow-y:auto;max-height:400px;padding:15px}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;*zoom:1}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#eee;text-align:center;text-decoration:none;background-color:#333;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#333}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{content:"";z-index:-1}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#fff}.popover.top .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,.25);bottom:-1px;left:-11px}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-width:10px 10px 10px 0;border-right-color:#fff}.popover.right .arrow:after{border-width:11px 11px 11px 0;border-right-color:rgba(0,0,0,.25);bottom:-11px;left:-1px}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-width:0 10px 10px;border-bottom-color:#fff}.popover.bottom .arrow:after{border-width:0 11px 11px;border-bottom-color:rgba(0,0,0,.25);top:-1px;left:-11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-width:10px 0 10px 10px;border-left-color:#fff}.popover.left .arrow:after{border-width:11px 0 11px 11px;border-left-color:rgba(0,0,0,.25);bottom:-11px;right:-1px}.label,.badge{font-size:11.844px;font-weight:700;line-height:14px;color:#fff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.progress .bar{width:0;height:100%;color:#fff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:icomoon;src:url(fonts/icomoon.svg#icomoon) format('svg')}}[class^=icon-],[class*=" icon-"]{display:inline-block;width:16px;height:16px;line-height:16px;font-size:15px;*margin-right:.3em;vertical-align:text-top}.icon-white,.nav>.active>a>[class^=icon-],.nav>.active>a>[class*=" icon-"]{color:#fff}.g-ui-menu .e-item:hover [class^=icon-],.g-ui-menu .e-item:hover [class*=" icon-"]{color:#fff}[class^=icon2-],[class*=" icon2-"]{display:inline-block;width:16px;height:16px;line-height:16px;font-size:15px;*margin-right:.3em;vertical-align:text-top;background-repeat:no-repeat}.icon2-none{background-image:none}.icon3-as-button{cursor:pointer}.icon-checkbox-checked,.icon-checkbox-unchecked,.icon-checkbox-partial,.icon-radio-checked,.icon-radio-unchecked{cursor:pointer;color:#555;font-size:1em}.icon-checkbox-checked:hover,.icon-checkbox-unchecked:hover,.icon-checkbox-partial:hover,.icon-radio-checked:hover,.icon-radio-unchecked:hover,.icon-checkbox-checked:active,.icon-checkbox-unchecked:active,.icon-checkbox-partial:active,.icon-radio-checked:active,.icon-radio-unchecked:active{color:#000}.icon-white.icon-checkbox-checked,.icon-white.icon-checkbox-unchecked,.icon-white.icon-checkbox-partial,.icon-white.icon-radio-checked,.icon-white.icon-radio-unchecked{color:#eee}.icon-white.icon-checkbox-checked:hover,.icon-white.icon-checkbox-unchecked:hover,.icon-white.icon-checkbox-partial:hover,.icon-white.icon-radio-checked:hover,.icon-white.icon-radio-unchecked:hover,.icon-white.icon-checkbox-checked:active,.icon-white.icon-checkbox-unchecked:active,.icon-white.icon-checkbox-partial:active,.icon-white.icon-radio-checked:active,.icon-white.icon-radio-unchecked:active{color:#fff}.icon-refresh.in-process{background-position:0 0;background-image:url(images/sync.gif)}.denied-by-browser{cursor:default}.denied-by-browser .icon-checkbox-checked,.denied-by-browser icon-checkbox-unchecked{cursor:default}.icon-arrow-right-3,.icon-arrow-down-3{width:16px;line-height:20px}.icon2-reload{background-image:url(images/sync.png);background-repeat:no-repeat}.icon2-aminate-reload{background-image:url(images/sync.gif);background-repeat:no-repeat}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(359deg)}}@-moz-keyframes rotation{from{-moz-transform:rotate(0deg)}to{-moz-transform:rotate(359deg)}}@keyframes rotation{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.icon-repeat,.icon-spinner,.icon-spinner-2{width:16px;height:16px}.icon-repeat:before,.icon-spinner:before,.icon-spinner-2:before{font-size:16px;line-height:100%}html.no-cssanimations .icon-repeat,html.no-cssanimations .icon-spinner,html.no-cssanimations .icon-spinner-2{background-image:url(images/sync.png);background-repeat:no-repeat;font-family:Arial}html.no-cssanimations .icon-repeat:before,html.no-cssanimations .icon-spinner:before,html.no-cssanimations .icon-spinner-2:before{content:""}html.no-cssanimations .icon-repeat.animated,html.no-cssanimations .icon-spinner.animated,html.no-cssanimations .icon-spinner-2.animated{background-image:url(images/sync.gif)}html.cssanimations .icon-repeat.animated,html.cssanimations .icon-spinner.animated,html.cssanimations .icon-spinner-2.animated{-webkit-animation:rotation 1s infinite linear;-moz-animation:rotation 1s infinite linear;animation:rotation 1s infinite linear}body{background-color:transparent}label{cursor:pointer}.legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}.legend small{font-size:15px;color:#999}.legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}select{width:223px}.btn-small.btn-small-small{padding:3px 9px;font-size:11px;line-height:11px}.btn.btn-ellipsis{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.btn.btn-narrow{padding-left:12px;padding-right:12px}.dropdown-menu{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.btn{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background-image:none;text-shadow:0 1px 0 #fff}.btn.disabled,.btn[disabled]{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}html.rgba.textshadow .btn.btn-danger,html.rgba.textshadow .btn.btn-success,html.rgba.textshadow .btn.btn-primary{text-shadow:0 1px 0 rgba(0,0,0,.3)}.btn-toolbar{margin-top:0;margin-bottom:0}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.2);-moz-box-shadow:0 1px 2px rgba(0,0,0,.2);box-shadow:0 1px 2px rgba(0,0,0,.2)}.tooltip{font-size:14px}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip .tooltip-big{font-size:18px;padding:0 10px}.tooltip-inner{padding:5px 10px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.btn-group>.btn:first-child{-webkit-border-top-left-radius:2px;-moz-border-radius-topleft:2px;border-top-left-radius:2px;-webkit-border-bottom-left-radius:2px;-moz-border-radius-bottomleft:2px;border-bottom-left-radius:2px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:2px;-moz-border-radius-topright:2px;border-top-right-radius:2px;-webkit-border-bottom-right-radius:2px;-moz-border-radius-bottomright:2px;border-bottom-right-radius:2px}.btn-group>.btn.large:first-child{-webkit-border-top-left-radius:2px;-moz-border-radius-topleft:2px;border-top-left-radius:2px;-webkit-border-bottom-left-radius:2px;-moz-border-radius-bottomleft:2px;border-bottom-left-radius:2px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:2px;-moz-border-radius-topright:2px;border-top-right-radius:2px;-webkit-border-bottom-right-radius:2px;-moz-border-radius-bottomright:2px;border-bottom-right-radius:2px}textarea,input[type=text],input[type=password],input[type=email],input[type=search]{border:1px solid #ccc}textarea:focus,input[type=text]:focus,input[type=password]:focus,input[type=email]:focus,input[type=search]:focus{background-color:#fff;border:1px solid #999;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input[type=text],input[type=password],input[type=email],input[type=search]{height:20px;line-height:20px}select{border:1px solid #ccc}.alert.alert-null-left-margin{margin-left:0}.alert.alert-error a{color:#b94a48}html.no-rgba .modal{border-width:0!important}.modal-backdrop,.modal-backdrop.fade.in{opacity:.1;filter:alpha(opacity=10)}.popups{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1100;overflow:auto}.popups .modal{position:static;z-index:1101;margin:5% auto;background-color:transparent;overflow:hidden;-webkit-box-shadow:0 5px 80px rgba(0,0,0,.3);-moz-box-shadow:0 5px 80px rgba(0,0,0,.3);box-shadow:0 5px 80px rgba(0,0,0,.3)}.popups .modal .modal-body{background-color:#fff;max-height:none}.modal.loginContent .modal-body,.modal.loginAdminContent .modal-body{background-color:transparent!important}.picker.modal-dialog-bg,.picker.picker-dialog-bg{z-index:2000!important}.picker.modal-dialog,.picker.picker-dialog{z-index:2001!important}.select2-container-multi .select2-choices{background-image:none;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.select2-container-multi .select2-choices .select2-search-choice{line-height:15px;font-size:16px}.select2-container-multi.select2-container-active .select2-choices{border:1px solid #999;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.select2-drop{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.select2-drop .select2-subname{color:#777}.select2-drop .select2-highlighted .select2-subname{color:#eee}.select2-results{margin:0;padding:0;max-height:400px}.select2-results .select2-searching{padding:1px 4px}.select2-icon{line-height:20px;padding:0 0 0 7px}.select2-icon-result{line-height:40px}.select2-result-label{margin:0!important;padding:5px!important;font-size:16px;height:40px;line-height:40px}.select2-result-label .select2-user-pic{display:inline-block;height:40px;width:40px;margin-right:10px}.g-ui-user-select-none{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none;-webkit-touch-callout:none}.g-ui-clearfix{*zoom:1}.g-ui-clearfix:before,.g-ui-clearfix:after{display:table;content:"";line-height:0}.g-ui-clearfix:after{clear:both}.g-ui-link{color:#369;text-decoration:underline;cursor:pointer}.g-ui-min-height-300{min-height:300px}.g-ui-absolute-reset{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0}.g-ui-menu{max-height:400px;max-width:300px;overflow-y:auto;overflow-x:hidden}.g-ui-menu .e-link{text-decoration:none;cursor:pointer}.g-ui-menu .e-item>.e-link:hover{background-color:#555;background-image:none;color:#fff}.g-ui-menu .e-item.disable>.e-link{cursor:not-allowed;background-color:#fff;background-image:none;color:grey}.g-ui-menu .e-item.disable [class^=icon-]{color:grey}.g-ui-table{display:table;width:100%}.g-ui-table .e-row{display:table-row}.g-ui-table .e-cell{display:table-cell;vertical-align:top;text-align:left}.g-ui-resizable-delimiter-highlight{border:0;border-right:6px solid #aaa}html.rgba .g-ui-resizable-delimiter-highlight{border-right-color:rgba(0,0,0,.2)}.settings-saved-trigger{display:inline-block;line-height:17px;font-size:16px}.settings-saved-trigger .animated{color:green}.settings-saved-trigger .success{color:green;-webkit-transition:opacity .5s linear;-moz-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear;opacity:0;filter:alpha(opacity=0)}.settings-saved-trigger .error{color:red;-webkit-transition:opacity .5s linear;-moz-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear;opacity:0;filter:alpha(opacity=0)}.settings-saved-trigger .visible{opacity:1;filter:alpha(opacity=100)}.settings-saved-trigger-input.success{border-color:green!important;-webkit-transition:border-color .5s linear;-moz-transition:border-color .5s linear;-o-transition:border-color .5s linear;transition:border-color .5s linear}.settings-saved-trigger-input.error{border-color:red!important;-webkit-transition:border-color .5s linear;-moz-transition:border-color .5s linear;-o-transition:border-color .5s linear;transition:border-color .5s linear}html{margin:0;padding:0;overflow:hidden;font-family:Arial,Verdana,Geneva,sans-serif}body{margin:0;padding:0;overflow:hidden;background-color:#e3e3e3;font-family:Arial,Verdana,Geneva,sans-serif;-webkit-touch-callout:none;position:absolute;top:0;left:0;bottom:0;right:0}textarea{resize:none}option:disabled{color:#aaa;cursor:not-allowed}body:before{content:"";position:fixed;top:-10px;left:0;width:100%;height:8px;z-index:100;-webkit-box-shadow:0 0 10px rgba(0,0,0,.6);-moz-box-shadow:0 0 10px rgba(0,0,0,.6);box-shadow:0 0 10px rgba(0,0,0,.6)}*{outline:0}select:focus{outline:0}html.mobile *{-webkit-tap-highlight-color:rgba(0,0,0,0)}#rl-content{height:100%;width:100%}#rl-center{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;min-width:900px;min-height:400px}#rl-top{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;bottom:auto;z-index:2}#rl-bottom{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;top:auto;z-index:1}#rl-left{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;right:auto;width:100%}#rl-right{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;z-index:1}#rl-resizer-right{position:absolute;top:0;bottom:0;right:0;left:35%}#rl-resizer-left{position:absolute;top:0;bottom:0;left:0;right:65%;min-width:350px}#rl-top-resizer-right{position:absolute;top:0;bottom:0;right:0;left:230px}#rl-top-resizer-left{position:absolute;top:0;bottom:0;left:0;right:auto;min-width:120px}html.mobile #rl-top-resizer-left{width:170px}html.mobile #rl-top-resizer-right{left:170px}html.mobile #rl-resizer-left{width:350px}html.mobile #rl-resizer-right{left:350px}html.rl-no-preview-pane #rl-resizer-left{right:5px!important;width:inherit}html.rl-no-preview-pane #rl-resizer-right{left:0!important}html.rl-no-preview-pane #rl-right .ui-resizable-handle{display:none!important}#rl-loading,#rl-loading-error{position:absolute;font:30px Tahoma;top:50%;width:100%;height:65px;margin:0;margin-top:-60px;background-color:transparent;background-repeat:no-repeat;background-position:center 50px;background-image:url(images/loader-black.gif);text-align:center;color:#000}#rl-loading-error{background-image:none;display:none}.b-system-drop-down .b-toolbar{position:absolute;top:0;right:0;height:30px;padding:10px 8px;z-index:103}.b-system-drop-down .e-facebook-name{display:inline-block;padding-top:4px}.b-system-drop-down .btn.system-dropdown{padding-left:10px;padding-right:10px}.b-system-drop-down .button-fb-logout{margin:5px}.b-system-drop-down .email-title{display:inline-block;max-width:200px;text-align:left;text-overflow:ellipsis;overflow:hidden}.rl-view-model.RL-Login,.rl-view-model.RL-LoginNew,.rl-view-model.RL-AdminLogin{height:100%}.b-login-content{height:100%;text-align:center;margin-left:-230px}.b-login-content .loginFormWrapper{display:inline-block;vertical-align:middle;text-align:center;width:380px}.b-login-content .loginFormWrapper .loginForm{background-color:#efefef;text-align:left;color:#333;margin:0;float:none}.b-login-content .loginFormWrapper .control-label{font-size:16px;line-height:30px}.b-login-content .loginFormWrapper .control-group{margin-bottom:25px}.b-login-content .loginFormWrapper .wrapper{padding:40px 40px 10px}.b-login-content .loginFormWrapper #recaptcha_image img{border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.b-login-content .loginFormWrapper .inputLoginForm,.b-login-content .loginFormWrapper .inputEmail,.b-login-content .loginFormWrapper .inputLogin,.b-login-content .loginFormWrapper .inputPassword{font-size:18px;height:30px;line-height:29px}.b-login-content .loginFormWrapper .signMeLabel{margin-top:5px}.b-login-content .loginFormWrapper .input-append .add-on{position:relative;height:30px;background:0;margin-left:-35px;z-index:1000;border:0}.b-login-content .loginFormWrapper .input-append .add-on i{font-size:17px;line-height:29px;color:#999}.b-login-content .loginFormWrapper .control-group.error .add-on i{color:#b94a48}.b-login-content .buttonLogin{margin:0}.b-login-content .alert{margin:0 0 20px;text-align:left}.b-login-content .loginAfter{display:inline-block;height:90%;vertical-align:middle;width:0}.b-login-content .flag-selector{margin-bottom:0}.b-folders .b-toolbar{position:absolute;top:0;right:0;left:0;height:30px;padding:10px 10px 0 8px;color:#fff}.b-folders .b-content{position:absolute;top:58px;bottom:13px;left:0;right:0;overflow:hidden;overflow-y:auto}.b-folders .b-content .content{-webkit-overflow-scrolling:touch}.b-folders .b-list-delimiter{margin:10px;border-top:0 solid #000;border-bottom:1px solid #999}.b-folders .e-item{overflow:hidden;white-space:nowrap}.b-folders .e-item .e-link{display:block;position:relative;z-index:1;height:34px;line-height:34px;background-color:transparent;vertical-align:middle;color:grey;cursor:not-allowed;font-size:14px;padding:0;padding-left:10px;padding-right:10px;outline:0;text-decoration:none}.b-folders .e-item .e-link.selectable{color:#000;cursor:pointer}.b-folders .e-item .e-link.selectable:hover,.b-folders .e-item .e-link.selectable.selected,.b-folders .e-item .e-link.selectable.droppableHover{background-color:#555;color:#fff}.b-folders .e-item .e-link.system{cursor:default;color:grey}.b-folders .e-item .e-link .count{display:none;margin-top:5px;line-height:19px}.b-folders .e-item .e-link.print-count{font-weight:700}.b-folders .e-item .e-link.print-count .count{display:inline}.b-folders .e-item .e-link .e-collapsed-sign{cursor:pointer;width:22px;height:30px;line-height:30px;text-align:center;vertical-align:inherit}.b-folders .e-item .hidden.e-link{display:none}.b-folders .e-item .b-sub-folders.collapsed{max-height:0;height:0;display:none}.b-folders .b-folder-system-item{font-weight:700}.b-folders .b-sub-folders .e-item .e-link{padding-left:25px}.b-folders .b-sub-folders.unpaddig-folder .e-item .e-link{padding-left:10px}.b-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:40px}.b-folders .b-sub-folders.unpaddig-folder .b-sub-folders .e-item .e-link{padding-left:25px}.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:55px}.b-folders .b-sub-folders.unpaddig-folder .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:40px}.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:70px}.b-folders .b-sub-folders.unpaddig-folder .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:55px}.popups .b-folder-clear-content .modal-header{background-color:#fff}.popups .b-folder-create-content .modal-header{background-color:#fff}.popups .b-folder-system-content.modal{z-index:1102}.popups .b-folder-system-content .modal-header{background-color:#fff}.popups .b-languages-content.modal{z-index:1103;width:520px}.popups .b-languages-content.exp{width:521px}.popups .b-languages-content .modal-header{background-color:#fff}.popups .b-languages-content .lang-item{display:inline-block;padding:5px 15px;margin:2px 5px;width:200px;background-color:#fff;text-align:left}.popups .b-languages-content .lang-item.selected{background-color:#f5f5f5}.popups .b-languages-content .lang-item:hover{background-color:#eee}.popups .b-account-add-content .modal-header{background-color:#fff}.popups .b-identity-content .modal-header{background-color:#fff}.popups .b-identity-content .textEmail{margin-top:5px;font-weight:700}.popups .b-advanced-search-content.modal{width:750px}.popups .b-advanced-search-content.modal .control-label{width:100px}.popups .b-advanced-search-content.modal .controls{margin-left:110px}.popups .b-advanced-search-content .modal-header{background-color:#fff}html.rl-no-preview-pane .messageList.message-selected{display:none}.messageList .toolbar{position:absolute;top:0;right:0;left:0;height:30px;padding:10px 1px;min-width:280px;z-index:102}.messageList .b-footer{position:absolute;bottom:0;right:0;left:0;height:29px;padding:10px;min-width:300px;z-index:101;background-color:#eee;-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.messageList .b-footer .e-quota{display:inline-block;margin-left:10px;font-size:18px;cursor:help}.messageList .b-footer .e-quota:hover{border-bottom:1px dashed #333}.messageList .inputSearch{width:258px}.messageList .btn.buttonMoreSearch{padding-left:8px;padding-right:8px}.messageList .b-message-list-wrapper{position:absolute;top:50px;right:0;left:0;bottom:5px;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.3);-moz-box-shadow:0 2px 8px rgba(0,0,0,.3);box-shadow:0 2px 8px rgba(0,0,0,.3);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;z-index:101}.messageList .second-toolbar{position:absolute;top:0;right:0;left:0;height:29px;padding:10px 8px 10px 11px;min-width:280px;z-index:101;background-color:#eee;-webkit-border-top-right-radius:5px;-moz-border-radius-topright:5px;border-top-right-radius:5px;-webkit-border-top-left-radius:5px;-moz-border-radius-topleft:5px;border-top-left-radius:5px}.messageList .second-toolbar .checkboxCkeckAll{margin:5px 0}.messageList .mainDelimiter{position:absolute;left:0;right:0;height:1px;z-index:101;background-color:#bbb}.messageList .toolbarDelimiter{top:49px}.messageList .footerDelimiter{bottom:49px}.messageList .b-content{position:absolute;top:50px;bottom:50px;left:0;right:0;padding:0;overflow-x:hidden;overflow-y:auto;z-index:101;min-width:300px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#fff}.messageList .b-content .content{-webkit-overflow-scrolling:touch}.messageList .b-content .listClear{color:#333;text-align:center;padding:10px;font-size:14px;line-height:13px}.messageList .b-content .listEmptyList,.messageList .b-content .listEmptyListLoading,.messageList .b-content .listDragOver,.messageList .b-content .listError,.messageList .b-content .listEmptySearchList{color:#999;text-align:center;padding:60px 10px;font-size:24px;line-height:30px}.messageList .b-content .listEmptyList .e-icon,.messageList .b-content .listEmptyListLoading .e-icon,.messageList .b-content .listDragOver .e-icon,.messageList .b-content .listError .e-icon,.messageList .b-content .listEmptySearchList .e-icon{font-size:24px;line-height:30px}.messageList .b-content .listDragOver{max-height:0;overflow:hidden;padding:0 10px}.messageList .b-content .listDragOver.viewAppendArea{max-height:120px;padding:30px 10px}.messageList .b-content .listDragOver.dragOverEnter{background-color:#e0fdda;color:#333}.messageList .b-content .listError{color:#DA4F49}.messageList .b-content .listSearchDesc{font-size:20px;padding:20px;border-bottom:1px solid #eee}.messageList .b-content .delimiter{display:block;height:1px;background-color:#e5e5e5}.messageList .b-content .messageListItem:last-child{border-bottom:1px solid #e5e5e5}.messageList .b-content .messageListItem:last-child.selected{border-bottom:1px solid #bfd5ef}.messageList .b-content .fullThreadsParent{height:25px;padding:3px 5px;background-color:#f4f4f4;text-align:center}.messageList .b-content .messageListItem{position:relative;height:52px;max-height:60px;font-size:12px;line-height:21px;overflow:hidden;cursor:pointer;margin:0;border:0 solid transparent;z-index:100;background-color:#f9f9f9}.messageList .b-content .messageListItem .delimiter{position:relative;display:block;height:1px;background-color:#999;opacity:.2;filter:alpha(opacity=20)}.messageList .b-content .messageListItem .wrapper{padding:5px 0}.messageList .b-content .messageListItem .sidebarParent{display:inline-block;width:6px;background-color:#eee;float:left;height:100%}.messageList .b-content .messageListItem.e-single-line{height:35px}.messageList .b-content .messageListItem.e-single-line .wrapper{line-height:25px;padding:5px}.messageList .b-content .messageListItem.new{max-height:0}.messageList .b-content .messageListItem.deleted{max-height:0;border-color:transparent!important}.messageList .b-content .messageListItem .checkedParent{display:inline-block;float:left;margin-top:11px;padding:0 8px 0 6px;font-size:14px}.messageList .b-content .messageListItem.e-single-line .checkedParent{margin-top:1px}.messageList .b-content .messageListItem .flagParent{display:inline-block;float:right;padding:0 8px 0 5px}.messageList .b-content .messageListItem.e-single-line .flagParent{float:left;padding:0 8px 0 2px}.messageList .b-content .messageListItem .dateParent{display:inline-block;float:right;position:relative;margin:0 5px;color:#999;font-size:11px}.messageList .b-content .messageListItem .attachmentParent{display:inline-block;float:right;position:relative;margin:2px 8px 0 5px}.messageList .b-content .messageListItem.e-single-line .attachmentParent{float:left;margin:0 5px 0 0}.messageList .b-content .messageListItem .senderParent{display:block;overflow:hidden;text-overflow:ellipsis}.messageList .b-content .messageListItem .threadsCountParent{display:inline;overflow:hidden;background-color:#eee;padding:1px 5px;margin-right:5px;border:1px solid #ccc;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.messageList .b-content .messageListItem .threadsCountParent.lastSelected{background-color:#999;border-color:#999;color:#fff}.messageList .b-content .messageListItem .threadsCountParent:hover{border-color:#666}.messageList .b-content .messageListItem.e-single-line .senderParent{display:inline-block;text-overflow:none;width:200px;float:left;font-weight:400}.messageList .b-content .messageListItem .subjectParent{display:block;overflow:hidden;text-overflow:ellipsis;color:#000}.messageList .b-content .messageListItem .senderParent,.messageList .b-content .messageListItem .subjectParent,.messageList .b-content .messageListItem .dateParent{white-space:nowrap}.messageList .b-content .messageListItem .subjectParent .emptySubjectText{display:none;font-style:italic;color:#999}.messageList .b-content .messageListItem.emptySubject .subjectParent .subject{display:none}.messageList .b-content .messageListItem.emptySubject .subjectParent .emptySubjectText{display:inline}.messageList .b-content .messageListItem .sender,.messageList .b-content .messageListItem .subject{overflow:hidden;text-overflow:ellipsis}.messageList .b-content .messageListItem .attachment{display:none}.messageList .b-content .messageListItem .flagOff,.messageList .b-content .messageListItem .flagOn,.messageList .b-content .messageListItem .flagOnHalf{cursor:pointer;display:inline-block}.messageList .b-content .messageListItem .flagOff{opacity:.5;filter:alpha(opacity=50)}.messageList .b-content .messageListItem .flagOff:hover{opacity:1;filter:alpha(opacity=100)}.messageList .b-content .messageListItem .flagOn,.messageList .b-content .messageListItem .flagOnHalf{display:none;color:orange}.messageList .b-content .messageListItem .replyFlag,.messageList .b-content .messageListItem .forwardFlag{display:none}.messageList .b-content .messageListItem.answered .replyFlag{display:inline-block}.messageList .b-content .messageListItem.forwarded .forwardFlag{display:inline-block}.messageList .b-content .messageListItem.withAttachments .attachment{display:inline-block;color:#666;text-shadow:0 1px 0 #eee}.messageList .b-content .messageListItem.unseen{background-color:#FFFFD9}.messageList .b-content .messageListItem.unseen .sender,.messageList .b-content .messageListItem.unseen .subject{font-weight:700}.messageList .b-content .messageListItem.unseen .sidebarParent{background-color:orange}.messageList .b-content .messageListItem.hasUnseenSubMessage{background-color:#FFFFD9}.messageList .b-content .messageListItem.hasUnseenSubMessage .sidebarParent{background-color:#ffdb99}.messageList .b-content .messageListItem.hasParentMessage{background-color:#ecf0f1}.messageList .b-content .messageListItem.hasParentMessage .sidebarParent{background-color:#bdc3c7}.messageList .b-content .messageListItem.hasParentMessage.unseen{background-color:#dde4e6}.messageList .b-content .messageListItem.hasParentMessage.unseen .sidebarParent{background-color:#6c777f}.messageList .b-content .messageListItem.checked .sidebarParent{background-color:#69a8f5!important}.messageList .b-content .messageListItem.selected{background-color:#DFEFFF;z-index:102}.messageList .b-content .messageListItem.selected .sidebarParent{background-color:#398CF2!important}.messageList .b-content .messageListItem.selected .delimiter{background-color:#398CF2;opacity:.2;filter:alpha(opacity=20)}.messageList .b-content .messageListItem.selected+.messageListItem .delimiter{background-color:#398CF2;opacity:.3;filter:alpha(opacity=30)}.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOff,.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOn{display:none}.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOnHalf{display:inline-block}.messageList .b-content .messageListItem.flagged .flagOff,.messageList .b-content .messageListItem.flagged .flagOnHalf{display:none}.messageList .b-content .messageListItem.flagged .flagOn{display:inline-block}.messageList.hideMessageListCheckbox .checkedParent,.messageList.hideMessageListCheckbox .checkboxCkeckAll{display:none!important}.messageList.hideMessageListCheckbox .sidebarParent{margin-right:10px!important}.messageList .pagenator .page{display:inline-block;color:#999;text-decoration:none;font-size:24px;padding:3px;cursor:pointer}.messageList .pagenator .page:hover .pageNumber{color:#555}.messageList .pagenator .page.current .pageNumber{font-size:28px;color:#333;border-bottom:2px solid #000}.draggablePlace{z-index:10002;color:#fff;background-color:#333;background-color:rgba(0,0,0,.5);padding:4px 10px;min-width:30px;height:20px;cursor:pointer;cursor:move}html.rl-no-preview-pane .messageView{display:none}html.rl-no-preview-pane .messageView.message-selected{display:block}.messageView{z-index:100}.messageView .toolbar{position:absolute;top:0;right:0;left:0;height:30px;padding:10px 0;color:#fff}.messageView .b-content{position:absolute;margin:0;top:58px;bottom:13px;right:8px;left:0;overflow:hidden;border:1px solid #aaa;border-left:0;-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;background-color:#fff}.messageView .b-content .b-message-view-desc{text-align:center;font-size:24px;line-height:30px;padding-top:120px;color:#999}.messageView .b-content .b-message-view-desc.error{color:#DA4F49}.messageView .b-content .content{-webkit-overflow-scrolling:touch}.messageView .b-content .messageItem{position:absolute;top:0;bottom:0;left:0;right:0;overflow:auto;-webkit-overflow-scrolling:touch;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.messageView .b-content .messageItem .emptySubjectText{display:none;font-style:italic;color:#999}.messageView .b-content .messageItem.emptySubject .emptySubjectText{display:inline}.messageView .b-content .messageItem .buttonUp,.messageView .b-content .messageItem .buttonUnFull,.messageView .b-content .messageItem .buttonFull{display:inline-block;position:fixed;right:30px;top:90px;height:30px;width:30px;text-align:center;vertical-align:middle;line-height:30px;background-color:transparent;background-color:#fff;border:1px solid #333;color:#333;z-index:2;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;opacity:.3;filter:alpha(opacity=30)}.messageView .b-content .messageItem .buttonUp:hover,.messageView .b-content .messageItem .buttonUnFull:hover,.messageView .b-content .messageItem .buttonFull:hover{opacity:.8;filter:alpha(opacity=80);border-color:#000;background-color:#888;color:#fff}.messageView .b-content .messageItem .buttonUp{right:70px;z-index:0}.messageView .b-content .messageItem .buttonUnFull{display:none}.messageView .b-content .messageItem .messageItemHeader{position:relative;padding:10px;background-color:#f8f8f8;border-top:0;border-bottom:1px solid #ddd;z-index:1}.messageView .b-content .messageItem .messageItemHeader .fromPic{display:inline-block;width:50px;height:50px;float:left;padding:2px;margin:0 5px 0 0;background:#fff;border:1px solid #ccc;border-radius:10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.messageView .b-content .messageItem .messageItemHeader .subjectParent{font-size:16px;font-weight:700;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;margin-left:3px}.messageView .b-content .messageItem .messageItemHeader .senderParent{margin-top:10px}.messageView .b-content .messageItem .messageItemHeader .messageButtons{margin-top:5px}.messageView .b-content .messageItem .messageItemHeader .informationShort{margin-left:15px}.messageView .b-content .messageItem .messageItemHeader .informationShort a{color:#369;text-decoration:underline;cursor:pointer}.messageView .b-content .messageItem .messageItemHeader .informationFull{margin-top:10px;border:1px solid #ddd;background-color:#fff;border-radius:5px;padding:10px 15px}.messageView .b-content .messageItem .loading{text-align:center;font-size:24px;color:grey;padding-top:50px}.messageView .b-content .messageItem .line-loading{height:0}.messageView .b-content .messageItem .showImages{cursor:pointer;background-color:#eee;padding:10px 15px;border-bottom:1px solid #ccc}.messageView .b-content .messageItem .attachmentsPlace{padding:10px}.messageView .b-content .messageItem .attachmentsPlace .attachmentList{margin:0}.messageView .b-content .messageItem .attachmentsPlace .attachmentList .attachmentItem{display:inline-block;margin:5px;padding:5px;max-width:170px;min-width:60px;overflow:hidden;cursor:pointer;list-style:none;line-height:24px;border:2px solid grey;background-color:#fff;box-shadow:1px 1px 5px #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.messageView .b-content .messageItem .attachmentsPlace .attachmentList .attachmentItem .attachmentIcon{font-size:23px;width:23px;height:23px}.messageView .b-content .messageItem .attachmentsPlace .attachmentList .attachmentItem .attachmentPreview{color:#999;margin:0 5px}.messageView .b-content .messageItem .attachmentsPlace .attachmentList .attachmentItem .attachmentPreview:hover{color:#333}.messageView .b-content .messageItem .rlBlockquoteSwitcher{background-color:#eee;border:1px solid #999;display:inline-block;width:30px;height:14px;line-height:14px;text-align:center;cursor:pointer;margin:10px 0;opacity:.5;filter:alpha(opacity=50)}.messageView .b-content .messageItem .rlBlockquoteSwitcher:hover{opacity:1;filter:alpha(opacity=100)}.messageView .b-content .messageItem .bodyText{color:#000;font-family:arial,sans-serif}.messageView .b-content .messageItem .bodyText .b-text-part a{color:#00f;text-decoration:underline}.messageView .b-content .messageItem .bodyText .b-text-part a:visited{color:#609}.messageView .b-content .messageItem .bodyText .b-text-part a:active{color:red}.messageView .b-content .messageItem .bodyText .b-text-part table{border-collapse:separate}.messageView .b-content .messageItem .bodyText .b-text-part blockquote{border-left:2px solid #000;margin:0;padding:0 10px}.messageView .b-content .messageItem .bodyText .b-text-part .rl-bq-switcher.hidden-bq{display:none}.messageView .b-content .messageItem .bodyText .b-text-part.rtl-text-part{direction:rtl}.messageView .b-content .messageItem .bodyText .b-text-part.html .mailso-body{margin:15px}.messageView .b-content .messageItem .bodyText .b-text-part.plain{padding:15px}.messageView .b-content .messageItem .bodyText .b-text-part.plain pre{margin:0;padding:0;font-family:arial,sans-serif;background:#fff;border:0;white-space:normal}.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote{border-left:2px solid #00f;color:#00f}.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote{border-left:2px solid green;color:green}.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote blockquote{border-left:2px solid red;color:red}html.rl-no-preview-pane .messageView .toolbar{padding-left:1px}html.rl-no-preview-pane .messageView .b-content{top:50px;bottom:5px;right:5px;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.3);-moz-box-shadow:0 2px 8px rgba(0,0,0,.3);box-shadow:0 2px 8px rgba(0,0,0,.3);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}html.rl-no-preview-pane .messageView .b-content .buttonUp,html.rl-no-preview-pane .messageView .b-content .buttonUnFull,html.rl-no-preview-pane .messageView .b-content .buttonFull{top:70px}html.cssanimations.rl-anim .line-loading{height:5px!important}html.rl-message-fullscreen #rl-left,html.rl-message-fullscreen #rl-bottom{display:none!important}html.rl-message-fullscreen #rl-right .RL-MailMessageList,html.rl-message-fullscreen #rl-right .RL-SettingsPane,html.rl-message-fullscreen #rl-right .RL-SystemDropDown,html.rl-message-fullscreen #rl-right .RL-MailMessageView .messageView .toolbar{display:none!important}html.rl-message-fullscreen .messageView .b-content{position:fixed;margin:5px;top:0;left:0;right:0;bottom:0;z-index:10000}html.rl-message-fullscreen .messageView .b-content .buttonUp,html.rl-message-fullscreen .messageView .b-content .buttonUnFull{display:inline-block;top:36px}html.rl-message-fullscreen .messageView .b-content .buttonFull{display:none}.b-contacts-content.modal{position:absolute;right:0;top:0;bottom:0;left:0;width:900px;min-height:300px;max-height:700px;margin:auto}.b-contacts-content.modal .modal-body{overflow:auto;height:100%;background-color:#f5f5f5;padding:0}.b-contacts-content.modal .b-header-toolbar{height:40px;background-color:#aaa;color:#fff;background-color:#333;background-color:rgba(0,0,0,.8)!important}.b-contacts-content.modal .b-header-toolbar .close{color:#fff;opacity:1;filter:alpha(opacity=100)}.b-contacts-content.modal .b-header-toolbar .btn{margin-top:4px}.b-contacts-content.modal .b-header-toolbar .button-new-message{margin-left:8px}.b-contacts-content.modal .b-header-toolbar .button-delete{margin-left:8px}.b-contacts-content.modal .b-list-toopbar{padding:0;height:45px;text-align:center;width:250px;-webkit-box-shadow:inset 0 -1px 0 #ccc;-moz-box-shadow:inset 0 -1px 0 #ccc;box-shadow:inset 0 -1px 0 #ccc}.b-contacts-content.modal .b-list-toopbar .e-search{margin-top:7px}.b-contacts-content.modal .b-list-content{position:absolute;top:45px;bottom:60px;left:0;width:250px;overflow:hidden;overflow-y:auto}.b-contacts-content.modal .b-list-content .content{-webkit-overflow-scrolling:touch}.b-contacts-content.modal .b-list-content .listClear{color:#333;text-align:center;padding:10px;font-size:14px;line-height:13px;background-color:#fff}.b-contacts-content.modal .b-list-content .listEmptyList,.b-contacts-content.modal .b-list-content .listEmptyListLoading,.b-contacts-content.modal .b-list-content .listEmptySearchList{color:#999;text-align:center;padding:60px 10px;font-size:24px;line-height:30px}.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkedParent,.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkboxCkeckAll{display:none!important}.b-contacts-content.modal .b-list-content.hideContactListCheckbox .sidebarParent{margin-right:10px!important}.b-contacts-content.modal .b-list-content .e-contact-foreach{border-bottom:1px solid #ddd}.b-contacts-content.modal .b-list-content .e-contact-item{position:relative;height:45px;max-height:45px;line-height:45px;overflow:hidden;cursor:pointer;margin:0;border:0 solid transparent;z-index:100}.b-contacts-content.modal .b-list-content .e-contact-item .delimiter{position:relative;display:block;height:1px;background-color:#999;opacity:.2;filter:alpha(opacity=20)}.b-contacts-content.modal .b-list-content .e-contact-item .wrapper{padding:0}.b-contacts-content.modal .b-list-content .e-contact-item .sidebarParent{display:inline-block;width:6px;background-color:#eee;float:left;height:100%}.b-contacts-content.modal .b-list-content .e-contact-item.deleted{max-height:0;border-color:transparent!important}.b-contacts-content.modal .b-list-content .e-contact-item .checkedParent{display:inline-block;float:left;padding:0 8px 0 6px}.b-contacts-content.modal .b-list-content .e-contact-item .nameParent{display:block;overflow:hidden;text-overflow:ellipsis;color:#333;font-size:16px}.b-contacts-content.modal .b-list-content .e-contact-item .nameParent,.b-contacts-content.modal .b-list-content .e-contact-item .emailParent{white-space:nowrap}.b-contacts-content.modal .b-list-content .e-contact-item .displayName,.b-contacts-content.modal .b-list-content .e-contact-item .displayEmail{overflow:hidden;text-overflow:ellipsis}.b-contacts-content.modal .b-list-content .e-contact-item .displayImg{display:inline-block;float:right;position:relative;margin:0 5px}.b-contacts-content.modal .b-list-content .e-contact-item.checked{z-index:101}.b-contacts-content.modal .b-list-content .e-contact-item.checked .sidebarParent{background-color:#69A8F5}.b-contacts-content.modal .b-list-content .e-contact-item.selected{background-color:#fff;z-index:102}.b-contacts-content.modal .b-list-content .e-contact-item.selected .sidebarParent{background-color:#398CF2}.b-contacts-content.modal .b-view-content{position:absolute;top:0;bottom:60px;left:250px;right:0;overflow:hidden;overflow-y:auto;background-color:#fff;border-left:1px solid #ddd}.b-contacts-content.modal .b-view-content .content{-webkit-overflow-scrolling:touch}.b-contacts-content.modal .b-view-content .b-contact-view-desc{text-align:center;font-size:24px;line-height:30px;padding-top:120px;color:#999}.b-contacts-content.modal .b-view-content .top-part{margin-top:20px}.b-contacts-content.modal .b-view-content .top-part .control-label{text-align:center}.b-contacts-content.modal .b-view-content .image-wrapper{margin-left:30px;border-radius:10px}.b-contacts-content.modal .b-view-content .image-wrapper img{border-radius:10px}.b-contacts-content.modal .b-view-content .top-row{padding:10px 0;height:30px}.b-contacts-content.modal .b-view-content .contactEmptyValueClick,.b-contacts-content.modal .b-view-content .contactValueClick,.b-contacts-content.modal .b-view-content .contactValueInput{display:inline-block;font-size:24px;line-height:28px;height:28px}.b-contacts-content.modal .b-view-content .contactEmptyValueClick,.b-contacts-content.modal .b-view-content .contactValueClick{color:#ddd;cursor:pointer;margin:5px 0 0 7px}.b-contacts-content.modal .b-view-content .contactValueInput{padding-left:6px}.b-contacts-content.modal .b-view-content .contactEmptyValueClick{border-bottom:1px dashed #ddd}.b-contacts-content.modal .b-view-content .contactValueClick{color:#555;border-bottom:11px dashed transparent}.b-contacts-content.modal .b-view-content .contactValueClick:hover{color:#000;border-bottom:1px dashed #000}.b-contacts-content.modal .b-view-content .hasError .contactValueClick,.b-contacts-content.modal .b-view-content .hasError .contactValueInput{color:#ee5f5b;border:1px solid #ee5f5b}.b-contacts-content.modal .b-view-content .button-save-contact{position:absolute;bottom:20px;right:20px}.b-contacts-content .e-contact-item{position:relative;height:55px;max-height:60px;line-height:22px;overflow:hidden;cursor:pointer;margin:0;border:0 solid transparent;z-index:100}.b-compose.modal{width:850px;margin:10px auto}.b-compose.modal .modal-body{overflow:auto;padding:0}.b-compose .b-header-toolbar{height:40px;background-color:#aaa;color:#fff;background-color:#333;background-color:rgba(0,0,0,.8)!important}.b-compose .b-header-toolbar .close{color:#fff;opacity:1;filter:alpha(opacity=100)}.b-compose .b-header-toolbar .btn.disable.button-delete{visibility:hidden}.b-compose .b-header-toolbar .button-save,.b-compose .b-header-toolbar .button-delete,.b-compose .b-header-toolbar .saved-text{margin-left:8px}.b-compose .b-header-toolbar .disable.button-delete{margin-left:0}.b-compose .b-header{padding:10px;border-bottom:1px solid #333;background-color:#eee;color:#333}.b-compose .b-header .e-identity{font-weight:700}.b-compose .b-header .e-identity.multiply{cursor:pointer;border-bottom:1px dashed #555}.b-compose .b-header .e-row{line-height:30px}.b-compose .b-header .e-delimiter-row{line-height:2px;height:5px}.b-compose .b-header .e-label{text-align:right;width:1%;min-width:70px;padding:6px 10px}.b-compose .b-header .e-value{padding:2px 0}.b-compose .b-header .e-value textarea,.b-compose .b-header .e-value input[type=text]{width:98%}.b-compose .b-header .e-value textarea{height:40px}.b-compose .b-header .e-value .select2-container{width:100%}.b-compose .b-header .error-desc{color:red}.b-compose .b-header .b-appachments .b-attacment{display:inline-block;line-height:20px}.b-compose .b-header .b-appachments .b-attacment-in-process{display:inline-block;line-height:20px}.b-compose .b-header .b-appachments .b-attacment-in-process .uploading{display:none;padding-right:5px}.b-compose .b-header .b-appachments .b-attacment-in-process.uploading .uploading{display:inline}.b-compose .b-header .b-appachments .b-attacment-in-process .upload-progress{font-weight:700}.b-compose .b-header .b-appachments .b-attacment-in-process.error .namedStr{color:#888}.b-compose .b-header .b-appachments .b-attacment-in-process .error{color:red}.b-compose .b-header .b-appachments .b-attacment-in-process .close{float:left;padding-right:13px}.b-compose .b-attachment-button{display:inline-block}.b-compose .b-attachment-place{position:absolute;height:120px;border:2px #777 dashed;line-height:119px;text-align:center;background-color:#fff;z-index:300;left:20px;right:20px;font-size:24px}.b-compose .b-attachment-place.drag-and-drop-over{background:#777;color:#fff}.b-compose .editorTextArea,.b-compose .editorHtmlArea{background:#fff;color:#000;font-family:Arial,Verdana,Geneva,sans-serif;font-size:14px}.b-compose .editorTextArea table,.b-compose .editorHtmlArea table{border-collapse:separate}.b-compose .editorTextArea blockquote,.b-compose .editorHtmlArea blockquote{border:0;border-left:solid 2px #444;margin-left:5px;margin:5px 0;padding-left:5px}.b-admin-left .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 0 0 8px}.b-admin-left .b-content{position:absolute;top:68px;bottom:8px;left:0;right:0;overflow:hidden}.b-admin-left .b-content .content{-webkit-overflow-scrolling:touch}.b-admin-menu .e-item{overflow:hidden;text-decoration:none;outline:0}.b-admin-menu .e-link{position:relative;display:block;height:30px;line-height:29px;cursor:pointer;font-size:18px;z-index:1;cursor:default;background-color:transparent;color:#888;padding:4px 10px;outline:0;text-decoration:none}.b-admin-menu .e-item.selectable .e-link{cursor:pointer}.b-admin-menu .e-item.selectable:hover .e-link,.b-admin-menu .e-item.selectable.selected .e-link{background-color:#555;color:#fff}.b-admin-right .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px;color:#fff}.b-admin-right .b-content{position:absolute;top:58px;bottom:8px;left:0;right:8px;overflow-y:auto;z-index:2;background-color:#fff;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.3);-moz-box-shadow:0 2px 8px rgba(0,0,0,.3);box-shadow:0 2px 8px rgba(0,0,0,.3);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.b-admin-right .b-content .content{-webkit-overflow-scrolling:touch}.b-admin-right .b-settings-content{padding:20px}.b-admin-domains .process-place{width:600px;padding:14px 0;text-align:center;visibility:hidden}.b-admin-domains-list-table{width:600px}.b-admin-domains-list-table .e-item .e-action{cursor:pointer}.b-admin-domains-list-table .e-item .domain-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.b-admin-domains-list-table .e-item.disabled .domain-name{color:#bbb}.b-admin-domains-list-table .e-item .button-delete{margin-right:15px;visibility:hidden;opacity:0;filter:alpha(opacity=0)}.b-admin-domains-list-table .e-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1;filter:alpha(opacity=100)}.b-admin-domains-list-table .e-item .delete-domain,.b-admin-domains-list-table .e-item .disable-domain{cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.b-admin-domains-list-table .e-item.disabled .disable-domain{opacity:.5;filter:alpha(opacity=50)}.b-admin-domains-list-table .e-item .delete-domain:hover,.b-admin-domains-list-table .e-item .disable-domain:hover{opacity:1;filter:alpha(opacity=100)}.b-domain-content.modal{width:645px}.b-domain-content .modal-header{background-color:#fff}.b-domain-content .modal-body{position:relative;overflow:hidden;width:1300px;height:390px}.b-domain-content.domain-edit .modal-body{height:350px}.b-domain-content.domain-white-list-page .modal-body{left:-640px}.b-domain-content .error-desc{color:red;margin-left:10px}.b-domain-content .testing-done .imap-header,.b-domain-content .testing-done .smtp-header{color:green;font-weight:700}.b-domain-content .testing-error .imap-header,.b-domain-content .testing-error .smtp-header{color:red}.b-admin-packages .alert{width:650px}.b-admin-packages .process-place{visibility:hidden}.b-admin-packages-list-table{width:700px}.b-admin-packages-list-table .e-item .package-img{font-size:12px;margin-right:2px}.b-admin-packages-list-table .e-item .package-name.core{font-weight:700}.b-admin-packages-list-table .e-item .package-desc{color:#999;font-size:12px}.b-admin-packages-list-table .e-item .e-action{cursor:pointer}.b-admin-packages-list-table .e-item .package-release-parent,.b-admin-packages-list-table .e-item .package-actions-parent{text-align:center}.b-admin-packages-list-table .e-item .package-actions-parent{vertical-align:middle}.b-admin-plugins .process-place{visibility:hidden}.b-admin-plugins-list-table.disabled{opacity:.5;filter:alpha(opacity=50);background-color:#eee}.b-admin-plugins-list-table .e-item .e-action{cursor:pointer}.b-admin-plugins-list-table .e-item .plugin-img{font-size:12px;margin-right:2px}.b-admin-plugins-list-table .e-item.disabled .plugin-img,.b-admin-plugins-list-table .e-item.disabled .plugin-name{color:#bbb}.b-admin-plugins-list-table .e-item.disabled .disable-plugin{opacity:.5;filter:alpha(opacity=50)}.b-admin-plugin-property .help-block{margin-bottom:5px}.b-plugin-content.modal{width:660px}.b-plugin-content.modal .modal-body{overflow:auto}.b-plugin-content .modal-header{background-color:#fff}.b-plugin-content .information{display:inline-block;background-color:#ddd;border-radius:10px;cursor:pointer;height:25px;width:30px;text-align:center;padding-top:5px}.b-plugin-content textarea{width:400px;height:50px}.popups .b-activate-content{width:700px}.popups .b-activate-content .modal-header{background-color:#fff}.popups .b-activate-content .help-inline{padding-left:0}.b-settins-left .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 0 0 8px}.b-settins-left .b-content{position:absolute;top:68px;bottom:8px;left:0;right:0;overflow:hidden}.b-settins-left .b-content .content{-webkit-overflow-scrolling:touch}.b-settings-menu .e-item{overflow:hidden;text-decoration:none;outline:0}.b-settings-menu .e-link{position:relative;display:block;height:30px;line-height:29px;font-size:18px;z-index:1;cursor:default;background-color:transparent;color:#888;padding:4px 10px;outline:0;text-decoration:none}.b-settings-menu .e-item.selectable .e-link{cursor:pointer}.b-settings-menu .e-item.selectable:hover .e-link,.b-settings-menu .e-item.selectable.selected .e-link{background-color:#555;color:#fff}.b-settins-right .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 5px;color:#fff}.b-settins-right .b-content{position:absolute;top:58px;bottom:8px;left:0;right:8px;overflow-y:auto;z-index:2;background-color:#fff;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.3);-moz-box-shadow:0 2px 8px rgba(0,0,0,.3);box-shadow:0 2px 8px rgba(0,0,0,.3);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.b-settins-right .b-content .content{-webkit-overflow-scrolling:touch}.b-settins-right .b-settings-content{padding:20px}.b-settings-general .notification-desc-denied{color:#999;display:none}.b-settings-general .denied-by-browser .notification-desc-denied{display:inline}.b-settings-general .denied-by-browser .notification-desc{color:#999}.b-settings-general .flag-selector{padding-top:5px}.b-settings-general .flag-name{border-bottom:1px dashed #555}.b-settings-accounts .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-accounts .list-table{width:600px}.b-settings-accounts .list-table td{padding:4px 8px;line-height:30px}.b-settings-accounts .list-table .account-img{font-size:12px;margin-right:5px}.b-settings-accounts .list-table .account-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;line-height:22px;cursor:default}.b-settings-accounts .account-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0;filter:alpha(opacity=0)}.b-settings-accounts .account-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1;filter:alpha(opacity=100)}.b-settings-accounts .account-item .delete-account{cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.b-settings-identities .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-identities .list-table{width:600px}.b-settings-identities .list-table td{padding:4px 8px;line-height:30px}.b-settings-identities .list-table .identity-img{font-size:12px;margin-right:5px}.b-settings-identities .list-table .identity-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;line-height:22px;cursor:pointer}.b-settings-identities .identity-item .e-action{cursor:pointer}.b-settings-identities .identity-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0;filter:alpha(opacity=0)}.b-settings-identities .identity-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1;filter:alpha(opacity=100)}.b-settings-identities .identity-item .delete-identity{cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.b-settings-folders.ignore-folder-subscribe .subscribe-folder,.b-settings-folders.ignore-folder-subscribe .unsubscribe-folder{display:none}.b-settings-folders .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-folders .folders-list-error{width:550px;margin:10px 0}.b-settings-folders .list-table{width:600px}.b-settings-folders .list-table .e-action{cursor:pointer}.b-settings-folders .list-table td{padding:4px 8px;line-height:30px}.b-settings-folders .list-table .folder-padding{display:inline-block;width:0}.b-settings-folders .list-table .folder-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:7px;line-height:22px;cursor:default}.b-settings-folders .list-table .folder-system-name{display:inline-block;line-height:22px;color:#999;cursor:default}.b-settings-folders .list-table .folder-name.can-be-edited:hover{border-bottom:1px dashed #333;cursor:pointer}.b-settings-folders .list-table .folder-name-input{border-width:1px;margin-bottom:0}.b-settings-folders .folder-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0;filter:alpha(opacity=0)}.b-settings-folders .folder-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1;filter:alpha(opacity=100)}.b-settings-folders .folder-item .delete-folder,.b-settings-folders .folder-item .subscribe-folder,.b-settings-folders .folder-item .unsubscribe-folder{cursor:pointer;opacity:.6;filter:alpha(opacity=60)}.b-settings-folders .folder-item .unsubscribe-folder{opacity:.25;filter:alpha(opacity=25)}.b-settings-folders .folder-padding.deep-1{width:25px}.b-settings-folders .folder-padding.deep-2{width:40px}.b-settings-folders .folder-padding.deep-3{width:55px}.b-settings-folders .folder-padding.deep-4{width:70px}.b-settings-folders .folder-padding.deep-5{width:85px}.b-themes-list .e-item{display:inline-block;border:2px solid transparent;cursor:pointer;color:#000;background-color:#fff;padding:16px;margin:5px}.b-themes-list .e-item:hover{border:2px solid grey}.b-themes-list .e-item.selected{background-color:#eee;border:2px solid #000}.b-themes-list .e-item .e-image{width:100px;height:100px;border:1px solid #ddd}@keyframes highlight-folder-row{0%{transform:scale(1)}50%{transform:scale(1.1)}100%{transform:scale(1)}}@-moz-keyframes highlight-folder-row{0%{-moz-transform:scale(1)}50%{-moz-transform:scale(1.1)}100%{-moz-transform:scale(1)}}@-webkit-keyframes highlight-folder-row{0%{-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.1)}100%{-webkit-transform:scale(1)}}@-webkit-keyframes textLoadingAnimationKeyFrame{0%{opacity:1}33%{opacity:0}100%{opacity:1}}@-moz-keyframes textLoadingAnimationKeyFrame{0%{opacity:1}33%{opacity:0}100%{opacity:1}}@keyframes textLoadingAnimationKeyFrame{0%{opacity:1}33%{opacity:0}100%{opacity:1}}@-webkit-keyframes animate-stripes{0%{background-position:0 0}100%{background-position:60px 0}}@-moz-keyframes animate-stripes{0%{background-position:0 0}100%{background-position:60px 0}}@keyframes animate-stripes{0%{background-position:0 0}100%{background-position:60px 0}}.rl-anim.rgba.cssanimations.backgroundsize .e-strip-animation{-webkit-background-size:60px 60px;-moz-background-size:60px 60px;background-size:60px 60px;background-image:-webkit-linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);background-image:linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);-webkit-animation:animate-stripes 2s linear infinite;-moz-animation:animate-stripes 2s linear infinite;animation:animate-stripes 2s linear infinite}.rl-anim.csstransitions .b-settings-folders .folder-item .button-delete{-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.rl-anim.csstransitions .b-settings-accounts .account-item .button-delete{-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.rl-anim.csstransitions .b-settings-identities .identity-item .button-delete{-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.rl-anim.csstransitions .b-admin-domains .e-item .button-delete{-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.rl-anim.csstransitions .b-compose .button-delete{-webkit-transition:margin-left .2s linear;-moz-transition:margin-left .2s linear;-o-transition:margin-left .2s linear;transition:margin-left .2s linear}.rl-anim.cssanimations .b-folders .e-item .anim-action-class{-webkit-animation:highlight-folder-row .5s linear;-moz-animation:highlight-folder-row .5s linear;animation:highlight-folder-row .5s linear}.rl-anim.csstransitions .messageList .messageListItem{-webkit-transition:max-height 400ms ease;-moz-transition:max-height 400ms ease;-o-transition:max-height 400ms ease;transition:max-height 400ms ease}.rl-anim.csstransitions .messageList .listDragOver{-webkit-transition:all 400ms ease;-moz-transition:all 400ms ease;-o-transition:all 400ms ease;transition:all 400ms ease}.rl-anim.csstransitions .b-list-content .e-contact-item{-webkit-transition:max-height 400ms ease;-moz-transition:max-height 400ms ease;-o-transition:max-height 400ms ease;transition:max-height 400ms ease}.rl-anim.csstransitions .modal.b-domain-content .modal-body{-webkit-transition:left 500ms ease;-moz-transition:left 500ms ease;-o-transition:left 500ms ease;transition:left 500ms ease}.rl-anim.csstransitions .modal-open .popups .modal{-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-o-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transition:.3s all cubic-bezier(0.250,.460,.450,.940);-moz-transition:.3s all cubic-bezier(0.250,.460,.450,.940);-o-transition:.3s all cubic-bezier(0.250,.460,.450,.940);transition:.3s all cubic-bezier(0.250,.460,.450,.940);-webkit-transform:scale(0.9);-moz-transform:scale(0.9);-ms-transform:scale(0.9);-o-transform:scale(0.9);transform:scale(0.9)}.rl-anim .modal-open .popups .popup-active.modal{-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none}.rl-anim.cssanimations .b-compose.loading .b-header-toolbar{-webkit-background-size:60px 60px;-moz-background-size:60px 60px;background-size:60px 60px;background-image:-webkit-linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-image:linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);-webkit-animation:animate-stripes 2s linear infinite;-moz-animation:animate-stripes 2s linear infinite;animation:animate-stripes 2s linear infinite}.textLoadingAnimationD1,.textLoadingAnimationD2,.textLoadingAnimationD3{-webkit-animation:textLoadingAnimationKeyFrame 1s linear infinite 0s;-moz-animation:textLoadingAnimationKeyFrame 1s linear infinite 0s;animation:textLoadingAnimationKeyFrame 1s linear infinite 0s}.textLoadingAnimationD2{-webkit-animation-delay:.3s;-moz-animation-delay:.3s;animation-delay:.3s}.textLoadingAnimationD3{-webkit-animation-delay:.6s;-moz-animation-delay:.6s;animation-delay:.6s}.editorToolbar{position:relative;height:20px;margin-top:10px;line-height:19px}.editorToolbar.editorHideToolbar .editorToolbarButtom{display:none}.editorToolbar .editorSwitcher{display:inline-block;vertical-align:middle}.editorToolbar .editorToolbarButtom{display:inline-block;width:16px;height:16px;padding:3px}.editorToolbar .editorToolbarButtom a{display:inline-block;border:0;margin:0;padding:0;width:16px;height:16px;cursor:default;background:url(images/editor.png)}.editorToolbar .editorToolbarButtom a.bold{background-position:0 0}.editorToolbar .editorToolbarButtom a.italic{background-position:-16px 0}.editorToolbar .editorToolbarButtom a.underline{background-position:-32px 0}.editorToolbar .editorToolbarButtom a.strikethrough{background-position:-48px 0}.editorToolbar .editorToolbarButtom a.link{background-position:-64px 0}.editorToolbar .editorToolbarButtom a.unlink{background-position:-80px 0}.editorToolbar .editorToolbarButtom a.orderedlist{background-position:-96px 0}.editorToolbar .editorToolbarButtom a.unorderedlist{background-position:-112px 0}.editorToolbar .editorToolbarButtom a.image{background-position:-128px 0}.editorToolbar .editorToolbarButtom a.h1{background-position:0 -16px}.editorToolbar .editorToolbarButtom a.h2{background-position:-16px -16px}.editorToolbar .editorToolbarButtom a.h3{background-position:-32px -16px}.editorToolbar .editorToolbarButtom a.h4{background-position:-48px -16px}.editorToolbar .editorToolbarButtom a.h5{background-position:-64px -16px}.editorToolbar .editorToolbarButtom a.h6{background-position:-80px -16px}.editorToolbar .editorToolbarButtom a.subscript{background-position:-96px -16px}.editorToolbar .editorToolbarButtom a.superscript{background-position:-112px -16px}.editorToolbar .editorToolbarButtom a.indent{background-position:-128px -16px}.editorToolbar .editorToolbarButtom a.outdent{background-position:-144px -16px}.editorToolbar .editorToolbarButtom a.horizontalrule{background-position:-160px -16px}.editorToolbar .editorToolbarButtom a.p{background-position:-176px -16px}.editorToolbar .editorToolbarButtom a.justifyleft{background-position:0 -32px}.editorToolbar .editorToolbarButtom a.justifycenter{background-position:-16px -32px}.editorToolbar .editorToolbarButtom a.justifyright{background-position:-32px -32px}.editorToolbar .editorToolbarButtom a.increasefontsize{background-position:-48px -32px}.editorToolbar .editorToolbarButtom a.decreasefontsize{background-position:-64px -32px}.editorToolbar .editorToolbarButtom a.forecolor{background-position:-80px -32px}.editorToolbar .editorToolbarButtom a.backcolor{background-position:-80px -32px}.editorToolbar .editorToolbarButtom a.removeformat{background-position:-144px 0}.textAreaParent{padding:0}.textAreaParent .editorHtmlArea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:0!important;overflow:auto;overflow-y:scroll;font-family:arial,sans-serif;font-size:13px;line-height:16px;margin:0;padding:8px}.textAreaParent .editorHtmlArea ul{padding-left:40px}.textAreaParent .editorHtmlArea ul li{list-style-type:disc!important}.textAreaParent .editorHtmlArea ol{padding-left:40px}.textAreaParent .editorHtmlArea ol li{list-style-type:decimal!important}.textAreaParent .editorHtmlArea blockquote{border-left:solid 2px #444;margin-left:5px;padding-left:5px}.textAreaParent .editorHtmlArea img{vertical-align:bottom}.textAreaParent .editorHtmlArea.editorDragOver{background:#ffffef}.textAreaParent .editorTextArea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;border:0!important;width:100%;line-height:16px;margin:0;padding:8px;overflow:auto;overflow-y:scroll}.editorColorPicker .editorCpColors{float:left;margin:0;clear:both;width:128px;border:1px solid #000;backgroud:#000}.editorColorPicker .editorCpColors .editorCpColor{border:1px solid #fff;float:left;width:14px;height:14px}.editorSwitcher{color:#369;text-decoration:underline;cursor:pointer;float:right;padding-bottom:6px}.editorFontStylePicker .editorFpFonts{padding:5px;border:1px solid #000;background-color:#fff}.editorFontStylePicker .editorFpFonts .editorFpFont{padding:5px} \ No newline at end of file diff --git a/rainloop/v/1.3.10.492/static/css/flags.png b/rainloop/v/0.0.0/static/css/flags.png similarity index 100% rename from rainloop/v/1.3.10.492/static/css/flags.png rename to rainloop/v/0.0.0/static/css/flags.png diff --git a/rainloop/v/1.3.10.492/static/css/fonts/icomoon.dev.svg b/rainloop/v/0.0.0/static/css/fonts/icomoon.dev.svg similarity index 100% rename from rainloop/v/1.3.10.492/static/css/fonts/icomoon.dev.svg rename to rainloop/v/0.0.0/static/css/fonts/icomoon.dev.svg diff --git a/rainloop/v/1.3.10.492/static/css/fonts/icomoon.eot b/rainloop/v/0.0.0/static/css/fonts/icomoon.eot similarity index 100% rename from rainloop/v/1.3.10.492/static/css/fonts/icomoon.eot rename to rainloop/v/0.0.0/static/css/fonts/icomoon.eot diff --git a/rainloop/v/1.3.10.492/static/css/fonts/icomoon.svg b/rainloop/v/0.0.0/static/css/fonts/icomoon.svg similarity index 100% rename from rainloop/v/1.3.10.492/static/css/fonts/icomoon.svg rename to rainloop/v/0.0.0/static/css/fonts/icomoon.svg diff --git a/rainloop/v/1.3.10.492/static/css/fonts/icomoon.ttf b/rainloop/v/0.0.0/static/css/fonts/icomoon.ttf similarity index 100% rename from rainloop/v/1.3.10.492/static/css/fonts/icomoon.ttf rename to rainloop/v/0.0.0/static/css/fonts/icomoon.ttf diff --git a/rainloop/v/1.3.10.492/static/css/fonts/icomoon.woff b/rainloop/v/0.0.0/static/css/fonts/icomoon.woff similarity index 100% rename from rainloop/v/1.3.10.492/static/css/fonts/icomoon.woff rename to rainloop/v/0.0.0/static/css/fonts/icomoon.woff diff --git a/rainloop/v/1.3.10.492/static/css/images/editor.png b/rainloop/v/0.0.0/static/css/images/editor.png similarity index 100% rename from rainloop/v/1.3.10.492/static/css/images/editor.png rename to rainloop/v/0.0.0/static/css/images/editor.png diff --git a/rainloop/v/1.3.10.492/static/css/images/empty-contact.png b/rainloop/v/0.0.0/static/css/images/empty-contact.png similarity index 100% rename from rainloop/v/1.3.10.492/static/css/images/empty-contact.png rename to rainloop/v/0.0.0/static/css/images/empty-contact.png diff --git a/rainloop/v/1.3.10.492/static/css/images/grey.png b/rainloop/v/0.0.0/static/css/images/grey.png similarity index 100% rename from rainloop/v/1.3.10.492/static/css/images/grey.png rename to rainloop/v/0.0.0/static/css/images/grey.png diff --git a/rainloop/v/1.3.10.492/static/css/images/icom-message-notification.png b/rainloop/v/0.0.0/static/css/images/icom-message-notification.png similarity index 100% rename from rainloop/v/1.3.10.492/static/css/images/icom-message-notification.png rename to rainloop/v/0.0.0/static/css/images/icom-message-notification.png diff --git a/rainloop/v/1.3.10.492/static/css/images/loader-black.gif b/rainloop/v/0.0.0/static/css/images/loader-black.gif similarity index 100% rename from rainloop/v/1.3.10.492/static/css/images/loader-black.gif rename to rainloop/v/0.0.0/static/css/images/loader-black.gif diff --git a/rainloop/v/1.3.10.492/static/css/images/loader-white.gif b/rainloop/v/0.0.0/static/css/images/loader-white.gif similarity index 100% rename from rainloop/v/1.3.10.492/static/css/images/loader-white.gif rename to rainloop/v/0.0.0/static/css/images/loader-white.gif diff --git a/rainloop/v/1.3.10.492/static/css/images/sync.gif b/rainloop/v/0.0.0/static/css/images/sync.gif similarity index 100% rename from rainloop/v/1.3.10.492/static/css/images/sync.gif rename to rainloop/v/0.0.0/static/css/images/sync.gif diff --git a/rainloop/v/1.3.10.492/static/css/images/sync.png b/rainloop/v/0.0.0/static/css/images/sync.png similarity index 100% rename from rainloop/v/1.3.10.492/static/css/images/sync.png rename to rainloop/v/0.0.0/static/css/images/sync.png diff --git a/rainloop/v/1.3.10.492/static/css/images/white.png b/rainloop/v/0.0.0/static/css/images/white.png similarity index 100% rename from rainloop/v/1.3.10.492/static/css/images/white.png rename to rainloop/v/0.0.0/static/css/images/white.png diff --git a/rainloop/v/0.0.0/static/css/less.css b/rainloop/v/0.0.0/static/css/less.css new file mode 100644 index 000000000..7deaa4f12 --- /dev/null +++ b/rainloop/v/0.0.0/static/css/less.css @@ -0,0 +1,6248 @@ +/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ +.clearfix { + *zoom: 1; +} +.clearfix:before, +.clearfix:after { + display: table; + content: ""; + line-height: 0; +} +.clearfix:after { + clear: both; +} +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} +a { + color: #0088cc; + text-decoration: none; +} +a:hover { + color: #005580; + text-decoration: underline; +} +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} +.row { + margin-left: -20px; + *zoom: 1; +} +.row:before, +.row:after { + display: table; + content: ""; + line-height: 0; +} +.row:after { + clear: both; +} +[class*="span"] { + float: left; + margin-left: 20px; +} +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.span12 { + width: 940px; +} +.span11 { + width: 860px; +} +.span10 { + width: 780px; +} +.span9 { + width: 700px; +} +.span8 { + width: 620px; +} +.span7 { + width: 540px; +} +.span6 { + width: 460px; +} +.span5 { + width: 380px; +} +.span4 { + width: 300px; +} +.span3 { + width: 220px; +} +.span2 { + width: 140px; +} +.span1 { + width: 60px; +} +.offset12 { + margin-left: 980px; +} +.offset11 { + margin-left: 900px; +} +.offset10 { + margin-left: 820px; +} +.offset9 { + margin-left: 740px; +} +.offset8 { + margin-left: 660px; +} +.offset7 { + margin-left: 580px; +} +.offset6 { + margin-left: 500px; +} +.offset5 { + margin-left: 420px; +} +.offset4 { + margin-left: 340px; +} +.offset3 { + margin-left: 260px; +} +.offset2 { + margin-left: 180px; +} +.offset1 { + margin-left: 100px; +} +.row-fluid { + width: 100%; + *zoom: 1; +} +.row-fluid:before, +.row-fluid:after { + display: table; + content: ""; + line-height: 0; +} +.row-fluid:after { + clear: both; +} +.row-fluid [class*="span"] { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; +} +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} +.container:before, +.container:after { + display: table; + content: ""; + line-height: 0; +} +.container:after { + clear: both; +} +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} +.container-fluid:before, +.container-fluid:after { + display: table; + content: ""; + line-height: 0; +} +.container-fluid:after { + clear: both; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 20px; + font-weight: 200; + line-height: 30px; +} +small { + font-size: 85%; +} +strong { + font-weight: bold; +} +em { + font-style: italic; +} +cite { + font-style: normal; +} +.muted { + color: #999999; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 1; + color: inherit; + text-rendering: optimizelegibility; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} +h1 { + font-size: 36px; + line-height: 40px; +} +h2 { + font-size: 30px; + line-height: 40px; +} +h3 { + font-size: 24px; + line-height: 40px; +} +h4 { + font-size: 18px; + line-height: 20px; +} +h5 { + font-size: 14px; + line-height: 20px; +} +h6 { + font-size: 12px; + line-height: 20px; +} +h1 small { + font-size: 24px; +} +h2 small { + font-size: 18px; +} +h3 small { + font-size: 14px; +} +h4 small { + font-size: 14px; +} +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +li { + line-height: 20px; +} +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} +dl { + margin-bottom: 20px; +} +dt, +dd { + line-height: 20px; +} +dt { + font-weight: bold; +} +dd { + margin-left: 10px; +} +.dl-horizontal dt { + float: left; + width: 120px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.dl-horizontal dd { + margin-left: 130px; +} +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} +abbr[title] { + cursor: help; + border-bottom: 1px dotted #999999; +} +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 25px; +} +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} +blockquote small:before { + content: '\2014 \00A0'; +} +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} +blockquote.pull-right small:before { + content: ''; +} +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +pre.prettyprint { + margin-bottom: 20px; +} +pre code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +form { + margin: 0 0 20px; +} +fieldset { + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +legend small { + font-size: 15px; + color: #999999; +} +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} +label { + display: block; + margin-bottom: 5px; +} +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 9px; + font-size: 14px; + line-height: 20px; + color: #555555; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +input, +textarea { + width: 210px; +} +textarea { + height: auto; +} +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear .2s, box-shadow linear .2s; + -moz-transition: border linear .2s, box-shadow linear .2s; + -o-transition: border linear .2s, box-shadow linear .2s; + transition: border linear .2s, box-shadow linear .2s; +} +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + *margin-top: 0; + /* IE7 */ + + margin-top: 1px \9; + /* IE8-9 */ + + line-height: normal; + cursor: pointer; +} +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} +select { + width: 220px; + border: 1px solid #bbb; + background-color: #ffffff; +} +select[multiple], +select[size] { + height: auto; +} +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.uneditable-input, +.uneditable-textarea { + color: #999999; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + cursor: not-allowed; +} +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} +.uneditable-textarea { + width: auto; + height: auto; +} +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} +.radio, +.checkbox { + min-height: 18px; + padding-left: 18px; +} +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} +.input-mini { + width: 60px; +} +.input-small { + width: 90px; +} +.input-medium { + width: 150px; +} +.input-large { + width: 210px; +} +.input-xlarge { + width: 270px; +} +.input-xxlarge { + width: 530px; +} +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} +input, +textarea, +.uneditable-input { + margin-left: 0; +} +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} +input.span12, textarea.span12, .uneditable-input.span12 { + width: 926px; +} +input.span11, textarea.span11, .uneditable-input.span11 { + width: 846px; +} +input.span10, textarea.span10, .uneditable-input.span10 { + width: 766px; +} +input.span9, textarea.span9, .uneditable-input.span9 { + width: 686px; +} +input.span8, textarea.span8, .uneditable-input.span8 { + width: 606px; +} +input.span7, textarea.span7, .uneditable-input.span7 { + width: 526px; +} +input.span6, textarea.span6, .uneditable-input.span6 { + width: 446px; +} +input.span5, textarea.span5, .uneditable-input.span5 { + width: 366px; +} +input.span4, textarea.span4, .uneditable-input.span4 { + width: 286px; +} +input.span3, textarea.span3, .uneditable-input.span3 { + width: 206px; +} +input.span2, textarea.span2, .uneditable-input.span2 { + width: 126px; +} +input.span1, textarea.span1, .uneditable-input.span1 { + width: 46px; +} +.controls-row { + *zoom: 1; +} +.controls-row:before, +.controls-row:after { + display: table; + content: ""; + line-height: 0; +} +.controls-row:after { + clear: both; +} +.controls-row [class*="span"] { + float: left; +} +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} +.control-group.warning > label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.warning .checkbox:focus, +.control-group.warning .radio:focus, +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} +.control-group.error > label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.error .checkbox:focus, +.control-group.error .radio:focus, +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} +.control-group.success > label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.success .checkbox:focus, +.control-group.success .radio:focus, +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} +input:focus:required:invalid, +textarea:focus:required:invalid, +select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} +input:focus:required:invalid:focus, +textarea:focus:required:invalid:focus, +select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} +.form-actions:before, +.form-actions:after { + display: table; + content: ""; + line-height: 0; +} +.form-actions:after { + clear: both; +} +.help-block, +.help-inline { + color: #595959; +} +.help-block { + display: block; + margin-bottom: 10px; +} +.help-inline { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + vertical-align: middle; + padding-left: 5px; +} +.input-append, +.input-prepend { + margin-bottom: 5px; + font-size: 0; + white-space: nowrap; +} +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + font-size: 14px; + vertical-align: top; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn { + margin-left: -1px; + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-append .add-on:last-child, +.input-append .btn:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +/* Allow for input prepend/append in search forms */ +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-bottom: 0; + vertical-align: middle; +} +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} +.control-group { + margin-bottom: 10px; +} +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; + line-height: 0; +} +.form-horizontal .control-group:after { + clear: both; +} +.form-horizontal .control-label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 160px; + *margin-left: 0; +} +.form-horizontal .controls:first-child { + *padding-left: 160px; +} +.form-horizontal .help-block { + margin-top: 10px; + margin-bottom: 0; +} +.form-horizontal .form-actions { + padding-left: 160px; +} +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} +.table { + width: 100%; + margin-bottom: 20px; +} +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table th { + font-weight: bold; +} +.table thead th { + vertical-align: bottom; +} +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} +.table tbody + tbody { + border-top: 2px solid #dddddd; +} +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} +.table-bordered thead:first-child tr:first-child th:first-child, +.table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} +.table-bordered thead:first-child tr:first-child th:last-child, +.table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} +.table-bordered thead:last-child tr:last-child th:first-child, +.table-bordered tbody:last-child tr:last-child td:first-child, +.table-bordered tfoot:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} +.table-bordered thead:last-child tr:last-child th:last-child, +.table-bordered tbody:last-child tr:last-child td:last-child, +.table-bordered tfoot:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-right-topleft: 4px; +} +.table-striped tbody tr:nth-child(odd) td, +.table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} +.table-hover tbody tr:hover td, +.table-hover tbody tr:hover th { + background-color: #f5f5f5; +} +table [class*=span], +.row-fluid table [class*=span] { + display: table-cell; + float: none; + margin-left: 0; +} +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} +table .span13 { + float: none; + width: 1004px; + margin-left: 0; +} +table .span14 { + float: none; + width: 1084px; + margin-left: 0; +} +table .span15 { + float: none; + width: 1164px; + margin-left: 0; +} +table .span16 { + float: none; + width: 1244px; + margin-left: 0; +} +table .span17 { + float: none; + width: 1324px; + margin-left: 0; +} +table .span18 { + float: none; + width: 1404px; + margin-left: 0; +} +table .span19 { + float: none; + width: 1484px; + margin-left: 0; +} +table .span20 { + float: none; + width: 1564px; + margin-left: 0; +} +table .span21 { + float: none; + width: 1644px; + margin-left: 0; +} +table .span22 { + float: none; + width: 1724px; + margin-left: 0; +} +table .span23 { + float: none; + width: 1804px; + margin-left: 0; +} +table .span24 { + float: none; + width: 1884px; + margin-left: 0; +} +.table tbody tr.success td { + background-color: #dff0d8; +} +.table tbody tr.error td { + background-color: #f2dede; +} +.table tbody tr.info td { + background-color: #d9edf7; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle { + *margin-bottom: -3px; +} +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} +.dropdown-menu a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} +.dropdown-menu li > a:hover, +.dropdown-menu li > a:focus, +.dropdown-submenu:hover > a { + text-decoration: none; + color: #ffffff; + background-color: #0088cc; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #0088cc; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} +.dropdown-menu .disabled > a, +.dropdown-menu .disabled > a:hover { + color: #999999; +} +.dropdown-menu .disabled > a:hover { + text-decoration: none; + background-color: transparent; + cursor: default; +} +.open { + *z-index: 1000; +} +.open > .dropdown-menu { + display: block; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: "\2191"; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} +.dropdown-submenu { + position: relative; +} +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} +.dropdown-submenu:hover .dropdown-menu { + display: block; +} +.dropdown-submenu > a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #cccccc; + margin-top: 5px; + margin-right: -10px; +} +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} +.dropdown .dropdown-menu .nav-header { + padding-left: 20px; + padding-right: 20px; +} +.typeahead { + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + position: relative; + height: 0; + overflow: hidden; + overflow: visible \9; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} +.collapse.in { + height: auto; +} +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.btn { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + padding: 4px 14px; + margin-bottom: 0; + font-size: 14px; + line-height: 20px; + *line-height: 20px; + text-align: center; + vertical-align: middle; + cursor: pointer; + color: #333333; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #e6e6e6; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border: 1px solid #bbbbbb; + *border: 0; + border-bottom-color: #a2a2a2; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *margin-left: .3em; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); +} +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} +.btn:active, +.btn.active { + background-color: #cccccc \9; +} +.btn:first-child { + *margin-left: 0; +} +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + *background-color: #d9d9d9; + /* Buttons in IE7 don't get borders, so darken on hover */ + + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn.active, +.btn:active { + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn.disabled, +.btn[disabled] { + cursor: default; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-large { + padding: 9px 14px; + font-size: 16px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.btn-large [class^="icon-"] { + margin-top: 2px; +} +.btn-small { + padding: 3px 9px; + font-size: 12px; + line-height: 18px; +} +.btn-small [class^="icon-"] { + margin-top: 0; +} +.btn-mini { + padding: 2px 6px; + font-size: 11px; + line-height: 16px; +} +.btn-block { + display: block; + width: 100%; + padding-left: 0; + padding-right: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.btn-block + .btn-block { + margin-top: 5px; +} +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} +.btn { + border-color: #c5c5c5; + border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); +} +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #0044cc; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #f89406; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #bd362f; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #51a351; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #2f96b4; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #222222; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} +.btn-link, +.btn-link:active { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-link { + border-color: transparent; + cursor: pointer; + color: #0088cc; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-link:hover { + color: #005580; + text-decoration: underline; + background-color: transparent; +} +.btn-group { + position: relative; + font-size: 0; + white-space: nowrap; + *margin-left: .3em; +} +.btn-group:first-child { + *margin-left: 0; +} +.btn-group + .btn-group { + margin-left: 5px; +} +.btn-toolbar { + font-size: 0; + margin-top: 10px; + margin-bottom: 10px; +} +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} +.btn-toolbar .btn + .btn, +.btn-toolbar .btn-group + .btn, +.btn-toolbar .btn + .btn-group { + margin-left: 5px; +} +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group > .btn + .btn { + margin-left: -1px; +} +.btn-group > .btn, +.btn-group > .dropdown-menu { + font-size: 14px; +} +.btn-group > .btn-mini { + font-size: 11px; +} +.btn-group > .btn-small { + font-size: 12px; +} +.btn-group > .btn-large { + font-size: 16px; +} +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + *padding-top: 5px; + *padding-bottom: 5px; +} +.btn-group > .btn-mini + .dropdown-toggle { + padding-left: 5px; + padding-right: 5px; + *padding-top: 2px; + *padding-bottom: 2px; +} +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} +.btn-group > .btn-large + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; + *padding-top: 7px; + *padding-bottom: 7px; +} +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} +.btn .caret { + margin-top: 8px; + margin-left: 0; +} +.btn-mini .caret, +.btn-small .caret, +.btn-large .caret { + margin-top: 6px; +} +.btn-large .caret { + border-left-width: 5px; + border-right-width: 5px; + border-top-width: 5px; +} +.dropup .btn-large .caret { + border-bottom: 5px solid #000000; + border-top: 0; +} +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} +.btn-group-vertical .btn { + display: block; + float: none; + width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group-vertical .btn + .btn { + margin-left: 0; + margin-top: -1px; +} +.btn-group-vertical .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.btn-group-vertical .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.btn-group-vertical .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} +.btn-group-vertical .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + color: #c09853; +} +.alert h4 { + margin: 0; +} +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #468847; +} +.alert-danger, +.alert-error { + background-color: #f2dede; + border-color: #eed3d7; + color: #b94a48; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #3a87ad; +} +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} +.alert-block p + p { + margin-top: 5px; +} +.modal-open .dropdown-menu { + z-index: 2050; +} +.modal-open .dropdown.open { + *z-index: 2050; +} +.modal-open .popover { + z-index: 2060; +} +.modal-open .tooltip { + z-index: 2080; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 1050; + overflow: auto; + width: 560px; + margin: -250px 0 0 -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + /* IE6-7 */ + + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} +.modal.fade { + -webkit-transition: opacity .3s linear, top .3s ease-out; + -moz-transition: opacity .3s linear, top .3s ease-out; + -o-transition: opacity .3s linear, top .3s ease-out; + transition: opacity .3s linear, top .3s ease-out; + top: -25%; +} +.modal.fade.in { + top: 50%; +} +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} +.modal-header .close { + margin-top: 2px; +} +.modal-header h3 { + margin: 0; + line-height: 30px; +} +.modal-body { + overflow-y: auto; + max-height: 400px; + padding: 15px; +} +.modal-form { + margin-bottom: 0; +} +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; + *zoom: 1; +} +.modal-footer:before, +.modal-footer:after { + display: table; + content: ""; + line-height: 0; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.tooltip { + position: absolute; + z-index: 1030; + display: block; + visibility: visible; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.tooltip.top { + margin-top: -3px; +} +.tooltip.right { + margin-left: 3px; +} +.tooltip.bottom { + margin-top: 3px; +} +.tooltip.left { + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #eeeeee; + text-align: center; + text-decoration: none; + background-color: #333333; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #333333; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #333333; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #333333; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #333333; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + width: 236px; + padding: 1px; + background-color: #ffffff; + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); +} +.popover.top { + margin-bottom: 10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-right: 10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover-content p, +.popover-content ul, +.popover-content ol { + margin-bottom: 0; +} +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: inline-block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover .arrow:after { + content: ""; + z-index: -1; +} +.popover.top .arrow { + bottom: -10px; + left: 50%; + margin-left: -10px; + border-width: 10px 10px 0; + border-top-color: #ffffff; +} +.popover.top .arrow:after { + border-width: 11px 11px 0; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -1px; + left: -11px; +} +.popover.right .arrow { + top: 50%; + left: -10px; + margin-top: -10px; + border-width: 10px 10px 10px 0; + border-right-color: #ffffff; +} +.popover.right .arrow:after { + border-width: 11px 11px 11px 0; + border-right-color: rgba(0, 0, 0, 0.25); + bottom: -11px; + left: -1px; +} +.popover.bottom .arrow { + top: -10px; + left: 50%; + margin-left: -10px; + border-width: 0 10px 10px; + border-bottom-color: #ffffff; +} +.popover.bottom .arrow:after { + border-width: 0 11px 11px; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -1px; + left: -11px; +} +.popover.left .arrow { + top: 50%; + right: -10px; + margin-top: -10px; + border-width: 10px 0 10px 10px; + border-left-color: #ffffff; +} +.popover.left .arrow:after { + border-width: 11px 0 11px 11px; + border-left-color: rgba(0, 0, 0, 0.25); + bottom: -11px; + right: -1px; +} +.label, +.badge { + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + vertical-align: baseline; + white-space: nowrap; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #999999; +} +.label { + padding: 1px 4px 2px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.badge { + padding: 1px 9px 2px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label-important, +.badge-important { + background-color: #b94a48; +} +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} +.label-warning, +.badge-warning { + background-color: #f89406; +} +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} +.label-success, +.badge-success { + background-color: #468847; +} +.label-success[href], +.badge-success[href] { + background-color: #356635; +} +.label-info, +.badge-info { + background-color: #3a87ad; +} +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} +.label-inverse, +.badge-inverse { + background-color: #333333; +} +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} +.btn-mini .label, +.btn-mini .badge { + top: 0; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.progress .bar { + width: 0%; + height: 100%; + color: #ffffff; + float: left; + font-size: 12px; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); + -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); + box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); +} +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; +} +.affix { + position: fixed; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + @font-face { + font-family: 'icomoon'; + src: url('fonts/icomoon.svg#icomoon') format('svg'); + } +} +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + font-size: 15px; + *margin-right: .3em; + vertical-align: text-top; +} +/* White icons with optional class, or on hover/active states of certain elements */ +.icon-white, +.nav > .active > a > [class^="icon-"], +.nav > .active > a > [class*=" icon-"] { + color: #fff; +} +.g-ui-menu .e-item:hover [class^="icon-"], +.g-ui-menu .e-item:hover [class*=" icon-"] { + color: #fff; +} +[class^="icon2-"], +[class*=" icon2-"] { + display: inline-block; + width: 16px; + height: 16px; + line-height: 16px; + font-size: 15px; + *margin-right: .3em; + vertical-align: text-top; + background-repeat: no-repeat; +} +.icon2-none { + background-image: none; +} +.icon3-as-button { + cursor: pointer; +} +.icon-checkbox-checked, +.icon-checkbox-unchecked, +.icon-checkbox-partial, +.icon-radio-checked, +.icon-radio-unchecked { + cursor: pointer; + color: #555; + font-size: 1em; +} +.icon-checkbox-checked:hover, +.icon-checkbox-unchecked:hover, +.icon-checkbox-partial:hover, +.icon-radio-checked:hover, +.icon-radio-unchecked:hover, +.icon-checkbox-checked:active, +.icon-checkbox-unchecked:active, +.icon-checkbox-partial:active, +.icon-radio-checked:active, +.icon-radio-unchecked:active { + color: #000; +} +.icon-white.icon-checkbox-checked, +.icon-white.icon-checkbox-unchecked, +.icon-white.icon-checkbox-partial, +.icon-white.icon-radio-checked, +.icon-white.icon-radio-unchecked { + color: #eee; +} +.icon-white.icon-checkbox-checked:hover, +.icon-white.icon-checkbox-unchecked:hover, +.icon-white.icon-checkbox-partial:hover, +.icon-white.icon-radio-checked:hover, +.icon-white.icon-radio-unchecked:hover, +.icon-white.icon-checkbox-checked:active, +.icon-white.icon-checkbox-unchecked:active, +.icon-white.icon-checkbox-partial:active, +.icon-white.icon-radio-checked:active, +.icon-white.icon-radio-unchecked:active { + color: #fff; +} +.icon-refresh.in-process { + background-position: 0px 0px; + background-image: url('images/sync.gif'); +} +.denied-by-browser { + cursor: default; +} +.denied-by-browser .icon-checkbox-checked, +.denied-by-browser icon-checkbox-unchecked { + cursor: default; +} +.icon-arrow-right-3, +.icon-arrow-down-3 { + width: 16px; + line-height: 20px; +} +.icon2-reload { + background-image: url('images/sync.png'); + background-repeat: no-repeat; +} +.icon2-aminate-reload { + background-image: url('images/sync.gif'); + background-repeat: no-repeat; +} +@-webkit-keyframes rotation { + from { + -webkit-transform: rotate(0deg); + } + to { + -webkit-transform: rotate(359deg); + } +} +@-moz-keyframes rotation { + from { + -moz-transform: rotate(0deg); + } + to { + -moz-transform: rotate(359deg); + } +} +@keyframes rotation { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} +.icon-repeat, +.icon-spinner, +.icon-spinner-2 { + width: 16px; + height: 16px; +} +.icon-repeat:before, +.icon-spinner:before, +.icon-spinner-2:before { + font-size: 16px; + line-height: 100%; +} +html.no-cssanimations .icon-repeat, +html.no-cssanimations .icon-spinner, +html.no-cssanimations .icon-spinner-2 { + background-image: url('images/sync.png'); + background-repeat: no-repeat; + font-family: Arial; +} +html.no-cssanimations .icon-repeat:before, +html.no-cssanimations .icon-spinner:before, +html.no-cssanimations .icon-spinner-2:before { + content: ""; +} +html.no-cssanimations .icon-repeat.animated, +html.no-cssanimations .icon-spinner.animated, +html.no-cssanimations .icon-spinner-2.animated { + background-image: url('images/sync.gif'); +} +html.cssanimations .icon-repeat.animated, +html.cssanimations .icon-spinner.animated, +html.cssanimations .icon-spinner-2.animated { + -webkit-animation: rotation 1s infinite linear; + -moz-animation: rotation 1s infinite linear; + animation: rotation 1s infinite linear; +} +body { + background-color: transparent; +} +label { + cursor: pointer; +} +.legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +.legend small { + font-size: 15px; + color: #999999; +} +.legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +select { + width: 223px; +} +.btn-small.btn-small-small { + padding: 3px 9px; + font-size: 11px; + line-height: 11px; +} +.btn.btn-ellipsis { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +.btn.btn-narrow { + padding-left: 12px; + padding-right: 12px; +} +.dropdown-menu { + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} +.btn { + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + background-image: none; + text-shadow: 0 1px 0 #fff; +} +.btn.disabled, +.btn[disabled] { + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); +} +html.rgba.textshadow .btn.btn-danger, +html.rgba.textshadow .btn.btn-success, +html.rgba.textshadow .btn.btn-primary { + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.3); +} +.btn-toolbar { + margin-top: 0; + margin-bottom: 0; +} +.dropdown-menu { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); +} +.tooltip { + font-size: 14px; +} +.tooltip.in { + opacity: 1; + filter: alpha(opacity=100); +} +.tooltip .tooltip-big { + font-size: 18px; + padding: 0 10px; +} +.tooltip-inner { + padding: 5px 10px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} +.btn-group > .btn:first-child { + -webkit-border-top-left-radius: 2px; + -moz-border-radius-topleft: 2px; + border-top-left-radius: 2px; + -webkit-border-bottom-left-radius: 2px; + -moz-border-radius-bottomleft: 2px; + border-bottom-left-radius: 2px; +} +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 2px; + -moz-border-radius-topright: 2px; + border-top-right-radius: 2px; + -webkit-border-bottom-right-radius: 2px; + -moz-border-radius-bottomright: 2px; + border-bottom-right-radius: 2px; +} +.btn-group > .btn.large:first-child { + -webkit-border-top-left-radius: 2px; + -moz-border-radius-topleft: 2px; + border-top-left-radius: 2px; + -webkit-border-bottom-left-radius: 2px; + -moz-border-radius-bottomleft: 2px; + border-bottom-left-radius: 2px; +} +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 2px; + -moz-border-radius-topright: 2px; + border-top-right-radius: 2px; + -webkit-border-bottom-right-radius: 2px; + -moz-border-radius-bottomright: 2px; + border-bottom-right-radius: 2px; +} +textarea, +input[type="text"], +input[type="password"], +input[type="email"], +input[type="search"] { + border: 1px solid #cccccc; +} +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="email"]:focus, +input[type="search"]:focus { + background-color: #fff; + border: 1px solid #999999; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +input[type="text"], +input[type="password"], +input[type="email"], +input[type="search"] { + height: 20px; + line-height: 20px; +} +select { + border: 1px solid #cccccc; +} +.alert.alert-null-left-margin { + margin-left: 0; +} +.alert.alert-error a { + color: #b94a48; +} +html.no-rgba .modal { + border-width: 0px !important; +} +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.1; + filter: alpha(opacity=10); +} +.popups { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 1100; + overflow: auto; +} +.popups .modal { + position: static; + z-index: 1101; + margin: 5% auto; + background-color: transparent; + overflow: hidden; + -webkit-box-shadow: 0 5px 80px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 5px 80px rgba(0, 0, 0, 0.3); + box-shadow: 0 5px 80px rgba(0, 0, 0, 0.3); +} +.popups .modal .modal-body { + background-color: #fff; + max-height: none; +} +.modal.loginContent .modal-body, +.modal.loginAdminContent .modal-body { + background-color: transparent !important; +} +.picker.modal-dialog-bg, +.picker.picker-dialog-bg { + z-index: 2000 !important; +} +.picker.modal-dialog, +.picker.picker-dialog { + z-index: 2001 !important; +} +.select2-container-multi .select2-choices { + background-image: none; + border: 1px solid #cccccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.select2-container-multi .select2-choices .select2-search-choice { + line-height: 15px; + font-size: 16px; +} +.select2-container-multi.select2-container-active .select2-choices { + border: 1px solid #999999; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.select2-drop { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.select2-drop .select2-subname { + color: #777; +} +.select2-drop .select2-highlighted .select2-subname { + color: #eee; +} +.select2-results { + margin: 0; + padding: 0; + max-height: 400px; +} +.select2-results .select2-searching { + padding: 1px 4px; +} +.select2-icon { + line-height: 20px; + padding: 0 0 0 7px; +} +.select2-icon-result { + line-height: 40px; +} +.select2-result-label { + margin: 0px !important; + padding: 5px !important; + font-size: 16px; + height: 40px; + line-height: 40px; +} +.select2-result-label .select2-user-pic { + display: inline-block; + height: 40px; + width: 40px; + margin-right: 10px; +} +.g-ui-user-select-none { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -o-user-select: none; + user-select: none; + -webkit-touch-callout: none; +} +.g-ui-clearfix { + *zoom: 1; +} +.g-ui-clearfix:before, +.g-ui-clearfix:after { + display: table; + content: ""; + line-height: 0; +} +.g-ui-clearfix:after { + clear: both; +} +.g-ui-link { + color: #336699; + text-decoration: underline; + cursor: pointer; +} +.g-ui-min-height-300 { + min-height: 300px; +} +.g-ui-absolute-reset { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; +} +.g-ui-menu { + max-height: 400px; + max-width: 300px; + overflow-y: auto; + overflow-x: hidden; +} +.g-ui-menu .e-link { + text-decoration: none; + cursor: pointer; +} +.g-ui-menu .e-item > .e-link:hover { + background-color: #555; + background-image: none; + color: #fff; +} +.g-ui-menu .e-item.disable > .e-link { + cursor: not-allowed; + background-color: #fff; + background-image: none; + color: grey; +} +.g-ui-menu .e-item.disable [class^="icon-"] { + color: grey; +} +.g-ui-table { + display: table; + width: 100%; +} +.g-ui-table .e-row { + display: table-row; +} +.g-ui-table .e-cell { + display: table-cell; + vertical-align: top; + text-align: left; +} +.g-ui-resizable-delimiter-highlight { + border: none; + border-right: 6px solid #aaa; +} +html.rgba .g-ui-resizable-delimiter-highlight { + border-right-color: rgba(0, 0, 0, 0.2); +} +.settings-saved-trigger { + display: inline-block; + line-height: 17px; + font-size: 16px; +} +.settings-saved-trigger .animated { + color: green; +} +.settings-saved-trigger .success { + color: green; + -webkit-transition: opacity 0.5s linear; + -moz-transition: opacity 0.5s linear; + -o-transition: opacity 0.5s linear; + transition: opacity 0.5s linear; + opacity: 0; + filter: alpha(opacity=0); +} +.settings-saved-trigger .error { + color: red; + -webkit-transition: opacity 0.5s linear; + -moz-transition: opacity 0.5s linear; + -o-transition: opacity 0.5s linear; + transition: opacity 0.5s linear; + opacity: 0; + filter: alpha(opacity=0); +} +.settings-saved-trigger .visible { + opacity: 1; + filter: alpha(opacity=100); +} +.settings-saved-trigger-input.success { + border-color: green !important; + -webkit-transition: border-color 0.5s linear; + -moz-transition: border-color 0.5s linear; + -o-transition: border-color 0.5s linear; + transition: border-color 0.5s linear; +} +.settings-saved-trigger-input.error { + border-color: red !important; + -webkit-transition: border-color 0.5s linear; + -moz-transition: border-color 0.5s linear; + -o-transition: border-color 0.5s linear; + transition: border-color 0.5s linear; +} +html { + margin: 0; + padding: 0; + overflow: hidden; + font-family: Arial, Verdana, Geneva, sans-serif; +} +body { + margin: 0; + padding: 0; + overflow: hidden; + background-color: #e3e3e3; + font-family: Arial, Verdana, Geneva, sans-serif; + -webkit-touch-callout: none; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; +} +textarea { + resize: none; +} +option:disabled { + color: #aaa; + cursor: not-allowed; +} +body:before { + content: ""; + position: fixed; + top: -10px; + left: 0; + width: 100%; + height: 8px; + z-index: 100; + -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.6); + -moz-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.6); + box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.6); +} +* { + outline: none; +} +select:focus { + outline: none; +} +html.mobile * { + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +#rl-content { + height: 100%; + width: 100%; +} +#rl-center { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; + min-width: 900px; + min-height: 400px; +} +#rl-top { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; + bottom: auto; + z-index: 2; +} +#rl-bottom { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; + top: auto; + z-index: 1; +} +#rl-left { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; + right: auto; + width: 100%; +} +#rl-right { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 0; + margin: 0; + border: 0; + z-index: 0; + z-index: 1; +} +#rl-resizer-right { + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 35%; +} +#rl-resizer-left { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 65%; + min-width: 350px; +} +#rl-top-resizer-right { + position: absolute; + top: 0; + bottom: 0; + right: 0; + left: 230px; +} +#rl-top-resizer-left { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: auto; + min-width: 120px; +} +html.mobile #rl-top-resizer-left { + width: 170px; +} +html.mobile #rl-top-resizer-right { + left: 170px; +} +html.mobile #rl-resizer-left { + width: 350px; +} +html.mobile #rl-resizer-right { + left: 350px; +} +html.rl-no-preview-pane #rl-resizer-left { + right: 5px !important; + width: inherit; +} +html.rl-no-preview-pane #rl-resizer-right { + left: 0 !important; +} +html.rl-no-preview-pane #rl-right .ui-resizable-handle { + display: none !important; +} +#rl-loading, +#rl-loading-error { + position: absolute; + font: 30px Tahoma; + top: 50%; + width: 100%; + height: 65px; + margin: 0; + margin-top: -60px; + background-color: transparent; + background-repeat: no-repeat; + background-position: center 50px; + background-image: url('images/loader-black.gif'); + text-align: center; + color: #000; +} +#rl-loading-error { + background-image: none; + display: none; +} +/** +::-webkit-scrollbar { + height: 10px; + width: 10px; + overflow: visible; +} + +::-webkit-scrollbar-button { + height: 0; + width: 0; +} + +::-webkit-scrollbar-thumb, ::-webkit-scrollbar-track { + background-color: transparent; + background-clip: padding-box; + border-width: 1px 1px 1px 6px; + min-height: 18px; +} + +::-webkit-scrollbar-thumb { + background-color: #bbb; + background-color: rgba(0, 0, 0, 0.2); + border: 2px solid transparent; +} + +::-webkit-scrollbar-corner { + background: transparent; +} +/**/.b-system-drop-down .b-toolbar { + position: absolute; + top: 0; + right: 0; + height: 30px; + padding: 10px 8px; + z-index: 103; +} +.b-system-drop-down .e-facebook-name { + display: inline-block; + padding-top: 4px; +} +.b-system-drop-down .btn.system-dropdown { + padding-left: 10px; + padding-right: 10px; +} +.b-system-drop-down .button-fb-logout { + margin: 5px; +} +.b-system-drop-down .email-title { + display: inline-block; + max-width: 200px; + text-align: left; + text-overflow: ellipsis; + overflow: hidden; +} +.rl-view-model.RL-Login, +.rl-view-model.RL-LoginNew, +.rl-view-model.RL-AdminLogin { + height: 100%; +} +.b-login-content { + height: 100%; + text-align: center; + margin-left: -230px; +} +.b-login-content .loginFormWrapper { + display: inline-block; + vertical-align: middle; + text-align: center; + width: 380px; +} +.b-login-content .loginFormWrapper .loginForm { + background-color: #efefef; + text-align: left; + color: #333; + margin: 0; + float: none; +} +.b-login-content .loginFormWrapper .control-label { + font-size: 16px; + line-height: 30px; +} +.b-login-content .loginFormWrapper .control-group { + margin-bottom: 25px; +} +.b-login-content .loginFormWrapper .wrapper { + padding: 40px 40px 10px 40px; +} +.b-login-content .loginFormWrapper #recaptcha_image img { + border: 1px solid #ccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.b-login-content .loginFormWrapper .inputLoginForm, +.b-login-content .loginFormWrapper .inputEmail, +.b-login-content .loginFormWrapper .inputLogin, +.b-login-content .loginFormWrapper .inputPassword { + font-size: 18px; + height: 30px; + line-height: 29px; +} +.b-login-content .loginFormWrapper .signMeLabel { + margin-top: 5px; +} +.b-login-content .loginFormWrapper .input-append .add-on { + position: relative; + height: 30px; + background: none; + margin-left: -35px; + z-index: 1000; + border: 0px; +} +.b-login-content .loginFormWrapper .input-append .add-on i { + font-size: 17px; + line-height: 29px; + color: #999; +} +.b-login-content .loginFormWrapper .control-group.error .add-on i { + color: #b94a48; +} +.b-login-content .buttonLogin { + margin: 0; +} +.b-login-content .alert { + margin: 0 0 20px 0; + text-align: left; +} +.b-login-content .loginAfter { + display: inline-block; + height: 90%; + vertical-align: middle; + width: 0px; +} +.b-login-content .flag-selector { + margin-bottom: 0; +} +.b-folders .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 30px; + padding: 10px 10px 0 8px; + color: #fff; +} +.b-folders .b-content { + position: absolute; + top: 58px; + bottom: 13px; + left: 0; + right: 0; + overflow: hidden; + overflow-y: auto; +} +.b-folders .b-content .content { + -webkit-overflow-scrolling: touch; +} +.b-folders .b-list-delimiter { + margin: 10px; + border-top: 0px solid #000; + border-bottom: 1px solid #999; +} +.b-folders .e-item { + overflow: hidden; + white-space: nowrap; +} +.b-folders .e-item .e-link { + display: block; + position: relative; + z-index: 1; + height: 34px; + line-height: 34px; + background-color: transparent; + vertical-align: middle; + color: grey; + cursor: not-allowed; + font-size: 14px; + padding: 0; + padding-left: 10px; + padding-right: 10px; + outline: 0; + text-decoration: none; +} +.b-folders .e-item .e-link.selectable { + color: #000; + cursor: pointer; +} +.b-folders .e-item .e-link.selectable:hover, +.b-folders .e-item .e-link.selectable.selected, +.b-folders .e-item .e-link.selectable.droppableHover { + background-color: #555; + color: #fff; +} +.b-folders .e-item .e-link.system { + cursor: default; + color: grey; +} +.b-folders .e-item .e-link .count { + display: none; + margin-top: 5px; + line-height: 19px; +} +.b-folders .e-item .e-link.print-count { + font-weight: bold; +} +.b-folders .e-item .e-link.print-count .count { + display: inline; +} +.b-folders .e-item .e-link .e-collapsed-sign { + cursor: pointer; + width: 22px; + height: 30px; + line-height: 30px; + text-align: center; + vertical-align: inherit; +} +.b-folders .e-item .hidden.e-link { + display: none; +} +.b-folders .e-item .b-sub-folders.collapsed { + max-height: 0; + height: 0; + display: none; +} +.b-folders .b-folder-system-item { + font-weight: bold; +} +.b-folders .b-sub-folders .e-item .e-link { + padding-left: 25px; +} +.b-folders .b-sub-folders.unpaddig-folder .e-item .e-link { + padding-left: 10px; +} +.b-folders .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: 40px; +} +.b-folders .b-sub-folders.unpaddig-folder .b-sub-folders .e-item .e-link { + padding-left: 25px; +} +.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: 55px; +} +.b-folders .b-sub-folders.unpaddig-folder .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: 40px; +} +.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: 70px; +} +.b-folders .b-sub-folders.unpaddig-folder .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link { + padding-left: 55px; +} +.popups .b-folder-clear-content .modal-header { + background-color: #fff; +} +.popups .b-folder-create-content .modal-header { + background-color: #fff; +} +.popups .b-folder-system-content.modal { + z-index: 1102; +} +.popups .b-folder-system-content .modal-header { + background-color: #fff; +} +.popups .b-languages-content.modal { + z-index: 1103; + width: 520px; +} +.popups .b-languages-content.exp { + width: 521px; +} +.popups .b-languages-content .modal-header { + background-color: #fff; +} +.popups .b-languages-content .lang-item { + display: inline-block; + padding: 5px 15px; + margin: 2px 5px; + width: 200px; + background-color: #fff; + text-align: left; +} +.popups .b-languages-content .lang-item.selected { + background-color: #f5f5f5; +} +.popups .b-languages-content .lang-item:hover { + background-color: #eee; +} +.popups .b-account-add-content .modal-header { + background-color: #fff; +} +.popups .b-identity-content .modal-header { + background-color: #fff; +} +.popups .b-identity-content .textEmail { + margin-top: 5px; + font-weight: bold; +} +.popups .b-advanced-search-content.modal { + width: 750px; +} +.popups .b-advanced-search-content.modal .control-label { + width: 100px; +} +.popups .b-advanced-search-content.modal .controls { + margin-left: 110px; +} +.popups .b-advanced-search-content .modal-header { + background-color: #fff; +} +html.rl-no-preview-pane .messageList.message-selected { + display: none; +} +.messageList .toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 30px; + padding: 10px 1px; + min-width: 280px; + z-index: 102; +} +.messageList .b-footer { + position: absolute; + bottom: 0; + right: 0; + left: 0; + height: 29px; + padding: 10px; + min-width: 300px; + z-index: 101; + background-color: #eee; + -webkit-border-bottom-right-radius: 5px; + -moz-border-radius-bottomright: 5px; + border-bottom-right-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-radius-bottomleft: 5px; + border-bottom-left-radius: 5px; +} +.messageList .b-footer .e-quota { + display: inline-block; + margin-left: 10px; + font-size: 18px; + cursor: help; +} +.messageList .b-footer .e-quota:hover { + border-bottom: 1px dashed #333; +} +.messageList .inputSearch { + width: 258px; +} +.messageList .btn.buttonMoreSearch { + padding-left: 8px; + padding-right: 8px; +} +.messageList .b-message-list-wrapper { + position: absolute; + top: 50px; + right: 0; + left: 0; + bottom: 5px; + border: 1px solid #aaaaaa; + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + z-index: 101; +} +.messageList .second-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 29px; + padding: 10px 8px 10px 11px; + min-width: 280px; + z-index: 101; + background-color: #eee; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-topright: 5px; + border-top-right-radius: 5px; + -webkit-border-top-left-radius: 5px; + -moz-border-radius-topleft: 5px; + border-top-left-radius: 5px; +} +.messageList .second-toolbar .checkboxCkeckAll { + margin: 5px 0; +} +.messageList .mainDelimiter { + position: absolute; + left: 0; + right: 0; + height: 1px; + z-index: 101; + background-color: #bbb; +} +.messageList .toolbarDelimiter { + top: 49px; +} +.messageList .footerDelimiter { + bottom: 49px; +} +.messageList .b-content { + position: absolute; + top: 50px; + bottom: 50px; + left: 0; + right: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + z-index: 101; + min-width: 300px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + background-color: #fff; +} +.messageList .b-content .content { + -webkit-overflow-scrolling: touch; +} +.messageList .b-content .listClear { + color: #333; + text-align: center; + padding: 10px; + font-size: 14px; + line-height: 13px; +} +.messageList .b-content .listEmptyList, +.messageList .b-content .listEmptyListLoading, +.messageList .b-content .listDragOver, +.messageList .b-content .listError, +.messageList .b-content .listEmptySearchList { + color: #999; + text-align: center; + padding: 60px 10px; + font-size: 24px; + line-height: 30px; +} +.messageList .b-content .listEmptyList .e-icon, +.messageList .b-content .listEmptyListLoading .e-icon, +.messageList .b-content .listDragOver .e-icon, +.messageList .b-content .listError .e-icon, +.messageList .b-content .listEmptySearchList .e-icon { + font-size: 24px; + line-height: 30px; +} +.messageList .b-content .listDragOver { + max-height: 0; + overflow: hidden; + padding: 0 10px; +} +.messageList .b-content .listDragOver.viewAppendArea { + max-height: 120px; + padding: 30px 10px; +} +.messageList .b-content .listDragOver.dragOverEnter { + background-color: #e0fdda; + color: #333; +} +.messageList .b-content .listError { + color: #DA4F49; +} +.messageList .b-content .listSearchDesc { + font-size: 20px; + padding: 20px; + border-bottom: 1px solid #eee; +} +.messageList .b-content .delimiter { + display: block; + height: 1px; + background-color: #e5e5e5; +} +.messageList .b-content .messageListItem:last-child { + border-bottom: 1px solid #e5e5e5; +} +.messageList .b-content .messageListItem:last-child.selected { + border-bottom: 1px solid #bfd5ef; +} +.messageList .b-content .fullThreadsParent { + height: 25px; + padding: 3px 5px; + background-color: #f4f4f4; + text-align: center; +} +.messageList .b-content .messageListItem { + position: relative; + height: 52px; + max-height: 60px; + font-size: 12px; + line-height: 21px; + overflow: hidden; + cursor: pointer; + margin: 0px; + border: 0px solid transparent; + z-index: 100; + background-color: #f9f9f9; +} +.messageList .b-content .messageListItem .delimiter { + position: relative; + display: block; + height: 1px; + background-color: #999; + opacity: 0.2; + filter: alpha(opacity=20); +} +.messageList .b-content .messageListItem .wrapper { + padding: 5px 0; +} +.messageList .b-content .messageListItem .sidebarParent { + display: inline-block; + width: 6px; + background-color: #eee; + float: left; + height: 100%; +} +.messageList .b-content .messageListItem.e-single-line { + height: 35px; +} +.messageList .b-content .messageListItem.e-single-line .wrapper { + line-height: 25px; + padding: 5px; +} +.messageList .b-content .messageListItem.new { + max-height: 0px; +} +.messageList .b-content .messageListItem.deleted { + max-height: 0px; + border-color: transparent !important; +} +.messageList .b-content .messageListItem .checkedParent { + display: inline-block; + float: left; + margin-top: 11px; + padding: 0 8px 0 6px; + font-size: 14px; +} +.messageList .b-content .messageListItem.e-single-line .checkedParent { + margin-top: 1px; +} +.messageList .b-content .messageListItem .flagParent { + display: inline-block; + float: right; + padding: 0 8px 0 5px; +} +.messageList .b-content .messageListItem.e-single-line .flagParent { + float: left; + padding: 0 8px 0 2px; +} +.messageList .b-content .messageListItem .dateParent { + display: inline-block; + float: right; + position: relative; + margin: 0 5px; + color: #999; + font-size: 11px; +} +.messageList .b-content .messageListItem .attachmentParent { + display: inline-block; + float: right; + position: relative; + margin: 2px 8px 0 5px; +} +.messageList .b-content .messageListItem.e-single-line .attachmentParent { + float: left; + margin: 0 5px 0 0; +} +.messageList .b-content .messageListItem .senderParent { + display: block; + overflow: hidden; + text-overflow: ellipsis; +} +.messageList .b-content .messageListItem .threadsCountParent { + display: inline; + overflow: hidden; + background-color: #eee; + padding: 1px 5px; + margin-right: 5px; + border: 1px solid #ccc; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.messageList .b-content .messageListItem .threadsCountParent.lastSelected { + background-color: #999; + border-color: #999; + color: #fff; +} +.messageList .b-content .messageListItem .threadsCountParent:hover { + border-color: #666; +} +.messageList .b-content .messageListItem.e-single-line .senderParent { + display: inline-block; + text-overflow: none; + width: 200px; + float: left; + font-weight: normal; +} +.messageList .b-content .messageListItem .subjectParent { + display: block; + overflow: hidden; + text-overflow: ellipsis; + color: #000; +} +.messageList .b-content .messageListItem .senderParent, +.messageList .b-content .messageListItem .subjectParent, +.messageList .b-content .messageListItem .dateParent { + white-space: nowrap; +} +.messageList .b-content .messageListItem .subjectParent .emptySubjectText { + display: none; + font-style: italic; + color: #999; +} +.messageList .b-content .messageListItem.emptySubject .subjectParent .subject { + display: none; +} +.messageList .b-content .messageListItem.emptySubject .subjectParent .emptySubjectText { + display: inline; +} +.messageList .b-content .messageListItem .sender, +.messageList .b-content .messageListItem .subject { + overflow: hidden; + text-overflow: ellipsis; +} +.messageList .b-content .messageListItem .attachment { + display: none; +} +.messageList .b-content .messageListItem .flagOff, +.messageList .b-content .messageListItem .flagOn, +.messageList .b-content .messageListItem .flagOnHalf { + cursor: pointer; + display: inline-block; +} +.messageList .b-content .messageListItem .flagOff { + opacity: 0.5; + filter: alpha(opacity=50); +} +.messageList .b-content .messageListItem .flagOff:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.messageList .b-content .messageListItem .flagOn, +.messageList .b-content .messageListItem .flagOnHalf { + display: none; + color: orange; +} +.messageList .b-content .messageListItem .replyFlag, +.messageList .b-content .messageListItem .forwardFlag { + display: none; +} +.messageList .b-content .messageListItem.answered .replyFlag { + display: inline-block; +} +.messageList .b-content .messageListItem.forwarded .forwardFlag { + display: inline-block; +} +.messageList .b-content .messageListItem.withAttachments .attachment { + display: inline-block; + color: #666; + text-shadow: 0px 1px 0px #eee; +} +.messageList .b-content .messageListItem.unseen { + background-color: #FFFFD9; +} +.messageList .b-content .messageListItem.unseen .sender, +.messageList .b-content .messageListItem.unseen .subject { + font-weight: bold; +} +.messageList .b-content .messageListItem.unseen .sidebarParent { + background-color: orange; +} +.messageList .b-content .messageListItem.hasUnseenSubMessage { + background-color: #FFFFD9; +} +.messageList .b-content .messageListItem.hasUnseenSubMessage .sidebarParent { + background-color: #ffdb99; +} +.messageList .b-content .messageListItem.hasParentMessage { + background-color: #ecf0f1; +} +.messageList .b-content .messageListItem.hasParentMessage .sidebarParent { + background-color: #bdc3c7; +} +.messageList .b-content .messageListItem.hasParentMessage.unseen { + background-color: #dde4e6; +} +.messageList .b-content .messageListItem.hasParentMessage.unseen .sidebarParent { + background-color: #6c777f; +} +.messageList .b-content .messageListItem.checked .sidebarParent { + background-color: #69a8f5 !important; +} +.messageList .b-content .messageListItem.selected { + background-color: #DFEFFF; + z-index: 102; +} +.messageList .b-content .messageListItem.selected .sidebarParent { + background-color: #398CF2 !important; +} +.messageList .b-content .messageListItem.selected .delimiter { + background-color: #398CF2; + opacity: 0.2; + filter: alpha(opacity=20); +} +.messageList .b-content .messageListItem.selected + .messageListItem .delimiter { + background-color: #398CF2; + opacity: 0.3; + filter: alpha(opacity=30); +} +.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOff, +.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOn { + display: none; +} +.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOnHalf { + display: inline-block; +} +.messageList .b-content .messageListItem.flagged .flagOff, +.messageList .b-content .messageListItem.flagged .flagOnHalf { + display: none; +} +.messageList .b-content .messageListItem.flagged .flagOn { + display: inline-block; +} +.messageList.hideMessageListCheckbox .checkedParent, +.messageList.hideMessageListCheckbox .checkboxCkeckAll { + display: none !important; +} +.messageList.hideMessageListCheckbox .sidebarParent { + margin-right: 10px !important; +} +.messageList .pagenator .page { + display: inline-block; + color: #999; + text-decoration: none; + font-size: 24px; + padding: 3px; + cursor: pointer; +} +.messageList .pagenator .page:hover .pageNumber { + color: #555; +} +.messageList .pagenator .page.current .pageNumber { + font-size: 28px; + color: #333; + border-bottom: 2px solid #000; +} +.draggablePlace { + z-index: 10002; + color: #fff; + background-color: #333; + background-color: rgba(0, 0, 0, 0.5); + padding: 4px 10px; + min-width: 30px; + height: 20px; + cursor: pointer; + cursor: move; +} +html.rl-no-preview-pane .messageView { + display: none; +} +html.rl-no-preview-pane .messageView.message-selected { + display: block; +} +.messageView { + z-index: 100; +} +.messageView .toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 30px; + padding: 10px 0; + color: #fff; +} +.messageView .b-content { + position: absolute; + margin: 0; + top: 58px; + bottom: 13px; + right: 8px; + left: 0; + overflow: hidden; + border: 1px solid #aaaaaa; + border-left: 0px; + -webkit-border-top-right-radius: 3px; + -moz-border-radius-topright: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -moz-border-radius-bottomright: 3px; + border-bottom-right-radius: 3px; + background-color: #fff; +} +.messageView .b-content .b-message-view-desc { + text-align: center; + font-size: 24px; + line-height: 30px; + padding-top: 120px; + color: #999; +} +.messageView .b-content .b-message-view-desc.error { + color: #DA4F49; +} +.messageView .b-content .content { + -webkit-overflow-scrolling: touch; +} +.messageView .b-content .messageItem { + position: absolute; + top: 0px; + bottom: 0; + left: 0; + right: 0; + overflow: auto; + -webkit-overflow-scrolling: touch; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.messageView .b-content .messageItem .emptySubjectText { + display: none; + font-style: italic; + color: #999; +} +.messageView .b-content .messageItem.emptySubject .emptySubjectText { + display: inline; +} +.messageView .b-content .messageItem .buttonUp, +.messageView .b-content .messageItem .buttonUnFull, +.messageView .b-content .messageItem .buttonFull { + display: inline-block; + position: fixed; + right: 30px; + top: 90px; + height: 30px; + width: 30px; + text-align: center; + vertical-align: middle; + line-height: 30px; + background-color: transparent; + background-color: #fff; + border: 1px solid #333; + color: #333; + z-index: 2; + cursor: pointer; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + opacity: 0.3; + filter: alpha(opacity=30); +} +.messageView .b-content .messageItem .buttonUp:hover, +.messageView .b-content .messageItem .buttonUnFull:hover, +.messageView .b-content .messageItem .buttonFull:hover { + opacity: 0.8; + filter: alpha(opacity=80); + border-color: #000; + background-color: #888; + color: #fff; +} +.messageView .b-content .messageItem .buttonUp { + right: 70px; + z-index: 0; +} +.messageView .b-content .messageItem .buttonUnFull { + display: none; +} +.messageView .b-content .messageItem .messageItemHeader { + position: relative; + padding: 10px; + background-color: #f8f8f8; + border-top: 0px; + border-bottom: 1px solid #ddd; + z-index: 1; +} +.messageView .b-content .messageItem .messageItemHeader .fromPic { + display: inline-block; + width: 50px; + height: 50px; + float: left; + padding: 2px; + margin: 0 5px 0 0; + background: #fff; + border: 1px solid #ccc; + border-radius: 10px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.messageView .b-content .messageItem .messageItemHeader .subjectParent { + font-size: 16px; + font-weight: bold; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + margin-left: 3px; +} +.messageView .b-content .messageItem .messageItemHeader .senderParent { + margin-top: 10px; +} +.messageView .b-content .messageItem .messageItemHeader .messageButtons { + margin-top: 5px; +} +.messageView .b-content .messageItem .messageItemHeader .informationShort { + margin-left: 15px; +} +.messageView .b-content .messageItem .messageItemHeader .informationShort a { + color: #336699; + text-decoration: underline; + cursor: pointer; +} +.messageView .b-content .messageItem .messageItemHeader .informationFull { + margin-top: 10px; + border: 1px solid #ddd; + background-color: #fff; + border-radius: 5px; + padding: 10px 15px; +} +.messageView .b-content .messageItem .loading { + text-align: center; + font-size: 24px; + color: grey; + padding-top: 50px; +} +.messageView .b-content .messageItem .line-loading { + height: 0px; +} +.messageView .b-content .messageItem .showImages { + cursor: pointer; + background-color: #eee; + padding: 10px 15px; + border-bottom: 1px solid #ccc; +} +.messageView .b-content .messageItem .attachmentsPlace { + padding: 10px; +} +.messageView .b-content .messageItem .attachmentsPlace .attachmentList { + margin: 0; +} +.messageView .b-content .messageItem .attachmentsPlace .attachmentList .attachmentItem { + display: inline-block; + margin: 5px; + padding: 5px; + max-width: 170px; + min-width: 60px; + overflow: hidden; + cursor: pointer; + list-style: none; + line-height: 24px; + border: 2px solid grey; + background-color: #fff; + box-shadow: 1px 1px 5px #ccc; + box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.messageView .b-content .messageItem .attachmentsPlace .attachmentList .attachmentItem .attachmentIcon { + font-size: 23px; + width: 23px; + height: 23px; +} +.messageView .b-content .messageItem .attachmentsPlace .attachmentList .attachmentItem .attachmentPreview { + color: #999; + margin: 0px 5px; +} +.messageView .b-content .messageItem .attachmentsPlace .attachmentList .attachmentItem .attachmentPreview:hover { + color: #333; +} +.messageView .b-content .messageItem .rlBlockquoteSwitcher { + background-color: #eee; + border: 1px solid #999; + display: inline-block; + width: 30px; + height: 14px; + line-height: 14px; + text-align: center; + cursor: pointer; + margin: 10px 0px; + opacity: 0.5; + filter: alpha(opacity=50); +} +.messageView .b-content .messageItem .rlBlockquoteSwitcher:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.messageView .b-content .messageItem .bodyText { + color: #000; + font-family: arial, sans-serif; +} +.messageView .b-content .messageItem .bodyText .b-text-part a { + color: blue; + text-decoration: underline; +} +.messageView .b-content .messageItem .bodyText .b-text-part a:visited { + color: #609; +} +.messageView .b-content .messageItem .bodyText .b-text-part a:active { + color: red; +} +.messageView .b-content .messageItem .bodyText .b-text-part table { + border-collapse: separate; +} +.messageView .b-content .messageItem .bodyText .b-text-part blockquote { + border-left: 2px solid #000; + margin: 0; + padding: 0px 10px; +} +.messageView .b-content .messageItem .bodyText .b-text-part .rl-bq-switcher.hidden-bq { + display: none; +} +.messageView .b-content .messageItem .bodyText .b-text-part.rtl-text-part { + direction: rtl; +} +.messageView .b-content .messageItem .bodyText .b-text-part.html .mailso-body { + margin: 15px; +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain { + padding: 15px; +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain pre { + margin: 0px; + padding: 0px; + font-family: arial, sans-serif; + background: #fff; + border: none; + white-space: normal; +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote { + border-left: 2px solid blue; + color: blue; +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote { + border-left: 2px solid green; + color: green; +} +.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote blockquote { + border-left: 2px solid red; + color: red; +} +html.rl-no-preview-pane .messageView .toolbar { + padding-left: 1px; +} +html.rl-no-preview-pane .messageView .b-content { + top: 50px; + bottom: 5px; + right: 5px; + border: 1px solid #aaaaaa; + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +html.rl-no-preview-pane .messageView .b-content .buttonUp, +html.rl-no-preview-pane .messageView .b-content .buttonUnFull, +html.rl-no-preview-pane .messageView .b-content .buttonFull { + top: 70px; +} +html.cssanimations.rl-anim .line-loading { + height: 5px !important; +} +html.rl-message-fullscreen #rl-left, +html.rl-message-fullscreen #rl-bottom { + display: none !important; +} +html.rl-message-fullscreen #rl-right .RL-MailMessageList, +html.rl-message-fullscreen #rl-right .RL-SettingsPane, +html.rl-message-fullscreen #rl-right .RL-SystemDropDown, +html.rl-message-fullscreen #rl-right .RL-MailMessageView .messageView .toolbar { + display: none !important; +} +html.rl-message-fullscreen .messageView .b-content { + position: fixed; + margin: 5px; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 10000; +} +html.rl-message-fullscreen .messageView .b-content .buttonUp, +html.rl-message-fullscreen .messageView .b-content .buttonUnFull { + display: inline-block; + top: 36px; +} +html.rl-message-fullscreen .messageView .b-content .buttonFull { + display: none; +} +.b-contacts-content.modal { + position: absolute; + right: 0; + top: 0; + bottom: 0; + left: 0; + width: 900px; + min-height: 300px; + max-height: 700px; + margin: auto; +} +.b-contacts-content.modal .modal-body { + overflow: auto; + height: 100%; + background-color: #f5f5f5; + padding: 0; +} +.b-contacts-content.modal .b-header-toolbar { + height: 40px; + background-color: #aaaaaa; + color: #fff; + background-color: #333; + background-color: rgba(0, 0, 0, 0.8) !important; +} +.b-contacts-content.modal .b-header-toolbar .close { + color: #fff; + opacity: 1; + filter: alpha(opacity=100); +} +.b-contacts-content.modal .b-header-toolbar .btn { + margin-top: 4px; +} +.b-contacts-content.modal .b-header-toolbar .button-new-message { + margin-left: 8px; +} +.b-contacts-content.modal .b-header-toolbar .button-delete { + margin-left: 8px; +} +.b-contacts-content.modal .b-list-toopbar { + padding: 0; + height: 45px; + text-align: center; + width: 250px; + -webkit-box-shadow: inset 0 -1px 0 #cccccc; + -moz-box-shadow: inset 0 -1px 0 #cccccc; + box-shadow: inset 0 -1px 0 #cccccc; +} +.b-contacts-content.modal .b-list-toopbar .e-search { + margin-top: 7px; +} +.b-contacts-content.modal .b-list-content { + position: absolute; + top: 45px; + bottom: 60px; + left: 0; + width: 250px; + overflow: hidden; + overflow-y: auto; +} +.b-contacts-content.modal .b-list-content .content { + -webkit-overflow-scrolling: touch; +} +.b-contacts-content.modal .b-list-content .listClear { + color: #333; + text-align: center; + padding: 10px; + font-size: 14px; + line-height: 13px; + background-color: #fff; +} +.b-contacts-content.modal .b-list-content .listEmptyList, +.b-contacts-content.modal .b-list-content .listEmptyListLoading, +.b-contacts-content.modal .b-list-content .listEmptySearchList { + color: #999; + text-align: center; + padding: 60px 10px; + font-size: 24px; + line-height: 30px; +} +.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkedParent, +.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkboxCkeckAll { + display: none !important; +} +.b-contacts-content.modal .b-list-content.hideContactListCheckbox .sidebarParent { + margin-right: 10px !important; +} +.b-contacts-content.modal .b-list-content .e-contact-foreach { + border-bottom: 1px solid #ddd; +} +.b-contacts-content.modal .b-list-content .e-contact-item { + position: relative; + height: 45px; + max-height: 45px; + line-height: 45px; + overflow: hidden; + cursor: pointer; + margin: 0px; + border: 0px solid transparent; + z-index: 100; +} +.b-contacts-content.modal .b-list-content .e-contact-item .delimiter { + position: relative; + display: block; + height: 1px; + background-color: #999; + opacity: 0.2; + filter: alpha(opacity=20); +} +.b-contacts-content.modal .b-list-content .e-contact-item .wrapper { + padding: 0; +} +.b-contacts-content.modal .b-list-content .e-contact-item .sidebarParent { + display: inline-block; + width: 6px; + background-color: #eee; + float: left; + height: 100%; +} +.b-contacts-content.modal .b-list-content .e-contact-item.deleted { + max-height: 0px; + border-color: transparent !important; +} +.b-contacts-content.modal .b-list-content .e-contact-item .checkedParent { + display: inline-block; + float: left; + padding: 0 8px 0 6px; +} +.b-contacts-content.modal .b-list-content .e-contact-item .nameParent { + display: block; + overflow: hidden; + text-overflow: ellipsis; + color: #333; + font-size: 16px; +} +.b-contacts-content.modal .b-list-content .e-contact-item .nameParent, +.b-contacts-content.modal .b-list-content .e-contact-item .emailParent { + white-space: nowrap; +} +.b-contacts-content.modal .b-list-content .e-contact-item .displayName, +.b-contacts-content.modal .b-list-content .e-contact-item .displayEmail { + overflow: hidden; + text-overflow: ellipsis; +} +.b-contacts-content.modal .b-list-content .e-contact-item .displayImg { + display: inline-block; + float: right; + position: relative; + margin: 0 5px; +} +.b-contacts-content.modal .b-list-content .e-contact-item.checked { + z-index: 101; +} +.b-contacts-content.modal .b-list-content .e-contact-item.checked .sidebarParent { + background-color: #69A8F5; +} +.b-contacts-content.modal .b-list-content .e-contact-item.selected { + background-color: #fff; + z-index: 102; +} +.b-contacts-content.modal .b-list-content .e-contact-item.selected .sidebarParent { + background-color: #398CF2; +} +.b-contacts-content.modal .b-view-content { + position: absolute; + top: 0; + bottom: 60px; + left: 250px; + right: 0; + overflow: hidden; + overflow-y: auto; + background-color: #fff; + border-left: 1px solid #ddd; +} +.b-contacts-content.modal .b-view-content .content { + -webkit-overflow-scrolling: touch; +} +.b-contacts-content.modal .b-view-content .b-contact-view-desc { + text-align: center; + font-size: 24px; + line-height: 30px; + padding-top: 120px; + color: #999; +} +.b-contacts-content.modal .b-view-content .top-part { + margin-top: 20px; +} +.b-contacts-content.modal .b-view-content .top-part .control-label { + text-align: center; +} +.b-contacts-content.modal .b-view-content .image-wrapper { + margin-left: 30px; + border-radius: 10px; +} +.b-contacts-content.modal .b-view-content .image-wrapper img { + border-radius: 10px; +} +.b-contacts-content.modal .b-view-content .top-row { + padding: 10px 0; + height: 30px; +} +.b-contacts-content.modal .b-view-content .contactEmptyValueClick, +.b-contacts-content.modal .b-view-content .contactValueClick, +.b-contacts-content.modal .b-view-content .contactValueInput { + display: inline-block; + font-size: 24px; + line-height: 28px; + height: 28px; +} +.b-contacts-content.modal .b-view-content .contactEmptyValueClick, +.b-contacts-content.modal .b-view-content .contactValueClick { + color: #ddd; + cursor: pointer; + margin: 5px 0 0 7px; +} +.b-contacts-content.modal .b-view-content .contactValueInput { + padding-left: 6px; +} +.b-contacts-content.modal .b-view-content .contactEmptyValueClick { + border-bottom: 1px dashed #ddd; +} +.b-contacts-content.modal .b-view-content .contactValueClick { + color: #555; + border-bottom: 11px dashed transparent; +} +.b-contacts-content.modal .b-view-content .contactValueClick:hover { + color: #000; + border-bottom: 1px dashed #000; +} +.b-contacts-content.modal .b-view-content .hasError .contactValueClick, +.b-contacts-content.modal .b-view-content .hasError .contactValueInput { + color: #ee5f5b; + border: 1px solid #ee5f5b; +} +.b-contacts-content.modal .b-view-content .button-save-contact { + position: absolute; + bottom: 20px; + right: 20px; +} +.b-contacts-content .e-contact-item { + position: relative; + height: 55px; + max-height: 60px; + line-height: 22px; + overflow: hidden; + cursor: pointer; + margin: 0px; + border: 0px solid transparent; + z-index: 100; +} +.b-compose.modal { + width: 850px; + margin: 10px auto; +} +.b-compose.modal .modal-body { + overflow: auto; + padding: 0px; +} +.b-compose .b-header-toolbar { + height: 40px; + background-color: #aaaaaa; + color: #fff; + background-color: #333; + background-color: rgba(0, 0, 0, 0.8) !important; +} +.b-compose .b-header-toolbar .close { + color: #fff; + opacity: 1; + filter: alpha(opacity=100); +} +.b-compose .b-header-toolbar .btn.disable.button-delete { + visibility: hidden; +} +.b-compose .b-header-toolbar .button-save, +.b-compose .b-header-toolbar .button-delete, +.b-compose .b-header-toolbar .saved-text { + margin-left: 8px; +} +.b-compose .b-header-toolbar .disable.button-delete { + margin-left: 0px; +} +.b-compose .b-header { + padding: 10px; + border-bottom: 1px solid #333; + background-color: #eee; + color: #333; +} +.b-compose .b-header .e-identity { + font-weight: bold; +} +.b-compose .b-header .e-identity.multiply { + cursor: pointer; + border-bottom: 1px dashed #555; +} +.b-compose .b-header .e-row { + line-height: 30px; +} +.b-compose .b-header .e-delimiter-row { + line-height: 2px; + height: 5px; +} +.b-compose .b-header .e-label { + text-align: right; + width: 1%; + min-width: 70px; + padding: 6px 10px; +} +.b-compose .b-header .e-value { + padding: 2px 0px; +} +.b-compose .b-header .e-value textarea, +.b-compose .b-header .e-value input[type="text"] { + width: 98%; +} +.b-compose .b-header .e-value textarea { + height: 40px; +} +.b-compose .b-header .e-value .select2-container { + width: 100%; +} +.b-compose .b-header .error-desc { + color: red; +} +.b-compose .b-header .b-appachments .b-attacment { + display: inline-block; + line-height: 20px; +} +.b-compose .b-header .b-appachments .b-attacment-in-process { + display: inline-block; + line-height: 20px; +} +.b-compose .b-header .b-appachments .b-attacment-in-process .uploading { + display: none; + padding-right: 5px; +} +.b-compose .b-header .b-appachments .b-attacment-in-process.uploading .uploading { + display: inline; +} +.b-compose .b-header .b-appachments .b-attacment-in-process .upload-progress { + font-weight: bold; +} +.b-compose .b-header .b-appachments .b-attacment-in-process.error .namedStr { + color: #888; +} +.b-compose .b-header .b-appachments .b-attacment-in-process .error { + color: red; +} +.b-compose .b-header .b-appachments .b-attacment-in-process .close { + float: left; + padding-right: 13px; +} +.b-compose .b-attachment-button { + display: inline-block; +} +.b-compose .b-attachment-place { + position: absolute; + height: 120px; + border: 2px #777 dashed; + line-height: 119px; + text-align: center; + background-color: #fff; + z-index: 300; + left: 20px; + right: 20px; + font-size: 24px; +} +.b-compose .b-attachment-place.drag-and-drop-over { + background: #777; + color: #fff; +} +.b-compose .editorTextArea, +.b-compose .editorHtmlArea { + background: #fff; + color: #000; + font-family: Arial, Verdana, Geneva, sans-serif; + font-size: 14px; +} +.b-compose .editorTextArea table, +.b-compose .editorHtmlArea table { + border-collapse: separate; +} +.b-compose .editorTextArea blockquote, +.b-compose .editorHtmlArea blockquote { + border: 0; + border-left: solid 2px #444; + margin-left: 5px; + margin: 5px 0; + padding-left: 5px; +} +.b-admin-left .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 34px; + padding: 8px 0 0 8px; +} +.b-admin-left .b-content { + position: absolute; + top: 68px; + bottom: 8px; + left: 0; + right: 0; + overflow: hidden; +} +.b-admin-left .b-content .content { + -webkit-overflow-scrolling: touch; +} +.b-admin-menu .e-item { + overflow: hidden; + text-decoration: none; + outline: 0; +} +.b-admin-menu .e-link { + position: relative; + display: block; + height: 30px; + line-height: 29px; + cursor: pointer; + font-size: 18px; + z-index: 1; + cursor: default; + background-color: transparent; + color: #888; + padding: 4px 10px; + outline: 0; + text-decoration: none; +} +.b-admin-menu .e-item.selectable .e-link { + cursor: pointer; +} +.b-admin-menu .e-item.selectable:hover .e-link, +.b-admin-menu .e-item.selectable.selected .e-link { + background-color: #555; + color: #fff; +} +.b-admin-right .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 34px; + padding: 8px 8px; + color: #fff; +} +.b-admin-right .b-content { + position: absolute; + top: 58px; + bottom: 8px; + left: 0; + right: 8px; + overflow-y: auto; + z-index: 2; + background-color: #fff; + border: 1px solid #aaaaaa; + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.b-admin-right .b-content .content { + -webkit-overflow-scrolling: touch; +} +.b-admin-right .b-settings-content { + padding: 20px; +} +.b-admin-domains .process-place { + width: 600px; + padding: 14px 0; + text-align: center; + visibility: hidden; +} +.b-admin-domains-list-table { + width: 600px; +} +.b-admin-domains-list-table .e-item .e-action { + cursor: pointer; +} +.b-admin-domains-list-table .e-item .domain-name { + display: inline-block; + word-break: break-all; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.b-admin-domains-list-table .e-item.disabled .domain-name { + color: #bbb; +} +.b-admin-domains-list-table .e-item .button-delete { + margin-right: 15px; + visibility: hidden; + opacity: 0; + filter: alpha(opacity=0); +} +.b-admin-domains-list-table .e-item .delete-access.button-delete { + visibility: visible; + margin-right: 0; + opacity: 1; + filter: alpha(opacity=100); +} +.b-admin-domains-list-table .e-item .delete-domain, +.b-admin-domains-list-table .e-item .disable-domain { + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +.b-admin-domains-list-table .e-item.disabled .disable-domain { + opacity: 0.5; + filter: alpha(opacity=50); +} +.b-admin-domains-list-table .e-item .delete-domain:hover, +.b-admin-domains-list-table .e-item .disable-domain:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.b-domain-content.modal { + width: 645px; +} +.b-domain-content .modal-header { + background-color: #fff; +} +.b-domain-content .modal-body { + position: relative; + overflow: hidden; + width: 1300px; + height: 390px; +} +.b-domain-content.domain-edit .modal-body { + height: 350px; +} +.b-domain-content.domain-white-list-page .modal-body { + left: -640px; +} +.b-domain-content .error-desc { + color: red; + margin-left: 10px; +} +.b-domain-content .testing-done .imap-header, +.b-domain-content .testing-done .smtp-header { + color: green; + font-weight: bold; +} +.b-domain-content .testing-error .imap-header, +.b-domain-content .testing-error .smtp-header { + color: red; +} +.b-admin-packages .alert { + width: 650px; +} +.b-admin-packages .process-place { + visibility: hidden; +} +.b-admin-packages-list-table { + width: 700px; +} +.b-admin-packages-list-table .e-item .package-img { + font-size: 12px; + margin-right: 2px; +} +.b-admin-packages-list-table .e-item .package-name.core { + font-weight: bold; +} +.b-admin-packages-list-table .e-item .package-desc { + color: #999; + font-size: 12px; +} +.b-admin-packages-list-table .e-item .e-action { + cursor: pointer; +} +.b-admin-packages-list-table .e-item .package-release-parent, +.b-admin-packages-list-table .e-item .package-actions-parent { + text-align: center; +} +.b-admin-packages-list-table .e-item .package-actions-parent { + vertical-align: middle; +} +.b-admin-plugins .process-place { + visibility: hidden; +} +.b-admin-plugins-list-table.disabled { + opacity: 0.5; + filter: alpha(opacity=50); + background-color: #eee; +} +.b-admin-plugins-list-table .e-item .e-action { + cursor: pointer; +} +.b-admin-plugins-list-table .e-item .plugin-img { + font-size: 12px; + margin-right: 2px; +} +.b-admin-plugins-list-table .e-item.disabled .plugin-img, +.b-admin-plugins-list-table .e-item.disabled .plugin-name { + color: #bbb; +} +.b-admin-plugins-list-table .e-item.disabled .disable-plugin { + opacity: 0.5; + filter: alpha(opacity=50); +} +.b-admin-plugin-property .help-block { + margin-bottom: 5px; +} +.b-plugin-content.modal { + width: 660px; +} +.b-plugin-content.modal .modal-body { + overflow: auto; +} +.b-plugin-content .modal-header { + background-color: #fff; +} +.b-plugin-content .information { + display: inline-block; + background-color: #ddd; + border-radius: 10px; + cursor: pointer; + height: 25px; + width: 30px; + text-align: center; + padding-top: 5px; +} +.b-plugin-content textarea { + width: 400px; + height: 50px; +} +.popups .b-activate-content { + width: 700px; +} +.popups .b-activate-content .modal-header { + background-color: #fff; +} +.popups .b-activate-content .help-inline { + padding-left: 0px; +} +.b-settins-left .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 34px; + padding: 8px 0 0 8px; +} +.b-settins-left .b-content { + position: absolute; + top: 68px; + bottom: 8px; + left: 0; + right: 0; + overflow: hidden; +} +.b-settins-left .b-content .content { + -webkit-overflow-scrolling: touch; +} +.b-settings-menu .e-item { + overflow: hidden; + text-decoration: none; + outline: 0; +} +.b-settings-menu .e-link { + position: relative; + display: block; + height: 30px; + line-height: 29px; + font-size: 18px; + z-index: 1; + cursor: default; + background-color: transparent; + color: #888; + padding: 4px 10px; + outline: 0; + text-decoration: none; +} +.b-settings-menu .e-item.selectable .e-link { + cursor: pointer; +} +.b-settings-menu .e-item.selectable:hover .e-link, +.b-settings-menu .e-item.selectable.selected .e-link { + background-color: #555; + color: #fff; +} +.b-settins-right .b-toolbar { + position: absolute; + top: 0; + right: 0; + left: 0; + height: 34px; + padding: 8px 5px; + color: #fff; +} +.b-settins-right .b-content { + position: absolute; + top: 58px; + bottom: 8px; + left: 0; + right: 8px; + overflow-y: auto; + z-index: 2; + background-color: #fff; + border: 1px solid #aaaaaa; + -webkit-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.3); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.b-settins-right .b-content .content { + -webkit-overflow-scrolling: touch; +} +.b-settins-right .b-settings-content { + padding: 20px; +} +.b-settings-general .notification-desc-denied { + color: #999; + display: none; +} +.b-settings-general .denied-by-browser .notification-desc-denied { + display: inline; +} +.b-settings-general .denied-by-browser .notification-desc { + color: #999; +} +.b-settings-general .flag-selector { + padding-top: 5px; +} +.b-settings-general .flag-name { + border-bottom: 1px dashed #555; +} +.b-settings-accounts .process-place { + text-align: center; + width: 600px; + padding: 14px 0; +} +.b-settings-accounts .list-table { + width: 600px; +} +.b-settings-accounts .list-table td { + padding: 4px 8px; + line-height: 30px; +} +.b-settings-accounts .list-table .account-img { + font-size: 12px; + margin-right: 5px; +} +.b-settings-accounts .list-table .account-name { + display: inline-block; + word-break: break-all; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + line-height: 22px; + cursor: default; +} +.b-settings-accounts .account-item .button-delete { + margin-right: 15px; + margin-top: 5px; + visibility: hidden; + opacity: 0; + filter: alpha(opacity=0); +} +.b-settings-accounts .account-item .delete-access.button-delete { + visibility: visible; + margin-right: 0; + opacity: 1; + filter: alpha(opacity=100); +} +.b-settings-accounts .account-item .delete-account { + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +.b-settings-identities .process-place { + text-align: center; + width: 600px; + padding: 14px 0; +} +.b-settings-identities .list-table { + width: 600px; +} +.b-settings-identities .list-table td { + padding: 4px 8px; + line-height: 30px; +} +.b-settings-identities .list-table .identity-img { + font-size: 12px; + margin-right: 5px; +} +.b-settings-identities .list-table .identity-name { + display: inline-block; + word-break: break-all; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + line-height: 22px; + cursor: pointer; +} +.b-settings-identities .identity-item .e-action { + cursor: pointer; +} +.b-settings-identities .identity-item .button-delete { + margin-right: 15px; + margin-top: 5px; + visibility: hidden; + opacity: 0; + filter: alpha(opacity=0); +} +.b-settings-identities .identity-item .delete-access.button-delete { + visibility: visible; + margin-right: 0; + opacity: 1; + filter: alpha(opacity=100); +} +.b-settings-identities .identity-item .delete-identity { + cursor: pointer; + opacity: 0.5; + filter: alpha(opacity=50); +} +.b-settings-folders.ignore-folder-subscribe .subscribe-folder, +.b-settings-folders.ignore-folder-subscribe .unsubscribe-folder { + display: none; +} +.b-settings-folders .process-place { + text-align: center; + width: 600px; + padding: 14px 0; +} +.b-settings-folders .folders-list-error { + width: 550px; + margin: 10px 0px; +} +.b-settings-folders .list-table { + width: 600px; +} +.b-settings-folders .list-table .e-action { + cursor: pointer; +} +.b-settings-folders .list-table td { + padding: 4px 8px; + line-height: 30px; +} +.b-settings-folders .list-table .folder-padding { + display: inline-block; + width: 0; +} +.b-settings-folders .list-table .folder-name { + display: inline-block; + word-break: break-all; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-left: 7px; + line-height: 22px; + cursor: default; +} +.b-settings-folders .list-table .folder-system-name { + display: inline-block; + line-height: 22px; + color: #999; + cursor: default; +} +.b-settings-folders .list-table .folder-name.can-be-edited:hover { + border-bottom: 1px dashed #333; + cursor: pointer; +} +.b-settings-folders .list-table .folder-name-input { + border-width: 1px; + margin-bottom: 0; +} +.b-settings-folders .folder-item .button-delete { + margin-right: 15px; + margin-top: 5px; + visibility: hidden; + opacity: 0; + filter: alpha(opacity=0); +} +.b-settings-folders .folder-item .delete-access.button-delete { + visibility: visible; + margin-right: 0; + opacity: 1; + filter: alpha(opacity=100); +} +.b-settings-folders .folder-item .delete-folder, +.b-settings-folders .folder-item .subscribe-folder, +.b-settings-folders .folder-item .unsubscribe-folder { + cursor: pointer; + opacity: 0.6; + filter: alpha(opacity=60); +} +.b-settings-folders .folder-item .unsubscribe-folder { + opacity: 0.25; + filter: alpha(opacity=25); +} +.b-settings-folders .folder-padding.deep-1 { + width: 25px; +} +.b-settings-folders .folder-padding.deep-2 { + width: 40px; +} +.b-settings-folders .folder-padding.deep-3 { + width: 55px; +} +.b-settings-folders .folder-padding.deep-4 { + width: 70px; +} +.b-settings-folders .folder-padding.deep-5 { + width: 85px; +} +.b-themes-list .e-item { + display: inline-block; + border: 2px solid transparent; + cursor: pointer; + color: #000; + background-color: #fff; + padding: 16px; + margin: 5px; +} +.b-themes-list .e-item:hover { + border: 2px solid grey; +} +.b-themes-list .e-item.selected { + background-color: #eee; + border: 2px solid #000; +} +.b-themes-list .e-item .e-image { + width: 100px; + height: 100px; + border: 1px solid #ddd; +} +@keyframes highlight-folder-row { + 0% { + transform: scale(1); + } + 50% { + transform: scale(1.1); + } + 100% { + transform: scale(1); + } +} +@-moz-keyframes highlight-folder-row { + 0% { + -moz-transform: scale(1); + } + 50% { + -moz-transform: scale(1.1); + } + 100% { + -moz-transform: scale(1); + } +} +@-webkit-keyframes highlight-folder-row { + 0% { + -webkit-transform: scale(1); + } + 50% { + -webkit-transform: scale(1.1); + } + 100% { + -webkit-transform: scale(1); + } +} +@-webkit-keyframes textLoadingAnimationKeyFrame { + 0% { + opacity: 1; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@-moz-keyframes textLoadingAnimationKeyFrame { + 0% { + opacity: 1; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes textLoadingAnimationKeyFrame { + 0% { + opacity: 1; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@-webkit-keyframes animate-stripes { + 0% { + background-position: 0 0; + } + 100% { + background-position: 60px 0; + } +} +@-moz-keyframes animate-stripes { + 0% { + background-position: 0 0; + } + 100% { + background-position: 60px 0; + } +} +@keyframes animate-stripes { + 0% { + background-position: 0 0; + } + 100% { + background-position: 60px 0; + } +} +.rl-anim.rgba.cssanimations.backgroundsize .e-strip-animation { + -webkit-background-size: 60px 60px; + -moz-background-size: 60px 60px; + background-size: 60px 60px; + background-image: -webkit-linear-gradient(135deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(135deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(135deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(135deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%, transparent 75%, transparent); + background-image: linear-gradient(135deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%, transparent 75%, transparent); + -webkit-animation: animate-stripes 2s linear infinite; + -moz-animation: animate-stripes 2s linear infinite; + animation: animate-stripes 2s linear infinite; +} +.rl-anim.csstransitions .b-settings-folders .folder-item .button-delete { + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; +} +.rl-anim.csstransitions .b-settings-accounts .account-item .button-delete { + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; +} +.rl-anim.csstransitions .b-settings-identities .identity-item .button-delete { + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; +} +.rl-anim.csstransitions .b-admin-domains .e-item .button-delete { + -webkit-transition: all 0.2s linear; + -moz-transition: all 0.2s linear; + -o-transition: all 0.2s linear; + transition: all 0.2s linear; +} +.rl-anim.csstransitions .b-compose .button-delete { + -webkit-transition: margin-left 0.2s linear; + -moz-transition: margin-left 0.2s linear; + -o-transition: margin-left 0.2s linear; + transition: margin-left 0.2s linear; +} +.rl-anim.cssanimations .b-folders .e-item .anim-action-class { + -webkit-animation: highlight-folder-row 0.5s linear; + -moz-animation: highlight-folder-row 0.5s linear; + animation: highlight-folder-row 0.5s linear; +} +.rl-anim.csstransitions .messageList .messageListItem { + -webkit-transition: max-height 400ms ease; + -moz-transition: max-height 400ms ease; + -o-transition: max-height 400ms ease; + transition: max-height 400ms ease; +} +.rl-anim.csstransitions .messageList .listDragOver { + -webkit-transition: all 400ms ease; + -moz-transition: all 400ms ease; + -o-transition: all 400ms ease; + transition: all 400ms ease; +} +.rl-anim.csstransitions .b-list-content .e-contact-item { + -webkit-transition: max-height 400ms ease; + -moz-transition: max-height 400ms ease; + -o-transition: max-height 400ms ease; + transition: max-height 400ms ease; +} +.rl-anim.csstransitions .modal.b-domain-content .modal-body { + -webkit-transition: left 500ms ease; + -moz-transition: left 500ms ease; + -o-transition: left 500ms ease; + transition: left 500ms ease; +} +.rl-anim.csstransitions .modal-open .popups .modal { + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + transform-origin: 50% 50%; + -webkit-transition: 0.3s all cubic-bezier(0.250, 0.460, 0.450, 0.940); + -moz-transition: 0.3s all cubic-bezier(0.250, 0.460, 0.450, 0.940); + -o-transition: 0.3s all cubic-bezier(0.250, 0.460, 0.450, 0.940); + transition: 0.3s all cubic-bezier(0.250, 0.460, 0.450, 0.940); + -webkit-transform: scale(0.9); + -moz-transform: scale(0.9); + -ms-transform: scale(0.9); + -o-transform: scale(0.9); + transform: scale(0.9); +} +.rl-anim .modal-open .popups .popup-active.modal { + -webkit-transform: none; + -moz-transform: none; + -o-transform: none; + transform: none; +} +.rl-anim.cssanimations .b-compose.loading .b-header-toolbar { + -webkit-background-size: 60px 60px; + -moz-background-size: 60px 60px; + background-size: 60px 60px; + background-image: -webkit-linear-gradient(135deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(135deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(135deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(135deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + background-image: linear-gradient(135deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent); + -webkit-animation: animate-stripes 2s linear infinite; + -moz-animation: animate-stripes 2s linear infinite; + animation: animate-stripes 2s linear infinite; +} +.textLoadingAnimationD1, +.textLoadingAnimationD2, +.textLoadingAnimationD3 { + -webkit-animation: textLoadingAnimationKeyFrame 1s linear infinite 0s; + -moz-animation: textLoadingAnimationKeyFrame 1s linear infinite 0s; + animation: textLoadingAnimationKeyFrame 1s linear infinite 0s; +} +.textLoadingAnimationD2 { + -webkit-animation-delay: 0.3s; + -moz-animation-delay: 0.3s; + animation-delay: 0.3s; +} +.textLoadingAnimationD3 { + -webkit-animation-delay: 0.6s; + -moz-animation-delay: 0.6s; + animation-delay: 0.6s; +} +.editorToolbar { + position: relative; + height: 20px; + margin-top: 10px; + line-height: 19px; +} +.editorToolbar.editorHideToolbar .editorToolbarButtom { + display: none; +} +.editorToolbar .editorSwitcher { + display: inline-block; + vertical-align: middle; +} +.editorToolbar .editorToolbarButtom { + display: inline-block; + width: 16px; + height: 16px; + padding: 3px; +} +.editorToolbar .editorToolbarButtom a { + display: inline-block; + border: 0px; + margin: 0px; + padding: 0px; + width: 16px; + height: 16px; + cursor: default; + background: url('images/editor.png'); +} +.editorToolbar .editorToolbarButtom a.bold { + background-position: 0 0; +} +.editorToolbar .editorToolbarButtom a.italic { + background-position: -16px 0; +} +.editorToolbar .editorToolbarButtom a.underline { + background-position: -32px 0; +} +.editorToolbar .editorToolbarButtom a.strikethrough { + background-position: -48px 0; +} +.editorToolbar .editorToolbarButtom a.link { + background-position: -64px 0; +} +.editorToolbar .editorToolbarButtom a.unlink { + background-position: -80px 0; +} +.editorToolbar .editorToolbarButtom a.orderedlist { + background-position: -96px 0; +} +.editorToolbar .editorToolbarButtom a.unorderedlist { + background-position: -112px 0; +} +.editorToolbar .editorToolbarButtom a.image { + background-position: -128px 0; +} +.editorToolbar .editorToolbarButtom a.h1 { + background-position: 0 -16px; +} +.editorToolbar .editorToolbarButtom a.h2 { + background-position: -16px -16px; +} +.editorToolbar .editorToolbarButtom a.h3 { + background-position: -32px -16px; +} +.editorToolbar .editorToolbarButtom a.h4 { + background-position: -48px -16px; +} +.editorToolbar .editorToolbarButtom a.h5 { + background-position: -64px -16px; +} +.editorToolbar .editorToolbarButtom a.h6 { + background-position: -80px -16px; +} +.editorToolbar .editorToolbarButtom a.subscript { + background-position: -96px -16px; +} +.editorToolbar .editorToolbarButtom a.superscript { + background-position: -112px -16px; +} +.editorToolbar .editorToolbarButtom a.indent { + background-position: -128px -16px; +} +.editorToolbar .editorToolbarButtom a.outdent { + background-position: -144px -16px; +} +.editorToolbar .editorToolbarButtom a.horizontalrule { + background-position: -160px -16px; +} +.editorToolbar .editorToolbarButtom a.p { + background-position: -176px -16px; +} +.editorToolbar .editorToolbarButtom a.justifyleft { + background-position: 0 -32px; +} +.editorToolbar .editorToolbarButtom a.justifycenter { + background-position: -16px -32px; +} +.editorToolbar .editorToolbarButtom a.justifyright { + background-position: -32px -32px; +} +.editorToolbar .editorToolbarButtom a.increasefontsize { + background-position: -48px -32px; +} +.editorToolbar .editorToolbarButtom a.decreasefontsize { + background-position: -64px -32px; +} +.editorToolbar .editorToolbarButtom a.forecolor { + background-position: -80px -32px; +} +.editorToolbar .editorToolbarButtom a.backcolor { + background-position: -80px -32px; +} +.editorToolbar .editorToolbarButtom a.removeformat { + background-position: -144px 0; +} +.textAreaParent { + padding: 0px; +} +.textAreaParent .editorHtmlArea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border: 0px !important; + overflow: auto; + overflow-y: scroll; + font-family: arial, sans-serif; + font-size: 13px; + line-height: 16px; + margin: 0px; + padding: 8px; +} +.textAreaParent .editorHtmlArea ul { + padding-left: 40px; +} +.textAreaParent .editorHtmlArea ul li { + list-style-type: disc !important; +} +.textAreaParent .editorHtmlArea ol { + padding-left: 40px; +} +.textAreaParent .editorHtmlArea ol li { + list-style-type: decimal !important; +} +.textAreaParent .editorHtmlArea blockquote { + border-left: solid 2px #444; + margin-left: 5px; + padding-left: 5px; +} +.textAreaParent .editorHtmlArea img { + vertical-align: bottom; +} +.textAreaParent .editorHtmlArea.editorDragOver { + background: #ffffef; +} +.textAreaParent .editorTextArea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + display: block; + border: 0px !important; + width: 100%; + line-height: 16px; + margin: 0px; + padding: 8px; + overflow: auto; + overflow-y: scroll; +} +.editorColorPicker .editorCpColors { + float: left; + margin: 0; + clear: both; + width: 128px; + border: 1px solid #000; + backgroud: #000; +} +.editorColorPicker .editorCpColors .editorCpColor { + border: 1px solid #fff; + float: left; + width: 14px; + height: 14px; +} +.editorSwitcher { + color: #336699; + text-decoration: underline; + cursor: pointer; + float: right; + padding-bottom: 6px; +} +.editorFontStylePicker .editorFpFonts { + padding: 5px; + border: 1px solid #000; + background-color: #fff; +} +.editorFontStylePicker .editorFpFonts .editorFpFont { + padding: 5px; +} diff --git a/rainloop/v/1.3.10.492/static/css/select2-spinner.gif b/rainloop/v/0.0.0/static/css/select2-spinner.gif similarity index 100% rename from rainloop/v/1.3.10.492/static/css/select2-spinner.gif rename to rainloop/v/0.0.0/static/css/select2-spinner.gif diff --git a/rainloop/v/1.3.10.492/static/css/select2.png b/rainloop/v/0.0.0/static/css/select2.png similarity index 100% rename from rainloop/v/1.3.10.492/static/css/select2.png rename to rainloop/v/0.0.0/static/css/select2.png diff --git a/rainloop/v/1.3.10.492/static/css/select2x2.png b/rainloop/v/0.0.0/static/css/select2x2.png similarity index 100% rename from rainloop/v/1.3.10.492/static/css/select2x2.png rename to rainloop/v/0.0.0/static/css/select2x2.png diff --git a/rainloop/v/1.3.10.492/static/favicon.ico b/rainloop/v/0.0.0/static/favicon.ico similarity index 100% rename from rainloop/v/1.3.10.492/static/favicon.ico rename to rainloop/v/0.0.0/static/favicon.ico diff --git a/rainloop/v/1.3.10.492/static/favicon.png b/rainloop/v/0.0.0/static/favicon.png similarity index 100% rename from rainloop/v/1.3.10.492/static/favicon.png rename to rainloop/v/0.0.0/static/favicon.png diff --git a/rainloop/v/0.0.0/static/js/admin.js b/rainloop/v/0.0.0/static/js/admin.js new file mode 100644 index 000000000..9d13c2801 --- /dev/null +++ b/rainloop/v/0.0.0/static/js/admin.js @@ -0,0 +1,6845 @@ +/*! RainLoop Admin Module (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */ +(function (window, $, ko, crossroads, hasher, _) { + +'use strict'; + +var + /** + * @type {Object} + */ + Consts = {}, + + /** + * @type {Object} + */ + Enums = {}, + + /** + * @type {Object} + */ + NotificationI18N = {}, + + /** + * @type {Object.} + */ + Utils = {}, + + /** + * @type {Object.} + */ + Plugins = {}, + + /** + * @type {Object.} + */ + Base64 = {}, + + /** + * @type {Object} + */ + Globals = {}, + + /** + * @type {Object} + */ + ViewModels = { + 'settings': [], + 'settings-removed': [], + 'settings-disabled': [] + }, + + /** + * @type {*} + */ + kn = null, + + /** + * @type {Object} + */ + AppData = window['rainloopAppData'] || {}, + + /** + * @type {Object} + */ + I18n = window['rainloopI18N'] || {}, + + $html = $('html'), + + $window = $(window), + + $document = $(window.document), + + NotificationClass = window.Notification && window.Notification.requestPermission ? window.Notification : null +; +/** + * @type {?AdminApp} + */ +var RL = null; +/*jshint onevar: true*/ + +/** + * @type {?} + */ +Globals.now = (new Date()).getTime(); + +/** + * @type {?} + */ +Globals.minuteTick = ko.observable(true); + +/** + * @type {?} + */ +Globals.fiveMinuteTick = ko.observable(true); + +/** + * @type {?} + */ +Globals.langChangeTick = ko.observable(true); + +/** + * @type {number} + */ +Globals.iAjaxErrorCount = 0; + +/** + * @type {number} + */ +Globals.iTokenErrorCount = 0; + +/** + * @type {number} + */ +Globals.iMessageBodyCacheCount = 0; + +/** + * @type {boolean} + */ +Globals.bUnload = false; + +/** + * @type {string} + */ +Globals.sUserAgent = (navigator.userAgent || '').toLowerCase(); + +/** + * @type {boolean} + */ +Globals.bIsiOSDevice = -1 < Globals.sUserAgent.indexOf('iphone') || -1 < Globals.sUserAgent.indexOf('ipod') || -1 < Globals.sUserAgent.indexOf('ipad'); + +/** + * @type {boolean} + */ +Globals.bIsAndroidDevice = -1 < Globals.sUserAgent.indexOf('android'); + +/** + * @type {boolean} + */ +Globals.bMobileDevice = Globals.bIsiOSDevice || Globals.bIsAndroidDevice; + +Globals.bDisableNanoScroll = Globals.bMobileDevice; + +Globals.bAnimationSupported = !Globals.bMobileDevice && $html.hasClass('csstransitions'); + +Globals.sAnimationType = ''; + +Consts.Defaults = {}; +Consts.Values = {}; +Consts.DataImages = {}; + +/** + * @const + * @type {number} + */ +Consts.Defaults.MessagesPerPage = 20; + +/** + * @const + * @type {Array} + */ +Consts.Defaults.MessagesPerPageArray = [10, 20, 30, 50, 100/*, 150, 200, 300*/]; + +/** + * @const + * @type {number} + */ +Consts.Defaults.DefaultAjaxTimeout = 20000; + +/** + * @const + * @type {number} + */ +Consts.Defaults.SearchAjaxTimeout = 120000; + +/** + * @const + * @type {number} + */ +Consts.Defaults.SendMessageAjaxTimeout = 200000; + +/** + * @const + * @type {number} + */ +Consts.Defaults.SaveMessageAjaxTimeout = 200000; + +/** + * @const + * @type {string} + */ +Consts.Values.UnuseOptionValue = '__UNUSE__'; + +/** + * @const + * @type {string} + */ +Consts.Values.GmailFolderName = '[Gmail]'; + +/** + * @const + * @type {string} + */ +Consts.Values.ClientSideCookieIndexName = 'rlcsc'; + +/** + * @const + * @type {number} + */ +Consts.Values.ImapDefaulPort = 143; + +/** + * @const + * @type {number} + */ +Consts.Values.ImapDefaulSecurePort = 993; + +/** + * @const + * @type {number} + */ +Consts.Values.SmtpDefaulPort = 25; + +/** + * @const + * @type {number} + */ +Consts.Values.SmtpDefaulSecurePort = 465; + +/** + * @const + * @type {number} + */ +Consts.Values.iMessageBodyCacheLimit = 15; + +/** + * @const + * @type {string} + */ +Consts.DataImages.UserDotPic = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2P8DwQACgAD/il4QJ8AAAAASUVORK5CYII='; + +/** + * @const + * @type {string} + */ +Consts.DataImages.TranspPic = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2NkAAIAAAoAAggA9GkAAAAASUVORK5CYII='; + +/** + * @enum {string} + */ +Enums.StorageResultType = { + 'Success': 'success', + 'Abort': 'abort', + 'Error': 'error', + 'Unload': 'unload' +}; + +/** + * @enum {number} + */ +Enums.State = { + 'Empty': 10, + 'Login': 20, + 'Auth': 30 +}; + +/** + * @enum {number} + */ +Enums.StateType = { + 'Webmail': 0, + 'Admin': 1 +}; + +/** + * @enum {number} + */ +Enums.FolderType = { + 'Inbox': 10, + 'SentItems': 11, + 'Draft': 12, + 'Trash': 13, + 'Spam': 14, + 'User': 99 +}; + +/** + * @enum {string} + */ +Enums.LoginSignMeTypeAsString = { + 'DefaultOff': 'defaultoff', + 'DefaultOn': 'defaulton', + 'Unused': 'unused' +}; + +/** + * @enum {number} + */ +Enums.LoginSignMeType = { + 'DefaultOff': 0, + 'DefaultOn': 1, + 'Unused': 2 +}; + +/** + * @enum {string} + */ +Enums.ComposeType = { + 'Empty': 'empty', + 'Reply': 'reply', + 'ReplyAll': 'replyall', + 'Forward': 'forward', + 'ForwardAsAttachment': 'forward-as-attachment', + 'Draft': 'draft' +}; + +/** + * @enum {number} + */ +Enums.UploadErrorCode = { + 'Normal': 0, + 'FileIsTooBig': 1, + 'FilePartiallyUploaded': 2, + 'FileNoUploaded': 3, + 'MissingTempFolder': 4, + 'FileOnSaveingError': 5, + 'FileType': 98, + 'Unknown': 99 +}; + +/** + * @enum {number} + */ +Enums.SetSystemFoldersNotification = { + 'None': 0, + 'Sent': 1, + 'Draft': 2, + 'Spam': 3, + 'Trash': 4 +}; + +/** + * @enum {number} + */ +Enums.ClientSideKeyName = { + 'FoldersLashHash': 0, + 'MessagesInboxLastHash': 1, + 'MailBoxListSize': 2, + 'ExpandedFolders': 3, + 'FolderListSize': 4 +}; + +/** + * @enum {number} + */ +Enums.EventKeyCode = { + 'Backspace': 8, + 'Enter': 13, + 'Esc': 27, + 'PageUp': 33, + 'PageDown': 34, + 'Left': 37, + 'Right': 39, + 'Up': 38, + 'Down': 40, + 'End': 35, + 'Home': 36, + 'Insert': 45, + 'Delete': 46, + 'A': 65, + 'S': 83 +}; + +/** + * @enum {number} + */ +Enums.MessageSetAction = { + 'SetSeen': 0, + 'UnsetSeen': 1, + 'SetFlag': 2, + 'UnsetFlag': 3 +}; + +/** + * @enum {number} + */ +Enums.MessageSelectAction = { + 'All': 0, + 'None': 1, + 'Invert': 2, + 'Unseen': 3, + 'Seen': 4, + 'Flagged': 5, + 'Unflagged': 6 +}; + +/** + * @enum {number} + */ +Enums.DesktopNotifications = { + 'Allowed': 0, + 'NotAllowed': 1, + 'Denied': 2, + 'NotSupported': 9 +}; + +/** + * @enum {number} + */ +Enums.MessagePriority = { + 'Low': 5, + 'Normal': 3, + 'High': 1 +}; + +/** + * @enum {string} + */ +Enums.EditorDefaultType = { + 'Html': 'Html', + 'Plain': 'Plain' +}; + +/** + * @enum {string} + */ +Enums.CustomThemeType = { + 'Light': 'Light', + 'Dark': 'Dark' +}; + +/** + * @enum {number} + */ +Enums.ServerSecure = { + 'None': 0, + 'SSL': 1, + 'TLS': 2 +}; + +/** + * @enum {number} + */ +Enums.SearchDateType = { + 'All': -1, + 'Days3': 3, + 'Days7': 7, + 'Month': 30 +}; + +/** + * @enum {number} + */ +Enums.EmailType = { + 'Defailt': 0, + 'Facebook': 1, + 'Google': 2 +}; + +/** + * @enum {number} + */ +Enums.SaveSettingsStep = { + 'Animate': -2, + 'Idle': -1, + 'TrueResult': 1, + 'FalseResult': 0 +}; + +/** + * @enum {string} + */ +Enums.InterfaceAnimation = { + 'None': 'None', + 'Normal': 'Normal', + 'Full': 'Full' +}; + +/** + * @enum {number} + */ +Enums.Notification = { + 'InvalidToken': 101, + 'AuthError': 102, + 'AccessError': 103, + 'ConnectionError': 104, + 'CaptchaError': 105, + 'SocialFacebookLoginAccessDisable': 106, + 'SocialTwitterLoginAccessDisable': 107, + 'SocialGoogleLoginAccessDisable': 108, + 'DomainNotAllowed': 109, + 'AccountNotAllowed': 110, + + 'CantGetMessageList': 201, + 'CantGetMessage': 202, + 'CantDeleteMessage': 203, + 'CantMoveMessage': 204, + + 'CantSaveMessage': 301, + 'CantSendMessage': 302, + 'InvalidRecipients': 303, + + 'CantCreateFolder': 400, + 'CantRenameFolder': 401, + 'CantDeleteFolder': 402, + 'CantSubscribeFolder': 403, + 'CantUnsubscribeFolder': 404, + 'CantDeleteNonEmptyFolder': 405, + + 'CantSaveSettings': 501, + 'CantSavePluginSettings': 502, + + 'DomainAlreadyExists': 601, + + 'CantInstallPackage': 701, + 'CantDeletePackage': 702, + 'InvalidPluginPackage': 703, + 'UnsupportedPluginPackage': 704, + + 'LicensingServerIsUnavailable': 710, + 'LicensingExpired': 711, + 'LicensingBanned': 712, + + 'DemoSendMessageError': 750, + + 'AccountAlreadyExists': 801, + + 'MailServerError': 901, + 'UnknownNotification': 999, + 'UnknownError': 999 +}; + +Utils.trim = $.trim; +Utils.inArray = $.inArray; +Utils.isArray = _.isArray; +Utils.isFunc = _.isFunction; +Utils.isUnd = _.isUndefined; +Utils.isNull = _.isNull; +Utils.emptyFunction = function () {}; + +/** + * @param {*} oValue + * @return {boolean} + */ +Utils.isNormal = function (oValue) +{ + return !Utils.isUnd(oValue) && !Utils.isNull(oValue); +}; + +Utils.windowResize = _.debounce(function (iTimeout) { + if (Utils.isUnd(iTimeout)) + { + $window.resize(); + } + else + { + window.setTimeout(function () { + $window.resize(); + }, iTimeout); + } +}, 50); + +/** + * @param {(string|number)} mValue + * @param {boolean=} bIncludeZero + * @return {boolean} + */ +Utils.isPosNumeric = function (mValue, bIncludeZero) +{ + return Utils.isNormal(mValue) ? + ((Utils.isUnd(bIncludeZero) ? true : !!bIncludeZero) ? + (/^[0-9]*$/).test(mValue.toString()) : + (/^[1-9]+[0-9]*$/).test(mValue.toString())) : + false; +}; + +/** + * @param {*} iValue + * @return {number} + */ +Utils.pInt = function (iValue) +{ + return Utils.isNormal(iValue) && '' !== iValue ? window.parseInt(iValue, 10) : 0; +}; + +/** + * @param {*} mValue + * @return {string} + */ +Utils.pString = function (mValue) +{ + return Utils.isNormal(mValue) ? '' + mValue : ''; +}; + +/** + * @param {*} aValue + * @return {boolean} + */ +Utils.isNonEmptyArray = function (aValue) +{ + return Utils.isArray(aValue) && 0 < aValue.length; +}; + +/** + * @param {string} sPath + * @param {*=} oObject + * @param {Object=} oObjectToExportTo + */ +Utils.exportPath = function (sPath, oObject, oObjectToExportTo) +{ + var + part = null, + parts = sPath.split('.'), + cur = oObjectToExportTo || window + ; + + for (; parts.length && (part = parts.shift());) + { + if (!parts.length && !Utils.isUnd(oObject)) + { + cur[part] = oObject; + } + else if (cur[part]) + { + cur = cur[part]; + } + else + { + cur = cur[part] = {}; + } + } +}; + +/** + * @param {Object} oObject + * @param {string} sName + * @param {*} mValue + */ +Utils.pImport = function (oObject, sName, mValue) +{ + oObject[sName] = mValue; +}; + +/** + * @param {Object} oObject + * @param {string} sName + * @param {*} mDefault + * @return {*} + */ +Utils.pExport = function (oObject, sName, mDefault) +{ + return Utils.isUnd(oObject[sName]) ? mDefault : oObject[sName]; +}; + +/** + * @param {string} sText + * @return {string} + */ +Utils.encodeHtml = function (sText) +{ + return Utils.isNormal(sText) ? sText.toString() + .replace(/&/g, '&').replace(//g, '>') + .replace(/"/g, '"').replace(/'/g, ''') : ''; +}; + +/** + * @param {string} sText + * @param {number=} iLen + * @return {string} + */ +Utils.splitPlainText = function (sText, iLen) +{ + var + sPrefix = '', + sSubText = '', + sResult = sText, + iSpacePos = 0, + iNewLinePos = 0 + ; + + iLen = Utils.isUnd(iLen) ? 100 : iLen; + + while (sResult.length > iLen) + { + sSubText = sResult.substring(0, iLen); + iSpacePos = sSubText.lastIndexOf(' '); + iNewLinePos = sSubText.lastIndexOf('\n'); + + if (-1 !== iNewLinePos) + { + iSpacePos = iNewLinePos; + } + + if (-1 === iSpacePos) + { + iSpacePos = iLen; + } + + sPrefix += sSubText.substring(0, iSpacePos) + '\n'; + sResult = sResult.substring(iSpacePos + 1); + } + + return sPrefix + sResult; +}; + +Utils.timeOutAction = (function () { + + var + oTimeOuts = {} + ; + + return function (sAction, fFunction, iTimeOut) + { + if (Utils.isUnd(oTimeOuts[sAction])) + { + oTimeOuts[sAction] = 0; + } + + window.clearTimeout(oTimeOuts[sAction]); + oTimeOuts[sAction] = window.setTimeout(fFunction, iTimeOut); + }; +}()); + +Utils.timeOutActionSecond = (function () { + + var + oTimeOuts = {} + ; + + return function (sAction, fFunction, iTimeOut) + { + if (!oTimeOuts[sAction]) + { + oTimeOuts[sAction] = window.setTimeout(function () { + fFunction(); + oTimeOuts[sAction] = 0; + }, iTimeOut); + } + }; +}()); + +Utils.audio = (function () { + + var + oAudio = false + ; + + return function (sMp3File, sOggFile) { + + if (false === oAudio) + { + if (Globals.bIsiOSDevice) + { + oAudio = null; + } + else + { + var + bCanPlayMp3 = false, + bCanPlayOgg = false, + oAudioLocal = window.Audio ? new window.Audio() : null + ; + + if (oAudioLocal && oAudioLocal.canPlayType && oAudioLocal.play) + { + bCanPlayMp3 = '' !== oAudioLocal.canPlayType('audio/mpeg; codecs="mp3"'); + if (!bCanPlayMp3) + { + bCanPlayOgg = '' !== oAudioLocal.canPlayType('audio/ogg; codecs="vorbis"'); + } + + if (bCanPlayMp3 || bCanPlayOgg) + { + oAudio = oAudioLocal; + oAudio.preload = 'none'; + oAudio.loop = false; + oAudio.autoplay = false; + oAudio.muted = false; + oAudio.src = bCanPlayMp3 ? sMp3File : sOggFile; + } + else + { + oAudio = null; + } + } + else + { + oAudio = null; + } + } + } + + return oAudio; + }; +}()); + +/** + * @param {(Object|null|undefined)} oObject + * @param {string} sProp + * @return {boolean} + */ +Utils.hos = function (oObject, sProp) +{ + return oObject && Object.hasOwnProperty ? Object.hasOwnProperty.call(oObject, sProp) : false; +}; + +/** + * @param {string} sKey + * @param {Object=} oValueList + * @param {string=} sDefaulValue + * @return {string} + */ +Utils.i18n = function (sKey, oValueList, sDefaulValue) +{ + var + sValueName = '', + sResult = Utils.isUnd(I18n[sKey]) ? (Utils.isUnd(sDefaulValue) ? sKey : sDefaulValue) : I18n[sKey] + ; + + if (!Utils.isUnd(oValueList) && !Utils.isNull(oValueList)) + { + for (sValueName in oValueList) + { + if (Utils.hos(oValueList, sValueName)) + { + sResult = sResult.replace('%' + sValueName + '%', oValueList[sValueName]); + } + } + } + + return sResult; +}; + +/** + * @param {Object} oElement + */ +Utils.i18nToNode = function (oElement) +{ + _.defer(function () { + $('.i18n', oElement).each(function () { + var + jqThis = $(this), + sKey = '' + ; + + sKey = jqThis.data('i18n-text'); + if (sKey) + { + jqThis.text(Utils.i18n(sKey)); + } + else + { + sKey = jqThis.data('i18n-html'); + if (sKey) + { + jqThis.html(Utils.i18n(sKey)); + } + + sKey = jqThis.data('i18n-placeholder'); + if (sKey) + { + jqThis.attr('placeholder', Utils.i18n(sKey)); + } + } +// sKey = jqThis.data('i18n-title'); +// if (sKey) +// { +// jqThis.attr('title', Utils.i18n(sKey)); +// } + }); + }); +}; + +Utils.i18nToDoc = function () +{ + if (window.rainloopI18N) + { + I18n = window.rainloopI18N || {}; + Utils.i18nToNode($document); + + Globals.langChangeTick(!Globals.langChangeTick()); + } + + window.rainloopI18N = {}; +}; + +/** + * @param {Function} fCallback + * @param {Object} oScope + * @param {Function=} fLangCallback + */ +Utils.initOnStartOrLangChange = function (fCallback, oScope, fLangCallback) +{ + if (fCallback) + { + fCallback.call(oScope); + } + + if (fLangCallback) + { + Globals.langChangeTick.subscribe(function () { + if (fCallback) + { + fCallback.call(oScope); + } + + fLangCallback.call(oScope); + }); + } + else if (fCallback) + { + Globals.langChangeTick.subscribe(fCallback, oScope); + } +}; + +/** + * @return {boolean} + */ +Utils.inFocus = function () +{ + var oActiveObj = document.activeElement; + return (oActiveObj && ('INPUT' === oActiveObj.tagName || + 'TEXTAREA' === oActiveObj.tagName || + 'IFRAME' === oActiveObj.tagName || + ('DIV' === oActiveObj.tagName && 'editorHtmlArea' === oActiveObj.className && oActiveObj.contentEditable))); +}; + +Utils.removeInFocus = function () +{ + if (document && document.activeElement && document.activeElement.blur) + { + var oA = $(document.activeElement); + if (oA.is('input') || oA.is('textarea')) + { + document.activeElement.blur(); + } + } +}; + +Utils.removeSelection = function () +{ + if (window && window.getSelection) + { + var oSel = window.getSelection(); + if (oSel && oSel.removeAllRanges) + { + oSel.removeAllRanges(); + } + } + else if (document && document.selection && document.selection.empty) + { + document.selection.empty(); + } +}; + +/** + * @param {string} sPrefix + * @param {string} sSubject + * @return {string} + */ +Utils.replySubjectAdd = function (sPrefix, sSubject) +{ + var + oMatch = null, + sResult = Utils.trim(sSubject) + ; + + if (null !== (oMatch = (new window.RegExp('^' + sPrefix + '[\\s]?\\:(.*)$', 'gi')).exec(sSubject)) && !Utils.isUnd(oMatch[1])) + { + sResult = sPrefix + '[2]: ' + oMatch[1]; + } + else if (null !== (oMatch = (new window.RegExp('^(' + sPrefix + '[\\s]?[\\[\\(]?)([\\d]+)([\\]\\)]?[\\s]?\\:.*)$', 'gi')).exec(sSubject)) && + !Utils.isUnd(oMatch[1]) && !Utils.isUnd(oMatch[2]) && !Utils.isUnd(oMatch[3])) + { + sResult = oMatch[1] + (Utils.pInt(oMatch[2]) + 1) + oMatch[3]; + sResult = oMatch[1] + (Utils.pInt(oMatch[2]) + 1) + oMatch[3]; + } + else + { + sResult = sPrefix + ': ' + sSubject; + } + + return sResult; +}; + +/** + * @param {number} iNum + * @param {number} iDec + * @return {number} + */ +Utils.roundNumber = function (iNum, iDec) +{ + return Math.round(iNum * Math.pow(10, iDec)) / Math.pow(10, iDec); +}; + +/** + * @param {(number|string)} iSizeInBytes + * @return {string} + */ +Utils.friendlySize = function (iSizeInBytes) +{ + iSizeInBytes = Utils.pInt(iSizeInBytes); + + if (iSizeInBytes >= 1073741824) + { + return Utils.roundNumber(iSizeInBytes / 1073741824, 1) + 'GB'; + } + else if (iSizeInBytes >= 1048576) + { + return Utils.roundNumber(iSizeInBytes / 1048576, 1) + 'MB'; + } + else if (iSizeInBytes >= 1024) + { + return Utils.roundNumber(iSizeInBytes / 1024, 0) + 'KB'; + } + + return iSizeInBytes + 'B'; +}; + +/** + * @param {string} sDesc + */ +Utils.log = function (sDesc) +{ + if (window.console && window.console.log) + { + window.console.log(sDesc); + } +}; + +/** + * @param {number} iCode + * @return {string} + */ +Utils.getNotification = function (iCode) +{ + iCode = Utils.pInt(iCode); + return Utils.isUnd(NotificationI18N[iCode]) ? '' : NotificationI18N[iCode]; +}; + +Utils.initNotificationLanguage = function () +{ + NotificationI18N[Enums.Notification.InvalidToken] = Utils.i18n('NOTIFICATIONS/INVALID_TOKEN'); + NotificationI18N[Enums.Notification.AuthError] = Utils.i18n('NOTIFICATIONS/AUTH_ERROR'); + NotificationI18N[Enums.Notification.AccessError] = Utils.i18n('NOTIFICATIONS/ACCESS_ERROR'); + NotificationI18N[Enums.Notification.ConnectionError] = Utils.i18n('NOTIFICATIONS/CONNECTION_ERROR'); + NotificationI18N[Enums.Notification.CaptchaError] = Utils.i18n('NOTIFICATIONS/CAPTCHA_ERROR'); + NotificationI18N[Enums.Notification.SocialFacebookLoginAccessDisable] = Utils.i18n('NOTIFICATIONS/SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE'); + NotificationI18N[Enums.Notification.SocialTwitterLoginAccessDisable] = Utils.i18n('NOTIFICATIONS/SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE'); + NotificationI18N[Enums.Notification.SocialGoogleLoginAccessDisable] = Utils.i18n('NOTIFICATIONS/SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE'); + NotificationI18N[Enums.Notification.DomainNotAllowed] = Utils.i18n('NOTIFICATIONS/DOMAIN_NOT_ALLOWED'); + NotificationI18N[Enums.Notification.AccountNotAllowed] = Utils.i18n('NOTIFICATIONS/ACCOUNT_NOT_ALLOWED'); + + NotificationI18N[Enums.Notification.CantGetMessageList] = Utils.i18n('NOTIFICATIONS/CANT_GET_MESSAGE_LIST'); + NotificationI18N[Enums.Notification.CantGetMessage] = Utils.i18n('NOTIFICATIONS/CANT_GET_MESSAGE'); + NotificationI18N[Enums.Notification.CantDeleteMessage] = Utils.i18n('NOTIFICATIONS/CANT_DELETE_MESSAGE'); + NotificationI18N[Enums.Notification.CantMoveMessage] = Utils.i18n('NOTIFICATIONS/CANT_MOVE_MESSAGE'); + + NotificationI18N[Enums.Notification.CantSaveMessage] = Utils.i18n('NOTIFICATIONS/CANT_SAVE_MESSAGE'); + NotificationI18N[Enums.Notification.CantSendMessage] = Utils.i18n('NOTIFICATIONS/CANT_SEND_MESSAGE'); + NotificationI18N[Enums.Notification.InvalidRecipients] = Utils.i18n('NOTIFICATIONS/INVALID_RECIPIENTS'); + + NotificationI18N[Enums.Notification.CantCreateFolder] = Utils.i18n('NOTIFICATIONS/CANT_CREATE_FOLDER'); + NotificationI18N[Enums.Notification.CantRenameFolder] = Utils.i18n('NOTIFICATIONS/CANT_RENAME_FOLDER'); + NotificationI18N[Enums.Notification.CantDeleteFolder] = Utils.i18n('NOTIFICATIONS/CANT_DELETE_FOLDER'); + NotificationI18N[Enums.Notification.CantDeleteNonEmptyFolder] = Utils.i18n('NOTIFICATIONS/CANT_DELETE_NON_EMPTY_FOLDER'); + NotificationI18N[Enums.Notification.CantSubscribeFolder] = Utils.i18n('NOTIFICATIONS/CANT_SUBSCRIBE_FOLDER'); + NotificationI18N[Enums.Notification.CantUnsubscribeFolder] = Utils.i18n('NOTIFICATIONS/CANT_UNSUBSCRIBE_FOLDER'); + + NotificationI18N[Enums.Notification.CantSaveSettings] = Utils.i18n('NOTIFICATIONS/CANT_SAVE_SETTINGS'); + NotificationI18N[Enums.Notification.CantSavePluginSettings] = Utils.i18n('NOTIFICATIONS/CANT_SAVE_PLUGIN_SETTINGS'); + + NotificationI18N[Enums.Notification.DomainAlreadyExists] = Utils.i18n('NOTIFICATIONS/DOMAIN_ALREADY_EXISTS'); + + NotificationI18N[Enums.Notification.CantInstallPackage] = Utils.i18n('NOTIFICATIONS/CANT_INSTALL_PACKAGE'); + NotificationI18N[Enums.Notification.CantDeletePackage] = Utils.i18n('NOTIFICATIONS/CANT_DELETE_PACKAGE'); + NotificationI18N[Enums.Notification.InvalidPluginPackage] = Utils.i18n('NOTIFICATIONS/INVALID_PLUGIN_PACKAGE'); + NotificationI18N[Enums.Notification.UnsupportedPluginPackage] = Utils.i18n('NOTIFICATIONS/UNSUPPORTED_PLUGIN_PACKAGE'); + + NotificationI18N[Enums.Notification.LicensingServerIsUnavailable] = Utils.i18n('NOTIFICATIONS/LICENSING_SERVER_IS_UNAVAILABLE'); + NotificationI18N[Enums.Notification.LicensingExpired] = Utils.i18n('NOTIFICATIONS/LICENSING_EXPIRED'); + NotificationI18N[Enums.Notification.LicensingBanned] = Utils.i18n('NOTIFICATIONS/LICENSING_BANNED'); + + NotificationI18N[Enums.Notification.DemoSendMessageError] = Utils.i18n('NOTIFICATIONS/DEMO_SEND_MESSAGE_ERROR'); + + NotificationI18N[Enums.Notification.AccountAlreadyExists] = Utils.i18n('NOTIFICATIONS/ACCOUNT_ALREADY_EXISTS'); + + NotificationI18N[Enums.Notification.MailServerError] = Utils.i18n('NOTIFICATIONS/MAIL_SERVER_ERROR'); + NotificationI18N[Enums.Notification.UnknownNotification] = Utils.i18n('NOTIFICATIONS/UNKNOWN_ERROR'); + NotificationI18N[Enums.Notification.UnknownError] = Utils.i18n('NOTIFICATIONS/UNKNOWN_ERROR'); +}; + +/** + * @param {*} mCode + * @return {string} + */ +Utils.getUploadErrorDescByCode = function (mCode) +{ + var sResult = ''; + switch (Utils.pInt(mCode)) { + case Enums.UploadErrorCode.FileIsTooBig: + sResult = Utils.i18n('UPLOAD/ERROR_FILE_IS_TOO_BIG'); + break; + case Enums.UploadErrorCode.FilePartiallyUploaded: + sResult = Utils.i18n('UPLOAD/ERROR_FILE_PARTIALLY_UPLOADED'); + break; + case Enums.UploadErrorCode.FileNoUploaded: + sResult = Utils.i18n('UPLOAD/ERROR_NO_FILE_UPLOADED'); + break; + case Enums.UploadErrorCode.MissingTempFolder: + sResult = Utils.i18n('UPLOAD/ERROR_MISSING_TEMP_FOLDER'); + break; + case Enums.UploadErrorCode.FileOnSaveingError: + sResult = Utils.i18n('UPLOAD/ERROR_ON_SAVING_FILE'); + break; + case Enums.UploadErrorCode.FileType: + sResult = Utils.i18n('UPLOAD/ERROR_FILE_TYPE'); + break; + default: + sResult = Utils.i18n('UPLOAD/ERROR_UNKNOWN'); + break; + } + + return sResult; +}; + +/** + * @param {?} oEvent + */ +Utils.killCtrlAandS = function (oEvent) +{ + oEvent = oEvent || window.event; + if (oEvent) + { + var + oSender = oEvent.target || oEvent.srcElement, + iKey = oEvent.keyCode || oEvent.which + ; + + if (oEvent.ctrlKey && iKey === Enums.EventKeyCode.S) + { + oEvent.preventDefault(); + return; + } + + if (oSender && oSender.tagName && oSender.tagName.match(/INPUT|TEXTAREA/i)) + { + return; + } + + if (oEvent.ctrlKey && iKey === Enums.EventKeyCode.A) + { + if (window.getSelection) + { + window.getSelection().removeAllRanges(); + } + else if (window.document.selection && window.document.selection.clear) + { + window.document.selection.clear(); + } + + oEvent.preventDefault(); + } + } +}; + +/** + * @param {(Object|null|undefined)} oContext + * @param {Function} fExecute + * @param {(Function|boolean|null)=} fCanExecute + * @return {Function} + */ +Utils.createCommand = function (oContext, fExecute, fCanExecute) +{ + var + fResult = fExecute ? function () { + if (fResult.canExecute && fResult.canExecute()) + { + fExecute.apply(oContext, Array.prototype.slice.call(arguments)); + } + return false; + } : function () {} + ; + + fResult.enabled = ko.observable(true); + + fCanExecute = Utils.isUnd(fCanExecute) ? true : fCanExecute; + if (Utils.isFunc(fCanExecute)) + { + fResult.canExecute = ko.computed(function () { + return fResult.enabled() && fCanExecute.call(oContext); + }); + } + else + { + fResult.canExecute = ko.computed(function () { + return fResult.enabled() && !!fCanExecute; + }); + } + + return fResult; +}; + +/** + * @param {Object} oData + */ +Utils.initDataConstructorBySettings = function (oData) +{ + oData.editorDefaultType = ko.observable(Enums.EditorDefaultType.Html); + oData.showImages = ko.observable(false); + oData.interfaceAnimation = ko.observable(Enums.InterfaceAnimation.Full); + + Globals.sAnimationType = Enums.InterfaceAnimation.Full; + + oData.allowThemes = ko.observable(true); + oData.allowCustomLogin = ko.observable(false); + oData.allowLanguagesOnSettings = ko.observable(true); + oData.allowLanguagesOnLogin = ko.observable(true); + + oData.desktopNotifications = ko.observable(false); + oData.useThreads = ko.observable(true); + oData.replySameFolder = ko.observable(true); + oData.usePreviewPane = ko.observable(true); + oData.useCheckboxesInList = ko.observable(true); + + oData.interfaceAnimation.subscribe(function (sValue) { + if (Globals.bMobileDevice || sValue === Enums.InterfaceAnimation.None) + { + $html.removeClass('rl-anim rl-anim-full').addClass('no-rl-anim'); + + Globals.sAnimationType = Enums.InterfaceAnimation.None; + } + else + { + switch (sValue) + { + case Enums.InterfaceAnimation.Full: + $html.removeClass('no-rl-anim').addClass('rl-anim rl-anim-full'); + Globals.sAnimationType = sValue; + break; + case Enums.InterfaceAnimation.Normal: + $html.removeClass('no-rl-anim rl-anim-full').addClass('rl-anim'); + Globals.sAnimationType = sValue; + break; + } + } + }); + + oData.interfaceAnimation.valueHasMutated(); + + oData.desktopNotificationsPermisions = ko.computed(function () { + oData.desktopNotifications(); + var iResult = Enums.DesktopNotifications.NotSupported; + if (NotificationClass && NotificationClass.permission) + { + switch (NotificationClass.permission.toLowerCase()) + { + case 'granted': + iResult = Enums.DesktopNotifications.Allowed; + break; + case 'denied': + iResult = Enums.DesktopNotifications.Denied; + break; + case 'default': + iResult = Enums.DesktopNotifications.NotAllowed; + break; + } + } + else if (window.webkitNotifications && window.webkitNotifications.checkPermission) + { + iResult = window.webkitNotifications.checkPermission(); + } + + return iResult; + }); + + oData.useDesktopNotifications = ko.computed({ + 'read': function () { + return oData.desktopNotifications() && + Enums.DesktopNotifications.Allowed === oData.desktopNotificationsPermisions(); + }, + 'write': function (bValue) { + if (bValue) + { + var iPermission = oData.desktopNotificationsPermisions(); + if (Enums.DesktopNotifications.Allowed === iPermission) + { + oData.desktopNotifications(true); + } + else if (Enums.DesktopNotifications.NotAllowed === iPermission) + { + NotificationClass.requestPermission(function () { + oData.desktopNotifications.valueHasMutated(); + if (Enums.DesktopNotifications.Allowed === oData.desktopNotificationsPermisions()) + { + if (oData.desktopNotifications()) + { + oData.desktopNotifications.valueHasMutated(); + } + else + { + oData.desktopNotifications(true); + } + } + else + { + if (oData.desktopNotifications()) + { + oData.desktopNotifications(false); + } + else + { + oData.desktopNotifications.valueHasMutated(); + } + } + }); + } + else + { + oData.desktopNotifications(false); + } + } + else + { + oData.desktopNotifications(false); + } + } + }); + + oData.language = ko.observable(''); + oData.languages = ko.observableArray([]); + + oData.mainLanguage = ko.computed({ + 'read': oData.language, + 'write': function (sValue) { + if (sValue !== oData.language()) + { + if (-1 < Utils.inArray(sValue, oData.languages())) + { + oData.language(sValue); + } + else if (0 < oData.languages().length) + { + oData.language(oData.languages()[0]); + } + } + else + { + oData.language.valueHasMutated(); + } + } + }); + + oData.theme = ko.observable(''); + oData.themes = ko.observableArray([]); + + oData.mainTheme = ko.computed({ + 'read': oData.theme, + 'write': function (sValue) { + if (sValue !== oData.theme()) + { + var aThemes = oData.themes(); + if (-1 < Utils.inArray(sValue, aThemes)) + { + oData.theme(sValue); + } + else if (0 < aThemes.length) + { + oData.theme(aThemes[0]); + } + } + else + { + oData.theme.valueHasMutated(); + } + } + }); + + oData.allowCustomTheme = ko.observable(false); + oData.allowAdditionalAccounts = ko.observable(false); + oData.allowIdentities = ko.observable(false); + oData.determineUserLanguage = ko.observable(false); + + oData.messagesPerPage = ko.observable(Consts.Defaults.MessagesPerPage);//.extend({'throttle': 200}); + + oData.mainMessagesPerPage = oData.messagesPerPage; + oData.mainMessagesPerPage = ko.computed({ + 'read': oData.messagesPerPage, + 'write': function (iValue) { + if (-1 < Utils.inArray(Utils.pInt(iValue), Consts.Defaults.MessagesPerPageArray)) + { + if (iValue !== oData.messagesPerPage()) + { + oData.messagesPerPage(iValue); + } + } + else + { + oData.messagesPerPage.valueHasMutated(); + } + } + }); + + oData.facebookEnable = ko.observable(false); + oData.facebookAppID = ko.observable(''); + oData.facebookAppSecret = ko.observable(''); + + oData.twitterEnable = ko.observable(false); + oData.twitterConsumerKey = ko.observable(''); + oData.twitterConsumerSecret = ko.observable(''); + + oData.googleEnable = ko.observable(false); + oData.googleClientID = ko.observable(''); + oData.googleClientSecret = ko.observable(''); + + oData.dropboxEnable = ko.observable(false); + oData.dropboxApiKey = ko.observable(''); + + oData.contactsIsSupported = ko.observable(false); + oData.contactsIsAllowed = ko.observable(false); +}; + +/** + * @param {{moment:Function}} oObject + */ +Utils.createMomentDate = function (oObject) +{ + return ko.computed(function () { + Globals.minuteTick(); + return this.moment().fromNow(); + }, oObject); +}; + +/** + * @param {{moment:Function, momentDate:Function}} oObject + */ +Utils.createMomentShortDate = function (oObject) +{ + return ko.computed(function () { + var + sResult = '', + oMomentNow = moment(), + oMoment = this.moment(), + sMomentDate = this.momentDate() + ; + + if (4 >= oMomentNow.diff(oMoment, 'hours')) + { + sResult = sMomentDate; + } + else if (oMomentNow.format('L') === oMoment.format('L')) + { + sResult = Utils.i18n('MESSAGE_LIST/TODAY_AT', { + 'TIME': oMoment.format('LT') + }); + } + else if (oMomentNow.clone().subtract('days', 1).format('L') === oMoment.format('L')) + { + sResult = Utils.i18n('MESSAGE_LIST/YESTERDAY_IN', { + 'TIME': oMoment.format('LT') + }); + } + + else if (oMomentNow.year() === oMoment.year()) + { + sResult = oMoment.format('D MMM.'); + } + else + { + sResult = oMoment.format('LL'); + } + + return sResult; + + }, oObject); +}; + +/** + * @param {string} sFullNameHash + * @return {boolean} + */ +Utils.isFolderExpanded = function (sFullNameHash) +{ + var aExpandedList = /** @type {Array|null} */ RL.local().get(Enums.ClientSideKeyName.ExpandedFolders); + return _.isArray(aExpandedList) && -1 !== _.indexOf(aExpandedList, sFullNameHash); +}; + +/** + * @param {string} sFullNameHash + * @param {boolean} bExpanded + */ +Utils.setExpandedFolder = function (sFullNameHash, bExpanded) +{ + var aExpandedList = /** @type {Array|null} */ RL.local().get(Enums.ClientSideKeyName.ExpandedFolders); + if (!_.isArray(aExpandedList)) + { + aExpandedList = []; + } + + if (bExpanded) + { + aExpandedList.push(sFullNameHash); + aExpandedList = _.uniq(aExpandedList); + } + else + { + aExpandedList = _.without(aExpandedList, sFullNameHash); + } + + RL.local().set(Enums.ClientSideKeyName.ExpandedFolders, aExpandedList); +}; + +Utils.initLayoutResizer = function (sLeft, sRight, sParent/*, koSwither*/, + iLimitL, iMaxL, iDefL, iLimitR, sClientSideKeyName) +{ + iLimitL = iLimitL || 300; + iMaxL = iMaxL || 500; + iDefL = iDefL || (iMaxL - iLimitL / 2); + iLimitR = iLimitR || 300; + + var + iTemp = 0, + oLeft = $(sLeft), + oRight = $(sRight), + oParent = $(sParent), + iLeftWidth = RL.local().get(sClientSideKeyName) || iDefL, + fFunction = function (oEvent, oObject, bForce) { + + if (oObject || bForce) + { + var + iWidth = oParent.width(), + iProc = oObject ? oObject.size.width / iWidth * 100 : null + ; + + if (null === iProc && bForce) + { + iProc = oLeft.width() / iWidth * 100; + } + + if (null !== iProc) + { + oLeft.css({ + 'width': '', + 'height': '', + 'right': '' + (100 - iProc) + '%' + }); + + oRight.css({ + 'width': '', + 'height': '', + 'left': '' + iProc + '%' + }); + } + } + }, + fResiseFunction = function (oEvent, oObject) + { + if (/*koSwither && koSwither() && */oObject && oObject.element && + oObject.element[0]['id'] && '#' + oObject.element[0]['id'] === '' + sLeft) + { + var iWidth = oParent.width(); + iTemp = iWidth - iLimitR; + iTemp = iMaxL > iTemp ? iTemp : iMaxL; + oLeft.resizable('option', 'maxWidth', iTemp); + if (oObject.size && oObject.size.width) + { + RL.local().set(sClientSideKeyName, oObject.size.width); + } + + fFunction(null, null, true); + } + } + ; + + if (iLeftWidth) + { + oLeft.width(iLeftWidth); + } + + iTemp = oParent.width() - iLimitR; + iTemp = iMaxL > iTemp ? iTemp : iMaxL; + + oLeft.resizable({ + 'minWidth': iLimitL, + 'maxWidth': iTemp, + 'handles': 'e', + 'resize': fFunction, + 'stop': fFunction + }); + + fFunction(null, null, true); + $window.resize(_.throttle(fResiseFunction, 400)); +}; + +/** + * @param {Object} oMessageTextBody + */ +Utils.initBlockquoteSwitcher = function (oMessageTextBody) +{ + if (oMessageTextBody) + { + var $oList = $('blockquote:not(.rl-bq-switcher)', oMessageTextBody).filter(function () { + return 0 === $(this).parent().closest('blockquote', oMessageTextBody).length; + }); + + if ($oList && 0 < $oList.length) + { + $oList.each(function () { + var $self = $(this), iH = $self.height(); + if (0 === iH || 100 < iH) + { + $self.addClass('rl-bq-switcher hidden-bq'); + $('') + .insertBefore($self) + .click(function () { + $self.toggleClass('hidden-bq'); + Utils.windowResize(); + }) + .after('
') + .before('
') + ; + } + }); + } + } +}; + +/** + * @param {Object} oMessageTextBody + */ +Utils.removeBlockquoteSwitcher = function (oMessageTextBody) +{ + if (oMessageTextBody) + { + $(oMessageTextBody).find('blockquote.rl-bq-switcher').each(function () { + $(this).removeClass('rl-bq-switcher hidden-bq'); + }); + + $(oMessageTextBody).find('.rlBlockquoteSwitcher').each(function () { + $(this).remove(); + }); + } +}; + +/** + * @param {string} sName + * @param {Function} ViewModelClass + */ +Utils.extendAsViewModel = function (sName, ViewModelClass) +{ + if (ViewModelClass) + { + ViewModelClass.__name = sName; + Plugins.regViewModelHook(sName, ViewModelClass); + _.extend(ViewModelClass.prototype, KnoinAbstractViewModel.prototype); + } +}; + +/** + * @param {Function} SettingsViewModelClass + * @param {string} sLabelName + * @param {string} sTemplate + * @param {string} sRoute + * @param {boolean=} bDefault + */ +Utils.addSettingsViewModel = function (SettingsViewModelClass, sTemplate, sLabelName, sRoute, bDefault) +{ + SettingsViewModelClass.__rlSettingsData = { + 'Label': sLabelName, + 'Template': sTemplate, + 'Route': sRoute, + 'IsDefault': !!bDefault + }; + + ViewModels['settings'].push(SettingsViewModelClass); +}; + +/** + * @param {Function} SettingsViewModelClass + */ +Utils.removeSettingsViewModel = function (SettingsViewModelClass) +{ + ViewModels['settings-removed'].push(SettingsViewModelClass); +}; + +/** + * @param {Function} SettingsViewModelClass + */ +Utils.disableSettingsViewModel = function (SettingsViewModelClass) +{ + ViewModels['settings-disabled'].push(SettingsViewModelClass); +}; + +Utils.convertThemeName = function (sTheme) +{ + return Utils.trim(sTheme.replace(/[^a-zA-Z]/g, ' ').replace(/([A-Z])/g, ' $1').replace(/[\s]+/g, ' ')); +}; + +/** + * @param {string} sName + * @return {string} + */ +Utils.quoteName = function (sName) +{ + return sName.replace(/["]/g, '\\"'); +}; + +/** + * @return {number} + */ +Utils.microtime = function () +{ + return (new Date()).getTime(); +}; + +/** + * + * @param {string} sLanguage + * @return {string} + */ +Utils.convertLangName = function (sLanguage) +{ + return Utils.i18n('LANGS_NAMES/LANG_' + sLanguage.toUpperCase().replace(/[^a-zA-Z0-9]+/, '_'), null, sLanguage); +}; + +/** + * @param {number=} iLen + * @return {string} + */ +Utils.fakeMd5 = function(iLen) +{ + var + sResult = '', + sLine = '0123456789abcdefghijklmnopqrstuvwxyz' + ; + + iLen = Utils.isUnd(iLen) ? 32 : Utils.pInt(iLen); + + while (sResult.length < iLen) + { + sResult += sLine.substr(window.Math.round(window.Math.random() * sLine.length), 1); + } + + return sResult; +}; + +Utils.convertPlainTextToHtml = function (sPlain) +{ + return sPlain.toString() + .replace(/&/g, '&').replace(/>/g, '>').replace(/'); +}; + +Utils.draggeblePlace = function () +{ + return $('
 
').appendTo('#rl-hidden'); +}; + +Utils.defautOptionsAfterRender = function (oOption, oItem) +{ + if (oItem && !Utils.isUnd(oItem.disable)) + { + ko.applyBindingsToNode(oOption, { + 'disable': oItem.disable + }, oItem); + } +}; + +/** + * @param {Object} oViewModel + * @param {string} sTemplateID + * @param {string} sTitle + * @param {Function=} fCallback + */ +Utils.windowPopupKnockout = function (oViewModel, sTemplateID, sTitle, fCallback) +{ + var + oScript = null, + oWin = window.open(''), + sFunc = '__OpenerApplyBindingsUid' + Utils.fakeMd5() + '__', + oTemplate = $('#' + sTemplateID) + ; + + window[sFunc] = function () { + + if (oWin && oWin.document.body && oTemplate && oTemplate[0]) + { + var oBody = $(oWin.document.body); + + $('#rl-content', oBody).html(oTemplate.html()); + $('html', oWin.document).addClass('external ' + $('html').attr('class')); + + Utils.i18nToNode(oBody); + + Knoin.prototype.applyExternal(oViewModel, $('#rl-content', oBody)[0]); + + window[sFunc] = null; + + fCallback(oWin); + } + }; + + oWin.document.open(); + oWin.document.write('' + +'' + +'' + +'' + +'' + +'' + +'' + Utils.encodeHtml(sTitle) + '' + +'
'); + oWin.document.close(); + + oScript = oWin.document.createElement('script'); + oScript.type = 'text/javascript'; + oScript.innerHTML = 'if(window&&window.opener&&window.opener[\'' + sFunc + '\']){window.opener[\'' + sFunc + '\']();window.opener[\'' + sFunc + '\']=null}'; + oWin.document.getElementsByTagName('head')[0].appendChild(oScript); +}; + +Utils.settingsSaveHelperFunction = function (fCallback, koTrigger, oContext, iTimer) +{ + oContext = oContext || null; + iTimer = Utils.isUnd(iTimer) ? 1000 : Utils.pInt(iTimer); + return function (sType, mData, bCached, sRequestAction, oRequestParameters) { + koTrigger.call(oContext, mData && mData['Result'] ? Enums.SaveSettingsStep.TrueResult : Enums.SaveSettingsStep.FalseResult); + if (fCallback) + { + fCallback.call(oContext, sType, mData, bCached, sRequestAction, oRequestParameters); + } + _.delay(function () { + koTrigger.call(oContext, Enums.SaveSettingsStep.Idle); + }, iTimer); + }; +}; + +Utils.settingsSaveHelperSimpleFunction = function (koTrigger, oContext) +{ + return Utils.settingsSaveHelperFunction(null, koTrigger, oContext, 1000); +}; + +Utils.resizeAndCrop = function (sUrl, iValue, fCallback) +{ + var oTempImg = new Image(); + oTempImg.onload = function() { + + var + aDiff = [0, 0], + oCanvas = document.createElement('canvas'), + oCtx = oCanvas.getContext('2d') + ; + + oCanvas.width = iValue; + oCanvas.height = iValue; + + if (this.width > this.height) + { + aDiff = [this.width - this.height, 0]; + } + else + { + aDiff = [0, this.height - this.width]; + } + + oCtx.fillStyle = '#fff'; + oCtx.fillRect(0, 0, iValue, iValue); + oCtx.drawImage(this, aDiff[0] / 2, aDiff[1] / 2, this.width - aDiff[0], this.height - aDiff[1], 0, 0, iValue, iValue); + + fCallback(oCanvas.toDataURL('image/jpeg')); + }; + + oTempImg.src = sUrl; +}; + +// Base64 encode / decode +// http://www.webtoolkit.info/ + +Base64 = { + + // private property + _keyStr : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', + + // public method for urlsafe encoding + urlsafe_encode : function (input) { + return Base64.encode(input).replace(/[+]/g, '-').replace(/[\/]/g, '_').replace(/[=]/g, '.'); + }, + + // public method for encoding + encode : function (input) { + var + output = '', + chr1, chr2, chr3, enc1, enc2, enc3, enc4, + i = 0 + ; + + input = Base64._utf8_encode(input); + + while (i < input.length) + { + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + + if (isNaN(chr2)) + { + enc3 = enc4 = 64; + } + else if (isNaN(chr3)) + { + enc4 = 64; + } + + output = output + + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); + } + + return output; + }, + + // public method for decoding + decode : function (input) { + var + output = '', + chr1, chr2, chr3, enc1, enc2, enc3, enc4, + i = 0 + ; + + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); + + while (i < input.length) + { + enc1 = this._keyStr.indexOf(input.charAt(i++)); + enc2 = this._keyStr.indexOf(input.charAt(i++)); + enc3 = this._keyStr.indexOf(input.charAt(i++)); + enc4 = this._keyStr.indexOf(input.charAt(i++)); + + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + + output = output + String.fromCharCode(chr1); + + if (enc3 !== 64) + { + output = output + String.fromCharCode(chr2); + } + + if (enc4 !== 64) + { + output = output + String.fromCharCode(chr3); + } + } + + return Base64._utf8_decode(output); + }, + + // private method for UTF-8 encoding + _utf8_encode : function (string) { + + string = string.replace(/\r\n/g, "\n"); + + var + utftext = '', + n = 0, + l = string.length, + c = 0 + ; + + for (; n < l; n++) { + + c = string.charCodeAt(n); + + if (c < 128) + { + utftext += String.fromCharCode(c); + } + else if ((c > 127) && (c < 2048)) + { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else + { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + } + + return utftext; + }, + + // private method for UTF-8 decoding + _utf8_decode : function (utftext) { + var + string = '', + i = 0, + c = 0, + c2 = 0, + c3 = 0 + ; + + while ( i < utftext.length ) + { + c = utftext.charCodeAt(i); + + if (c < 128) + { + string += String.fromCharCode(c); + i++; + } + else if((c > 191) && (c < 224)) + { + c2 = utftext.charCodeAt(i+1); + string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 2; + } + else + { + c2 = utftext.charCodeAt(i+1); + c3 = utftext.charCodeAt(i+2); + string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + } + + return string; + } +}; + +/*jslint bitwise: false*/ +ko.bindingHandlers.tooltip = { + 'init': function (oElement, fValueAccessor) { + if (!Globals.bMobileDevice) + { + var + sClass = $(oElement).data('tooltip-class') || '', + sPlacement = $(oElement).data('tooltip-placement') || 'top' + ; + + $(oElement).tooltip({ + 'delay': { + 'show': 500, + 'hide': 100 + }, + 'html': true, + 'placement': sPlacement, + 'trigger': 'hover', + 'title': function () { + return '' + + Utils.i18n(ko.utils.unwrapObservable(fValueAccessor())) + ''; + } + }); + } + } +}; + +ko.bindingHandlers.tooltip2 = { + 'init': function (oElement, fValueAccessor) { + var + sClass = $(oElement).data('tooltip-class') || '', + sPlacement = $(oElement).data('tooltip-placement') || 'top' + ; + $(oElement).tooltip({ + 'delay': { + 'show': 500, + 'hide': 100 + }, + 'html': true, + 'placement': sPlacement, + 'title': function () { + return '' + fValueAccessor()() + ''; + } + }); + } +}; + +ko.bindingHandlers.dropdown = { + 'init': function (oElement) { + $(oElement).closest('.dropdown').on('click', '.e-item', function () { + $(oElement).dropdown('toggle'); + }); + } +}; + +ko.bindingHandlers.popover = { + 'init': function (oElement, fValueAccessor) { + $(oElement).popover(ko.utils.unwrapObservable(fValueAccessor())); + } +}; + +ko.bindingHandlers.resizecrop = { + 'init': function (oElement) { + $(oElement).addClass('resizecrop').resizecrop({ + 'width': '100', + 'height': '100', + 'wrapperCSS': { + 'border-radius': '10px' + } + }); + }, + 'update': function (oElement, fValueAccessor) { + fValueAccessor()(); + $(oElement).resizecrop({ + 'width': '100', + 'height': '100' + }); + } +}; + +ko.bindingHandlers.onEnter = { + 'init': function (oElement, fValueAccessor, fAllBindingsAccessor, oViewModel) { + $(oElement).on('keypress', function (oEvent) { + if (oEvent && 13 === window.parseInt(oEvent.keyCode, 10)) + { + $(oElement).trigger('change'); + fValueAccessor().call(oViewModel); + } + }); + } +}; + +ko.bindingHandlers.onEsc = { + 'init': function (oElement, fValueAccessor, fAllBindingsAccessor, oViewModel) { + $(oElement).on('keypress', function (oEvent) { + if (oEvent && 27 === window.parseInt(oEvent.keyCode, 10)) + { + $(oElement).trigger('change'); + fValueAccessor().call(oViewModel); + } + }); + } +}; + +ko.bindingHandlers.modal = { + 'init': function (oElement, fValueAccessor) { + $(oElement).modal({ + 'keyboard': false, + 'show': ko.utils.unwrapObservable(fValueAccessor()) + }).on('hidden', function () { + fValueAccessor()(false); + }); + }, + 'update': function (oElement, fValueAccessor) { + var bValue = ko.utils.unwrapObservable(fValueAccessor()); + $(oElement).modal(bValue ? 'show' : 'hide'); + + _.delay(function () { + $(oElement).toggleClass('popup-active', bValue); + }, 1); + } +}; + +ko.bindingHandlers.i18nInit = { + 'init': function (oElement) { + Utils.i18nToNode(oElement); + } +}; + +ko.bindingHandlers.i18nUpdate = { + 'update': function (oElement, fValueAccessor) { + ko.utils.unwrapObservable(fValueAccessor()); + Utils.i18nToNode(oElement); + } +}; + +ko.bindingHandlers.link = { + 'update': function (oElement, fValueAccessor) { + $(oElement).attr('href', ko.utils.unwrapObservable(fValueAccessor())); + } +}; + +ko.bindingHandlers.title = { + 'update': function (oElement, fValueAccessor) { + $(oElement).attr('title', ko.utils.unwrapObservable(fValueAccessor())); + } +}; + +ko.bindingHandlers.textF = { + 'init': function (oElement, fValueAccessor) { + $(oElement).text(ko.utils.unwrapObservable(fValueAccessor())); + } +}; + +ko.bindingHandlers.initDom = { + 'init': function (oElement, fValueAccessor) { + fValueAccessor()(oElement); + } +}; + +ko.bindingHandlers.initResizeTrigger = { + 'init': function (oElement, fValueAccessor) { + var aValues = ko.utils.unwrapObservable(fValueAccessor()); + $(oElement).css({ + 'height': aValues[1], + 'min-height': aValues[1] + }); + }, + 'update': function (oElement, fValueAccessor) { + var + aValues = ko.utils.unwrapObservable(fValueAccessor()), + iValue = Utils.pInt(aValues[1]), + iSize = 0, + iOffset = $(oElement).offset().top + ; + + if (0 < iOffset) + { + iOffset += Utils.pInt(aValues[2]); + iSize = $window.height() - iOffset; + + if (iValue < iSize) + { + iValue = iSize; + } + + $(oElement).css({ + 'height': iValue, + 'min-height': iValue + }); + } + } +}; + +ko.bindingHandlers.appendDom = { + 'update': function (oElement, fValueAccessor) { + $(oElement).hide().empty().append(ko.utils.unwrapObservable(fValueAccessor())).show(); + } +}; + +ko.bindingHandlers.draggable = { + 'init': function (oElement, fValueAccessor, fAllBindingsAccessor) { + + if (!Globals.bMobileDevice) + { + var + iTriggerZone = 100, + iScrollSpeed = 3, + fAllValueFunc = fAllBindingsAccessor(), + sDroppableSelector = fAllValueFunc && fAllValueFunc['droppableSelector'] ? fAllValueFunc['droppableSelector'] : '', + oConf = { + 'distance': 20, + 'handle': '.dragHandle', + 'cursorAt': {'top': 22, 'left': 3}, + 'refreshPositions': true, + 'scroll': true + } + ; + + if (sDroppableSelector) + { + oConf['drag'] = function (oEvent) { + + $(sDroppableSelector).each(function () { + var + moveUp = null, + moveDown = null, + $this = $(this), + oOffset = $this.offset(), + bottomPos = oOffset.top + $this.height() + ; + + window.clearInterval($this.data('timerScroll')); + $this.data('timerScroll', false); + + if (oEvent.pageX >= oOffset.left && oEvent.pageX <= oOffset.left + $this.width()) + { + if (oEvent.pageY >= bottomPos - iTriggerZone && oEvent.pageY <= bottomPos) + { + moveUp = function() { + $this.scrollTop($this.scrollTop() + iScrollSpeed); + Utils.windowResize(); + }; + + $this.data('timerScroll', window.setInterval(moveUp, 10)); + moveUp(); + } + + if(oEvent.pageY >= oOffset.top && oEvent.pageY <= oOffset.top + iTriggerZone) + { + moveDown = function() { + $this.scrollTop($this.scrollTop() - iScrollSpeed); + Utils.windowResize(); + }; + + $this.data('timerScroll', window.setInterval(moveDown, 10)); + moveDown(); + } + } + }); + }; + + oConf['stop'] = function() { + $(sDroppableSelector).each(function () { + window.clearInterval($(this).data('timerScroll')); + $(this).data('timerScroll', false); + }); + }; + } + + oConf['helper'] = function (oEvent) { + return fValueAccessor()(oEvent && oEvent.target ? ko.dataFor(oEvent.target) : null); + }; + + $(oElement).draggable(oConf).on('mousedown', function () { + Utils.removeInFocus(); + }); + } + } +}; + +ko.bindingHandlers.droppable = { + 'init': function (oElement, fValueAccessor, fAllBindingsAccessor) { + + if (!Globals.bMobileDevice) + { + var + fValueFunc = fValueAccessor(), + fAllValueFunc = fAllBindingsAccessor(), + fOverCallback = fAllValueFunc && fAllValueFunc['droppableOver'] ? fAllValueFunc['droppableOver'] : null, + fOutCallback = fAllValueFunc && fAllValueFunc['droppableOut'] ? fAllValueFunc['droppableOut'] : null, + oConf = { + 'tolerance': 'pointer', + 'hoverClass': 'droppableHover' + } + ; + + if (fValueFunc) + { + oConf['drop'] = function (oEvent, oUi) { + fValueFunc(oEvent, oUi); + }; + + if (fOverCallback) + { + oConf['over'] = function (oEvent, oUi) { + fOverCallback(oEvent, oUi); + }; + } + + if (fOutCallback) + { + oConf['out'] = function (oEvent, oUi) { + fOutCallback(oEvent, oUi); + }; + } + + $(oElement).droppable(oConf); + } + } + } +}; + +ko.bindingHandlers.nano = { + 'init': function (oElement) { + if (!Globals.bDisableNanoScroll) + { + $(oElement) + .addClass('nano') + .nanoScroller({ + 'iOSNativeScrolling': false, + 'preventPageScrolling': true + }) + ; + } + } +}; + +ko.bindingHandlers.saveTrigger1 = { + 'init': function (oElement) { + + var $oEl = $(oElement); + + $oEl.data('save-trigger-type', $oEl.is('input[type=text]') ? 'input' : 'custom'); + + if ('custom' === $oEl.data('save-trigger-type')) + { + $oEl.append( + '  ' + ).addClass('settings-saved-trigger'); + } + else + { + $oEl.addClass('settings-saved-trigger-input'); + } + }, + 'update': function (oElement, fValueAccessor) { + var + mValue = ko.utils.unwrapObservable(fValueAccessor()), + $oEl = $(oElement), + bCustom = 'custom' === $oEl.data('save-trigger-type'), + sSuffix = bCustom ? '' : '-input' + ; + + switch (mValue.toString()) + { + case '1': + $oEl + .find('.sst-animated' + sSuffix + ',.sst-error' + sSuffix).hide().removeClass('sst-visible' + sSuffix) + .end() + .find('.sst-success' + sSuffix).show().addClass('sst-visible' + sSuffix) + ; + break; + case '0': + $oEl + .find('.sst-animated' + sSuffix + ',.sst-success' + sSuffix).hide().removeClass('sst-visible' + sSuffix) + .end() + .find('.sst-error' + sSuffix).show().addClass('sst-visible' + sSuffix) + ; + break; + case '-2': + $oEl + .find('.sst-error' + sSuffix + ',.sst-success' + sSuffix).hide().removeClass('sst-visible' + sSuffix) + .end() + .find('.sst-animated' + sSuffix).show().addClass('sst-visible' + sSuffix) + ; + break; + default: + $oEl + .find('.sst-animated' + sSuffix).hide() + .end() + .find('.sst-error' + sSuffix + ',.sst-success' + sSuffix).removeClass('sst-visible' + sSuffix) + ; + break; + } + } +}; + +ko.bindingHandlers.saveTrigger = { + 'init': function (oElement) { + + var $oEl = $(oElement); + + $oEl.data('save-trigger-type', $oEl.is('input[type=text],select,textarea') ? 'input' : 'custom'); + + if ('custom' === $oEl.data('save-trigger-type')) + { + $oEl.append( + '  ' + ).addClass('settings-saved-trigger'); + } + else + { + $oEl.addClass('settings-saved-trigger-input'); + } + }, + 'update': function (oElement, fValueAccessor) { + var + mValue = ko.utils.unwrapObservable(fValueAccessor()), + $oEl = $(oElement) + ; + + if ('custom' === $oEl.data('save-trigger-type')) + { + switch (mValue.toString()) + { + case '1': + $oEl + .find('.animated,.error').hide().removeClass('visible') + .end() + .find('.success').show().addClass('visible') + ; + break; + case '0': + $oEl + .find('.animated,.success').hide().removeClass('visible') + .end() + .find('.error').show().addClass('visible') + ; + break; + case '-2': + $oEl + .find('.error,.success').hide().removeClass('visible') + .end() + .find('.animated').show().addClass('visible') + ; + break; + default: + $oEl + .find('.animated').hide() + .end() + .find('.error,.success').removeClass('visible') + ; + break; + } + } + else + { + switch (mValue.toString()) + { + case '1': + $oEl.addClass('success').removeClass('error'); + break; + case '0': + $oEl.addClass('error').removeClass('success'); + break; + case '-2': +// $oEl; + break; + default: + $oEl.removeClass('error success'); + break; + } + } + } +}; + +ko.bindingHandlers.select2 = { + 'init': function(oElement, fValueAccessor) { + + var + iTimer = 0, + iTimeout = 100, + oMatch = null, + oReg = new window.RegExp(/[a-zA-Z0-9\.\-_]+@[a-zA-Z0-9\.\-_]+/), + oReg2 = new window.RegExp(/(.+) [<]?([^\s<@]+@[a-zA-Z0-9\.\-_]+)[>]?/), + sEmptyTranslateFunction = function () { + return ''; + }, + /** + * @param {{term:string, callback:Function, matcher:Function}} oCall + */ + fLazyAutocomplete = function (oCall) { + + RL.getAutocomplete(oCall['term'], oCall['page'], function (aData, bMore) { + oCall.callback({ + 'more': !!bMore, + 'results': _.map(aData, function (oEmailItem) { + var sName = oEmailItem.toLine(false); + return { + 'id': sName, + 'text': sName, + 'c': oEmailItem + }; + }) + }); + }); + } + ; + + $(oElement).addClass('ko-select2').select2({ + + /** + * @param {{term:string, callback:Function, matcher:Function}} oCall + */ + 'query': function (oCall) { + if (!oCall) + { + return; + } + +// if (RL.isLocalAutocomplete && false) +// { +// fLazyAutocomplete(oCall); +// } +// else +// { + if (0 === iTimer) + { + fLazyAutocomplete(oCall); + iTimer = window.setTimeout(Utils.emptyFunction, iTimeout); + } + else + { + window.clearInterval(iTimer); + iTimer = window.setTimeout(function () { + fLazyAutocomplete(oCall); + }, iTimeout); + } +// } + }, + 'formatSelection': function (oItem, oContainer) { + var sR = oItem && oItem.c ? oItem.c.select2Selection(oContainer) : oItem.text; + if (null !== sR) + { + return sR; + } + }, + 'formatResult': function (oItem, oContainer, oQuery, fEscapeMarkup) { + var sR = oItem && oItem.c ? oItem.c.select2Result(oContainer) : ''; + return '' === sR ? fEscapeMarkup(oItem.text) : sR; + }, + 'createSearchChoice': function (sTerm, aList) { + return 0 === aList.length && oReg.test(sTerm) ? { + 'id': sTerm, + 'text': sTerm + } : null; + }, + 'formatNoMatches': sEmptyTranslateFunction, + 'formatSearching': function () { + return Utils.i18n('SUGGESTIONS/SEARCHING_DESC'); + }, + 'formatInputTooShort': sEmptyTranslateFunction, + 'formatSelectionTooBig': sEmptyTranslateFunction, + 'multiple': true, + 'tokenSeparators': [',', ';'], + 'minimumInputLength': 2, + 'selectOnBlur': false, + 'closeOnSelect': true, + 'openOnEnter': false + }); + + ko.utils.domNodeDisposal.addDisposeCallback(oElement, function() { + $(oElement).select2('destroy'); + }); + + $(oElement).on('change', function () { + + var + aTags = $(this).select2('data'), + iIndex = 0, + iLen = aTags.length, + oItem = null, + aResult = [] + ; + + for (; iIndex < iLen; iIndex++) + { + oItem = aTags[iIndex]; + if (oItem && oItem.id) + { + if (!oItem.c) + { + oItem.c = new EmailModel(); + oMatch = oReg2.exec(Utils.trim(oItem.id)); + if (oMatch && !Utils.isUnd(oMatch[2])) + { + oItem.c.name = oMatch[1]; + oItem.c.email = oMatch[2]; + } + else + { + oItem.c.email = oItem.id; + } + } + + aResult.push(oItem.c); + } + } + + fValueAccessor()(aResult); + }); + }, + + 'update': function (oElement, fValueAccessor) { + + var + aTags = ko.utils.unwrapObservable(fValueAccessor()), + iIndex = 0, + iLen = aTags.length, + oItem = null, + sName = '', + aResult = [] + ; + + for (; iIndex < iLen; iIndex++) + { + oItem = aTags[iIndex]; + sName = oItem.toLine(false); + + aResult.push({ + 'id': sName, + 'text': sName, + 'c': oItem + }); + } + + $(oElement).select2('data', aResult); + } +}; + +ko.bindingHandlers.command = { + 'init': function (oElement, fValueAccessor, fAllBindingsAccessor, oViewModel) { + var + jqElement = $(oElement), + oCommand = fValueAccessor() + ; + + if (!oCommand || !oCommand.enabled || !oCommand.canExecute) + { + throw new Error('You are not using command function'); + } + + jqElement.addClass('command'); + ko.bindingHandlers[jqElement.is('form') ? 'submit' : 'click'].init.apply(oViewModel, arguments); + }, + + 'update': function (oElement, fValueAccessor) { + + var + bResult = true, + jqElement = $(oElement), + oCommand = fValueAccessor() + ; + + bResult = oCommand.enabled(); + jqElement.toggleClass('command-not-enabled', !bResult); + + if (bResult) + { + bResult = oCommand.canExecute(); + jqElement.toggleClass('command-can-not-be-execute', !bResult); + } + + jqElement.toggleClass('command-disabled disable disabled', !bResult); + + if (jqElement.is('input') || jqElement.is('button')) + { + jqElement.prop('disabled', !bResult); + } + } +}; + +ko.extenders.trimmer = function (oTarget) +{ + var oResult = ko.computed({ + 'read': oTarget, + 'write': function (sNewValue) { + oTarget(Utils.trim(sNewValue.toString())); + }, + 'owner': this + }); + + oResult(oTarget()); + return oResult; +}; + +ko.extenders.reversible = function (oTarget) +{ + var mValue = oTarget(); + + oTarget.commit = function () + { + mValue = oTarget(); + }; + + oTarget.reverse = function () + { + oTarget(mValue); + }; + + oTarget.commitedValue = function () + { + return mValue; + }; + + return oTarget; +}; + +ko.extenders.toggleSubscribe = function (oTarget, oOptions) +{ + oTarget.subscribe(oOptions[1], oOptions[0], 'beforeChange'); + oTarget.subscribe(oOptions[2], oOptions[0]); + + return oTarget; +}; + +ko.extenders.falseTimeout = function (oTarget, iOption) +{ + oTarget.iTimeout = 0; + oTarget.subscribe(function (bValue) { + if (bValue) + { + window.clearTimeout(oTarget.iTimeout); + oTarget.iTimeout = window.setTimeout(function () { + oTarget(false); + oTarget.iTimeout = 0; + }, Utils.pInt(iOption)); + } + }); + + return oTarget; +}; + +ko.observable.fn.validateEmail = function () +{ + this.hasError = ko.observable(false); + + this.subscribe(function (sValue) { + sValue = Utils.trim(sValue); + this.hasError('' !== sValue && !(/^[^@\s]+@[^@\s]+$/.test(sValue))); + }, this); + + this.valueHasMutated(); + return this; +}; + +ko.observable.fn.validateSimpleEmail = function () +{ + this.hasError = ko.observable(false); + + this.subscribe(function (sValue) { + sValue = Utils.trim(sValue); + this.hasError('' !== sValue && !(/^.+@.+$/.test(sValue))); + }, this); + + this.valueHasMutated(); + return this; +}; + +ko.observable.fn.validateFunc = function (fFunc) +{ + this.hasFuncError = ko.observable(false); + + if (Utils.isFunc(fFunc)) + { + this.subscribe(function (sValue) { + this.hasFuncError(!fFunc(sValue)); + }, this); + + this.valueHasMutated(); + } + + return this; +}; + + +/** + * @constructor + */ +function LinkBuilder() +{ + this.sBase = '#/'; + this.sCdnStaticDomain = RL.settingsGet('CdnStaticDomain'); + this.sVersion = RL.settingsGet('Version'); + this.sSpecSuffix = RL.settingsGet('AuthAccountHash') || '0'; + + this.sServer = (RL.settingsGet('IndexFile') || './') + '?'; + this.sCdnStaticDomain = '' === this.sCdnStaticDomain ? this.sCdnStaticDomain : + ('/' === this.sCdnStaticDomain.substr(-1) ? this.sCdnStaticDomain : this.sCdnStaticDomain + '/'); +} + +/** + * @return {string} + */ +LinkBuilder.prototype.root = function () +{ + return this.sBase; +}; + +/** + * @param {string} sDownload + * @return {string} + */ +LinkBuilder.prototype.attachmentDownload = function (sDownload) +{ + return this.sServer + '/Raw/' + this.sSpecSuffix + '/Download/' + sDownload; +}; + +/** + * @param {string} sDownload + * @return {string} + */ +LinkBuilder.prototype.attachmentPreview = function (sDownload) +{ + return this.sServer + '/Raw/' + this.sSpecSuffix + '/View/' + sDownload; +}; + +/** + * @param {string} sDownload + * @return {string} + */ +LinkBuilder.prototype.attachmentPreviewAsPlain = function (sDownload) +{ + return this.sServer + '/Raw/' + this.sSpecSuffix + '/ViewAsPlain/' + sDownload; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.upload = function () +{ + return this.sServer + '/Upload/' + this.sSpecSuffix + '/'; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.uploadBackground = function () +{ + return this.sServer + '/UploadBackground/' + this.sSpecSuffix + '/'; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.append = function () +{ + return this.sServer + '/Append/' + this.sSpecSuffix + '/'; +}; + +/** + * @param {string} sEmail + * @return {string} + */ +LinkBuilder.prototype.change = function (sEmail) +{ + return this.sServer + '/Change/' + this.sSpecSuffix + '/' + window.encodeURIComponent(sEmail) + '/'; +}; + +/** + * @param {string=} sAdd + * @return {string} + */ +LinkBuilder.prototype.ajax = function (sAdd) +{ + return this.sServer + '/Ajax/' + this.sSpecSuffix + '/' + sAdd; +}; + +/** + * @param {string} sRequestHash + * @return {string} + */ +LinkBuilder.prototype.messageViewLink = function (sRequestHash) +{ + return this.sServer + '/Raw/' + this.sSpecSuffix + '/ViewAsPlain/' + sRequestHash; +}; + +/** + * @param {string} sRequestHash + * @return {string} + */ +LinkBuilder.prototype.messageDownloadLink = function (sRequestHash) +{ + return this.sServer + '/Raw/' + this.sSpecSuffix + '/Download/' + sRequestHash; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.inbox = function () +{ + return this.sBase + 'mailbox/Inbox'; +}; + +/** + * @param {string=} sScreenName + * @return {string} + */ +LinkBuilder.prototype.settings = function (sScreenName) +{ + var sResult = this.sBase + 'settings'; + if (!Utils.isUnd(sScreenName) && '' !== sScreenName) + { + sResult += '/' + sScreenName; + } + + return sResult; +}; + +/** + * @param {string} sScreenName + * @return {string} + */ +LinkBuilder.prototype.admin = function (sScreenName) +{ + var sResult = this.sBase; + switch (sScreenName) { + case 'AdminDomains': + sResult += 'domains'; + break; + case 'AdminSecurity': + sResult += 'security'; + break; + case 'AdminLicensing': + sResult += 'licensing'; + break; + } + + return sResult; +}; + +/** + * @param {string} sFolder + * @param {number=} iPage + * @param {string=} sSearch + * @return {string} + */ +LinkBuilder.prototype.mailBox = function (sFolder, iPage, sSearch) +{ + iPage = Utils.isNormal(iPage) ? Utils.pInt(iPage) : 1; + sSearch = Utils.pString(sSearch); + + var sResult = this.sBase + 'mailbox/'; + if ('' !== sFolder) + { + sResult += encodeURI(sFolder); + } + if (1 < iPage) + { + sResult = sResult.replace(/[\/]+$/, ''); + sResult += '/p' + iPage; + } + if ('' !== sSearch) + { + sResult = sResult.replace(/[\/]+$/, ''); + sResult += '/' + encodeURI(sSearch); + } + + return sResult; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.phpInfo = function () +{ + return this.sServer + 'Info'; +}; + +/** + * @param {string} sLang + * @return {string} + */ +LinkBuilder.prototype.langLink = function (sLang) +{ + return this.sServer + '/Lang/0/' + encodeURI(sLang) + '/' + this.sVersion + '/'; +}; + +/** + * @param {string} sHash + * @return {string} + */ +LinkBuilder.prototype.getUserPicUrlFromHash = function (sHash) +{ + return this.sServer + '/Raw/' + this.sSpecSuffix + '/UserPic/' + sHash + '/' + this.sVersion + '/'; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.emptyContactPic = function () +{ + return ('' === this.sCdnStaticDomain ? 'rainloop/v/' : this.sCdnStaticDomain) + + this.sVersion + '/static/css/images/empty-contact.png'; +}; + +/** + * @param {string} sFileName + * @return {string} + */ +LinkBuilder.prototype.sound = function (sFileName) +{ + return ('' === this.sCdnStaticDomain ? 'rainloop/v/' : this.sCdnStaticDomain) + + this.sVersion + '/static/sounds/' + sFileName; +}; + +/** + * @param {string} sTheme + * @return {string} + */ +LinkBuilder.prototype.themePreviewLink = function (sTheme) +{ + return ('' === this.sCdnStaticDomain ? 'rainloop/v/' : this.sCdnStaticDomain) + + this.sVersion + '/themes/' + encodeURI(sTheme) + '/images/preview.png'; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.notificationMailIcon = function () +{ + return ('' === this.sCdnStaticDomain ? 'rainloop/v/' : this.sCdnStaticDomain) + + this.sVersion + '/static/css/images/icom-message-notification.png'; +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.socialGoogle = function () +{ + return this.sServer + 'SocialGoogle' + ('' !== this.sSpecSuffix ? '/' + this.sSpecSuffix + '/' : ''); +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.socialTwitter = function () +{ + return this.sServer + 'SocialTwitter' + ('' !== this.sSpecSuffix ? '/' + this.sSpecSuffix + '/' : ''); +}; + +/** + * @return {string} + */ +LinkBuilder.prototype.socialFacebook = function () +{ + return this.sServer + 'SocialFacebook' + ('' !== this.sSpecSuffix ? '/' + this.sSpecSuffix + '/' : ''); +}; + +/** + * @type {Object} + */ +Plugins.oViewModelsHooks = {}; + +/** + * @type {Object} + */ +Plugins.oSimpleHooks = {}; + +/** + * @param {string} sName + * @param {Function} ViewModel + */ +Plugins.regViewModelHook = function (sName, ViewModel) +{ + if (ViewModel) + { + ViewModel.__hookName = sName; + } +}; + +/** + * @param {string} sName + * @param {Function} fCallback + */ +Plugins.addHook = function (sName, fCallback) +{ + if (Utils.isFunc(fCallback)) + { + if (!Utils.isArray(Plugins.oSimpleHooks[sName])) + { + Plugins.oSimpleHooks[sName] = []; + } + + Plugins.oSimpleHooks[sName].push(fCallback); + } +}; + +/** + * @param {string} sName + * @param {Array=} aArguments + */ +Plugins.runHook = function (sName, aArguments) +{ + if (Utils.isArray(Plugins.oSimpleHooks[sName])) + { + aArguments = aArguments || []; + + _.each(Plugins.oSimpleHooks[sName], function (fCallback) { + fCallback.apply(null, aArguments); + }); + } +}; + +/** + * @param {string} sName + * @return {?} + */ +Plugins.mainSettingsGet = function (sName) +{ + return RL ? RL.settingsGet(sName) : null; +}; + +/** + * @param {Function} fCallback + * @param {string} sAction + * @param {Object=} oParameters + * @param {?number=} iTimeout + * @param {string=} sGetAdd = '' + * @param {Array=} aAbortActions = [] + */ +Plugins.remoteRequest = function (fCallback, sAction, oParameters, iTimeout, sGetAdd, aAbortActions) +{ + if (RL) + { + RL.remote().defaultRequest(fCallback, sAction, oParameters, iTimeout, sGetAdd, aAbortActions); + } +}; + +/** + * @param {string} sPluginSection + * @param {string} sName + * @return {?} + */ +Plugins.settingsGet = function (sPluginSection, sName) +{ + var oPlugin = Plugins.mainSettingsGet('Plugins'); + oPlugin = oPlugin && Utils.isUnd(oPlugin[sPluginSection]) ? null : oPlugin[sPluginSection]; + return oPlugin ? (Utils.isUnd(oPlugin[sName]) ? null : oPlugin[sName]) : null; +}; + + + +/** + * @constructor + */ +function CookieDriver() +{ + +} + +CookieDriver.supported = function () +{ + return true; +}; + +/** + * @param {string} sKey + * @param {*} mData + * @returns {boolean} + */ +CookieDriver.prototype.set = function (sKey, mData) +{ + var + mCokieValue = $.cookie(Consts.Values.ClientSideCookieIndexName), + bResult = false, + mResult = null + ; + + try + { + mResult = null === mCokieValue ? null : JSON.parse(mCokieValue); + if (!mResult) + { + mResult = {}; + } + + mResult[sKey] = mData; + $.cookie(Consts.Values.ClientSideCookieIndexName, JSON.stringify(mResult), { + 'expires': 30 + }); + + bResult = true; + } + catch (oException) {} + + return bResult; +}; + +/** + * @param {string} sKey + * @returns {*} + */ +CookieDriver.prototype.get = function (sKey) +{ + var + mCokieValue = $.cookie(Consts.Values.ClientSideCookieIndexName), + mResult = null + ; + + try + { + mResult = null === mCokieValue ? null : JSON.parse(mCokieValue); + if (mResult && !Utils.isUnd(mResult[sKey])) + { + mResult = mResult[sKey]; + } + else + { + mResult = null; + } + } + catch (oException) {} + + return mResult; +}; + +/** + * @constructor + */ +function LocalStorageDriver() +{ +} + +LocalStorageDriver.supported = function () +{ + return !!window.localStorage; +}; + + +/** + * @param {string} sKey + * @param {*} mData + * @returns {boolean} + */ +LocalStorageDriver.prototype.set = function (sKey, mData) +{ + var + mCokieValue = window.localStorage[Consts.Values.ClientSideCookieIndexName] || null, + bResult = false, + mResult = null + ; + + try + { + mResult = null === mCokieValue ? null : JSON.parse(mCokieValue); + if (!mResult) + { + mResult = {}; + } + + mResult[sKey] = mData; + window.localStorage[Consts.Values.ClientSideCookieIndexName] = JSON.stringify(mResult); + + bResult = true; + } + catch (oException) {} + + return bResult; +}; + +/** + * @param {string} sKey + * @returns {*} + */ +LocalStorageDriver.prototype.get = function (sKey) +{ + var + mCokieValue = window.localStorage[Consts.Values.ClientSideCookieIndexName] || null, + mResult = null + ; + + try + { + mResult = null === mCokieValue ? null : JSON.parse(mCokieValue); + if (mResult && !Utils.isUnd(mResult[sKey])) + { + mResult = mResult[sKey]; + } + else + { + mResult = null; + } + } + catch (oException) {} + + return mResult; +}; + +/** + * @constructor + */ +function LocalStorage() +{ + var + sStorages = [ + LocalStorageDriver, + CookieDriver + ], + NextStorageDriver = _.find(sStorages, function (NextStorageDriver) { + return NextStorageDriver.supported(); + }) + ; + + if (NextStorageDriver) + { + NextStorageDriver = /** @type {?Function} */ NextStorageDriver; + this.oDriver = new NextStorageDriver(); + } +} + +LocalStorage.prototype.oDriver = null; + +/** + * @param {number} iKey + * @param {*} mData + * @return {boolean} + */ +LocalStorage.prototype.set = function (iKey, mData) +{ + return this.oDriver ? this.oDriver.set('p' + iKey, mData) : false; +}; + +/** + * @param {number} iKey + * @return {*} + */ +LocalStorage.prototype.get = function (iKey) +{ + return this.oDriver ? this.oDriver.get('p' + iKey) : null; +}; + +/** + * @constructor + */ +function KnoinAbstractBoot() +{ + +} + +KnoinAbstractBoot.prototype.bootstart = function () +{ + +}; + +/** + * @param {string=} sPosition = '' + * @param {string=} sTemplate = '' + * @constructor + */ +function KnoinAbstractViewModel(sPosition, sTemplate) +{ + this.sPosition = Utils.pString(sPosition); + this.sTemplate = Utils.pString(sTemplate); + + this.viewModelName = ''; + this.viewModelVisibility = ko.observable(false); + if ('Popups' === this.sPosition) + { + this.modalVisibility = ko.observable(false); + } + + this.viewModelDom = null; +} + +/** + * @type {string} + */ +KnoinAbstractViewModel.prototype.sPosition = ''; + +/** + * @type {string} + */ +KnoinAbstractViewModel.prototype.sTemplate = ''; + +/** + * @type {string} + */ +KnoinAbstractViewModel.prototype.viewModelName = ''; + +/** + * @type {?} + */ +KnoinAbstractViewModel.prototype.viewModelDom = null; + +/** + * @return {string} + */ +KnoinAbstractViewModel.prototype.viewModelTemplate = function () +{ + return this.sTemplate; +}; + +/** + * @return {string} + */ +KnoinAbstractViewModel.prototype.viewModelPosition = function () +{ + return this.sPosition; +}; + +KnoinAbstractViewModel.prototype.cancelCommand = KnoinAbstractViewModel.prototype.closeCommand = function () +{ +}; + +/** + * @param {string} sScreenName + * @param {?=} aViewModels = [] + * @constructor + */ +function KnoinAbstractScreen(sScreenName, aViewModels) +{ + this.sScreenName = sScreenName; + this.aViewModels = Utils.isArray(aViewModels) ? aViewModels : []; +} + +/** + * @type {Array} + */ +KnoinAbstractScreen.prototype.oCross = null; + +/** + * @type {string} + */ +KnoinAbstractScreen.prototype.sScreenName = ''; + +/** + * @type {Array} + */ +KnoinAbstractScreen.prototype.aViewModels = []; + +/** + * @return {Array} + */ +KnoinAbstractScreen.prototype.viewModels = function () +{ + return this.aViewModels; +}; + +/** + * @return {string} + */ +KnoinAbstractScreen.prototype.screenName = function () +{ + return this.sScreenName; +}; + +KnoinAbstractScreen.prototype.routes = function () +{ + return null; +}; + +/** + * @return {?Object} + */ +KnoinAbstractScreen.prototype.__cross = function () +{ + return this.oCross; +}; + +KnoinAbstractScreen.prototype.__start = function () +{ + var + aRoutes = this.routes(), + oRoute = null, + fMatcher = null + ; + + if (Utils.isNonEmptyArray(aRoutes)) + { + fMatcher = _.bind(this.onRoute || Utils.emptyFunction, this); + oRoute = crossroads.create(); + + _.each(aRoutes, function (aItem) { + oRoute.addRoute(aItem[0], fMatcher).rules = aItem[1]; + }); + + this.oCross = oRoute; + } +}; + +/** + * @constructor + */ +function Knoin() +{ + this.sDefaultScreenName = ''; + this.oScreens = {}; + this.oBoot = null; + this.oCurrentScreen = null; + + this.popupVisibility = ko.observable(false); + + this.popupVisibility.subscribe(function (bValue) { + if (RL) + { + RL.popupVisibility(bValue); + } + }); +} + +Knoin.prototype.sDefaultScreenName = ''; +Knoin.prototype.oScreens = {}; +Knoin.prototype.oBoot = null; +Knoin.prototype.oCurrentScreen = null; + +Knoin.prototype.showLoading = function () +{ + $('#rl-loading').show(); +}; + +Knoin.prototype.hideLoading = function () +{ + $('#rl-loading').hide(); +}; + +Knoin.prototype.routeOff = function () +{ + hasher.changed.active = false; +}; + +Knoin.prototype.routeOn = function () +{ + hasher.changed.active = true; +}; + +/** + * @param {Object} oBoot + * @return {Knoin} + */ +Knoin.prototype.setBoot = function (oBoot) +{ + if (Utils.isNormal(oBoot)) + { + this.oBoot = oBoot; + } + + return this; +}; + +/** + * @param {string} sScreenName + * @return {?Object} + */ +Knoin.prototype.screen = function (sScreenName) +{ + return ('' !== sScreenName && !Utils.isUnd(this.oScreens[sScreenName])) ? this.oScreens[sScreenName] : null; +}; + +/** + * @param {?} oViewModel + * @param {string} sDelegateName + * @param {Array=} aParameters + */ +Knoin.prototype.delegateRun = function (oViewModel, sDelegateName, aParameters) +{ + if (oViewModel && oViewModel[sDelegateName]) + { + oViewModel[sDelegateName].apply(oViewModel, Utils.isArray(aParameters) ? aParameters : []); + } +}; + +/** + * @param {Function} ViewModelClass + * @param {Object=} oScreen + */ +Knoin.prototype.buildViewModel = function (ViewModelClass, oScreen) +{ + if (ViewModelClass && !ViewModelClass.__builded) + { + var + oViewModel = new ViewModelClass(oScreen), + sPosition = oViewModel.viewModelPosition(), + oViewModelPlace = $('#rl-content #rl-' + sPosition.toLowerCase()), + oViewModelDom = null + ; + + ViewModelClass.__builded = true; + ViewModelClass.__vm = oViewModel; + oViewModel.data = RL.data(); + + oViewModel.viewModelName = ViewModelClass.__name; + + if (oViewModelPlace && 1 === oViewModelPlace.length) + { + oViewModelDom = $('
').addClass('rl-view-model').addClass('RL-' + oViewModel.viewModelTemplate()).hide().attr('data-bind', + 'template: {name: "' + oViewModel.viewModelTemplate() + '"}, i18nInit: true'); + + oViewModelDom.appendTo(oViewModelPlace); + oViewModel.viewModelDom = oViewModelDom; + ViewModelClass.__dom = oViewModelDom; + + if ('Popups' === sPosition) + { + oViewModel.cancelCommand = oViewModel.closeCommand = Utils.createCommand(oViewModel, function () { + kn.hideScreenPopup(ViewModelClass); + }); + } + + Plugins.runHook('view-model-pre-build', [ViewModelClass.__name, oViewModel, oViewModelDom]); + + ko.applyBindings(oViewModel, oViewModelDom[0]); + this.delegateRun(oViewModel, 'onBuild', [oViewModelDom]); + + Plugins.runHook('view-model-post-build', [ViewModelClass.__name, oViewModel, oViewModelDom]); + } + else + { + Utils.log('Cannot find view model position: ' + sPosition); + } + } + + return ViewModelClass ? ViewModelClass.__vm : null; +}; + +/** + * @param {Object} oViewModel + * @param {Object} oViewModelDom + */ +Knoin.prototype.applyExternal = function (oViewModel, oViewModelDom) +{ + if (oViewModel && oViewModelDom) + { + ko.applyBindings(oViewModel, oViewModelDom); + } +}; + +/** + * @param {Function} ViewModelClassToHide + */ +Knoin.prototype.hideScreenPopup = function (ViewModelClassToHide) +{ + if (ViewModelClassToHide && ViewModelClassToHide.__vm && ViewModelClassToHide.__dom) + { + ViewModelClassToHide.__dom.hide(); + ViewModelClassToHide.__vm.modalVisibility(false); + this.delegateRun(ViewModelClassToHide.__vm, 'onHide'); + this.popupVisibility(false); + + _.defer(function () { + ViewModelClassToHide.__dom.find('.ko-select2').select2('close'); + }); + } +}; + +/** + * @param {Function} ViewModelClassToShow + * @param {Array=} aParameters + */ +Knoin.prototype.showScreenPopup = function (ViewModelClassToShow, aParameters) +{ + if (ViewModelClassToShow) + { + this.buildViewModel(ViewModelClassToShow); + + if (ViewModelClassToShow.__vm && ViewModelClassToShow.__dom) + { + ViewModelClassToShow.__dom.show(); + ViewModelClassToShow.__vm.modalVisibility(true); + this.delegateRun(ViewModelClassToShow.__vm, 'onShow', aParameters || []); + this.popupVisibility(true); + + Plugins.runHook('view-model-on-show', [ViewModelClassToShow.__name, ViewModelClassToShow.__vm, aParameters || []]); + } + } +}; + +/** + * @param {string} sScreenName + * @param {string} sSubPart + */ +Knoin.prototype.screenOnRoute = function (sScreenName, sSubPart) +{ + var + self = this, + oScreen = null, + oCross = null + ; + + if ('' === Utils.pString(sScreenName)) + { + sScreenName = this.sDefaultScreenName; + } + + if ('' !== sScreenName) + { + oScreen = this.screen(sScreenName); + if (!oScreen) + { + oScreen = this.screen(this.sDefaultScreenName); + if (oScreen) + { + sSubPart = sScreenName + '/' + sSubPart; + sScreenName = this.sDefaultScreenName; + } + } + + if (oScreen && oScreen.__started) + { + if (!oScreen.__builded) + { + oScreen.__builded = true; + + if (Utils.isNonEmptyArray(oScreen.viewModels())) + { + _.each(oScreen.viewModels(), function (ViewModelClass) { + this.buildViewModel(ViewModelClass, oScreen); + }, this); + } + + this.delegateRun(oScreen, 'onBuild'); + } + + _.defer(function () { + + // hide screen + if (self.oCurrentScreen) + { + self.delegateRun(self.oCurrentScreen, 'onHide'); + + if (Utils.isNonEmptyArray(self.oCurrentScreen.viewModels())) + { + _.each(self.oCurrentScreen.viewModels(), function (ViewModelClass) { + + if (ViewModelClass.__vm && ViewModelClass.__dom && + 'Popups' !== ViewModelClass.__vm.viewModelPosition()) + { + ViewModelClass.__dom.hide(); + ViewModelClass.__vm.viewModelVisibility(false); + self.delegateRun(ViewModelClass.__vm, 'onHide'); + } + + }); + } + } + // -- + + self.oCurrentScreen = oScreen; + + // show screen + if (self.oCurrentScreen) + { + + self.delegateRun(self.oCurrentScreen, 'onShow'); + + Plugins.runHook('screen-on-show', [self.oCurrentScreen.screenName(), self.oCurrentScreen]); + + if (Utils.isNonEmptyArray(self.oCurrentScreen.viewModels())) + { + _.each(self.oCurrentScreen.viewModels(), function (ViewModelClass) { + + if (ViewModelClass.__vm && ViewModelClass.__dom && + 'Popups' !== ViewModelClass.__vm.viewModelPosition()) + { + ViewModelClass.__dom.show(); + ViewModelClass.__vm.viewModelVisibility(true); + self.delegateRun(ViewModelClass.__vm, 'onShow'); + + Plugins.runHook('view-model-on-show', [ViewModelClass.__name, ViewModelClass.__vm]); + } + + }, self); + } + } + // -- + + oCross = oScreen.__cross(); + if (oCross) + { + oCross.parse(sSubPart); + } + }); + } + } +}; + +/** + * @param {Array} aScreensClasses + */ +Knoin.prototype.startScreens = function (aScreensClasses) +{ + _.each(aScreensClasses, function (CScreen) { + + var + oScreen = new CScreen(), + sScreenName = oScreen ? oScreen.screenName() : '' + ; + + if (oScreen && '' !== sScreenName) + { + if ('' === this.sDefaultScreenName) + { + this.sDefaultScreenName = sScreenName; + } + + this.oScreens[sScreenName] = oScreen; + } + + }, this); + + + _.each(this.oScreens, function (oScreen) { + if (oScreen && !oScreen.__started && oScreen.__start) + { + oScreen.__started = true; + oScreen.__start(); + + Plugins.runHook('screen-pre-start', [oScreen.screenName(), oScreen]); + this.delegateRun(oScreen, 'onStart'); + Plugins.runHook('screen-post-start', [oScreen.screenName(), oScreen]); + } + }, this); + + var oCross = crossroads.create(); + oCross.addRoute(/^([a-zA-Z0-9\-]*)\/?(.*)$/, _.bind(this.screenOnRoute, this)); + + hasher.initialized.add(oCross.parse, oCross); + hasher.changed.add(oCross.parse, oCross); + hasher.init(); +}; + +/** + * @param {string} sHash + * @param {boolean=} bSilence = false + * @param {boolean=} bReplace = false + */ +Knoin.prototype.setHash = function (sHash, bSilence, bReplace) +{ + sHash = '#' === sHash.substr(0, 1) ? sHash.substr(1) : sHash; + sHash = '/' === sHash.substr(0, 1) ? sHash.substr(1) : sHash; + + bReplace = Utils.isUnd(bReplace) ? false : !!bReplace; + + if (Utils.isUnd(bSilence) ? false : !!bSilence) + { + hasher.changed.active = false; + hasher[bReplace ? 'replaceHash' : 'setHash'](sHash); + hasher.changed.active = true; + } + else + { + hasher.changed.active = true; + hasher[bReplace ? 'replaceHash' : 'setHash'](sHash); + hasher.setHash(sHash); + } +}; + +/** + * @return {Knoin} + */ +Knoin.prototype.bootstart = function () +{ + if (this.oBoot && this.oBoot.bootstart) + { + this.oBoot.bootstart(); + } + + return this; +}; + +kn = new Knoin(); + +/** + * @param {string=} sEmail + * @param {string=} sName + * + * @constructor + */ +function EmailModel(sEmail, sName) +{ + this.email = sEmail || ''; + this.name = sName || ''; + this.privateType = null; + + this.clearDuplicateName(); +} + +/** + * @static + * @param {AjaxJsonEmail} oJsonEmail + * @return {?EmailModel} + */ +EmailModel.newInstanceFromJson = function (oJsonEmail) +{ + var oEmailModel = new EmailModel(); + return oEmailModel.initByJson(oJsonEmail) ? oEmailModel : null; +}; + +/** + * @type {string} + */ +EmailModel.prototype.name = ''; + +/** + * @type {string} + */ +EmailModel.prototype.email = ''; + +/** + * @type {(number|null)} + */ +EmailModel.prototype.privateType = null; + +/** + * @returns {boolean} + */ +EmailModel.prototype.validate = function () +{ + return '' !== this.name || '' !== this.email; +}; + +/** + * @param {boolean} bWithoutName = false + * @return {string} + */ +EmailModel.prototype.hash = function (bWithoutName) +{ + return '#' + (bWithoutName ? '' : this.name) + '#' + this.email + '#'; +}; + +EmailModel.prototype.clearDuplicateName = function () +{ + if (this.name === this.email) + { + this.name = ''; + } +}; + +/** + * @return {number} + */ +EmailModel.prototype.type = function () +{ + if (null === this.privateType) + { + if (this.email && '@facebook.com' === this.email.substr(-13)) + { + this.privateType = Enums.EmailType.Facebook; + } + + if (null === this.privateType) + { + this.privateType = Enums.EmailType.Default; + } + } + + return this.privateType; +}; + +/** + * @param {string} sQuery + * @return {boolean} + */ +EmailModel.prototype.search = function (sQuery) +{ + return -1 < (this.name + ' ' + this.email).toLowerCase().indexOf(sQuery.toLowerCase()); +}; + +/** + * @param {string} sString + */ +EmailModel.prototype.parse = function (sString) +{ + sString = Utils.trim(sString); + + var + mRegex = /(?:"([^"]+)")? ?,]+)>?,? ?/g, + mMatch = mRegex.exec(sString) + ; + + if (mMatch) + { + this.name = mMatch[1] || ''; + this.email = mMatch[2] || ''; + + this.clearDuplicateName(); + } + else if ((/^[^@]+@[^@]+$/).test(sString)) + { + this.name = ''; + this.email = sString; + } +}; + +/** + * @param {AjaxJsonEmail} oJsonEmail + * @return {boolean} + */ +EmailModel.prototype.initByJson = function (oJsonEmail) +{ + var bResult = false; + if (oJsonEmail && 'Object/Email' === oJsonEmail['@Object']) + { + this.name = Utils.trim(oJsonEmail.Name); + this.email = Utils.trim(oJsonEmail.Email); + + bResult = '' !== this.email; + this.clearDuplicateName(); + } + + return bResult; +}; + +/** + * @param {boolean} bFriendlyView + * @param {boolean=} bWrapWithLink = false + * @return {string} + */ +EmailModel.prototype.toLine = function (bFriendlyView, bWrapWithLink) +{ + var sResult = ''; + if ('' !== this.email) + { + bWrapWithLink = Utils.isUnd(bWrapWithLink) ? false : !!bWrapWithLink; + if (bFriendlyView && '' !== this.name) + { + sResult = bWrapWithLink ? '') + + '" target="_blank" tabindex="-1">' + Utils.encodeHtml(this.name) + '' : this.name; + } + else + { + sResult = this.email; + if ('' !== this.name) + { + if (bWrapWithLink) + { + sResult = Utils.encodeHtml('"' + this.name + '" <') + + '') + '" target="_blank" tabindex="-1">' + Utils.encodeHtml(sResult) + '' + Utils.encodeHtml('>'); + } + else + { + sResult = '"' + this.name + '" <' + sResult + '>'; + } + } + else if (bWrapWithLink) + { + sResult = '' + Utils.encodeHtml(this.email) + ''; + } + } + } + + return sResult; +}; + +/** + * @return {string} + */ +EmailModel.prototype.select2Result = function () +{ + var + sResult = '', + sImg = RL.cache().getUserPic(this.email) + ; + + if ('' !== sImg) + { + sResult += ''; + } + else + { + sResult += ''; + } + + if (Enums.EmailType.Facebook === this.type()) + { + sResult += '' + (0 < this.name.length ? this.name : this.email); + sResult += ''; + } + else + { + sResult += '' + (0 < this.name.length ? this.email + ' (' + this.name + ')' : this.email); + } + + return sResult + ''; +}; + +/** + * @param {Object} oContainer + * @return {string|null} + */ +EmailModel.prototype.select2Selection = function (oContainer) +{ + var sResult = ''; + if (Enums.EmailType.Facebook === this.type()) + { + sResult = 0 < this.name.length ? this.name : this.email; + if ('' !== sResult) + { + $('').text(sResult).appendTo(oContainer); + oContainer.append(''); + return null; + } + } + else + { + sResult = 0 < this.name.length ? this.name + ' (' + this.email + ')' : this.email; + } + + return sResult; +}; + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsDomainViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsDomain'); + + this.edit = ko.observable(false); + this.saving = ko.observable(false); + this.savingError = ko.observable(''); + this.whiteListPage = ko.observable(false); + + this.testing = ko.observable(false); + this.testingDone = ko.observable(false); + this.testingImapError = ko.observable(false); + this.testingSmtpError = ko.observable(false); + + this.imapServerFocus = ko.observable(false); + this.smtpServerFocus = ko.observable(false); + + this.name = ko.observable(''); + this.imapServer = ko.observable(''); + this.imapPort = ko.observable(Consts.Values.ImapDefaulPort); + this.imapSecure = ko.observable(Enums.ServerSecure.None); + this.imapShortLogin = ko.observable(false); + this.smtpServer = ko.observable(''); + this.smtpPort = ko.observable(Consts.Values.SmtpDefaulPort); + this.smtpSecure = ko.observable(Enums.ServerSecure.None); + this.smtpShortLogin = ko.observable(false); + this.smtpAuth = ko.observable(true); + this.whiteList = ko.observable(''); + + this.imapServerFocus.subscribe(function (bValue) { + if (bValue && '' !== this.name() && '' === this.imapServer()) + { + this.imapServer(this.name()); + } + }, this); + + this.smtpServerFocus.subscribe(function (bValue) { + if (bValue && '' !== this.imapServer() && '' === this.smtpServer()) + { + this.smtpServer(this.imapServer()); + } + }, this); + + this.headerText = ko.computed(function () { + var sName = this.name(); + return this.edit() ? 'Edit Domain "' + sName + '"' : + 'Add Domain' + ('' === sName ? '' : ' "' + sName + '"'); + }, this); + + this.domainIsComputed = ko.computed(function () { + return '' !== this.name() && + '' !== this.imapServer() && + '' !== this.imapPort() && + '' !== this.smtpServer() && + '' !== this.smtpPort(); + }, this); + + this.canBeTested = ko.computed(function () { + return !this.testing() && this.domainIsComputed(); + }, this); + + this.canBeSaved = ko.computed(function () { + return !this.saving() && this.domainIsComputed(); + }, this); + + this.createOrAddCommand = Utils.createCommand(this, function () { + this.saving(true); + RL.remote().createOrUpdateDomain( + _.bind(this.onDomainCreateOrSaveResponse, this), + !this.edit(), + this.name(), + this.imapServer(), + this.imapPort(), + this.imapSecure(), + this.imapShortLogin(), + this.smtpServer(), + this.smtpPort(), + this.smtpSecure(), + this.smtpShortLogin(), + this.smtpAuth(), + this.whiteList() + ); + }, this.canBeSaved); + + this.testConnectionCommand = Utils.createCommand(this, function () { + this.whiteListPage(false); + this.testingDone(false); + this.testingImapError(false); + this.testingSmtpError(false); + this.testing(true); + RL.remote().testConnectionForDomain( + _.bind(this.onTestConnectionResponse, this), + this.imapServer(), + this.imapPort(), + this.imapSecure(), + this.smtpServer(), + this.smtpPort(), + this.smtpSecure(), + this.smtpAuth() + ); + }, this.canBeTested); + + this.whiteListCommand = Utils.createCommand(this, function () { + this.whiteListPage(!this.whiteListPage()); + }); +} + +Utils.extendAsViewModel('PopupsDomainViewModel', PopupsDomainViewModel); + +PopupsDomainViewModel.prototype.onTestConnectionResponse = function (sResult, oData) +{ + this.testing(false); + if (Enums.StorageResultType.Success === sResult && oData.Result) + { + this.testingDone(true); + this.testingImapError(false === oData.Result.Imap); + this.testingSmtpError(false === oData.Result.Smtp); + } + else + { + this.testingImapError(true); + this.testingSmtpError(true); + } +}; + +PopupsDomainViewModel.prototype.onDomainCreateOrSaveResponse = function (sResult, oData) +{ + this.saving(false); + if (Enums.StorageResultType.Success === sResult && oData) + { + if (oData.Result) + { + RL.reloadDomainList(); + this.closeCommand(); + } + else if (Enums.Notification.DomainAlreadyExists === oData.ErrorCode) + { + this.savingError('Domain already exists'); + } + } + else + { + this.savingError('Unknown error'); + } +}; + +PopupsDomainViewModel.prototype.onHide = function () +{ + this.whiteListPage(false); +}; + +PopupsDomainViewModel.prototype.onShow = function (oDomain) +{ + this.saving(false); + this.whiteListPage(false); + + this.testing(false); + this.testingDone(false); + this.testingImapError(false); + this.testingSmtpError(false); + + this.clearForm(); + if (oDomain) + { + this.edit(true); + + this.name(Utils.trim(oDomain.Name)); + this.imapServer(Utils.trim(oDomain.IncHost)); + this.imapPort(Utils.pInt(oDomain.IncPort)); + this.imapSecure(Utils.trim(oDomain.IncSecure)); + this.imapShortLogin(!!oDomain.IncShortLogin); + this.smtpServer(Utils.trim(oDomain.OutHost)); + this.smtpPort(Utils.pInt(oDomain.OutPort)); + this.smtpSecure(Utils.trim(oDomain.OutSecure)); + this.smtpShortLogin(!!oDomain.OutShortLogin); + this.smtpAuth(!!oDomain.OutAuth); + this.whiteList(Utils.trim(oDomain.WhiteList)); + } +}; + +PopupsDomainViewModel.prototype.clearForm = function () +{ + this.edit(false); + this.whiteListPage(false); + + this.savingError(''); + + this.name(''); + this.imapServer(''); + this.imapPort(Consts.Values.ImapDefaulPort); + this.imapSecure(Enums.ServerSecure.None); + this.imapShortLogin(false); + this.smtpServer(''); + this.smtpPort(Consts.Values.SmtpDefaulPort); + this.smtpSecure(Enums.ServerSecure.None); + this.smtpShortLogin(false); + this.smtpAuth(true); + this.whiteList(''); +}; + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsPluginViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsPlugin'); + + var self = this; + + this.onPluginSettingsUpdateResponse = _.bind(this.onPluginSettingsUpdateResponse, this); + + this.saveError = ko.observable(''); + + this.name = ko.observable(''); + this.readme = ko.observable(''); + + this.configures = ko.observableArray([]); + + this.hasReadme = ko.computed(function () { + return '' !== this.readme(); + }, this); + + this.hasConfiguration = ko.computed(function () { + return 0 < this.configures().length; + }, this); + + this.readmePopoverConf = { + 'placement': 'top', + 'trigger': 'hover', + 'title': 'About', + 'content': function () { + return self.readme(); + } + }; + + this.saveCommand = Utils.createCommand(this, function () { + + var oList = {}; + + oList['Name'] = this.name(); + + _.each(this.configures(), function (oItem) { + + var mValue = oItem.value(); + if (false === mValue || true === mValue) + { + mValue = mValue ? '1' : '0'; + } + + oList['_' + oItem['Name']] = mValue; + + }, this); + + this.saveError(''); + RL.remote().pluginSettingsUpdate(this.onPluginSettingsUpdateResponse, oList); + + }, this.hasConfiguration); +} + +Utils.extendAsViewModel('PopupsPluginViewModel', PopupsPluginViewModel); + +PopupsPluginViewModel.prototype.onPluginSettingsUpdateResponse = function (sResult, oData) +{ + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + this.cancelCommand(); + } + else + { + this.saveError(''); + if (oData && oData.ErrorCode) + { + this.saveError(Utils.getNotification(oData.ErrorCode)); + } + else + { + this.saveError(Utils.getNotification(Enums.Notification.CantSavePluginSettings)); + } + } +}; + +PopupsPluginViewModel.prototype.onShow = function (oPlugin) +{ + this.name(); + this.readme(); + this.configures([]); + + if (oPlugin) + { + this.name(oPlugin['Name']); + this.readme(oPlugin['Readme']); + + var aConfig = oPlugin['Config']; + if (Utils.isNonEmptyArray(aConfig)) + { + this.configures(_.map(aConfig, function (aItem) { + return { + 'value': ko.observable(aItem[0]), + 'Name': aItem[1], + 'Type': aItem[2], + 'Label': aItem[3], + 'Default': aItem[4], + 'Desc': aItem[5] + }; + })); + } + } +}; + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsActivateViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsActivate'); + + var self = this; + + this.domain = ko.observable(''); + this.key = ko.observable(''); + this.key.focus = ko.observable(false); + this.activationSuccessed = ko.observable(false); + + this.licenseTrigger = RL.data().licenseTrigger; + + this.activateProcess = ko.observable(false); + this.activateText = ko.observable(''); + this.activateText.isError = ko.observable(false); + + this.key.subscribe(function () { + this.activateText(''); + this.activateText.isError(false); + }, this); + + this.activationSuccessed.subscribe(function (bValue) { + if (bValue) + { + this.licenseTrigger(!this.licenseTrigger()); + } + }, this); + + this.activateCommand = Utils.createCommand(this, function () { + + this.activateProcess(true); + if (this.validateSubscriptionKey()) + { + RL.remote().licensingActivate(function (sResult, oData) { + + self.activateProcess(false); + if (Enums.StorageResultType.Success === sResult && oData.Result) + { + if (true === oData.Result) + { + self.activationSuccessed(true); + self.activateText('Subscription Key Activated Successfully'); + self.activateText.isError(false); + } + else + { + self.activateText(oData.Result); + self.activateText.isError(true); + self.key.focus(true); + } + } + else if (oData.ErrorCode) + { + self.activateText(Utils.getNotification(oData.ErrorCode)); + self.activateText.isError(true); + self.key.focus(true); + } + else + { + self.activateText(Utils.getNotification(Enums.Notification.UnknownError)); + self.activateText.isError(true); + self.key.focus(true); + } + + }, this.domain(), this.key()); + } + else + { + this.activateProcess(false); + this.activateText('Invalid Subscription Key'); + this.activateText.isError(true); + this.key.focus(true); + } + + }, function () { + return !this.activateProcess() && '' !== this.domain() && '' !== this.key() && !this.activationSuccessed(); + }); +} + +Utils.extendAsViewModel('PopupsActivateViewModel', PopupsActivateViewModel); + +PopupsActivateViewModel.prototype.onShow = function () +{ + this.domain(RL.settingsGet('AdminDomain')); + if (!this.activateProcess()) + { + this.key(''); + this.activateText(''); + this.activateText.isError(false); + this.activationSuccessed(false); + + this.key.focus(true); + } +}; + +/** + * @returns {boolean} + */ +PopupsActivateViewModel.prototype.validateSubscriptionKey = function () +{ + var sValue = this.key(); + return '' === sValue || !!/^RL[\d]+-[A-Z0-9\-]+Z$/.test(Utils.trim(sValue)); +}; +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function PopupsLanguagesViewModel() +{ + KnoinAbstractViewModel.call(this, 'Popups', 'PopupsLanguages'); + + this.exp = ko.observable(false); + + this.languages = ko.computed(function () { + var sCurrent = RL.data().mainLanguage(); + return _.map(RL.data().languages(), function (sLanguage) { + return { + 'key': sLanguage, + 'selected': sLanguage === sCurrent, + 'fullName': Utils.convertLangName(sLanguage) + }; + }); + }); +} + +Utils.extendAsViewModel('PopupsLanguagesViewModel', PopupsLanguagesViewModel); + +PopupsLanguagesViewModel.prototype.onShow = function () +{ +// var self = this; +// _.defer(function () { +// self.exp(true); +// }); + this.exp(true); +}; + +PopupsLanguagesViewModel.prototype.onHide = function () +{ + this.exp(false); +}; + +PopupsLanguagesViewModel.prototype.changeLanguage = function (sLang) +{ + RL.data().mainLanguage(sLang); + this.cancelCommand(); +}; + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function AdminLoginViewModel() +{ + KnoinAbstractViewModel.call(this, 'Right', 'AdminLogin'); + + this.login = ko.observable(''); + this.password = ko.observable(''); + + this.loginError = ko.observable(false); + this.passwordError = ko.observable(false); + + this.loginFocus = ko.observable(false); + + this.login.subscribe(function () { + this.loginError(false); + }, this); + + this.password.subscribe(function () { + this.passwordError(false); + }, this); + + this.submitRequest = ko.observable(false); + this.submitError = ko.observable(''); + + this.submitCommand = Utils.createCommand(this, function () { + + this.loginError('' === Utils.trim(this.login())); + this.passwordError('' === Utils.trim(this.password())); + + if (this.loginError() || this.passwordError()) + { + return false; + } + + this.submitRequest(true); + + RL.remote().adminLogin(_.bind(function (sResult, oData) { + + if (Enums.StorageResultType.Success === sResult && oData&& 'AdminLogin' === oData.Action) + { + if (oData.Result) + { + RL.loginAndLogoutReload(); + } + else if (oData.ErrorCode) + { + this.submitRequest(false); + this.submitError(Utils.getNotification(oData.ErrorCode)); + } + } + else + { + this.submitRequest(false); + this.submitError(Utils.getNotification(Enums.Notification.UnknownError)); + } + + }, this), this.login(), this.password()); + + return true; + + }, function () { + return !this.submitRequest(); + }); +} + +Utils.extendAsViewModel('AdminLoginViewModel', AdminLoginViewModel); + +AdminLoginViewModel.prototype.onShow = function () +{ + kn.routeOff(); + + _.delay(_.bind(function () { + this.loginFocus(true); + }, this), 100); + +}; + +AdminLoginViewModel.prototype.onHide = function () +{ + this.loginFocus(false); +}; + +/** + * @param {?} oScreen + * + * @constructor + * @extends KnoinAbstractViewModel + */ +function AdminMenuViewModel(oScreen) +{ + KnoinAbstractViewModel.call(this, 'Left', 'AdminMenu'); + + this.menu = oScreen.menu; +} + +Utils.extendAsViewModel('AdminMenuViewModel', AdminMenuViewModel); + +AdminMenuViewModel.prototype.link = function (sRoute) +{ + return '#/' + sRoute; +}; + +/** + * @constructor + * @extends KnoinAbstractViewModel + */ +function AdminPaneViewModel() +{ + KnoinAbstractViewModel.call(this, 'Right', 'AdminPane'); + + this.adminDomain = ko.observable(RL.settingsGet('AdminDomain')); + this.version = ko.observable(RL.settingsGet('Version')); +} + +Utils.extendAsViewModel('AdminPaneViewModel', AdminPaneViewModel); + +AdminPaneViewModel.prototype.logoutClick = function () +{ + RL.remote().adminLogout(function () { + RL.loginAndLogoutReload(); + }); +}; +/** + * @constructor + */ +function AdminGeneral() +{ + var oData = RL.data(); + + this.mainLanguage = oData.mainLanguage; + this.mainTheme = oData.mainTheme; + + this.language = oData.language; + this.theme = oData.theme; + + this.allowThemes = oData.allowThemes; + this.allowCustomTheme = oData.allowCustomTheme; + this.allowLanguagesOnSettings = oData.allowLanguagesOnSettings; + this.allowAdditionalAccounts = oData.allowAdditionalAccounts; + this.allowIdentities = oData.allowIdentities; + + this.title = ko.observable(RL.settingsGet('Title')); + this.loadingDesc = ko.observable(RL.settingsGet('LoadingDescription')); + + this.themesOptions = ko.computed(function () { + return _.map(oData.themes(), function (sTheme) { + return { + 'optValue': sTheme, + 'optText': Utils.convertThemeName(sTheme) + }; + }); + }); + + this.languagesOptions = ko.computed(function () { + return _.map(oData.languages(), function (sLanguage) { + return { + 'optValue': sLanguage, + 'optText': Utils.convertLangName(sLanguage) + }; + }); + }); + + this.contactsSupported = RL.settingsGet('ContactsIsSupported'); + this.contactsIsAllowed = RL.settingsGet('ContactsIsAllowed'); + this.weakPassword = !!RL.settingsGet('WeakPassword'); + + this.titleTrigger = ko.observable(Enums.SaveSettingsStep.Idle); + this.languageTrigger = ko.observable(Enums.SaveSettingsStep.Idle); + this.themeTrigger = ko.observable(Enums.SaveSettingsStep.Idle); + this.loadingDescTrigger = ko.observable(Enums.SaveSettingsStep.Idle); +} + +Utils.addSettingsViewModel(AdminGeneral, 'AdminSettingsGeneral', 'General', 'general', true); + +AdminGeneral.prototype.onBuild = function () +{ + var self = this; + _.delay(function () { + + var + f1 = Utils.settingsSaveHelperSimpleFunction(self.titleTrigger, self), + f2 = Utils.settingsSaveHelperSimpleFunction(self.languageTrigger, self), + f3 = Utils.settingsSaveHelperSimpleFunction(self.themeTrigger, self), + f4 = Utils.settingsSaveHelperSimpleFunction(self.loadingDescTrigger, self) + ; + + self.title.subscribe(function (sValue) { + RL.remote().saveAdminConfig(f1, { + 'Title': Utils.trim(sValue) + }); + }); + + self.loadingDesc.subscribe(function (sValue) { + RL.remote().saveAdminConfig(f4, { + 'LoadingDescription': Utils.trim(sValue) + }); + }); + + self.language.subscribe(function (sValue) { + RL.remote().saveAdminConfig(f2, { + 'Language': Utils.trim(sValue) + }); + }); + + self.theme.subscribe(function (sValue) { + RL.remote().saveAdminConfig(f3, { + 'Theme': Utils.trim(sValue) + }); + }); + + self.allowCustomTheme.subscribe(function (bValue) { + RL.remote().saveAdminConfig(null, { + 'AllowCustomTheme': bValue ? '1' : '0' + }); + }); + + self.allowAdditionalAccounts.subscribe(function (bValue) { + RL.remote().saveAdminConfig(null, { + 'AllowAdditionalAccounts': bValue ? '1' : '0' + }); + }); + + self.allowIdentities.subscribe(function (bValue) { + RL.remote().saveAdminConfig(null, { + 'AllowIdentities': bValue ? '1' : '0' + }); + }); + + self.allowThemes.subscribe(function (bValue) { + RL.remote().saveAdminConfig(null, { + 'AllowThemes': bValue ? '1' : '0' + }); + }); + + self.allowLanguagesOnSettings.subscribe(function (bValue) { + RL.remote().saveAdminConfig(null, { + 'AllowLanguagesOnSettings': bValue ? '1' : '0' + }); + }); + + }, 50); +}; + +/** + * @constructor + */ +function AdminLogin() +{ + var oData = RL.data(); + + this.allowCustomLogin = oData.allowCustomLogin; + this.determineUserLanguage = oData.determineUserLanguage; + + this.defaultDomain = ko.observable(RL.settingsGet('LoginDefaultDomain')); + + this.allowLanguagesOnLogin = oData.allowLanguagesOnLogin; + this.defaultDomainTrigger = ko.observable(Enums.SaveSettingsStep.Idle); +} + +Utils.addSettingsViewModel(AdminLogin, 'AdminSettingsLogin', 'Login', 'login'); + +AdminLogin.prototype.onBuild = function () +{ + var self = this; + _.delay(function () { + + var f1 = Utils.settingsSaveHelperSimpleFunction(self.defaultDomainTrigger, self); + + self.determineUserLanguage.subscribe(function (bValue) { + RL.remote().saveAdminConfig(null, { + 'DetermineUserLanguage': bValue ? '1' : '0' + }); + }); + + self.allowCustomLogin.subscribe(function (bValue) { + RL.remote().saveAdminConfig(null, { + 'AllowCustomLogin': bValue ? '1' : '0' + }); + }); + + self.allowLanguagesOnLogin.subscribe(function (bValue) { + RL.remote().saveAdminConfig(null, { + 'AllowLanguagesOnLogin': bValue ? '1' : '0' + }); + }); + + self.defaultDomain.subscribe(function (sValue) { + RL.remote().saveAdminConfig(f1, { + 'LoginDefaultDomain': Utils.trim(sValue) + }); + }); + + }, 50); +}; + +/** + * @constructor + */ +function AdminDomains() +{ + var oData = RL.data(); + + this.domains = oData.domains; + this.domainsLoading = oData.domainsLoading; + + this.iDomainForDeletionTimeout = 0; + + this.visibility = ko.computed(function () { + return oData.domainsLoading() ? 'visible' : 'hidden'; + }, this); + + this.domainForDeletion = ko.observable(null).extend({'toggleSubscribe': [this, + function (oPrev) { + if (oPrev) + { + oPrev.deleteAccess(false); + } + }, function (oNext) { + if (oNext) + { + oNext.deleteAccess(true); + this.startDomainForDeletionTimeout(); + } + } + ]}); +} + +Utils.addSettingsViewModel(AdminDomains, 'AdminSettingsDomains', 'Domains', 'domains'); + +AdminDomains.prototype.startDomainForDeletionTimeout = function () +{ + var self = this; + window.clearInterval(this.iDomainForDeletionTimeout); + this.iDomainForDeletionTimeout = window.setTimeout(function () { + self.domainForDeletion(null); + }, 1000 * 3); +}; + +AdminDomains.prototype.createDomain = function () +{ + kn.showScreenPopup(PopupsDomainViewModel); +}; + +AdminDomains.prototype.deleteDomain = function (oDomain) +{ + this.domains.remove(oDomain); + RL.remote().domainDelete(_.bind(this.onDomainListChangeRequest, this), oDomain.name); +}; + +AdminDomains.prototype.disableDomain = function (oDomain) +{ + oDomain.disabled(!oDomain.disabled()); + RL.remote().domainDisable(_.bind(this.onDomainListChangeRequest, this), oDomain.name, oDomain.disabled()); +}; + +AdminDomains.prototype.onBuild = function (oDom) +{ + var self = this; + oDom + .on('click', '.b-admin-domains-list-table .e-item .e-action', function () { + var oDomainItem = ko.dataFor(this); + if (oDomainItem) + { + RL.remote().domain(_.bind(self.onDomainLoadRequest, self), oDomainItem.name); + } + }) + ; + + RL.reloadDomainList(); +}; + +AdminDomains.prototype.onDomainLoadRequest = function (sResult, oData) +{ + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + kn.showScreenPopup(PopupsDomainViewModel, [oData.Result]); + } +}; + +AdminDomains.prototype.onDomainListChangeRequest = function () +{ + RL.reloadDomainList(); +}; + +/** + * @constructor + */ +function AdminSecurity() +{ + this.csrfProtection = ko.observable(!!RL.settingsGet('UseTokenProtection')); + this.usageStatistics = ko.observable(!!RL.settingsGet('UsageStatistics')); + + this.adminLogin = ko.observable(RL.settingsGet('AdminLogin')); + this.adminPassword = ko.observable(''); + this.adminPasswordNew = ko.observable(''); + + this.adminPasswordUpdateError = ko.observable(false); + this.adminPasswordUpdateSuccess = ko.observable(false); + + this.adminPassword.subscribe(function () { + this.adminPasswordUpdateError(false); + this.adminPasswordUpdateSuccess(false); + }, this); + + this.adminPasswordNew.subscribe(function () { + this.adminPasswordUpdateError(false); + this.adminPasswordUpdateSuccess(false); + }, this); + + this.onNewAdminPasswordResponse = _.bind(this.onNewAdminPasswordResponse, this); + + this.saveNewAdminPasswordCommand = Utils.createCommand(this, function () { + + this.adminPasswordUpdateError(false); + this.adminPasswordUpdateSuccess(false); + + RL.remote().saveNewAdminPassword(this.onNewAdminPasswordResponse, { + 'Password': this.adminPassword(), + 'NewPassword': this.adminPasswordNew() + }); + + }, function () { + return '' !== this.adminPassword() && '' !== this.adminPasswordNew(); + }); +} + +Utils.addSettingsViewModel(AdminSecurity, 'AdminSettingsSecurity', 'Security', 'security'); + +AdminSecurity.prototype.onNewAdminPasswordResponse = function (sResult, oData) +{ + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + this.adminPassword(''); + this.adminPasswordNew(''); + + this.adminPasswordUpdateSuccess(true); + } + else + { + this.adminPasswordUpdateError(true); + } +}; + +AdminSecurity.prototype.onBuild = function () +{ + this.csrfProtection.subscribe(function (bValue) { + RL.remote().saveAdminConfig(Utils.emptyFunction, { + 'TokenProtection': bValue ? '1' : '0' + }); + }); + + this.usageStatistics.subscribe(function (bValue) { + RL.remote().saveAdminConfig(Utils.emptyFunction, { + 'UsageStatistics': bValue ? '1' : '0' + }); + }); +}; + +AdminSecurity.prototype.onHide = function () +{ + this.adminPassword(''); + this.adminPasswordNew(''); +}; + +/** + * @return {string} + */ +AdminSecurity.prototype.phpInfoLink = function () +{ + return RL.link().phpInfo(); +}; + +/** + * @constructor + */ +function AdminSocial() +{ + var oData = RL.data(); + + this.googleEnable = oData.googleEnable; + this.googleClientID = oData.googleClientID; + this.googleClientSecret = oData.googleClientSecret; + this.googleTrigger1 = ko.observable(Enums.SaveSettingsStep.Idle); + this.googleTrigger2 = ko.observable(Enums.SaveSettingsStep.Idle); + + this.facebookEnable = oData.facebookEnable; + this.facebookAppID = oData.facebookAppID; + this.facebookAppSecret = oData.facebookAppSecret; + this.facebookTrigger1 = ko.observable(Enums.SaveSettingsStep.Idle); + this.facebookTrigger2 = ko.observable(Enums.SaveSettingsStep.Idle); + + this.twitterEnable = oData.twitterEnable; + this.twitterConsumerKey = oData.twitterConsumerKey; + this.twitterConsumerSecret = oData.twitterConsumerSecret; + this.twitterTrigger1 = ko.observable(Enums.SaveSettingsStep.Idle); + this.twitterTrigger2 = ko.observable(Enums.SaveSettingsStep.Idle); + + this.dropboxEnable = oData.dropboxEnable; + this.dropboxApiKey = oData.dropboxApiKey; + this.dropboxTrigger1 = ko.observable(Enums.SaveSettingsStep.Idle); +} + +Utils.addSettingsViewModel(AdminSocial, 'AdminSettingsSocial', 'Social', 'social'); + +AdminSocial.prototype.onBuild = function () +{ + var self = this; + _.delay(function () { + + var + f1 = Utils.settingsSaveHelperSimpleFunction(self.facebookTrigger1, self), + f2 = Utils.settingsSaveHelperSimpleFunction(self.facebookTrigger2, self), + f3 = Utils.settingsSaveHelperSimpleFunction(self.twitterTrigger1, self), + f4 = Utils.settingsSaveHelperSimpleFunction(self.twitterTrigger2, self), + f5 = Utils.settingsSaveHelperSimpleFunction(self.googleTrigger1, self), + f6 = Utils.settingsSaveHelperSimpleFunction(self.googleTrigger2, self), + f7 = Utils.settingsSaveHelperSimpleFunction(self.dropboxTrigger1, self) + ; + + self.facebookEnable.subscribe(function (bValue) { + RL.remote().saveAdminConfig(Utils.emptyFunction, { + 'FacebookEnable': bValue ? '1' : '0' + }); + }); + + self.facebookAppID.subscribe(function (sValue) { + RL.remote().saveAdminConfig(f1, { + 'FacebookAppID': Utils.trim(sValue) + }); + }); + + self.facebookAppSecret.subscribe(function (sValue) { + RL.remote().saveAdminConfig(f2, { + 'FacebookAppSecret': Utils.trim(sValue) + }); + }); + + self.twitterEnable.subscribe(function (bValue) { + RL.remote().saveAdminConfig(Utils.emptyFunction, { + 'TwitterEnable': bValue ? '1' : '0' + }); + }); + + self.twitterConsumerKey.subscribe(function (sValue) { + RL.remote().saveAdminConfig(f3, { + 'TwitterConsumerKey': Utils.trim(sValue) + }); + }); + + self.twitterConsumerSecret.subscribe(function (sValue) { + RL.remote().saveAdminConfig(f4, { + 'TwitterConsumerSecret': Utils.trim(sValue) + }); + }); + + self.googleEnable.subscribe(function (bValue) { + RL.remote().saveAdminConfig(Utils.emptyFunction, { + 'GoogleEnable': bValue ? '1' : '0' + }); + }); + + self.googleClientID.subscribe(function (sValue) { + RL.remote().saveAdminConfig(f5, { + 'GoogleClientID': Utils.trim(sValue) + }); + }); + + self.googleClientSecret.subscribe(function (sValue) { + RL.remote().saveAdminConfig(f6, { + 'GoogleClientSecret': Utils.trim(sValue) + }); + }); + + self.dropboxEnable.subscribe(function (bValue) { + RL.remote().saveAdminConfig(Utils.emptyFunction, { + 'DropboxEnable': bValue ? '1' : '0' + }); + }); + + self.dropboxApiKey.subscribe(function (sValue) { + RL.remote().saveAdminConfig(f7, { + 'DropboxApiKey': Utils.trim(sValue) + }); + }); + + }, 50); +}; + +/** + * @constructor + */ +function AdminPlugins() +{ + var oData = RL.data(); + + this.enabledPlugins = ko.observable(!!RL.settingsGet('EnabledPlugins')); + + this.pluginsError = ko.observable(''); + + this.plugins = oData.plugins; + this.pluginsLoading = oData.pluginsLoading; + + this.visibility = ko.computed(function () { + return oData.pluginsLoading() ? 'visible' : 'hidden'; + }, this); + + this.onPluginLoadRequest = _.bind(this.onPluginLoadRequest, this); + this.onPluginDisableRequest = _.bind(this.onPluginDisableRequest, this); +} + +Utils.addSettingsViewModel(AdminPlugins, 'AdminSettingsPlugins', 'Plugins', 'plugins'); + +AdminPlugins.prototype.disablePlugin = function (oPlugin) +{ + oPlugin.disabled(!oPlugin.disabled()); + RL.remote().pluginDisable(this.onPluginDisableRequest, oPlugin.name, oPlugin.disabled()); +}; + +AdminPlugins.prototype.configurePlugin = function (oPlugin) +{ + RL.remote().plugin(this.onPluginLoadRequest, oPlugin.name); +}; + +AdminPlugins.prototype.onBuild = function () +{ + this.enabledPlugins.subscribe(function (bValue) { + RL.remote().saveAdminConfig(Utils.emptyFunction, { + 'EnabledPlugins': bValue ? '1' : '0' + }); + }); +}; + +AdminPlugins.prototype.onShow = function () +{ + this.pluginsError(''); + RL.reloadPluginList(); +}; + +AdminPlugins.prototype.onPluginLoadRequest = function (sResult, oData) +{ + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + kn.showScreenPopup(PopupsPluginViewModel, [oData.Result]); + } +}; + +AdminPlugins.prototype.onPluginDisableRequest = function (sResult, oData) +{ + if (Enums.StorageResultType.Success === sResult && oData) + { + if (!oData.Result && oData.ErrorCode) + { + if (Enums.Notification.UnsupportedPluginPackage === oData.ErrorCode && oData.ErrorMessage && '' !== oData.ErrorMessage) + { + this.pluginsError(oData.ErrorMessage); + } + else + { + this.pluginsError(Utils.getNotification(oData.ErrorCode)); + } + } + } + + RL.reloadPluginList(); +}; + +/** + * @constructor + */ +function AdminPackages() +{ + var oData = RL.data(); + + this.packagesError = ko.observable(''); + + this.packages = oData.packages; + this.packagesLoading = oData.packagesLoading; + this.packagesReal = oData.packagesReal; + this.packagesMainUpdatable = oData.packagesMainUpdatable; + + this.packagesCurrent = ko.computed(function () { + return _.filter(this.packages(), function (oItem) { + return oItem && '' !== oItem['installed'] && !oItem['compare']; + }); + }, this); + + this.packagesAvailableForUpdate = ko.computed(function () { + return _.filter(this.packages(), function (oItem) { + return oItem && '' !== oItem['installed'] && !!oItem['compare']; + }); + }, this); + + this.packagesAvailableForInstallation = ko.computed(function () { + return _.filter(this.packages(), function (oItem) { + return oItem && '' === oItem['installed']; + }); + }, this); + + this.visibility = ko.computed(function () { + return oData.packagesLoading() ? 'visible' : 'hidden'; + }, this); +} + +Utils.addSettingsViewModel(AdminPackages, 'AdminSettingsPackages', 'Packages', 'packages'); + +AdminPackages.prototype.onShow = function () +{ + this.packagesError(''); +}; + +AdminPackages.prototype.onBuild = function () +{ + RL.reloadPackagesList(); +}; + +AdminPackages.prototype.requestHelper = function (oPackage, bInstall) +{ + var self = this; + return function (sResult, oData) { + + if (Enums.StorageResultType.Success !== sResult || !oData || !oData.Result) + { + if (oData && oData.ErrorCode) + { + self.packagesError(Utils.getNotification(oData.ErrorCode)); + } + else + { + self.packagesError(Utils.getNotification( + bInstall ? Enums.Notification.CantInstallPackage : Enums.Notification.CantDeletePackage)); + } + } + + _.each(RL.data().packages(), function (oItem) { + if (oItem && oPackage && oItem['loading']() && oPackage['file'] === oItem['file']) + { + oPackage['loading'](false); + oItem['loading'](false); + } + }); + + if (Enums.StorageResultType.Success === sResult && oData && oData.Result && oData.Result['Reload']) + { + window.location.reload(); + } + else + { + RL.reloadPackagesList(); + } + }; +}; + +AdminPackages.prototype.deletePackage = function (oPackage) +{ + if (oPackage) + { + oPackage['loading'](true); + RL.remote().packageDelete(this.requestHelper(oPackage, false), oPackage); + } +}; + +AdminPackages.prototype.installPackage = function (oPackage) +{ + if (oPackage) + { + oPackage['loading'](true); + RL.remote().packageInstall(this.requestHelper(oPackage, true), oPackage); + } +}; + +/** + * @constructor + */ +function AdminLicensing() +{ + this.licensing = RL.data().licensing; + this.licensingProcess = RL.data().licensingProcess; + this.licenseValid = RL.data().licenseValid; + this.licenseExpired = RL.data().licenseExpired; + this.licenseError = RL.data().licenseError; + this.licenseTrigger = RL.data().licenseTrigger; + + this.adminDomain = ko.observable(''); + this.subscriptionEnabled = ko.observable(!!RL.settingsGet('SubscriptionEnabled')); + + this.licenseTrigger.subscribe(function () { + if (this.subscriptionEnabled()) + { + RL.reloadLicensing(true); + } + }, this); +} + +Utils.addSettingsViewModel(AdminLicensing, 'AdminSettingsLicensing', 'Licensing', 'licensing'); + +AdminLicensing.prototype.onBuild = function () +{ + if (this.subscriptionEnabled()) + { + RL.reloadLicensing(false); + } +}; + +AdminLicensing.prototype.onShow = function () +{ + this.adminDomain(RL.settingsGet('AdminDomain')); +}; + +AdminLicensing.prototype.showActivationForm = function () +{ + kn.showScreenPopup(PopupsActivateViewModel); +}; + +/** + * @returns {string} + */ +AdminLicensing.prototype.licenseExpiredMomentValue = function () +{ + var oDate = moment.unix(this.licenseExpired()); + return oDate.format('LL') + ' (' + oDate.from(moment()) + ')'; +}; +/** + * @constructor + */ +function AbstractData() +{ + Utils.initDataConstructorBySettings(this); +} + +AbstractData.prototype.populateDataOnStart = function() +{ + var + aLanguages = RL.settingsGet('Languages'), + aThemes = RL.settingsGet('Themes') + ; + + if (Utils.isArray(aLanguages)) + { + this.languages(aLanguages); + } + + if (Utils.isArray(aThemes)) + { + this.themes(aThemes); + } + + this.mainLanguage(RL.settingsGet('Language')); + this.mainTheme(RL.settingsGet('Theme')); + + this.allowCustomTheme(!!RL.settingsGet('AllowCustomTheme')); + this.allowAdditionalAccounts(!!RL.settingsGet('AllowAdditionalAccounts')); + this.allowIdentities(!!RL.settingsGet('AllowIdentities')); + this.determineUserLanguage(!!RL.settingsGet('DetermineUserLanguage')); + + this.allowThemes(!!RL.settingsGet('AllowThemes')); + this.allowCustomLogin(!!RL.settingsGet('AllowCustomLogin')); + this.allowLanguagesOnLogin(!!RL.settingsGet('AllowLanguagesOnLogin')); + this.allowLanguagesOnSettings(!!RL.settingsGet('AllowLanguagesOnSettings')); + + this.editorDefaultType(RL.settingsGet('EditorDefaultType')); + this.showImages(!!RL.settingsGet('ShowImages')); + this.interfaceAnimation(RL.settingsGet('InterfaceAnimation')); + + this.mainMessagesPerPage(RL.settingsGet('MPP')); + + this.desktopNotifications(!!RL.settingsGet('DesktopNotifications')); + this.useThreads(!!RL.settingsGet('UseThreads')); + this.replySameFolder(!!RL.settingsGet('ReplySameFolder')); + this.usePreviewPane(!!RL.settingsGet('UsePreviewPane')); + this.useCheckboxesInList(!!RL.settingsGet('UseCheckboxesInList')); + + this.facebookEnable(!!RL.settingsGet('AllowFacebookSocial')); + this.facebookAppID(RL.settingsGet('FacebookAppID')); + this.facebookAppSecret(RL.settingsGet('FacebookAppSecret')); + + this.twitterEnable(!!RL.settingsGet('AllowTwitterSocial')); + this.twitterConsumerKey(RL.settingsGet('TwitterConsumerKey')); + this.twitterConsumerSecret(RL.settingsGet('TwitterConsumerSecret')); + + this.googleEnable(!!RL.settingsGet('AllowGoogleSocial')); + this.googleClientID(RL.settingsGet('GoogleClientID')); + this.googleClientSecret(RL.settingsGet('GoogleClientSecret')); + + this.dropboxEnable(!!RL.settingsGet('AllowDropboxSocial')); + this.dropboxApiKey(RL.settingsGet('DropboxApiKey')); + + this.contactsIsSupported(!!RL.settingsGet('ContactsIsSupported')); + this.contactsIsAllowed(!!RL.settingsGet('ContactsIsAllowed')); +}; + +/** + * @constructor + * @extends AbstractData + */ +function AdminDataStorage() +{ + AbstractData.call(this); + + this.domainsLoading = ko.observable(false).extend({'throttle': 100}); + this.domains = ko.observableArray([]); + + this.pluginsLoading = ko.observable(false).extend({'throttle': 100}); + this.plugins = ko.observableArray([]); + + this.packagesReal = ko.observable(true); + this.packagesMainUpdatable = ko.observable(true); + this.packagesLoading = ko.observable(false).extend({'throttle': 100}); + this.packages = ko.observableArray([]); + + this.licensing = ko.observable(false); + this.licensingProcess = ko.observable(false); + this.licenseValid = ko.observable(false); + this.licenseExpired = ko.observable(0); + this.licenseError = ko.observable(''); + + this.licenseTrigger = ko.observable(false); +} + +_.extend(AdminDataStorage.prototype, AbstractData.prototype); + +AdminDataStorage.prototype.populateDataOnStart = function() +{ + AbstractData.prototype.populateDataOnStart.call(this); +}; +/** + * @constructor + */ +function AbstractAjaxRemoteStorage() +{ + this.oRequests = {}; +} + +AbstractAjaxRemoteStorage.prototype.oRequests = {}; + +/** + * @param {?Function} fCallback + * @param {string} sRequestAction + * @param {string} sType + * @param {?AjaxJsonDefaultResponse} oData + * @param {boolean} bCached + * @param {*=} oRequestParameters + */ +AbstractAjaxRemoteStorage.prototype.defaultResponse = function (fCallback, sRequestAction, sType, oData, bCached, oRequestParameters) +{ + var + fCall = function () { + if (Enums.StorageResultType.Success !== sType && Globals.bUnload) + { + sType = Enums.StorageResultType.Unload; + } + + if (Enums.StorageResultType.Success === sType && oData && !oData.Result) + { + if (oData && -1 < Utils.inArray(oData.ErrorCode, [ + Enums.Notification.AuthError, Enums.Notification.AccessError, + Enums.Notification.ConnectionError, Enums.Notification.DomainNotAllowed, Enums.Notification.AccountNotAllowed, + Enums.Notification.MailServerError, Enums.Notification.UnknownNotification, Enums.Notification.UnknownError + ])) + { + Globals.iAjaxErrorCount++; + } + + if (oData && Enums.Notification.InvalidToken === oData.ErrorCode) + { + Globals.iTokenErrorCount++; + } + + if (10 < Globals.iTokenErrorCount) + { + RL.loginAndLogoutReload(true); + } + + if (oData.Logout || 7 < Globals.iAjaxErrorCount) + { + if (window.__rlah_clear) + { + window.__rlah_clear(); + } + + RL.loginAndLogoutReload(true); + } + } + else if (Enums.StorageResultType.Success === sType && oData && oData.Result) + { + Globals.iAjaxErrorCount = 0; + Globals.iTokenErrorCount = 0; + } + + if (fCallback) + { + Plugins.runHook('ajax-default-response', [sRequestAction, Enums.StorageResultType.Success === sType ? oData : null, sType, bCached, oRequestParameters]); + + fCallback( + sType, + Enums.StorageResultType.Success === sType ? oData : null, + bCached, + sRequestAction, + oRequestParameters + ); + } + } + ; + + switch (sType) + { + case 'success': + sType = Enums.StorageResultType.Success; + break; + case 'abort': + sType = Enums.StorageResultType.Abort; + break; + default: + sType = Enums.StorageResultType.Error; + break; + } + + if (Enums.StorageResultType.Error === sType) + { + _.delay(fCall, 300); + } + else + { + fCall(); + } +}; + +/** + * @param {?Function} fResultCallback + * @param {Object} oParameters + * @param {?number=} iTimeOut = 20000 + * @param {string=} sGetAdd = '' + * @param {Array=} aAbortActions = [] + * @return {jQuery.jqXHR} + */ +AbstractAjaxRemoteStorage.prototype.ajaxRequest = function (fResultCallback, oParameters, iTimeOut, sGetAdd, aAbortActions) +{ + var + self = this, + bPost = '' === sGetAdd, + oHeaders = {}, + iStart = (new window.Date()).getTime(), + oDefAjax = null, + sAction = '' + ; + + oParameters = oParameters || {}; + iTimeOut = Utils.isNormal(iTimeOut) ? iTimeOut : 20000; + sGetAdd = Utils.isUnd(sGetAdd) ? '' : Utils.pString(sGetAdd); + aAbortActions = Utils.isArray(aAbortActions) ? aAbortActions : []; + + sAction = oParameters.Action || ''; + + if (sAction && 0 < aAbortActions.length) + { + _.each(aAbortActions, function (sActionToAbort) { + if (self.oRequests[sActionToAbort]) + { + self.oRequests[sActionToAbort].__aborted = true; + if (self.oRequests[sActionToAbort].abort) + { + self.oRequests[sActionToAbort].abort(); + } + self.oRequests[sActionToAbort] = null; + } + }); + } + + if (bPost) + { + oParameters['XToken'] = RL.settingsGet('Token'); + } + + oDefAjax = $.ajax({ + 'type': bPost ? 'POST' : 'GET', + 'url': RL.link().ajax(sGetAdd) , + 'async': true, + 'dataType': 'json', + 'data': bPost ? oParameters : {}, + 'headers': oHeaders, + 'timeout': iTimeOut, + 'global': true + }); + + oDefAjax.always(function (oData, sType) { + + var bCached = false; + if (oData && oData['Time']) + { + bCached = Utils.pInt(oData['Time']) > (new window.Date()).getTime() - iStart; + } + + if (sAction && self.oRequests[sAction]) + { + if (self.oRequests[sAction].__aborted) + { + sType = 'abort'; + } + + self.oRequests[sAction] = null; + } + + self.defaultResponse(fResultCallback, sAction, sType, oData, bCached, oParameters); + }); + + if (sAction && 0 < aAbortActions.length && -1 < Utils.inArray(sAction, aAbortActions)) + { + if (this.oRequests[sAction]) + { + this.oRequests[sAction].__aborted = true; + if (this.oRequests[sAction].abort) + { + this.oRequests[sAction].abort(); + } + this.oRequests[sAction] = null; + } + + this.oRequests[sAction] = oDefAjax; + } + + return oDefAjax; +}; + +/** + * @param {?Function} fCallback + * @param {string} sAction + * @param {Object=} oParameters + * @param {?number=} iTimeout + * @param {string=} sGetAdd = '' + * @param {Array=} aAbortActions = [] + */ +AbstractAjaxRemoteStorage.prototype.defaultRequest = function (fCallback, sAction, oParameters, iTimeout, sGetAdd, aAbortActions) +{ + oParameters = oParameters || {}; + oParameters.Action = sAction; + + sGetAdd = Utils.pString(sGetAdd); + + Plugins.runHook('ajax-default-request', [sAction, oParameters, sGetAdd]); + + this.ajaxRequest(fCallback, oParameters, + Utils.isUnd(iTimeout) ? Consts.Defaults.DefaultAjaxTimeout : Utils.pInt(iTimeout), sGetAdd, aAbortActions); +}; + +/** + * @param {?Function} fCallback + */ +AbstractAjaxRemoteStorage.prototype.noop = function (fCallback) +{ + this.defaultRequest(fCallback, 'Noop'); +}; + +/** + * @param {?Function} fCallback + * @param {string} sMessage + * @param {string} sFileName + * @param {number} iLineNo + * @param {string} sLocation + * @param {string} sHtmlCapa + * @param {number} iTime + */ +AbstractAjaxRemoteStorage.prototype.jsError = function (fCallback, sMessage, sFileName, iLineNo, sLocation, sHtmlCapa, iTime) +{ + this.defaultRequest(fCallback, 'JsError', { + 'Message': sMessage, + 'FileName': sFileName, + 'LineNo': iLineNo, + 'Location': sLocation, + 'HtmlCapa': sHtmlCapa, + 'TimeOnPage': iTime + }); +}; + +/** + * @constructor + * @extends AbstractAjaxRemoteStorage + */ +function AdminAjaxRemoteStorage() +{ + AbstractAjaxRemoteStorage.call(this); + + this.oRequests = {}; +} + +_.extend(AdminAjaxRemoteStorage.prototype, AbstractAjaxRemoteStorage.prototype); + +/** + * @param {?Function} fCallback + * @param {string} sLogin + * @param {string} sPassword + */ +AdminAjaxRemoteStorage.prototype.adminLogin = function (fCallback, sLogin, sPassword) +{ + this.defaultRequest(fCallback, 'AdminLogin', { + 'Login': sLogin, + 'Password': sPassword + }); +}; + +/** + * @param {?Function} fCallback + */ +AdminAjaxRemoteStorage.prototype.adminLogout = function (fCallback) +{ + this.defaultRequest(fCallback, 'AdminLogout'); +}; + +/** + * @param {?Function} fCallback + * @param {?} oData + */ +AdminAjaxRemoteStorage.prototype.saveAdminConfig = function (fCallback, oData) +{ + this.defaultRequest(fCallback, 'AdminSettingsUpdate', oData); +}; + +/** + * @param {?Function} fCallback + */ +AdminAjaxRemoteStorage.prototype.domainList = function (fCallback) +{ + this.defaultRequest(fCallback, 'AdminDomainList'); +}; + +/** + * @param {?Function} fCallback + */ +AdminAjaxRemoteStorage.prototype.pluginList = function (fCallback) +{ + this.defaultRequest(fCallback, 'AdminPluginList'); +}; + +/** + * @param {?Function} fCallback + */ +AdminAjaxRemoteStorage.prototype.packagesList = function (fCallback) +{ + this.defaultRequest(fCallback, 'AdminPackagesList'); +}; + +/** + * @param {?Function} fCallback + * @param {Object} oPackage + */ +AdminAjaxRemoteStorage.prototype.packageInstall = function (fCallback, oPackage) +{ + this.defaultRequest(fCallback, 'AdminPackageInstall', { + 'Id': oPackage.id, + 'Type': oPackage.type, + 'File': oPackage.file + }, 60000); +}; + +/** + * @param {?Function} fCallback + * @param {Object} oPackage + */ +AdminAjaxRemoteStorage.prototype.packageDelete = function (fCallback, oPackage) +{ + this.defaultRequest(fCallback, 'AdminPackageDelete', { + 'Id': oPackage.id + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sName + */ +AdminAjaxRemoteStorage.prototype.domain = function (fCallback, sName) +{ + this.defaultRequest(fCallback, 'AdminDomainLoad', { + 'Name': sName + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sName + */ +AdminAjaxRemoteStorage.prototype.plugin = function (fCallback, sName) +{ + this.defaultRequest(fCallback, 'AdminPluginLoad', { + 'Name': sName + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sName + */ +AdminAjaxRemoteStorage.prototype.domainDelete = function (fCallback, sName) +{ + this.defaultRequest(fCallback, 'AdminDomainDelete', { + 'Name': sName + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sName + * @param {boolean} bDisabled + */ +AdminAjaxRemoteStorage.prototype.domainDisable = function (fCallback, sName, bDisabled) +{ + return this.defaultRequest(fCallback, 'AdminDomainDisable', { + 'Name': sName, + 'Disabled': !!bDisabled ? '1' : '0' + }); +}; + +/** + * @param {?Function} fCallback + * @param {Object} oConfig + */ +AdminAjaxRemoteStorage.prototype.pluginSettingsUpdate = function (fCallback, oConfig) +{ + return this.defaultRequest(fCallback, 'AdminPluginSettingsUpdate', oConfig); +}; + +/** + * @param {?Function} fCallback + * @param {boolean} bForce + */ +AdminAjaxRemoteStorage.prototype.licensing = function (fCallback, bForce) +{ + return this.defaultRequest(fCallback, 'AdminLicensing', { + 'Force' : bForce ? '1' : '0' + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sDomain + * @param {string} sKey + */ +AdminAjaxRemoteStorage.prototype.licensingActivate = function (fCallback, sDomain, sKey) +{ + return this.defaultRequest(fCallback, 'AdminLicensingActivate', { + 'Domain' : sDomain, + 'Key' : sKey + }); +}; + +/** + * @param {?Function} fCallback + * @param {string} sName + * @param {boolean} bDisabled + */ +AdminAjaxRemoteStorage.prototype.pluginDisable = function (fCallback, sName, bDisabled) +{ + return this.defaultRequest(fCallback, 'AdminPluginDisable', { + 'Name': sName, + 'Disabled': !!bDisabled ? '1' : '0' + }); +}; + +AdminAjaxRemoteStorage.prototype.createOrUpdateDomain = function (fCallback, + bCreate, sName, sIncHost, iIncPort, sIncSecure, bIncShortLogin, + sOutHost, iOutPort, sOutSecure, bOutShortLogin, bOutAuth, sWhiteList) +{ + this.defaultRequest(fCallback, 'AdminDomainSave', { + 'Create': bCreate ? '1' : '0', + 'Name': sName, + 'IncHost': sIncHost, + 'IncPort': iIncPort, + 'IncSecure': sIncSecure, + 'IncShortLogin': bIncShortLogin ? '1' : '0', + 'OutHost': sOutHost, + 'OutPort': iOutPort, + 'OutSecure': sOutSecure, + 'OutShortLogin': bOutShortLogin ? '1' : '0', + 'OutAuth': bOutAuth ? '1' : '0', + 'WhiteList': sWhiteList + }); +}; + +AdminAjaxRemoteStorage.prototype.testConnectionForDomain = function (fCallback, + sIncHost, iIncPort, sIncSecure, + sOutHost, iOutPort, sOutSecure, bOutAuth) +{ + this.defaultRequest(fCallback, 'AdminDomainTest', { + 'IncHost': sIncHost, + 'IncPort': iIncPort, + 'IncSecure': sIncSecure, + 'OutHost': sOutHost, + 'OutPort': iOutPort, + 'OutSecure': sOutSecure, + 'OutAuth': bOutAuth ? '1' : '0' + }); +}; + +/** + * @param {?Function} fCallback + * @param {?} oData + */ +AdminAjaxRemoteStorage.prototype.saveNewAdminPassword = function (fCallback, oData) +{ + this.defaultRequest(fCallback, 'AdminPasswordUpdate', oData); +}; + +/** + * @param {?Function} fCallback + */ +AdminAjaxRemoteStorage.prototype.adminPing = function (fCallback) +{ + this.defaultRequest(fCallback, 'AdminPing'); +}; + +/** + * @constructor + */ +function AbstractCacheStorage() +{ + this.oEmailsPicsHashes = {}; + this.oServices = {}; +} +/** + * @type {Object} + */ +AbstractCacheStorage.prototype.oEmailsPicsHashes = {}; + +/** + * @type {Object} + */ +AbstractCacheStorage.prototype.oServices = {}; + +AbstractCacheStorage.prototype.clear = function () +{ + this.oServices = {}; + this.oEmailsPicsHashes = {}; +}; + +/** + * @param {string} sEmail + * @return {string} + */ +AbstractCacheStorage.prototype.getUserPic = function (sEmail) +{ + var + sUrl = '', + sService = '', + sEmailLower = sEmail.toLowerCase(), + sPicHash = Utils.isUnd(this.oEmailsPicsHashes[sEmail]) ? '' : this.oEmailsPicsHashes[sEmail] + ; + + if ('' === sPicHash) + { + sService = sEmailLower.substr(sEmail.indexOf('@') + 1); + sUrl = '' !== sService && this.oServices[sService] ? this.oServices[sService] : ''; + } + else + { + sUrl = RL.link().getUserPicUrlFromHash(sPicHash); + } + + return sUrl; +}; + +/** + * @param {Object} oData + */ +AbstractCacheStorage.prototype.setServicesData = function (oData) +{ + this.oServices = oData; +}; + +/** + * @param {Object} oData + */ +AbstractCacheStorage.prototype.setEmailsPicsHashesData = function (oData) +{ + this.oEmailsPicsHashes = oData; +}; + +/** + * @constructor + * @extends AbstractCacheStorage + */ +function AdminCacheStorage() +{ + AbstractCacheStorage.call(this); +} + +_.extend(AdminCacheStorage.prototype, AbstractCacheStorage.prototype); + +/** + * @param {Array} aViewModels + * @constructor + * @extends KnoinAbstractScreen + */ +function AbstractSettings(aViewModels) +{ + KnoinAbstractScreen.call(this, 'settings', aViewModels); + + this.menu = ko.observableArray([]); + + this.oCurrentSubScreen = null; + this.oViewModelPlace = null; +} + +_.extend(AbstractSettings.prototype, KnoinAbstractScreen.prototype); + +AbstractSettings.prototype.onRoute = function (sSubName) +{ + var + self = this, + oSettingsScreen = null, + RoutedSettingsViewModel = null, + oViewModelPlace = null, + oViewModelDom = null + ; + + RoutedSettingsViewModel = _.find(ViewModels['settings'], function (SettingsViewModel) { + return SettingsViewModel && SettingsViewModel.__rlSettingsData && + sSubName === SettingsViewModel.__rlSettingsData.Route; + }); + + if (RoutedSettingsViewModel) + { + if (_.find(ViewModels['settings-removed'], function (DisabledSettingsViewModel) { + return DisabledSettingsViewModel && DisabledSettingsViewModel === RoutedSettingsViewModel; + })) + { + RoutedSettingsViewModel = null; + } + + if (RoutedSettingsViewModel && _.find(ViewModels['settings-disabled'], function (DisabledSettingsViewModel) { + return DisabledSettingsViewModel && DisabledSettingsViewModel === RoutedSettingsViewModel; + })) + { + RoutedSettingsViewModel = null; + } + } + + if (RoutedSettingsViewModel) + { + if (RoutedSettingsViewModel.__builded && RoutedSettingsViewModel.__vm) + { + oSettingsScreen = RoutedSettingsViewModel.__vm; + } + else + { + oViewModelPlace = this.oViewModelPlace; + if (oViewModelPlace && 1 === oViewModelPlace.length) + { + RoutedSettingsViewModel = /** @type {?Function} */ RoutedSettingsViewModel; + oSettingsScreen = new RoutedSettingsViewModel(); + + oViewModelDom = $('
').addClass('rl-settings-view-model').hide().attr('data-bind', + 'template: {name: "' + RoutedSettingsViewModel.__rlSettingsData.Template + '"}, i18nInit: true'); + + oViewModelDom.appendTo(oViewModelPlace); + + oSettingsScreen.data = RL.data(); + oSettingsScreen.viewModelDom = oViewModelDom; + + oSettingsScreen.__rlSettingsData = RoutedSettingsViewModel.__rlSettingsData; + + RoutedSettingsViewModel.__dom = oViewModelDom; + RoutedSettingsViewModel.__builded = true; + RoutedSettingsViewModel.__vm = oSettingsScreen; + + ko.applyBindings(oSettingsScreen, oViewModelDom[0]); + kn.delegateRun(oSettingsScreen, 'onBuild', [oViewModelDom]); + } + else + { + Utils.log('Cannot find sub settings view model position: SettingsSubScreen'); + } + } + + if (oSettingsScreen) + { + _.defer(function () { + // hide + if (self.oCurrentSubScreen) + { + kn.delegateRun(self.oCurrentSubScreen, 'onHide'); + self.oCurrentSubScreen.viewModelDom.hide(); + } + // -- + + self.oCurrentSubScreen = oSettingsScreen; + + // show + if (self.oCurrentSubScreen) + { + self.oCurrentSubScreen.viewModelDom.show(); + kn.delegateRun(self.oCurrentSubScreen, 'onShow'); + + _.each(self.menu(), function (oItem) { + oItem.selected(oSettingsScreen && oSettingsScreen.__rlSettingsData && oItem.route === oSettingsScreen.__rlSettingsData.Route); + }); + + $('#rl-content .b-settings .b-content .content').scrollTop(0); + } + // -- + + Utils.windowResize(); + }); + } + } + else + { + kn.setHash(RL.link().settings(), false, true); + } +}; + +AbstractSettings.prototype.onHide = function () +{ + if (this.oCurrentSubScreen && this.oCurrentSubScreen.viewModelDom) + { + kn.delegateRun(this.oCurrentSubScreen, 'onHide'); + this.oCurrentSubScreen.viewModelDom.hide(); + } +}; + +AbstractSettings.prototype.onBuild = function () +{ + _.each(ViewModels['settings'], function (SettingsViewModel) { + if (SettingsViewModel && SettingsViewModel.__rlSettingsData && + !_.find(ViewModels['settings-removed'], function (RemoveSettingsViewModel) { + return RemoveSettingsViewModel && RemoveSettingsViewModel === SettingsViewModel; + })) + { + this.menu.push({ + 'route': SettingsViewModel.__rlSettingsData.Route, + 'label': SettingsViewModel.__rlSettingsData.Label, + 'selected': ko.observable(false), + 'disabled': !!_.find(ViewModels['settings-disabled'], function (DisabledSettingsViewModel) { + return DisabledSettingsViewModel && DisabledSettingsViewModel === SettingsViewModel; + }) + }); + } + }, this); + + this.oViewModelPlace = $('#rl-content #rl-settings-subscreen'); +}; + +AbstractSettings.prototype.routes = function () +{ + var + DefaultViewModel = _.find(ViewModels['settings'], function (SettingsViewModel) { + return SettingsViewModel && SettingsViewModel.__rlSettingsData && SettingsViewModel.__rlSettingsData['IsDefault']; + }), + sDefaultRoute = DefaultViewModel ? DefaultViewModel.__rlSettingsData['Route'] : 'general', + oRules = { + 'subname': /^(.*)$/, + 'normalize_': function (oRequest, oVals) { + oVals.subname = Utils.isUnd(oVals.subname) ? sDefaultRoute : Utils.pString(oVals.subname); + return [oVals.subname]; + } + } + ; + + return [ + ['{subname}/', oRules], + ['{subname}', oRules], + ['', oRules] + ]; +}; + +/** + * @constructor + * @extends KnoinAbstractScreen + */ +function AdminLoginScreen() +{ + KnoinAbstractScreen.call(this, 'login', [AdminLoginViewModel]); +} + +_.extend(AdminLoginScreen.prototype, KnoinAbstractScreen.prototype); + +AdminLoginScreen.prototype.onShow = function () +{ + RL.setTitle(''); +}; +/** + * @constructor + * @extends AbstractSettings + */ +function AdminSettingsScreen() +{ + AbstractSettings.call(this, [ + AdminMenuViewModel, + AdminPaneViewModel + ]); +} + +_.extend(AdminSettingsScreen.prototype, AbstractSettings.prototype); + +AdminSettingsScreen.prototype.onShow = function () +{ +// AbstractSettings.prototype.onShow.call(this); + + RL.setTitle(''); +}; +/** + * @constructor + * @extends KnoinAbstractBoot + */ +function AbstractApp() +{ + KnoinAbstractBoot.call(this); + + this.oSettings = null; + this.oPlugins = null; + this.oLink = null; + this.oLocal = null; + + this.isLocalAutocomplete = true; + + this.popupVisibility = ko.observable(false); + + this.iframe = $('
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){m.types.push(N),w("BeforeChange",function(a,b,c){b!==c&&(b===N?P():c===N&&P(!0))}),w(b+"."+N,function(){P()})},getIframe:function(b,c){var d=b.src,e=m.st.iframe;a.each(e.patterns,function(){if(d.indexOf(this.index)>-1)return this.id&&(typeof this.id=="string"?d=d.substr(d.lastIndexOf(this.id)+this.id.length,d.length):d=this.id.call(this,d)),d=this.src.replace("%id%",d),!1});var f={};return e.srcAction&&(f[e.srcAction]=d),m._parseMarkup(c,f,b),m.updateStatus("ready"),c}}});var Q=function(a){var b=m.items.length;return a>b-1?a-b:a<0?b+a:a},R=function(a,b,c){return a.replace("%curr%",b+1).replace("%total%",c)};a.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var c=m.st.gallery,d=".mfp-gallery",h=Boolean(a.fn.mfpFastClick);m.direction=!0;if(!c||!c.enabled)return!1;u+=" mfp-gallery",w(f+d,function(){c.navigateByImgClick&&m.wrap.on("click"+d,".mfp-img",function(){if(m.items.length>1)return m.next(),!1}),s.on("keydown"+d,function(a){a.keyCode===37?m.prev():a.keyCode===39&&m.next()})}),w("UpdateStatus"+d,function(a,b){b.text&&(b.text=R(b.text,m.currItem.index,m.items.length))}),w(e+d,function(a,b,d,e){var f=m.items.length;d.counter=f>1?R(c.tCounter,e.index,f):""}),w("BuildControls"+d,function(){if(m.items.length>1&&c.arrows&&!m.arrowLeft){var b=c.arrowMarkup,d=m.arrowLeft=a(b.replace("%title%",c.tPrev).replace("%dir%","left")).addClass(l),e=m.arrowRight=a(b.replace("%title%",c.tNext).replace("%dir%","right")).addClass(l),f=h?"mfpFastClick":"click";d[f](function(){m.prev()}),e[f](function(){m.next()}),m.isIE7&&(x("b",d[0],!1,!0),x("a",d[0],!1,!0),x("b",e[0],!1,!0),x("a",e[0],!1,!0)),m.container.append(d.add(e))}}),w(g+d,function(){m._preloadTimeout&&clearTimeout(m._preloadTimeout),m._preloadTimeout=setTimeout(function(){m.preloadNearbyImages(),m._preloadTimeout=null},16)}),w(b+d,function(){s.off(d),m.wrap.off("click"+d),m.arrowLeft&&h&&m.arrowLeft.add(m.arrowRight).destroyMfpFastClick(),m.arrowRight=m.arrowLeft=null})},next:function(){m.direction=!0,m.index=Q(m.index+1),m.updateItemHTML()},prev:function(){m.direction=!1,m.index=Q(m.index-1),m.updateItemHTML()},goTo:function(a){m.direction=a>=m.index,m.index=a,m.updateItemHTML()},preloadNearbyImages:function(){var a=m.st.gallery.preload,b=Math.min(a[0],m.items.length),c=Math.min(a[1],m.items.length),d;for(d=1;d<=(m.direction?c:b);d++)m._preloadItem(m.index+d);for(d=1;d<=(m.direction?b:c);d++)m._preloadItem(m.index-d)},_preloadItem:function(b){b=Q(b);if(m.items[b].preloaded)return;var c=m.items[b];c.parsed||(c=m.parseEl(b)),y("LazyLoad",c),c.type==="image"&&(c.img=a('').on("load.mfploader",function(){c.hasSize=!0}).on("error.mfploader",function(){c.hasSize=!0,c.loadError=!0}).attr("src",c.src)),c.preloaded=!0}}});var S="retina";a.magnificPopup.registerModule(S,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=m.st.retina,b=a.ratio;b=isNaN(b)?b():b,b>1&&(w("ImageHasSize."+S,function(a,c){c.img.css({"max-width":c.img[0].naturalWidth/b,width:"100%"})}),w("ElementParse."+S,function(c,d){d.src=a.replaceSrc(d,b)}))}}}}),function(){var b=1e3,c="ontouchstart"in window,d=function(){q.off("touchmove"+f+" touchend"+f)},e="mfpFastClick",f="."+e;a.fn.mfpFastClick=function(e){return a(this).each(function(){var g=a(this),h;if(c){var i,j,k,l,m,n;g.on("touchstart"+f,function(a){l=!1,n=1,m=a.originalEvent?a.originalEvent.touches[0]:a.touches[0],j=m.clientX,k=m.clientY,q.on("touchmove"+f,function(a){m=a.originalEvent?a.originalEvent.touches:a.touches,n=m.length,m=m[0];if(Math.abs(m.clientX-j)>10||Math.abs(m.clientY-k)>10)l=!0,d()}).on("touchend"+f,function(a){d();if(l||n>1)return;h=!0,a.preventDefault(),clearTimeout(i),i=setTimeout(function(){h=!1},b),e()})})}g.on("click"+f,function(){h||e()})})},a.fn.destroyMfpFastClick=function(){a(this).off("touchstart"+f+" click"+f),c&&q.off("touchmove"+f+" touchend"+f)}}()})(window.jQuery||window.Zepto); +/*! Magnific Popup - v0.9.8 - 2013-10-26 +* http://dimsemenov.com/plugins/magnific-popup/ +* Copyright (c) 2013 Dmitry Semenov; MIT */ +(function(e){var t,i,n,o,r,a,s,l="Close",c="BeforeClose",d="AfterClose",u="BeforeAppend",p="MarkupParse",f="Open",m="Change",g="mfp",v="."+g,h="mfp-ready",C="mfp-removing",y="mfp-prevent-close",w=function(){},b=!!window.jQuery,I=e(window),x=function(e,i){t.ev.on(g+e+v,i)},k=function(t,i,n,o){var r=document.createElement("div");return r.className="mfp-"+t,n&&(r.innerHTML=n),o?i&&i.appendChild(r):(r=e(r),i&&r.appendTo(i)),r},T=function(i,n){t.ev.triggerHandler(g+i,n),t.st.callbacks&&(i=i.charAt(0).toLowerCase()+i.slice(1),t.st.callbacks[i]&&t.st.callbacks[i].apply(t,e.isArray(n)?n:[n]))},E=function(){(t.st.focus?t.content.find(t.st.focus).eq(0):t.wrap).focus()},S=function(i){return i===s&&t.currTemplate.closeBtn||(t.currTemplate.closeBtn=e(t.st.closeMarkup.replace("%title%",t.st.tClose)),s=i),t.currTemplate.closeBtn},P=function(){e.magnificPopup.instance||(t=new w,t.init(),e.magnificPopup.instance=t)},_=function(){var e=document.createElement("p").style,t=["ms","O","Moz","Webkit"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+"Transition"in e)return!0;return!1};w.prototype={constructor:w,init:function(){var i=navigator.appVersion;t.isIE7=-1!==i.indexOf("MSIE 7."),t.isIE8=-1!==i.indexOf("MSIE 8."),t.isLowIE=t.isIE7||t.isIE8,t.isAndroid=/android/gi.test(i),t.isIOS=/iphone|ipad|ipod/gi.test(i),t.supportsTransition=_(),t.probablyMobile=t.isAndroid||t.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),n=e(document.body),o=e(document),t.popupsCache={}},open:function(i){var n;if(i.isObj===!1){t.items=i.items.toArray(),t.index=0;var r,s=i.items;for(n=0;s.length>n;n++)if(r=s[n],r.parsed&&(r=r.el[0]),r===i.el[0]){t.index=n;break}}else t.items=e.isArray(i.items)?i.items:[i.items],t.index=i.index||0;if(t.isOpen)return t.updateItemHTML(),void 0;t.types=[],a="",t.ev=i.mainEl&&i.mainEl.length?i.mainEl.eq(0):o,i.key?(t.popupsCache[i.key]||(t.popupsCache[i.key]={}),t.currTemplate=t.popupsCache[i.key]):t.currTemplate={},t.st=e.extend(!0,{},e.magnificPopup.defaults,i),t.fixedContentPos="auto"===t.st.fixedContentPos?!t.probablyMobile:t.st.fixedContentPos,t.st.modal&&(t.st.closeOnContentClick=!1,t.st.closeOnBgClick=!1,t.st.showCloseBtn=!1,t.st.enableEscapeKey=!1),t.bgOverlay||(t.bgOverlay=k("bg").on("click"+v,function(){t.close()}),t.wrap=k("wrap").attr("tabindex",-1).on("click"+v,function(e){t._checkIfClose(e.target)&&t.close()}),t.container=k("container",t.wrap)),t.contentContainer=k("content"),t.st.preloader&&(t.preloader=k("preloader",t.container,t.st.tLoading));var l=e.magnificPopup.modules;for(n=0;l.length>n;n++){var c=l[n];c=c.charAt(0).toUpperCase()+c.slice(1),t["init"+c].call(t)}T("BeforeOpen"),t.st.showCloseBtn&&(t.st.closeBtnInside?(x(p,function(e,t,i,n){i.close_replaceWith=S(n.type)}),a+=" mfp-close-btn-in"):t.wrap.append(S())),t.st.alignTop&&(a+=" mfp-align-top"),t.fixedContentPos?t.wrap.css({overflow:t.st.overflowY,overflowX:"hidden",overflowY:t.st.overflowY}):t.wrap.css({top:I.scrollTop(),position:"absolute"}),(t.st.fixedBgPos===!1||"auto"===t.st.fixedBgPos&&!t.fixedContentPos)&&t.bgOverlay.css({height:o.height(),position:"absolute"}),t.st.enableEscapeKey&&o.on("keyup"+v,function(e){27===e.keyCode&&t.close()}),I.on("resize"+v,function(){t.updateSize()}),t.st.closeOnContentClick||(a+=" mfp-auto-cursor"),a&&t.wrap.addClass(a);var d=t.wH=I.height(),u={};if(t.fixedContentPos&&t._hasScrollBar(d)){var m=t._getScrollbarSize();m&&(u.marginRight=m)}t.fixedContentPos&&(t.isIE7?e("body, html").css("overflow","hidden"):u.overflow="hidden");var g=t.st.mainClass;return t.isIE7&&(g+=" mfp-ie7"),g&&t._addClassToMFP(g),t.updateItemHTML(),T("BuildControls"),e("html").css(u),t.bgOverlay.add(t.wrap).prependTo(document.body),t._lastFocusedEl=document.activeElement,setTimeout(function(){t.content?(t._addClassToMFP(h),E()):t.bgOverlay.addClass(h),o.on("focusin"+v,function(i){return i.target===t.wrap[0]||e.contains(t.wrap[0],i.target)?void 0:(E(),!1)})},16),t.isOpen=!0,t.updateSize(d),T(f),i},close:function(){t.isOpen&&(T(c),t.isOpen=!1,t.st.removalDelay&&!t.isLowIE&&t.supportsTransition?(t._addClassToMFP(C),setTimeout(function(){t._close()},t.st.removalDelay)):t._close())},_close:function(){T(l);var i=C+" "+h+" ";if(t.bgOverlay.detach(),t.wrap.detach(),t.container.empty(),t.st.mainClass&&(i+=t.st.mainClass+" "),t._removeClassFromMFP(i),t.fixedContentPos){var n={marginRight:""};t.isIE7?e("body, html").css("overflow",""):n.overflow="",e("html").css(n)}o.off("keyup"+v+" focusin"+v),t.ev.off(v),t.wrap.attr("class","mfp-wrap").removeAttr("style"),t.bgOverlay.attr("class","mfp-bg"),t.container.attr("class","mfp-container"),!t.st.showCloseBtn||t.st.closeBtnInside&&t.currTemplate[t.currItem.type]!==!0||t.currTemplate.closeBtn&&t.currTemplate.closeBtn.detach(),t._lastFocusedEl&&e(t._lastFocusedEl).focus(),t.currItem=null,t.content=null,t.currTemplate=null,t.prevHeight=0,T(d)},updateSize:function(e){if(t.isIOS){var i=document.documentElement.clientWidth/window.innerWidth,n=window.innerHeight*i;t.wrap.css("height",n),t.wH=n}else t.wH=e||I.height();t.fixedContentPos||t.wrap.css("height",t.wH),T("Resize")},updateItemHTML:function(){var i=t.items[t.index];t.contentContainer.detach(),t.content&&t.content.detach(),i.parsed||(i=t.parseEl(t.index));var n=i.type;if(T("BeforeChange",[t.currItem?t.currItem.type:"",n]),t.currItem=i,!t.currTemplate[n]){var o=t.st[n]?t.st[n].markup:!1;T("FirstMarkupParse",o),t.currTemplate[n]=o?e(o):!0}r&&r!==i.type&&t.container.removeClass("mfp-"+r+"-holder");var a=t["get"+n.charAt(0).toUpperCase()+n.slice(1)](i,t.currTemplate[n]);t.appendContent(a,n),i.preloaded=!0,T(m,i),r=i.type,t.container.prepend(t.contentContainer),T("AfterChange")},appendContent:function(e,i){t.content=e,e?t.st.showCloseBtn&&t.st.closeBtnInside&&t.currTemplate[i]===!0?t.content.find(".mfp-close").length||t.content.append(S()):t.content=e:t.content="",T(u),t.container.addClass("mfp-"+i+"-holder"),t.contentContainer.append(t.content)},parseEl:function(i){var n=t.items[i],o=n.type;if(n=n.tagName?{el:e(n)}:{data:n,src:n.src},n.el){for(var r=t.types,a=0;r.length>a;a++)if(n.el.hasClass("mfp-"+r[a])){o=r[a];break}n.src=n.el.attr("data-mfp-src"),n.src||(n.src=n.el.attr("href"))}return n.type=o||t.st.type||"inline",n.index=i,n.parsed=!0,t.items[i]=n,T("ElementParse",n),t.items[i]},addGroup:function(e,i){var n=function(n){n.mfpEl=this,t._openClick(n,e,i)};i||(i={});var o="click.magnificPopup";i.mainEl=e,i.items?(i.isObj=!0,e.off(o).on(o,n)):(i.isObj=!1,i.delegate?e.off(o).on(o,i.delegate,n):(i.items=e,e.off(o).on(o,n)))},_openClick:function(i,n,o){var r=void 0!==o.midClick?o.midClick:e.magnificPopup.defaults.midClick;if(r||2!==i.which&&!i.ctrlKey&&!i.metaKey){var a=void 0!==o.disableOn?o.disableOn:e.magnificPopup.defaults.disableOn;if(a)if(e.isFunction(a)){if(!a.call(t))return!0}else if(a>I.width())return!0;i.type&&(i.preventDefault(),t.isOpen&&i.stopPropagation()),o.el=e(i.mfpEl),o.delegate&&(o.items=n.find(o.delegate)),t.open(o)}},updateStatus:function(e,n){if(t.preloader){i!==e&&t.container.removeClass("mfp-s-"+i),n||"loading"!==e||(n=t.st.tLoading);var o={status:e,text:n};T("UpdateStatus",o),e=o.status,n=o.text,t.preloader.html(n),t.preloader.find("a").on("click",function(e){e.stopImmediatePropagation()}),t.container.addClass("mfp-s-"+e),i=e}},_checkIfClose:function(i){if(!e(i).hasClass(y)){var n=t.st.closeOnContentClick,o=t.st.closeOnBgClick;if(n&&o)return!0;if(!t.content||e(i).hasClass("mfp-close")||t.preloader&&i===t.preloader[0])return!0;if(i===t.content[0]||e.contains(t.content[0],i)){if(n)return!0}else if(o&&e.contains(document,i))return!0;return!1}},_addClassToMFP:function(e){t.bgOverlay.addClass(e),t.wrap.addClass(e)},_removeClassFromMFP:function(e){this.bgOverlay.removeClass(e),t.wrap.removeClass(e)},_hasScrollBar:function(e){return(t.isIE7?o.height():document.body.scrollHeight)>(e||I.height())},_parseMarkup:function(t,i,n){var o;n.data&&(i=e.extend(n.data,i)),T(p,[t,i,n]),e.each(i,function(e,i){if(void 0===i||i===!1)return!0;if(o=e.split("_"),o.length>1){var n=t.find(v+"-"+o[0]);if(n.length>0){var r=o[1];"replaceWith"===r?n[0]!==i[0]&&n.replaceWith(i):"img"===r?n.is("img")?n.attr("src",i):n.replaceWith(''):n.attr(o[1],i)}}else t.find(v+"-"+e).html(i)})},_getScrollbarSize:function(){if(void 0===t.scrollbarSize){var e=document.createElement("div");e.id="mfp-sbm",e.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(e),t.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)}return t.scrollbarSize}},e.magnificPopup={instance:null,proto:w.prototype,modules:[],open:function(t,i){return P(),t=t?e.extend(!0,{},t):{},t.isObj=!0,t.index=i||0,this.instance.open(t)},close:function(){return e.magnificPopup.instance&&e.magnificPopup.instance.close()},registerModule:function(t,i){i.options&&(e.magnificPopup.defaults[t]=i.options),e.extend(this.proto,i.proto),this.modules.push(t)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading..."}},e.fn.magnificPopup=function(i){P();var n=e(this);if("string"==typeof i)if("open"===i){var o,r=b?n.data("magnificPopup"):n[0].magnificPopup,a=parseInt(arguments[1],10)||0;r.items?o=r.items[a]:(o=n,r.delegate&&(o=o.find(r.delegate)),o=o.eq(a)),t._openClick({mfpEl:o},n,r)}else t.isOpen&&t[i].apply(t,Array.prototype.slice.call(arguments,1));else i=e.extend(!0,{},i),b?n.data("magnificPopup",i):n[0].magnificPopup=i,t.addGroup(n,i);return n};var O,z,M,B="inline",H=function(){M&&(z.after(M.addClass(O)).detach(),M=null)};e.magnificPopup.registerModule(B,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){t.types.push(B),x(l+"."+B,function(){H()})},getInline:function(i,n){if(H(),i.src){var o=t.st.inline,r=e(i.src);if(r.length){var a=r[0].parentNode;a&&a.tagName&&(z||(O=o.hiddenClass,z=k(O),O="mfp-"+O),M=r.after(z).detach().removeClass(O)),t.updateStatus("ready")}else t.updateStatus("error",o.tNotFound),r=e("
");return i.inlineElement=r,r}return t.updateStatus("ready"),t._parseMarkup(n,{},i),n}}});var L,A="ajax",F=function(){L&&n.removeClass(L)},j=function(){F(),t.req&&t.req.abort()};e.magnificPopup.registerModule(A,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){t.types.push(A),L=t.st.ajax.cursor,x(l+"."+A,j),x("BeforeChange."+A,j)},getAjax:function(i){L&&n.addClass(L),t.updateStatus("loading");var o=e.extend({url:i.src,success:function(n,o,r){var a={data:n,xhr:r};T("ParseAjax",a),t.appendContent(e(a.data),A),i.finished=!0,F(),E(),setTimeout(function(){t.wrap.addClass(h)},16),t.updateStatus("ready"),T("AjaxContentAdded")},error:function(){F(),i.finished=i.loadError=!0,t.updateStatus("error",t.st.ajax.tError.replace("%url%",i.src))}},t.st.ajax.settings);return t.req=e.ajax(o),""}}});var N,W=function(i){if(i.data&&void 0!==i.data.title)return i.data.title;var n=t.st.image.titleSrc;if(n){if(e.isFunction(n))return n.call(t,i);if(i.el)return i.el.attr(n)||""}return""};e.magnificPopup.registerModule("image",{options:{markup:'
',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var e=t.st.image,i=".image";t.types.push("image"),x(f+i,function(){"image"===t.currItem.type&&e.cursor&&n.addClass(e.cursor)}),x(l+i,function(){e.cursor&&n.removeClass(e.cursor),I.off("resize"+v)}),x("Resize"+i,t.resizeImage),t.isLowIE&&x("AfterChange",t.resizeImage)},resizeImage:function(){var e=t.currItem;if(e&&e.img&&t.st.image.verticalFit){var i=0;t.isLowIE&&(i=parseInt(e.img.css("padding-top"),10)+parseInt(e.img.css("padding-bottom"),10)),e.img.css("max-height",t.wH-i)}},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,N&&clearInterval(N),e.isCheckingImgSize=!1,T("ImageHasSize",e),e.imgHidden&&(t.content&&t.content.removeClass("mfp-loading"),e.imgHidden=!1))},findImageSize:function(e){var i=0,n=e.img[0],o=function(r){N&&clearInterval(N),N=setInterval(function(){return n.naturalWidth>0?(t._onImageHasSize(e),void 0):(i>200&&clearInterval(N),i++,3===i?o(10):40===i?o(50):100===i&&o(500),void 0)},r)};o(1)},getImage:function(i,n){var o=0,r=function(){i&&(i.img[0].complete?(i.img.off(".mfploader"),i===t.currItem&&(t._onImageHasSize(i),t.updateStatus("ready")),i.hasSize=!0,i.loaded=!0,T("ImageLoadComplete")):(o++,200>o?setTimeout(r,100):a()))},a=function(){i&&(i.img.off(".mfploader"),i===t.currItem&&(t._onImageHasSize(i),t.updateStatus("error",s.tError.replace("%url%",i.src))),i.hasSize=!0,i.loaded=!0,i.loadError=!0)},s=t.st.image,l=n.find(".mfp-img");if(l.length){var c=document.createElement("img");c.className="mfp-img",i.img=e(c).on("load.mfploader",r).on("error.mfploader",a),c.src=i.src,l.is("img")&&(i.img=i.img.clone()),i.img[0].naturalWidth>0&&(i.hasSize=!0)}return t._parseMarkup(n,{title:W(i),img_replaceWith:i.img},i),t.resizeImage(),i.hasSize?(N&&clearInterval(N),i.loadError?(n.addClass("mfp-loading"),t.updateStatus("error",s.tError.replace("%url%",i.src))):(n.removeClass("mfp-loading"),t.updateStatus("ready")),n):(t.updateStatus("loading"),i.loading=!0,i.hasSize||(i.imgHidden=!0,n.addClass("mfp-loading"),t.findImageSize(i)),n)}}});var R,Z=function(){return void 0===R&&(R=void 0!==document.createElement("p").style.MozTransform),R};e.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(e){return e.is("img")?e:e.find("img")}},proto:{initZoom:function(){var e,i=t.st.zoom,n=".zoom";if(i.enabled&&t.supportsTransition){var o,r,a=i.duration,s=function(e){var t=e.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),n="all "+i.duration/1e3+"s "+i.easing,o={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},r="transition";return o["-webkit-"+r]=o["-moz-"+r]=o["-o-"+r]=o[r]=n,t.css(o),t},d=function(){t.content.css("visibility","visible")};x("BuildControls"+n,function(){if(t._allowZoom()){if(clearTimeout(o),t.content.css("visibility","hidden"),e=t._getItemToZoom(),!e)return d(),void 0;r=s(e),r.css(t._getOffset()),t.wrap.append(r),o=setTimeout(function(){r.css(t._getOffset(!0)),o=setTimeout(function(){d(),setTimeout(function(){r.remove(),e=r=null,T("ZoomAnimationEnded")},16)},a)},16)}}),x(c+n,function(){if(t._allowZoom()){if(clearTimeout(o),t.st.removalDelay=a,!e){if(e=t._getItemToZoom(),!e)return;r=s(e)}r.css(t._getOffset(!0)),t.wrap.append(r),t.content.css("visibility","hidden"),setTimeout(function(){r.css(t._getOffset())},16)}}),x(l+n,function(){t._allowZoom()&&(d(),r&&r.remove(),e=null)})}},_allowZoom:function(){return"image"===t.currItem.type},_getItemToZoom:function(){return t.currItem.hasSize?t.currItem.img:!1},_getOffset:function(i){var n;n=i?t.currItem.img:t.st.zoom.opener(t.currItem.el||t.currItem);var o=n.offset(),r=parseInt(n.css("padding-top"),10),a=parseInt(n.css("padding-bottom"),10);o.top-=e(window).scrollTop()-r;var s={width:n.width(),height:(b?n.innerHeight():n[0].offsetHeight)-a-r};return Z()?s["-moz-transform"]=s.transform="translate("+o.left+"px,"+o.top+"px)":(s.left=o.left,s.top=o.top),s}}});var q="iframe",D="//about:blank",K=function(e){if(t.currTemplate[q]){var i=t.currTemplate[q].find("iframe");i.length&&(e||(i[0].src=D),t.isIE8&&i.css("display",e?"block":"none"))}};e.magnificPopup.registerModule(q,{options:{markup:'
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){t.types.push(q),x("BeforeChange",function(e,t,i){t!==i&&(t===q?K():i===q&&K(!0))}),x(l+"."+q,function(){K()})},getIframe:function(i,n){var o=i.src,r=t.st.iframe;e.each(r.patterns,function(){return o.indexOf(this.index)>-1?(this.id&&(o="string"==typeof this.id?o.substr(o.lastIndexOf(this.id)+this.id.length,o.length):this.id.call(this,o)),o=this.src.replace("%id%",o),!1):void 0});var a={};return r.srcAction&&(a[r.srcAction]=o),t._parseMarkup(n,a,i),t.updateStatus("ready"),n}}});var Y=function(e){var i=t.items.length;return e>i-1?e-i:0>e?i+e:e},U=function(e,t,i){return e.replace(/%curr%/gi,t+1).replace(/%total%/gi,i)};e.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var i=t.st.gallery,n=".mfp-gallery",r=Boolean(e.fn.mfpFastClick);return t.direction=!0,i&&i.enabled?(a+=" mfp-gallery",x(f+n,function(){i.navigateByImgClick&&t.wrap.on("click"+n,".mfp-img",function(){return t.items.length>1?(t.next(),!1):void 0}),o.on("keydown"+n,function(e){37===e.keyCode?t.prev():39===e.keyCode&&t.next()})}),x("UpdateStatus"+n,function(e,i){i.text&&(i.text=U(i.text,t.currItem.index,t.items.length))}),x(p+n,function(e,n,o,r){var a=t.items.length;o.counter=a>1?U(i.tCounter,r.index,a):""}),x("BuildControls"+n,function(){if(t.items.length>1&&i.arrows&&!t.arrowLeft){var n=i.arrowMarkup,o=t.arrowLeft=e(n.replace(/%title%/gi,i.tPrev).replace(/%dir%/gi,"left")).addClass(y),a=t.arrowRight=e(n.replace(/%title%/gi,i.tNext).replace(/%dir%/gi,"right")).addClass(y),s=r?"mfpFastClick":"click";o[s](function(){t.prev()}),a[s](function(){t.next()}),t.isIE7&&(k("b",o[0],!1,!0),k("a",o[0],!1,!0),k("b",a[0],!1,!0),k("a",a[0],!1,!0)),t.container.append(o.add(a))}}),x(m+n,function(){t._preloadTimeout&&clearTimeout(t._preloadTimeout),t._preloadTimeout=setTimeout(function(){t.preloadNearbyImages(),t._preloadTimeout=null},16)}),x(l+n,function(){o.off(n),t.wrap.off("click"+n),t.arrowLeft&&r&&t.arrowLeft.add(t.arrowRight).destroyMfpFastClick(),t.arrowRight=t.arrowLeft=null}),void 0):!1},next:function(){t.direction=!0,t.index=Y(t.index+1),t.updateItemHTML()},prev:function(){t.direction=!1,t.index=Y(t.index-1),t.updateItemHTML()},goTo:function(e){t.direction=e>=t.index,t.index=e,t.updateItemHTML()},preloadNearbyImages:function(){var e,i=t.st.gallery.preload,n=Math.min(i[0],t.items.length),o=Math.min(i[1],t.items.length);for(e=1;(t.direction?o:n)>=e;e++)t._preloadItem(t.index+e);for(e=1;(t.direction?n:o)>=e;e++)t._preloadItem(t.index-e)},_preloadItem:function(i){if(i=Y(i),!t.items[i].preloaded){var n=t.items[i];n.parsed||(n=t.parseEl(i)),T("LazyLoad",n),"image"===n.type&&(n.img=e('').on("load.mfploader",function(){n.hasSize=!0}).on("error.mfploader",function(){n.hasSize=!0,n.loadError=!0,T("LazyLoadError",n)}).attr("src",n.src)),n.preloaded=!0}}}});var G="retina";e.magnificPopup.registerModule(G,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var e=t.st.retina,i=e.ratio;i=isNaN(i)?i():i,i>1&&(x("ImageHasSize."+G,function(e,t){t.img.css({"max-width":t.img[0].naturalWidth/i,width:"100%"})}),x("ElementParse."+G,function(t,n){n.src=e.replaceSrc(n,i)}))}}}}),function(){var t=1e3,i="ontouchstart"in window,n=function(){I.off("touchmove"+r+" touchend"+r)},o="mfpFastClick",r="."+o;e.fn.mfpFastClick=function(o){return e(this).each(function(){var a,s=e(this);if(i){var l,c,d,u,p,f;s.on("touchstart"+r,function(e){u=!1,f=1,p=e.originalEvent?e.originalEvent.touches[0]:e.touches[0],c=p.clientX,d=p.clientY,I.on("touchmove"+r,function(e){p=e.originalEvent?e.originalEvent.touches:e.touches,f=p.length,p=p[0],(Math.abs(p.clientX-c)>10||Math.abs(p.clientY-d)>10)&&(u=!0,n())}).on("touchend"+r,function(e){n(),u||f>1||(a=!0,e.preventDefault(),clearTimeout(l),l=setTimeout(function(){a=!1},t),o())})})}s.on("click"+r,function(){a||o()})})},e.fn.destroyMfpFastClick=function(){e(this).off("touchstart"+r+" click"+r),i&&I.off("touchmove"+r+" touchend"+r)}}()})(window.jQuery||window.Zepto); /*! * Bootstrap.js by @fat & @mdo @@ -261,6 +239,6 @@ permissions and limitations under the Apache License and the GPL License. */ !function(e){e(function(){"use strict";e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()},e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e(function(){e("body").on("click.alert.data-api",t,n.prototype.close)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.parent('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")},e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e(function(){e("body").on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=n,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},to:function(t){var n=this.$element.find(".item.active"),r=n.parent().children(),i=r.index(n),s=this;if(t>r.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){s.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",e(r[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f=e.Event("slide",{relatedTarget:i[0]});this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u]();if(i.hasClass("active"))return;if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}},e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e(function(){e("body").on("click.carousel.data-api","[data-slide]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=!i.data("modal")&&e.extend({},i.data(),n.data());i.carousel(s),t.preventDefault()})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning)return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning)return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=typeof n=="object"&&n;i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e(function(){e("body").on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})})}(window.jQuery),!function(e){"use strict";function r(){i(e(t)).removeClass("open")}function i(t){var n=t.attr("data-target"),r;return n||(n=t.attr("href"),n=n&&n.replace(/.*(?=#[^\s]*$)/,"")),r=e(n),r.length||(r=t.parent()),r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||(s.toggleClass("open"),n.focus()),!1},keydown:function(t){var n,r,s,o,u,a;if(!/(38|40|27)/.test(t.keyCode))return;n=e(this),t.preventDefault(),t.stopPropagation();if(n.is(".disabled, :disabled"))return;o=i(n),u=o.hasClass("open");if(!u||u&&t.keyCode==27)return n.click();r=e("[role=menu] li:not(.divider) a",o);if(!r.length)return;a=r.index(r.filter(":focus")),t.keyCode==38&&a>0&&a--,t.keyCode==40&&a').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,e.proxy(this.removeBackdrop,this)):this.removeBackdrop()):t&&t()}},e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e(function(){e("body").on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):this.options.trigger!="manual"&&(i=this.options.trigger=="hover"?"mouseenter":"focus",s=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this))),this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,t,this.$element.data()),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);if(!n.options.delay||!n.options.delay.show)return n.show();clearTimeout(this.timeout),n.hoverState="in",this.timeout=setTimeout(function(){n.hoverState=="in"&&n.show()},n.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var e,t,n,r,i,s,o;if(this.hasContent()&&this.enabled){e=this.tip(),this.setContent(),this.options.animation&&e.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,t=/in/.test(s),e.remove().css({top:0,left:0,display:"block"}).appendTo(t?this.$element:document.body),n=this.getPosition(t),r=e[0].offsetWidth,i=e[0].offsetHeight;switch(t?s.split(" ")[1]:s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}e.css(o).addClass(s).addClass("in")}},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function r(){var t=setTimeout(function(){n.off(e.support.transition.end).remove()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.remove()})}var t=this,n=this.tip();return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?r():n.remove(),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(t){return e.extend({},t?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'
',trigger:"hover",title:"",delay:0,html:!0}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content > *")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-content")||(typeof n.content=="function"?n.content.call(t[0]):n.content),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'

'})}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var t=e(this),n=t.data("target")||t.attr("href"),r=/^#\w/.test(n)&&e(n);return r&&r.length&&[[r.position().top,n]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}},e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active a").last()[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}},e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e(function(){e("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=e(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:t.top+t.height,left:t.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length"+t+""})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),(e.browser.webkit||e.browser.msie)&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this))},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=!~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(e){var t=this;setTimeout(function(){t.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(t){this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")}},e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'',item:'
  • ',minLength:1},e.fn.typeahead.Constructor=t,e(function(){e("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;t.preventDefault(),n.typeahead(n.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))},e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery); -if (window.SimplePace) { - window.SimplePace.add(20); -} +if (window.SimplePace) { + window.SimplePace.add(20); +} diff --git a/rainloop/v/1.3.10.492/static/services/amazon.png b/rainloop/v/0.0.0/static/services/amazon.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/amazon.png rename to rainloop/v/0.0.0/static/services/amazon.png diff --git a/rainloop/v/1.3.10.492/static/services/apple.jpg b/rainloop/v/0.0.0/static/services/apple.jpg similarity index 100% rename from rainloop/v/1.3.10.492/static/services/apple.jpg rename to rainloop/v/0.0.0/static/services/apple.jpg diff --git a/rainloop/v/1.3.10.492/static/services/asana.png b/rainloop/v/0.0.0/static/services/asana.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/asana.png rename to rainloop/v/0.0.0/static/services/asana.png diff --git a/rainloop/v/1.3.10.492/static/services/battle.net.png b/rainloop/v/0.0.0/static/services/battle.net.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/battle.net.png rename to rainloop/v/0.0.0/static/services/battle.net.png diff --git a/rainloop/v/1.3.10.492/static/services/cnet.jpg b/rainloop/v/0.0.0/static/services/cnet.jpg similarity index 100% rename from rainloop/v/1.3.10.492/static/services/cnet.jpg rename to rainloop/v/0.0.0/static/services/cnet.jpg diff --git a/rainloop/v/1.3.10.492/static/services/ea.png b/rainloop/v/0.0.0/static/services/ea.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/ea.png rename to rainloop/v/0.0.0/static/services/ea.png diff --git a/rainloop/v/1.3.10.492/static/services/ebay.jpg b/rainloop/v/0.0.0/static/services/ebay.jpg similarity index 100% rename from rainloop/v/1.3.10.492/static/services/ebay.jpg rename to rainloop/v/0.0.0/static/services/ebay.jpg diff --git a/rainloop/v/1.3.10.492/static/services/facebook.png b/rainloop/v/0.0.0/static/services/facebook.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/facebook.png rename to rainloop/v/0.0.0/static/services/facebook.png diff --git a/rainloop/v/1.3.10.492/static/services/github.png b/rainloop/v/0.0.0/static/services/github.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/github.png rename to rainloop/v/0.0.0/static/services/github.png diff --git a/rainloop/v/1.3.10.492/static/services/google-plus.png b/rainloop/v/0.0.0/static/services/google-plus.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/google-plus.png rename to rainloop/v/0.0.0/static/services/google-plus.png diff --git a/rainloop/v/1.3.10.492/static/services/google.png b/rainloop/v/0.0.0/static/services/google.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/google.png rename to rainloop/v/0.0.0/static/services/google.png diff --git a/rainloop/v/1.3.10.492/static/services/icloud.jpg b/rainloop/v/0.0.0/static/services/icloud.jpg similarity index 100% rename from rainloop/v/1.3.10.492/static/services/icloud.jpg rename to rainloop/v/0.0.0/static/services/icloud.jpg diff --git a/rainloop/v/1.3.10.492/static/services/microsoft.jpg b/rainloop/v/0.0.0/static/services/microsoft.jpg similarity index 100% rename from rainloop/v/1.3.10.492/static/services/microsoft.jpg rename to rainloop/v/0.0.0/static/services/microsoft.jpg diff --git a/rainloop/v/1.3.10.492/static/services/myspace.png b/rainloop/v/0.0.0/static/services/myspace.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/myspace.png rename to rainloop/v/0.0.0/static/services/myspace.png diff --git a/rainloop/v/1.3.10.492/static/services/onlive.png b/rainloop/v/0.0.0/static/services/onlive.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/onlive.png rename to rainloop/v/0.0.0/static/services/onlive.png diff --git a/rainloop/v/1.3.10.492/static/services/paypal.jpg b/rainloop/v/0.0.0/static/services/paypal.jpg similarity index 100% rename from rainloop/v/1.3.10.492/static/services/paypal.jpg rename to rainloop/v/0.0.0/static/services/paypal.jpg diff --git a/rainloop/v/1.3.10.492/static/services/skype.png b/rainloop/v/0.0.0/static/services/skype.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/skype.png rename to rainloop/v/0.0.0/static/services/skype.png diff --git a/rainloop/v/1.3.10.492/static/services/steam.png b/rainloop/v/0.0.0/static/services/steam.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/steam.png rename to rainloop/v/0.0.0/static/services/steam.png diff --git a/rainloop/v/1.3.10.492/static/services/ted.png b/rainloop/v/0.0.0/static/services/ted.png similarity index 100% rename from rainloop/v/1.3.10.492/static/services/ted.png rename to rainloop/v/0.0.0/static/services/ted.png diff --git a/rainloop/v/1.3.10.492/static/services/twitter.jpg b/rainloop/v/0.0.0/static/services/twitter.jpg similarity index 100% rename from rainloop/v/1.3.10.492/static/services/twitter.jpg rename to rainloop/v/0.0.0/static/services/twitter.jpg diff --git a/rainloop/v/1.3.10.492/static/services/youtube.gif b/rainloop/v/0.0.0/static/services/youtube.gif similarity index 100% rename from rainloop/v/1.3.10.492/static/services/youtube.gif rename to rainloop/v/0.0.0/static/services/youtube.gif diff --git a/rainloop/v/1.3.10.492/static/sounds/new-mail.mp3 b/rainloop/v/0.0.0/static/sounds/new-mail.mp3 similarity index 100% rename from rainloop/v/1.3.10.492/static/sounds/new-mail.mp3 rename to rainloop/v/0.0.0/static/sounds/new-mail.mp3 diff --git a/rainloop/v/1.3.10.492/static/sounds/new-mail.ogg b/rainloop/v/0.0.0/static/sounds/new-mail.ogg similarity index 100% rename from rainloop/v/1.3.10.492/static/sounds/new-mail.ogg rename to rainloop/v/0.0.0/static/sounds/new-mail.ogg diff --git a/rainloop/v/1.3.10.492/themes/A/images/background.jpg b/rainloop/v/0.0.0/themes/A/images/background.jpg similarity index 100% rename from rainloop/v/1.3.10.492/themes/A/images/background.jpg rename to rainloop/v/0.0.0/themes/A/images/background.jpg diff --git a/rainloop/v/1.3.10.492/themes/A/images/preview.png b/rainloop/v/0.0.0/themes/A/images/preview.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/A/images/preview.png rename to rainloop/v/0.0.0/themes/A/images/preview.png diff --git a/rainloop/v/1.3.10.492/themes/A/styles.less b/rainloop/v/0.0.0/themes/A/styles.less similarity index 100% rename from rainloop/v/1.3.10.492/themes/A/styles.less rename to rainloop/v/0.0.0/themes/A/styles.less diff --git a/rainloop/v/1.3.10.492/themes/Clear/images/preview.png b/rainloop/v/0.0.0/themes/Clear/images/preview.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Clear/images/preview.png rename to rainloop/v/0.0.0/themes/Clear/images/preview.png diff --git a/rainloop/v/1.3.10.492/themes/Clear/styles.less b/rainloop/v/0.0.0/themes/Clear/styles.less similarity index 100% rename from rainloop/v/1.3.10.492/themes/Clear/styles.less rename to rainloop/v/0.0.0/themes/Clear/styles.less diff --git a/rainloop/v/1.3.10.492/themes/Custom/ext.less b/rainloop/v/0.0.0/themes/Custom/ext.less similarity index 100% rename from rainloop/v/1.3.10.492/themes/Custom/ext.less rename to rainloop/v/0.0.0/themes/Custom/ext.less diff --git a/rainloop/v/1.3.10.492/themes/Custom/images/preview.png b/rainloop/v/0.0.0/themes/Custom/images/preview.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Custom/images/preview.png rename to rainloop/v/0.0.0/themes/Custom/images/preview.png diff --git a/rainloop/v/1.3.10.492/themes/Default/images/background.jpg b/rainloop/v/0.0.0/themes/Default/images/background.jpg similarity index 100% rename from rainloop/v/1.3.10.492/themes/Default/images/background.jpg rename to rainloop/v/0.0.0/themes/Default/images/background.jpg diff --git a/rainloop/v/1.3.10.492/themes/Default/images/background.png b/rainloop/v/0.0.0/themes/Default/images/background.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Default/images/background.png rename to rainloop/v/0.0.0/themes/Default/images/background.png diff --git a/rainloop/v/1.3.10.492/themes/Default/images/preview.png b/rainloop/v/0.0.0/themes/Default/images/preview.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Default/images/preview.png rename to rainloop/v/0.0.0/themes/Default/images/preview.png diff --git a/rainloop/v/1.3.10.492/themes/Default/styles.less b/rainloop/v/0.0.0/themes/Default/styles.less similarity index 100% rename from rainloop/v/1.3.10.492/themes/Default/styles.less rename to rainloop/v/0.0.0/themes/Default/styles.less diff --git a/rainloop/v/1.3.10.492/themes/Linen/images/background.jpg b/rainloop/v/0.0.0/themes/Linen/images/background.jpg similarity index 100% rename from rainloop/v/1.3.10.492/themes/Linen/images/background.jpg rename to rainloop/v/0.0.0/themes/Linen/images/background.jpg diff --git a/rainloop/v/1.3.10.492/themes/Linen/images/background.png b/rainloop/v/0.0.0/themes/Linen/images/background.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Linen/images/background.png rename to rainloop/v/0.0.0/themes/Linen/images/background.png diff --git a/rainloop/v/1.3.10.492/themes/Linen/images/preview.png b/rainloop/v/0.0.0/themes/Linen/images/preview.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Linen/images/preview.png rename to rainloop/v/0.0.0/themes/Linen/images/preview.png diff --git a/rainloop/v/1.3.10.492/themes/Linen/styles.less b/rainloop/v/0.0.0/themes/Linen/styles.less similarity index 100% rename from rainloop/v/1.3.10.492/themes/Linen/styles.less rename to rainloop/v/0.0.0/themes/Linen/styles.less diff --git a/rainloop/v/1.3.10.492/themes/Love/images/background.jpg b/rainloop/v/0.0.0/themes/Love/images/background.jpg similarity index 100% rename from rainloop/v/1.3.10.492/themes/Love/images/background.jpg rename to rainloop/v/0.0.0/themes/Love/images/background.jpg diff --git a/rainloop/v/1.3.10.492/themes/Love/images/preview.png b/rainloop/v/0.0.0/themes/Love/images/preview.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Love/images/preview.png rename to rainloop/v/0.0.0/themes/Love/images/preview.png diff --git a/rainloop/v/1.3.10.492/themes/Love/styles.less b/rainloop/v/0.0.0/themes/Love/styles.less similarity index 100% rename from rainloop/v/1.3.10.492/themes/Love/styles.less rename to rainloop/v/0.0.0/themes/Love/styles.less diff --git a/rainloop/v/1.3.10.492/themes/Snow/images/background.jpg b/rainloop/v/0.0.0/themes/Snow/images/background.jpg similarity index 100% rename from rainloop/v/1.3.10.492/themes/Snow/images/background.jpg rename to rainloop/v/0.0.0/themes/Snow/images/background.jpg diff --git a/rainloop/v/1.3.10.492/themes/Snow/images/preview.png b/rainloop/v/0.0.0/themes/Snow/images/preview.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Snow/images/preview.png rename to rainloop/v/0.0.0/themes/Snow/images/preview.png diff --git a/rainloop/v/1.3.10.492/themes/Snow/styles.less b/rainloop/v/0.0.0/themes/Snow/styles.less similarity index 100% rename from rainloop/v/1.3.10.492/themes/Snow/styles.less rename to rainloop/v/0.0.0/themes/Snow/styles.less diff --git a/rainloop/v/1.3.10.492/themes/Squares/images/background.jpg b/rainloop/v/0.0.0/themes/Squares/images/background.jpg similarity index 100% rename from rainloop/v/1.3.10.492/themes/Squares/images/background.jpg rename to rainloop/v/0.0.0/themes/Squares/images/background.jpg diff --git a/rainloop/v/1.3.10.492/themes/Squares/images/background.png b/rainloop/v/0.0.0/themes/Squares/images/background.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Squares/images/background.png rename to rainloop/v/0.0.0/themes/Squares/images/background.png diff --git a/rainloop/v/1.3.10.492/themes/Squares/images/preview.png b/rainloop/v/0.0.0/themes/Squares/images/preview.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Squares/images/preview.png rename to rainloop/v/0.0.0/themes/Squares/images/preview.png diff --git a/rainloop/v/1.3.10.492/themes/Squares/styles.less b/rainloop/v/0.0.0/themes/Squares/styles.less similarity index 100% rename from rainloop/v/1.3.10.492/themes/Squares/styles.less rename to rainloop/v/0.0.0/themes/Squares/styles.less diff --git a/rainloop/v/1.3.10.492/themes/SquaresDark/images/background.jpg b/rainloop/v/0.0.0/themes/SquaresDark/images/background.jpg similarity index 100% rename from rainloop/v/1.3.10.492/themes/SquaresDark/images/background.jpg rename to rainloop/v/0.0.0/themes/SquaresDark/images/background.jpg diff --git a/rainloop/v/1.3.10.492/themes/SquaresDark/images/background.png b/rainloop/v/0.0.0/themes/SquaresDark/images/background.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/SquaresDark/images/background.png rename to rainloop/v/0.0.0/themes/SquaresDark/images/background.png diff --git a/rainloop/v/1.3.10.492/themes/SquaresDark/images/preview.png b/rainloop/v/0.0.0/themes/SquaresDark/images/preview.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/SquaresDark/images/preview.png rename to rainloop/v/0.0.0/themes/SquaresDark/images/preview.png diff --git a/rainloop/v/1.3.10.492/themes/SquaresDark/styles.less b/rainloop/v/0.0.0/themes/SquaresDark/styles.less similarity index 100% rename from rainloop/v/1.3.10.492/themes/SquaresDark/styles.less rename to rainloop/v/0.0.0/themes/SquaresDark/styles.less diff --git a/rainloop/v/1.3.10.492/themes/Stripes/images/background.jpg b/rainloop/v/0.0.0/themes/Stripes/images/background.jpg similarity index 100% rename from rainloop/v/1.3.10.492/themes/Stripes/images/background.jpg rename to rainloop/v/0.0.0/themes/Stripes/images/background.jpg diff --git a/rainloop/v/1.3.10.492/themes/Stripes/images/preview.png b/rainloop/v/0.0.0/themes/Stripes/images/preview.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Stripes/images/preview.png rename to rainloop/v/0.0.0/themes/Stripes/images/preview.png diff --git a/rainloop/v/1.3.10.492/themes/Stripes/styles.less b/rainloop/v/0.0.0/themes/Stripes/styles.less similarity index 100% rename from rainloop/v/1.3.10.492/themes/Stripes/styles.less rename to rainloop/v/0.0.0/themes/Stripes/styles.less diff --git a/rainloop/v/1.3.10.492/themes/Wood/images/background.jpg b/rainloop/v/0.0.0/themes/Wood/images/background.jpg similarity index 100% rename from rainloop/v/1.3.10.492/themes/Wood/images/background.jpg rename to rainloop/v/0.0.0/themes/Wood/images/background.jpg diff --git a/rainloop/v/1.3.10.492/themes/Wood/images/background.png b/rainloop/v/0.0.0/themes/Wood/images/background.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Wood/images/background.png rename to rainloop/v/0.0.0/themes/Wood/images/background.png diff --git a/rainloop/v/1.3.10.492/themes/Wood/images/preview.png b/rainloop/v/0.0.0/themes/Wood/images/preview.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Wood/images/preview.png rename to rainloop/v/0.0.0/themes/Wood/images/preview.png diff --git a/rainloop/v/1.3.10.492/themes/Wood/styles.less b/rainloop/v/0.0.0/themes/Wood/styles.less similarity index 100% rename from rainloop/v/1.3.10.492/themes/Wood/styles.less rename to rainloop/v/0.0.0/themes/Wood/styles.less diff --git a/rainloop/v/1.3.10.492/themes/Xv/images/background.jpg b/rainloop/v/0.0.0/themes/Xv/images/background.jpg similarity index 100% rename from rainloop/v/1.3.10.492/themes/Xv/images/background.jpg rename to rainloop/v/0.0.0/themes/Xv/images/background.jpg diff --git a/rainloop/v/1.3.10.492/themes/Xv/images/background.png b/rainloop/v/0.0.0/themes/Xv/images/background.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Xv/images/background.png rename to rainloop/v/0.0.0/themes/Xv/images/background.png diff --git a/rainloop/v/1.3.10.492/themes/Xv/images/preview.png b/rainloop/v/0.0.0/themes/Xv/images/preview.png similarity index 100% rename from rainloop/v/1.3.10.492/themes/Xv/images/preview.png rename to rainloop/v/0.0.0/themes/Xv/images/preview.png diff --git a/rainloop/v/1.3.10.492/themes/Xv/styles.less b/rainloop/v/0.0.0/themes/Xv/styles.less similarity index 100% rename from rainloop/v/1.3.10.492/themes/Xv/styles.less rename to rainloop/v/0.0.0/themes/Xv/styles.less diff --git a/rainloop/v/1.3.10.492/LICENSE b/rainloop/v/1.3.10.492/LICENSE deleted file mode 100644 index 811d92d57..000000000 --- a/rainloop/v/1.3.10.492/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Creative Commons — Attribution-NonCommercial-ShareAlike 3.0 Unported — CC BY-NC-SA 3.0 -(http://creativecommons.org/licenses/by-nc-sa/3.0/) - -You are free: - - to Share — to copy, distribute and transmit the work - to Remix — to adapt the work - -Under the following conditions: - - Attribution — You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). - Noncommercial — You may not use this work for commercial purposes. - Share Alike — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one. - -With the understanding that: - - Waiver — Any of the above conditions can be waived if you get permission from the copyright holder. - Public Domain — Where the work or any of its elements is in the public domain under applicable law, that status is in no way affected by the license. - -Other Rights — In no way are any of the following rights affected by the license: - Your fair dealing or fair use rights, or other applicable copyright exceptions and limitations; - The author's moral rights; - Rights other persons may have either in the work itself or in how the work is used, such as publicity or privacy rights. - -Notice — For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to this web page. \ No newline at end of file diff --git a/rainloop/v/1.3.10.492/VERSION b/rainloop/v/1.3.10.492/VERSION deleted file mode 100644 index 993a408ca..000000000 --- a/rainloop/v/1.3.10.492/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.3.10.492 \ No newline at end of file diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage.php b/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage.php deleted file mode 100644 index 80358a9ca..000000000 --- a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage.php +++ /dev/null @@ -1,195 +0,0 @@ -oDriver = $oDriver; - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $iStorageType - * @param string $sValue - * - * @return bool - */ - public function Put($oAccount, $iStorageType, $sKey, $sValue) - { - if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY !== $iStorageType && !($oAccount instanceof \RainLoop\Account)) - { - return false; - } - - return $this->oDriver->Put($oAccount, $iStorageType, $sKey, $sValue); - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * @param resource $rSource - * - * @return bool - */ - public function PutFile($oAccount, $iStorageType, $sKey, $rSource) - { - if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY !== $iStorageType && !($oAccount instanceof \RainLoop\Account)) - { - return false; - } - - return $this->oDriver->PutFile($oAccount, $iStorageType, $sKey, $rSource); - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * @param string $sSource - * - * @return bool - */ - public function MoveUploadedFile($oAccount, $iStorageType, $sKey, $sSource) - { - if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY !== $iStorageType && !($oAccount instanceof \RainLoop\Account)) - { - return false; - } - - return $this->oDriver->MoveUploadedFile($oAccount, $iStorageType, $sKey, $sSource); - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * @param mixed $mDefault = false - * - * @return mixed - */ - public function Get($oAccount, $iStorageType, $sKey, $mDefault = false) - { - if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY !== $iStorageType && !($oAccount instanceof \RainLoop\Account)) - { - return $mDefault; - } - - return $this->oDriver->Get($oAccount, $iStorageType, $sKey, $mDefault); - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * @param string $sOpenMode = 'rb' - * - * @return resource | bool - */ - public function GetFile($oAccount, $iStorageType, $sKey, $sOpenMode = 'rb') - { - if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY !== $iStorageType && !($oAccount instanceof \RainLoop\Account)) - { - return false; - } - - return $this->oDriver->GetFile($oAccount, $iStorageType, $sKey, $sOpenMode); - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * - * @return string | bool - */ - public function GetFileName($oAccount, $iStorageType, $sKey) - { - if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY !== $iStorageType && !($oAccount instanceof \RainLoop\Account)) - { - return false; - } - - return $this->oDriver->GetFileName($oAccount, $iStorageType, $sKey); - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * - * @return bool - */ - public function Clear($oAccount, $iStorageType, $sKey) - { - if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY !== $iStorageType && !($oAccount instanceof \RainLoop\Account)) - { - return false; - } - - return $this->oDriver->Clear($oAccount, $iStorageType, $sKey); - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * - * @return int | bool - */ - public function FileSize($oAccount, $iStorageType, $sKey) - { - if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY !== $iStorageType && !($oAccount instanceof \RainLoop\Account)) - { - return false; - } - - return $this->oDriver->FileSize($oAccount, $iStorageType, $sKey); - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * - * @return bool - */ - public function FileExists($oAccount, $iStorageType, $sKey) - { - if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY !== $iStorageType && !($oAccount instanceof \RainLoop\Account)) - { - return false; - } - - return $this->oDriver->FileExists($oAccount, $iStorageType, $sKey); - } - - /** - * @param int $iTimeToClearInHours = 24 - * - * @return bool - */ - public function GC($iTimeToClearInHours = 24) - { - return $this->oDriver ? $this->oDriver->GC($iTimeToClearInHours) : false; - } - - /** - * @return bool - */ - public function IsActive() - { - return $this->oDriver instanceof \RainLoop\Providers\Storage\StorageInterface; - } -} diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/DefaultStorage.php b/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/DefaultStorage.php deleted file mode 100644 index 641425e0c..000000000 --- a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/DefaultStorage.php +++ /dev/null @@ -1,290 +0,0 @@ -sDataPath = \rtrim(\trim($sStoragePath), '\\/'); - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * @param string $sValue - * - * @return bool - */ - public function Put($oAccount, $iStorageType, $sKey, $sValue) - { - return false !== @\file_put_contents( - $this->generateFileName($oAccount, $iStorageType, $sKey, true), $sValue); - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * @param resource $rSource - * - * @return bool - */ - public function PutFile($oAccount, $iStorageType, $sKey, $rSource) - { - $bResult = false; - if ($rSource) - { - $rOpenOutput = @\fopen($this->generateFileName($oAccount, $iStorageType, $sKey, true), 'w+b'); - if ($rOpenOutput) - { - $bResult = (false !== \MailSo\Base\Utils::MultipleStreamWriter($rSource, array($rOpenOutput))); - @\fclose($rOpenOutput); - } - } - return $bResult; - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * @param string $sSource - * - * @return bool - */ - public function MoveUploadedFile($oAccount, $iStorageType, $sKey, $sSource) - { - return @\move_uploaded_file($sSource, - $this->generateFileName($oAccount, $iStorageType, $sKey, true)); - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sSource - * @param string $sDest - * - * @return bool - */ - public function SaveFileToBase64File($oAccount, $iStorageType, $sSource, $sDest) - { - $bResult = false; - $rOpenInput = @\fopen($this->generateFileName($oAccount, $iStorageType, $sSource), 'rb'); - $rOpenOutput = @\fopen($this->generateFileName($oAccount, $iStorageType, $sDest, true), 'wb'); - - if ($rOpenInput && $rOpenOutput) - { - $aParam = array('line-length' => 76, 'line-break-chars' => "\r\n"); - $rFilter = @\stream_filter_append($rOpenOutput, 'convert.base64-encode', STREAM_FILTER_WRITE, $aParam); - if (@\is_resource($rFilter)) - { - $bResult = true; - } - } - - if ($bResult) - { - $bResult = (false !== \MailSo\Base\Utils::MultipleStreamWriter($rOpenInput, array($rOpenOutput))); - } - - if ($rOpenInput && $rOpenOutput) - { - @\fclose($rOpenInput); - @\fclose($rOpenOutput); - } - - return $bResult; - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * @param mixed $mDefault = false - * - * @return mixed - */ - public function Get($oAccount, $iStorageType, $sKey, $mDefault = false) - { - $mValue = false; - $sFileName = $this->generateFileName($oAccount, $iStorageType, $sKey); - if (\file_exists($sFileName)) - { - $mValue = \file_get_contents($sFileName); - } - - return false === $mValue ? $mDefault : $mValue; - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * @param string $sOpenMode = 'rb' - * - * @return resource | bool - */ - public function GetFile($oAccount, $iStorageType, $sKey, $sOpenMode = 'rb') - { - $mResult = false; - $bCreate = !!\preg_match('/[wac]/', $sOpenMode); - - $sFileName = $this->generateFileName($oAccount, $iStorageType, $sKey, $bCreate); - if ($bCreate || \file_exists($sFileName)) - { - $mResult = @\fopen($sFileName, $sOpenMode); - } - - return $mResult; - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * - * @return string | bool - */ - public function GetFileName($oAccount, $iStorageType, $sKey) - { - $mResult = false; - $sFileName = $this->generateFileName($oAccount, $iStorageType, $sKey); - if (\file_exists($sFileName)) - { - $mResult = $sFileName; - } - - return $mResult; - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * - * @return bool - */ - public function Clear($oAccount, $iStorageType, $sKey) - { - $mResult = true; - $sFileName = $this->generateFileName($oAccount, $iStorageType, $sKey); - if (\file_exists($sFileName)) - { - $mResult = @\unlink($sFileName); - } - - return $mResult; - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * - * @return int | bool - */ - public function FileSize($oAccount, $iStorageType, $sKey) - { - $mResult = false; - $sFileName = $this->generateFileName($oAccount, $iStorageType, $sKey); - if (\file_exists($sFileName)) - { - $mResult = \filesize($sFileName); - } - - return $mResult; - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iType - * @param string $sKey - * - * @return bool - */ - public function FileExists($oAccount, $iStorageType, $sKey) - { - return @\file_exists($this->generateFileName($oAccount, $iStorageType, $sKey)); - } - - /** - * @param int $iTimeToClearInHours = 24 - * - * @return bool - */ - public function GC($iTimeToClearInHours = 24) - { - if (0 < $iTimeToClearInHours) - { - \MailSo\Base\Utils::RecTimeDirRemove($this->sDataPath.'/tmp', 60 * 60 * $iTimeToClearInHours, \time()); - return true; - } - - return false; - } - - /** - * @param \RainLoop\Account|null $oAccount - * @param int $iStorageType - * @param string $sKey - * @param bool $bMkDir = false - * - * @return string - */ - private function generateFileName($oAccount, $iStorageType, $sKey, $bMkDir = false) - { - $sEmail = $oAccount ? \preg_replace('/[^a-z0-9\-\.@]+/', '_', - ('' === $oAccount->ParentEmail() ? '' : $oAccount->ParentEmail().'/').$oAccount->Email()) : ''; - - $sTypePath = $sKeyPath = ''; - switch ($iStorageType) - { - case \RainLoop\Providers\Storage\Enumerations\StorageType::TEMP: - $sTypePath = 'tmp'; - $sKeyPath = \md5($sKey); - $sKeyPath = \substr($sKeyPath, 0, 2).'/'.$sKeyPath; - break; - case \RainLoop\Providers\Storage\Enumerations\StorageType::USER: - case \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY: - $sTypePath = 'data'; - $sKeyPath = \md5($sKey); - $sKeyPath = \substr($sKeyPath, 0, 2).'/'.$sKeyPath; - break; - case \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG: - $sTypePath = 'cfg'; - $sKeyPath = \preg_replace('/[_]+/', '_', \preg_replace('/[^a-zA-Z0-9\/]/', '_', $sKey)); - break; - } - - if (\RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY === $iStorageType) - { - $sFilePath = $this->sDataPath.'/'.$sTypePath.'/__nobody__/'.$sKeyPath; - } - else if (!empty($sEmail)) - { - $sFilePath = $this->sDataPath.'/'.$sTypePath.'/'.rtrim(substr($sEmail, 0, 2), '@').'/'.$sEmail.'/'.$sKeyPath; - } - - if ($bMkDir && !empty($sFilePath) && !@\is_dir(\dirname($sFilePath))) - { - if (!@\mkdir(\dirname($sFilePath), 0755, true)) - { - throw new \RainLoop\Exceptions\Exception('Can\'t make storage directory "'.$sFilePath.'"'); - } - } - - return $sFilePath; - } -} diff --git a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/StorageInterface.php b/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/StorageInterface.php deleted file mode 100644 index 5a45ead8d..000000000 --- a/rainloop/v/1.3.10.492/app/libraries/RainLoop/Providers/Storage/StorageInterface.php +++ /dev/null @@ -1,109 +0,0 @@ -.select2-chosen{margin-right:26px;display:block;overflow:hidden;white-space:nowrap;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis}.select2-container .select2-choice abbr{display:none;width:12px;height:12px;position:absolute;right:24px;top:8px;font-size:1px;text-decoration:none;border:0;background:url(select2.png) right top no-repeat;cursor:pointer;outline:0}.select2-container.select2-allowclear .select2-choice abbr{display:inline-block}.select2-container .select2-choice abbr:hover{background-position:right -11px;cursor:pointer}.select2-drop-undermask{border:0;margin:0;padding:0;position:absolute;left:0;top:0;z-index:9998;background-color:transparent;filter:alpha(opacity=0)}.select2-drop-mask{border:0;margin:0;padding:0;position:absolute;left:0;top:0;z-index:9998;background-color:#fff;opacity:0;filter:alpha(opacity=0)}.select2-drop{width:100%;margin-top:-1px;position:absolute;z-index:9999;top:100%;background:#fff;color:#000;border:1px solid #aaa;border-top:0;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;-webkit-box-shadow:0 4px 5px rgba(0,0,0,.15);-moz-box-shadow:0 4px 5px rgba(0,0,0,.15);box-shadow:0 4px 5px rgba(0,0,0,.15)}.select2-drop-auto-width{border-top:1px solid #aaa;width:auto}.select2-drop-auto-width .select2-search{padding-top:4px}.select2-drop.select2-drop-above{margin-top:1px;border-top:1px solid #aaa;border-bottom:0;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;-webkit-box-shadow:0 -4px 5px rgba(0,0,0,.15);-moz-box-shadow:0 -4px 5px rgba(0,0,0,.15);box-shadow:0 -4px 5px rgba(0,0,0,.15)}.select2-drop-active{border:1px solid #5897fb;border-top:0}.select2-drop.select2-drop-above.select2-drop-active{border-top:1px solid #5897fb}.select2-container .select2-choice .select2-arrow{display:inline-block;width:18px;height:100%;position:absolute;right:0;top:0;border-left:1px solid #aaa;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;background:#ccc;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#ccc),color-stop(0.6,#eee));background-image:-webkit-linear-gradient(center bottom,#ccc 0,#eee 60%);background-image:-moz-linear-gradient(center bottom,#ccc 0,#eee 60%);background-image:-o-linear-gradient(bottom,#ccc 0,#eee 60%);background-image:-ms-linear-gradient(top,#ccc 0,#eee 60%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#cccccc', GradientType=0);background-image:linear-gradient(top,#ccc 0,#eee 60%)}.select2-container .select2-choice .select2-arrow b{display:block;width:100%;height:100%;background:url(select2.png) no-repeat 0 1px}.select2-search{display:inline-block;width:100%;min-height:26px;margin:0;padding-left:4px;padding-right:4px;position:relative;z-index:10000;white-space:nowrap}.select2-search input{width:100%;height:auto!important;min-height:26px;padding:4px 20px 4px 5px;margin:0;outline:0;font-family:sans-serif;font-size:1em;border:1px solid #aaa;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:#fff url(select2.png) no-repeat 100% -22px;background:url(select2.png) no-repeat 100% -22px,-webkit-gradient(linear,left bottom,left top,color-stop(0.85,#fff),color-stop(0.99,#eee));background:url(select2.png) no-repeat 100% -22px,-webkit-linear-gradient(center bottom,#fff 85%,#eee 99%);background:url(select2.png) no-repeat 100% -22px,-moz-linear-gradient(center bottom,#fff 85%,#eee 99%);background:url(select2.png) no-repeat 100% -22px,-o-linear-gradient(bottom,#fff 85%,#eee 99%);background:url(select2.png) no-repeat 100% -22px,-ms-linear-gradient(top,#fff 85%,#eee 99%);background:url(select2.png) no-repeat 100% -22px,linear-gradient(top,#fff 85%,#eee 99%)}.select2-drop.select2-drop-above .select2-search input{margin-top:4px}.select2-search input.select2-active{background:#fff url(select2-spinner.gif) no-repeat 100%;background:url(select2-spinner.gif) no-repeat 100%,-webkit-gradient(linear,left bottom,left top,color-stop(0.85,#fff),color-stop(0.99,#eee));background:url(select2-spinner.gif) no-repeat 100%,-webkit-linear-gradient(center bottom,#fff 85%,#eee 99%);background:url(select2-spinner.gif) no-repeat 100%,-moz-linear-gradient(center bottom,#fff 85%,#eee 99%);background:url(select2-spinner.gif) no-repeat 100%,-o-linear-gradient(bottom,#fff 85%,#eee 99%);background:url(select2-spinner.gif) no-repeat 100%,-ms-linear-gradient(top,#fff 85%,#eee 99%);background:url(select2-spinner.gif) no-repeat 100%,linear-gradient(top,#fff 85%,#eee 99%)}.select2-container-active .select2-choice,.select2-container-active .select2-choices{border:1px solid #5897fb;outline:0;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);-moz-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.select2-dropdown-open .select2-choice{border-bottom-color:transparent;-webkit-box-shadow:0 1px 0 #fff inset;-moz-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;background-color:#eee;background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#fff),color-stop(0.5,#eee));background-image:-webkit-linear-gradient(center bottom,#fff 0,#eee 50%);background-image:-moz-linear-gradient(center bottom,#fff 0,#eee 50%);background-image:-o-linear-gradient(bottom,#fff 0,#eee 50%);background-image:-ms-linear-gradient(top,#fff 0,#eee 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);background-image:linear-gradient(top,#fff 0,#eee 50%)}.select2-dropdown-open.select2-drop-above .select2-choice,.select2-dropdown-open.select2-drop-above .select2-choices{border:1px solid #5897fb;border-top-color:transparent;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(0.5,#eee));background-image:-webkit-linear-gradient(center top,#fff 0,#eee 50%);background-image:-moz-linear-gradient(center top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:-ms-linear-gradient(bottom,#fff 0,#eee 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);background-image:linear-gradient(bottom,#fff 0,#eee 50%)}.select2-dropdown-open .select2-choice .select2-arrow{background:transparent;border-left:0;filter:none}.select2-dropdown-open .select2-choice .select2-arrow b{background-position:-18px 1px}.select2-results{max-height:200px;padding:0 0 0 4px;margin:4px 4px 4px 0;position:relative;overflow-x:hidden;overflow-y:auto;-webkit-tap-highlight-color:rgba(0,0,0,0)}.select2-results ul.select2-result-sub{margin:0;padding-left:0}.select2-results ul.select2-result-sub>li .select2-result-label{padding-left:20px}.select2-results ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:40px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:60px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:80px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:100px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:110px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:120px}.select2-results li{list-style:none;display:list-item;background-image:none}.select2-results li.select2-result-with-children>.select2-result-label{font-weight:700}.select2-results .select2-result-label{padding:3px 7px 4px;margin:0;cursor:pointer;min-height:1em;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select2-results .select2-highlighted{background:#3875d7;color:#fff}.select2-results li em{background:#feffde;font-style:normal}.select2-results .select2-highlighted em{background:transparent}.select2-results .select2-highlighted ul{background:#fff;color:#000}.select2-results .select2-no-results,.select2-results .select2-searching,.select2-results .select2-selection-limit{background:#f4f4f4;display:list-item}.select2-results .select2-disabled.select2-highlighted{color:#666;background:#f4f4f4;display:list-item;cursor:default}.select2-results .select2-disabled{background:#f4f4f4;display:list-item;cursor:default}.select2-results .select2-selected{display:none}.select2-more-results.select2-active{background:#f4f4f4 url(select2-spinner.gif) no-repeat 100%}.select2-more-results{background:#f4f4f4;display:list-item}.select2-container.select2-container-disabled .select2-choice{background-color:#f4f4f4;background-image:none;border:1px solid #ddd;cursor:default}.select2-container.select2-container-disabled .select2-choice .select2-arrow{background-color:#f4f4f4;background-image:none;border-left:0}.select2-container.select2-container-disabled .select2-choice abbr{display:none}.select2-container-multi .select2-choices{height:auto!important;height:1%;margin:0;padding:0;position:relative;border:1px solid #aaa;cursor:text;overflow:hidden;background-color:#fff;background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(1%,#eee),color-stop(15%,#fff));background-image:-webkit-linear-gradient(top,#eee 1%,#fff 15%);background-image:-moz-linear-gradient(top,#eee 1%,#fff 15%);background-image:-o-linear-gradient(top,#eee 1%,#fff 15%);background-image:-ms-linear-gradient(top,#eee 1%,#fff 15%);background-image:linear-gradient(top,#eee 1%,#fff 15%)}.select2-locked{padding:3px 5px!important}.select2-container-multi .select2-choices{min-height:26px}.select2-container-multi.select2-container-active .select2-choices{border:1px solid #5897fb;outline:0;-webkit-box-shadow:0 0 5px rgba(0,0,0,.3);-moz-box-shadow:0 0 5px rgba(0,0,0,.3);box-shadow:0 0 5px rgba(0,0,0,.3)}.select2-container-multi .select2-choices li{float:left;list-style:none}.select2-container-multi .select2-choices .select2-search-field{margin:0;padding:0;white-space:nowrap}.select2-container-multi .select2-choices .select2-search-field input{padding:5px;margin:1px 0;font-family:sans-serif;font-size:100%;color:#666;outline:0;border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;background:transparent!important}.select2-container-multi .select2-choices .select2-search-field input.select2-active{background:#fff url(select2-spinner.gif) no-repeat 100%!important}.select2-default{color:#999!important}.select2-container-multi .select2-choices .select2-search-choice{padding:3px 5px 3px 18px;margin:3px 0 3px 5px;position:relative;line-height:13px;color:#333;cursor:default;border:1px solid #aaa;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);-moz-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#e4e4e4;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-ms-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%)}.select2-container-multi .select2-choices .select2-search-choice .select2-chosen{cursor:default}.select2-container-multi .select2-choices .select2-search-choice-focus{background:#d4d4d4}.select2-search-choice-close{display:block;width:12px;height:13px;position:absolute;right:3px;top:4px;font-size:1px;outline:0;background:url(select2.png) right top no-repeat}.select2-container-multi .select2-search-choice-close{left:3px}.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover{background-position:right -11px}.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close{background-position:right -11px}.select2-container-multi.select2-container-disabled .select2-choices{background-color:#f4f4f4;background-image:none;border:1px solid #ddd;cursor:default}.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice{padding:3px 5px;border:1px solid #ddd;background-image:none;background-color:#f4f4f4}.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close{display:none;background:0}.select2-result-selectable .select2-match,.select2-result-unselectable .select2-match{text-decoration:underline}.select2-offscreen,.select2-offscreen:focus{clip:rect(0 0 0 0);width:1px;height:1px;border:0;margin:0;padding:0;overflow:hidden;position:absolute;outline:0;left:0}.select2-display-none{display:none}.select2-measure-scrollbar{position:absolute;top:-10000px;left:-10000px;width:100px;height:100px;overflow:scroll}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:144dpi){.select2-search input,.select2-search-choice-close,.select2-container .select2-choice abbr,.select2-container .select2-choice .select2-arrow b{background-image:url(select2x2.png)!important;background-repeat:no-repeat!important;background-size:60px 40px!important}.select2-search input{background-position:100% -21px!important}}.nano{overflow :hidden!important}.nano .content{position :absolute;overflow :scroll;top :0;right :0;bottom :0;left :0;-webkit-overflow-scrolling:touch}.nano .content .content-wrapper{height:100%}.nano .content::-webkit-scrollbar{visibility:hidden}.has-scrollbar .content::-webkit-scrollbar{visibility:hidden}.nano-visibility-hidden::-webkit-scrollbar{visibility:hidden}.nano>.pane{background :none;position :absolute;width :5px;right :0;top :1px;bottom :1px;opacity :.01;filter:alpha(opacity=1);-webkit-transition :.4s;-moz-transition :.4s;-o-transition :.4s;transition :.4s;-moz-border-radius :5px;-webkit-border-radius :5px;border-radius :5px;z-index:10000;margin :2px}.nano>.pane2{background :none;position :absolute;height :5px;right :1px;left :1px;bottom :0;opacity :.01;filter:alpha(opacity=1);-webkit-transition :.4s;-moz-transition :.4s;-o-transition :.4s;transition :.4s;-moz-border-radius :5px;-webkit-border-radius :5px;border-radius :5px;z-index:10000;margin :2px}.nano>.pane>.slider{background-color:#999;background-color:rgba(0,0,0,.3);position :relative;margin :0;-moz-border-radius :3px;-webkit-border-radius :3px;border-radius :3px;width :5px}.nano>.pane2>.slider2{background-color:#999;background-color:rgba(0,0,0,.3);position :relative;margin :0;-moz-border-radius :3px;-webkit-border-radius :3px;border-radius :3px;height :5px}.nano:hover>.pane,.nano:hover>.pane2,.pane.active,.pane2.active,.pane.flashed,.pane2.flashed{visibility :visible\9;opacity :.99;filter:alpha(opacity=99)}.nano>.pane:hover,.nano>.pane.active{background-color:rgba(0,0,0,.15)}.nano>.pane2:hover,.nano>.pane2.active{background-color:rgba(0,0,0,.15)}.nano>.pane:hover>.slider,.nano>.pane.active>.slider{background-color:rgba(0,0,0,.4)}.nano>.pane2:hover>.slider2,.nano>.pane2.active>.slider2{background-color:rgba(0,0,0,.4)}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:502;overflow:hidden;position:fixed;background:#0b0b0b;opacity:.8;filter:alpha(opacity=80)}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:503;position:fixed;outline:0!important;-webkit-backface-visibility:hidden}.mfp-container{height:100%;text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-container:before{content:'';display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:505}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:pointer}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none!important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-.8em;left:8px;right:8px;z-index:504}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-close,button.mfp-arrow{overflow:visible;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;display:block;padding:0;z-index:506}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:.65;padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Arial,Baskerville,monospace}.mfp-close:hover,.mfp-close:focus{opacity:1}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#333}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px}.mfp-arrow{position:absolute;top:0;opacity:.65;margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1}.mfp-arrow:before,.mfp-arrow:after,.mfp-arrow .mfp-b,.mfp-arrow .mfp-a{content:'';display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:solid transparent}.mfp-arrow:after,.mfp-arrow .mfp-a{opacity:.8;border-top-width:12px;border-bottom-width:12px;top:8px}.mfp-arrow:before,.mfp-arrow .mfp-b{border-top-width:20px;border-bottom-width:20px}.mfp-arrow-left{left:0}.mfp-arrow-left:after,.mfp-arrow-left .mfp-a{border-right:12px solid #000;left:5px}.mfp-arrow-left:before,.mfp-arrow-left .mfp-b{border-right:20px solid #fff}.mfp-arrow-right{right:0}.mfp-arrow-right:after,.mfp-arrow-right .mfp-a{border-left:12px solid #000;left:3px}.mfp-arrow-right:before,.mfp-arrow-right .mfp-b{border-left:20px solid #fff}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}.mfp-iframe-holder .mfp-close{top:-40px}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:40px 0;margin:0 auto}.mfp-figure:after{content:'';position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6)}.mfp-figure{line-height:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-break:break-word;padding-right:36px}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width:800px) and (orientation:landscape),screen and (max-height:300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}}@media all and (max-width:800px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.mfp-ie7 .mfp-img{padding:0}.mfp-ie7 .mfp-bottom-bar{width:600px;left:50%;margin-left:-300px;margin-top:5px;padding-bottom:5px}.mfp-ie7 .mfp-container{padding:0}.mfp-ie7 .mfp-content{padding-top:44px}.mfp-ie7 .mfp-close{top:0;right:0;padding-top:0}.mfp-fade.mfp-bg{opacity:0;-webkit-transition:all .15s ease-out;-moz-transition:all .15s ease-out;transition:all .15s ease-out}.mfp-fade.mfp-bg.mfp-ready{opacity:.8}.mfp-fade.mfp-bg.mfp-removing{opacity:0}.mfp-fade.mfp-wrap .mfp-content{opacity:0;-webkit-transition:all .15s ease-out;-moz-transition:all .15s ease-out;transition:all .15s ease-out}.mfp-fade.mfp-wrap.mfp-ready .mfp-content{opacity:1}.mfp-fade.mfp-wrap.mfp-removing .mfp-content{opacity:0}.my-mfp-zoom-in .zoom-anim-dialog{opacity:0;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}.my-mfp-zoom-in.mfp-ready .zoom-anim-dialog{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.my-mfp-zoom-in.mfp-removing .zoom-anim-dialog{-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8);opacity:0}.my-mfp-zoom-in.mfp-bg{opacity:0;-webkit-transition:opacity .3s ease-out;-moz-transition:opacity .3s ease-out;-o-transition:opacity .3s ease-out;transition:opacity .3s ease-out}.my-mfp-zoom-in.mfp-ready.mfp-bg{opacity:.8}.my-mfp-zoom-in.mfp-removing.mfp-bg{opacity:0}.simple-pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.simple-pace-inactive{display:none}.simple-pace .simple-pace-progress{background-color:#939595;position:fixed;z-index:2000;top:0;left:0;height:3px;overflow:hidden;-webkit-transition:width .5s;-moz-transition:width .5s;-o-transition:width .5s;transition:width .5s}.simple-pace .simple-pace-progress-inner{position:absolute;top:0;left:0;right:-32px;bottom:0;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.3)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.3)),color-stop(0.75,rgba(255,255,255,.3)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.3) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.3) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.3) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.3) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.3) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.3) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.3) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.3) 75%,transparent 75%,transparent);-webkit-background-size:32px 32px;-moz-background-size:32px 32px;-o-background-size:32px 32px;background-size:32px 32px;-webkit-animation:simple-pace-stripe-animation 500ms linear infinite;-moz-animation:simple-pace-stripe-animation 500ms linear infinite;-ms-animation:simple-pace-stripe-animation 500ms linear infinite;-o-animation:simple-pace-stripe-animation 500ms linear infinite;animation:simple-pace-stripe-animation 500ms linear infinite}@-webkit-keyframes simple-pace-stripe-animation{0%{-webkit-transform:none;transform:none}100%{-webkit-transform:translate(-32px,0);transform:translate(-32px,0)}}@-moz-keyframes simple-pace-stripe-animation{0%{-moz-transform:none;transform:none}100%{-moz-transform:translate(-32px,0);transform:translate(-32px,0)}}@-o-keyframes simple-pace-stripe-animation{0%{-o-transform:none;transform:none}100%{-o-transform:translate(-32px,0);transform:translate(-32px,0)}}@-ms-keyframes simple-pace-stripe-animation{0%{-ms-transform:none;transform:none}100%{-ms-transform:translate(-32px,0);transform:translate(-32px,0)}}@keyframes simple-pace-stripe-animation{0%{transform:none;transform:none}100%{transform:translate(-32px,0);transform:translate(-32px,0)}}.flag-wrapper{width:24px;height:16px;display:inline-block}.flag{width:16px;height:11px;display:inline-block;background:url(flags.png) no-repeat}.flag.flag-en{background-position:-144px -154px}.flag.flag-en-us{background-position:-144px -154px}.flag.flag-en-gb{background-position:-240px -33px}.flag.flag-en-ca{background-position:-48px -22px}.flag.flag-nl,.flag.flag-nl-nl{background-position:-80px -110px}.flag.flag-ru,.flag.flag-ru-ru{background-position:-224px -121px}.flag.flag-de,.flag.flag-de-de{background-position:-80px -33px}.flag.flag-it,.flag.flag-it-it{background-position:-208px -66px}.flag.flag-is,.flag.flag-is-is{background-position:-192px -66px}.flag.flag-lv,.flag.flag-lv-lv{background-position:-112px -88px}.flag.flag-fr,.flag.flag-fr-fr,.flag.flag-fr-ca{background-position:-144px -44px}.flag.flag-es,.flag.flag-es-es,.flag.flag-es-la{background-position:-16px -44px}.flag.flag-ja,.flag.flag-jp,.flag.flag-ja-jp{background-position:-16px -77px}.flag.flag-pt,.flag.flag-pt-pt{background-position:-112px -121px}.flag.flag-pt-br{background-position:-192px -11px}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,.1);box-shadow:0 1px 3px rgba(0,0,0,.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;content:"";line-height:0}.row:after{clear:both}[class*=span]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0}.row-fluid:after{clear:both}.row-fluid [class*=span]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%}.row-fluid [class*=span]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*=span].hide,.row-fluid [class*=span].hide{display:none}[class*=span].pull-right,.row-fluid [class*=span].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;content:"";line-height:0}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:20px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:700}em{font-style:italic}cite{font-style:normal}.muted{color:#999}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:700;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:700}dd{margin-left:10px}.dl-horizontal dt{float:left;width:120px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:130px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:400;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],input[type=email],input[type=url],input[type=search],input[type=tel],input[type=color],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}input,textarea{width:210px}textarea{height:auto}textarea,input[type=text],input[type=password],input[type=datetime],input[type=datetime-local],input[type=date],input[type=month],input[type=time],input[type=week],input[type=number],input[type=email],input[type=url],input[type=search],input[type=tel],input[type=color],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type=text]:focus,input[type=password]:focus,input[type=datetime]:focus,input[type=datetime-local]:focus,input[type=date]:focus,input[type=month]:focus,input[type=time]:focus,input[type=week]:focus,input[type=number]:focus,input[type=email]:focus,input[type=url]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=color]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type=radio],input[type=checkbox]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;cursor:pointer}input[type=file],input[type=image],input[type=submit],input[type=reset],input[type=button],input[type=radio],input[type=checkbox]{width:auto}select,input[type=file]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;border:1px solid #bbb;background-color:#fff}select[multiple],select[size]{height:auto}select:focus,input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.025);box-shadow:inset 0 1px 2px rgba(0,0,0,.025);cursor:not-allowed}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type=radio],.checkbox input[type=checkbox]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*=span],select[class*=span],textarea[class*=span],.uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span],.row-fluid .uneditable-input[class*=span]{float:none;margin-left:0}.input-append input[class*=span],.input-append .uneditable-input[class*=span],.input-prepend input[class*=span],.input-prepend .uneditable-input[class*=span],.row-fluid input[class*=span],.row-fluid select[class*=span],.row-fluid textarea[class*=span],.row-fluid .uneditable-input[class*=span],.row-fluid .input-prepend [class*=span],.row-fluid .input-append [class*=span]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*=span]+[class*=span]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0}.controls-row:after{clear:both}.controls-row [class*=span]{float:left}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio][readonly],input[type=checkbox][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:400;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{margin-left:-1px;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type=radio],.form-search .checkbox input[type=checkbox],.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:160px}.form-horizontal .help-block{margin-top:10px;margin-bottom:0}.form-horizontal .form-actions{padding-left:160px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:700}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-right-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0}table .span1{float:none;width:44px;margin-left:0}table .span2{float:none;width:124px;margin-left:0}table .span3{float:none;width:204px;margin-left:0}table .span4{float:none;width:284px;margin-left:0}table .span5{float:none;width:364px;margin-left:0}table .span6{float:none;width:444px;margin-left:0}table .span7{float:none;width:524px;margin-left:0}table .span8{float:none;width:604px;margin-left:0}table .span9{float:none;width:684px;margin-left:0}table .span10{float:none;width:764px;margin-left:0}table .span11{float:none;width:844px;margin-left:0}table .span12{float:none;width:924px;margin-left:0}table .span13{float:none;width:1004px;margin-left:0}table .span14{float:none;width:1084px;margin-left:0}table .span15{float:none;width:1164px;margin-left:0}table .span16{float:none;width:1244px;margin-left:0}table .span17{float:none;width:1324px;margin-left:0}table .span18{float:none;width:1404px;margin-left:0}table .span19{float:none;width:1484px;margin-left:0}table .span20{float:none;width:1564px;margin-left:0}table .span21{float:none;width:1644px;margin-left:0}table .span22{float:none;width:1724px;margin-left:0}table .span23{float:none;width:1804px;margin-left:0}table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.info td{background-color:#d9edf7}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{text-decoration:none;color:#fff;background-color:#08c;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#08c;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:"\2191"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px;-moz-border-radius:0 6px 6px;border-radius:0 6px 6px}.dropdown-submenu:hover .dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#ccc;margin-top:5px;margin-right:-10px}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;overflow:visible \9;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:700;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 14px;margin-bottom:0;font-size:14px;line-height:20px;*line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border:1px solid #bbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^=icon-]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^=icon-]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:16px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,.15) rgba(0,0,0,.15) rgba(0,0,0,.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#04c;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#da4f49;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#49afcd;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#363636;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222 #222 #000;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#222;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type=submit].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type=submit].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type=submit].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type=submit].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{border-color:transparent;cursor:pointer;color:#08c;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-group{position:relative;font-size:0;white-space:nowrap;*margin-left:.3em}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px}.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px}.dropup .btn-large .caret{border-bottom:5px solid #000;border-top:0}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-left:0;margin-top:-1px}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.modal-open .dropdown-menu{z-index:2050}.modal-open .dropdown.open{*z-index:2050}.modal-open .popover{z-index:2060}.modal-open .tooltip{z-index:2080}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,.3);box-shadow:0 3px 7px rgba(0,0,0,.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out;top:-25%}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{overflow-y:auto;max-height:400px;padding:15px}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;*zoom:1}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#eee;text-align:center;text-decoration:none;background-color:#333;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#333}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{content:"";z-index:-1}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#fff}.popover.top .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0,0,0,.25);bottom:-1px;left:-11px}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-width:10px 10px 10px 0;border-right-color:#fff}.popover.right .arrow:after{border-width:11px 11px 11px 0;border-right-color:rgba(0,0,0,.25);bottom:-11px;left:-1px}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-width:0 10px 10px;border-bottom-color:#fff}.popover.bottom .arrow:after{border-width:0 11px 11px;border-bottom-color:rgba(0,0,0,.25);top:-1px;left:-11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-width:10px 0 10px 10px;border-left-color:#fff}.popover.left .arrow:after{border-width:11px 0 11px 11px;border-left-color:rgba(0,0,0,.25);bottom:-11px;right:-1px}.label,.badge{font-size:11.844px;font-weight:700;line-height:14px;color:#fff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.progress .bar{width:0;height:100%;color:#fff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15),inset 0 -1px 0 rgba(0,0,0,.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}@media screen and (-webkit-min-device-pixel-ratio:0){@font-face{font-family:icomoon;src:url(fonts/icomoon.svg#icomoon) format('svg')}}[class^=icon-],[class*=" icon-"]{display:inline-block;width:16px;height:16px;line-height:16px;font-size:15px;*margin-right:.3em;vertical-align:text-top}.icon-white,.nav>.active>a>[class^=icon-],.nav>.active>a>[class*=" icon-"]{color:#fff}.g-ui-menu .e-item:hover [class^=icon-],.g-ui-menu .e-item:hover [class*=" icon-"]{color:#fff}[class^=icon2-],[class*=" icon2-"]{display:inline-block;width:16px;height:16px;line-height:16px;font-size:15px;*margin-right:.3em;vertical-align:text-top;background-repeat:no-repeat}.icon2-none{background-image:none}.icon3-as-button{cursor:pointer}.icon-checkbox-checked,.icon-checkbox-unchecked,.icon-checkbox-partial,.icon-radio-checked,.icon-radio-unchecked{cursor:pointer;color:#555;font-size:1em}.icon-checkbox-checked:hover,.icon-checkbox-unchecked:hover,.icon-checkbox-partial:hover,.icon-radio-checked:hover,.icon-radio-unchecked:hover,.icon-checkbox-checked:active,.icon-checkbox-unchecked:active,.icon-checkbox-partial:active,.icon-radio-checked:active,.icon-radio-unchecked:active{color:#000}.icon-white.icon-checkbox-checked,.icon-white.icon-checkbox-unchecked,.icon-white.icon-checkbox-partial,.icon-white.icon-radio-checked,.icon-white.icon-radio-unchecked{color:#eee}.icon-white.icon-checkbox-checked:hover,.icon-white.icon-checkbox-unchecked:hover,.icon-white.icon-checkbox-partial:hover,.icon-white.icon-radio-checked:hover,.icon-white.icon-radio-unchecked:hover,.icon-white.icon-checkbox-checked:active,.icon-white.icon-checkbox-unchecked:active,.icon-white.icon-checkbox-partial:active,.icon-white.icon-radio-checked:active,.icon-white.icon-radio-unchecked:active{color:#fff}.icon-refresh.in-process{background-position:0 0;background-image:url(images/sync.gif)}.denied-by-browser{cursor:default}.denied-by-browser .icon-checkbox-checked,.denied-by-browser icon-checkbox-unchecked{cursor:default}.icon-arrow-right-3,.icon-arrow-down-3{width:16px;line-height:20px}.icon2-reload{background-image:url(images/sync.png);background-repeat:no-repeat}.icon2-aminate-reload{background-image:url(images/sync.gif);background-repeat:no-repeat}@-webkit-keyframes rotation{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(359deg)}}@-moz-keyframes rotation{from{-moz-transform:rotate(0deg)}to{-moz-transform:rotate(359deg)}}@keyframes rotation{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.icon-repeat,.icon-spinner,.icon-spinner-2{width:16px;height:16px}.icon-repeat:before,.icon-spinner:before,.icon-spinner-2:before{font-size:16px;line-height:100%}html.no-cssanimations .icon-repeat,html.no-cssanimations .icon-spinner,html.no-cssanimations .icon-spinner-2{background-image:url(images/sync.png);background-repeat:no-repeat;font-family:Arial}html.no-cssanimations .icon-repeat:before,html.no-cssanimations .icon-spinner:before,html.no-cssanimations .icon-spinner-2:before{content:""}html.no-cssanimations .icon-repeat.animated,html.no-cssanimations .icon-spinner.animated,html.no-cssanimations .icon-spinner-2.animated{background-image:url(images/sync.gif)}html.cssanimations .icon-repeat.animated,html.cssanimations .icon-spinner.animated,html.cssanimations .icon-spinner-2.animated{-webkit-animation:rotation 1s infinite linear;-moz-animation:rotation 1s infinite linear;animation:rotation 1s infinite linear}body{background-color:transparent}label{cursor:pointer}.legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}.legend small{font-size:15px;color:#999}.legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}select{width:223px}.btn-small.btn-small-small{padding:3px 9px;font-size:11px;line-height:11px}.btn.btn-ellipsis{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.btn.btn-narrow{padding-left:12px;padding-right:12px}.dropdown-menu{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.btn{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background-image:none;text-shadow:0 1px 0 #fff}.btn.disabled,.btn[disabled]{-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}html.rgba.textshadow .btn.btn-danger,html.rgba.textshadow .btn.btn-success,html.rgba.textshadow .btn.btn-primary{text-shadow:0 1px 0 rgba(0,0,0,.3)}.btn-toolbar{margin-top:0;margin-bottom:0}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.2);-moz-box-shadow:0 1px 2px rgba(0,0,0,.2);box-shadow:0 1px 2px rgba(0,0,0,.2)}.tooltip{font-size:14px}.tooltip.in{opacity:1;filter:alpha(opacity=100)}.tooltip .tooltip-big{font-size:18px;padding:0 10px}.tooltip-inner{padding:5px 10px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.btn-group>.btn:first-child{-webkit-border-top-left-radius:2px;-moz-border-radius-topleft:2px;border-top-left-radius:2px;-webkit-border-bottom-left-radius:2px;-moz-border-radius-bottomleft:2px;border-bottom-left-radius:2px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:2px;-moz-border-radius-topright:2px;border-top-right-radius:2px;-webkit-border-bottom-right-radius:2px;-moz-border-radius-bottomright:2px;border-bottom-right-radius:2px}.btn-group>.btn.large:first-child{-webkit-border-top-left-radius:2px;-moz-border-radius-topleft:2px;border-top-left-radius:2px;-webkit-border-bottom-left-radius:2px;-moz-border-radius-bottomleft:2px;border-bottom-left-radius:2px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:2px;-moz-border-radius-topright:2px;border-top-right-radius:2px;-webkit-border-bottom-right-radius:2px;-moz-border-radius-bottomright:2px;border-bottom-right-radius:2px}textarea,input[type=text],input[type=password],input[type=email],input[type=search]{border:1px solid #ccc}textarea:focus,input[type=text]:focus,input[type=password]:focus,input[type=email]:focus,input[type=search]:focus{background-color:#fff;border:1px solid #999;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input[type=text],input[type=password],input[type=email],input[type=search]{height:20px;line-height:20px}select{border:1px solid #ccc}.alert.alert-null-left-margin{margin-left:0}html.no-rgba .modal{border-width:0!important}.modal-backdrop,.modal-backdrop.fade.in{opacity:.1;filter:alpha(opacity=10)}.popups{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1100;overflow:auto}.popups .modal{position:static;z-index:1101;margin:5% auto;background-color:transparent;overflow:hidden;-webkit-box-shadow:0 5px 80px rgba(0,0,0,.3);-moz-box-shadow:0 5px 80px rgba(0,0,0,.3);box-shadow:0 5px 80px rgba(0,0,0,.3)}.popups .modal .modal-body{background-color:#fff;max-height:none}.modal.loginContent .modal-body,.modal.loginAdminContent .modal-body{background-color:transparent!important}.picker.modal-dialog-bg,.picker.picker-dialog-bg{z-index:2000!important}.picker.modal-dialog,.picker.picker-dialog{z-index:2001!important}.select2-container-multi .select2-choices{background-image:none;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.select2-container-multi .select2-choices .select2-search-choice{line-height:15px;font-size:16px}.select2-container-multi.select2-container-active .select2-choices{border:1px solid #999;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.select2-drop{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.select2-drop .select2-subname{color:#777}.select2-drop .select2-highlighted .select2-subname{color:#eee}.select2-results{margin:0;padding:0;max-height:400px}.select2-results .select2-searching{padding:1px 4px}.select2-icon{line-height:20px;padding:0 0 0 7px}.select2-icon-result{line-height:40px}.select2-result-label{margin:0!important;padding:5px!important;font-size:16px;height:40px;line-height:40px}.select2-result-label .select2-user-pic{display:inline-block;height:40px;width:40px;margin-right:10px}.g-ui-user-select-none{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none;-webkit-touch-callout:none}.g-ui-clearfix{*zoom:1}.g-ui-clearfix:before,.g-ui-clearfix:after{display:table;content:"";line-height:0}.g-ui-clearfix:after{clear:both}.g-ui-link{color:#369;text-decoration:underline;cursor:pointer}.g-ui-min-height-300{min-height:300px}.g-ui-absolute-reset{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0}.g-ui-menu{max-height:400px;max-width:300px;overflow-y:auto;overflow-x:hidden}.g-ui-menu .e-link{text-decoration:none;cursor:pointer}.g-ui-menu .e-item>.e-link:hover{background-color:#555;background-image:none;color:#fff}.g-ui-menu .e-item.disable>.e-link{cursor:not-allowed;background-color:#fff;background-image:none;color:grey}.g-ui-menu .e-item.disable [class^=icon-]{color:grey}.g-ui-table{display:table;width:100%}.g-ui-table .e-row{display:table-row}.g-ui-table .e-cell{display:table-cell;vertical-align:top;text-align:left}.g-ui-resizable-delimiter-highlight{border:0;border-right:6px solid #aaa}html.rgba .g-ui-resizable-delimiter-highlight{border-right-color:rgba(0,0,0,.2)}.settings-saved-trigger{display:inline-block;line-height:17px;font-size:16px}.settings-saved-trigger .animated{color:green}.settings-saved-trigger .success{color:green;-webkit-transition:opacity .5s linear;-moz-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear;opacity:0;filter:alpha(opacity=0)}.settings-saved-trigger .error{color:red;-webkit-transition:opacity .5s linear;-moz-transition:opacity .5s linear;-o-transition:opacity .5s linear;transition:opacity .5s linear;opacity:0;filter:alpha(opacity=0)}.settings-saved-trigger .visible{opacity:1;filter:alpha(opacity=100)}*{outline:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{margin:0;padding:0;overflow:hidden;font-family:Arial,Verdana,Geneva,sans-serif}body{margin:0;padding:0;overflow:hidden;background-color:#e3e3e3;font-family:Arial,Verdana,Geneva,sans-serif;-webkit-touch-callout:none;position:absolute;top:0;left:0;bottom:0;right:0}textarea{resize:none}option:disabled{color:#aaa;cursor:not-allowed}body:before{content:"";position:fixed;top:-10px;left:0;width:100%;height:8px;z-index:100;-webkit-box-shadow:0 0 10px rgba(0,0,0,.6);-moz-box-shadow:0 0 10px rgba(0,0,0,.6);box-shadow:0 0 10px rgba(0,0,0,.6)}#rl-content{height:100%;width:100%}#rl-center{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;min-width:900px;min-height:400px}#rl-top{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;bottom:auto;z-index:2}#rl-bottom{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;top:auto;z-index:1}#rl-left{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;right:auto;width:100%}#rl-right{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0;z-index:0;z-index:1}#rl-resizer-right{position:absolute;top:0;bottom:0;right:0;left:35%}#rl-resizer-left{position:absolute;top:0;bottom:0;left:0;right:65%;min-width:350px}#rl-top-resizer-right{position:absolute;top:0;bottom:0;right:0;left:230px}#rl-top-resizer-left{position:absolute;top:0;bottom:0;left:0;right:auto;min-width:120px}html.mobile #rl-top-resizer-left{width:170px}html.mobile #rl-top-resizer-right{left:170px}html.mobile #rl-resizer-left{width:350px}html.mobile #rl-resizer-right{left:350px}html.rl-no-preview-pane #rl-resizer-left{right:5px!important;width:inherit}html.rl-no-preview-pane #rl-resizer-right{left:0!important}html.rl-no-preview-pane #rl-right .ui-resizable-handle{display:none!important}#rl-loading,#rl-loading-error{position:absolute;font:30px Tahoma;top:50%;left:50%;width:120px;height:60px;margin:0;margin-top:-60px;margin-left:-25px;background-color:transparent;background-repeat:no-repeat;background-position:40px 40px;background-image:url(images/loader-black.gif);color:#000}#rl-loading-error{background-image:none;width:600px;margin-left:-200px;display:none}.b-system-drop-down .b-toolbar{position:absolute;top:0;right:0;height:30px;padding:10px 8px;z-index:103}.b-system-drop-down .e-facebook-name{display:inline-block;padding-top:4px}.b-system-drop-down .btn.system-dropdown{padding-left:10px;padding-right:10px}.b-system-drop-down .button-fb-logout{margin:5px}.b-system-drop-down .email-title{display:inline-block;max-width:200px;text-align:left;text-overflow:ellipsis;overflow:hidden}.rl-view-model.RL-Login,.rl-view-model.RL-LoginNew,.rl-view-model.RL-AdminLogin{height:100%}.b-login-content{height:100%;text-align:center;margin-left:-230px}.b-login-content .loginFormWrapper{display:inline-block;vertical-align:middle;text-align:center;width:380px}.b-login-content .loginFormWrapper .loginForm{background-color:#efefef;text-align:left;color:#333;margin:0;float:none}.b-login-content .loginFormWrapper .control-label{font-size:16px;line-height:30px}.b-login-content .loginFormWrapper .control-group{margin-bottom:25px}.b-login-content .loginFormWrapper .wrapper{padding:40px 40px 10px}.b-login-content .loginFormWrapper #recaptcha_image img{border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.b-login-content .loginFormWrapper .inputLoginForm,.b-login-content .loginFormWrapper .inputEmail,.b-login-content .loginFormWrapper .inputLogin,.b-login-content .loginFormWrapper .inputPassword{font-size:18px;height:30px;line-height:29px}.b-login-content .loginFormWrapper .signMeLabel{margin-top:5px}.b-login-content .loginFormWrapper .input-append .add-on{position:relative;height:30px;background:0;margin-left:-35px;z-index:1000;border:0}.b-login-content .loginFormWrapper .input-append .add-on i{font-size:17px;line-height:29px;color:#999}.b-login-content .loginFormWrapper .control-group.error .add-on i{color:#b94a48}.b-login-content .buttonLogin{margin:0}.b-login-content .alert{margin:0 0 20px;text-align:left}.b-login-content .loginAfter{display:inline-block;height:90%;vertical-align:middle;width:0}.b-login-content .flag-selector{margin-bottom:0}.b-folders .b-toolbar{position:absolute;top:0;right:0;left:0;height:30px;padding:10px 10px 0 8px;color:#fff}.b-folders .b-content{position:absolute;top:58px;bottom:13px;left:0;right:0;overflow:hidden;overflow-y:auto}.b-folders .b-content .content{-webkit-overflow-scrolling:touch}.b-folders .b-list-delimiter{margin:10px;border-top:0 solid #000;border-bottom:1px solid #999}.b-folders .e-item{overflow:hidden;white-space:nowrap}.b-folders .e-item .e-link{display:block;position:relative;z-index:1;height:34px;line-height:34px;background-color:transparent;vertical-align:middle;color:grey;cursor:not-allowed;font-size:14px;padding:0;padding-left:10px;padding-right:10px;outline:0;text-decoration:none}.b-folders .e-item .e-link.selectable{color:#000;cursor:pointer}.b-folders .e-item .e-link.selectable:hover,.b-folders .e-item .e-link.selectable.selected,.b-folders .e-item .e-link.selectable.droppableHover{background-color:#555;color:#fff}.b-folders .e-item .e-link.system{cursor:default;color:grey}.b-folders .e-item .e-link .count{display:none;margin-top:5px;line-height:19px}.b-folders .e-item .e-link.print-count{font-weight:700}.b-folders .e-item .e-link.print-count .count{display:inline}.b-folders .e-item .e-link .e-collapsed-sign{cursor:pointer;width:22px;height:30px;line-height:30px;text-align:center;vertical-align:inherit}.b-folders .e-item .hidden.e-link{display:none}.b-folders .e-item .b-sub-folders.collapsed{max-height:0;height:0;display:none}.b-folders .b-folder-system-item{font-weight:700}.b-folders .b-sub-folders .e-item .e-link{padding-left:25px}.b-folders .b-sub-folders.unpaddig-folder .e-item .e-link{padding-left:10px}.b-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:40px}.b-folders .b-sub-folders.unpaddig-folder .b-sub-folders .e-item .e-link{padding-left:25px}.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:55px}.b-folders .b-sub-folders.unpaddig-folder .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:40px}.b-folders .b-sub-folders .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:70px}.b-folders .b-sub-folders.unpaddig-folder .b-sub-folders .b-sub-folders .b-sub-folders .e-item .e-link{padding-left:55px}.popups .b-folder-clear-content .modal-header{background-color:#fff}.popups .b-folder-create-content .modal-header{background-color:#fff}.popups .b-folder-system-content.modal{z-index:1102}.popups .b-folder-system-content .modal-header{background-color:#fff}.popups .b-languages-content.modal{z-index:1103;width:520px}.popups .b-languages-content.exp{width:521px}.popups .b-languages-content .modal-header{background-color:#fff}.popups .b-languages-content .lang-item{display:inline-block;padding:5px 15px;margin:2px 5px;width:200px;background-color:#fff;text-align:left}.popups .b-languages-content .lang-item.selected{background-color:#f5f5f5}.popups .b-languages-content .lang-item:hover{background-color:#eee}.popups .b-account-add-content .modal-header{background-color:#fff}.popups .b-identity-content .modal-header{background-color:#fff}.popups .b-identity-content .textEmail{margin-top:5px;font-weight:700}.popups .b-advanced-search-content.modal{width:750px}.popups .b-advanced-search-content.modal .control-label{width:100px}.popups .b-advanced-search-content.modal .controls{margin-left:110px}.popups .b-advanced-search-content .modal-header{background-color:#fff}html.rl-no-preview-pane .messageList.message-selected{display:none}.messageList .toolbar{position:absolute;top:0;right:0;left:0;height:30px;padding:10px 1px;min-width:280px;z-index:102}.messageList .b-footer{position:absolute;bottom:0;right:0;left:0;height:29px;padding:10px;min-width:300px;z-index:101;background-color:#eee;-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px}.messageList .b-footer .e-quota{display:inline-block;margin-left:10px;font-size:18px;cursor:help}.messageList .b-footer .e-quota:hover{border-bottom:1px dashed #333}.messageList .inputSearch{width:258px}.messageList .btn.buttonMoreSearch{padding-left:8px;padding-right:8px}.messageList .b-message-list-wrapper{position:absolute;top:50px;right:0;left:0;bottom:5px;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.3);-moz-box-shadow:0 2px 8px rgba(0,0,0,.3);box-shadow:0 2px 8px rgba(0,0,0,.3);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;z-index:101}.messageList .second-toolbar{position:absolute;top:0;right:0;left:0;height:29px;padding:10px 8px 10px 11px;min-width:280px;z-index:101;background-color:#eee;-webkit-border-top-right-radius:5px;-moz-border-radius-topright:5px;border-top-right-radius:5px;-webkit-border-top-left-radius:5px;-moz-border-radius-topleft:5px;border-top-left-radius:5px}.messageList .second-toolbar .checkboxCkeckAll{margin:5px 0}.messageList .mainDelimiter{position:absolute;left:0;right:0;height:1px;z-index:101;background-color:#bbb}.messageList .toolbarDelimiter{top:49px}.messageList .footerDelimiter{bottom:49px}.messageList .b-content{position:absolute;top:50px;bottom:50px;left:0;right:0;padding:0;overflow-x:hidden;overflow-y:auto;z-index:101;min-width:300px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#fff}.messageList .b-content .content{-webkit-overflow-scrolling:touch}.messageList .b-content .listClear{color:#333;text-align:center;padding:10px;font-size:14px;line-height:13px}.messageList .b-content .listEmptyList,.messageList .b-content .listEmptyListLoading,.messageList .b-content .listDragOver,.messageList .b-content .listError,.messageList .b-content .listEmptySearchList{color:#999;text-align:center;padding:60px 10px;font-size:24px;line-height:30px}.messageList .b-content .listEmptyList .e-icon,.messageList .b-content .listEmptyListLoading .e-icon,.messageList .b-content .listDragOver .e-icon,.messageList .b-content .listError .e-icon,.messageList .b-content .listEmptySearchList .e-icon{font-size:24px;line-height:30px}.messageList .b-content .listDragOver{max-height:0;overflow:hidden;padding:0 10px}.messageList .b-content .listDragOver.viewAppendArea{max-height:120px;padding:30px 10px}.messageList .b-content .listDragOver.dragOverEnter{background-color:#e0fdda;color:#333}.messageList .b-content .listError{color:#DA4F49}.messageList .b-content .listSearchDesc{font-size:20px;padding:20px;border-bottom:1px solid #eee}.messageList .b-content .delimiter{display:block;height:1px;background-color:#e5e5e5}.messageList .b-content .messageListItem:last-child{border-bottom:1px solid #e5e5e5}.messageList .b-content .messageListItem:last-child.selected{border-bottom:1px solid #bfd5ef}.messageList .b-content .fullThreadsParent{height:25px;padding:3px 5px;background-color:#f4f4f4;text-align:center}.messageList .b-content .messageListItem{position:relative;height:52px;max-height:60px;font-size:12px;line-height:21px;overflow:hidden;cursor:pointer;margin:0;border:0 solid transparent;z-index:100;background-color:#f9f9f9}.messageList .b-content .messageListItem .delimiter{position:relative;display:block;height:1px;background-color:#999;opacity:.2;filter:alpha(opacity=20)}.messageList .b-content .messageListItem .wrapper{padding:5px 0}.messageList .b-content .messageListItem .sidebarParent{display:inline-block;width:6px;background-color:#eee;float:left;height:100%}.messageList .b-content .messageListItem.e-single-line{height:35px}.messageList .b-content .messageListItem.e-single-line .wrapper{line-height:25px;padding:5px}.messageList .b-content .messageListItem.new{max-height:0}.messageList .b-content .messageListItem.deleted{max-height:0;border-color:transparent!important}.messageList .b-content .messageListItem .checkedParent{display:inline-block;float:left;margin-top:11px;padding:0 8px 0 6px;font-size:14px}.messageList .b-content .messageListItem.e-single-line .checkedParent{margin-top:1px}.messageList .b-content .messageListItem .flagParent{display:inline-block;float:right;padding:0 8px 0 5px}.messageList .b-content .messageListItem.e-single-line .flagParent{float:left;padding:0 8px 0 2px}.messageList .b-content .messageListItem .dateParent{display:inline-block;float:right;position:relative;margin:0 5px;color:#999;font-size:11px}.messageList .b-content .messageListItem .attachmentParent{display:inline-block;float:right;position:relative;margin:2px 8px 0 5px}.messageList .b-content .messageListItem.e-single-line .attachmentParent{float:left;margin:0 5px 0 0}.messageList .b-content .messageListItem .senderParent{display:block;overflow:hidden;text-overflow:ellipsis}.messageList .b-content .messageListItem .threadsCountParent{display:inline;overflow:hidden;background-color:#eee;padding:1px 5px;margin-right:5px;border:1px solid #ccc;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.messageList .b-content .messageListItem .threadsCountParent.lastSelected{background-color:#999;border-color:#999;color:#fff}.messageList .b-content .messageListItem .threadsCountParent:hover{border-color:#666}.messageList .b-content .messageListItem.e-single-line .senderParent{display:inline-block;text-overflow:none;width:200px;float:left;font-weight:400}.messageList .b-content .messageListItem .subjectParent{display:block;overflow:hidden;text-overflow:ellipsis;color:#000}.messageList .b-content .messageListItem .senderParent,.messageList .b-content .messageListItem .subjectParent,.messageList .b-content .messageListItem .dateParent{white-space:nowrap}.messageList .b-content .messageListItem .subjectParent .emptySubjectText{display:none;font-style:italic;color:#999}.messageList .b-content .messageListItem.emptySubject .subjectParent .subject{display:none}.messageList .b-content .messageListItem.emptySubject .subjectParent .emptySubjectText{display:inline}.messageList .b-content .messageListItem .sender,.messageList .b-content .messageListItem .subject{overflow:hidden;text-overflow:ellipsis}.messageList .b-content .messageListItem .attachment{display:none}.messageList .b-content .messageListItem .flagOff,.messageList .b-content .messageListItem .flagOn,.messageList .b-content .messageListItem .flagOnHalf{cursor:pointer;display:inline-block}.messageList .b-content .messageListItem .flagOff{opacity:.5;filter:alpha(opacity=50)}.messageList .b-content .messageListItem .flagOff:hover{opacity:1;filter:alpha(opacity=100)}.messageList .b-content .messageListItem .flagOn,.messageList .b-content .messageListItem .flagOnHalf{display:none;color:orange}.messageList .b-content .messageListItem .replyFlag,.messageList .b-content .messageListItem .forwardFlag{display:none}.messageList .b-content .messageListItem.answered .replyFlag{display:inline-block}.messageList .b-content .messageListItem.forwarded .forwardFlag{display:inline-block}.messageList .b-content .messageListItem.withAttachments .attachment{display:inline-block;color:#666;text-shadow:0 1px 0 #eee}.messageList .b-content .messageListItem.unseen{background-color:#FFFFD9}.messageList .b-content .messageListItem.unseen .sender,.messageList .b-content .messageListItem.unseen .subject{font-weight:700}.messageList .b-content .messageListItem.unseen .sidebarParent{background-color:orange}.messageList .b-content .messageListItem.hasUnseenSubMessage{background-color:#FFFFD9}.messageList .b-content .messageListItem.hasUnseenSubMessage .sidebarParent{background-color:#ffdb99}.messageList .b-content .messageListItem.hasParentMessage{background-color:#ecf0f1}.messageList .b-content .messageListItem.hasParentMessage .sidebarParent{background-color:#bdc3c7}.messageList .b-content .messageListItem.hasParentMessage.unseen{background-color:#dde4e6}.messageList .b-content .messageListItem.hasParentMessage.unseen .sidebarParent{background-color:#6c777f}.messageList .b-content .messageListItem.checked .sidebarParent{background-color:#69a8f5!important}.messageList .b-content .messageListItem.selected{background-color:#DFEFFF;z-index:102}.messageList .b-content .messageListItem.selected .sidebarParent{background-color:#398CF2!important}.messageList .b-content .messageListItem.selected .delimiter{background-color:#398CF2;opacity:.2;filter:alpha(opacity=20)}.messageList .b-content .messageListItem.selected+.messageListItem .delimiter{background-color:#398CF2;opacity:.3;filter:alpha(opacity=30)}.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOff,.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOn{display:none}.messageList .b-content .messageListItem.hasFlaggedSubMessage .flagOnHalf{display:inline-block}.messageList .b-content .messageListItem.flagged .flagOff,.messageList .b-content .messageListItem.flagged .flagOnHalf{display:none}.messageList .b-content .messageListItem.flagged .flagOn{display:inline-block}.messageList.hideMessageListCheckbox .checkedParent,.messageList.hideMessageListCheckbox .checkboxCkeckAll{display:none!important}.messageList.hideMessageListCheckbox .sidebarParent{margin-right:10px!important}.messageList .pagenator .page{display:inline-block;color:#999;text-decoration:none;font-size:24px;padding:3px;cursor:pointer}.messageList .pagenator .page:hover .pageNumber{color:#555}.messageList .pagenator .page.current .pageNumber{font-size:28px;color:#333;border-bottom:2px solid #000}.draggablePlace{z-index:10002;color:#fff;background-color:#333;background-color:rgba(0,0,0,.5);padding:4px 10px;min-width:30px;height:20px;cursor:pointer;cursor:move}html.rl-no-preview-pane .messageView{display:none}html.rl-no-preview-pane .messageView.message-selected{display:block}.messageView{z-index:100}.messageView .toolbar{position:absolute;top:0;right:0;left:0;height:30px;padding:10px 0;color:#fff}.messageView .b-content{position:absolute;margin:0;top:58px;bottom:13px;right:8px;left:0;overflow:hidden;border:1px solid #aaa;border-left:0;-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;background-color:#fff}.messageView .b-content .b-message-view-desc{text-align:center;font-size:24px;line-height:30px;padding-top:120px;color:#999}.messageView .b-content .b-message-view-desc.error{color:#DA4F49}.messageView .b-content .content{-webkit-overflow-scrolling:touch}.messageView .b-content .messageItem{position:absolute;top:0;bottom:0;left:0;right:0;overflow:auto;-webkit-overflow-scrolling:touch;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.messageView .b-content .messageItem .emptySubjectText{display:none;font-style:italic;color:#999}.messageView .b-content .messageItem.emptySubject .emptySubjectText{display:inline}.messageView .b-content .messageItem .buttonUp,.messageView .b-content .messageItem .buttonUnFull,.messageView .b-content .messageItem .buttonFull{display:inline-block;position:fixed;right:30px;top:90px;height:30px;width:30px;text-align:center;vertical-align:middle;line-height:30px;background-color:transparent;background-color:#fff;border:1px solid #333;color:#333;z-index:2;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;opacity:.3;filter:alpha(opacity=30)}.messageView .b-content .messageItem .buttonUp:hover,.messageView .b-content .messageItem .buttonUnFull:hover,.messageView .b-content .messageItem .buttonFull:hover{opacity:.8;filter:alpha(opacity=80);border-color:#000;background-color:#888;color:#fff}.messageView .b-content .messageItem .buttonUp{right:70px;z-index:0}.messageView .b-content .messageItem .buttonUnFull{display:none}.messageView .b-content .messageItem .messageItemHeader{position:relative;padding:10px;background-color:#f8f8f8;border-top:0;border-bottom:1px solid #ddd;z-index:1}.messageView .b-content .messageItem .messageItemHeader .fromPic{display:inline-block;width:50px;height:50px;float:left;padding:2px;margin:0 5px 0 0;background:#fff;border:1px solid #ccc;border-radius:10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.messageView .b-content .messageItem .messageItemHeader .subjectParent{font-size:16px;font-weight:700;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;margin-left:3px}.messageView .b-content .messageItem .messageItemHeader .senderParent{margin-top:10px}.messageView .b-content .messageItem .messageItemHeader .messageButtons{margin-top:5px}.messageView .b-content .messageItem .messageItemHeader .informationShort{margin-left:15px}.messageView .b-content .messageItem .messageItemHeader .informationShort a{color:#369;text-decoration:underline;cursor:pointer}.messageView .b-content .messageItem .messageItemHeader .informationFull{margin-top:10px;border:1px solid #ddd;background-color:#fff;border-radius:5px;padding:10px 15px}.messageView .b-content .messageItem .loading{text-align:center;font-size:24px;color:grey;padding-top:50px}.messageView .b-content .messageItem .line-loading{height:0}.messageView .b-content .messageItem .showImages{cursor:pointer;background-color:#eee;padding:10px 15px;border-bottom:1px solid #ccc}.messageView .b-content .messageItem .attachmentsPlace{padding:10px}.messageView .b-content .messageItem .attachmentsPlace .attachmentList{margin:0}.messageView .b-content .messageItem .attachmentsPlace .attachmentList .attachmentItem{display:inline-block;margin:5px;padding:5px;max-width:170px;min-width:60px;overflow:hidden;cursor:pointer;list-style:none;line-height:24px;border:2px solid grey;background-color:#fff;box-shadow:1px 1px 5px #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.messageView .b-content .messageItem .attachmentsPlace .attachmentList .attachmentItem .attachmentIcon{font-size:23px;width:23px;height:23px}.messageView .b-content .messageItem .attachmentsPlace .attachmentList .attachmentItem .attachmentPreview{color:#999;margin:0 5px}.messageView .b-content .messageItem .attachmentsPlace .attachmentList .attachmentItem .attachmentPreview:hover{color:#333}.messageView .b-content .messageItem .rlBlockquoteSwitcher{background-color:#eee;border:1px solid #999;display:inline-block;width:30px;height:14px;line-height:14px;text-align:center;cursor:pointer;margin:10px 0;opacity:.5;filter:alpha(opacity=50)}.messageView .b-content .messageItem .rlBlockquoteSwitcher:hover{opacity:1;filter:alpha(opacity=100)}.messageView .b-content .messageItem .bodyText{color:#000;font-family:arial,sans-serif}.messageView .b-content .messageItem .bodyText .b-text-part a{color:#00f;text-decoration:underline}.messageView .b-content .messageItem .bodyText .b-text-part a:visited{color:#609}.messageView .b-content .messageItem .bodyText .b-text-part a:active{color:red}.messageView .b-content .messageItem .bodyText .b-text-part table{border-collapse:separate}.messageView .b-content .messageItem .bodyText .b-text-part blockquote{border-left:2px solid #000;margin:0;padding:0 10px}.messageView .b-content .messageItem .bodyText .b-text-part .rl-bq-switcher.hidden-bq{display:none}.messageView .b-content .messageItem .bodyText .b-text-part.rtl-text-part{direction:rtl}.messageView .b-content .messageItem .bodyText .b-text-part.html .mailso-body{margin:15px}.messageView .b-content .messageItem .bodyText .b-text-part.plain{padding:15px}.messageView .b-content .messageItem .bodyText .b-text-part.plain pre{margin:0;padding:0;font-family:arial,sans-serif;background:#fff;border:0;white-space:normal}.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote{border-left:2px solid #00f;color:#00f}.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote{border-left:2px solid green;color:green}.messageView .b-content .messageItem .bodyText .b-text-part.plain blockquote blockquote blockquote{border-left:2px solid red;color:red}html.rl-no-preview-pane .messageView .toolbar{padding-left:1px}html.rl-no-preview-pane .messageView .b-content{top:50px;bottom:5px;right:5px;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.3);-moz-box-shadow:0 2px 8px rgba(0,0,0,.3);box-shadow:0 2px 8px rgba(0,0,0,.3);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}html.rl-no-preview-pane .messageView .b-content .buttonUp,html.rl-no-preview-pane .messageView .b-content .buttonUnFull,html.rl-no-preview-pane .messageView .b-content .buttonFull{top:70px}html.cssanimations.rl-anim .line-loading{height:5px!important}html.rl-message-fullscreen #rl-left,html.rl-message-fullscreen #rl-bottom{display:none!important}html.rl-message-fullscreen #rl-right .RL-MailMessageList,html.rl-message-fullscreen #rl-right .RL-SettingsPane,html.rl-message-fullscreen #rl-right .RL-SystemDropDown,html.rl-message-fullscreen #rl-right .RL-MailMessageView .messageView .toolbar{display:none!important}html.rl-message-fullscreen .messageView .b-content{position:fixed;margin:5px;top:0;left:0;right:0;bottom:0;z-index:10000}html.rl-message-fullscreen .messageView .b-content .buttonUp,html.rl-message-fullscreen .messageView .b-content .buttonUnFull{display:inline-block;top:36px}html.rl-message-fullscreen .messageView .b-content .buttonFull{display:none}.b-contacts-content.modal{position:absolute;right:0;top:0;bottom:0;left:0;width:900px;min-height:300px;max-height:700px;margin:auto}.b-contacts-content.modal .modal-body{overflow:auto;height:100%;background-color:#f5f5f5;padding:0}.b-contacts-content.modal .b-header-toolbar{height:40px;background-color:#aaa;color:#fff;background-color:#333;background-color:rgba(0,0,0,.8)!important}.b-contacts-content.modal .b-header-toolbar .close{color:#fff;opacity:1;filter:alpha(opacity=100)}.b-contacts-content.modal .b-header-toolbar .btn{margin-top:4px}.b-contacts-content.modal .b-header-toolbar .button-new-message{margin-left:8px}.b-contacts-content.modal .b-header-toolbar .button-delete{margin-left:8px}.b-contacts-content.modal .b-list-toopbar{padding:0;height:45px;text-align:center;width:250px;-webkit-box-shadow:inset 0 -1px 0 #ccc;-moz-box-shadow:inset 0 -1px 0 #ccc;box-shadow:inset 0 -1px 0 #ccc}.b-contacts-content.modal .b-list-toopbar .e-search{margin-top:7px}.b-contacts-content.modal .b-list-content{position:absolute;top:45px;bottom:60px;left:0;width:250px;overflow:hidden;overflow-y:auto}.b-contacts-content.modal .b-list-content .content{-webkit-overflow-scrolling:touch}.b-contacts-content.modal .b-list-content .listClear{color:#333;text-align:center;padding:10px;font-size:14px;line-height:13px;background-color:#fff}.b-contacts-content.modal .b-list-content .listEmptyList,.b-contacts-content.modal .b-list-content .listEmptyListLoading,.b-contacts-content.modal .b-list-content .listEmptySearchList{color:#999;text-align:center;padding:60px 10px;font-size:24px;line-height:30px}.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkedParent,.b-contacts-content.modal .b-list-content.hideContactListCheckbox .checkboxCkeckAll{display:none!important}.b-contacts-content.modal .b-list-content.hideContactListCheckbox .sidebarParent{margin-right:10px!important}.b-contacts-content.modal .b-list-content .e-contact-foreach{border-bottom:1px solid #ddd}.b-contacts-content.modal .b-list-content .e-contact-item{position:relative;height:45px;max-height:45px;line-height:45px;overflow:hidden;cursor:pointer;margin:0;border:0 solid transparent;z-index:100}.b-contacts-content.modal .b-list-content .e-contact-item .delimiter{position:relative;display:block;height:1px;background-color:#999;opacity:.2;filter:alpha(opacity=20)}.b-contacts-content.modal .b-list-content .e-contact-item .wrapper{padding:0}.b-contacts-content.modal .b-list-content .e-contact-item .sidebarParent{display:inline-block;width:6px;background-color:#eee;float:left;height:100%}.b-contacts-content.modal .b-list-content .e-contact-item.deleted{max-height:0;border-color:transparent!important}.b-contacts-content.modal .b-list-content .e-contact-item .checkedParent{display:inline-block;float:left;padding:0 8px 0 6px}.b-contacts-content.modal .b-list-content .e-contact-item .nameParent{display:block;overflow:hidden;text-overflow:ellipsis;color:#333;font-size:16px}.b-contacts-content.modal .b-list-content .e-contact-item .nameParent,.b-contacts-content.modal .b-list-content .e-contact-item .emailParent{white-space:nowrap}.b-contacts-content.modal .b-list-content .e-contact-item .displayName,.b-contacts-content.modal .b-list-content .e-contact-item .displayEmail{overflow:hidden;text-overflow:ellipsis}.b-contacts-content.modal .b-list-content .e-contact-item .displayImg{display:inline-block;float:right;position:relative;margin:0 5px}.b-contacts-content.modal .b-list-content .e-contact-item.checked{z-index:101}.b-contacts-content.modal .b-list-content .e-contact-item.checked .sidebarParent{background-color:#69A8F5}.b-contacts-content.modal .b-list-content .e-contact-item.selected{background-color:#fff;z-index:102}.b-contacts-content.modal .b-list-content .e-contact-item.selected .sidebarParent{background-color:#398CF2}.b-contacts-content.modal .b-view-content{position:absolute;top:0;bottom:60px;left:250px;right:0;overflow:hidden;overflow-y:auto;background-color:#fff;border-left:1px solid #ddd}.b-contacts-content.modal .b-view-content .content{-webkit-overflow-scrolling:touch}.b-contacts-content.modal .b-view-content .b-contact-view-desc{text-align:center;font-size:24px;line-height:30px;padding-top:120px;color:#999}.b-contacts-content.modal .b-view-content .top-part{margin-top:20px}.b-contacts-content.modal .b-view-content .top-part .control-label{text-align:center}.b-contacts-content.modal .b-view-content .image-wrapper{margin-left:30px;border-radius:10px}.b-contacts-content.modal .b-view-content .image-wrapper img{border-radius:10px}.b-contacts-content.modal .b-view-content .top-row{padding:10px 0;height:30px}.b-contacts-content.modal .b-view-content .contactEmptyValueClick,.b-contacts-content.modal .b-view-content .contactValueClick,.b-contacts-content.modal .b-view-content .contactValueInput{display:inline-block;font-size:24px;line-height:28px;height:28px}.b-contacts-content.modal .b-view-content .contactEmptyValueClick,.b-contacts-content.modal .b-view-content .contactValueClick{color:#ddd;cursor:pointer;margin:5px 0 0 7px}.b-contacts-content.modal .b-view-content .contactValueInput{padding-left:6px}.b-contacts-content.modal .b-view-content .contactEmptyValueClick{border-bottom:1px dashed #ddd}.b-contacts-content.modal .b-view-content .contactValueClick{color:#555;border-bottom:11px dashed transparent}.b-contacts-content.modal .b-view-content .contactValueClick:hover{color:#000;border-bottom:1px dashed #000}.b-contacts-content.modal .b-view-content .hasError .contactValueClick,.b-contacts-content.modal .b-view-content .hasError .contactValueInput{color:#ee5f5b;border:1px solid #ee5f5b}.b-contacts-content.modal .b-view-content .button-save-contact{position:absolute;bottom:20px;right:20px}.b-contacts-content .e-contact-item{position:relative;height:55px;max-height:60px;line-height:22px;overflow:hidden;cursor:pointer;margin:0;border:0 solid transparent;z-index:100}.b-compose.modal{width:850px;margin:10px auto}.b-compose.modal .modal-body{overflow:auto;padding:0}.b-compose .b-header-toolbar{height:40px;background-color:#aaa;color:#fff;background-color:#333;background-color:rgba(0,0,0,.8)!important}.b-compose .b-header-toolbar .close{color:#fff;opacity:1;filter:alpha(opacity=100)}.b-compose .b-header-toolbar .btn.disable.button-delete{visibility:hidden}.b-compose .b-header-toolbar .button-save,.b-compose .b-header-toolbar .button-delete,.b-compose .b-header-toolbar .saved-text{margin-left:8px}.b-compose .b-header-toolbar .disable.button-delete{margin-left:0}.b-compose .b-header{padding:10px;border-bottom:1px solid #333;background-color:#eee;color:#333}.b-compose .b-header .e-identity{font-weight:700}.b-compose .b-header .e-identity.multiply{cursor:pointer;border-bottom:1px dashed #555}.b-compose .b-header .e-row{line-height:30px}.b-compose .b-header .e-delimiter-row{line-height:2px;height:5px}.b-compose .b-header .e-label{text-align:right;width:1%;min-width:70px;padding:6px 10px}.b-compose .b-header .e-value{padding:2px 0}.b-compose .b-header .e-value textarea,.b-compose .b-header .e-value input[type=text]{width:98%}.b-compose .b-header .e-value textarea{height:40px}.b-compose .b-header .e-value .select2-container{width:100%}.b-compose .b-header .error-desc{color:red}.b-compose .b-header .b-appachments .b-attacment{display:inline-block;line-height:20px}.b-compose .b-header .b-appachments .b-attacment-in-process{display:inline-block;line-height:20px}.b-compose .b-header .b-appachments .b-attacment-in-process .uploading{display:none;padding-right:5px}.b-compose .b-header .b-appachments .b-attacment-in-process.uploading .uploading{display:inline}.b-compose .b-header .b-appachments .b-attacment-in-process .upload-progress{font-weight:700}.b-compose .b-header .b-appachments .b-attacment-in-process.error .namedStr{color:#888}.b-compose .b-header .b-appachments .b-attacment-in-process .error{color:red}.b-compose .b-header .b-appachments .b-attacment-in-process .close{float:left;padding-right:13px}.b-compose .b-attachment-button{display:inline-block}.b-compose .b-attachment-place{position:absolute;height:120px;border:2px #777 dashed;line-height:119px;text-align:center;background-color:#fff;z-index:300;left:20px;right:20px;font-size:24px}.b-compose .b-attachment-place.drag-and-drop-over{background:#777;color:#fff}.b-compose .editorTextArea,.b-compose .editorHtmlArea{background:#fff;color:#000;font-family:Arial,Verdana,Geneva,sans-serif;font-size:14px}.b-compose .editorTextArea table,.b-compose .editorHtmlArea table{border-collapse:separate}.b-compose .editorTextArea blockquote,.b-compose .editorHtmlArea blockquote{border:0;border-left:solid 2px #444;margin-left:5px;margin:5px 0;padding-left:5px}.b-admin-left .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 0 0 8px}.b-admin-left .b-content{position:absolute;top:68px;bottom:8px;left:0;right:0;overflow:hidden}.b-admin-left .b-content .content{-webkit-overflow-scrolling:touch}.b-admin-menu .e-item{overflow:hidden;text-decoration:none;outline:0}.b-admin-menu .e-link{position:relative;display:block;height:30px;line-height:29px;cursor:pointer;font-size:18px;z-index:1;cursor:default;background-color:transparent;color:#888;padding:4px 10px;outline:0;text-decoration:none}.b-admin-menu .e-item.selectable .e-link{cursor:pointer}.b-admin-menu .e-item.selectable:hover .e-link,.b-admin-menu .e-item.selectable.selected .e-link{background-color:#555;color:#fff}.b-admin-right .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px;color:#fff}.b-admin-right .b-content{position:absolute;top:58px;bottom:8px;left:0;right:8px;overflow-y:auto;z-index:2;background-color:#fff;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.3);-moz-box-shadow:0 2px 8px rgba(0,0,0,.3);box-shadow:0 2px 8px rgba(0,0,0,.3);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.b-admin-right .b-content .content{-webkit-overflow-scrolling:touch}.b-admin-right .b-settings-content{padding:20px}.b-admin-domains .process-place{width:600px;padding:14px 0;text-align:center;visibility:hidden}.b-admin-domains-list-table{width:600px}.b-admin-domains-list-table .e-item .e-action{cursor:pointer}.b-admin-domains-list-table .e-item .domain-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.b-admin-domains-list-table .e-item.disabled .domain-name{color:#bbb}.b-admin-domains-list-table .e-item .button-delete{margin-right:15px;visibility:hidden;opacity:0;filter:alpha(opacity=0)}.b-admin-domains-list-table .e-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1;filter:alpha(opacity=100)}.b-admin-domains-list-table .e-item .delete-domain,.b-admin-domains-list-table .e-item .disable-domain{cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.b-admin-domains-list-table .e-item.disabled .disable-domain{opacity:.5;filter:alpha(opacity=50)}.b-admin-domains-list-table .e-item .delete-domain:hover,.b-admin-domains-list-table .e-item .disable-domain:hover{opacity:1;filter:alpha(opacity=100)}.b-domain-content.modal{width:645px}.b-domain-content .modal-header{background-color:#fff}.b-domain-content .modal-body{position:relative;overflow:hidden;width:1300px;height:390px}.b-domain-content.domain-edit .modal-body{height:350px}.b-domain-content.domain-white-list-page .modal-body{left:-640px}.b-domain-content .error-desc{color:red;margin-left:10px}.b-domain-content .testing-done .imap-header,.b-domain-content .testing-done .smtp-header{color:green;font-weight:700}.b-domain-content .testing-error .imap-header,.b-domain-content .testing-error .smtp-header{color:red}.b-admin-packages .alert{width:650px}.b-admin-packages .process-place{visibility:hidden}.b-admin-packages-list-table{width:700px}.b-admin-packages-list-table .e-item .package-img{font-size:12px;margin-right:2px}.b-admin-packages-list-table .e-item .package-name.core{font-weight:700}.b-admin-packages-list-table .e-item .package-desc{color:#999;font-size:12px}.b-admin-packages-list-table .e-item .e-action{cursor:pointer}.b-admin-packages-list-table .e-item .package-release-parent,.b-admin-packages-list-table .e-item .package-actions-parent{text-align:center}.b-admin-packages-list-table .e-item .package-actions-parent{vertical-align:middle}.b-admin-plugins .process-place{visibility:hidden}.b-admin-plugins-list-table.disabled{opacity:.5;filter:alpha(opacity=50);background-color:#eee}.b-admin-plugins-list-table .e-item .e-action{cursor:pointer}.b-admin-plugins-list-table .e-item .plugin-img{font-size:12px;margin-right:2px}.b-admin-plugins-list-table .e-item.disabled .plugin-img,.b-admin-plugins-list-table .e-item.disabled .plugin-name{color:#bbb}.b-admin-plugins-list-table .e-item.disabled .disable-plugin{opacity:.5;filter:alpha(opacity=50)}.b-admin-plugin-property .help-block{margin-bottom:5px}.b-plugin-content.modal{width:660px}.b-plugin-content.modal .modal-body{overflow:auto}.b-plugin-content .modal-header{background-color:#fff}.b-plugin-content .information{display:inline-block;background-color:#ddd;border-radius:10px;cursor:pointer;height:25px;width:30px;text-align:center;padding-top:5px}.b-plugin-content textarea{width:400px;height:50px}.popups .b-activate-content{width:700px}.popups .b-activate-content .modal-header{background-color:#fff}.popups .b-activate-content .help-inline{padding-left:0}.b-settins-left .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 0 0 8px}.b-settins-left .b-content{position:absolute;top:68px;bottom:8px;left:0;right:0;overflow:hidden}.b-settins-left .b-content .content{-webkit-overflow-scrolling:touch}.b-settings-menu .e-item{overflow:hidden;text-decoration:none;outline:0}.b-settings-menu .e-link{position:relative;display:block;height:30px;line-height:29px;font-size:18px;z-index:1;cursor:default;background-color:transparent;color:#888;padding:4px 10px;outline:0;text-decoration:none}.b-settings-menu .e-item.selectable .e-link{cursor:pointer}.b-settings-menu .e-item.selectable:hover .e-link,.b-settings-menu .e-item.selectable.selected .e-link{background-color:#555;color:#fff}.b-settins-right .b-toolbar{position:absolute;top:0;right:0;left:0;height:34px;padding:8px 5px;color:#fff}.b-settins-right .b-content{position:absolute;top:58px;bottom:8px;left:0;right:8px;overflow-y:auto;z-index:2;background-color:#fff;border:1px solid #aaa;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.3);-moz-box-shadow:0 2px 8px rgba(0,0,0,.3);box-shadow:0 2px 8px rgba(0,0,0,.3);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.b-settins-right .b-content .content{-webkit-overflow-scrolling:touch}.b-settins-right .b-settings-content{padding:20px}.b-settings-general .notification-desc-denied{color:#999;display:none}.b-settings-general .denied-by-browser .notification-desc-denied{display:inline}.b-settings-general .denied-by-browser .notification-desc{color:#999}.b-settings-general .flag-selector{padding-top:5px}.b-settings-general .flag-name{border-bottom:1px dashed #555}.b-settings-accounts .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-accounts .list-table{width:600px}.b-settings-accounts .list-table td{padding:4px 8px;line-height:30px}.b-settings-accounts .list-table .account-img{font-size:12px;margin-right:5px}.b-settings-accounts .list-table .account-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;line-height:22px;cursor:default}.b-settings-accounts .account-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0;filter:alpha(opacity=0)}.b-settings-accounts .account-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1;filter:alpha(opacity=100)}.b-settings-accounts .account-item .delete-account{cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.b-settings-identities .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-identities .list-table{width:600px}.b-settings-identities .list-table td{padding:4px 8px;line-height:30px}.b-settings-identities .list-table .identity-img{font-size:12px;margin-right:5px}.b-settings-identities .list-table .identity-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;line-height:22px;cursor:pointer}.b-settings-identities .identity-item .e-action{cursor:pointer}.b-settings-identities .identity-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0;filter:alpha(opacity=0)}.b-settings-identities .identity-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1;filter:alpha(opacity=100)}.b-settings-identities .identity-item .delete-identity{cursor:pointer;opacity:.5;filter:alpha(opacity=50)}.b-settings-folders.ignore-folder-subscribe .subscribe-folder,.b-settings-folders.ignore-folder-subscribe .unsubscribe-folder{display:none}.b-settings-folders .process-place{text-align:center;width:600px;padding:14px 0}.b-settings-folders .folders-list-error{width:550px;margin:10px 0}.b-settings-folders .list-table{width:600px}.b-settings-folders .list-table .e-action{cursor:pointer}.b-settings-folders .list-table td{padding:4px 8px;line-height:30px}.b-settings-folders .list-table .folder-padding{display:inline-block;width:0}.b-settings-folders .list-table .folder-name{display:inline-block;word-break:break-all;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:7px;line-height:22px;cursor:default}.b-settings-folders .list-table .folder-system-name{display:inline-block;line-height:22px;color:#999;cursor:default}.b-settings-folders .list-table .folder-name.can-be-edited:hover{border-bottom:1px dashed #333;cursor:pointer}.b-settings-folders .list-table .folder-name-input{border-width:1px;margin-bottom:0}.b-settings-folders .folder-item .button-delete{margin-right:15px;margin-top:5px;visibility:hidden;opacity:0;filter:alpha(opacity=0)}.b-settings-folders .folder-item .delete-access.button-delete{visibility:visible;margin-right:0;opacity:1;filter:alpha(opacity=100)}.b-settings-folders .folder-item .delete-folder,.b-settings-folders .folder-item .subscribe-folder,.b-settings-folders .folder-item .unsubscribe-folder{cursor:pointer;opacity:.6;filter:alpha(opacity=60)}.b-settings-folders .folder-item .unsubscribe-folder{opacity:.25;filter:alpha(opacity=25)}.b-settings-folders .folder-padding.deep-1{width:25px}.b-settings-folders .folder-padding.deep-2{width:40px}.b-settings-folders .folder-padding.deep-3{width:55px}.b-settings-folders .folder-padding.deep-4{width:70px}.b-settings-folders .folder-padding.deep-5{width:85px}.b-themes-list .e-item{display:inline-block;border:2px solid transparent;cursor:pointer;color:#000;background-color:#fff;padding:16px;margin:5px}.b-themes-list .e-item:hover{border:2px solid grey}.b-themes-list .e-item.selected{background-color:#eee;border:2px solid #000}.b-themes-list .e-item .e-image{width:100px;height:100px;border:1px solid #ddd}@keyframes highlight-folder-row{0%{transform:scale(1)}50%{transform:scale(1.1)}100%{transform:scale(1)}}@-moz-keyframes highlight-folder-row{0%{-moz-transform:scale(1)}50%{-moz-transform:scale(1.1)}100%{-moz-transform:scale(1)}}@-webkit-keyframes highlight-folder-row{0%{-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.1)}100%{-webkit-transform:scale(1)}}@-webkit-keyframes textLoadingAnimationKeyFrame{0%{opacity:1}33%{opacity:0}100%{opacity:1}}@-moz-keyframes textLoadingAnimationKeyFrame{0%{opacity:1}33%{opacity:0}100%{opacity:1}}@keyframes textLoadingAnimationKeyFrame{0%{opacity:1}33%{opacity:0}100%{opacity:1}}@-webkit-keyframes animate-stripes{0%{background-position:0 0}100%{background-position:60px 0}}@-moz-keyframes animate-stripes{0%{background-position:0 0}100%{background-position:60px 0}}@keyframes animate-stripes{0%{background-position:0 0}100%{background-position:60px 0}}.rl-anim.rgba.cssanimations.backgroundsize .e-strip-animation{-webkit-background-size:60px 60px;-moz-background-size:60px 60px;background-size:60px 60px;background-image:-webkit-linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);background-image:linear-gradient(135deg,rgba(0,0,0,.1) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.1) 50%,rgba(0,0,0,.1) 75%,transparent 75%,transparent);-webkit-animation:animate-stripes 2s linear infinite;-moz-animation:animate-stripes 2s linear infinite;animation:animate-stripes 2s linear infinite}.rl-anim.csstransitions .b-settings-folders .folder-item .button-delete{-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.rl-anim.csstransitions .b-settings-accounts .account-item .button-delete{-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.rl-anim.csstransitions .b-settings-identities .identity-item .button-delete{-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.rl-anim.csstransitions .b-admin-domains .e-item .button-delete{-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.rl-anim.csstransitions .b-compose .button-delete{-webkit-transition:margin-left .2s linear;-moz-transition:margin-left .2s linear;-o-transition:margin-left .2s linear;transition:margin-left .2s linear}.rl-anim.cssanimations .b-folders .e-item .anim-action-class{-webkit-animation:highlight-folder-row .5s linear;-moz-animation:highlight-folder-row .5s linear;animation:highlight-folder-row .5s linear}.rl-anim.csstransitions .messageList .messageListItem{-webkit-transition:max-height 400ms ease;-moz-transition:max-height 400ms ease;-o-transition:max-height 400ms ease;transition:max-height 400ms ease}.rl-anim.csstransitions .messageList .listDragOver{-webkit-transition:all 400ms ease;-moz-transition:all 400ms ease;-o-transition:all 400ms ease;transition:all 400ms ease}.rl-anim.csstransitions .b-list-content .e-contact-item{-webkit-transition:max-height 400ms ease;-moz-transition:max-height 400ms ease;-o-transition:max-height 400ms ease;transition:max-height 400ms ease}.rl-anim.csstransitions .modal.b-domain-content .modal-body{-webkit-transition:left 500ms ease;-moz-transition:left 500ms ease;-o-transition:left 500ms ease;transition:left 500ms ease}.rl-anim.csstransitions .modal-open .popups .modal{-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-o-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transition:.3s all cubic-bezier(0.250,.460,.450,.940);-moz-transition:.3s all cubic-bezier(0.250,.460,.450,.940);-o-transition:.3s all cubic-bezier(0.250,.460,.450,.940);transition:.3s all cubic-bezier(0.250,.460,.450,.940);-webkit-transform:scale(0.9);-moz-transform:scale(0.9);-ms-transform:scale(0.9);-o-transform:scale(0.9);transform:scale(0.9)}.rl-anim .modal-open .popups .popup-active.modal{-webkit-transform:none;-moz-transform:none;-o-transform:none;transform:none}.rl-anim.cssanimations .b-compose.loading .b-header-toolbar{-webkit-background-size:60px 60px;-moz-background-size:60px 60px;background-size:60px 60px;background-image:-webkit-linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);background-image:linear-gradient(135deg,rgba(255,255,255,.2) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.2) 50%,rgba(255,255,255,.2) 75%,transparent 75%,transparent);-webkit-animation:animate-stripes 2s linear infinite;-moz-animation:animate-stripes 2s linear infinite;animation:animate-stripes 2s linear infinite}.textLoadingAnimationD1,.textLoadingAnimationD2,.textLoadingAnimationD3{-webkit-animation:textLoadingAnimationKeyFrame 1s linear infinite 0s;-moz-animation:textLoadingAnimationKeyFrame 1s linear infinite 0s;animation:textLoadingAnimationKeyFrame 1s linear infinite 0s}.textLoadingAnimationD2{-webkit-animation-delay:.3s;-moz-animation-delay:.3s;animation-delay:.3s}.textLoadingAnimationD3{-webkit-animation-delay:.6s;-moz-animation-delay:.6s;animation-delay:.6s}.editorToolbar{position:relative;height:20px;margin-top:10px;line-height:19px}.editorToolbar.editorHideToolbar .editorToolbarButtom{display:none}.editorToolbar .editorSwitcher{display:inline-block;vertical-align:middle}.editorToolbar .editorToolbarButtom{display:inline-block;width:16px;height:16px;padding:3px}.editorToolbar .editorToolbarButtom a{display:inline-block;border:0;margin:0;padding:0;width:16px;height:16px;cursor:default;background:url(images/editor.png)}.editorToolbar .editorToolbarButtom a.bold{background-position:0 0}.editorToolbar .editorToolbarButtom a.italic{background-position:-16px 0}.editorToolbar .editorToolbarButtom a.underline{background-position:-32px 0}.editorToolbar .editorToolbarButtom a.strikethrough{background-position:-48px 0}.editorToolbar .editorToolbarButtom a.link{background-position:-64px 0}.editorToolbar .editorToolbarButtom a.unlink{background-position:-80px 0}.editorToolbar .editorToolbarButtom a.orderedlist{background-position:-96px 0}.editorToolbar .editorToolbarButtom a.unorderedlist{background-position:-112px 0}.editorToolbar .editorToolbarButtom a.image{background-position:-128px 0}.editorToolbar .editorToolbarButtom a.h1{background-position:0 -16px}.editorToolbar .editorToolbarButtom a.h2{background-position:-16px -16px}.editorToolbar .editorToolbarButtom a.h3{background-position:-32px -16px}.editorToolbar .editorToolbarButtom a.h4{background-position:-48px -16px}.editorToolbar .editorToolbarButtom a.h5{background-position:-64px -16px}.editorToolbar .editorToolbarButtom a.h6{background-position:-80px -16px}.editorToolbar .editorToolbarButtom a.subscript{background-position:-96px -16px}.editorToolbar .editorToolbarButtom a.superscript{background-position:-112px -16px}.editorToolbar .editorToolbarButtom a.indent{background-position:-128px -16px}.editorToolbar .editorToolbarButtom a.outdent{background-position:-144px -16px}.editorToolbar .editorToolbarButtom a.horizontalrule{background-position:-160px -16px}.editorToolbar .editorToolbarButtom a.p{background-position:-176px -16px}.editorToolbar .editorToolbarButtom a.justifyleft{background-position:0 -32px}.editorToolbar .editorToolbarButtom a.justifycenter{background-position:-16px -32px}.editorToolbar .editorToolbarButtom a.justifyright{background-position:-32px -32px}.editorToolbar .editorToolbarButtom a.increasefontsize{background-position:-48px -32px}.editorToolbar .editorToolbarButtom a.decreasefontsize{background-position:-64px -32px}.editorToolbar .editorToolbarButtom a.forecolor{background-position:-80px -32px}.editorToolbar .editorToolbarButtom a.backcolor{background-position:-80px -32px}.editorToolbar .editorToolbarButtom a.removeformat{background-position:-144px 0}.textAreaParent{padding:0}.textAreaParent .editorHtmlArea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:0!important;overflow:auto;overflow-y:scroll;font-family:arial,sans-serif;font-size:13px;line-height:16px;margin:0;padding:8px}.textAreaParent .editorHtmlArea ul{padding-left:40px}.textAreaParent .editorHtmlArea ul li{list-style-type:disc!important}.textAreaParent .editorHtmlArea ol{padding-left:40px}.textAreaParent .editorHtmlArea ol li{list-style-type:decimal!important}.textAreaParent .editorHtmlArea blockquote{border-left:solid 2px #444;margin-left:5px;padding-left:5px}.textAreaParent .editorHtmlArea img{vertical-align:bottom}.textAreaParent .editorHtmlArea.editorDragOver{background:#ffffef}.textAreaParent .editorTextArea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;border:0!important;width:100%;line-height:16px;margin:0;padding:8px;overflow:auto;overflow-y:scroll}.editorColorPicker .editorCpColors{float:left;margin:0;clear:both;width:128px;border:1px solid #000;backgroud:#000}.editorColorPicker .editorCpColors .editorCpColor{border:1px solid #fff;float:left;width:14px;height:14px}.editorSwitcher{color:#369;text-decoration:underline;cursor:pointer;float:right;padding-bottom:6px}.editorFontStylePicker .editorFpFonts{padding:5px;border:1px solid #000;background-color:#fff}.editorFontStylePicker .editorFpFonts .editorFpFont{padding:5px} \ No newline at end of file diff --git a/rainloop/v/1.3.10.492/static/js/admin.min.js b/rainloop/v/1.3.10.492/static/js/admin.min.js deleted file mode 100644 index 70d7f7747..000000000 --- a/rainloop/v/1.3.10.492/static/js/admin.min.js +++ /dev/null @@ -1,159 +0,0 @@ -(function(g,i,d,fa,y,j){function p(){this.sBase="#/";this.sCdnStaticDomain=e.settingsGet("CdnStaticDomain");this.sVersion=e.settingsGet("Version");this.sSpecSuffix=e.settingsGet("AuthAccountHash")||"0";this.sServer=(e.settingsGet("IndexFile")||"./")+"?";this.sCdnStaticDomain=""===this.sCdnStaticDomain?this.sCdnStaticDomain:"/"===this.sCdnStaticDomain.substr(-1)?this.sCdnStaticDomain:this.sCdnStaticDomain+"/"}function N(){}function O(){}function P(){var a=j.find([O,N],function(a){return a.supported()}); -a&&(this.oDriver=new a)}function ga(){}function t(a,b){this.sPosition=c.pString(a);this.sTemplate=c.pString(b);this.viewModelName="";this.viewModelVisibility=d.observable(!1);"Popups"===this.sPosition&&(this.modalVisibility=d.observable(!1));this.viewModelDom=null}function w(a,b){this.sScreenName=a;this.aViewModels=c.isArray(b)?b:[]}function r(){this.sDefaultScreenName="";this.oScreens={};this.oCurrentScreen=this.oBoot=null;this.popupVisibility=d.observable(!1);this.popupVisibility.subscribe(function(a){e&& -e.popupVisibility(a)})}function s(a,b){this.email=a||"";this.name=b||"";this.privateType=null;this.clearDuplicateName()}function B(){t.call(this,"Popups","PopupsDomain");this.edit=d.observable(!1);this.saving=d.observable(!1);this.savingError=d.observable("");this.whiteListPage=d.observable(!1);this.testing=d.observable(!1);this.testingDone=d.observable(!1);this.testingImapError=d.observable(!1);this.testingSmtpError=d.observable(!1);this.imapServerFocus=d.observable(!1);this.smtpServerFocus=d.observable(!1); -this.name=d.observable("");this.imapServer=d.observable("");this.imapPort=d.observable(m.Values.ImapDefaulPort);this.imapSecure=d.observable(f.ServerSecure.None);this.imapShortLogin=d.observable(!1);this.smtpServer=d.observable("");this.smtpPort=d.observable(m.Values.SmtpDefaulPort);this.smtpSecure=d.observable(f.ServerSecure.None);this.smtpShortLogin=d.observable(!1);this.smtpAuth=d.observable(!0);this.whiteList=d.observable("");this.imapServerFocus.subscribe(function(a){a&&(""!==this.name()&&""=== -this.imapServer())&&this.imapServer(this.name())},this);this.smtpServerFocus.subscribe(function(a){a&&(""!==this.imapServer()&&""===this.smtpServer())&&this.smtpServer(this.imapServer())},this);this.headerText=d.computed(function(){var a=this.name();return this.edit()?'Edit Domain "'+a+'"':"Add Domain"+(""===a?"":' "'+a+'"')},this);this.domainIsComputed=d.computed(function(){return""!==this.name()&&""!==this.imapServer()&&""!==this.imapPort()&&""!==this.smtpServer()&&""!==this.smtpPort()},this);this.canBeTested= -d.computed(function(){return!this.testing()&&this.domainIsComputed()},this);this.canBeSaved=d.computed(function(){return!this.saving()&&this.domainIsComputed()},this);this.createOrAddCommand=c.createCommand(this,function(){this.saving(!0);e.remote().createOrUpdateDomain(j.bind(this.onDomainCreateOrSaveResponse,this),!this.edit(),this.name(),this.imapServer(),this.imapPort(),this.imapSecure(),this.imapShortLogin(),this.smtpServer(),this.smtpPort(),this.smtpSecure(),this.smtpShortLogin(),this.smtpAuth(), -this.whiteList())},this.canBeSaved);this.testConnectionCommand=c.createCommand(this,function(){this.whiteListPage(!1);this.testingDone(!1);this.testingImapError(!1);this.testingSmtpError(!1);this.testing(!0);e.remote().testConnectionForDomain(j.bind(this.onTestConnectionResponse,this),this.imapServer(),this.imapPort(),this.imapSecure(),this.smtpServer(),this.smtpPort(),this.smtpSecure(),this.smtpAuth())},this.canBeTested);this.whiteListCommand=c.createCommand(this,function(){this.whiteListPage(!this.whiteListPage())})} -function Q(){t.call(this,"Popups","PopupsPlugin");var a=this;this.onPluginSettingsUpdateResponse=j.bind(this.onPluginSettingsUpdateResponse,this);this.saveError=d.observable("");this.name=d.observable("");this.readme=d.observable("");this.configures=d.observableArray([]);this.hasReadme=d.computed(function(){return""!==this.readme()},this);this.hasConfiguration=d.computed(function(){return 0').appendTo("body");H.on("error",function(a){e&&(a&&a.originalEvent&&a.originalEvent.message&&-1===c.inArray(a.originalEvent.message, -["Script error.","Uncaught Error: Error calling method on NPObject."]))&&e.remote().jsError(c.emptyFunction,a.originalEvent.message,a.originalEvent.filename,a.originalEvent.lineno,location&&location.toString?location.toString():"",I.attr("class"),c.microtime()-k.now)})}function v(){u.call(this);this.oCache=this.oRemote=this.oData=null}var m={},f={},l={},c={},o={},k={},A={settings:[],"settings-removed":[],"settings-disabled":[]},q=null,U=g.rainloopAppData||{},da=g.rainloopI18N||{},I=i("html"),H=i(g), -ka=i(g.document),V=g.Notification&&g.Notification.requestPermission?g.Notification:null,e=null;k.now=(new Date).getTime();k.minuteTick=d.observable(!0);k.fiveMinuteTick=d.observable(!0);k.langChangeTick=d.observable(!0);k.iAjaxErrorCount=0;k.iTokenErrorCount=0;k.iMessageBodyCacheCount=0;k.bUnload=!1;k.sUserAgent=(navigator.userAgent||"").toLowerCase();k.bIsiOSDevice=-1/g,">").replace(/"/g,""").replace(/'/g,"'"):""};c.splitPlainText=function(a, -b){for(var h="",d="",e=a,f=0,g=0,b=c.isUnd(b)?100:b;e.length>b;)d=e.substring(0,b),f=d.lastIndexOf(" "),g=d.lastIndexOf("\n"),-1!==g&&(f=g),-1===f&&(f=b),h+=d.substring(0,f)+"\n",e=e.substring(f+1);return h+e};var W={};c.timeOutAction=function(a,b,h){c.isUnd(W[a])&&(W[a]=0);g.clearTimeout(W[a]);W[a]=g.setTimeout(b,h)};var ea={};c.timeOutActionSecond=function(a,b,h){ea[a]||(ea[a]=g.setTimeout(function(){b();ea[a]=0},h))};var z=!1;c.audio=function(a,b){if(!1===z)if(k.bIsiOSDevice)z=null;else{var h= -!1,c=!1,d=g.Audio?new g.Audio:null;d&&d.canPlayType&&d.play?((h=""!==d.canPlayType('audio/mpeg; codecs="mp3"'))||(c=""!==d.canPlayType('audio/ogg; codecs="vorbis"')),h||c?(z=d,z.preload="none",z.loop=!1,z.autoplay=!1,z.muted=!1,z.src=h?a:b):z=null):z=null}return z};c.hos=function(a,b){return a&&Object.hasOwnProperty?Object.hasOwnProperty.call(a,b):!1};c.i18n=function(a,b,h){var d="",a=c.isUnd(da[a])?c.isUnd(h)?a:h:da[a];if(!c.isUnd(b)&&!c.isNull(b))for(d in b)c.hos(b,d)&&(a=a.replace("%"+d+"%",b[d])); -return a};c.i18nToNode=function(a){j.defer(function(){i(".i18n",a).each(function(){var a=i(this),h="";(h=a.data("i18n-text"))?a.text(c.i18n(h)):((h=a.data("i18n-html"))&&a.html(c.i18n(h)),(h=a.data("i18n-placeholder"))&&a.attr("placeholder",c.i18n(h)))})})};c.i18nToDoc=function(){g.rainloopI18N&&(da=g.rainloopI18N||{},c.i18nToNode(ka),k.langChangeTick(!k.langChangeTick()));g.rainloopI18N={}};c.initOnStartOrLangChange=function(a,b,c){a&&a.call(b);c?k.langChangeTick.subscribe(function(){a&&a.call(b); -c.call(b)}):a&&k.langChangeTick.subscribe(a,b)};c.inFocus=function(){var a=document.activeElement;return a&&("INPUT"===a.tagName||"TEXTAREA"===a.tagName||"IFRAME"===a.tagName||"DIV"===a.tagName&&"editorHtmlArea"===a.className&&a.contentEditable)};c.removeInFocus=function(){if(document&&document.activeElement&&document.activeElement.blur){var a=i(document.activeElement);(a.is("input")||a.is("textarea"))&&document.activeElement.blur()}};c.removeSelection=function(){if(g&&g.getSelection){var a=g.getSelection(); -a&&a.removeAllRanges&&a.removeAllRanges()}else document&&(document.selection&&document.selection.empty)&&document.selection.empty()};c.replySubjectAdd=function(a,b){var h=null,d=c.trim(b);null!==(h=(new g.RegExp("^"+a+"[\\s]?\\:(.*)$","gi")).exec(b))&&!c.isUnd(h[1])?d=a+"[2]: "+h[1]:null!==(h=(new g.RegExp("^("+a+"[\\s]?[\\[\\(]?)([\\d]+)([\\]\\)]?[\\s]?\\:.*)$","gi")).exec(b))&&!c.isUnd(h[1])&&!c.isUnd(h[2])&&!c.isUnd(h[3])?(c.pInt(h[2]),d=h[1]+(c.pInt(h[2])+1)+h[3]):d=a+": "+b;return d};c.roundNumber= -function(a,b){return Math.round(a*Math.pow(10,b))/Math.pow(10,b)};c.friendlySize=function(a){a=c.pInt(a);return 1073741824<=a?c.roundNumber(a/1073741824,1)+"GB":1048576<=a?c.roundNumber(a/1048576,1)+"MB":1024<=a?c.roundNumber(a/1024,0)+"KB":a+"B"};c.log=function(a){g.console&&g.console.log&&g.console.log(a)};c.getNotification=function(a){a=c.pInt(a);return c.isUnd(l[a])?"":l[a]};c.initNotificationLanguage=function(){l[f.Notification.InvalidToken]=c.i18n("NOTIFICATIONS/INVALID_TOKEN");l[f.Notification.AuthError]= -c.i18n("NOTIFICATIONS/AUTH_ERROR");l[f.Notification.AccessError]=c.i18n("NOTIFICATIONS/ACCESS_ERROR");l[f.Notification.ConnectionError]=c.i18n("NOTIFICATIONS/CONNECTION_ERROR");l[f.Notification.CaptchaError]=c.i18n("NOTIFICATIONS/CAPTCHA_ERROR");l[f.Notification.SocialFacebookLoginAccessDisable]=c.i18n("NOTIFICATIONS/SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE");l[f.Notification.SocialTwitterLoginAccessDisable]=c.i18n("NOTIFICATIONS/SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE");l[f.Notification.SocialGoogleLoginAccessDisable]= -c.i18n("NOTIFICATIONS/SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE");l[f.Notification.DomainNotAllowed]=c.i18n("NOTIFICATIONS/DOMAIN_NOT_ALLOWED");l[f.Notification.AccountNotAllowed]=c.i18n("NOTIFICATIONS/ACCOUNT_NOT_ALLOWED");l[f.Notification.CantGetMessageList]=c.i18n("NOTIFICATIONS/CANT_GET_MESSAGE_LIST");l[f.Notification.CantGetMessage]=c.i18n("NOTIFICATIONS/CANT_GET_MESSAGE");l[f.Notification.CantDeleteMessage]=c.i18n("NOTIFICATIONS/CANT_DELETE_MESSAGE");l[f.Notification.CantMoveMessage]=c.i18n("NOTIFICATIONS/CANT_MOVE_MESSAGE"); -l[f.Notification.CantSaveMessage]=c.i18n("NOTIFICATIONS/CANT_SAVE_MESSAGE");l[f.Notification.CantSendMessage]=c.i18n("NOTIFICATIONS/CANT_SEND_MESSAGE");l[f.Notification.InvalidRecipients]=c.i18n("NOTIFICATIONS/INVALID_RECIPIENTS");l[f.Notification.CantCreateFolder]=c.i18n("NOTIFICATIONS/CANT_CREATE_FOLDER");l[f.Notification.CantRenameFolder]=c.i18n("NOTIFICATIONS/CANT_RENAME_FOLDER");l[f.Notification.CantDeleteFolder]=c.i18n("NOTIFICATIONS/CANT_DELETE_FOLDER");l[f.Notification.CantDeleteNonEmptyFolder]= -c.i18n("NOTIFICATIONS/CANT_DELETE_NON_EMPTY_FOLDER");l[f.Notification.CantSubscribeFolder]=c.i18n("NOTIFICATIONS/CANT_SUBSCRIBE_FOLDER");l[f.Notification.CantUnsubscribeFolder]=c.i18n("NOTIFICATIONS/CANT_UNSUBSCRIBE_FOLDER");l[f.Notification.CantSaveSettings]=c.i18n("NOTIFICATIONS/CANT_SAVE_SETTINGS");l[f.Notification.CantSavePluginSettings]=c.i18n("NOTIFICATIONS/CANT_SAVE_PLUGIN_SETTINGS");l[f.Notification.DomainAlreadyExists]=c.i18n("NOTIFICATIONS/DOMAIN_ALREADY_EXISTS");l[f.Notification.CantInstallPackage]= -c.i18n("NOTIFICATIONS/CANT_INSTALL_PACKAGE");l[f.Notification.CantDeletePackage]=c.i18n("NOTIFICATIONS/CANT_DELETE_PACKAGE");l[f.Notification.InvalidPluginPackage]=c.i18n("NOTIFICATIONS/INVALID_PLUGIN_PACKAGE");l[f.Notification.UnsupportedPluginPackage]=c.i18n("NOTIFICATIONS/UNSUPPORTED_PLUGIN_PACKAGE");l[f.Notification.LicensingServerIsUnavailable]=c.i18n("NOTIFICATIONS/LICENSING_SERVER_IS_UNAVAILABLE");l[f.Notification.LicensingExpired]=c.i18n("NOTIFICATIONS/LICENSING_EXPIRED");l[f.Notification.LicensingBanned]= -c.i18n("NOTIFICATIONS/LICENSING_BANNED");l[f.Notification.DemoSendMessageError]=c.i18n("NOTIFICATIONS/DEMO_SEND_MESSAGE_ERROR");l[f.Notification.AccountAlreadyExists]=c.i18n("NOTIFICATIONS/ACCOUNT_ALREADY_EXISTS");l[f.Notification.MailServerError]=c.i18n("NOTIFICATIONS/MAIL_SERVER_ERROR");l[f.Notification.UnknownNotification]=c.i18n("NOTIFICATIONS/UNKNOWN_ERROR");l[f.Notification.UnknownError]=c.i18n("NOTIFICATIONS/UNKNOWN_ERROR")};c.getUploadErrorDescByCode=function(a){var b="";switch(c.pInt(a)){case f.UploadErrorCode.FileIsTooBig:b= -c.i18n("UPLOAD/ERROR_FILE_IS_TOO_BIG");break;case f.UploadErrorCode.FilePartiallyUploaded:b=c.i18n("UPLOAD/ERROR_FILE_PARTIALLY_UPLOADED");break;case f.UploadErrorCode.FileNoUploaded:b=c.i18n("UPLOAD/ERROR_NO_FILE_UPLOADED");break;case f.UploadErrorCode.MissingTempFolder:b=c.i18n("UPLOAD/ERROR_MISSING_TEMP_FOLDER");break;case f.UploadErrorCode.FileOnSaveingError:b=c.i18n("UPLOAD/ERROR_ON_SAVING_FILE");break;case f.UploadErrorCode.FileType:b=c.i18n("UPLOAD/ERROR_FILE_TYPE");break;default:b=c.i18n("UPLOAD/ERROR_UNKNOWN")}return b}; -c.killCtrlAandS=function(a){if(a=a||g.event){var b=a.target||a.srcElement,c=a.keyCode||a.which;if(a.ctrlKey&&c===f.EventKeyCode.S)a.preventDefault();else if((!b||!b.tagName||!b.tagName.match(/INPUT|TEXTAREA/i))&&a.ctrlKey&&c===f.EventKeyCode.A)g.getSelection?g.getSelection().removeAllRanges():g.document.selection&&g.document.selection.clear&&g.document.selection.clear(),a.preventDefault()}};c.createCommand=function(a,b,h){var e=b?function(){e.canExecute&&e.canExecute()&&b.apply(a,Array.prototype.slice.call(arguments)); -return!1}:function(){};e.enabled=d.observable(!0);h=c.isUnd(h)?!0:h;e.canExecute=c.isFunc(h)?d.computed(function(){return e.enabled()&&h.call(a)}):d.computed(function(){return e.enabled()&&!!h});return e};c.initDataConstructorBySettings=function(a){a.editorDefaultType=d.observable(f.EditorDefaultType.Html);a.showImages=d.observable(!1);a.interfaceAnimation=d.observable(f.InterfaceAnimation.Full);k.sAnimationType=f.InterfaceAnimation.Full;a.allowThemes=d.observable(!0);a.allowCustomLogin=d.observable(!1); -a.allowLanguagesOnSettings=d.observable(!0);a.allowLanguagesOnLogin=d.observable(!0);a.desktopNotifications=d.observable(!1);a.useThreads=d.observable(!0);a.replySameFolder=d.observable(!0);a.usePreviewPane=d.observable(!0);a.useCheckboxesInList=d.observable(!0);a.interfaceAnimation.subscribe(function(a){if(k.bMobileDevice||a===f.InterfaceAnimation.None)I.removeClass("rl-anim rl-anim-full").addClass("no-rl-anim"),k.sAnimationType=f.InterfaceAnimation.None;else switch(a){case f.InterfaceAnimation.Full:I.removeClass("no-rl-anim").addClass("rl-anim rl-anim-full"); -k.sAnimationType=a;break;case f.InterfaceAnimation.Normal:I.removeClass("no-rl-anim rl-anim-full").addClass("rl-anim"),k.sAnimationType=a}});a.interfaceAnimation.valueHasMutated();a.desktopNotificationsPermisions=d.computed(function(){a.desktopNotifications();var b=f.DesktopNotifications.NotSupported;if(V&&V.permission)switch(V.permission.toLowerCase()){case "granted":b=f.DesktopNotifications.Allowed;break;case "denied":b=f.DesktopNotifications.Denied;break;case "default":b=f.DesktopNotifications.NotAllowed}else g.webkitNotifications&& -g.webkitNotifications.checkPermission&&(b=g.webkitNotifications.checkPermission());return b});a.useDesktopNotifications=d.computed({read:function(){return a.desktopNotifications()&&f.DesktopNotifications.Allowed===a.desktopNotificationsPermisions()},write:function(b){b?(b=a.desktopNotificationsPermisions(),f.DesktopNotifications.Allowed===b?a.desktopNotifications(!0):f.DesktopNotifications.NotAllowed===b?V.requestPermission(function(){a.desktopNotifications.valueHasMutated();f.DesktopNotifications.Allowed=== -a.desktopNotificationsPermisions()?a.desktopNotifications()?a.desktopNotifications.valueHasMutated():a.desktopNotifications(!0):a.desktopNotifications()?a.desktopNotifications(!1):a.desktopNotifications.valueHasMutated()}):a.desktopNotifications(!1)):a.desktopNotifications(!1)}});a.language=d.observable("");a.languages=d.observableArray([]);a.mainLanguage=d.computed({read:a.language,write:function(b){b!==a.language()?-1=a.diff(h,"hours")?d:a.format("L")===h.format("L")?c.i18n("MESSAGE_LIST/TODAY_AT", -{TIME:h.format("LT")}):a.clone().subtract("days",1).format("L")===h.format("L")?c.i18n("MESSAGE_LIST/YESTERDAY_IN",{TIME:h.format("LT")}):a.year()===h.year()?h.format("D MMM."):h.format("LL")},a)};c.isFolderExpanded=function(a){var b=e.local().get(f.ClientSideKeyName.ExpandedFolders);return j.isArray(b)&&-1!==j.indexOf(b,a)};c.setExpandedFolder=function(a,b){var c=e.local().get(f.ClientSideKeyName.ExpandedFolders);j.isArray(c)||(c=[]);b?(c.push(a),c=j.uniq(c)):c=j.without(c,a);e.local().set(f.ClientSideKeyName.ExpandedFolders, -c)};c.initLayoutResizer=function(a,b,c,d,f,M,g,k){var d=d||300,f=f||500,M=M||f-d/2,g=g||300,x=0,l=i(a),m=i(b),o=i(c),b=e.local().get(k)||M,p=function(a,b,c){if(b||c)a=o.width(),b=b?100*(b.size.width/a):null,null===b&&c&&(b=100*(l.width()/a)),null!==b&&(l.css({width:"",height:"",right:""+(100-b)+"%"}),m.css({width:"",height:"",left:""+b+"%"}))};b&&l.width(b);x=o.width()-g;x=f>x?x:f;l.resizable({minWidth:d,maxWidth:x,handles:"e",resize:p,stop:p});p(null,null,!0);H.resize(j.throttle(function(b,c){c&& -(c.element&&c.element[0].id&&"#"+c.element[0].id===""+a)&&(x=o.width()-g,x=f>x?x:f,l.resizable("option","maxWidth",x),c.size&&c.size.width&&e.local().set(k,c.size.width),p(null,null,!0))},400))};c.initBlockquoteSwitcher=function(a){if(a){var b=i("blockquote:not(.rl-bq-switcher)",a).filter(function(){return 0===i(this).parent().closest("blockquote",a).length});b&&0').insertBefore(a).click(function(){a.toggleClass("hidden-bq"); -c.windowResize()}).after("
    ").before("
    ")})}};c.removeBlockquoteSwitcher=function(a){a&&(i(a).find("blockquote.rl-bq-switcher").each(function(){i(this).removeClass("rl-bq-switcher hidden-bq")}),i(a).find(".rlBlockquoteSwitcher").each(function(){i(this).remove()}))};c.extendAsViewModel=function(a,b){b&&(b.__name=a,o.regViewModelHook(a,b),j.extend(b.prototype,t.prototype))};c.addSettingsViewModel=function(a,b,c,d,e){a.__rlSettingsData={Label:c,Template:b,Route:d,IsDefault:!!e};A.settings.push(a)}; -c.removeSettingsViewModel=function(a){A["settings-removed"].push(a)};c.disableSettingsViewModel=function(a){A["settings-disabled"].push(a)};c.convertThemeName=function(a){return c.trim(a.replace(/[^a-zA-Z]/g," ").replace(/([A-Z])/g," $1").replace(/[\s]+/g," "))};c.quoteName=function(a){return a.replace(/["]/g,'\\"')};c.microtime=function(){return(new Date).getTime()};c.convertLangName=function(a){return c.i18n("LANGS_NAMES/LANG_"+a.toUpperCase().replace(/[^a-zA-Z0-9]+/,"_"),null,a)};c.fakeMd5=function(a){for(var b= -"",a=c.isUnd(a)?32:c.pInt(a);b.length/g,">").replace(/")};c.draggeblePlace=function(){return i('
     
    ').appendTo("#rl-hidden")};c.defautOptionsAfterRender=function(a, -b){b&&!c.isUnd(b.disable)&&d.applyBindingsToNode(a,{disable:b.disable},b)};c.windowPopupKnockout=function(a,b,h,d){var e=null,f=g.open(""),j="__OpenerApplyBindingsUid"+c.fakeMd5()+"__",k=i("#"+b);g[j]=function(){if(f&&f.document.body&&k&&k[0]){var b=i(f.document.body);i("#rl-content",b).html(k.html());i("html",f.document).addClass("external "+i("html").attr("class"));c.i18nToNode(b);r.prototype.applyExternal(a,i("#rl-content",b)[0]);g[j]=null;d(f)}};f.document.open();f.document.write(''+ -c.encodeHtml(h)+'
    ');f.document.close();e=f.document.createElement("script");e.type="text/javascript";e.innerHTML="if(window&&window.opener&&window.opener['"+j+"']){window.opener['"+j+"']();window.opener['"+j+"']=null}";f.document.getElementsByTagName("head")[0].appendChild(e)};c.settingsSaveHelperFunction=function(a,b,h,d){h=h||null;d=c.isUnd(d)?1E3:c.pInt(d);return function(c,e,g,i,x){b.call(h,e&&e.Result?f.SaveSettingsStep.TrueResult: -f.SaveSettingsStep.FalseResult);a&&a.call(h,c,e,g,i,x);j.delay(function(){b.call(h,f.SaveSettingsStep.Idle)},d)}};c.settingsSaveHelperSimpleFunction=function(a,b){return c.settingsSaveHelperFunction(null,a,b,1E3)};c.resizeAndCrop=function(a,b,c){var d=new Image;d.onload=function(){var a=[0,0],d=document.createElement("canvas"),e=d.getContext("2d");d.width=b;d.height=b;a=this.width>this.height?[this.width-this.height,0]:[0,this.height-this.width];e.fillStyle="#fff";e.fillRect(0,0,b,b);e.drawImage(this, -a[0]/2,a[1]/2,this.width-a[0],this.height-a[1],0,0,b,b);c(d.toDataURL("image/jpeg"))};d.src=a};d.bindingHandlers.tooltip={init:function(a,b){if(!k.bMobileDevice){var h=i(a).data("tooltip-class")||"",e=i(a).data("tooltip-placement")||"top";i(a).tooltip({delay:{show:500,hide:100},html:!0,placement:e,trigger:"hover",title:function(){return''+c.i18n(d.utils.unwrapObservable(b()))+""}})}}};d.bindingHandlers.tooltip2={init:function(a,b){var c=i(a).data("tooltip-class")|| -"",d=i(a).data("tooltip-placement")||"top";i(a).tooltip({delay:{show:500,hide:100},html:!0,placement:d,title:function(){return''+b()()+""}})}};d.bindingHandlers.dropdown={init:function(a){i(a).closest(".dropdown").on("click",".e-item",function(){i(a).dropdown("toggle")})}};d.bindingHandlers.popover={init:function(a,b){i(a).popover(d.utils.unwrapObservable(b()))}};d.bindingHandlers.resizecrop={init:function(a){i(a).addClass("resizecrop").resizecrop({width:"100", -height:"100",wrapperCSS:{"border-radius":"10px"}})},update:function(a,b){b()();i(a).resizecrop({width:"100",height:"100"})}};d.bindingHandlers.onEnter={init:function(a,b,c,d){i(a).on("keypress",function(c){c&&13===g.parseInt(c.keyCode,10)&&(i(a).trigger("change"),b().call(d))})}};d.bindingHandlers.onEsc={init:function(a,b,c,d){i(a).on("keypress",function(c){c&&27===g.parseInt(c.keyCode,10)&&(i(a).trigger("change"),b().call(d))})}};d.bindingHandlers.modal={init:function(a,b){i(a).modal({keyboard:!1, -show:d.utils.unwrapObservable(b())}).on("hidden",function(){b()(!1)})},update:function(a,b){var c=d.utils.unwrapObservable(b());i(a).modal(c?"show":"hide");j.delay(function(){i(a).toggleClass("popup-active",c)},1)}};d.bindingHandlers.i18nInit={init:function(a){c.i18nToNode(a)}};d.bindingHandlers.i18nUpdate={update:function(a,b){d.utils.unwrapObservable(b());c.i18nToNode(a)}};d.bindingHandlers.link={update:function(a,b){i(a).attr("href",d.utils.unwrapObservable(b()))}};d.bindingHandlers.title={update:function(a, -b){i(a).attr("title",d.utils.unwrapObservable(b()))}};d.bindingHandlers.textF={init:function(a,b){i(a).text(d.utils.unwrapObservable(b()))}};d.bindingHandlers.initDom={init:function(a,b){b()(a)}};d.bindingHandlers.initResizeTrigger={init:function(a,b){var c=d.utils.unwrapObservable(b());i(a).css({height:c[1],"min-height":c[1]})},update:function(a,b){var h=d.utils.unwrapObservable(b()),e=c.pInt(h[1]),f=0,f=i(a).offset().top;0=h.left&&a.pageX<=h.left+d.width()&&(a.pageY>=b-100&&a.pageY<=b&&(b=function(){d.scrollTop(d.scrollTop()+3);c.windowResize()},d.data("timerScroll",g.setInterval(b,10)),b()),a.pageY>=h.top&&a.pageY<=h.top+100))h=function(){d.scrollTop(d.scrollTop()-3);c.windowResize()},d.data("timerScroll",g.setInterval(h,10)),h()})},h.stop=function(){i(e).each(function(){g.clearInterval(i(this).data("timerScroll"));i(this).data("timerScroll",!1)})});h.helper=function(a){return b()(a&&a.target?d.dataFor(a.target): -null)};i(a).draggable(h).on("mousedown",function(){c.removeInFocus()})}}};d.bindingHandlers.droppable={init:function(a,b,c){if(!k.bMobileDevice){var d=b(),e=(b=c())&&b.droppableOver?b.droppableOver:null,f=b&&b.droppableOut?b.droppableOut:null,b={tolerance:"pointer",hoverClass:"droppableHover"};d&&(b.drop=function(a,b){d(a,b)},e&&(b.over=function(a,b){e(a,b)}),f&&(b.out=function(a,b){f(a,b)}),i(a).droppable(b))}}};d.bindingHandlers.nano={init:function(a){k.bDisableNanoScroll||i(a).addClass("nano").nanoScroller({iOSNativeScrolling:!1, -preventPageScrolling:!0})}};d.bindingHandlers.saveTrigger={init:function(a){i(a).append('  ').addClass("settings-saved-trigger")},update:function(a,b){var c=d.utils.unwrapObservable(b()),e=i(a);switch(c.toString()){case "1":e.find(".animated,.error").hide().removeClass("visible").end().find(".success").show().addClass("visible");break;case "0":e.find(".animated,.success").hide().removeClass("visible").end().find(".error").show().addClass("visible"); -break;case "-2":e.find(".error,.success").hide().removeClass("visible").end().find(".animated").show().addClass("visible");break;default:e.find(".animated").hide().end().find(".error,.success").removeClass("visible")}}};d.bindingHandlers.select2={init:function(a,b){var h=0,f=null,la=new g.RegExp(/[a-zA-Z0-9\.\-_]+@[a-zA-Z0-9\.\-_]+/),M=new g.RegExp(/(.+) [<]?([^\s<@]+@[a-zA-Z0-9\.\-_]+)[>]?/),k=function(){return""},l=function(a){e.getAutocomplete(a.term,a.page,function(b,c){a.callback({more:!!c,results:j.map(b, -function(a){var b=a.toLine(!1);return{id:b,text:b,c:a}})})})};i(a).addClass("ko-select2").select2({query:function(a){a&&(0===h?(l(a),h=g.setTimeout(c.emptyFunction,100)):(g.clearInterval(h),h=g.setTimeout(function(){l(a)},100)))},formatSelection:function(a,b){var c=a&&a.c?a.c.select2Selection(b):a.text;if(null!==c)return c},formatResult:function(a,b,c,h){b=a&&a.c?a.c.select2Result(b):"";return""===b?h(a.text):b},createSearchChoice:function(a,b){return 0===b.length&&la.test(a)?{id:a,text:a}:null}, -formatNoMatches:k,formatSearching:function(){return c.i18n("SUGGESTIONS/SEARCHING_DESC")},formatInputTooShort:k,formatSelectionTooBig:k,multiple:!0,tokenSeparators:[",",";"],minimumInputLength:2,selectOnBlur:!1,closeOnSelect:!0,openOnEnter:!1});d.utils.domNodeDisposal.addDisposeCallback(a,function(){i(a).select2("destroy")});i(a).on("change",function(){for(var a=i(this).select2("data"),h=0,d=a.length,e=null,g=[];h").addClass("rl-view-model").addClass("RL-"+h.viewModelTemplate()).hide().attr("data-bind",'template: {name: "'+h.viewModelTemplate()+'"}, i18nInit: true'),j.appendTo(g),h.viewModelDom=j,a.__dom=j,"Popups"===f&&(h.cancelCommand=h.closeCommand=c.createCommand(h,function(){q.hideScreenPopup(a)})),o.runHook("view-model-pre-build",[a.__name,h,j]),d.applyBindings(h,j[0]),this.delegateRun(h, -"onBuild",[j]),o.runHook("view-model-post-build",[a.__name,h,j])):c.log("Cannot find view model position: "+f)}return a?a.__vm:null};r.prototype.applyExternal=function(a,b){a&&b&&d.applyBindings(a,b)};r.prototype.hideScreenPopup=function(a){a&&(a.__vm&&a.__dom)&&(a.__dom.hide(),a.__vm.modalVisibility(!1),this.delegateRun(a.__vm,"onHide"),this.popupVisibility(!1),j.defer(function(){a.__dom.find(".ko-select2").select2("close")}))};r.prototype.showScreenPopup=function(a,b){a&&(this.buildViewModel(a), -a.__vm&&a.__dom&&(a.__dom.show(),a.__vm.modalVisibility(!0),this.delegateRun(a.__vm,"onShow",b||[]),this.popupVisibility(!0),o.runHook("view-model-on-show",[a.__name,a.__vm,b||[]])))};r.prototype.screenOnRoute=function(a,b){var d=this,e=null,f=null;""===c.pString(a)&&(a=this.sDefaultScreenName);if(""!==a){e=this.screen(a);if(!e&&(e=this.screen(this.sDefaultScreenName)))b=a+"/"+b,a=this.sDefaultScreenName;e&&e.__started&&(e.__builded||(e.__builded=!0,c.isNonEmptyArray(e.viewModels())&&j.each(e.viewModels(), -function(a){this.buildViewModel(a,e)},this),this.delegateRun(e,"onBuild")),j.defer(function(){if(d.oCurrentScreen){d.delegateRun(d.oCurrentScreen,"onHide");c.isNonEmptyArray(d.oCurrentScreen.viewModels())&&j.each(d.oCurrentScreen.viewModels(),function(a){if(a.__vm&&a.__dom&&"Popups"!==a.__vm.viewModelPosition()){a.__dom.hide();a.__vm.viewModelVisibility(false);d.delegateRun(a.__vm,"onHide")}})}d.oCurrentScreen=e;if(d.oCurrentScreen){d.delegateRun(d.oCurrentScreen,"onShow");o.runHook("screen-on-show", -[d.oCurrentScreen.screenName(),d.oCurrentScreen]);c.isNonEmptyArray(d.oCurrentScreen.viewModels())&&j.each(d.oCurrentScreen.viewModels(),function(a){if(a.__vm&&a.__dom&&"Popups"!==a.__vm.viewModelPosition()){a.__dom.show();a.__vm.viewModelVisibility(true);d.delegateRun(a.__vm,"onShow");o.runHook("view-model-on-show",[a.__name,a.__vm])}},d)}(f=e.__cross())&&f.parse(b)}))}};r.prototype.startScreens=function(a){j.each(a,function(a){var c=(a=new a)?a.screenName():"";a&&""!==c&&(""===this.sDefaultScreenName&& -(this.sDefaultScreenName=c),this.oScreens[c]=a)},this);j.each(this.oScreens,function(a){a&&(!a.__started&&a.__start)&&(a.__started=!0,a.__start(),o.runHook("screen-pre-start",[a.screenName(),a]),this.delegateRun(a,"onStart"),o.runHook("screen-post-start",[a.screenName(),a]))},this);a=fa.create();a.addRoute(/^([a-zA-Z0-9\-]*)\/?(.*)$/,j.bind(this.screenOnRoute,this));y.initialized.add(a.parse,a);y.changed.add(a.parse,a);y.init()};r.prototype.setHash=function(a,b,d){a="#"===a.substr(0,1)?a.substr(1): -a;a="/"===a.substr(0,1)?a.substr(1):a;d=c.isUnd(d)?!1:!!d;(c.isUnd(b)?0:b)?(y.changed.active=!1,y[d?"replaceHash":"setHash"](a),y.changed.active=!0):(y.changed.active=!0,y[d?"replaceHash":"setHash"](a),y.setHash(a))};r.prototype.bootstart=function(){this.oBoot&&this.oBoot.bootstart&&this.oBoot.bootstart();return this};q=new r;s.newInstanceFromJson=function(a){var b=new s;return b.initByJson(a)?b:null};s.prototype.name="";s.prototype.email="";s.prototype.privateType=null;s.prototype.validate=function(){return""!== -this.name||""!==this.email};s.prototype.hash=function(a){return"#"+(a?"":this.name)+"#"+this.email+"#"};s.prototype.clearDuplicateName=function(){this.name===this.email&&(this.name="")};s.prototype.type=function(){if(null===this.privateType&&(this.email&&"@facebook.com"===this.email.substr(-13)&&(this.privateType=f.EmailType.Facebook),null===this.privateType))this.privateType=f.EmailType.Default;return this.privateType};s.prototype.search=function(a){return-1<(this.name+" "+this.email).toLowerCase().indexOf(a.toLowerCase())}; -s.prototype.parse=function(a){var a=c.trim(a),b=/(?:"([^"]+)")? ?,]+)>?,? ?/g.exec(a);b?(this.name=b[1]||"",this.email=b[2]||"",this.clearDuplicateName()):/^[^@]+@[^@]+$/.test(a)&&(this.name="",this.email=a)};s.prototype.initByJson=function(a){var b=!1;a&&"Object/Email"===a["@Object"]&&(this.name=c.trim(a.Name),this.email=c.trim(a.Email),b=""!==this.email,this.clearDuplicateName());return b};s.prototype.toLine=function(a,b){var d="";""!==this.email&&(b=c.isUnd(b)?!1:!!b,a&&""!==this.name? -d=b?'")+'" target="_blank" tabindex="-1">'+c.encodeHtml(this.name)+"":this.name:(d=this.email,""!==this.name?d=b?c.encodeHtml('"'+this.name+'" <')+'")+'" target="_blank" tabindex="-1">'+c.encodeHtml(d)+""+c.encodeHtml(">"):'"'+this.name+'" <'+d+">":b&&(d=''+c.encodeHtml(this.email)+""))); -return d};s.prototype.select2Result=function(){var a="",b=e.cache().getUserPic(this.email),a=""!==b?a+(''):a+('');f.EmailType.Facebook===this.type()?(a+=""+(0'):a+=""+(0('+this.name+")": -this.email);return a+""};s.prototype.select2Selection=function(a){var b="";if(f.EmailType.Facebook===this.type()){if(b=0").text(b).appendTo(a),a.append(''),null}else b=0(new g.Date).getTime()-p);n&&l.oRequests[n]&&(l.oRequests[n].__aborted&&(e="abort"),l.oRequests[n]=null);l.defaultResponse(a,n,e,d,f,b)});n&&(0
    ").addClass("rl-settings-view-model").hide().attr("data-bind", -'template: {name: "'+g.__rlSettingsData.Template+'"}, i18nInit: true'),l.appendTo(k),f.data=e.data(),f.viewModelDom=l,f.__rlSettingsData=g.__rlSettingsData,g.__dom=l,g.__builded=!0,g.__vm=f,d.applyBindings(f,l[0]),q.delegateRun(f,"onBuild",[l])):c.log("Cannot find sub settings view model position: SettingsSubScreen"),f&&j.defer(function(){if(b.oCurrentSubScreen){q.delegateRun(b.oCurrentSubScreen,"onHide");b.oCurrentSubScreen.viewModelDom.hide()}b.oCurrentSubScreen=f;if(b.oCurrentSubScreen){b.oCurrentSubScreen.viewModelDom.show(); -q.delegateRun(b.oCurrentSubScreen,"onShow");j.each(b.menu(),function(a){a.selected(f&&f.__rlSettingsData&&a.route===f.__rlSettingsData.Route)});i("#rl-content .b-settings .b-content .content").scrollTop(0)}c.windowResize()})):q.setHash(e.link().settings(),!1,!0)};G.prototype.onHide=function(){this.oCurrentSubScreen&&this.oCurrentSubScreen.viewModelDom&&(q.delegateRun(this.oCurrentSubScreen,"onHide"),this.oCurrentSubScreen.viewModelDom.hide())};G.prototype.onBuild=function(){j.each(A.settings,function(a){a&& -(a.__rlSettingsData&&!j.find(A["settings-removed"],function(b){return b&&b===a}))&&this.menu.push({route:a.__rlSettingsData.Route,label:a.__rlSettingsData.Label,selected:d.observable(!1),disabled:!!j.find(A["settings-disabled"],function(b){return b&&b===a})})},this);this.oViewModelPlace=i("#rl-content #rl-settings-subscreen")};G.prototype.routes=function(){var a=j.find(A.settings,function(a){return a&&a.__rlSettingsData&&a.__rlSettingsData.IsDefault}),b=a?a.__rlSettingsData.Route:"general",a={subname:/^(.*)$/, -normalize_:function(a,d){d.subname=c.isUnd(d.subname)?b:c.pString(d.subname);return[d.subname]}};return[["{subname}/",a],["{subname}",a],["",a]]};j.extend(ba.prototype,w.prototype);ba.prototype.onShow=function(){e.setTitle("")};j.extend(ca.prototype,G.prototype);ca.prototype.onShow=function(){e.setTitle("")};j.extend(u.prototype,ga.prototype);u.prototype.oSettings=null;u.prototype.oLink=null;u.prototype.download=function(a){var b=null,c=null;if((b=navigator.userAgent.toLowerCase())&&(-1=e||g-2<=e)k+=2;l(e);c=b=e}for(;0=c)l(c, -!0),k--;else if(0>=b)break;3===b?l(2,!1):3c&&l(Math.round((g+c)/2),!0,"...");1c&&l(g,!0)}return f},this);this.checkAll=e.computed({read:function(){return 0c},this);this.hasMessages=e.computed(function(){return 0'),c.after(k),c.remove();k&&k[0]&&k.attr("data-href",e).attr("data-theme",b[0]).text(b[1]);a.themeTrigger(g.SaveSettingsStep.TrueResult)}}).always(function(){a.iTimer=h.setTimeout(function(){a.themeTrigger(g.SaveSettingsStep.Idle)},1E3);a.oLastAjax=null}));f.remote().saveSettings(null,{Theme:b})},this)}function Pa(){d.initDataConstructorBySettings(this)}function U(){d.initDataConstructorBySettings(this);var a=function(a){return function(){var b= -f.cache().getFolderFromCacheList(a());b&&b.type(g.FolderType.User)}},b=function(a){return function(b){(b=f.cache().getFolderFromCacheList(b))&&b.type(a)}};this.devPassword=this.devLogin=this.devEmail="";this.accountEmail=e.observable("");this.accountLogin=e.observable("");this.projectHash=e.observable("");this.threading=e.observable(!1);this.lastFoldersHash="";this.remoteChangePassword=this.remoteSuggestions=!1;this.sentFolder=e.observable("");this.draftFolder=e.observable("");this.spamFolder=e.observable(""); -this.trashFolder=e.observable("");this.sentFolder.subscribe(a(this.sentFolder),this,"beforeChange");this.draftFolder.subscribe(a(this.draftFolder),this,"beforeChange");this.spamFolder.subscribe(a(this.spamFolder),this,"beforeChange");this.trashFolder.subscribe(a(this.trashFolder),this,"beforeChange");this.sentFolder.subscribe(b(g.FolderType.SentItems),this);this.draftFolder.subscribe(b(g.FolderType.Draft),this);this.spamFolder.subscribe(b(g.FolderType.Spam),this);this.trashFolder.subscribe(b(g.FolderType.Trash), -this);this.draftFolderNotEnabled=e.computed(function(){return""===this.draftFolder()||n.Values.UnuseOptionValue===this.draftFolder()},this);this.displayName=e.observable("");this.signature=e.observable("");this.replyTo=e.observable("");this.accounts=e.observableArray([]);this.accountsLoading=e.observable(!1).extend({throttle:100});this.identities=e.observableArray([]);this.identitiesLoading=e.observable(!1).extend({throttle:100});this.namespace="";this.folderList=e.observableArray([]);this.foldersListError= -e.observable("");this.foldersLoading=e.observable(!1);this.foldersCreating=e.observable(!1);this.foldersDeleting=e.observable(!1);this.foldersRenaming=e.observable(!1);this.currentFolder=e.observable(null).extend({toggleSubscribe:[null,function(a){a&&a.selected(!1)},function(a){a&&a.selected(!0)}]});this.currentFolderFullNameRaw=e.computed(function(){return this.currentFolder()?this.currentFolder().fullNameRaw:""},this);this.currentFolderFullName=e.computed(function(){return this.currentFolder()? -this.currentFolder().fullName:""},this);this.currentFolderFullNameHash=e.computed(function(){return this.currentFolder()?this.currentFolder().fullNameHash:""},this);this.currentFolderName=e.computed(function(){return this.currentFolder()?this.currentFolder().name():""},this);this.folderListSystemNames=e.computed(function(){var a=["INBOX"],b=this.folderList(),f=this.sentFolder(),e=this.draftFolder(),g=this.spamFolder(),l=this.trashFolder();d.isArray(b)&&0').appendTo("body");R.on("error",function(a){f&& -(a&&a.originalEvent&&a.originalEvent.message&&-1===d.inArray(a.originalEvent.message,["Script error.","Uncaught Error: Error calling method on NPObject."]))&&f.remote().jsError(d.emptyFunction,a.originalEvent.message,a.originalEvent.filename,a.originalEvent.lineno,location&&location.toString?location.toString():"",Q.attr("class"),d.microtime()-m.now)})}function B(){K.call(this);this.oCache=this.oRemote=this.oData=null;this.iSuggestionsLimit=d.pInt(this.settingsGet("SuggestionsLimit"));this.iSuggestionsLimit= -0===this.iSuggestionsLimit?20:this.iSuggestionsLimit;this.quotaDebounce=i.debounce(this.quota,3E4)}var n={},g={},v={},d={},y={},ma={},m={},V={settings:[],"settings-removed":[],"settings-disabled":[]},o=null,Ga=h.rainloopAppData||{},Ra=h.rainloopI18N||{},Q=j("html"),R=j(h),Ha=j(h.document),na=h.Notification&&h.Notification.requestPermission?h.Notification:null,f=null;m.now=(new Date).getTime();m.minuteTick=e.observable(!0);m.fiveMinuteTick=e.observable(!0);m.langChangeTick=e.observable(!0);m.iAjaxErrorCount= -0;m.iTokenErrorCount=0;m.iMessageBodyCacheCount=0;m.bUnload=!1;m.sUserAgent=(navigator.userAgent||"").toLowerCase();m.bIsiOSDevice=-1/g,">").replace(/"/g,""").replace(/'/g,"'"):""};d.splitPlainText=function(a,b){for(var c="",k="",f=a,e=0,g=0,b=d.isUnd(b)?100:b;f.length>b;)k=f.substring(0,b),e=k.lastIndexOf(" "),g=k.lastIndexOf("\n"),-1!==g&&(e=g),-1===e&&(e=b),c+=k.substring(0,e)+"\n",f=f.substring(e+1);return c+f};var Ia= -{};d.timeOutAction=function(a,b,c){d.isUnd(Ia[a])&&(Ia[a]=0);h.clearTimeout(Ia[a]);Ia[a]=h.setTimeout(b,c)};var Sa={};d.timeOutActionSecond=function(a,b,c){Sa[a]||(Sa[a]=h.setTimeout(function(){b();Sa[a]=0},c))};var S=!1;d.audio=function(a,b){if(!1===S)if(m.bIsiOSDevice)S=null;else{var c=!1,d=!1,f=h.Audio?new h.Audio:null;f&&f.canPlayType&&f.play?((c=""!==f.canPlayType('audio/mpeg; codecs="mp3"'))||(d=""!==f.canPlayType('audio/ogg; codecs="vorbis"')),c||d?(S=f,S.preload="none",S.loop=!1,S.autoplay= -!1,S.muted=!1,S.src=c?a:b):S=null):S=null}return S};d.hos=function(a,b){return a&&Object.hasOwnProperty?Object.hasOwnProperty.call(a,b):!1};d.i18n=function(a,b,c){var k="",a=d.isUnd(Ra[a])?d.isUnd(c)?a:c:Ra[a];if(!d.isUnd(b)&&!d.isNull(b))for(k in b)d.hos(b,k)&&(a=a.replace("%"+k+"%",b[k]));return a};d.i18nToNode=function(a){i.defer(function(){j(".i18n",a).each(function(){var a=j(this),c="";(c=a.data("i18n-text"))?a.text(d.i18n(c)):((c=a.data("i18n-html"))&&a.html(d.i18n(c)),(c=a.data("i18n-placeholder"))&& -a.attr("placeholder",d.i18n(c)))})})};d.i18nToDoc=function(){h.rainloopI18N&&(Ra=h.rainloopI18N||{},d.i18nToNode(Ha),m.langChangeTick(!m.langChangeTick()));h.rainloopI18N={}};d.initOnStartOrLangChange=function(a,b,c){a&&a.call(b);c?m.langChangeTick.subscribe(function(){a&&a.call(b);c.call(b)}):a&&m.langChangeTick.subscribe(a,b)};d.inFocus=function(){var a=document.activeElement;return a&&("INPUT"===a.tagName||"TEXTAREA"===a.tagName||"IFRAME"===a.tagName||"DIV"===a.tagName&&"editorHtmlArea"===a.className&& -a.contentEditable)};d.removeInFocus=function(){if(document&&document.activeElement&&document.activeElement.blur){var a=j(document.activeElement);(a.is("input")||a.is("textarea"))&&document.activeElement.blur()}};d.removeSelection=function(){if(h&&h.getSelection){var a=h.getSelection();a&&a.removeAllRanges&&a.removeAllRanges()}else document&&(document.selection&&document.selection.empty)&&document.selection.empty()};d.replySubjectAdd=function(a,b){var c=null,k=d.trim(b);null!==(c=(new h.RegExp("^"+ -a+"[\\s]?\\:(.*)$","gi")).exec(b))&&!d.isUnd(c[1])?k=a+"[2]: "+c[1]:null!==(c=(new h.RegExp("^("+a+"[\\s]?[\\[\\(]?)([\\d]+)([\\]\\)]?[\\s]?\\:.*)$","gi")).exec(b))&&!d.isUnd(c[1])&&!d.isUnd(c[2])&&!d.isUnd(c[3])?(d.pInt(c[2]),k=c[1]+(d.pInt(c[2])+1)+c[3]):k=a+": "+b;return k};d.roundNumber=function(a,b){return Math.round(a*Math.pow(10,b))/Math.pow(10,b)};d.friendlySize=function(a){a=d.pInt(a);return 1073741824<=a?d.roundNumber(a/1073741824,1)+"GB":1048576<=a?d.roundNumber(a/1048576,1)+"MB":1024<= -a?d.roundNumber(a/1024,0)+"KB":a+"B"};d.log=function(a){h.console&&h.console.log&&h.console.log(a)};d.getNotification=function(a){a=d.pInt(a);return d.isUnd(v[a])?"":v[a]};d.initNotificationLanguage=function(){v[g.Notification.InvalidToken]=d.i18n("NOTIFICATIONS/INVALID_TOKEN");v[g.Notification.AuthError]=d.i18n("NOTIFICATIONS/AUTH_ERROR");v[g.Notification.AccessError]=d.i18n("NOTIFICATIONS/ACCESS_ERROR");v[g.Notification.ConnectionError]=d.i18n("NOTIFICATIONS/CONNECTION_ERROR");v[g.Notification.CaptchaError]= -d.i18n("NOTIFICATIONS/CAPTCHA_ERROR");v[g.Notification.SocialFacebookLoginAccessDisable]=d.i18n("NOTIFICATIONS/SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE");v[g.Notification.SocialTwitterLoginAccessDisable]=d.i18n("NOTIFICATIONS/SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE");v[g.Notification.SocialGoogleLoginAccessDisable]=d.i18n("NOTIFICATIONS/SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE");v[g.Notification.DomainNotAllowed]=d.i18n("NOTIFICATIONS/DOMAIN_NOT_ALLOWED");v[g.Notification.AccountNotAllowed]=d.i18n("NOTIFICATIONS/ACCOUNT_NOT_ALLOWED"); -v[g.Notification.CantGetMessageList]=d.i18n("NOTIFICATIONS/CANT_GET_MESSAGE_LIST");v[g.Notification.CantGetMessage]=d.i18n("NOTIFICATIONS/CANT_GET_MESSAGE");v[g.Notification.CantDeleteMessage]=d.i18n("NOTIFICATIONS/CANT_DELETE_MESSAGE");v[g.Notification.CantMoveMessage]=d.i18n("NOTIFICATIONS/CANT_MOVE_MESSAGE");v[g.Notification.CantSaveMessage]=d.i18n("NOTIFICATIONS/CANT_SAVE_MESSAGE");v[g.Notification.CantSendMessage]=d.i18n("NOTIFICATIONS/CANT_SEND_MESSAGE");v[g.Notification.InvalidRecipients]= -d.i18n("NOTIFICATIONS/INVALID_RECIPIENTS");v[g.Notification.CantCreateFolder]=d.i18n("NOTIFICATIONS/CANT_CREATE_FOLDER");v[g.Notification.CantRenameFolder]=d.i18n("NOTIFICATIONS/CANT_RENAME_FOLDER");v[g.Notification.CantDeleteFolder]=d.i18n("NOTIFICATIONS/CANT_DELETE_FOLDER");v[g.Notification.CantDeleteNonEmptyFolder]=d.i18n("NOTIFICATIONS/CANT_DELETE_NON_EMPTY_FOLDER");v[g.Notification.CantSubscribeFolder]=d.i18n("NOTIFICATIONS/CANT_SUBSCRIBE_FOLDER");v[g.Notification.CantUnsubscribeFolder]=d.i18n("NOTIFICATIONS/CANT_UNSUBSCRIBE_FOLDER"); -v[g.Notification.CantSaveSettings]=d.i18n("NOTIFICATIONS/CANT_SAVE_SETTINGS");v[g.Notification.CantSavePluginSettings]=d.i18n("NOTIFICATIONS/CANT_SAVE_PLUGIN_SETTINGS");v[g.Notification.DomainAlreadyExists]=d.i18n("NOTIFICATIONS/DOMAIN_ALREADY_EXISTS");v[g.Notification.CantInstallPackage]=d.i18n("NOTIFICATIONS/CANT_INSTALL_PACKAGE");v[g.Notification.CantDeletePackage]=d.i18n("NOTIFICATIONS/CANT_DELETE_PACKAGE");v[g.Notification.InvalidPluginPackage]=d.i18n("NOTIFICATIONS/INVALID_PLUGIN_PACKAGE"); -v[g.Notification.UnsupportedPluginPackage]=d.i18n("NOTIFICATIONS/UNSUPPORTED_PLUGIN_PACKAGE");v[g.Notification.LicensingServerIsUnavailable]=d.i18n("NOTIFICATIONS/LICENSING_SERVER_IS_UNAVAILABLE");v[g.Notification.LicensingExpired]=d.i18n("NOTIFICATIONS/LICENSING_EXPIRED");v[g.Notification.LicensingBanned]=d.i18n("NOTIFICATIONS/LICENSING_BANNED");v[g.Notification.DemoSendMessageError]=d.i18n("NOTIFICATIONS/DEMO_SEND_MESSAGE_ERROR");v[g.Notification.AccountAlreadyExists]=d.i18n("NOTIFICATIONS/ACCOUNT_ALREADY_EXISTS"); -v[g.Notification.MailServerError]=d.i18n("NOTIFICATIONS/MAIL_SERVER_ERROR");v[g.Notification.UnknownNotification]=d.i18n("NOTIFICATIONS/UNKNOWN_ERROR");v[g.Notification.UnknownError]=d.i18n("NOTIFICATIONS/UNKNOWN_ERROR")};d.getUploadErrorDescByCode=function(a){var b="";switch(d.pInt(a)){case g.UploadErrorCode.FileIsTooBig:b=d.i18n("UPLOAD/ERROR_FILE_IS_TOO_BIG");break;case g.UploadErrorCode.FilePartiallyUploaded:b=d.i18n("UPLOAD/ERROR_FILE_PARTIALLY_UPLOADED");break;case g.UploadErrorCode.FileNoUploaded:b= -d.i18n("UPLOAD/ERROR_NO_FILE_UPLOADED");break;case g.UploadErrorCode.MissingTempFolder:b=d.i18n("UPLOAD/ERROR_MISSING_TEMP_FOLDER");break;case g.UploadErrorCode.FileOnSaveingError:b=d.i18n("UPLOAD/ERROR_ON_SAVING_FILE");break;case g.UploadErrorCode.FileType:b=d.i18n("UPLOAD/ERROR_FILE_TYPE");break;default:b=d.i18n("UPLOAD/ERROR_UNKNOWN")}return b};d.killCtrlAandS=function(a){if(a=a||h.event){var b=a.target||a.srcElement,c=a.keyCode||a.which;if(a.ctrlKey&&c===g.EventKeyCode.S)a.preventDefault();else if((!b|| -!b.tagName||!b.tagName.match(/INPUT|TEXTAREA/i))&&a.ctrlKey&&c===g.EventKeyCode.A)h.getSelection?h.getSelection().removeAllRanges():h.document.selection&&h.document.selection.clear&&h.document.selection.clear(),a.preventDefault()}};d.createCommand=function(a,b,c){var k=b?function(){k.canExecute&&k.canExecute()&&b.apply(a,Array.prototype.slice.call(arguments));return!1}:function(){};k.enabled=e.observable(!0);c=d.isUnd(c)?!0:c;k.canExecute=d.isFunc(c)?e.computed(function(){return k.enabled()&&c.call(a)}): -e.computed(function(){return k.enabled()&&!!c});return k};d.initDataConstructorBySettings=function(a){a.editorDefaultType=e.observable(g.EditorDefaultType.Html);a.showImages=e.observable(!1);a.interfaceAnimation=e.observable(g.InterfaceAnimation.Full);m.sAnimationType=g.InterfaceAnimation.Full;a.allowThemes=e.observable(!0);a.allowCustomLogin=e.observable(!1);a.allowLanguagesOnSettings=e.observable(!0);a.allowLanguagesOnLogin=e.observable(!0);a.desktopNotifications=e.observable(!1);a.useThreads=e.observable(!0); -a.replySameFolder=e.observable(!0);a.usePreviewPane=e.observable(!0);a.useCheckboxesInList=e.observable(!0);a.interfaceAnimation.subscribe(function(a){if(m.bMobileDevice||a===g.InterfaceAnimation.None)Q.removeClass("rl-anim rl-anim-full").addClass("no-rl-anim"),m.sAnimationType=g.InterfaceAnimation.None;else switch(a){case g.InterfaceAnimation.Full:Q.removeClass("no-rl-anim").addClass("rl-anim rl-anim-full");m.sAnimationType=a;break;case g.InterfaceAnimation.Normal:Q.removeClass("no-rl-anim rl-anim-full").addClass("rl-anim"), -m.sAnimationType=a}});a.interfaceAnimation.valueHasMutated();a.desktopNotificationsPermisions=e.computed(function(){a.desktopNotifications();var b=g.DesktopNotifications.NotSupported;if(na&&na.permission)switch(na.permission.toLowerCase()){case "granted":b=g.DesktopNotifications.Allowed;break;case "denied":b=g.DesktopNotifications.Denied;break;case "default":b=g.DesktopNotifications.NotAllowed}else h.webkitNotifications&&h.webkitNotifications.checkPermission&&(b=h.webkitNotifications.checkPermission()); -return b});a.useDesktopNotifications=e.computed({read:function(){return a.desktopNotifications()&&g.DesktopNotifications.Allowed===a.desktopNotificationsPermisions()},write:function(b){b?(b=a.desktopNotificationsPermisions(),g.DesktopNotifications.Allowed===b?a.desktopNotifications(!0):g.DesktopNotifications.NotAllowed===b?na.requestPermission(function(){a.desktopNotifications.valueHasMutated();g.DesktopNotifications.Allowed===a.desktopNotificationsPermisions()?a.desktopNotifications()?a.desktopNotifications.valueHasMutated(): -a.desktopNotifications(!0):a.desktopNotifications()?a.desktopNotifications(!1):a.desktopNotifications.valueHasMutated()}):a.desktopNotifications(!1)):a.desktopNotifications(!1)}});a.language=e.observable("");a.languages=e.observableArray([]);a.mainLanguage=e.computed({read:a.language,write:function(b){b!==a.language()?-1=a.diff(c,"hours")?k:a.format("L")===c.format("L")?d.i18n("MESSAGE_LIST/TODAY_AT",{TIME:c.format("LT")}):a.clone().subtract("days",1).format("L")===c.format("L")?d.i18n("MESSAGE_LIST/YESTERDAY_IN", -{TIME:c.format("LT")}):a.year()===c.year()?c.format("D MMM."):c.format("LL")},a)};d.isFolderExpanded=function(a){var b=f.local().get(g.ClientSideKeyName.ExpandedFolders);return i.isArray(b)&&-1!==i.indexOf(b,a)};d.setExpandedFolder=function(a,b){var c=f.local().get(g.ClientSideKeyName.ExpandedFolders);i.isArray(c)||(c=[]);b?(c.push(a),c=i.uniq(c)):c=i.without(c,a);f.local().set(g.ClientSideKeyName.ExpandedFolders,c)};d.initLayoutResizer=function(a,b,c,d,e,g,w,l){var d=d||300,e=e||500,g=g||e-d/2,w= -w||300,h=0,q=j(a),gb=j(b),r=j(c),b=f.local().get(l)||g,H=function(a,b,c){if(b||c)a=r.width(),b=b?100*(b.size.width/a):null,null===b&&c&&(b=100*(q.width()/a)),null!==b&&(q.css({width:"",height:"",right:""+(100-b)+"%"}),gb.css({width:"",height:"",left:""+b+"%"}))};b&&q.width(b);h=r.width()-w;h=e>h?h:e;q.resizable({minWidth:d,maxWidth:h,handles:"e",resize:H,stop:H});H(null,null,!0);R.resize(i.throttle(function(b,c){c&&(c.element&&c.element[0].id&&"#"+c.element[0].id===""+a)&&(h=r.width()-w,h=e>h?h:e, -q.resizable("option","maxWidth",h),c.size&&c.size.width&&f.local().set(l,c.size.width),H(null,null,!0))},400))};d.initBlockquoteSwitcher=function(a){if(a){var b=j("blockquote:not(.rl-bq-switcher)",a).filter(function(){return 0===j(this).parent().closest("blockquote",a).length});b&&0').insertBefore(a).click(function(){a.toggleClass("hidden-bq"); -d.windowResize()}).after("
    ").before("
    ")})}};d.removeBlockquoteSwitcher=function(a){a&&(j(a).find("blockquote.rl-bq-switcher").each(function(){j(this).removeClass("rl-bq-switcher hidden-bq")}),j(a).find(".rlBlockquoteSwitcher").each(function(){j(this).remove()}))};d.extendAsViewModel=function(a,b){b&&(b.__name=a,y.regViewModelHook(a,b),i.extend(b.prototype,D.prototype))};d.addSettingsViewModel=function(a,b,c,d,f){a.__rlSettingsData={Label:c,Template:b,Route:d,IsDefault:!!f};V.settings.push(a)}; -d.removeSettingsViewModel=function(a){V["settings-removed"].push(a)};d.disableSettingsViewModel=function(a){V["settings-disabled"].push(a)};d.convertThemeName=function(a){return d.trim(a.replace(/[^a-zA-Z]/g," ").replace(/([A-Z])/g," $1").replace(/[\s]+/g," "))};d.quoteName=function(a){return a.replace(/["]/g,'\\"')};d.microtime=function(){return(new Date).getTime()};d.convertLangName=function(a){return d.i18n("LANGS_NAMES/LANG_"+a.toUpperCase().replace(/[^a-zA-Z0-9]+/,"_"),null,a)};d.fakeMd5=function(a){for(var b= -"",a=d.isUnd(a)?32:d.pInt(a);b.length/g,">").replace(/")};d.draggeblePlace=function(){return j('
     
    ').appendTo("#rl-hidden")};d.defautOptionsAfterRender=function(a, -b){b&&!d.isUnd(b.disable)&&e.applyBindingsToNode(a,{disable:b.disable},b)};d.windowPopupKnockout=function(a,b,c,k){var f=null,e=h.open(""),g="__OpenerApplyBindingsUid"+d.fakeMd5()+"__",l=j("#"+b);h[g]=function(){if(e&&e.document.body&&l&&l[0]){var b=j(e.document.body);j("#rl-content",b).html(l.html());j("html",e.document).addClass("external "+j("html").attr("class"));d.i18nToNode(b);F.prototype.applyExternal(a,j("#rl-content",b)[0]);h[g]=null;k(e)}};e.document.open();e.document.write(''+ -d.encodeHtml(c)+'
    ');e.document.close();f=e.document.createElement("script");f.type="text/javascript";f.innerHTML="if(window&&window.opener&&window.opener['"+g+"']){window.opener['"+g+"']();window.opener['"+g+"']=null}";e.document.getElementsByTagName("head")[0].appendChild(f)};d.settingsSaveHelperFunction=function(a,b,c,k){c=c||null;k=d.isUnd(k)?1E3:d.pInt(k);return function(d,f,e,l,h){b.call(c,f&&f.Result?g.SaveSettingsStep.TrueResult: -g.SaveSettingsStep.FalseResult);a&&a.call(c,d,f,e,l,h);i.delay(function(){b.call(c,g.SaveSettingsStep.Idle)},k)}};d.settingsSaveHelperSimpleFunction=function(a,b){return d.settingsSaveHelperFunction(null,a,b,1E3)};d.resizeAndCrop=function(a,b,c){var d=new Image;d.onload=function(){var a=[0,0],d=document.createElement("canvas"),k=d.getContext("2d");d.width=b;d.height=b;a=this.width>this.height?[this.width-this.height,0]:[0,this.height-this.width];k.fillStyle="#fff";k.fillRect(0,0,b,b);k.drawImage(this, -a[0]/2,a[1]/2,this.width-a[0],this.height-a[1],0,0,b,b);c(d.toDataURL("image/jpeg"))};d.src=a};ma={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",urlsafe_encode:function(a){return ma.encode(a).replace(/[+]/g,"-").replace(/[\/]/g,"_").replace(/[=]/g,".")},encode:function(a){for(var b="",c,d,f,e,g,l,i=0,a=ma._utf8_encode(a);i>2,c=(c&3)<<4|d>>4,g=(d&15)<<2|f>>6,l=f&63,isNaN(d)?g=l=64:isNaN(f)&&(l= -64),b=b+this._keyStr.charAt(e)+this._keyStr.charAt(c)+this._keyStr.charAt(g)+this._keyStr.charAt(l);return b},decode:function(a){for(var b="",c,d,f,e,g,l=0,a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");l>4,d=(d&15)<<4|e>>2,f=(e&3)<<6|g,b+=String.fromCharCode(c),64!==e&&(b+=String.fromCharCode(d)),64!==g&&(b+=String.fromCharCode(f));return ma._utf8_decode(b)}, -_utf8_encode:function(a){for(var a=a.replace(/\r\n/g,"\n"),b="",c=0,d=a.length,f=0;cf?b+=String.fromCharCode(f):(127f?b+=String.fromCharCode(f>>6|192):(b+=String.fromCharCode(f>>12|224),b+=String.fromCharCode(f>>6&63|128)),b+=String.fromCharCode(f&63|128));return b},_utf8_decode:function(a){for(var b="",c=0,d=0,f=0,e=0;cd?(b+=String.fromCharCode(d),c++):191d?(f=a.charCodeAt(c+1),b+=String.fromCharCode((d&31)<<6|f&63),c+= -2):(f=a.charCodeAt(c+1),e=a.charCodeAt(c+2),b+=String.fromCharCode((d&15)<<12|(f&63)<<6|e&63),c+=3);return b}};e.bindingHandlers.tooltip={init:function(a,b){if(!m.bMobileDevice){var c=j(a).data("tooltip-class")||"",k=j(a).data("tooltip-placement")||"top";j(a).tooltip({delay:{show:500,hide:100},html:!0,placement:k,trigger:"hover",title:function(){return''+d.i18n(e.utils.unwrapObservable(b()))+""}})}}};e.bindingHandlers.tooltip2={init:function(a,b){var c=j(a).data("tooltip-class")|| -"",d=j(a).data("tooltip-placement")||"top";j(a).tooltip({delay:{show:500,hide:100},html:!0,placement:d,title:function(){return''+b()()+""}})}};e.bindingHandlers.dropdown={init:function(a){j(a).closest(".dropdown").on("click",".e-item",function(){j(a).dropdown("toggle")})}};e.bindingHandlers.popover={init:function(a,b){j(a).popover(e.utils.unwrapObservable(b()))}};e.bindingHandlers.resizecrop={init:function(a){j(a).addClass("resizecrop").resizecrop({width:"100", -height:"100",wrapperCSS:{"border-radius":"10px"}})},update:function(a,b){b()();j(a).resizecrop({width:"100",height:"100"})}};e.bindingHandlers.onEnter={init:function(a,b,c,d){j(a).on("keypress",function(c){c&&13===h.parseInt(c.keyCode,10)&&(j(a).trigger("change"),b().call(d))})}};e.bindingHandlers.onEsc={init:function(a,b,c,d){j(a).on("keypress",function(c){c&&27===h.parseInt(c.keyCode,10)&&(j(a).trigger("change"),b().call(d))})}};e.bindingHandlers.modal={init:function(a,b){j(a).modal({keyboard:!1, -show:e.utils.unwrapObservable(b())}).on("hidden",function(){b()(!1)})},update:function(a,b){var c=e.utils.unwrapObservable(b());j(a).modal(c?"show":"hide");i.delay(function(){j(a).toggleClass("popup-active",c)},1)}};e.bindingHandlers.i18nInit={init:function(a){d.i18nToNode(a)}};e.bindingHandlers.i18nUpdate={update:function(a,b){e.utils.unwrapObservable(b());d.i18nToNode(a)}};e.bindingHandlers.link={update:function(a,b){j(a).attr("href",e.utils.unwrapObservable(b()))}};e.bindingHandlers.title={update:function(a, -b){j(a).attr("title",e.utils.unwrapObservable(b()))}};e.bindingHandlers.textF={init:function(a,b){j(a).text(e.utils.unwrapObservable(b()))}};e.bindingHandlers.initDom={init:function(a,b){b()(a)}};e.bindingHandlers.initResizeTrigger={init:function(a,b){var c=e.utils.unwrapObservable(b());j(a).css({height:c[1],"min-height":c[1]})},update:function(a,b){var c=e.utils.unwrapObservable(b()),k=d.pInt(c[1]),f=0,f=j(a).offset().top;0=c.left&&a.pageX<=c.left+k.width()&&(a.pageY>=b-100&&a.pageY<=b&&(b=function(){k.scrollTop(k.scrollTop()+3);d.windowResize()},k.data("timerScroll",h.setInterval(b,10)),b()),a.pageY>=c.top&&a.pageY<=c.top+100))c=function(){k.scrollTop(k.scrollTop()-3);d.windowResize()},k.data("timerScroll",h.setInterval(c,10)),c()})},c.stop=function(){j(k).each(function(){h.clearInterval(j(this).data("timerScroll"));j(this).data("timerScroll",!1)})});c.helper=function(a){return b()(a&&a.target?e.dataFor(a.target): -null)};j(a).draggable(c).on("mousedown",function(){d.removeInFocus()})}}};e.bindingHandlers.droppable={init:function(a,b,c){if(!m.bMobileDevice){var d=b(),f=(b=c())&&b.droppableOver?b.droppableOver:null,e=b&&b.droppableOut?b.droppableOut:null,b={tolerance:"pointer",hoverClass:"droppableHover"};d&&(b.drop=function(a,b){d(a,b)},f&&(b.over=function(a,b){f(a,b)}),e&&(b.out=function(a,b){e(a,b)}),j(a).droppable(b))}}};e.bindingHandlers.nano={init:function(a){m.bDisableNanoScroll||j(a).addClass("nano").nanoScroller({iOSNativeScrolling:!1, -preventPageScrolling:!0})}};e.bindingHandlers.saveTrigger={init:function(a){j(a).append('  ').addClass("settings-saved-trigger")},update:function(a,b){var c=e.utils.unwrapObservable(b()),d=j(a);switch(c.toString()){case "1":d.find(".animated,.error").hide().removeClass("visible").end().find(".success").show().addClass("visible");break;case "0":d.find(".animated,.success").hide().removeClass("visible").end().find(".error").show().addClass("visible"); -break;case "-2":d.find(".error,.success").hide().removeClass("visible").end().find(".animated").show().addClass("visible");break;default:d.find(".animated").hide().end().find(".error,.success").removeClass("visible")}}};e.bindingHandlers.select2={init:function(a,b){var c=0,k=null,g=new h.RegExp(/[a-zA-Z0-9\.\-_]+@[a-zA-Z0-9\.\-_]+/),t=new h.RegExp(/(.+) [<]?([^\s<@]+@[a-zA-Z0-9\.\-_]+)[>]?/),w=function(){return""},l=function(a){f.getAutocomplete(a.term,a.page,function(b,c){a.callback({more:!!c,results:i.map(b, -function(a){var b=a.toLine(!1);return{id:b,text:b,c:a}})})})};j(a).addClass("ko-select2").select2({query:function(a){a&&(0===c?(l(a),c=h.setTimeout(d.emptyFunction,100)):(h.clearInterval(c),c=h.setTimeout(function(){l(a)},100)))},formatSelection:function(a,b){var c=a&&a.c?a.c.select2Selection(b):a.text;if(null!==c)return c},formatResult:function(a,b,c,d){b=a&&a.c?a.c.select2Result(b):"";return""===b?d(a.text):b},createSearchChoice:function(a,b){return 0===b.length&&g.test(a)?{id:a,text:a}:null},formatNoMatches:w, -formatSearching:function(){return d.i18n("SUGGESTIONS/SEARCHING_DESC")},formatInputTooShort:w,formatSelectionTooBig:w,multiple:!0,tokenSeparators:[",",";"],minimumInputLength:2,selectOnBlur:!1,closeOnSelect:!0,openOnEnter:!1});e.utils.domNodeDisposal.addDisposeCallback(a,function(){j(a).select2("destroy")});j(a).on("change",function(){for(var a=j(this).select2("data"),c=0,f=a.length,e=null,g=[];c "+d.trim(a).replace(/\n/gm,"\n> ")+"\n>\n";return a.replace(/\n([> ]+)/gm,function(){return arguments&&1]*>([\s\S]*)<\/div>/gmi,f),a="\n"+d.trim(a)+"\n");return a}return""}, -a=d.isUnd(a)?!0:!!a,b=this.toHtmlString().replace(/[\s]+/gm," ").replace(//gmi,"\n").replace(/<\/h\d>/gi,"\n").replace(/<\/p>/gi,"\n\n").replace(/<\/li>/gi,"\n").replace(/<\/td>/gi,"\n").replace(/<\/tr>/gi,"\n").replace(/]*>/gmi,"\n_______________________________\n\n").replace(/]*>/gmi,"").replace(/]*>([\s\S]*)<\/div>/gmi,f).replace(/]*>/gmi,"\n__bq__start__\n").replace(/<\/blockquote>/gmi,"\n__bq__end__\n").replace(/]*>([\s\S]*?)<\/a>/gmi,function(){return arguments&& -1]*>/gm,"").replace(/>/gi,">").replace(/</gi,"<").replace(/&/gi,"&").replace(/&\w{2,6};/gi,"");return(a?d.splitPlainText(b):b).replace(/\n[ \t]+/gm,"\n").replace(/[\n]{3,}/gm,"\n\n").replace(/__bq__start__([\s\S]*)__bq__end__/gm,c).replace(/__bq__start__/gm,"").replace(/__bq__end__/gm,"")};u.prototype.getHtmlFromText=function(){return d.convertPlainTextToHtml(this.textarea.val())};u.prototype.switchToggle=function(){this.isHtml()? -this.switchToPlain():this.switchToHtml()};u.prototype.switchToPlain=function(a){var a=d.isUnd(a)?!0:a,b=this.getTextFromHtml(),c=i.bind(function(a){a&&(this.toolbar.addClass("editorHideToolbar"),j(".editorSwitcher",this.toolbar).text(this.switcherLinkText(!1)),this.textarea.val(b),this.textarea.show(),this.htmlarea.hide(),this.fOnSwitch&&this.fOnSwitch(!1))},this);!a||0===d.trim(b).length?c(!0):c(h.confirm(this.oOptions.LangSwitcherConferm))};u.prototype.switcherLinkText=function(a){return a?this.oOptions.LangSwitcherTextLabel: -this.oOptions.LangSwitcherHtmlLabel};u.prototype.switchToHtml=function(){this.toolbar.removeClass("editorHideToolbar");j(".editorSwitcher",this.toolbar).text(this.switcherLinkText(!0));this.textarea.val(this.getHtmlFromText());this.updateHtmlArea();this.textarea.hide();this.htmlarea.show();this.fOnSwitch&&this.fOnSwitch(!0)};u.prototype.addButton=function(a,b){var c=this;j("
    ").addClass("editorToolbarButtom").append(j('').addClass(a)).attr("title", -b).click(function(b){d.isUnd(u.htmlFunctions[a])?h.alert(a):u.htmlFunctions[a].apply(c,[j(this),b])}).appendTo(this.toolbar)};u.htmlInitToolbar=function(){if(!this.bOnlyPlain){this.addButton("bold","Bold");this.addButton("italic","Italic");this.addButton("underline","Underline");this.addButton("strikethrough","Strikethrough");this.addButton("removeformat","removeformat");this.addButton("justifyleft","justifyleft");this.addButton("justifycenter","justifycenter");this.addButton("justifyright","justifyright"); -this.addButton("horizontalrule","horizontalrule");this.addButton("orderedlist","orderedlist");this.addButton("unorderedlist","unorderedlist");this.addButton("indent","indent");this.addButton("outdent","outdent");this.addButton("forecolor","forecolor");var a=this;j("").addClass("editorSwitcher").text(a.switcherLinkText(!0)).click(function(){a.switchToggle()}).appendTo(a.toolbar)}};u.htmlInitEditor=function(){this.editor=this.htmlarea[0];this.editor.innerHTML=this.textarea.val()};u.htmlAttachEditorEvents= -function(){var a=this,b=function(b){if(b=(b&&b.originalEvent?b.originalEvent:b)||h.event){b.stopPropagation();b.preventDefault();var c=null,d=null;if((b=b.files||(b.dataTransfer?b.dataTransfer.files:null))&&1===b.length&&b[0]&&b[0].type&&0===b[0].type.indexOf("image/")){var d=b[0],c=new h.FileReader,f=d;c.onload=function(b){a.insertImage(b.target.result,f.name)};c.readAsDataURL(d)}}a.htmlarea.removeClass("editorDragOver")},c=function(){a.htmlarea.removeClass("editorDragOver")},d=function(b){b.stopPropagation(); -b.preventDefault();a.htmlarea.addClass("editorDragOver")},f=function(b){(b=b&&b.clipboardData?b.clipboardData:b&&b.originalEvent&&b.originalEvent.clipboardData?b.originalEvent.clipboardData:null)&&b.items&&i.each(b.items,function(b){if(b&&(b.type&&0===b.type.indexOf("image/"))&&b.getAsFile){var c=null,d=b.getAsFile();d&&(c=new h.FileReader,c.onload=function(b){a.insertImage(b.target.result,d.name)},c.readAsDataURL(d))}})};!this.bOnlyPlain&&(h.File&&h.FileReader&&h.FileList)&&(this.htmlarea.bind("dragover", -d),this.htmlarea.bind("dragleave",c),this.htmlarea.bind("drop",b),this.htmlarea.bind("paste",f))};for(var hb=u,ra=[],Ya=[],Y=0,Ja=0,Ka=0,La=0,Ma="",Y=0;256>Y;Y+=85)Ma=Y.toString(16),ra.push(1===Ma.length?"0"+Ma:Ma);La=ra.length;for(Y=0;Y
    '),ab=sa.find(".editorFpFonts"), -bb=function(){};j.each("Arial;Arial Black;Courier New;Tahoma;Times New Roman;Verdana".split(";"),function(a,b){ab.append(j(''+b+"").click(function(){bb(b)}));ab.append("
    ")});sa.hide();ib.htmlFontPicker=function(a,b,c){$a||(sa.appendTo(c),$a=!0);bb=b;Za.unbind("click.fpNamespace");h.setTimeout(function(){Za.one("click.fpNamespace",function(){sa.hide()})},500);b=j(a).position();sa.css("top",5+b.top+ -j(a).height()+"px").css("left",b.left+"px").show()};var jb=u,cb=j(h.document),db=!1,ta=j('
    '),eb=ta.find(".editorCpColors"),fb=function(){};j.each(u.htmlColorPickerColors,function(a,b){eb.append('')});ta.hide();j(".editorCpColor",eb).click(function(a){var b=1,c="#000000",a=j(a.target).css("background-color"), -c=a.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);if(null!==c){for(delete c[0];3>=b;++b)c[b]=d.pInt(c[b]).toString(16),1===c[b].length&&(c[b]="0"+c[b]);c="#"+c.join("")}else c=a;fb(c)});jb.htmlColorPicker=function(a,b,c){db||(ta.appendTo(c),db=!0);c=j(a).position();fb=b;cb.unbind("click.cpNamespace");h.setTimeout(function(){cb.one("click.cpNamespace",function(){ta.hide()})},100);ta.css("top",5+c.top+j(a).height()+"px").css("left",c.left+"px").show()};u.htmlFunctions={bold:function(){this.ec("bold")}, -italic:function(){this.ec("italic")},underline:function(){this.ec("underline")},strikethrough:function(){this.ec("strikethrough")},indent:function(){this.ec("indent")},outdent:function(){this.ec("outdent")},justifyleft:function(){this.ec("justifyLeft")},justifycenter:function(){this.ec("justifyCenter")},justifyright:function(){this.ec("justifyRight")},horizontalrule:function(){this.ec("insertHorizontalRule",!1,"ht")},removeformat:function(){this.ec("removeFormat")},orderedlist:function(){this.ec("insertorderedlist")}, -unorderedlist:function(){this.ec("insertunorderedlist")},forecolor:function(a){u.htmlColorPicker(a,i.bind(function(a){this.setcolor("forecolor",a)},this),this.toolbar)},backcolor:function(a){u.htmlColorPicker(a,i.bind(function(a){this.setcolor("backcolor",a)},this),this.toolbar)},fontname:function(a){u.htmlFontPicker(a,i.bind(function(a){this.ec("fontname",!1,a)},this),this.toolbar)}};M.prototype.selectItemCallbacks=function(a){(this.oCallbacks.onItemSelect||this.emptyFunction)(a)};M.prototype.init= -function(a,b){this.oContentVisible=a;this.oContentScrollable=b;if(this.oContentVisible&&this.oContentScrollable){var c=this;j(this.oContentVisible).on("click",this.sItemSelector,function(a){c.actionClick(e.dataFor(this),a)}).on("click",this.sItemCheckedSelector,function(a){var b=e.dataFor(this);b&&(a&&a.shiftKey?c.actionClick(b,a):(c.sLastUid=c.getItemUid(b),b.selected()?(b.checked(!1),c.selectedItem(null)):b.checked(!b.checked())))});j(h.document).on("keydown",function(a){var b=!0;if(a&&c.bUseKeyboard&& -!d.inFocus())if(-1d?0:d;w=l[d];break}}else if(g.EventKeyCode.Down===a||g.EventKeyCode.Insert===a||g.EventKeyCode.Home=== -a||g.EventKeyCode.PageUp===a)w=l[0];else if(g.EventKeyCode.Up===a||g.EventKeyCode.End===a||g.EventKeyCode.PageDown===a)w=l[l.length-1];w?(q&&(b?(g.EventKeyCode.Up===a||g.EventKeyCode.Down===a)&&q.checked(!q.checked()):g.EventKeyCode.Insert===a&&q.checked(!q.checked())),this.throttleSelection=!0,this.selectedItem(w),this.throttleSelection=!0,0!==this.iSelectTimer?(h.clearTimeout(this.iSelectTimer),this.iSelectTimer=h.setTimeout(function(){c.iSelectTimer=0;c.actionClick(w)},1E3)):(this.iSelectTimer= -h.setTimeout(function(){c.iSelectTimer=0},200),this.actionClick(w)),this.scrollToSelected()):q&&(b&&(g.EventKeyCode.Up===a||g.EventKeyCode.Down===a)?q.checked(!q.checked()):g.EventKeyCode.Insert===a&&q.checked(!q.checked()))};M.prototype.scrollToSelected=function(){if(!this.oContentVisible||!this.oContentScrollable)return!1;var a=j(this.sItemSelectedSelector,this.oContentScrollable),b=a.position(),c=this.oContentVisible.height(),a=a.outerHeight();return b&&(0>b.top||b.top+a>c)?(0>b.top?this.oContentScrollable.scrollTop(this.oContentScrollable.scrollTop()+ -b.top-20):this.oContentScrollable.scrollTop(this.oContentScrollable.scrollTop()+b.top-c+a+20),!0):!1};M.prototype.eventClickFunction=function(a,b){var c=this.getItemUid(a),d=0,f=0,e=null,g="",l=!1,i=!1,h=[],j=!1;if(b&&b.shiftKey&&""!==c&&""!==this.sLastUid&&c!==this.sLastUid){h=this.list();j=a.checked();d=0;for(f=h.length;d").addClass("rl-view-model").addClass("RL-"+c.viewModelTemplate()).hide().attr("data-bind",'template: {name: "'+c.viewModelTemplate()+'"}, i18nInit: true'),t.appendTo(g),c.viewModelDom=t,a.__dom=t,"Popups"===k&&(c.cancelCommand=c.closeCommand=d.createCommand(c,function(){o.hideScreenPopup(a)})),y.runHook("view-model-pre-build",[a.__name,c,t]),e.applyBindings(c,t[0]),this.delegateRun(c,"onBuild",[t]),y.runHook("view-model-post-build",[a.__name,c,t])):d.log("Cannot find view model position: "+ -k)}return a?a.__vm:null};F.prototype.applyExternal=function(a,b){a&&b&&e.applyBindings(a,b)};F.prototype.hideScreenPopup=function(a){a&&(a.__vm&&a.__dom)&&(a.__dom.hide(),a.__vm.modalVisibility(!1),this.delegateRun(a.__vm,"onHide"),this.popupVisibility(!1),i.defer(function(){a.__dom.find(".ko-select2").select2("close")}))};F.prototype.showScreenPopup=function(a,b){a&&(this.buildViewModel(a),a.__vm&&a.__dom&&(a.__dom.show(),a.__vm.modalVisibility(!0),this.delegateRun(a.__vm,"onShow",b||[]),this.popupVisibility(!0), -y.runHook("view-model-on-show",[a.__name,a.__vm,b||[]])))};F.prototype.screenOnRoute=function(a,b){var c=this,f=null,e=null;""===d.pString(a)&&(a=this.sDefaultScreenName);if(""!==a){f=this.screen(a);if(!f&&(f=this.screen(this.sDefaultScreenName)))b=a+"/"+b,a=this.sDefaultScreenName;f&&f.__started&&(f.__builded||(f.__builded=!0,d.isNonEmptyArray(f.viewModels())&&i.each(f.viewModels(),function(a){this.buildViewModel(a,f)},this),this.delegateRun(f,"onBuild")),i.defer(function(){if(c.oCurrentScreen){c.delegateRun(c.oCurrentScreen, -"onHide");d.isNonEmptyArray(c.oCurrentScreen.viewModels())&&i.each(c.oCurrentScreen.viewModels(),function(a){if(a.__vm&&a.__dom&&"Popups"!==a.__vm.viewModelPosition()){a.__dom.hide();a.__vm.viewModelVisibility(false);c.delegateRun(a.__vm,"onHide")}})}c.oCurrentScreen=f;if(c.oCurrentScreen){c.delegateRun(c.oCurrentScreen,"onShow");y.runHook("screen-on-show",[c.oCurrentScreen.screenName(),c.oCurrentScreen]);d.isNonEmptyArray(c.oCurrentScreen.viewModels())&&i.each(c.oCurrentScreen.viewModels(),function(a){if(a.__vm&& -a.__dom&&"Popups"!==a.__vm.viewModelPosition()){a.__dom.show();a.__vm.viewModelVisibility(true);c.delegateRun(a.__vm,"onShow");y.runHook("view-model-on-show",[a.__name,a.__vm])}},c)}(e=f.__cross())&&e.parse(b)}))}};F.prototype.startScreens=function(a){i.each(a,function(a){var c=(a=new a)?a.screenName():"";a&&""!==c&&(""===this.sDefaultScreenName&&(this.sDefaultScreenName=c),this.oScreens[c]=a)},this);i.each(this.oScreens,function(a){a&&(!a.__started&&a.__start)&&(a.__started=!0,a.__start(),y.runHook("screen-pre-start", -[a.screenName(),a]),this.delegateRun(a,"onStart"),y.runHook("screen-post-start",[a.screenName(),a]))},this);a=Ta.create();a.addRoute(/^([a-zA-Z0-9\-]*)\/?(.*)$/,i.bind(this.screenOnRoute,this));P.initialized.add(a.parse,a);P.changed.add(a.parse,a);P.init()};F.prototype.setHash=function(a,b,c){a="#"===a.substr(0,1)?a.substr(1):a;a="/"===a.substr(0,1)?a.substr(1):a;c=d.isUnd(c)?!1:!!c;(d.isUnd(b)?0:b)?(P.changed.active=!1,P[c?"replaceHash":"setHash"](a),P.changed.active=!0):(P.changed.active=!0,P[c? -"replaceHash":"setHash"](a),P.setHash(a))};F.prototype.bootstart=function(){this.oBoot&&this.oBoot.bootstart&&this.oBoot.bootstart();return this};o=new F;G.newInstanceFromJson=function(a){var b=new G;return b.initByJson(a)?b:null};G.prototype.name="";G.prototype.email="";G.prototype.privateType=null;G.prototype.validate=function(){return""!==this.name||""!==this.email};G.prototype.hash=function(a){return"#"+(a?"":this.name)+"#"+this.email+"#"};G.prototype.clearDuplicateName=function(){this.name=== -this.email&&(this.name="")};G.prototype.type=function(){if(null===this.privateType&&(this.email&&"@facebook.com"===this.email.substr(-13)&&(this.privateType=g.EmailType.Facebook),null===this.privateType))this.privateType=g.EmailType.Default;return this.privateType};G.prototype.search=function(a){return-1<(this.name+" "+this.email).toLowerCase().indexOf(a.toLowerCase())};G.prototype.parse=function(a){var a=d.trim(a),b=/(?:"([^"]+)")? ?,]+)>?,? ?/g.exec(a);b?(this.name=b[1]||"",this.email= -b[2]||"",this.clearDuplicateName()):/^[^@]+@[^@]+$/.test(a)&&(this.name="",this.email=a)};G.prototype.initByJson=function(a){var b=!1;a&&"Object/Email"===a["@Object"]&&(this.name=d.trim(a.Name),this.email=d.trim(a.Email),b=""!==this.email,this.clearDuplicateName());return b};G.prototype.toLine=function(a,b){var c="";""!==this.email&&(b=d.isUnd(b)?!1:!!b,a&&""!==this.name?c=b?'")+'" target="_blank" tabindex="-1">'+d.encodeHtml(this.name)+ -"":this.name:(c=this.email,""!==this.name?c=b?d.encodeHtml('"'+this.name+'" <')+'")+'" target="_blank" tabindex="-1">'+d.encodeHtml(c)+""+d.encodeHtml(">"):'"'+this.name+'" <'+c+">":b&&(c=''+d.encodeHtml(this.email)+"")));return c};G.prototype.select2Result=function(){var a="",b=f.cache().getUserPic(this.email),a=""!==b?a+(''):a+('');g.EmailType.Facebook===this.type()?(a+=""+(0'):a+=""+(0('+this.name+")":this.email);return a+""};G.prototype.select2Selection=function(a){var b="";if(g.EmailType.Facebook===this.type()){if(b=0").text(b).appendTo(a),a.append(''),null}else b=0+$/,""),b=!0);return b};E.prototype.isImage=function(){return-1+$/,""),b=i.find(c,function(b){return a===b.cidWithOutTags})); -return b||null};p.prototype.findAttachmentByContentLocation=function(a){var b=null,c=this.attachments();d.isNonEmptyArray(c)&&(b=i.find(c,function(b){return a===b.contentLocation}));return b||null};p.prototype.messageId=function(){return this.sMessageId};p.prototype.inReplyTo=function(){return this.sInReplyTo};p.prototype.references=function(){return this.sReferences};p.prototype.fromAsSingleEmail=function(){return d.isArray(this.from)&&this.from[0]?this.from[0].email:""};p.prototype.viewLink=function(){return f.link().messageViewLink(this.requestHash)}; -p.prototype.downloadLink=function(){return f.link().messageDownloadLink(this.requestHash)};p.prototype.replyEmails=function(a){var b=[],a=d.isUnd(a)?{}:a;p.replyHelper(this.replyTo,a,b);0===b.length&&p.replyHelper(this.from,a,b);return b};p.prototype.replyAllEmails=function(a){var b=[],c=[],a=d.isUnd(a)?{}:a;p.replyHelper(this.replyTo,a,b);0===b.length&&p.replyHelper(this.from,a,b);p.replyHelper(this.to,a,b);p.replyHelper(this.cc,a,c);return[b,c]};p.prototype.textBodyToString=function(){return this.body? -this.body.html():""};p.prototype.attachmentsToStringLine=function(){var a=i.map(this.attachments(),function(a){return a.fileName+" ("+a.friendlySize+")"});return a&&0"};ya.prototype.formattedNameForCompose=function(){var a=this.name();return""===a?this.email():a+" ("+this.email()+")"};ya.prototype.formattedNameForEmail=function(){var a=this.name();return""===a?this.email():'"'+d.quoteName(a)+'" <'+this.email()+">"};d.extendAsViewModel("PopupsFolderClearViewModel",za);za.prototype.clearPopup=function(){this.clearingProcess(!1);this.selectedFolder(null)};za.prototype.onShow=function(a){this.clearPopup(); -a&&this.selectedFolder(a)};d.extendAsViewModel("PopupsFolderCreateViewModel",ga);ga.prototype.sNoParentText="";ga.prototype.simpleFolderNameValidation=function(a){return/^[^\\\/]+$/g.test(d.trim(a))};ga.prototype.clearPopup=function(){this.folderName("");this.selectedParentValue("");this.focusTrigger(!1)};ga.prototype.onShow=function(){this.clearPopup();this.focusTrigger(!0)};d.extendAsViewModel("PopupsFolderSystemViewModel",aa);aa.prototype.sChooseOnText="";aa.prototype.sUnuseText="";aa.prototype.onShow= -function(a){var b="",a=d.isUnd(a)?g.SetSystemFoldersNotification.None:a;switch(a){case g.SetSystemFoldersNotification.Sent:b=d.i18n("POPUPS_SYSTEM_FOLDERS/NOTIFICATION_SENT");break;case g.SetSystemFoldersNotification.Draft:b=d.i18n("POPUPS_SYSTEM_FOLDERS/NOTIFICATION_DRAFTS");break;case g.SetSystemFoldersNotification.Spam:b=d.i18n("POPUPS_SYSTEM_FOLDERS/NOTIFICATION_SPAM");break;case g.SetSystemFoldersNotification.Trash:b=d.i18n("POPUPS_SYSTEM_FOLDERS/NOTIFICATION_TRASH")}this.notification(b)};d.extendAsViewModel("PopupsComposeViewModel", -z);z.prototype.selectIdentity=function(a){a&&this.currentIdentityID(a.optValue)};z.prototype.formattedFrom=function(a){var b=f.data().displayName(),c=f.data().accountEmail();return""===b?c:(d.isUnd(a)?0:a)?'"'+d.quoteName(b)+'" <'+c+">":b+" ("+c+")"};z.prototype.sendMessageResponse=function(a,b){var c=!1;this.sending(!1);g.StorageResultType.Success===a&&(b&&b.Result)&&(c=!0,this.modalVisibility()&&o.delegateRun(this,"closeCommand"));this.modalVisibility()&&!c&&(b&&g.Notification.CantSaveMessage=== -b.ErrorCode?(this.sendSuccessButSaveError(!0),h.alert(d.trim(d.i18n("COMPOSE/SAVED_ERROR_ON_SEND")))):(this.sendError(!0),h.alert(d.getNotification(b.ErrorCode?b.ErrorCode:g.Notification.CantSendMessage))))};z.prototype.saveMessageResponse=function(a,b){var c=!1,e=null;this.saving(!1);if(g.StorageResultType.Success===a&&(b&&b.Result)&&(b.Result.NewFolder&&b.Result.NewUid)&&(this.bFromDraft&&(e=f.data().message())&&(this.draftFolder()===e.folderFullNameRaw&&this.draftUid()===e.uid)&&f.data().message(null), -this.draftFolder(b.Result.NewFolder),this.draftUid(b.Result.NewUid),this.draftID(b.Result.NewID),this.modalVisibility()))this.savedTime(h.Math.round((new h.Date).getTime()/1E3)),this.savedOrSendingText(0
    "+l+":

    "+q+"
    ";break;case g.ComposeType.Forward:Z=r.fromToLine(!1,!0);t=r.toToLine(!1,!0);w=r.ccToLine(!1,!0);q="


    "+d.i18n("COMPOSE/FORWARD_MESSAGE_TOP_TITLE")+"
    "+d.i18n("COMPOSE/FORWARD_MESSAGE_TOP_FROM")+": "+Z+"
    "+d.i18n("COMPOSE/FORWARD_MESSAGE_TOP_TO")+": "+t+(0"+d.i18n("COMPOSE/FORWARD_MESSAGE_TOP_CC")+": "+w:"")+"
    "+d.i18n("COMPOSE/FORWARD_MESSAGE_TOP_SENT")+ -": "+d.encodeHtml(l)+"
    "+d.i18n("COMPOSE/FORWARD_MESSAGE_TOP_SUBJECT")+": "+d.encodeHtml(h)+"

    "+q;break;case g.ComposeType.ForwardAsAttachment:q=""}this.oEditor.setRawText(q,r.isHtml)}}else this.oEditor&&g.ComposeType.Empty===a?this.oEditor.setRawText("
    "+d.convertPlainTextToHtml(f.data().signature()),g.EditorDefaultType.Html===f.data().editorDefaultType()):d.isNonEmptyArray(b)&&i.each(b,function(a){e.addMessageAsAttachment(a)});r=this.getAttachmentsDownloadsForUpload();d.isNonEmptyArray(r)&& -f.remote().messageUploadAttachments(function(a,b){if(g.StorageResultType.Success===a&&b&&b.Result){var c=null,d="";if(!e.viewModelVisibility())for(d in b.Result)if(b.Result.hasOwnProperty(d))(c=e.getAttachmentById(b.Result[d]))&&c.tempName(d)}else e.setMessageAttachmentFailedDowbloadText()},r);m&&this.oEditor&&this.oEditor.focus();this.triggerForResize()};z.prototype.onBuild=function(){this.initEditor();this.initUploader();var a=this,b=null;R.on("keydown",function(b){var d=!0;b&&(a.modalVisibility()&& -f.data().useKeyboardShortcuts())&&(b.ctrlKey&&g.EventKeyCode.S===b.keyCode?(a.saveCommand(),d=!1):b.ctrlKey&&g.EventKeyCode.Enter===b.keyCode&&(a.sendCommand(),d=!1));return d});R.on("resize",function(){a.triggerForResize()});this.dropboxEnabled()&&(b=document.createElement("script"),b.type="text/javascript",b.src="https://www.dropbox.com/static/api/1/dropins.js",j(b).attr("id","dropboxjs").attr("data-app-key",f.settingsGet("DropboxApiKey")),document.body.appendChild(b))};z.prototype.getAttachmentById= -function(a){for(var b=this.attachments(),c=0,d=b.length;cb.data("rl-cache-count")&&(b.addClass("rl-cache-purge"),a++)}),0').hide().addClass("rl-cache-class"),h.data("rl-cache-count",++m.iMessageBodyCacheCount),d.isNormal(a.Result.Html)&&""!==a.Result.Html?(c=!0,h.html(a.Result.Html.toString()).addClass("b-text-part html")):d.isNormal(a.Result.Plain)&&""!==a.Result.Plain?(c=!1,h.html(a.Result.Plain.toString()).addClass("b-text-part plain")): -c=!1,a.Result.Rtl&&(h.data("rl-is-rtl",!0),h.addClass("rtl-text-part")),i.append(h),h.data("rl-is-html",c),h.data("rl-has-images",e),l.isRtl(!!h.data("rl-is-rtl")),l.isHtml(!!h.data("rl-is-html")),l.hasImages(!!h.data("rl-has-images")),l.body=h,g&&l.showInternalImages(!0),l.hasImages()&&this.showImages()&&l.showExternalImages(!0),this.purgeMessageBodyCacheThrottle()):(e.data("rl-cache-count",++m.iMessageBodyCacheCount),l.isRtl(!!e.data("rl-is-rtl")),l.isHtml(!!e.data("rl-is-html")),l.hasImages(!!e.data("rl-has-images")), -l.body=e),this.messageActiveDom(l.body),this.hideMessageBodies(),l.body.show(),h&&d.initBlockquoteSwitcher(h);f.cache().initMessageFlagsFromCache(l);l.unseen()&&f.setMessageSeen(l);d.windowResize()}};U.prototype.setMessageList=function(a,b){if(a&&a.Result&&"Collection/MessageCollection"===a.Result["@Object"]&&a.Result["@Collection"]&&d.isArray(a.Result["@Collection"])){var c=f.data(),e=f.cache(),h=null,i=0,j=0,l=0,m=0,q=[],o=c.staticMessageList,r=null,H=null,n=null,s=0,u=!1,l=d.pInt(a.Result.MessageResultCount), -m=d.pInt(a.Result.Offset);d.isNonEmptyArray(a.Result.LastCollapsedThreadUids)&&(h=a.Result.LastCollapsedThreadUids);if((n=f.cache().getFolderFromCacheList(d.isNormal(a.Result.Folder)?a.Result.Folder:""))&&!b)f.cache().setFolderHash(a.Result.Folder,a.Result.FolderHash),d.isNormal(a.Result.MessageCount)&&n.messageCountAll(a.Result.MessageCount),d.isNormal(a.Result.MessageUnseenCount)&&(d.pInt(n.messageCountUnread())!==d.pInt(a.Result.MessageUnseenCount)&&(u=!0),n.messageCountUnread(a.Result.MessageUnseenCount)), -this.initUidNextAndNewMessages(n.fullNameRaw,a.Result.UidNext,a.Result.NewMessages);u&&n&&f.cache().clearMessageFlagsFromCacheByFolder(n.fullNameRaw);i=0;for(j=a.Result["@Collection"].length;i=s&&(s++,H.newForAnimation(!0)),H.deleted(!1),b?f.cache().initMessageFlagsFromCache(H):f.cache().storeMessageFlagsToCache(H), -H.lastInCollapsedThread(h&&-1(new h.Date).getTime()-l);q&&t.oRequests[q]&& -(t.oRequests[q].__aborted&&(f="abort"),t.oRequests[q]=null);t.defaultResponse(a,q,f,c,e,b)});q&&(0").addClass("rl-settings-view-model").hide().attr("data-bind",'template: {name: "'+g.__rlSettingsData.Template+'"}, i18nInit: true'),t.appendTo(h),c.data=f.data(),c.viewModelDom=t,c.__rlSettingsData=g.__rlSettingsData,g.__dom=t,g.__builded= -!0,g.__vm=c,e.applyBindings(c,t[0]),o.delegateRun(c,"onBuild",[t])):d.log("Cannot find sub settings view model position: SettingsSubScreen"),c&&i.defer(function(){if(b.oCurrentSubScreen){o.delegateRun(b.oCurrentSubScreen,"onHide");b.oCurrentSubScreen.viewModelDom.hide()}b.oCurrentSubScreen=c;if(b.oCurrentSubScreen){b.oCurrentSubScreen.viewModelDom.show();o.delegateRun(b.oCurrentSubScreen,"onShow");i.each(b.menu(),function(a){a.selected(c&&c.__rlSettingsData&&a.route===c.__rlSettingsData.Route)}); -j("#rl-content .b-settings .b-content .content").scrollTop(0)}d.windowResize()})):o.setHash(f.link().settings(),!1,!0)};fa.prototype.onHide=function(){this.oCurrentSubScreen&&this.oCurrentSubScreen.viewModelDom&&(o.delegateRun(this.oCurrentSubScreen,"onHide"),this.oCurrentSubScreen.viewModelDom.hide())};fa.prototype.onBuild=function(){i.each(V.settings,function(a){a&&(a.__rlSettingsData&&!i.find(V["settings-removed"],function(b){return b&&b===a}))&&this.menu.push({route:a.__rlSettingsData.Route,label:a.__rlSettingsData.Label, -selected:e.observable(!1),disabled:!!i.find(V["settings-disabled"],function(b){return b&&b===a})})},this);this.oViewModelPlace=j("#rl-content #rl-settings-subscreen")};fa.prototype.routes=function(){var a=i.find(V.settings,function(a){return a&&a.__rlSettingsData&&a.__rlSettingsData.IsDefault}),b=a?a.__rlSettingsData.Route:"general",a={subname:/^(.*)$/,normalize_:function(a,f){f.subname=d.isUnd(f.subname)?b:d.pString(f.subname);return[f.subname]}};return[["{subname}/",a],["{subname}",a],["",a]]}; -i.extend(Fa.prototype,L.prototype);Fa.prototype.onShow=function(){f.setTitle(d.i18n("TITLES/LOGIN"))};i.extend(ca.prototype,L.prototype);ca.prototype.oLastRoute={};ca.prototype.onShow=function(){var a=f.data().accountEmail();f.setTitle((""===a?"":a+" - ")+d.i18n("TITLES/MAILBOX"))};ca.prototype.onRoute=function(a,b,c){var d=f.data(),a=f.cache().getFolderFullNameRaw(a);if(a=f.cache().getFolderFromCacheList(a))d.currentFolder(a).messageListPage(b).messageListSearch(c),!d.usePreviewPane()&&d.message()&& -d.message(null),f.reloadMessageList()};ca.prototype.onStart=function(){var a=f.data(),b=function(){d.windowResize()};(f.settingsGet("AllowAdditionalAccounts")||f.settingsGet("AllowIdentities"))&&f.accountsAndIdentities();i.delay(function(){f.quota()},5E3);i.delay(function(){"INBOX"!==a.currentFolderFullNameRaw()&&f.folderInformation("INBOX")},1E3);i.delay(function(){var b=f.data().spamFolder();b!==a.currentFolderFullNameRaw()&&f.folderInformation(b)},1500);i.delay(function(){var b=f.data().draftFolder(); -b!==a.currentFolderFullNameRaw()&&f.folderInformation(b)},2E3);i.delay(function(){f.remote().appDelayStart(d.emptyFunction)},35E3);h.setInterval(function(){f.folderInformation("INBOX")},12E4);h.setInterval(function(){f.quota()},3E5);Q.toggleClass("rl-no-preview-pane",!a.usePreviewPane());a.folderList.subscribe(b);a.messageList.subscribe(b);a.message.subscribe(b);a.usePreviewPane.subscribe(function(a){Q.toggleClass("rl-no-preview-pane",!a)})};ca.prototype.onBuild=function(){m.bMobileDevice||i.defer(function(){d.initLayoutResizer("#rl-resizer-left", -"#rl-resizer-right","#rl-right",350,800,350,350,g.ClientSideKeyName.MailBoxListSize)})};ca.prototype.routes=function(){var a=function(a,c){c[0]=d.pString(c[0]);c[1]=d.pInt(c[1]);c[1]=0>=c[1]?1:c[1];c[2]=d.pString(c[2]);""===a&&(c[0]="Inbox",c[1]=1);return[decodeURI(c[0]),c[1],decodeURI(c[2])]};return[[/^([a-zA-Z0-9]+)\/p([1-9][0-9]*)\/(.+)\/?$/,{normalize_:a}],[/^([a-zA-Z0-9]+)\/p([1-9][0-9]*)\/?$/,{normalize_:a}],[/^([a-zA-Z0-9]+)\/(.+)\/?$/,{normalize_:function(a,c){c[0]=d.pString(c[0]);c[1]=d.pString(c[1]); -""===a&&(c[0]="Inbox");return[decodeURI(c[0]),1,decodeURI(c[1])]}}],[/^([^\/]*)$/,{normalize_:a}]]};i.extend(Qa.prototype,fa.prototype);Qa.prototype.onShow=function(){f.setTitle(this.sSettingsTitle)};i.extend(K.prototype,Ua.prototype);K.prototype.oSettings=null;K.prototype.oLink=null;K.prototype.download=function(a){var b=null,c=null;if((b=navigator.userAgent.toLowerCase())&&(-1bkhN_!|Wn*Vos8{TEhUT@5e;_WJsIMMcG5%>DiS&dv_N`4@J0cnAQ-#>RjZ z00W5t&tJ^l-QC*ST1-p~00u^9XJ=AUl7oW-;2a+x2k__T=grN{+1c4XK0ZL~^z^i$ zp&>vEhr@4fZWb380S18T&!0cQ3IKpHF)?v=b_NIm0Q>vwY7D0baZ)n z31Fa5sELUQARIVaU0nqf0XzT+fB_63aA;@<$l~wse|mcA;^G1TmX?-)e)jkGPfkuA z92@|!<>h5S_4f8QP-JRq>d&7)^Yin8l7K8gED$&_FaV?gY+wLjpoW%~7NDe=nHfMG z5DO3j{R9kv5GbssrUpO)OyvVrlx>u0UKD0i;Dpm5S5dY16(DL5l{ixz|mhJU@&-OWCTb7_%}8-fE(P~+XIRO zJU|wp1|S>|J3KrLcz^+v1f&BDpd>&MAaibR4#5A_4(MucZwG9E1h4@u0P@C8;oo+g zIVj7kfJi{oV~E(NZ*h(@^-(Q(C`Psb3KZ{N;^GB(a8NE*Vwc715!9 zr-H4Ao|T_c6+VT_JH9H+P3>iXSt!a$F`>s`jn`w9GZ_~B!{0soaiV|O_c^R2aWa%}O3jUE)WO=pa zs~_Wz08z|ieY5A%$@FcBF9^!1a}m5ks@7gjn;67N>}S~Hrm`4sM5Hh`q7&5-N{|31 z6x1{ol7BnskoViZ0GqbLa#kW`Z)VCjt1MysKg|rT zi!?s##Ck>8c zpi|>$lGlw#@yMNi&V4`6OBGJ(H&7lqLlcTQ&1zWriG_fL>BnFcr~?;E93{M-xIozQ zO=EHQ#+?<}%@wbWWv23#!V70h9MOuUVaU>3kpTvYfc|LBw?&b*89~Gc9i&8tlT#kF ztpbZoAzkdB+UTy=tx%L3Z4)I{zY(Kb)eg{InobSJmNwPZt$14aS-uc4eKuY8h$dtfyxu^a%zA)>fYI&)@ZXky?^{5>xSC?;w4r&td6vBdi%vHm4=XJH!3yL3?Ep+T5aU_>i;yr_XGq zxZfCzUU@GvnoIk+_Nd`aky>S&H!b*{A%L>?*XPAgWL(Vf(k7qUS}>Zn=U(ZfcOc{B z3*tOHH@t5Ub5D~#N7!Fxx}P2)sy{vE_l(R7$aW&CX>c|&HY+7};vUIietK%}!phrCuh+;C@1usp;XLU<8Gq8P!rEI3ieg#W$!= zQcZr{hp>8sF?k&Yl0?B84OneiQxef-4TEFrq3O~JAZR}yEJHA|Xkqd49tR&8oq{zP zY@>J^HBV*(gJvJZc_0VFN7Sx?H7#75E3#?N8Z!C+_f53YU}pyggxx1?wQi5Yb-_`I`_V*SMx5+*P^b=ec5RON-k1cIlsBLk}(HiaJyab0`CI zo0{=1_LO$~oE2%Tl_}KURuX<`+mQN_sTdM&* zkFf!Xtl^e^gTy6ON=&gTn6)$JHQq2)33R@_!#9?BLNq-Wi{U|rVX7Vny$l6#+SZ@KvQt@VYb%<9JfapI^b9j=wa+Tqb4ei;8c5 z&1>Uz@lVFv6T4Z*YU$r4G`g=91lSeA<=GRZ!*KTWKDPR}NPUW%peCUj`Ix_LDq!8| zMH-V`Pv!a~QkTL||L@cqiTz)*G-0=ytr1KqTuFPan9y4gYD5>PleK`NZB$ev@W%t= zkp)_=lBUTLZJpAtZg;pjI;7r2y|26-N7&a(hX|`1YNM9N8{>8JAuv}hp1v`3JHT-=5lbXpbMq7X~2J5Kl zh7tyU`_AusMFZ{ej9D;Uyy;SQ!4nwgSnngsYBwdS&EO3NS*o04)*juAYl;57c2Ly0(DEZ8IY?zSph-kyxu+D`tt@oU{32J#I{vmy=#0ySPK zA+i(A3yl)qmTz*$dZi#y9FS;$;h%bY+;StNx{_R56Otq+?pGe^T^{5d7Gs&?`_r`8 zD&dzOA|j8@3A&FR5U3*eQNBf<4^4W_iS_()*8b4aaUzfk2 zzIcMWSEjm;EPZPk{j{1>oXd}pXAj!NaRm8{Sjz!D=~q3WJ@vmt6ND_?HI~|wUS1j5 z9!S1MKr7%nxoJ3k`GB^7yV~*{n~O~n6($~x5Bu{7s|JyXbAyKI4+tO(zZYMslK;Zc zzeHGVl{`iP@jfSKq>R;{+djJ9n%$%EL()Uw+sykjNQdflkJZSjqV_QDWivbZS~S{K zkE@T^Jcv)Dfm93!mf$XYnCT--_A$zo9MOkPB6&diM8MwOfV?+ApNv`moV@nqn>&lv zYbN1-M|jc~sG|yLN^1R2=`+1ih3jCshg`iP&mY$GMTcY^W^T`WOCX!{-KHmZ#GiRH zYl{|+KLn5!PCLtBy~9i}`#d^gCDDx$+GQb~uc;V#K3OgbbOG0j5{BRG-si%Bo{@lB zGIt+Ain8^C`!*S0d0OSWVO+Z89}}O8aFTZ>p&k}2gGCV zh#<$gswePFxWGT$4DC^8@84_e*^KT74?7n8!$8cg=sL$OlKr&HMh@Rr5%*Wr!xoOl zo7jItnj-xYgVTX)H1=A2bD(tleEH57#V{xAeW_ezISg5OC zg=k>hOLA^urTH_e6*vSYRqCm$J{xo}-x3@HH;bsHD1Z`Pzvsn}%cvfw%Q(}h`Dgtb z0_J^niUmoCM5$*f)6}}qi(u;cPgxfyeVaaVmOsG<)5`6tzU4wyhF;k|~|x>7-2hXpVBpc5k{L4M`Wbe6Q?tr^*B z`Y*>6*&R#~%JlBIitlZ^qGe3s21~h3U|&k%%jeMM;6!~UH|+0+<5V-_zDqZQN79?n?!Aj!Nj`YMO9?j>uqI9-Tex+nJD z%e0#Yca6(zqGUR|KITa?9x-#C0!JKJHO(+fy@1!B$%ZwJwncQW7vGYv?~!^`#L~Um zOL++>4qmqW`0Chc0T23G8|vO)tK=Z2`gvS4*qpqhIJCEv9i&&$09VO8YOz|oZ+ubd zNXVdLc&p=KsSgtmIPLN69P7xYkYQ1vJ?u1g)T!6Ru`k2wkdj*wDC)VryGu2=yb0?F z>q~~e>KZ0d_#7f3UgV%9MY1}vMgF{B8yfE{HL*pMyhYF)WDZ^^3vS8F zGlOhs%g_~pS3=WQ#494@jAXwOtr^Y|TnQ5zki>qRG)(oPY*f}U_=ip_{qB0!%w7~G zWE!P4p3khyW-JJnE>eECuYfI?^d366Shq!Wm#x&jAo>=HdCllE$>DPO0N;y#4G)D2y#B@5=N=+F%Xo2n{gKcPcK2!hP*^WSXl+ut; zyLvVoY>VL{H%Kd9^i~lsb8j4>$EllrparEOJNT?Ym>vJa$(P^tOG)5aVb_5w^*&M0 zYOJ`I`}9}UoSnYg#E(&yyK(tqr^@n}qU2H2DhkK-`2He% zgXr_4kpXoQHxAO9S`wEdmqGU4j=1JdG!OixdqB4PPP6RXA}>GM zumruUUH|ZG2$bBj)Qluj&uB=dRb)?^qomw?Z$X%#D+Q*O97eHrgVB2*mR$bFBU`*} zIem?dM)i}raTFDn@5^caxE^XFXVhBePmH9fqcTi`TLaXiueH=@06sl}>F%}h9H_e9 z>^O?LxM1EjX}NVppaO@NNQr=AtHcH-BU{yBT_vejJ#J)l^cl69Z7$sk`82Zyw7Wxt z=~J?hZm{f@W}|96FUJfy65Gk8?^{^yjhOahUMCNNpt5DJw}ZKH7b!bGiFY9y6OY&T z_N)?Jj(MuLTN36ZCJ6I5Xy7uVlrb$o*Z%=-)kPo9s?<^Yqz~!Z* z_mP8(unFq65XSi!$@YtieSQ!<7IEOaA9VkKI?lA`*(nURvfKL8cX}-+~uw9|_5)uC2`ZHcaeX7L8aG6Ghleg@F9aG%X$#g6^yP5apnB>YTz&EfS{q z9UVfSyEIczebC)qlVu5cOoMzS_jrC|)rQlAzK7sfiW0`M8mVIohazPE9Jzn*qPt%6 zZL8RELY@L09B83@Be;x5V-IHnn$}{RAT#<2JA%ttlk#^(%u}CGze|1JY5MPhbfnYG zIw%$XfBmA-<_pKLpGKwbRF$#P;@_)ech#>vj25sv25VM$ouo)?BXdRcO{)*OwTw)G zv43W~T6ekBMtUD%5Bm>`^Ltv!w4~65N!Ut5twl!Agrzyq4O2Fi3pUMtCU~>9gt_=h-f% z;1&OuSu?A_sJvIvQ+dZNo3?m1%b1+s&UAx?8sUHEe_sB7zkm4R%6)<@oYB_i5>3Ip zIA+?jVdX|zL{)?TGpx+=Ta>G80}0}Ax+722$XFNJsC1gcH56{8B)*)eU#r~HrC&}` z|EWW92&;6y;3}!L5zXa385@?-D%>dSvyK;?jqU2t_R3wvBW;$!j45uQ7tyEIQva;Db}r&bR3kqNSh)Q_$MJ#Uj3Gj1F;)sO|%6z#@<+ zi{pbYsYS#u`X$Nf($OS+lhw>xgjos1OnF^$-I$u;qhJswhH~p|ab*nO>zBrtb0ndn zxV0uh!LN`&xckTP+JW}gznSpU492)u+`f{9Yr)js`NmfYH#Wdtradc0TnKNz@Su!e zu$9}G_=ku;%4xk}eXl>)KgpuT>_<`Ud(A^a++K&pm3LbN;gI}ku@YVrA%FJBZ5$;m zobR8}OLtW4-i+qPPLS-(7<>M{)rhiPoi@?&vDeVq5%fmZk=mDdRV>Pb-l7pP1y6|J z8I>sF+TypKV=_^NwBU^>4JJq<*14GLfM2*XQzYdlqqjnE)gZsPW^E@mp&ww* zW9i>XL=uwLVZ9pO*8K>t>vdL~Ek_NUL$?LQi5sc#1Q-f6-ywKcIT8Kw?C(_3pbR`e|)%9S-({if|E+hR2W!&qfQ&UiF^I!|M#xhdWsenv^wpKCBiuxXbnp85`{i|;BM?Ba`lqTA zyRm=UWJl&E{8JzYDHFu>*Z10-?#A8D|5jW9Ho0*CAs0fAy~MqbwYuOq9jjt9*nuHI zbDwKvh)5Ir$r!fS5|;?Dt>V+@F*v8=TJJF)TdnC#Mk>+tGDGCw;A~^PC`gUt*<(|i zB{{g{`uFehu`$fm4)&k7`u{xIV)yvA(%5SxX9MS80p2EKnLtCZ>tlX>*Z6nd&6-Mv$5rHD*db;&IBK3KH&M<+ArlGXDRdX1VVO4)&R$f4NxXI>GBh zSv|h>5GDAI(4E`@F?EnW zS>#c&Gw6~_XL`qQG4bK`W*>hek4LX*efn6|_MY+rXkNyAuu?NxS%L7~9tD3cn7&p( zCtfqe6sjB&Q-Vs7BP5+%;#Gk};4xtwU!KY0XXbmkUy$kR9)!~?*v)qw00!+Yg^#H> zc#8*z6zZo>+(bud?K<*!QO4ehiTCK&PD4G&n)Tr9X_3r-we z?fI+}-G~Yn93gI6F{}Dw_SC*FLZ)5(85zp4%uubtD)J)UELLkvGk4#tw&Tussa)mTD$R2&O~{ zCI3>fr-!-b@EGRI%g0L8UU%%u_<;e9439JNV;4KSxd|78v+I+8^rmMf3f40Jb}wEszROD?xBZu>Ll3;sUIoNxDK3|j3*sam2tC@@e$ z^!;+AK>efeBJB%ALsQ{uFui)oDoq()2USi?n=6C3#eetz?wPswc={I<8x=(8lE4EIsUfyGNZ{|KYn1IR|=E==f z(;!A5(-2y^2xRFCSPqzHAZn5RCN_bp22T(KEtjA(rFZ%>a4@STrHZflxKoqe9Z4@^ zM*scx_y73?Q{vt6?~WEl?2q*;@8 z3M*&@%l)SQmXkcUm)d@GT2#JdzhfSAP9|n#C;$E8X|pwD!r#X?0P>0ZisQ~TNqupW z*lUY~+ikD`vQb?@SAWX#r*Y+;=_|oacL$2CL$^(mV}aKO77pg}O+-=T1oLBT5sL2i z42Qth2+0@C`c+*D0*5!qy26sis<9a7>LN2{z%Qj49t z=L@x`4$ALHb*3COHoT?5S_c(Hs}g!V>W^=6Q0}zaubkDn)(lTax0+!+%B}9Vqw6{H zvL|BRM`O<@;eVi1DzM!tXtBrA20Ce@^Jz|>%X-t`vi-%WweXCh_LhI#bUg2*pcP~R z*RuTUzBKLXO~~uMd&o$v3@d0shHfUjC6c539PE6rF&;Ufa(Rw@K1*m7?f5)t`MjH0 z)_V(cajV5Am>f!kWcI@5rE8t6$S>5M=k=aRZROH6fA^jJp~2NlR4;Q2>L$7F#RT#9 z>4@1RhWG`Khy>P2j1Yx^BBL{S`niMaxlSWV-JBU0-T9zZ%>7mR3l$~QV$({o0;jTI ze5=cN^!Bc2bT|BcojXp~K#2cM>OTe*cM{Kg-j*CkiW)EGQot^}s;cy8_1_@JA0Whq zlrNr+R;Efa+`6N)s5rH*|E)nYZ3uqkk2C(E7@A|3YI`ozP~9Lexx#*1(r8luq+YPk z{J}c$s` zPM35Fx(YWB3Z5IYnN+L_4|jaR(5iWJi2~l&xy}aU7kW?o-V*6Av2wyZTG!E2KSW2* zGRLQkQU;Oz##ie-Z4fI)WSRxn$(ZcD;TL+;^r=a4(G~H3ZhK$lSXZj?cvyY8%d9JM zzc3#pD^W_QnWy#rx#;c&N@sqHhrnHRmj#i;s%zLm6SE(n&BWpd&f7>XnjV}OlZntI70fq%8~9<7 zMYaw`E-rp49-oC1N_uZTo)Cu%RR2QWdHpzQIcNsoDp`3xfP+`gI?tVQZ4X={qU?(n zV>0ASES^Xuc;9JBji{)RnFL(Lez;8XbB1uWaMp@p?7xhXk6V#!6B@aP4Rz7-K%a>i z?fvf}va_DGUXlI#4--`A3qK7J?-HwnG7O~H2;zR~RLW)_^#La!=}+>KW#anZ{|^D3 B7G?kd literal 0 HcmV?d00001 diff --git a/vendors/bootstrap/img/glyphicons-halflings.png b/vendors/bootstrap/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 zcma*OWmH^Ivn@*S;K3nSf_t!#;0f+&pm7Po8`nk}2q8f5;M%x$SdAkd9FAvlc$ zx660V9e3Ox@4WZ^?7jZ%QFGU-T~%||Ug4iK6bbQY@zBuF2$hxOw9wF=A)nUSxR_5@ zEX>HBryGrjyuOFFv$Y4<+|3H@gQfEqD<)+}a~mryD|1U9*I_FOG&F%+Ww{SJ-V2BR zjt<81Ek$}Yb*95D4RS0HCps|uLyovt;P05hchQb-u2bzLtmog&f2}1VlNhxXV);S9 zM2buBg~!q9PtF)&KGRgf3#z7B(hm5WlNClaCWFs!-P!4-u*u5+=+D|ZE9e`KvhTHT zJBnLwGM%!u&vlE%1ytJ=!xt~y_YkFLQb6bS!E+s8l7PiPGSt9xrmg?LV&&SL?J~cI zS(e9TF1?SGyh+M_p@o1dyWu7o7_6p;N6hO!;4~ z2B`I;y`;$ZdtBpvK5%oQ^p4eR2L)BH>B$FQeC*t)c`L71gXHPUa|vyu`Bnz)H$ZcXGve(}XvR!+*8a>BLV;+ryG1kt0=)ytl zNJxFUN{V7P?#|Cp85QTa@(*Q3%K-R(Pkv1N8YU*(d(Y}9?PQ(j;NzWoEVWRD-~H$=f>j9~PN^BM2okI(gY-&_&BCV6RP&I$FnSEM3d=0fCxbxA6~l>54-upTrw zYgX@%m>jsSGi`0cQt6b8cX~+02IghVlNblR7eI;0ps}mpWUcxty1yG56C5rh%ep(X z?)#2d?C<4t-KLc*EAn>>M8%HvC1TyBSoPNg(4id~H8JwO#I)Bf;N*y6ai6K9_bA`4 z_g9(-R;qyH&6I$`b42v|0V3Z8IXN*p*8g$gE98+JpXNY+jXxU0zsR^W$#V=KP z3AEFp@OL}WqwOfsV<)A^UTF4&HF1vQecz?LWE@p^Z2){=KEC_3Iopx_eS42>DeiDG zWMXGbYfG~W7C8s@@m<_?#Gqk;!&)_Key@^0xJxrJahv{B&{^!>TV7TEDZlP|$=ZCz zmX=ZWtt4QZKx**)lQQoW8y-XLiOQy#T`2t}p6l*S`68ojyH@UXJ-b~@tN`WpjF z%7%Yzv807gsO!v=!(2uR)16!&U5~VPrPHtGzUU?2w(b1Xchq}(5Ed^G|SD7IG+kvgyVksU) z(0R)SW1V(>&q2nM%Z!C9=;pTg!(8pPSc%H01urXmQI6Gi^dkYCYfu6b4^tW))b^U+ z$2K&iOgN_OU7n#GC2jgiXU{caO5hZt0(>k+c^(r><#m|#J^s?zA6pi;^#*rp&;aqL zRcZi0Q4HhVX3$ybclxo4FFJW*`IV`)Bj_L3rQe?5{wLJh168Ve1jZv+f1D}f0S$N= zm4i|9cEWz&C9~ZI3q*gwWH^<6sBWuphgy@S3Qy?MJiL>gwd|E<2h9-$3;gT9V~S6r z)cAcmE0KXOwDA5eJ02-75d~f?3;n7a9d_xPBJaO;Z)#@s7gk5$Qn(Fc^w@9c5W0zY z59is0?Mt^@Rolcn{4%)Ioat(kxQH6}hIykSA)zht=9F_W*D#<}N(k&&;k;&gKkWIL z0Of*sP=X(Uyu$Pw;?F@?j{}=>{aSHFcii#78FC^6JGrg-)!)MV4AKz>pXnhVgTgx8 z1&5Y=>|8RGA6++FrSy=__k_imx|z-EI@foKi>tK0Hq2LetjUotCgk2QFXaej!BWYL zJc{fv(&qA7UUJ|AXLc5z*_NW#yWzKtl(c8mEW{A>5Hj^gfZ^HC9lQNQ?RowXjmuCj4!!54Us1=hY z0{@-phvC}yls!PmA~_z>Y&n&IW9FQcj}9(OLO-t^NN$c0o}YksCUWt|DV(MJB%%Sr zdf}8!9ylU2TW!=T{?)g-ojAMKc>3pW;KiZ7f0;&g)k}K^#HBhE5ot)%oxq$*$W@b# zg4p<Ou`ME|Kd1WHK@8 zzLD+0(NHWa`B{em3Ye?@aVsEi>y#0XVZfaFuq#;X5C3{*ikRx7UY4FF{ZtNHNO?A_ z#Q?hwRv~D8fPEc%B5E-ZMI&TAmikl||EERumQCRh7p;)>fdZMxvKq;ky0}7IjhJph zW*uuu*(Y6)S;Od--8uR^R#sb$cmFCnPcj9PPCWhPN;n`i1Q#Qn>ii z{WR|0>8F`vf&#E(c2NsoH=I7Cd-FV|%(7a`i}gZw4N~QFFG2WtS^H%@c?%9UZ+kez z;PwGgg_r6V>Kn5n(nZ40P4qMyrCP3bDkJp@hp6&X3>gzC>=f@Hsen<%I~7W+x@}b> z0}Et*vx_50-q@PIV=(3&Tbm}}QRo*FP2@)A#XX-8jYspIhah`9ukPBr)$8>Tmtg&R z?JBoH17?+1@Y@r>anoKPQ}F8o9?vhcG79Cjv^V6ct709VOQwg{c0Q#rBSsSmK3Q;O zBpNihl3S0_IGVE)^`#94#j~$;7+u870yWiV$@={|GrBmuz4b)*bCOPkaN0{6$MvazOEBxFdKZDlbVvv{8_*kJ zfE6C`4&Kkz<5u%dEdStd85-5UHG5IOWbo8i9azgg#zw-(P1AA049hddAB*UdG3Vn0 zX`OgM+EM|<+KhJ<=k?z~WA5waVj?T9eBdfJGebVifBKS1u<$#vl^BvSg)xsnT5Aw_ZY#}v*LXO#htB>f}x3qDdDHoFeb zAq7;0CW;XJ`d&G*9V)@H&739DpfWYzdQt+Kx_E1K#Cg1EMtFa8eQRk_JuUdHD*2;W zR~XFnl!L2A?48O;_iqCVr1oxEXvOIiN_9CUVTZs3C~P+11}ebyTRLACiJuMIG#`xP zKlC|E(S@QvN+%pBc6vPiQS8KgQAUh75C0a2xcPQDD$}*bM&z~g8+=9ltmkT$;c;s z5_=8%i0H^fEAOQbHXf0;?DN5z-5+1 zDxj50yYkz4ox9p$HbZ|H?8ukAbLE^P$@h}L%i6QVcY>)i!w=hkv2zvrduut%!8>6b zcus3bh1w~L804EZ*s96?GB&F7c5?m?|t$-tp2rKMy>F*=4;w*jW}^;8v`st&8)c; z2Ct2{)?S(Z;@_mjAEjb8x=qAQvx=}S6l9?~H?PmP`-xu;ME*B8sm|!h@BX4>u(xg_ zIHmQzp4Tgf*J}Y=8STR5_s)GKcmgV!$JKTg@LO402{{Wrg>#D4-L%vjmtJ4r?p&$F!o-BOf7ej~ z6)BuK^^g1b#(E>$s`t3i13{6-mmSp7{;QkeG5v}GAN&lM2lQT$@(aQCcFP(%UyZbF z#$HLTqGT^@F#A29b0HqiJsRJAlh8kngU`BDI6 zJUE~&!cQ*&f95Ot$#mxU5+*^$qg_DWNdfu+1irglB7yDglzH()2!@#rpu)^3S8weW z_FE$=j^GTY*|5SH95O8o8W9FluYwB=2PwtbW|JG6kcV^dMVmX(wG+Otj;E$%gfu^K z!t~<3??8=()WQSycsBKy24>NjRtuZ>zxJIED;YXaUz$@0z4rl+TW zWxmvM$%4jYIpO>j5k1t1&}1VKM~s!eLsCVQ`TTjn3JRXZD~>GM z$-IT~(Y)flNqDkC%DfbxaV9?QuWCV&-U1yzrV@0jRhE;)ZO0=r-{s@W?HOFbRHDDV zq;eLo+wOW;nI|#mNf(J?RImB9{YSO2Y`9825Lz#u4(nk3)RGv3X8B(A$TsontJ8L! z9JP^eWxtKC?G8^xAZa1HECx*rp35s!^%;&@Jyk)NexVc)@U4$^X1Dag6`WKs|(HhZ#rzO2KEw3xh~-0<;|zcs0L>OcO#YYX{SN8m6`9pp+ zQG@q$I)T?aoe#AoR@%om_#z=c@ych!bj~lV13Qi-xg$i$hXEAB#l=t7QWENGbma4L zbBf*X*4oNYZUd_;1{Ln_ZeAwQv4z?n9$eoxJeI?lU9^!AB2Y~AwOSq67dT9ADZ)s@ zCRYS7W$Zpkdx$3T>7$I%3EI2ik~m!f7&$Djpt6kZqDWZJ-G{*_eXs*B8$1R4+I}Kf zqniwCI64r;>h2Lu{0c(#Atn)%E8&)=0S4BMhq9$`vu|Ct;^ur~gL`bD>J@l)P$q_A zO7b3HGOUG`vgH{}&&AgrFy%K^>? z>wf**coZ2vdSDcNYSm~dZ(vk6&m6bVKmVgrx-X<>{QzA!)2*L+HLTQz$e8UcB&Djq zl)-%s$ZtUN-R!4ZiG=L0#_P=BbUyH+YPmFl_ogkkQ$=s@T1v}rNnZ^eMaqJ|quc+6 z*ygceDOrldsL30w`H;rNu+IjlS+G~p&0SawXCA1+D zC%cZtjUkLNq%FadtHE?O(yQTP486A{1x<{krq#rpauNQaeyhM3*i0%tBpQHQo-u)x z{0{&KS`>}vf2_}b160XZO2$b)cyrHq7ZSeiSbRvaxnKUH{Q`-P(nL&^fcF2){vhN- zbX&WEjP7?b4A%0y6n_=m%l00uZ+}mCYO(!x?j$+O$*TqoD_Q5EoyDJ?w?^UIa491H zE}87(bR`X;@u#3Qy~9wWdWQIg1`cXrk$x9=ccR|RY1~%{fAJ@uq@J3e872x0v$hmv ze_KcL(wM|n0EOp;t{hKoohYyDmYO;!`7^Lx;0k=PWPGZpI>V5qYlzjSL_(%|mud50 z7#{p97s`U|Sn$WYF>-i{i4`kzlrV6a<}=72q2sAT7Zh{>P%*6B;Zl;~0xWymt10Mo zl5{bmR(wJefJpNGK=fSRP|mpCI-)Nf6?Pv==FcFmpSwF1%CTOucV{yqxSyx4Zws3O z8hr5Uyd%ezIO7?PnEO0T%af#KOiXD$e?V&OX-B|ZX-YsgSs%sv-6U+sLPuz{D4bq| zpd&|o5tNCmpT>(uIbRf?8c}d3IpOb3sn6>_dr*26R#ev<_~vi)wleW$PX|5)$_ z+_|=pi(0D(AB_sjQ;sQQSM&AWqzDO1@NHw;C9cPdXRKRI#@nUW)CgFxzQ1nyd!+h& zcjU!U=&u|>@}R(9D$%lu2TlV>@I2-n@fCr5PrZNVyKWR7hm zWjoy^p7v8m#$qN0K#8jT- zq`mSirDZDa1Jxm;Rg3rAPhC)LcI4@-RvKT+@9&KsR3b0_0zuM!Fg7u>oF>3bzOxZPU&$ab$Z9@ zY)f7pKh22I7ZykL{YsdjcqeN++=0a}elQM-4;Q)(`Ep3|VFHqnXOh14`!Bus& z9w%*EWK6AiAM{s$6~SEQS;A>ey$#`7)khZvamem{P?>k)5&7Sl&&NXKk}o!%vd;-! zpo2p-_h^b$DNBO>{h4JdGB=D>fvGIYN8v&XsfxU~VaefL?q} z3ekM?iOKkCzQHkBkhg=hD!@&(L}FcHKoa zbZ7)H1C|lHjwEb@tu=n^OvdHOo7o+W`0-y3KdP#bb~wM=Vr_gyoEq|#B?$&d$tals ziIs-&7isBpvS|CjC|7C&3I0SE?~`a%g~$PI%;au^cUp@ER3?mn-|vyu!$7MV6(uvt z+CcGuM(Ku2&G0tcRCo7#D$Dirfqef2qPOE5I)oCGzmR5G!o#Q~(k~)c=LpIfrhHQk zeAva6MilEifE7rgP1M7AyWmLOXK}i8?=z2;N=no)`IGm#y%aGE>-FN zyXCp0Sln{IsfOBuCdE*#@CQof%jzuU*jkR*Su3?5t}F(#g0BD0Zzu|1MDes8U7f9; z$JBg|mqTXt`muZ8=Z`3wx$uizZG_7>GI7tcfOHW`C2bKxNOR)XAwRkLOaHS4xwlH4 zDpU29#6wLXI;H?0Se`SRa&I_QmI{zo7p%uveBZ0KZKd9H6@U?YGArbfm)D*^5=&Rp z`k{35?Z5GbZnv>z@NmJ%+sx=1WanWg)8r}C_>EGR8mk(NR$pW<-l8OTU^_u3M@gwS z7}GGa1)`z5G|DZirw;FB@VhH7Dq*0qc=|9lLe{w2#`g+_nt>_%o<~9(VZe=zI*SSz4w43-_o>4E4`M@NPKTWZuQJs)?KXbWp1M zimd5F;?AP(LWcaI-^Sl{`~>tmxsQB9Y$Xi*{Zr#py_+I$vx7@NY`S?HFfS!hUiz$a z{>!&e1(16T!Om)m)&k1W#*d#GslD^4!TwiF2WjFBvi=Ms!ADT)ArEW6zfVuIXcXVk z>AHjPADW+mJzY`_Ieq(s?jbk4iD2Rb8*V3t6?I+E06(K8H!!xnDzO%GB;Z$N-{M|B zeT`jo%9)s%op*XZKDd6*)-^lWO{#RaIGFdBH+;XXjI(8RxpBc~azG1H^2v7c^bkFE zZCVPE+E*Q=FSe8Vm&6|^3ki{9~qafiMAf7i4APZg>b%&5>nT@pHH z%O*pOv(77?ZiT{W zBibx}Q12tRc7Py1NcZTp`Q4ey%T_nj@1WKg5Fz_Rjl4wlJQj)rtp8yL3r!Shy zvZvnmh!tH4T6Js-?vI0<-rzzl{mgT*S0d_7^AU_8gBg^03o-J=p(1o6kww2hx|!%T z-jqp}m^G*W?$!R#M%Ef?&2jYxmx+lXWZszpI4d$pUN`(S)|*c^CgdwY>Fa>> zgGBJhwe8y#Xd*q0=@SLEgPF>+Qe4?%E*v{a`||luZ~&dqMBrRfJ{SDMaJ!s_;cSJp zSqZHXIdc@@XteNySUZs^9SG7xK`8=NBNM)fRVOjw)D^)w%L2OPkTQ$Tel-J)GD3=YXy+F4in(ILy*A3m@3o73uv?JC}Q>f zrY&8SWmesiba0|3X-jmlMT3 z*ST|_U@O=i*sM_*48G)dgXqlwoFp5G6qSM3&%_f_*n!PiT>?cNI)fAUkA{qWnqdMi+aNK_yVQ&lx4UZknAc9FIzVk% zo6JmFH~c{_tK!gt4+o2>)zoP{sR}!!vfRjI=13!z5}ijMFQ4a4?QIg-BE4T6!#%?d&L;`j5=a`4is>U;%@Rd~ zXC~H7eGQhhYWhMPWf9znDbYIgwud(6$W3e>$W4$~d%qoJ z+JE`1g$qJ%>b|z*xCKenmpV$0pM=Gl-Y*LT8K+P)2X#;XYEFF4mRbc~jj?DM@(1e`nL=F4Syv)TKIePQUz)bZ?Bi3@G@HO$Aps1DvDGkYF50O$_welu^cL7;vPiMGho74$;4fDqKbE{U zd1h{;LfM#Fb|Z&uH~Rm_J)R~Vy4b;1?tW_A)Iz#S_=F|~pISaVkCnQ0&u%Yz%o#|! zS-TSg87LUfFSs{tTuM3$!06ZzH&MFtG)X-l7>3)V?Txuj2HyG*5u;EY2_5vU0ujA? zHXh5G%6e3y7v?AjhyX79pnRBVr}RmPmtrxoB7lkxEzChX^(vKd+sLh?SBic=Q)5nA zdz7Mw3_iA>;T^_Kl~?1|5t%GZ;ki_+i>Q~Q1EVdKZ)$Sh3LM@ea&D~{2HOG++7*wF zAC6jW4>fa~!Vp5+$Z{<)Qxb|{unMgCv2)@%3j=7)Zc%U<^i|SAF88s!A^+Xs!OASYT%7;Jx?olg_6NFP1475N z#0s<@E~FI}#LNQ{?B1;t+N$2k*`K$Hxb%#8tRQi*Z#No0J}Pl;HWb){l7{A8(pu#@ zfE-OTvEreoz1+p`9sUI%Y{e5L-oTP_^NkgpYhZjp&ykinnW;(fu1;ttpSsgYM8ABX4dHe_HxU+%M(D=~) zYM}XUJ5guZ;=_ZcOsC`_{CiU$zN3$+x&5C`vX-V3`8&RjlBs^rf00MNYZW+jCd~7N z%{jJuUUwY(M`8$`B>K&_48!Li682ZaRknMgQ3~dnlp8C?__!P2z@=Auv;T^$yrsNy zCARmaA@^Yo2sS%2$`031-+h9KMZsIHfB>s@}>Y(z988e!`%4=EDoAQ0kbk>+lCoK60Mx9P!~I zlq~wf7kcm_NFImt3ZYlE(b3O1K^QWiFb$V^a2Jlwvm(!XYx<`i@ZMS3UwFt{;x+-v zhx{m=m;4dgvkKp5{*lfSN3o^keSpp9{hlXj%=}e_7Ou{Yiw(J@NXuh*;pL6@$HsfB zh?v+r^cp@jQ4EspC#RqpwPY(}_SS$wZ{S959`C25777&sgtNh%XTCo9VHJC-G z;;wi9{-iv+ETiY;K9qvlEc04f;ZnUP>cUL_T*ms``EtGoP^B#Q>n2dSrbAg8a>*Lg zd0EJ^=tdW~7fbcLFsqryFEcy*-8!?;n%;F+8i{eZyCDaiYxghr z$8k>L|2&-!lhvuVdk!r-kpSFl`5F5d4DJr%M4-qOy3gdmQbqF1=aBtRM7)c_Ae?$b8 zQg4c8*KQ{XJmL)1c7#0Yn0#PTMEs4-IHPjkn0!=;JdhMXqzMLeh`yOylXROP- zl#z3+fwM9l3%VN(6R77ua*uI9%hO7l7{+Hcbr(peh;afUK?B4EC09J{-u{mv)+u#? zdKVBCPt`eU@IzL)OXA`Ebu`Xp?u0m%h&X41}FNfnJ*g1!1wcbbpo%F4x!-#R9ft!8{5`Ho}04?FI#Kg zL|k`tF1t_`ywdy8(wnTut>HND(qNnq%Sq=AvvZbXnLx|mJhi!*&lwG2g|edBdVgLy zjvVTKHAx(+&P;P#2Xobo7_RttUi)Nllc}}hX>|N?-u5g7VJ-NNdwYcaOG?NK=5)}` zMtOL;o|i0mSKm(UI_7BL_^6HnVOTkuPI6y@ZLR(H?c1cr-_ouSLp{5!bx^DiKd*Yb z{K78Ci&Twup zTKm)ioN|wcYy%Qnwb)IzbH>W!;Ah5Zdm_jRY`+VRJ2 zhkspZ9hbK3iQD91A$d!0*-1i#%x81|s+SPRmD}d~<1p6!A13(!vABP2kNgqEG z?AMgl^P+iRoIY(9@_I?n1829lGvAsRnHwS~|5vD2+Zi53j<5N4wNn0{q>>jF9*bI) zL$kMXM-awNOElF>{?Jr^tOz1glbwaD-M0OKOlTeW3C!1ZyxRbB>8JDof(O&R1bh%3x#>y2~<>OXO#IIedH0Q`(&&?eo-c~ z>*Ah#3~09unym~UC-UFqqI>{dmUD$Y4@evG#ORLI*{ZM)Jl=e1it!XzY($S3V zLG!Y6fCjE>x6r@5FG1n|8ompSZaJ>9)q6jqU;XxCQk9zV(?C9+i*>w z21+KYt1gXX&0`x3E)hS7I5}snbBzox9C@Xzcr|{B8Hw;SY1$}&BoYKXH^hpjW-RgJ z-Fb}tannKCv>y~^`r|(1Q9;+sZlYf3XPSX|^gR01UFtu$B*R;$sPZdIZShRr>|b@J z;#G{EdoY+O;REEjQ}X7_YzWLO+Ey3>a_KDe1CjSe| z6arqcEZ)CX!8r(si`dqbF$uu&pnf^Np{1f*TdJ`r2;@SaZ z#hb4xlaCA@Pwqj#LlUEe5L{I$k(Zj$d3(~)u(F%&xb8={N9hKxlZIO1ABsM{Mt|)2 zJ^t9Id;?%4PfR4&Ph9B9cFK~@tG3wlFW-0fXZS_L4U*EiAA%+`h%q2^6BCC;t0iO4V=s4Qug{M|iDV@s zC7|ef-dxiR7T&Mpre!%hiUhHM%3Qxi$Lzw6&(Tvlx9QA_7LhYq<(o~=Y>3ka-zrQa zhGpfFK@)#)rtfz61w35^sN1=IFw&Oc!Nah+8@qhJ0UEGr;JplaxOGI82OVqZHsqfX ze1}r{jy;G?&}Da}a7>SCDsFDuzuseeCKof|Dz2BPsP8? zY;a)Tkr2P~0^2BeO?wnzF_Ul-ekY=-w26VnU%U3f19Z-pj&2 z4J_a|o4Dci+MO)mPQIM>kdPG1xydiR9@#8m zh27D7GF{p|a{8({Q-Pr-;#jV{2zHR>lGoFtIfIpoMo?exuQyX_A;;l0AP4!)JEM$EwMInZkj+8*IHP4vKRd zKx_l-i*>A*C@{u%ct`y~s6MWAfO{@FPIX&sg8H{GMDc{4M3%$@c8&RAlw0-R<4DO3 trJqdc$mBpWeznn?E0M$F`|3v=`3%T2A17h;rxP7$%JLd=6(2u;`(N3pt&so# literal 0 HcmV?d00001 diff --git a/vendors/bootstrap/js/bootstrap.min.js b/vendors/bootstrap/js/bootstrap.min.js new file mode 100644 index 000000000..89ef52bb2 --- /dev/null +++ b/vendors/bootstrap/js/bootstrap.min.js @@ -0,0 +1,6 @@ +/*! +* Bootstrap.js by @fat & @mdo +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(e){e(function(){"use strict";e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()},e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e(function(){e("body").on("click.alert.data-api",t,n.prototype.close)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.parent('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")},e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e(function(){e("body").on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=n,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},to:function(t){var n=this.$element.find(".item.active"),r=n.parent().children(),i=r.index(n),s=this;if(t>r.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){s.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",e(r[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f=e.Event("slide",{relatedTarget:i[0]});this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u]();if(i.hasClass("active"))return;if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}},e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e(function(){e("body").on("click.carousel.data-api","[data-slide]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=!i.data("modal")&&e.extend({},i.data(),n.data());i.carousel(s),t.preventDefault()})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning)return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning)return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=typeof n=="object"&&n;i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e(function(){e("body").on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})})}(window.jQuery),!function(e){"use strict";function r(){i(e(t)).removeClass("open")}function i(t){var n=t.attr("data-target"),r;return n||(n=t.attr("href"),n=n&&n.replace(/.*(?=#[^\s]*$)/,"")),r=e(n),r.length||(r=t.parent()),r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||(s.toggleClass("open"),n.focus()),!1},keydown:function(t){var n,r,s,o,u,a;if(!/(38|40|27)/.test(t.keyCode))return;n=e(this),t.preventDefault(),t.stopPropagation();if(n.is(".disabled, :disabled"))return;o=i(n),u=o.hasClass("open");if(!u||u&&t.keyCode==27)return n.click();r=e("[role=menu] li:not(.divider) a",o);if(!r.length)return;a=r.index(r.filter(":focus")),t.keyCode==38&&a>0&&a--,t.keyCode==40&&a').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,e.proxy(this.removeBackdrop,this)):this.removeBackdrop()):t&&t()}},e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e(function(){e("body").on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):this.options.trigger!="manual"&&(i=this.options.trigger=="hover"?"mouseenter":"focus",s=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this))),this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,t,this.$element.data()),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);if(!n.options.delay||!n.options.delay.show)return n.show();clearTimeout(this.timeout),n.hoverState="in",this.timeout=setTimeout(function(){n.hoverState=="in"&&n.show()},n.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var e,t,n,r,i,s,o;if(this.hasContent()&&this.enabled){e=this.tip(),this.setContent(),this.options.animation&&e.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,t=/in/.test(s),e.remove().css({top:0,left:0,display:"block"}).appendTo(t?this.$element:document.body),n=this.getPosition(t),r=e[0].offsetWidth,i=e[0].offsetHeight;switch(t?s.split(" ")[1]:s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}e.css(o).addClass(s).addClass("in")}},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function r(){var t=setTimeout(function(){n.off(e.support.transition.end).remove()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.remove()})}var t=this,n=this.tip();return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?r():n.remove(),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(t){return e.extend({},t?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'
    ',trigger:"hover",title:"",delay:0,html:!0}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content > *")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-content")||(typeof n.content=="function"?n.content.call(t[0]):n.content),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'

    '})}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var t=e(this),n=t.data("target")||t.attr("href"),r=/^#\w/.test(n)&&e(n);return r&&r.length&&[[r.position().top,n]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}},e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active a").last()[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}},e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e(function(){e("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=e(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:t.top+t.height,left:t.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length"+t+""})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),(e.browser.webkit||e.browser.msie)&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this))},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=!~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(e){var t=this;setTimeout(function(){t.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(t){this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")}},e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'',item:'
  • ',minLength:1},e.fn.typeahead.Constructor=t,e(function(){e("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;t.preventDefault(),n.typeahead(n.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))},e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery); \ No newline at end of file diff --git a/vendors/bootstrap/js/bootstrap.min.orig.js b/vendors/bootstrap/js/bootstrap.min.orig.js new file mode 100644 index 000000000..66e887bb3 --- /dev/null +++ b/vendors/bootstrap/js/bootstrap.min.orig.js @@ -0,0 +1,6 @@ +/*! +* Bootstrap.js by @fat & @mdo +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(e){e(function(){"use strict";e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()},e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e(function(){e("body").on("click.alert.data-api",t,n.prototype.close)})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.parent('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")},e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e(function(){e("body").on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=n,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},to:function(t){var n=this.$element.find(".item.active"),r=n.parent().children(),i=r.index(n),s=this;if(t>r.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){s.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",e(r[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f=e.Event("slide",{relatedTarget:i[0]});this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u]();if(i.hasClass("active"))return;if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}},e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e(function(){e("body").on("click.carousel.data-api","[data-slide]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=!i.data("modal")&&e.extend({},i.data(),n.data());i.carousel(s),t.preventDefault()})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning)return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning)return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=typeof n=="object"&&n;i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e(function(){e("body").on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})})}(window.jQuery),!function(e){"use strict";function r(){i(e(t)).removeClass("open")}function i(t){var n=t.attr("data-target"),r;return n||(n=t.attr("href"),n=n&&n.replace(/.*(?=#[^\s]*$)/,"")),r=e(n),r.length||(r=t.parent()),r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||(s.toggleClass("open"),n.focus()),!1},keydown:function(t){var n,r,s,o,u,a;if(!/(38|40|27)/.test(t.keyCode))return;n=e(this),t.preventDefault(),t.stopPropagation();if(n.is(".disabled, :disabled"))return;o=i(n),u=o.hasClass("open");if(!u||u&&t.keyCode==27)return n.click();r=e("[role=menu] li:not(.divider) a",o);if(!r.length)return;a=r.index(r.filter(":focus")),t.keyCode==38&&a>0&&a--,t.keyCode==40&&a').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,e.proxy(this.removeBackdrop,this)):this.removeBackdrop()):t&&t()}},e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e(function(){e("body").on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):this.options.trigger!="manual"&&(i=this.options.trigger=="hover"?"mouseenter":"focus",s=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this))),this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,t,this.$element.data()),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);if(!n.options.delay||!n.options.delay.show)return n.show();clearTimeout(this.timeout),n.hoverState="in",this.timeout=setTimeout(function(){n.hoverState=="in"&&n.show()},n.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var e,t,n,r,i,s,o;if(this.hasContent()&&this.enabled){e=this.tip(),this.setContent(),this.options.animation&&e.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,t=/in/.test(s),e.remove().css({top:0,left:0,display:"block"}).appendTo(t?this.$element:document.body),n=this.getPosition(t),r=e[0].offsetWidth,i=e[0].offsetHeight;switch(t?s.split(" ")[1]:s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}e.css(o).addClass(s).addClass("in")}},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function r(){var t=setTimeout(function(){n.off(e.support.transition.end).remove()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.remove()})}var t=this,n=this.tip();return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?r():n.remove(),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(t){return e.extend({},t?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'
    ',trigger:"hover",title:"",delay:0,html:!0}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content > *")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-content")||(typeof n.content=="function"?n.content.call(t[0]):n.content),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'

    '})}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var t=e(this),n=t.data("target")||t.attr("href"),r=/^#\w/.test(n)&&e(n);return r&&r.length&&[[r.position().top,n]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}},e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active a").last()[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}},e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e(function(){e("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=e(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:t.top+t.height,left:t.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length"+t+""})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),(e.browser.webkit||e.browser.msie)&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this))},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=!~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(e){var t=this;setTimeout(function(){t.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(t){this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")}},e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'',item:'
  • ',minLength:1},e.fn.typeahead.Constructor=t,e(function(){e("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;t.preventDefault(),n.typeahead(n.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))},e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery); \ No newline at end of file diff --git a/vendors/bootstrap/less/accordion.less b/vendors/bootstrap/less/accordion.less new file mode 100644 index 000000000..c13c7be26 --- /dev/null +++ b/vendors/bootstrap/less/accordion.less @@ -0,0 +1,34 @@ +// +// Accordion +// -------------------------------------------------- + + +// Parent container +.accordion { + margin-bottom: @baseLineHeight; +} + +// Group == heading + body +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + .border-radius(4px); +} +.accordion-heading { + border-bottom: 0; +} +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +// General toggle styles +.accordion-toggle { + cursor: pointer; +} + +// Inner needs the styles because you can't animate properly with any styles on the element +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} diff --git a/vendors/bootstrap/less/alerts.less b/vendors/bootstrap/less/alerts.less new file mode 100644 index 000000000..6df5fd72d --- /dev/null +++ b/vendors/bootstrap/less/alerts.less @@ -0,0 +1,65 @@ +// +// Alerts +// -------------------------------------------------- + + +// Base styles +// ------------------------- + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: @baseLineHeight; + text-shadow: 0 1px 0 rgba(255,255,255,.5); + background-color: @warningBackground; + border: 1px solid @warningBorder; + .border-radius(4px); + color: @warningText; +} +.alert h4 { + margin: 0; +} + +// Adjust close link position +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: @baseLineHeight; +} + + +// Alternate styles +// ------------------------- + +.alert-success { + background-color: @successBackground; + border-color: @successBorder; + color: @successText; +} +.alert-danger, +.alert-error { + background-color: @errorBackground; + border-color: @errorBorder; + color: @errorText; +} +.alert-info { + background-color: @infoBackground; + border-color: @infoBorder; + color: @infoText; +} + + +// Block alerts +// ------------------------- + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} +.alert-block p + p { + margin-top: 5px; +} diff --git a/vendors/bootstrap/less/bootstrap.less b/vendors/bootstrap/less/bootstrap.less new file mode 100644 index 000000000..f0df4f1d5 --- /dev/null +++ b/vendors/bootstrap/less/bootstrap.less @@ -0,0 +1,62 @@ +/*! + * Bootstrap v2.1.0 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +// CSS Reset +@import "reset.less"; + +// Core variables and mixins +@import "variables.less"; // Modify this for custom colors, font-sizes, etc +@import "mixins.less"; + +// Grid system and page structure +@import "scaffolding.less"; +@import "grid.less"; +@import "layouts.less"; + +// Base CSS +@import "type.less"; +@import "code.less"; +@import "forms.less"; +@import "tables.less"; + +// Components: common +@import "sprites.less"; +@import "dropdowns.less"; +@import "wells.less"; +@import "component-animations.less"; +@import "close.less"; + +// Components: Buttons & Alerts +@import "buttons.less"; +@import "button-groups.less"; +@import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less + +// Components: Nav +@import "navs.less"; +@import "navbar.less"; +@import "breadcrumbs.less"; +@import "pagination.less"; +@import "pager.less"; + +// Components: Popovers +@import "modals.less"; +@import "tooltip.less"; +@import "popovers.less"; + +// Components: Misc +@import "thumbnails.less"; +@import "labels-badges.less"; +@import "progress-bars.less"; +@import "accordion.less"; +@import "carousel.less"; +@import "hero-unit.less"; + +// Utility classes +@import "utilities.less"; // Has to be last to override when necessary diff --git a/vendors/bootstrap/less/breadcrumbs.less b/vendors/bootstrap/less/breadcrumbs.less new file mode 100644 index 000000000..fd269b31a --- /dev/null +++ b/vendors/bootstrap/less/breadcrumbs.less @@ -0,0 +1,24 @@ +// +// Breadcrumbs +// -------------------------------------------------- + + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 @baseLineHeight; + list-style: none; + background-color: #f5f5f5; + .border-radius(4px); + li { + display: inline-block; + .ie7-inline-block(); + text-shadow: 0 1px 0 @white; + } + .divider { + padding: 0 5px; + color: #ccc; + } + .active { + color: @grayLight; + } +} diff --git a/vendors/bootstrap/less/button-groups.less b/vendors/bootstrap/less/button-groups.less new file mode 100644 index 000000000..77496d6ab --- /dev/null +++ b/vendors/bootstrap/less/button-groups.less @@ -0,0 +1,244 @@ +// +// Button groups +// -------------------------------------------------- + + +// Make the div behave like a button +.btn-group { + position: relative; + font-size: 0; // remove as part 1 of font-size inline-block hack + white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page) + .ie7-restore-left-whitespace(); +} + +// Space out series of button groups +.btn-group + .btn-group { + margin-left: 5px; +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + font-size: 0; // Hack to remove whitespace that results from using inline-block + margin-top: @baseLineHeight / 2; + margin-bottom: @baseLineHeight / 2; + .btn-group { + display: inline-block; + .ie7-inline-block(); + } + .btn + .btn, + .btn-group + .btn, + .btn + .btn-group { + margin-left: 5px; + } +} + +// Float them, remove border radius, then re-add to first and last elements +.btn-group > .btn { + position: relative; + .border-radius(0); +} +.btn-group > .btn + .btn { + margin-left: -1px; +} +.btn-group > .btn, +.btn-group > .dropdown-menu { + font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack +} + +// Reset fonts for other sizes +.btn-group > .btn-mini { + font-size: 11px; +} +.btn-group > .btn-small { + font-size: 12px; +} +.btn-group > .btn-large { + font-size: 16px; +} + +// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +// Reset corners for large buttons +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} + +// On hover/focus/active, bring the proper btn to front +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +// On active and open, don't show outline +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + + + +// Split button dropdowns +// ---------------------- + +// Give the line between buttons some depth +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + .box-shadow(~"inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)"); + *padding-top: 5px; + *padding-bottom: 5px; +} +.btn-group > .btn-mini + .dropdown-toggle { + padding-left: 5px; + padding-right: 5px; + *padding-top: 2px; + *padding-bottom: 2px; +} +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} +.btn-group > .btn-large + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; + *padding-top: 7px; + *padding-bottom: 7px; +} + +.btn-group.open { + + // The clickable button for toggling the menu + // Remove the gradient and set the same inset shadow as the :active state + .dropdown-toggle { + background-image: none; + .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)"); + } + + // Keep the hover's background when dropdown is open + .btn.dropdown-toggle { + background-color: @btnBackgroundHighlight; + } + .btn-primary.dropdown-toggle { + background-color: @btnPrimaryBackgroundHighlight; + } + .btn-warning.dropdown-toggle { + background-color: @btnWarningBackgroundHighlight; + } + .btn-danger.dropdown-toggle { + background-color: @btnDangerBackgroundHighlight; + } + .btn-success.dropdown-toggle { + background-color: @btnSuccessBackgroundHighlight; + } + .btn-info.dropdown-toggle { + background-color: @btnInfoBackgroundHighlight; + } + .btn-inverse.dropdown-toggle { + background-color: @btnInverseBackgroundHighlight; + } +} + + +// Reposition the caret +.btn .caret { + margin-top: 8px; + margin-left: 0; +} +// Carets in other button sizes +.btn-mini .caret, +.btn-small .caret, +.btn-large .caret { + margin-top: 6px; +} +.btn-large .caret { + border-left-width: 5px; + border-right-width: 5px; + border-top-width: 5px; +} +// Upside down carets for .dropup +.dropup .btn-large .caret { + border-bottom: 5px solid @black; + border-top: 0; +} + + + +// Account for other colors +.btn-primary, +.btn-warning, +.btn-danger, +.btn-info, +.btn-success, +.btn-inverse { + .caret { + border-top-color: @white; + border-bottom-color: @white; + } +} + + + +// Vertical button groups +// ---------------------- + +.btn-group-vertical { + display: inline-block; // makes buttons only take up the width they need + .ie7-inline-block(); +} +.btn-group-vertical .btn { + display: block; + float: none; + width: 100%; + .border-radius(0); +} +.btn-group-vertical .btn + .btn { + margin-left: 0; + margin-top: -1px; +} +.btn-group-vertical .btn:first-child { + .border-radius(4px 4px 0 0); +} +.btn-group-vertical .btn:last-child { + .border-radius(0 0 4px 4px); +} +.btn-group-vertical .btn-large:first-child { + .border-radius(6px 6px 0 0); +} +.btn-group-vertical .btn-large:last-child { + .border-radius(0 0 6px 6px); +} diff --git a/vendors/bootstrap/less/buttons.less b/vendors/bootstrap/less/buttons.less new file mode 100644 index 000000000..077616e99 --- /dev/null +++ b/vendors/bootstrap/less/buttons.less @@ -0,0 +1,211 @@ +// +// Buttons +// -------------------------------------------------- + + +// Base styles +// -------------------------------------------------- + +// Core +.btn { + display: inline-block; + .ie7-inline-block(); + padding: 4px 14px; + margin-bottom: 0; // For input.btn + font-size: @baseFontSize; + line-height: @baseLineHeight; + *line-height: @baseLineHeight; + text-align: center; + vertical-align: middle; + cursor: pointer; + .buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75)); + border: 1px solid @btnBorder; + *border: 0; // Remove the border to prevent IE7's black border on input:focus + border-bottom-color: darken(@btnBorder, 10%); + .border-radius(4px); + .ie7-restore-left-whitespace(); // Give IE7 some love + .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)"); + + // Hover state + &:hover { + color: @grayDark; + text-decoration: none; + background-color: darken(@white, 10%); + *background-color: darken(@white, 15%); /* Buttons in IE7 don't get borders, so darken on hover */ + background-position: 0 -15px; + + // transition is only when going to hover, otherwise the background + // behind the gradient (there for IE<=9 fallback) gets mismatched + .transition(background-position .1s linear); + } + + // Focus state for keyboard and accessibility + &:focus { + .tab-focus(); + } + + // Active state + &.active, + &:active { + background-color: darken(@white, 10%); + background-color: darken(@white, 15%) e("\9"); + background-image: none; + outline: 0; + .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)"); + } + + // Disabled state + &.disabled, + &[disabled] { + cursor: default; + background-color: darken(@white, 10%); + background-image: none; + .opacity(65); + .box-shadow(none); + } + +} + + + +// Button Sizes +// -------------------------------------------------- + +// Large +.btn-large { + padding: 9px 14px; + font-size: @baseFontSize + 2px; + line-height: normal; + .border-radius(5px); +} +.btn-large [class^="icon-"] { + margin-top: 2px; +} + +// Small +.btn-small { + padding: 3px 9px; + font-size: @baseFontSize - 2px; + line-height: @baseLineHeight - 2px; +} +.btn-small [class^="icon-"] { + margin-top: 0; +} + +// Mini +.btn-mini { + padding: 2px 6px; + font-size: @baseFontSize - 3px; + line-height: @baseLineHeight - 4px; +} + +// Block button +.btn-block { + display: block; + width: 100%; + padding-left: 0; + padding-right: 0; + .box-sizing(border-box); +} +.btn-block + .btn-block { + margin-top: 5px; +} + + +// Alternate buttons +// -------------------------------------------------- + +// Provide *some* extra contrast for those who can get it +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255,255,255,.75); +} + +// Set the backgrounds +// ------------------------- +.btn { + // reset here as of 2.0.3 due to Recess property order + border-color: #c5c5c5; + border-color: rgba(0,0,0,.15) rgba(0,0,0,.15) rgba(0,0,0,.25); +} +.btn-primary { + .buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight); +} +// Warning appears are orange +.btn-warning { + .buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight); +} +// Danger and error appear as red +.btn-danger { + .buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight); +} +// Success appears as green +.btn-success { + .buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight); +} +// Info appears as a neutral blue +.btn-info { + .buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight); +} +// Inverse appears as dark gray +.btn-inverse { + .buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight); +} + + +// Cross-browser Jank +// -------------------------------------------------- + +button.btn, +input[type="submit"].btn { + + // Firefox 3.6 only I believe + &::-moz-focus-inner { + padding: 0; + border: 0; + } + + // IE7 has some default padding on button controls + *padding-top: 3px; + *padding-bottom: 3px; + + &.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; + } + &.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; + } + &.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; + } +} + + +// Link buttons +// -------------------------------------------------- + +// Make a button look and behave like a link +.btn-link, +.btn-link:active { + background-color: transparent; + background-image: none; + .box-shadow(none); +} +.btn-link { + border-color: transparent; + cursor: pointer; + color: @linkColor; + .border-radius(0); +} +.btn-link:hover { + color: @linkColorHover; + text-decoration: underline; + background-color: transparent; +} diff --git a/vendors/bootstrap/less/carousel.less b/vendors/bootstrap/less/carousel.less new file mode 100644 index 000000000..33f98ac4d --- /dev/null +++ b/vendors/bootstrap/less/carousel.less @@ -0,0 +1,131 @@ +// +// Carousel +// -------------------------------------------------- + + +.carousel { + position: relative; + margin-bottom: @baseLineHeight; + line-height: 1; +} + +.carousel-inner { + overflow: hidden; + width: 100%; + position: relative; +} + +.carousel { + + .item { + display: none; + position: relative; + .transition(.6s ease-in-out left); + } + + // Account for jankitude on images + .item > img { + display: block; + line-height: 1; + } + + .active, + .next, + .prev { display: block; } + + .active { + left: 0; + } + + .next, + .prev { + position: absolute; + top: 0; + width: 100%; + } + + .next { + left: 100%; + } + .prev { + left: -100%; + } + .next.left, + .prev.right { + left: 0; + } + + .active.left { + left: -100%; + } + .active.right { + left: 100%; + } + +} + +// Left/right controls for nav +// --------------------------- + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: @white; + text-align: center; + background: @grayDarker; + border: 3px solid @white; + .border-radius(23px); + .opacity(50); + + // we can't have this transition here + // because webkit cancels the carousel + // animation if you trip this while + // in the middle of another animation + // ;_; + // .transition(opacity .2s linear); + + // Reposition the right one + &.right { + left: auto; + right: 15px; + } + + // Hover state + &:hover { + color: @white; + text-decoration: none; + .opacity(90); + } +} + + +// Caption for text below images +// ----------------------------- + +.carousel-caption { + position: absolute; + left: 0; + right: 0; + bottom: 0; + padding: 15px; + background: @grayDark; + background: rgba(0,0,0,.75); +} +.carousel-caption h4, +.carousel-caption p { + color: @white; + line-height: @baseLineHeight; +} +.carousel-caption h4 { + margin: 0 0 5px; +} +.carousel-caption p { + margin-bottom: 0; +} diff --git a/vendors/bootstrap/less/close.less b/vendors/bootstrap/less/close.less new file mode 100644 index 000000000..c71a508f3 --- /dev/null +++ b/vendors/bootstrap/less/close.less @@ -0,0 +1,31 @@ +// +// Close icons +// -------------------------------------------------- + + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: @baseLineHeight; + color: @black; + text-shadow: 0 1px 0 rgba(255,255,255,1); + .opacity(20); + &:hover { + color: @black; + text-decoration: none; + cursor: pointer; + .opacity(40); + } +} + +// Additional properties for button version +// iOS requires the button element instead of an anchor tag. +// If you want the anchor version, it requires `href="#"`. +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} \ No newline at end of file diff --git a/vendors/bootstrap/less/code.less b/vendors/bootstrap/less/code.less new file mode 100644 index 000000000..f1851a074 --- /dev/null +++ b/vendors/bootstrap/less/code.less @@ -0,0 +1,58 @@ +// +// Code (inline and blocK) +// -------------------------------------------------- + + +// Inline and block code styles +code, +pre { + padding: 0 3px 2px; + #font > #family > .monospace; + font-size: @baseFontSize - 2; + color: @grayDark; + .border-radius(3px); +} + +// Inline code +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +// Blocks of code +pre { + display: block; + padding: (@baseLineHeight - 1) / 2; + margin: 0 0 @baseLineHeight / 2; + font-size: @baseFontSize - 1; // 14px to 13px + line-height: @baseLineHeight; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; // fallback for IE7-8 + border: 1px solid rgba(0,0,0,.15); + .border-radius(4px); + + // Make prettyprint styles more spaced out for readability + &.prettyprint { + margin-bottom: @baseLineHeight; + } + + // Account for some code outputs that place code tags in pre tags + code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; + } +} + +// Enable scrollable blocks of code +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} \ No newline at end of file diff --git a/vendors/bootstrap/less/component-animations.less b/vendors/bootstrap/less/component-animations.less new file mode 100644 index 000000000..2166776d9 --- /dev/null +++ b/vendors/bootstrap/less/component-animations.less @@ -0,0 +1,23 @@ +// +// Component animations +// -------------------------------------------------- + + +.fade { + opacity: 0; + .transition(opacity .15s linear); + &.in { + opacity: 1; + } +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + overflow: visible \9; + .transition(height .35s ease); + &.in { + height: auto; + } +} diff --git a/vendors/bootstrap/less/dropdowns.less b/vendors/bootstrap/less/dropdowns.less new file mode 100644 index 000000000..e83915dba --- /dev/null +++ b/vendors/bootstrap/less/dropdowns.less @@ -0,0 +1,210 @@ +// +// Dropdown menus +// -------------------------------------------------- + + +// Use the .menu class on any
  • element within the topbar or ul.tabs and you'll get some superfancy dropdowns +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle { + // The caret makes the toggle a bit too tall in IE7 + *margin-bottom: -3px; +} +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +// Dropdown arrow/caret +// -------------------- +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid @black; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +// Place the caret +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +// The dropdown menu (ul) +// ---------------------- +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: @zindexDropdown; + display: none; // none by default, but block on "open" of the menu + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; // override default ul + list-style: none; + background-color: @dropdownBackground; + border: 1px solid #ccc; // Fallback for IE7-8 + border: 1px solid @dropdownBorder; + *border-right-width: 2px; + *border-bottom-width: 2px; + .border-radius(6px); + .box-shadow(0 5px 10px rgba(0,0,0,.2)); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + // Aligns the dropdown menu to right + &.pull-right { + right: 0; + left: auto; + } + + // Dividers (basically an hr) within the dropdown + .divider { + .nav-divider(@dropdownDividerTop, @dropdownDividerBottom); + } + + // Links within the dropdown menu + a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: @baseLineHeight; + color: @dropdownLinkColor; + white-space: nowrap; + } +} + +// Hover state +// ----------- +.dropdown-menu li > a:hover, +.dropdown-menu li > a:focus, +.dropdown-submenu:hover > a { + text-decoration: none; + color: @dropdownLinkColorHover; + background-color: @dropdownLinkBackgroundHover; + #gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%)); +} + +// Active state +// ------------ +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: @dropdownLinkColorHover; + text-decoration: none; + outline: 0; + background-color: @dropdownLinkBackgroundActive; + #gradient > .vertical(@dropdownLinkBackgroundActive, darken(@dropdownLinkBackgroundActive, 5%)); +} + +// Disabled state +// -------------- +// Gray out text and ensure the hover state remains gray +.dropdown-menu .disabled > a, +.dropdown-menu .disabled > a:hover { + color: @grayLight; +} +// Nuke hover effects +.dropdown-menu .disabled > a:hover { + text-decoration: none; + background-color: transparent; + cursor: default; +} + +// Open state for the dropdown +// --------------------------- +.open { + // IE7's z-index only goes to the nearest positioned ancestor, which would + // make the menu appear below buttons that appeared later on the page + *z-index: @zindexDropdown; + + & > .dropdown-menu { + display: block; + } +} + +// Right aligned dropdowns +// --------------------------- +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// ------------------------------------------------------ +// Just add .dropup after the standard .dropdown class and you're set, bro. +// TODO: abstract this so that the navbar fixed styles are not placed here? +.dropup, +.navbar-fixed-bottom .dropdown { + // Reverse the caret + .caret { + border-top: 0; + border-bottom: 4px solid @black; + content: "\2191"; + } + // Different positioning for bottom up menu + .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; + } +} + +// Sub menus +// --------------------------- +.dropdown-submenu { + position: relative; +} +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} +.dropdown-submenu:hover .dropdown-menu { + display: block; +} + +.dropdown-submenu > a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: darken(@dropdownBackground, 20%); + margin-top: 5px; + margin-right: -10px; +} +.dropdown-submenu:hover > a:after { + border-left-color: @dropdownLinkColorHover; +} + + +// Tweak nav headers +// ----------------- +// Increase padding from 15px to 20px on sides +.dropdown .dropdown-menu .nav-header { + padding-left: 20px; + padding-right: 20px; +} + +// Typeahead +// --------- +.typeahead { + margin-top: 2px; // give it some space to breathe + .border-radius(4px); +} diff --git a/vendors/bootstrap/less/forms.less b/vendors/bootstrap/less/forms.less new file mode 100644 index 000000000..77b5135a4 --- /dev/null +++ b/vendors/bootstrap/less/forms.less @@ -0,0 +1,635 @@ +// +// Forms +// -------------------------------------------------- + + +// GENERAL STYLES +// -------------- + +// Make all forms have space below them +form { + margin: 0 0 @baseLineHeight; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +// Groups of fields with labels on top (legends) +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: @baseLineHeight; + font-size: @baseFontSize * 1.5; + line-height: @baseLineHeight * 2; + color: @grayDark; + border: 0; + border-bottom: 1px solid #e5e5e5; + + // Small + small { + font-size: @baseLineHeight * .75; + color: @grayLight; + } +} + +// Set font for forms +label, +input, +button, +select, +textarea { + #font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here +} +input, +button, +select, +textarea { + font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element) +} + +// Identify controls by their labels +label { + display: block; + margin-bottom: 5px; +} + +// Form controls +// ------------------------- + +// Shared size and type resets +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: @baseLineHeight; + padding: 4px 6px; + margin-bottom: 9px; + font-size: @baseFontSize; + line-height: @baseLineHeight; + color: @gray; + .border-radius(@inputBorderRadius); +} + +// Reset appearance properties for textual inputs and textarea +// Declare width for legacy (can't be on input[type=*] selectors or it's too specific) +input, +textarea { + width: 210px; +} +// Reset height since textareas have rows +textarea { + height: auto; +} +// Everything else +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: @inputBackground; + border: 1px solid @inputBorder; + .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); + .transition(~"border linear .2s, box-shadow linear .2s"); + + // Focus state + &:focus { + border-color: rgba(82,168,236,.8); + outline: 0; + outline: thin dotted \9; /* IE6-9 */ + .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)"); + } +} + +// Position radios and checkboxes better +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + *margin-top: 0; /* IE7 */ + margin-top: 1px \9; /* IE8-9 */ + line-height: normal; + cursor: pointer; +} + +// Reset width of input images, buttons, radios, checkboxes +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; // Override of generic input selector +} + +// Set the height of select and file controls to match text inputs +select, +input[type="file"] { + height: 30px; /* In IE7, the height of the select element cannot be changed by height, only font-size */ + *margin-top: 4px; /* For IE7, add top margin to align select with labels */ + line-height: 30px; +} + +// Make select elements obey height by applying a border +select { + width: 220px; // default input width + 10px of padding that doesn't get applied + border: 1px solid #bbb; + background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color +} + +// Make multiple select elements height not fixed +select[multiple], +select[size] { + height: auto; +} + +// Focus for select, file, radio, and checkbox +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + .tab-focus(); +} + + +// Uneditable inputs +// ------------------------- + +// Make uneditable inputs look inactive +.uneditable-input, +.uneditable-textarea { + color: @grayLight; + background-color: darken(@inputBackground, 1%); + border-color: @inputBorder; + .box-shadow(inset 0 1px 2px rgba(0,0,0,.025)); + cursor: not-allowed; +} + +// For text that needs to appear as an input but should not be an input +.uneditable-input { + overflow: hidden; // prevent text from wrapping, but still cut it off like an input does + white-space: nowrap; +} + +// Make uneditable textareas behave like a textarea +.uneditable-textarea { + width: auto; + height: auto; +} + + +// Placeholder +// ------------------------- + +// Placeholder text gets special styles; can't be bundled together though for some reason +input, +textarea { + .placeholder(); +} + + +// CHECKBOXES & RADIOS +// ------------------- + +// Indent the labels to position radios/checkboxes as hanging +.radio, +.checkbox { + min-height: 18px; // clear the floating input if there is no label text + padding-left: 18px; +} +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} + +// Move the options list down to align with labels +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; // has to be padding because margin collaspes +} + +// Radios and checkboxes on same line +// TODO v3: Convert .inline to .control-inline +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; // space out consecutive inline controls +} + + + +// INPUT SIZES +// ----------- + +// General classes for quick sizes +.input-mini { width: 60px; } +.input-small { width: 90px; } +.input-medium { width: 150px; } +.input-large { width: 210px; } +.input-xlarge { width: 270px; } +.input-xxlarge { width: 530px; } + +// Grid style input sizes +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +// Redeclare since the fluid row class is more specific +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} +// Ensure input-prepend/append never wraps +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + + + +// GRID SIZING FOR INPUTS +// ---------------------- + +// Grid sizes +#grid > .input(@gridColumnWidth, @gridGutterWidth); + +// Control row for multiple inputs per line +.controls-row { + .clearfix(); // Clear the float from controls +} +.controls-row [class*="span"] { + float: left; // Float to collapse white-space for proper grid alignment +} + + + + +// DISABLED STATE +// -------------- + +// Disabled and read-only inputs +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: @inputDisabledBackground; +} +// Explicitly reset the colors here +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + + + + +// FORM FIELD FEEDBACK STATES +// -------------------------- + +// Warning +.control-group.warning { + .formFieldState(@warningText, @warningText, @warningBackground); +} +// Error +.control-group.error { + .formFieldState(@errorText, @errorText, @errorBackground); +} +// Success +.control-group.success { + .formFieldState(@successText, @successText, @successBackground); +} + +// HTML5 invalid states +// Shares styles with the .control-group.error above +input:focus:required:invalid, +textarea:focus:required:invalid, +select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; + &:focus { + border-color: darken(#ee5f5b, 10%); + .box-shadow(0 0 6px lighten(#ee5f5b, 20%)); + } +} + + + +// FORM ACTIONS +// ------------ + +.form-actions { + padding: (@baseLineHeight - 1) 20px @baseLineHeight; + margin-top: @baseLineHeight; + margin-bottom: @baseLineHeight; + background-color: @formActionsBackground; + border-top: 1px solid #e5e5e5; + .clearfix(); // Adding clearfix to allow for .pull-right button containers +} + + + +// HELP TEXT +// --------- + +.help-block, +.help-inline { + color: lighten(@textColor, 15%); // lighten the text some for contrast +} + +.help-block { + display: block; // account for any element using help-block + margin-bottom: @baseLineHeight / 2; +} + +.help-inline { + display: inline-block; + .ie7-inline-block(); + vertical-align: middle; + padding-left: 5px; +} + + + +// INPUT GROUPS +// ------------ + +// Allow us to put symbols and text within the input field for a cleaner look +.input-append, +.input-prepend { + margin-bottom: 5px; + font-size: 0; + white-space: nowrap; // Prevent span and input from separating + + input, + select, + .uneditable-input { + position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness + margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms + *margin-left: 0; + font-size: @baseFontSize; + vertical-align: top; + .border-radius(0 @inputBorderRadius @inputBorderRadius 0); + // Make input on top when focused so blue border and shadow always show + &:focus { + z-index: 2; + } + } + .add-on { + display: inline-block; + width: auto; + height: @baseLineHeight; + min-width: 16px; + padding: 4px 5px; + font-size: @baseFontSize; + font-weight: normal; + line-height: @baseLineHeight; + text-align: center; + text-shadow: 0 1px 0 @white; + background-color: @grayLighter; + border: 1px solid #ccc; + } + .add-on, + .btn { + margin-left: -1px; + vertical-align: top; + .border-radius(0); + } + .active { + background-color: lighten(@green, 30); + border-color: @green; + } +} +.input-prepend { + .add-on, + .btn { + margin-right: -1px; + } + .add-on:first-child, + .btn:first-child { + .border-radius(@inputBorderRadius 0 0 @inputBorderRadius); + } +} +.input-append { + input, + select, + .uneditable-input { + .border-radius(@inputBorderRadius 0 0 @inputBorderRadius); + } + .add-on:last-child, + .btn:last-child { + .border-radius(0 @inputBorderRadius @inputBorderRadius 0); + } +} +// Remove all border-radius for inputs with both prepend and append +.input-prepend.input-append { + input, + select, + .uneditable-input { + .border-radius(0); + } + .add-on:first-child, + .btn:first-child { + margin-right: -1px; + .border-radius(@inputBorderRadius 0 0 @inputBorderRadius); + } + .add-on:last-child, + .btn:last-child { + margin-left: -1px; + .border-radius(0 @inputBorderRadius @inputBorderRadius 0); + } +} + + + +// SEARCH FORM +// ----------- + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */ + margin-bottom: 0; // Remove the default margin on all inputs + .border-radius(15px); +} + +/* Allow for input prepend/append in search forms */ +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + .border-radius(0); // Override due to specificity +} +.form-search .input-append .search-query { + .border-radius(14px 0 0 14px) +} +.form-search .input-append .btn { + .border-radius(0 14px 14px 0) +} +.form-search .input-prepend .search-query { + .border-radius(0 14px 14px 0) +} +.form-search .input-prepend .btn { + .border-radius(14px 0 0 14px) +} + + + + +// HORIZONTAL & VERTICAL FORMS +// --------------------------- + +// Common properties +// ----------------- + +.form-search, +.form-inline, +.form-horizontal { + input, + textarea, + select, + .help-inline, + .uneditable-input, + .input-prepend, + .input-append { + display: inline-block; + .ie7-inline-block(); + margin-bottom: 0; + vertical-align: middle; + } + // Re-hide hidden elements due to specifity + .hide { + display: none; + } +} +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} +// Remove margin for input-prepend/-append +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} +// Inline checkbox/radio labels (remove padding on left) +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} +// Remove float and margin, set to inline-block +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + + +// Margin to space out fieldsets +.control-group { + margin-bottom: @baseLineHeight / 2; +} + +// Legend collapses margin, so next element is responsible for spacing +legend + .control-group { + margin-top: @baseLineHeight; + -webkit-margin-top-collapse: separate; +} + +// Horizontal-specific styles +// -------------------------- + +.form-horizontal { + // Increase spacing between groups + .control-group { + margin-bottom: @baseLineHeight; + .clearfix(); + } + // Float the labels left + .control-label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; + } + // Move over all input controls and content + .controls { + // Super jank IE7 fix to ensure the inputs in .input-append and input-prepend + // don't inherit the margin of the parent, in this case .controls + *display: inline-block; + *padding-left: 20px; + margin-left: 160px; + *margin-left: 0; + &:first-child { + *padding-left: 160px; + } + } + // Remove bottom margin on block level help text since that's accounted for on .control-group + .help-block { + margin-top: @baseLineHeight / 2; + margin-bottom: 0; + } + // Move over buttons in .form-actions to align with .controls + .form-actions { + padding-left: 160px; + } +} diff --git a/vendors/bootstrap/less/grid.less b/vendors/bootstrap/less/grid.less new file mode 100644 index 000000000..750d20351 --- /dev/null +++ b/vendors/bootstrap/less/grid.less @@ -0,0 +1,21 @@ +// +// Grid system +// -------------------------------------------------- + + +// Fixed (940px) +#grid > .core(@gridColumnWidth, @gridGutterWidth); + +// Fluid (940px) +#grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth); + +// Reset utility classes due to specificity +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} diff --git a/vendors/bootstrap/less/hero-unit.less b/vendors/bootstrap/less/hero-unit.less new file mode 100644 index 000000000..672b7d7c7 --- /dev/null +++ b/vendors/bootstrap/less/hero-unit.less @@ -0,0 +1,24 @@ +// +// Hero unit +// -------------------------------------------------- + + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: @heroUnitBackground; + .border-radius(6px); + h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + color: @heroUnitHeadingColor; + letter-spacing: -1px; + } + p { + font-size: 18px; + font-weight: 200; + line-height: @baseLineHeight * 1.5; + color: @heroUnitLeadColor; + } +} diff --git a/vendors/bootstrap/less/labels-badges.less b/vendors/bootstrap/less/labels-badges.less new file mode 100644 index 000000000..2f15fec05 --- /dev/null +++ b/vendors/bootstrap/less/labels-badges.less @@ -0,0 +1,72 @@ +// +// Labels and badges +// -------------------------------------------------- + + +// Base classes +.label, +.badge { + font-size: @baseFontSize * .846; + font-weight: bold; + line-height: 14px; // ensure proper line-height if floated + color: @white; + vertical-align: baseline; + white-space: nowrap; + text-shadow: 0 -1px 0 rgba(0,0,0,.25); + background-color: @grayLight; +} +// Set unique padding and border-radii +.label { + padding: 1px 4px 2px; + .border-radius(3px); +} +.badge { + padding: 1px 9px 2px; + .border-radius(9px); +} + +// Hover state, but only for links +a { + &.label:hover, + &.badge:hover { + color: @white; + text-decoration: none; + cursor: pointer; + } +} + +// Colors +// Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute) +.label, +.badge { + // Important (red) + &-important { background-color: @errorText; } + &-important[href] { background-color: darken(@errorText, 10%); } + // Warnings (orange) + &-warning { background-color: @orange; } + &-warning[href] { background-color: darken(@orange, 10%); } + // Success (green) + &-success { background-color: @successText; } + &-success[href] { background-color: darken(@successText, 10%); } + // Info (turquoise) + &-info { background-color: @infoText; } + &-info[href] { background-color: darken(@infoText, 10%); } + // Inverse (black) + &-inverse { background-color: @grayDark; } + &-inverse[href] { background-color: darken(@grayDark, 10%); } +} + +// Quick fix for labels/badges in buttons +.btn { + .label, + .badge { + position: relative; + top: -1px; + } +} +.btn-mini { + .label, + .badge { + top: 0; + } +} diff --git a/vendors/bootstrap/less/layouts.less b/vendors/bootstrap/less/layouts.less new file mode 100644 index 000000000..24a206211 --- /dev/null +++ b/vendors/bootstrap/less/layouts.less @@ -0,0 +1,16 @@ +// +// Layouts +// -------------------------------------------------- + + +// Container (centered, fixed-width layouts) +.container { + .container-fixed(); +} + +// Fluid layouts (left aligned, with sidebar, min- & max-width content) +.container-fluid { + padding-right: @gridGutterWidth; + padding-left: @gridGutterWidth; + .clearfix(); +} \ No newline at end of file diff --git a/vendors/bootstrap/less/mixins.less b/vendors/bootstrap/less/mixins.less new file mode 100644 index 000000000..db60f1aea --- /dev/null +++ b/vendors/bootstrap/less/mixins.less @@ -0,0 +1,671 @@ +// +// Mixins +// -------------------------------------------------- + + +// UTILITY MIXINS +// -------------------------------------------------- + +// Clearfix +// -------- +// For clearing floats like a boss h5bp.com/q +.clearfix { + *zoom: 1; + &:before, + &:after { + display: table; + content: ""; + // Fixes Opera/contenteditable bug: + // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952 + line-height: 0; + } + &:after { + clear: both; + } +} + +// Webkit-style focus +// ------------------ +.tab-focus() { + // Default + outline: thin dotted #333; + // Webkit + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +// Center-align a block level element +// ---------------------------------- +.center-block() { + display: block; + margin-left: auto; + margin-right: auto; +} + +// IE7 inline-block +// ---------------- +.ie7-inline-block() { + *display: inline; /* IE7 inline-block hack */ + *zoom: 1; +} + +// IE7 likes to collapse whitespace on either side of the inline-block elements. +// Ems because we're attempting to match the width of a space character. Left +// version is for form buttons, which typically come after other elements, and +// right version is for icons, which come before. Applying both is ok, but it will +// mean that space between those elements will be .6em (~2 space characters) in IE7, +// instead of the 1 space in other browsers. +.ie7-restore-left-whitespace() { + *margin-left: .3em; + + &:first-child { + *margin-left: 0; + } +} + +.ie7-restore-right-whitespace() { + *margin-right: .3em; +} + +// Sizing shortcuts +// ------------------------- +.size(@height, @width) { + width: @width; + height: @height; +} +.square(@size) { + .size(@size, @size); +} + +// Placeholder text +// ------------------------- +.placeholder(@color: @placeholderText) { + &:-moz-placeholder { + color: @color; + } + &:-ms-input-placeholder { + color: @color; + } + &::-webkit-input-placeholder { + color: @color; + } +} + +// Text overflow +// ------------------------- +// Requires inline-block or block for proper styling +.text-overflow() { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +// CSS image replacement +// ------------------------- +// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + + +// FONTS +// -------------------------------------------------- + +#font { + #family { + .serif() { + font-family: @serifFontFamily; + } + .sans-serif() { + font-family: @sansFontFamily; + } + .monospace() { + font-family: @monoFontFamily; + } + } + .shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { + font-size: @size; + font-weight: @weight; + line-height: @lineHeight; + } + .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { + #font > #family > .serif; + #font > .shorthand(@size, @weight, @lineHeight); + } + .sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { + #font > #family > .sans-serif; + #font > .shorthand(@size, @weight, @lineHeight); + } + .monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { + #font > #family > .monospace; + #font > .shorthand(@size, @weight, @lineHeight); + } +} + + +// FORMS +// -------------------------------------------------- + +// Block level inputs +.input-block-level { + display: block; + width: 100%; + min-height: 30px; // Make inputs at least the height of their button counterpart + .box-sizing(border-box); // Makes inputs behave like true block-level elements +} + + + +// Mixin for form field states +.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) { + // Set the text color + > label, + .help-block, + .help-inline { + color: @textColor; + } + // Style inputs accordingly + .checkbox, + .radio, + input, + select, + textarea { + color: @textColor; + border-color: @borderColor; + .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work + &:focus { + border-color: darken(@borderColor, 10%); + // Write out in full since the lighten() function isn't easily escaped + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%); + } + } + // Give a small background color for input-prepend/-append + .input-prepend .add-on, + .input-append .add-on { + color: @textColor; + background-color: @backgroundColor; + border-color: @textColor; + } +} + + + +// CSS3 PROPERTIES +// -------------------------------------------------- + +// Border Radius +.border-radius(@radius) { + -webkit-border-radius: @radius; + -moz-border-radius: @radius; + border-radius: @radius; +} + +// Single Corner Border Radius +.border-top-left-radius(@radius) { + -webkit-border-top-left-radius: @radius; + -moz-border-radius-topleft: @radius; + border-top-left-radius: @radius; +} +.border-top-right-radius(@radius) { + -webkit-border-top-right-radius: @radius; + -moz-border-radius-topright: @radius; + border-top-right-radius: @radius; +} +.border-bottom-right-radius(@radius) { + -webkit-border-bottom-right-radius: @radius; + -moz-border-radius-bottomright: @radius; + border-bottom-right-radius: @radius; +} +.border-bottom-left-radius(@radius) { + -webkit-border-bottom-left-radius: @radius; + -moz-border-radius-bottomleft: @radius; + border-bottom-left-radius: @radius; +} + +// Single Side Border Radius +.border-top-radius(@radius) { + .border-top-right-radius(@radius); + .border-top-left-radius(@radius); +} +.border-right-radius(@radius) { + .border-top-right-radius(@radius); + .border-bottom-right-radius(@radius); +} +.border-bottom-radius(@radius) { + .border-bottom-right-radius(@radius); + .border-bottom-left-radius(@radius); +} +.border-left-radius(@radius) { + .border-top-left-radius(@radius); + .border-bottom-left-radius(@radius); +} + +// Drop shadows +.box-shadow(@shadow) { + -webkit-box-shadow: @shadow; + -moz-box-shadow: @shadow; + box-shadow: @shadow; +} + +// Transitions +.transition(@transition) { + -webkit-transition: @transition; + -moz-transition: @transition; + -o-transition: @transition; + transition: @transition; +} + +// Transformations +.rotate(@degrees) { + -webkit-transform: rotate(@degrees); + -moz-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + -o-transform: rotate(@degrees); + transform: rotate(@degrees); +} +.scale(@ratio) { + -webkit-transform: scale(@ratio); + -moz-transform: scale(@ratio); + -ms-transform: scale(@ratio); + -o-transform: scale(@ratio); + transform: scale(@ratio); +} +.translate(@x, @y) { + -webkit-transform: translate(@x, @y); + -moz-transform: translate(@x, @y); + -ms-transform: translate(@x, @y); + -o-transform: translate(@x, @y); + transform: translate(@x, @y); +} +.skew(@x, @y) { + -webkit-transform: skew(@x, @y); + -moz-transform: skew(@x, @y); + -ms-transform: skew(@x, @y); + -o-transform: skew(@x, @y); + transform: skew(@x, @y); +} +.translate3d(@x, @y, @z) { + -webkit-transform: translate3d(@x, @y, @z); + -moz-transform: translate3d(@x, @y, @z); + -o-transform: translate3d(@x, @y, @z); + transform: translate3d(@x, @y, @z); +} + +// Backface visibility +// Prevent browsers from flickering when using CSS 3D transforms. +// Default value is `visible`, but can be changed to `hidden +// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples +.backface-visibility(@visibility){ + -webkit-backface-visibility: @visibility; + -moz-backface-visibility: @visibility; + backface-visibility: @visibility; +} + +// Background clipping +// Heads up: FF 3.6 and under need "padding" instead of "padding-box" +.background-clip(@clip) { + -webkit-background-clip: @clip; + -moz-background-clip: @clip; + background-clip: @clip; +} + +// Background sizing +.background-size(@size){ + -webkit-background-size: @size; + -moz-background-size: @size; + -o-background-size: @size; + background-size: @size; +} + + +// Box sizing +.box-sizing(@boxmodel) { + -webkit-box-sizing: @boxmodel; + -moz-box-sizing: @boxmodel; + box-sizing: @boxmodel; +} + +// User select +// For selecting text on the page +.user-select(@select) { + -webkit-user-select: @select; + -moz-user-select: @select; + -ms-user-select: @select; + -o-user-select: @select; + user-select: @select; +} + +// Resize anything +.resizable(@direction) { + resize: @direction; // Options: horizontal, vertical, both + overflow: auto; // Safari fix +} + +// CSS3 Content Columns +.content-columns(@columnCount, @columnGap: @gridGutterWidth) { + -webkit-column-count: @columnCount; + -moz-column-count: @columnCount; + column-count: @columnCount; + -webkit-column-gap: @columnGap; + -moz-column-gap: @columnGap; + column-gap: @columnGap; +} + +// Optional hyphenation +.hyphens(@mode: auto) { + word-wrap: break-word; + -webkit-hyphens: @mode; + -moz-hyphens: @mode; + -ms-hyphens: @mode; + -o-hyphens: @mode; + hyphens: @mode; +} + +// Opacity +.opacity(@opacity) { + opacity: @opacity / 100; + filter: ~"alpha(opacity=@{opacity})"; +} + + + +// BACKGROUNDS +// -------------------------------------------------- + +// Add an alphatransparency value to any background or border color (via Elyse Holladay) +#translucent { + .background(@color: @white, @alpha: 1) { + background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha); + } + .border(@color: @white, @alpha: 1) { + border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha); + .background-clip(padding-box); + } +} + +// Gradient Bar Colors for buttons and alerts +.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) { + color: @textColor; + text-shadow: @textShadow; + #gradient > .vertical(@primaryColor, @secondaryColor); + border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%); + border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%); +} + +// Gradients +#gradient { + .horizontal(@startColor: #555, @endColor: #333) { + background-color: @endColor; + background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+ + background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+ + background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+ + background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10 + background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10 + background-repeat: repeat-x; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@startColor),argb(@endColor))); // IE9 and down + } + .vertical(@startColor: #555, @endColor: #333) { + background-color: mix(@startColor, @endColor, 60%); + background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+ + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+ + background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+ + background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10 + background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10 + background-repeat: repeat-x; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down + } + .directional(@startColor: #555, @endColor: #333, @deg: 45deg) { + background-color: @endColor; + background-repeat: repeat-x; + background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+ + background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+ + background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10 + background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10 + } + .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) { + background-color: mix(@midColor, @endColor, 80%); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor)); + background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor); + background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop*100%, @endColor); + background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor); + background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor); + background-repeat: no-repeat; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback + } + .radial(@innerColor: #555, @outerColor: #333) { + background-color: @outerColor; + background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor)); + background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor); + background-image: -moz-radial-gradient(circle, @innerColor, @outerColor); + background-image: -o-radial-gradient(circle, @innerColor, @outerColor); + background-repeat: no-repeat; + } + .striped(@color, @angle: 45deg) { + background-color: @color; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); + } +} +// Reset filters for IE +.reset-filter() { + filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); +} + + + +// COMPONENT MIXINS +// -------------------------------------------------- + +// Horizontal dividers +// ------------------------- +// Dividers (basically an hr) within dropdowns and nav lists +.nav-divider(@top: #e5e5e5, @bottom: @white) { + // IE7 needs a set width since we gave a height. Restricting just + // to IE7 to keep the 1px left/right space in other browsers. + // It is unclear where IE is getting the extra space that we need + // to negative-margin away, but so it goes. + *width: 100%; + height: 1px; + margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px + *margin: -5px 0 5px; + overflow: hidden; + background-color: @top; + border-bottom: 1px solid @bottom; +} + +// Button backgrounds +// ------------------ +.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) { + // gradientBar will set the background to a pleasing blend of these, to support IE<=9 + .gradientBar(@startColor, @endColor, @textColor, @textShadow); + *background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + .reset-filter(); + + // in these cases the gradient won't cover the background, so we override + &:hover, &:active, &.active, &.disabled, &[disabled] { + color: @textColor; + background-color: @endColor; + *background-color: darken(@endColor, 5%); + } + + // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves + &:active, + &.active { + background-color: darken(@endColor, 10%) e("\9"); + } +} + +// Navbar vertical align +// ------------------------- +// Vertically center elements in the navbar. +// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin. +.navbarVerticalAlign(@elementHeight) { + margin-top: (@navbarHeight - @elementHeight) / 2; +} + + + +// Grid System +// ----------- + +// Centered container element +.container-fixed() { + margin-right: auto; + margin-left: auto; + .clearfix(); +} + +// Table columns +.tableColumns(@columnSpan: 1) { + float: none; // undo default grid column styles + width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells + margin-left: 0; // undo default grid column styles +} + +// Make a Grid +// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior +.makeRow() { + margin-left: @gridGutterWidth * -1; + .clearfix(); +} +.makeColumn(@columns: 1, @offset: 0) { + float: left; + margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2); + width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1)); +} + +// The Grid +#grid { + + .core (@gridColumnWidth, @gridGutterWidth) { + + .spanX (@index) when (@index > 0) { + (~".span@{index}") { .span(@index); } + .spanX(@index - 1); + } + .spanX (0) {} + + .offsetX (@index) when (@index > 0) { + (~".offset@{index}") { .offset(@index); } + .offsetX(@index - 1); + } + .offsetX (0) {} + + .offset (@columns) { + margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1)); + } + + .span (@columns) { + width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1)); + } + + .row { + margin-left: @gridGutterWidth * -1; + .clearfix(); + } + + [class*="span"] { + float: left; + margin-left: @gridGutterWidth; + } + + // Set the container width, and override it for fixed navbars in media queries + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { .span(@gridColumns); } + + // generate .spanX and .offsetX + .spanX (@gridColumns); + .offsetX (@gridColumns); + + } + + .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) { + + .spanX (@index) when (@index > 0) { + (~".span@{index}") { .span(@index); } + .spanX(@index - 1); + } + .spanX (0) {} + + .offsetX (@index) when (@index > 0) { + (~'.offset@{index}') { .offset(@index); } + (~'.offset@{index}:first-child') { .offsetFirstChild(@index); } + .offsetX(@index - 1); + } + .offsetX (0) {} + + .offset (@columns) { + margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2); + *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%); + } + + .offsetFirstChild (@columns) { + margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth); + *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%); + } + + .span (@columns) { + width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)); + *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%); + } + + .row-fluid { + width: 100%; + .clearfix(); + [class*="span"] { + .input-block-level(); + float: left; + margin-left: @fluidGridGutterWidth; + *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%); + } + [class*="span"]:first-child { + margin-left: 0; + } + + // generate .spanX and .offsetX + .spanX (@gridColumns); + .offsetX (@gridColumns); + } + + } + + .input(@gridColumnWidth, @gridGutterWidth) { + + .spanX (@index) when (@index > 0) { + (~"input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index}") { .span(@index); } + .spanX(@index - 1); + } + .spanX (0) {} + + .span(@columns) { + width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14; + } + + input, + textarea, + .uneditable-input { + margin-left: 0; // override margin-left from core grid system + } + + // Space grid-sized controls properly if multiple per line + .controls-row [class*="span"] + [class*="span"] { + margin-left: @gridGutterWidth; + } + + // generate .spanX + .spanX (@gridColumns); + + } + +} diff --git a/vendors/bootstrap/less/modals.less b/vendors/bootstrap/less/modals.less new file mode 100644 index 000000000..e515bb796 --- /dev/null +++ b/vendors/bootstrap/less/modals.less @@ -0,0 +1,97 @@ +// +// Modals +// -------------------------------------------------- + + +// Recalculate z-index where appropriate +.modal-open { + .dropdown-menu { z-index: @zindexDropdown + @zindexModal; } + .dropdown.open { *z-index: @zindexDropdown + @zindexModal; } + .popover { z-index: @zindexPopover + @zindexModal; } + .tooltip { z-index: @zindexTooltip + @zindexModal; } +} + +// Background +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: @zindexModalBackdrop; + background-color: @black; + // Fade for backdrop + &.fade { opacity: 0; } +} + +.modal-backdrop, +.modal-backdrop.fade.in { + .opacity(80); +} + +// Base modal +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: @zindexModal; + overflow: auto; + width: 560px; + margin: -250px 0 0 -280px; + background-color: @white; + border: 1px solid #999; + border: 1px solid rgba(0,0,0,.3); + *border: 1px solid #999; /* IE6-7 */ + .border-radius(6px); + .box-shadow(0 3px 7px rgba(0,0,0,0.3)); + .background-clip(padding-box); + &.fade { + .transition(e('opacity .3s linear, top .3s ease-out')); + top: -25%; + } + &.fade.in { top: 50%; } +} +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; + // Close icon + .close { margin-top: 2px; } + // Heading + h3 { + margin: 0; + line-height: 30px; + } +} + +// Body (where all modal content resides) +.modal-body { + overflow-y: auto; + max-height: 400px; + padding: 15px; +} +// Remove bottom margin if need be +.modal-form { + margin-bottom: 0; +} + +// Footer (for actions) +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; // right align buttons + background-color: #f5f5f5; + border-top: 1px solid #ddd; + .border-radius(0 0 6px 6px); + .box-shadow(inset 0 1px 0 @white); + .clearfix(); // clear it in case folks use .pull-* classes on buttons + + // Properly space out buttons + .btn + .btn { + margin-left: 5px; + margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs + } + // but override that for button groups + .btn-group .btn + .btn { + margin-left: -1px; + } +} diff --git a/vendors/bootstrap/less/navbar.less b/vendors/bootstrap/less/navbar.less new file mode 100644 index 000000000..70501e459 --- /dev/null +++ b/vendors/bootstrap/less/navbar.less @@ -0,0 +1,469 @@ +// +// Navbars (Redux) +// -------------------------------------------------- + + +// COMMON STYLES +// ------------- + +// Base class and wrapper +.navbar { + overflow: visible; + margin-bottom: @baseLineHeight; + color: @navbarText; + + // Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar + *position: relative; + *z-index: 2; +} + +// Inner for background effects +// Gradient is applied to its own element because overflow visible is not honored by IE when filter is present +.navbar-inner { + min-height: @navbarHeight; + padding-left: 20px; + padding-right: 20px; + #gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground); + border: 1px solid @navbarBorder; + .border-radius(4px); + .box-shadow(0 1px 4px rgba(0,0,0,.065)); +} + +// Set width to auto for default container +// We then reset it for fixed navbars in the #gridSystem mixin +.navbar .container { + width: auto; +} + +// Override the default collapsed state +.nav-collapse.collapse { + height: auto; +} + + +// Brand: website or project name +// ------------------------- +.navbar .brand { + float: left; + display: block; + // Vertically center the text given @navbarHeight + padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2); + margin-left: -20px; // negative indent to left-align the text down the page + font-size: 20px; + font-weight: 200; + color: @navbarBrandColor; + text-shadow: 0 1px 0 @navbarBackgroundHighlight; + &:hover { + text-decoration: none; + } +} + +// Plain text in topbar +// ------------------------- +.navbar-text { + margin-bottom: 0; + line-height: @navbarHeight; +} + +// Janky solution for now to account for links outside the .nav +// ------------------------- +.navbar-link { + color: @navbarLinkColor; + &:hover { + color: @navbarLinkColorHover; + } +} + +// Dividers in navbar +// ------------------------- +.navbar .divider-vertical { + height: @navbarHeight; + margin: 0 9px; + border-left: 1px solid @navbarBackground; + border-right: 1px solid @navbarBackgroundHighlight; +} + +// Buttons in navbar +// ------------------------- +.navbar .btn, +.navbar .btn-group { + .navbarVerticalAlign(28px); // Vertically center in navbar +} +.navbar .btn-group .btn { + margin: 0; // then undo the margin here so we don't accidentally double it +} + +// Navbar forms +.navbar-form { + margin-bottom: 0; // remove default bottom margin + .clearfix(); + input, + select, + .radio, + .checkbox { + .navbarVerticalAlign(30px); // Vertically center in navbar + } + input, + select, + .btn { + display: inline-block; + margin-bottom: 0; + } + input[type="image"], + input[type="checkbox"], + input[type="radio"] { + margin-top: 3px; + } + .input-append, + .input-prepend { + margin-top: 6px; + white-space: nowrap; // preven two items from separating within a .navbar-form that has .pull-left + input { + margin-top: 0; // remove the margin on top since it's on the parent + } + } +} + +// Navbar search +.navbar-search { + position: relative; + float: left; + .navbarVerticalAlign(30px); // Vertically center in navbar + margin-bottom: 0; + .search-query { + margin-bottom: 0; + padding: 4px 14px; + #font > .sans-serif(13px, normal, 1); + .border-radius(15px); // redeclare because of specificity of the type attribute + } +} + + + +// Static navbar +// ------------------------- + +.navbar-static-top { + position: static; + width: 100%; + margin-bottom: 0; // remove 18px margin for default navbar + .navbar-inner { + .border-radius(0); + } +} + + + +// Fixed navbar +// ------------------------- + +// Shared (top/bottom) styles +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: @zindexFixedNavbar; + margin-bottom: 0; // remove 18px margin for default navbar +} +.navbar-fixed-top, +.navbar-fixed-bottom, +.navbar-static-top { + .navbar-inner { + border: 0; + } +} +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-left: 0; + padding-right: 0; + .border-radius(0); +} + +// Reset container width +// Required here as we reset the width earlier on and the grid mixins don't override early enough +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + #grid > .core > .span(@gridColumns); +} + +// Fixed to top +.navbar-fixed-top { + top: 0; +} +.navbar-fixed-top, +.navbar-static-top { + .navbar-inner { + .box-shadow(~"inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1)"); + } +} + +// Fixed to bottom +.navbar-fixed-bottom { + bottom: 0; + .navbar-inner { + .box-shadow(~"inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1)"); + } +} + + + +// NAVIGATION +// ---------- + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} +.navbar .nav.pull-right { + float: right; // redeclare due to specificity +} +.navbar .nav > li { + float: left; +} + +// Links +.navbar .nav > li > a { + float: none; + // Vertically center the text given @navbarHeight + padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2); + color: @navbarLinkColor; + text-decoration: none; + text-shadow: 0 1px 0 @navbarBackgroundHighlight; +} +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +// Hover +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + background-color: @navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover from .active + color: @navbarLinkColorHover; + text-decoration: none; +} + +// Active nav items +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: @navbarLinkColorActive; + text-decoration: none; + background-color: @navbarLinkBackgroundActive; + -webkit-box-shadow: inset 0 3px 8px rgba(0,0,0,.125); + -moz-box-shadow: inset 0 3px 8px rgba(0,0,0,.125); + box-shadow: inset 0 3px 8px rgba(0,0,0,.125); +} + +// Navbar button for toggling navbar items in responsive layouts +// These definitions need to come after '.navbar .btn' +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-left: 5px; + margin-right: 5px; + .buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%)); + .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)"); +} +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + .border-radius(1px); + .box-shadow(0 1px 0 rgba(0,0,0,.25)); +} +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + + + +// Dropdown menus +// -------------- + +// Menu position and menu carets +.navbar .nav > li > .dropdown-menu { + &:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: @dropdownBorder; + position: absolute; + top: -7px; + left: 9px; + } + &:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid @dropdownBackground; + position: absolute; + top: -6px; + left: 10px; + } +} +// Menu position and menu caret support for dropups via extra dropup class +.navbar-fixed-bottom .nav > li > .dropdown-menu { + &:before { + border-top: 7px solid #ccc; + border-top-color: @dropdownBorder; + border-bottom: 0; + bottom: -7px; + top: auto; + } + &:after { + border-top: 6px solid @dropdownBackground; + border-bottom: 0; + bottom: -6px; + top: auto; + } +} + +// Remove background color from open dropdown +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: @navbarLinkBackgroundActive; + color: @navbarLinkColorActive; +} +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: @navbarLinkColor; + border-bottom-color: @navbarLinkColor; +} +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: @navbarLinkColorActive; + border-bottom-color: @navbarLinkColorActive; +} + +// Right aligned menus need alt position +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + left: auto; + right: 0; + &:before { + left: auto; + right: 12px; + } + &:after { + left: auto; + right: 13px; + } + .dropdown-menu { + left: auto; + right: 100%; + margin-left: 0; + margin-right: -1px; + .border-radius(6px 0 6px 6px); + } +} + + +// Inverted navbar +// ------------------------- + +.navbar-inverse { + color: @navbarInverseText; + + .navbar-inner { + #gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground); + border-color: @navbarInverseBorder; + } + + .brand, + .nav > li > a { + color: @navbarInverseLinkColor; + text-shadow: 0 -1px 0 rgba(0,0,0,.25); + &:hover { + color: @navbarInverseLinkColorHover; + } + } + + .nav > li > a:focus, + .nav > li > a:hover { + background-color: @navbarInverseLinkBackgroundHover; + color: @navbarInverseLinkColorHover; + } + + .nav .active > a, + .nav .active > a:hover, + .nav .active > a:focus { + color: @navbarInverseLinkColorActive; + background-color: @navbarInverseLinkBackgroundActive; + } + + // Inline text links + .navbar-link { + color: @navbarInverseLinkColor; + &:hover { + color: @navbarInverseLinkColorHover; + } + } + + // Dividers in navbar + .divider-vertical { + border-left-color: @navbarInverseBackground; + border-right-color: @navbarInverseBackgroundHighlight; + } + + // Dropdowns + .nav li.dropdown.open > .dropdown-toggle, + .nav li.dropdown.active > .dropdown-toggle, + .nav li.dropdown.open.active > .dropdown-toggle { + background-color: @navbarInverseLinkBackgroundActive; + color: @navbarInverseLinkColorActive; + } + .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: @navbarInverseLinkColor; + border-bottom-color: @navbarInverseLinkColor; + } + .nav li.dropdown.open > .dropdown-toggle .caret, + .nav li.dropdown.active > .dropdown-toggle .caret, + .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: @navbarInverseLinkColorActive; + border-bottom-color: @navbarInverseLinkColorActive; + } + + // Navbar search + .navbar-search { + .search-query { + color: @white; + background-color: @navbarInverseSearchBackground; + border-color: @navbarInverseSearchBorder; + .box-shadow(~"inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15)"); + .transition(none); + .placeholder(@navbarInverseSearchPlaceholderColor); + + // Focus states (we use .focused since IE7-8 and down doesn't support :focus) + &:focus, + &.focused { + padding: 5px 15px; + color: @grayDark; + text-shadow: 0 1px 0 @white; + background-color: @navbarInverseSearchBackgroundFocus; + border: 0; + .box-shadow(0 0 3px rgba(0,0,0,.15)); + outline: 0; + } + } + } + + // Navbar collapse button + .btn-navbar { + .buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%)); + } + +} + + + diff --git a/vendors/bootstrap/less/navs.less b/vendors/bootstrap/less/navs.less new file mode 100644 index 000000000..4c38f7dbf --- /dev/null +++ b/vendors/bootstrap/less/navs.less @@ -0,0 +1,384 @@ +// +// Navs +// -------------------------------------------------- + + +// BASE CLASS +// ---------- + +.nav { + margin-left: 0; + margin-bottom: @baseLineHeight; + list-style: none; +} + +// Make links block level +.nav > li > a { + display: block; +} +.nav > li > a:hover { + text-decoration: none; + background-color: @grayLighter; +} + +// Redeclare pull classes because of specifity +.nav > .pull-right { + float: right; +} + +// Nav headers (for dropdowns and lists) +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: @baseLineHeight; + color: @grayLight; + text-shadow: 0 1px 0 rgba(255,255,255,.5); + text-transform: uppercase; +} +// Space them out when they follow another list item (link) +.nav li + .nav-header { + margin-top: 9px; +} + + + +// NAV LIST +// -------- + +.nav-list { + padding-left: 15px; + padding-right: 15px; + margin-bottom: 0; +} +.nav-list > li > a, +.nav-list .nav-header { + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255,255,255,.5); +} +.nav-list > li > a { + padding: 3px 15px; +} +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: @white; + text-shadow: 0 -1px 0 rgba(0,0,0,.2); + background-color: @linkColor; +} +.nav-list [class^="icon-"] { + margin-right: 2px; +} +// Dividers (basically an hr) within the dropdown +.nav-list .divider { + .nav-divider(); +} + + + +// TABS AND PILLS +// ------------- + +// Common styles +.nav-tabs, +.nav-pills { + .clearfix(); +} +.nav-tabs > li, +.nav-pills > li { + float: left; +} +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; // keeps the overall height an even number +} + +// TABS +// ---- + +// Give the tabs something to sit on +.nav-tabs { + border-bottom: 1px solid #ddd; +} +// Make the list-items overlay the bottom border +.nav-tabs > li { + margin-bottom: -1px; +} +// Actual tabs (as links) +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: @baseLineHeight; + border: 1px solid transparent; + .border-radius(4px 4px 0 0); + &:hover { + border-color: @grayLighter @grayLighter #ddd; + } +} +// Active state, and it's :hover to override normal :hover +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: @gray; + background-color: @white; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} + + +// PILLS +// ----- + +// Links rendered as pills +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + .border-radius(5px); +} + +// Active state +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: @white; + background-color: @linkColor; +} + + + +// STACKED NAV +// ----------- + +// Stacked tabs and pills +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; // no need for the gap between nav items +} + +// Tabs +.nav-tabs.nav-stacked { + border-bottom: 0; +} +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + .border-radius(0); +} +.nav-tabs.nav-stacked > li:first-child > a { + .border-top-radius(4px); +} +.nav-tabs.nav-stacked > li:last-child > a { + .border-bottom-radius(4px); +} +.nav-tabs.nav-stacked > li > a:hover { + border-color: #ddd; + z-index: 2; +} + +// Pills +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; // decrease margin to match sizing of stacked tabs +} + + + +// DROPDOWNS +// --------- + +.nav-tabs .dropdown-menu { + .border-radius(0 0 6px 6px); // remove the top rounded corners here since there is a hard edge above the menu +} +.nav-pills .dropdown-menu { + .border-radius(6px); // make rounded corners match the pills +} + +// Default dropdown links +// ------------------------- +// Make carets use linkColor to start +.nav .dropdown-toggle .caret { + border-top-color: @linkColor; + border-bottom-color: @linkColor; + margin-top: 6px; +} +.nav .dropdown-toggle:hover .caret { + border-top-color: @linkColorHover; + border-bottom-color: @linkColorHover; +} +/* move down carets for tabs */ +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +// Active dropdown links +// ------------------------- +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: @gray; + border-bottom-color: @gray; +} + +// Active:hover dropdown links +// ------------------------- +.nav > .dropdown.active > a:hover { + cursor: pointer; +} + +// Open dropdowns +// ------------------------- +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: @white; + background-color: @grayLight; + border-color: @grayLight; +} +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: @white; + border-bottom-color: @white; + .opacity(100); +} + +// Dropdowns in stacked tabs +.tabs-stacked .open > a:hover { + border-color: @grayLight; +} + + + +// TABBABLE +// -------- + + +// COMMON STYLES +// ------------- + +// Clear any floats +.tabbable { + .clearfix(); +} +.tab-content { + overflow: auto; // prevent content from running below tabs +} + +// Remove border on bottom, left, right +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +// Show/hide tabbable areas +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} +.tab-content > .active, +.pill-content > .active { + display: block; +} + + +// BOTTOM +// ------ + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} +.tabs-below > .nav-tabs > li > a { + .border-radius(0 0 4px 4px); + &:hover { + border-bottom-color: transparent; + border-top-color: #ddd; + } +} +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} + +// LEFT & RIGHT +// ------------ + +// Common styles +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +// Tabs on the left +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + .border-radius(4px 0 0 4px); +} +.tabs-left > .nav-tabs > li > a:hover { + border-color: @grayLighter #ddd @grayLighter @grayLighter; +} +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: @white; +} + +// Tabs on the right +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + .border-radius(0 4px 4px 0); +} +.tabs-right > .nav-tabs > li > a:hover { + border-color: @grayLighter @grayLighter @grayLighter #ddd; +} +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: @white; +} + + + +// DISABLED STATES +// --------------- + +// Gray out text +.nav > .disabled > a { + color: @grayLight; +} +// Nuke hover effects +.nav > .disabled > a:hover { + text-decoration: none; + background-color: transparent; + cursor: default; +} diff --git a/vendors/bootstrap/less/pager.less b/vendors/bootstrap/less/pager.less new file mode 100644 index 000000000..2b854b4be --- /dev/null +++ b/vendors/bootstrap/less/pager.less @@ -0,0 +1,37 @@ +// +// Pager pagination +// -------------------------------------------------- + + +.pager { + margin: @baseLineHeight 0; + list-style: none; + text-align: center; + .clearfix(); +} +.pager li { + display: inline; +} +.pager a { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + .border-radius(15px); +} +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} +.pager .next a { + float: right; +} +.pager .previous a { + float: left; +} +.pager .disabled a, +.pager .disabled a:hover { + color: @grayLight; + background-color: #fff; + cursor: default; +} \ No newline at end of file diff --git a/vendors/bootstrap/less/pagination.less b/vendors/bootstrap/less/pagination.less new file mode 100644 index 000000000..2c19880c0 --- /dev/null +++ b/vendors/bootstrap/less/pagination.less @@ -0,0 +1,64 @@ +// +// Pagination (multiple pages) +// -------------------------------------------------- + + +.pagination { + height: @baseLineHeight * 2; + margin: @baseLineHeight 0; + } +.pagination ul { + display: inline-block; + .ie7-inline-block(); + margin-left: 0; + margin-bottom: 0; + .border-radius(3px); + .box-shadow(0 1px 2px rgba(0,0,0,.05)); +} +.pagination li { + display: inline; + } +.pagination a, +.pagination span { + float: left; + padding: 0 14px; + line-height: (@baseLineHeight * 2) - 2; + text-decoration: none; + background-color: @paginationBackground; + border: 1px solid @paginationBorder; + border-left-width: 0; +} +.pagination a:hover, +.pagination .active a, +.pagination .active span { + background-color: #f5f5f5; +} +.pagination .active a, +.pagination .active span { + color: @grayLight; + cursor: default; +} +.pagination .disabled span, +.pagination .disabled a, +.pagination .disabled a:hover { + color: @grayLight; + background-color: transparent; + cursor: default; +} +.pagination li:first-child a, +.pagination li:first-child span { + border-left-width: 1px; + .border-radius(3px 0 0 3px); +} +.pagination li:last-child a, +.pagination li:last-child span { + .border-radius(0 3px 3px 0); +} + +// Centered +.pagination-centered { + text-align: center; +} +.pagination-right { + text-align: right; +} diff --git a/vendors/bootstrap/less/popovers.less b/vendors/bootstrap/less/popovers.less new file mode 100644 index 000000000..2b3f1b059 --- /dev/null +++ b/vendors/bootstrap/less/popovers.less @@ -0,0 +1,117 @@ +// +// Popovers +// -------------------------------------------------- + + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: @zindexPopover; + display: none; + width: 236px; + padding: 1px; + background-color: @popoverBackground; + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0,0,0,.2); + .border-radius(6px); + .box-shadow(0 5px 10px rgba(0,0,0,.2)); + + // Offset the popover to account for the popover arrow + &.top { margin-bottom: 10px; } + &.right { margin-left: 10px; } + &.bottom { margin-top: 10px; } + &.left { margin-right: 10px; } + +} + +.popover-title { + margin: 0; // reset heading margin + padding: 8px 14px; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: @popoverTitleBackground; + border-bottom: 1px solid darken(@popoverTitleBackground, 5%); + .border-radius(5px 5px 0 0); +} + +.popover-content { + padding: 9px 14px; + p, ul, ol { + margin-bottom: 0; + } +} + +// Arrows +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: inline-block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover .arrow:after { + content: ""; + z-index: -1; +} + +.popover { + &.top .arrow { + bottom: -@popoverArrowWidth; + left: 50%; + margin-left: -@popoverArrowWidth; + border-width: @popoverArrowWidth @popoverArrowWidth 0; + border-top-color: @popoverArrowColor; + &:after { + border-width: @popoverArrowOuterWidth @popoverArrowOuterWidth 0; + border-top-color: @popoverArrowOuterColor; + bottom: -1px; + left: -@popoverArrowOuterWidth; + } + } + &.right .arrow { + top: 50%; + left: -@popoverArrowWidth; + margin-top: -@popoverArrowWidth; + border-width: @popoverArrowWidth @popoverArrowWidth @popoverArrowWidth 0; + border-right-color: @popoverArrowColor; + &:after { + border-width: @popoverArrowOuterWidth @popoverArrowOuterWidth @popoverArrowOuterWidth 0; + border-right-color: @popoverArrowOuterColor; + bottom: -@popoverArrowOuterWidth; + left: -1px; + } + } + &.bottom .arrow { + top: -@popoverArrowWidth; + left: 50%; + margin-left: -@popoverArrowWidth; + border-width: 0 @popoverArrowWidth @popoverArrowWidth; + border-bottom-color: @popoverArrowColor; + &:after { + border-width: 0 @popoverArrowOuterWidth @popoverArrowOuterWidth; + border-bottom-color: @popoverArrowOuterColor; + top: -1px; + left: -@popoverArrowOuterWidth; + } + } + &.left .arrow { + top: 50%; + right: -@popoverArrowWidth; + margin-top: -@popoverArrowWidth; + border-width: @popoverArrowWidth 0 @popoverArrowWidth @popoverArrowWidth; + border-left-color: @popoverArrowColor; + &:after { + border-width: @popoverArrowOuterWidth 0 @popoverArrowOuterWidth @popoverArrowOuterWidth; + border-left-color: @popoverArrowOuterColor; + bottom: -@popoverArrowOuterWidth; + right: -1px; + } + } +} diff --git a/vendors/bootstrap/less/progress-bars.less b/vendors/bootstrap/less/progress-bars.less new file mode 100644 index 000000000..36744d89c --- /dev/null +++ b/vendors/bootstrap/less/progress-bars.less @@ -0,0 +1,122 @@ +// +// Progress bars +// -------------------------------------------------- + + +// ANIMATIONS +// ---------- + +// Webkit +@-webkit-keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + +// Firefox +@-moz-keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + +// IE9 +@-ms-keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + +// Opera +@-o-keyframes progress-bar-stripes { + from { background-position: 0 0; } + to { background-position: 40px 0; } +} + +// Spec +@keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + + + +// THE BARS +// -------- + +// Outer container +.progress { + overflow: hidden; + height: @baseLineHeight; + margin-bottom: @baseLineHeight; + #gradient > .vertical(#f5f5f5, #f9f9f9); + .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); + .border-radius(4px); +} + +// Bar of progress +.progress .bar { + width: 0%; + height: 100%; + color: @white; + float: left; + font-size: 12px; + text-align: center; + text-shadow: 0 -1px 0 rgba(0,0,0,.25); + #gradient > .vertical(#149bdf, #0480be); + .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); + .box-sizing(border-box); + .transition(width .6s ease); +} +.progress .bar + .bar { + .box-shadow(~"inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15)"); +} + +// Striped bars +.progress-striped .bar { + #gradient > .striped(#149bdf); + .background-size(40px 40px); +} + +// Call animation for the active one +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + + + +// COLORS +// ------ + +// Danger (red) +.progress-danger .bar, .progress .bar-danger { + #gradient > .vertical(#ee5f5b, #c43c35); +} +.progress-danger.progress-striped .bar, .progress-striped .bar-danger { + #gradient > .striped(#ee5f5b); +} + +// Success (green) +.progress-success .bar, .progress .bar-success { + #gradient > .vertical(#62c462, #57a957); +} +.progress-success.progress-striped .bar, .progress-striped .bar-success { + #gradient > .striped(#62c462); +} + +// Info (teal) +.progress-info .bar, .progress .bar-info { + #gradient > .vertical(#5bc0de, #339bb9); +} +.progress-info.progress-striped .bar, .progress-striped .bar-info { + #gradient > .striped(#5bc0de); +} + +// Warning (orange) +.progress-warning .bar, .progress .bar-warning { + #gradient > .vertical(lighten(@orange, 15%), @orange); +} +.progress-warning.progress-striped .bar, .progress-striped .bar-warning { + #gradient > .striped(lighten(@orange, 15%)); +} diff --git a/vendors/bootstrap/less/reset.less b/vendors/bootstrap/less/reset.less new file mode 100644 index 000000000..fc27e9c87 --- /dev/null +++ b/vendors/bootstrap/less/reset.less @@ -0,0 +1,134 @@ +// +// Modals +// Adapted from http://github.com/necolas/normalize.css +// -------------------------------------------------- + + +// Display in IE6-9 and FF3 +// ------------------------- + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +// Display block in IE6-9 and FF3 +// ------------------------- + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +// Prevents modern browsers from displaying 'audio' without controls +// ------------------------- + +audio:not([controls]) { + display: none; +} + +// Base settings +// ------------------------- + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +// Focus states +a:focus { + .tab-focus(); +} +// Hover & Active +a:hover, +a:active { + outline: 0; +} + +// Prevents sub and sup affecting line-height in all browsers +// ------------------------- + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} + +// Img border in a's and image quality +// ------------------------- + +img { + max-width: 100%; // Make images inherently responsive + height: auto; // Make images inherently responsive + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +// Prevent max-width from affecting Google Maps +#map_canvas img { + max-width: none; +} + +// Forms +// ------------------------- + +// Font size in all browsers, margin changes, misc consistency +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} +button, +input { + *overflow: visible; // Inner spacing ie IE6/7 + line-height: normal; // FF3/4 have !important on line-height in UA stylesheet +} +button::-moz-focus-inner, +input::-moz-focus-inner { // Inner padding and border oddities in FF3/4 + padding: 0; + border: 0; +} +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; // Cursors on all buttons applied consistently + -webkit-appearance: button; // Style clickable inputs in iOS +} +input[type="search"] { // Appearance in Safari/Chrome + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5 +} +textarea { + overflow: auto; // Remove vertical scrollbar in IE6-9 + vertical-align: top; // Readability and alignment cross-browser +} diff --git a/vendors/bootstrap/less/responsive-1200px-min.less b/vendors/bootstrap/less/responsive-1200px-min.less new file mode 100644 index 000000000..4f35ba6ca --- /dev/null +++ b/vendors/bootstrap/less/responsive-1200px-min.less @@ -0,0 +1,28 @@ +// +// Responsive: Large desktop and up +// -------------------------------------------------- + + +@media (min-width: 1200px) { + + // Fixed grid + #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200); + + // Fluid grid + #grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200); + + // Input grid + #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200); + + // Thumbnails + .thumbnails { + margin-left: -@gridGutterWidth1200; + } + .thumbnails > li { + margin-left: @gridGutterWidth1200; + } + .row-fluid .thumbnails { + margin-left: 0; + } + +} diff --git a/vendors/bootstrap/less/responsive-767px-max.less b/vendors/bootstrap/less/responsive-767px-max.less new file mode 100644 index 000000000..b2e3da25c --- /dev/null +++ b/vendors/bootstrap/less/responsive-767px-max.less @@ -0,0 +1,167 @@ +// +// Responsive: Landscape phone to desktop/tablet +// -------------------------------------------------- + + +@media (max-width: 767px) { + + // Padding to set content in a bit + body { + padding-left: 20px; + padding-right: 20px; + } + // Negative indent the now static "fixed" navbar + .navbar-fixed-top, + .navbar-fixed-bottom { + margin-left: -20px; + margin-right: -20px; + } + // Remove padding on container given explicit padding set on body + .container-fluid { + padding: 0; + } + + // TYPOGRAPHY + // ---------- + // Reset horizontal dl + .dl-horizontal { + dt { + float: none; + clear: none; + width: auto; + text-align: left; + } + dd { + margin-left: 0; + } + } + + // GRID & CONTAINERS + // ----------------- + // Remove width from containers + .container { + width: auto; + } + // Fluid rows + .row-fluid { + width: 100%; + } + // Undo negative margin on rows and thumbnails + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; // Reset the default margin for all li elements when no .span* classes are present + } + // Make all grid-sized elements block level again + [class*="span"], + .row-fluid [class*="span"] { + float: none; + display: block; + width: auto; + margin-left: 0; + } + .span12, + .row-fluid .span12 { + width: 100%; + .box-sizing(border-box); + } + + // FORM FIELDS + // ----------- + // Make span* classes full width + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + .input-block-level(); + } + // But don't let it screw up prepend/append inputs + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; // redeclare so they don't wrap to new lines + width: auto; + } + + // Modals + .modal { + position: fixed; + top: 20px; + left: 20px; + right: 20px; + width: auto; + margin: 0; + &.fade.in { top: auto; } + } + +} + + + +// UP TO LANDSCAPE PHONE +// --------------------- + +@media (max-width: 480px) { + + // Smooth out the collapsing/expanding nav + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); // activate the GPU + } + + // Block level the page header small tag for readability + .page-header h1 small { + display: block; + line-height: @baseLineHeight; + } + + // Update checkboxes for iOS + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + // Remove the horizontal form styles + .form-horizontal .control-group > label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + // Move over all input controls and content + .form-horizontal .controls { + margin-left: 0; + } + // Move the options list down to align with labels + .form-horizontal .control-list { + padding-top: 0; // has to be padding because margin collaspes + } + // Move over buttons in .form-actions to align with .controls + .form-horizontal .form-actions { + padding-left: 10px; + padding-right: 10px; + } + + // Modals + .modal { + top: 10px; + left: 10px; + right: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + + // Carousel + .carousel-caption { + position: static; + } + +} diff --git a/vendors/bootstrap/less/responsive-768px-979px.less b/vendors/bootstrap/less/responsive-768px-979px.less new file mode 100644 index 000000000..8e8c486a0 --- /dev/null +++ b/vendors/bootstrap/less/responsive-768px-979px.less @@ -0,0 +1,19 @@ +// +// Responsive: Tablet to desktop +// -------------------------------------------------- + + +@media (min-width: 768px) and (max-width: 979px) { + + // Fixed grid + #grid > .core(@gridColumnWidth768, @gridGutterWidth768); + + // Fluid grid + #grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768); + + // Input grid + #grid > .input(@gridColumnWidth768, @gridGutterWidth768); + + // No need to reset .thumbnails here since it's the same @gridGutterWidth + +} diff --git a/vendors/bootstrap/less/responsive-navbar.less b/vendors/bootstrap/less/responsive-navbar.less new file mode 100644 index 000000000..3498863c8 --- /dev/null +++ b/vendors/bootstrap/less/responsive-navbar.less @@ -0,0 +1,166 @@ +// +// Responsive: Navbar +// -------------------------------------------------- + + +// TABLETS AND BELOW +// ----------------- +@media (max-width: @navbarCollapseWidth) { + + // UNFIX THE TOPBAR + // ---------------- + // Remove any padding from the body + body { + padding-top: 0; + } + // Unfix the navbars + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: @baseLineHeight; + } + .navbar-fixed-bottom { + margin-top: @baseLineHeight; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + // Account for brand name + .navbar .brand { + padding-left: 10px; + padding-right: 10px; + margin: 0 0 0 -5px; + } + + // COLLAPSIBLE NAVBAR + // ------------------ + // Nav collapse clears brand + .nav-collapse { + clear: both; + } + // Block-level the nav + .nav-collapse .nav { + float: none; + margin: 0 0 (@baseLineHeight / 2); + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: @navbarText; + text-shadow: none; + } + // Nav and dropdown links in navbar + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: @navbarLinkColor; + .border-radius(3px); + } + // Buttons + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + .border-radius(4px); + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .dropdown-menu a:hover { + background-color: @navbarBackground; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:hover { + background-color: @navbarInverseBackground; + } + // Buttons in the navbar + .nav-collapse.in .btn-group { + margin-top: 5px; + padding: 0; + } + // Dropdowns in the navbar + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + float: none; + display: block; + max-width: none; + margin: 0 15px; + padding: 0; + background-color: transparent; + border: none; + .border-radius(0); + .box-shadow(none); + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + // Forms in navbar + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: (@baseLineHeight / 2) 15px; + margin: (@baseLineHeight / 2) 0; + border-top: 1px solid @navbarBackground; + border-bottom: 1px solid @navbarBackground; + .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1)"); + } + // Pull right (secondary) nav content + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + // Hide everything in the navbar save .brand and toggle button */ + .nav-collapse, + .nav-collapse.collapse { + overflow: hidden; + height: 0; + } + // Navbar button + .navbar .btn-navbar { + display: block; + } + + // STATIC NAVBAR + // ------------- + .navbar-static .navbar-inner { + padding-left: 10px; + padding-right: 10px; + } + + +} + + +// DEFAULT DESKTOP +// --------------- + +@media (min-width: 980px) { + + // Required to make the collapsing navbar work on regular desktops + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } + +} diff --git a/vendors/bootstrap/less/responsive-utilities.less b/vendors/bootstrap/less/responsive-utilities.less new file mode 100644 index 000000000..2c3f6c15f --- /dev/null +++ b/vendors/bootstrap/less/responsive-utilities.less @@ -0,0 +1,43 @@ +// +// Responsive: Utility classes +// -------------------------------------------------- + + +// Hide from screenreaders and browsers +// Credit: HTML5 Boilerplate +.hidden { + display: none; + visibility: hidden; +} + +// Visibility utilities + +// For desktops +.visible-phone { display: none !important; } +.visible-tablet { display: none !important; } +.hidden-phone { } +.hidden-tablet { } +.hidden-desktop { display: none !important; } +.visible-desktop { display: inherit !important; } + +// Tablets & small desktops only +@media (min-width: 768px) and (max-width: 979px) { + // Hide everything else + .hidden-desktop { display: inherit !important; } + .visible-desktop { display: none !important ; } + // Show + .visible-tablet { display: inherit !important; } + // Hide + .hidden-tablet { display: none !important; } +} + +// Phones only +@media (max-width: 767px) { + // Hide everything else + .hidden-desktop { display: inherit !important; } + .visible-desktop { display: none !important; } + // Show + .visible-phone { display: inherit !important; } // Use inherit to restore previous behavior + // Hide + .hidden-phone { display: none !important; } +} diff --git a/vendors/bootstrap/less/responsive.less b/vendors/bootstrap/less/responsive.less new file mode 100644 index 000000000..5a62e4a50 --- /dev/null +++ b/vendors/bootstrap/less/responsive.less @@ -0,0 +1,48 @@ +/*! + * Bootstrap Responsive v2.1.0 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + + +// Responsive.less +// For phone and tablet devices +// ------------------------------------------------------------- + + +// REPEAT VARIABLES & MIXINS +// ------------------------- +// Required since we compile the responsive stuff separately + +@import "variables.less"; // Modify this for custom colors, font-sizes, etc +@import "mixins.less"; + + +// RESPONSIVE CLASSES +// ------------------ + +@import "responsive-utilities.less"; + + +// MEDIA QUERIES +// ------------------ + +// Large desktops +@import "responsive-1200px-min.less"; + +// Tablets to regular desktops +@import "responsive-768px-979px.less"; + +// Phones to portrait tablets and narrow desktops +@import "responsive-767px-max.less"; + + +// RESPONSIVE NAVBAR +// ------------------ + +// From 979px and below, show a button to toggle navbar contents +@import "responsive-navbar.less"; diff --git a/vendors/bootstrap/less/scaffolding.less b/vendors/bootstrap/less/scaffolding.less new file mode 100644 index 000000000..342dcf705 --- /dev/null +++ b/vendors/bootstrap/less/scaffolding.less @@ -0,0 +1,51 @@ +// +// Scaffolding +// -------------------------------------------------- + + +// Body reset +// ------------------------- + +body { + margin: 0; + font-family: @baseFontFamily; + font-size: @baseFontSize; + line-height: @baseLineHeight; + color: @textColor; + background-color: @bodyBackground; +} + + +// Links +// ------------------------- + +a { + color: @linkColor; + text-decoration: none; +} +a:hover { + color: @linkColorHover; + text-decoration: underline; +} + + +// Images +// ------------------------- + +.img-rounded { + .border-radius(6px); +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0,0,0,.2); + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.1); + -moz-box-shadow: 0 1px 3px rgba(0,0,0,.1); + box-shadow: 0 1px 3px rgba(0,0,0,.1); +} + +.img-circle { + .border-radius(500px); +} diff --git a/vendors/bootstrap/less/sprites.less b/vendors/bootstrap/less/sprites.less new file mode 100644 index 000000000..cc7c423c5 --- /dev/null +++ b/vendors/bootstrap/less/sprites.less @@ -0,0 +1,189 @@ +// +// Sprites +// -------------------------------------------------- + + +// ICONS +// ----- + +// All icons receive the styles of the tag with a base class +// of .i and are then given a unique class to add width, height, +// and background-position. Your resulting HTML will look like +// . + +// For the white version of the icons, just add the .icon-white class: +// + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + .ie7-restore-right-whitespace(); + line-height: 14px; + vertical-align: text-top; + background-image: url("@{iconSpritePath}"); + background-position: 14px 14px; + background-repeat: no-repeat; + margin-top: 1px; +} + +/* White icons with optional class, or on hover/active states of certain elements */ +.icon-white, +.nav > .active > a > [class^="icon-"], +.nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"] { + background-image: url("@{iconWhiteSpritePath}"); +} + +/* +.icon-glass { background-position: 0 0; } +.icon-music { background-position: -24px 0; } +.icon-search { background-position: -48px 0; } +.icon-envelope { background-position: -72px 0; } +.icon-heart { background-position: -96px 0; } +.icon-star { background-position: -120px 0; } +.icon-star-empty { background-position: -144px 0; } +.icon-user { background-position: -168px 0; } +.icon-film { background-position: -192px 0; } +.icon-th-large { background-position: -216px 0; } +.icon-th { background-position: -240px 0; } +.icon-th-list { background-position: -264px 0; } +.icon-ok { background-position: -288px 0; } +.icon-remove { background-position: -312px 0; } +.icon-zoom-in { background-position: -336px 0; } +.icon-zoom-out { background-position: -360px 0; } +.icon-off { background-position: -384px 0; } +.icon-signal { background-position: -408px 0; } +.icon-cog { background-position: -432px 0; } +.icon-trash { background-position: -456px 0; } + +.icon-home { background-position: 0 -24px; } +.icon-file { background-position: -24px -24px; } +.icon-time { background-position: -48px -24px; } +.icon-road { background-position: -72px -24px; } +.icon-download-alt { background-position: -96px -24px; } +.icon-download { background-position: -120px -24px; } +.icon-upload { background-position: -144px -24px; } +.icon-inbox { background-position: -168px -24px; } +.icon-play-circle { background-position: -192px -24px; } +.icon-repeat { background-position: -216px -24px; } +.icon-refresh { background-position: -240px -24px; } +.icon-list-alt { background-position: -264px -24px; } +.icon-lock { background-position: -287px -24px; } // 1px off +.icon-flag { background-position: -312px -24px; } +.icon-headphones { background-position: -336px -24px; } +.icon-volume-off { background-position: -360px -24px; } +.icon-volume-down { background-position: -384px -24px; } +.icon-volume-up { background-position: -408px -24px; } +.icon-qrcode { background-position: -432px -24px; } +.icon-barcode { background-position: -456px -24px; } + +.icon-tag { background-position: 0 -48px; } +.icon-tags { background-position: -25px -48px; } // 1px off +.icon-book { background-position: -48px -48px; } +.icon-bookmark { background-position: -72px -48px; } +.icon-print { background-position: -96px -48px; } +.icon-camera { background-position: -120px -48px; } +.icon-font { background-position: -144px -48px; } +.icon-bold { background-position: -167px -48px; } // 1px off +.icon-italic { background-position: -192px -48px; } +.icon-text-height { background-position: -216px -48px; } +.icon-text-width { background-position: -240px -48px; } +.icon-align-left { background-position: -264px -48px; } +.icon-align-center { background-position: -288px -48px; } +.icon-align-right { background-position: -312px -48px; } +.icon-align-justify { background-position: -336px -48px; } +.icon-list { background-position: -360px -48px; } +.icon-indent-left { background-position: -384px -48px; } +.icon-indent-right { background-position: -408px -48px; } +.icon-facetime-video { background-position: -432px -48px; } +.icon-picture { background-position: -456px -48px; } + +.icon-pencil { background-position: 0 -72px; } +.icon-map-marker { background-position: -24px -72px; } +.icon-adjust { background-position: -48px -72px; } +.icon-tint { background-position: -72px -72px; } +.icon-edit { background-position: -96px -72px; } +.icon-share { background-position: -120px -72px; } +.icon-check { background-position: -144px -72px; } +.icon-move { background-position: -168px -72px; } +.icon-step-backward { background-position: -192px -72px; } +.icon-fast-backward { background-position: -216px -72px; } +.icon-backward { background-position: -240px -72px; } +.icon-play { background-position: -264px -72px; } +.icon-pause { background-position: -288px -72px; } +.icon-stop { background-position: -312px -72px; } +.icon-forward { background-position: -336px -72px; } +.icon-fast-forward { background-position: -360px -72px; } +.icon-step-forward { background-position: -384px -72px; } +.icon-eject { background-position: -408px -72px; } +.icon-chevron-left { background-position: -432px -72px; } +.icon-chevron-right { background-position: -456px -72px; } + +.icon-plus-sign { background-position: 0 -96px; } +.icon-minus-sign { background-position: -24px -96px; } +.icon-remove-sign { background-position: -48px -96px; } +.icon-ok-sign { background-position: -72px -96px; } +.icon-question-sign { background-position: -96px -96px; } +.icon-info-sign { background-position: -120px -96px; } +.icon-screenshot { background-position: -144px -96px; } +.icon-remove-circle { background-position: -168px -96px; } +.icon-ok-circle { background-position: -192px -96px; } +.icon-ban-circle { background-position: -216px -96px; } +.icon-arrow-left { background-position: -240px -96px; } +.icon-arrow-right { background-position: -264px -96px; } +.icon-arrow-up { background-position: -289px -96px; } // 1px off +.icon-arrow-down { background-position: -312px -96px; } +.icon-share-alt { background-position: -336px -96px; } +.icon-resize-full { background-position: -360px -96px; } +.icon-resize-small { background-position: -384px -96px; } +.icon-plus { background-position: -408px -96px; } +.icon-minus { background-position: -433px -96px; } +.icon-asterisk { background-position: -456px -96px; } + +.icon-exclamation-sign { background-position: 0 -120px; } +.icon-gift { background-position: -24px -120px; } +.icon-leaf { background-position: -48px -120px; } +.icon-fire { background-position: -72px -120px; } +.icon-eye-open { background-position: -96px -120px; } +.icon-eye-close { background-position: -120px -120px; } +.icon-warning-sign { background-position: -144px -120px; } +.icon-plane { background-position: -168px -120px; } +.icon-calendar { background-position: -192px -120px; } +.icon-random { background-position: -216px -120px; width: 16px; } +.icon-comment { background-position: -240px -120px; } +.icon-magnet { background-position: -264px -120px; } +.icon-chevron-up { background-position: -288px -120px; } +.icon-chevron-down { background-position: -313px -119px; } // 1px, 1px off +.icon-retweet { background-position: -336px -120px; } +.icon-shopping-cart { background-position: -360px -120px; } +.icon-folder-close { background-position: -384px -120px; } +.icon-folder-open { background-position: -408px -120px; width: 16px; } +.icon-resize-vertical { background-position: -432px -119px; } // 1px, 1px off +.icon-resize-horizontal { background-position: -456px -118px; } // 1px, 2px off + +.icon-hdd { background-position: 0 -144px; } +.icon-bullhorn { background-position: -24px -144px; } +.icon-bell { background-position: -48px -144px; } +.icon-certificate { background-position: -72px -144px; } +.icon-thumbs-up { background-position: -96px -144px; } +.icon-thumbs-down { background-position: -120px -144px; } +.icon-hand-right { background-position: -144px -144px; } +.icon-hand-left { background-position: -168px -144px; } +.icon-hand-up { background-position: -192px -144px; } +.icon-hand-down { background-position: -216px -144px; } +.icon-circle-arrow-right { background-position: -240px -144px; } +.icon-circle-arrow-left { background-position: -264px -144px; } +.icon-circle-arrow-up { background-position: -288px -144px; } +.icon-circle-arrow-down { background-position: -312px -144px; } +.icon-globe { background-position: -336px -144px; } +.icon-wrench { background-position: -360px -144px; } +.icon-tasks { background-position: -384px -144px; } +.icon-filter { background-position: -408px -144px; } +.icon-briefcase { background-position: -432px -144px; } +.icon-fullscreen { background-position: -456px -144px; } +*/ \ No newline at end of file diff --git a/vendors/bootstrap/less/tables.less b/vendors/bootstrap/less/tables.less new file mode 100644 index 000000000..853b97e39 --- /dev/null +++ b/vendors/bootstrap/less/tables.less @@ -0,0 +1,225 @@ +// +// Tables +// -------------------------------------------------- + + +// BASE TABLES +// ----------------- + +table { + max-width: 100%; + background-color: @tableBackground; + border-collapse: collapse; + border-spacing: 0; +} + +// BASELINE STYLES +// --------------- + +.table { + width: 100%; + margin-bottom: @baseLineHeight; + // Cells + th, + td { + padding: 8px; + line-height: @baseLineHeight; + text-align: left; + vertical-align: top; + border-top: 1px solid @tableBorder; + } + th { + font-weight: bold; + } + // Bottom align for column headings + thead th { + vertical-align: bottom; + } + // Remove top border from thead by default + caption + thead tr:first-child th, + caption + thead tr:first-child td, + colgroup + thead tr:first-child th, + colgroup + thead tr:first-child td, + thead:first-child tr:first-child th, + thead:first-child tr:first-child td { + border-top: 0; + } + // Account for multiple tbody instances + tbody + tbody { + border-top: 2px solid @tableBorder; + } +} + + + +// CONDENSED TABLE W/ HALF PADDING +// ------------------------------- + +.table-condensed { + th, + td { + padding: 4px 5px; + } +} + + +// BORDERED VERSION +// ---------------- + +.table-bordered { + border: 1px solid @tableBorder; + border-collapse: separate; // Done so we can round those corners! + *border-collapse: collapse; // IE7 can't round corners anyway + border-left: 0; + .border-radius(4px); + th, + td { + border-left: 1px solid @tableBorder; + } + // Prevent a double border + caption + thead tr:first-child th, + caption + tbody tr:first-child th, + caption + tbody tr:first-child td, + colgroup + thead tr:first-child th, + colgroup + tbody tr:first-child th, + colgroup + tbody tr:first-child td, + thead:first-child tr:first-child th, + tbody:first-child tr:first-child th, + tbody:first-child tr:first-child td { + border-top: 0; + } + // For first th or td in the first row in the first thead or tbody + thead:first-child tr:first-child th:first-child, + tbody:first-child tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + } + thead:first-child tr:first-child th:last-child, + tbody:first-child tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + } + // For first th or td in the first row in the first thead or tbody + thead:last-child tr:last-child th:first-child, + tbody:last-child tr:last-child td:first-child, + tfoot:last-child tr:last-child td:first-child { + .border-radius(0 0 0 4px); + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + } + thead:last-child tr:last-child th:last-child, + tbody:last-child tr:last-child td:last-child, + tfoot:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + } + + // Special fixes to round the left border on the first td/th + caption + thead tr:first-child th:first-child, + caption + tbody tr:first-child td:first-child, + colgroup + thead tr:first-child th:first-child, + colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + } + caption + thead tr:first-child th:last-child, + caption + tbody tr:first-child td:last-child, + colgroup + thead tr:first-child th:last-child, + colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-right-topleft: 4px; + } + +} + + + + +// ZEBRA-STRIPING +// -------------- + +// Default zebra-stripe styles (alternating gray and transparent backgrounds) +.table-striped { + tbody { + tr:nth-child(odd) td, + tr:nth-child(odd) th { + background-color: @tableBackgroundAccent; + } + } +} + + +// HOVER EFFECT +// ------------ +// Placed here since it has to come after the potential zebra striping +.table-hover { + tbody { + tr:hover td, + tr:hover th { + background-color: @tableBackgroundHover; + } + } +} + + +// TABLE CELL SIZING +// ----------------- + +// Reset default grid behavior +table [class*=span], +.row-fluid table [class*=span] { + display: table-cell; + float: none; // undo default grid column styles + margin-left: 0; // undo default grid column styles +} + +// Change the column widths to account for td/th padding +table { + .span1 { .tableColumns(1); } + .span2 { .tableColumns(2); } + .span3 { .tableColumns(3); } + .span4 { .tableColumns(4); } + .span5 { .tableColumns(5); } + .span6 { .tableColumns(6); } + .span7 { .tableColumns(7); } + .span8 { .tableColumns(8); } + .span9 { .tableColumns(9); } + .span10 { .tableColumns(10); } + .span11 { .tableColumns(11); } + .span12 { .tableColumns(12); } + .span13 { .tableColumns(13); } + .span14 { .tableColumns(14); } + .span15 { .tableColumns(15); } + .span16 { .tableColumns(16); } + .span17 { .tableColumns(17); } + .span18 { .tableColumns(18); } + .span19 { .tableColumns(19); } + .span20 { .tableColumns(20); } + .span21 { .tableColumns(21); } + .span22 { .tableColumns(22); } + .span23 { .tableColumns(23); } + .span24 { .tableColumns(24); } +} + + +// TABLE BACKGROUNDS +// ----------------- +// Exact selectors below required to override .table-striped + +.table { + tbody tr.success td { + background-color: @successBackground; + } + tbody tr.error td { + background-color: @errorBackground; + } + tbody tr.info td { + background-color: @infoBackground; + } +} diff --git a/vendors/bootstrap/less/thumbnails.less b/vendors/bootstrap/less/thumbnails.less new file mode 100644 index 000000000..91b75f785 --- /dev/null +++ b/vendors/bootstrap/less/thumbnails.less @@ -0,0 +1,52 @@ +// +// Thumbnails +// -------------------------------------------------- + + +// Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files + +// Make wrapper ul behave like the grid +.thumbnails { + margin-left: -@gridGutterWidth; + list-style: none; + .clearfix(); +} +// Fluid rows have no left margin +.row-fluid .thumbnails { + margin-left: 0; +} + +// Float li to make thumbnails appear in a row +.thumbnails > li { + float: left; // Explicity set the float since we don't require .span* classes + margin-bottom: @baseLineHeight; + margin-left: @gridGutterWidth; +} + +// The actual thumbnail (can be `a` or `div`) +.thumbnail { + display: block; + padding: 4px; + line-height: @baseLineHeight; + border: 1px solid #ddd; + .border-radius(4px); + .box-shadow(0 1px 3px rgba(0,0,0,.055)); + .transition(all .2s ease-in-out); +} +// Add a hover state for linked versions only +a.thumbnail:hover { + border-color: @linkColor; + .box-shadow(0 1px 4px rgba(0,105,214,.25)); +} + +// Images and captions +.thumbnail > img { + display: block; + max-width: 100%; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; + color: @gray; +} diff --git a/vendors/bootstrap/less/tooltip.less b/vendors/bootstrap/less/tooltip.less new file mode 100644 index 000000000..fba1856f5 --- /dev/null +++ b/vendors/bootstrap/less/tooltip.less @@ -0,0 +1,70 @@ +// +// Tooltips +// -------------------------------------------------- + + +// Base class +.tooltip { + position: absolute; + z-index: @zindexTooltip; + display: block; + visibility: visible; + padding: 5px; + font-size: 11px; + .opacity(0); + &.in { .opacity(80); } + &.top { margin-top: -3px; } + &.right { margin-left: 3px; } + &.bottom { margin-top: 3px; } + &.left { margin-left: -3px; } +} + +// Wrapper for the tooltip content +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: @tooltipColor; + text-align: center; + text-decoration: none; + background-color: @tooltipBackground; + .border-radius(4px); +} + +// Arrows +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip { + &.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -@tooltipArrowWidth; + border-width: @tooltipArrowWidth @tooltipArrowWidth 0; + border-top-color: @tooltipArrowColor; + } + &.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -@tooltipArrowWidth; + border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0; + border-right-color: @tooltipArrowColor; + } + &.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -@tooltipArrowWidth; + border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth; + border-left-color: @tooltipArrowColor; + } + &.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -@tooltipArrowWidth; + border-width: 0 @tooltipArrowWidth @tooltipArrowWidth; + border-bottom-color: @tooltipArrowColor; + } +} diff --git a/vendors/bootstrap/less/type.less b/vendors/bootstrap/less/type.less new file mode 100644 index 000000000..58723f788 --- /dev/null +++ b/vendors/bootstrap/less/type.less @@ -0,0 +1,206 @@ +// +// Typography +// -------------------------------------------------- + + +// Body text +// ------------------------- + +p { + margin: 0 0 @baseLineHeight / 2; +} +.lead { + margin-bottom: @baseLineHeight; + font-size: 20px; + font-weight: 200; + line-height: @baseLineHeight * 1.5; +} + + +// Emphasis & misc +// ------------------------- + +small { + font-size: 85%; // Ex: 14px base font * 85% = about 12px +} +strong { + font-weight: bold; +} +em { + font-style: italic; +} +cite { + font-style: normal; +} +.muted { + color: @grayLight; +} + + +// Headings +// ------------------------- + +h1, h2, h3, h4, h5, h6 { + margin: (@baseLineHeight / 2) 0; + font-family: @headingsFontFamily; + font-weight: @headingsFontWeight; + line-height: 1; + color: @headingsColor; + text-rendering: optimizelegibility; // Fix the character spacing for headings + small { + font-weight: normal; + line-height: 1; + color: @grayLight; + } +} +h1 { font-size: 36px; line-height: 40px; } +h2 { font-size: 30px; line-height: 40px; } +h3 { font-size: 24px; line-height: 40px; } +h4 { font-size: 18px; line-height: 20px; } +h5 { font-size: 14px; line-height: 20px; } +h6 { font-size: 12px; line-height: 20px; } + +h1 small { font-size: 24px; } +h2 small { font-size: 18px; } +h3 small { font-size: 14px; } +h4 small { font-size: 14px; } + + +// Page header +// ------------------------- + +.page-header { + padding-bottom: (@baseLineHeight / 2) - 1; + margin: @baseLineHeight 0 (@baseLineHeight * 1.5); + border-bottom: 1px solid @grayLighter; +} + + + +// Lists +// -------------------------------------------------- + +// Unordered and Ordered lists +ul, ol { + padding: 0; + margin: 0 0 @baseLineHeight / 2 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +li { + line-height: @baseLineHeight; +} +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +// Description Lists +dl { + margin-bottom: @baseLineHeight; +} +dt, +dd { + line-height: @baseLineHeight; +} +dt { + font-weight: bold; +} +dd { + margin-left: @baseLineHeight / 2; +} +// Horizontal layout (like forms) +.dl-horizontal { + dt { + float: left; + width: 120px; + clear: left; + text-align: right; + .text-overflow(); + } + dd { + margin-left: 130px; + } +} + +// MISC +// ---- + +// Horizontal rules +hr { + margin: @baseLineHeight 0; + border: 0; + border-top: 1px solid @hrBorder; + border-bottom: 1px solid @white; +} + +// Abbreviations and acronyms +abbr[title] { + cursor: help; + border-bottom: 1px dotted @grayLight; +} +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +// Blockquotes +blockquote { + padding: 0 0 0 15px; + margin: 0 0 @baseLineHeight; + border-left: 5px solid @grayLighter; + p { + margin-bottom: 0; + #font > .shorthand(16px,300,@baseLineHeight * 1.25); + } + small { + display: block; + line-height: @baseLineHeight; + color: @grayLight; + &:before { + content: '\2014 \00A0'; + } + } + + // Float right with text-align: right + &.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid @grayLighter; + border-left: 0; + p, + small { + text-align: right; + } + small { + &:before { + content: ''; + } + &:after { + content: '\00A0 \2014'; + } + } + } +} + +// Quotes +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +// Addresses +address { + display: block; + margin-bottom: @baseLineHeight; + font-style: normal; + line-height: @baseLineHeight; +} diff --git a/vendors/bootstrap/less/utilities.less b/vendors/bootstrap/less/utilities.less new file mode 100644 index 000000000..314b4ffdb --- /dev/null +++ b/vendors/bootstrap/less/utilities.less @@ -0,0 +1,30 @@ +// +// Utility classes +// -------------------------------------------------- + + +// Quick floats +.pull-right { + float: right; +} +.pull-left { + float: left; +} + +// Toggling content +.hide { + display: none; +} +.show { + display: block; +} + +// Visibility +.invisible { + visibility: hidden; +} + +// For Affix plugin +.affix { + position: fixed; +} diff --git a/vendors/bootstrap/less/variables.less b/vendors/bootstrap/less/variables.less new file mode 100644 index 000000000..a5c8cdd98 --- /dev/null +++ b/vendors/bootstrap/less/variables.less @@ -0,0 +1,277 @@ +// +// Variables +// -------------------------------------------------- + + +// Global values +// -------------------------------------------------- + + +// Grays +// ------------------------- +@black: #000; +@grayDarker: #222; +@grayDark: #333; +@gray: #555; +@grayLight: #999; +@grayLighter: #eee; +@white: #fff; + + +// Accent colors +// ------------------------- +@blue: #049cdb; +@blueDark: #0064cd; +@green: #46a546; +@red: #9d261d; +@yellow: #ffc40d; +@orange: #f89406; +@pink: #c3325f; +@purple: #7a43b6; + + +// Scaffolding +// ------------------------- +@bodyBackground: @white; +@textColor: @grayDark; + + +// Links +// ------------------------- +@linkColor: #08c; +@linkColorHover: darken(@linkColor, 15%); + + +// Typography +// ------------------------- +@sansFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif; +@serifFontFamily: Georgia, "Times New Roman", Times, serif; +@monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace; + +@baseFontSize: 14px; +@baseFontFamily: @sansFontFamily; +@baseLineHeight: 20px; +@altFontFamily: @serifFontFamily; + +@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily +@headingsFontWeight: bold; // instead of browser default, bold +@headingsColor: inherit; // empty to use BS default, @textColor + + +// Tables +// ------------------------- +@tableBackground: transparent; // overall background-color +@tableBackgroundAccent: #f9f9f9; // for striping +@tableBackgroundHover: #f5f5f5; // for hover +@tableBorder: #ddd; // table and cell border + + +// Buttons +// ------------------------- +@btnBackground: @white; +@btnBackgroundHighlight: darken(@white, 10%); +@btnBorder: #bbb; + +@btnPrimaryBackground: @linkColor; +@btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 20%); + +@btnInfoBackground: #5bc0de; +@btnInfoBackgroundHighlight: #2f96b4; + +@btnSuccessBackground: #62c462; +@btnSuccessBackgroundHighlight: #51a351; + +@btnWarningBackground: lighten(@orange, 15%); +@btnWarningBackgroundHighlight: @orange; + +@btnDangerBackground: #ee5f5b; +@btnDangerBackgroundHighlight: #bd362f; + +@btnInverseBackground: #444; +@btnInverseBackgroundHighlight: @grayDarker; + + +// Forms +// ------------------------- +@inputBackground: @white; +@inputBorder: #ccc; +@inputBorderRadius: 3px; +@inputDisabledBackground: @grayLighter; +@formActionsBackground: #f5f5f5; + +// Dropdowns +// ------------------------- +@dropdownBackground: @white; +@dropdownBorder: rgba(0,0,0,.2); +@dropdownDividerTop: #e5e5e5; +@dropdownDividerBottom: @white; + +@dropdownLinkColor: @grayDark; + +@dropdownLinkColorHover: @white; +@dropdownLinkBackgroundHover: @dropdownLinkBackgroundActive; + +@dropdownLinkColorActive: @dropdownLinkColor; +@dropdownLinkBackgroundActive: @linkColor; + + + +// COMPONENT VARIABLES +// -------------------------------------------------- + +// Z-index master list +// ------------------------- +// Used for a bird's eye view of components dependent on the z-axis +// Try to avoid customizing these :) +@zindexDropdown: 1000; +@zindexPopover: 1010; +@zindexTooltip: 1030; +@zindexFixedNavbar: 1030; +@zindexModalBackdrop: 1040; +@zindexModal: 1050; + + +// Sprite icons path +// ------------------------- +@iconSpritePath: "../img/glyphicons-halflings.png"; +@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png"; + + +// Input placeholder text color +// ------------------------- +@placeholderText: @grayLight; + + +// Hr border color +// ------------------------- +@hrBorder: @grayLighter; + + +// Wells +// ------------------------- +@wellBackground: #f5f5f5; + + +// Navbar +// ------------------------- +@navbarCollapseWidth: 979px; + +@navbarHeight: 40px; +@navbarBackground: darken(@navbarBackgroundHighlight, 5%); +@navbarBackgroundHighlight: #ffffff; +@navbarBorder: darken(@navbarBackground, 12%); + +@navbarText: @gray; +@navbarLinkColor: @gray; +@navbarLinkColorHover: @grayDark; +@navbarLinkColorActive: @gray; +@navbarLinkBackgroundHover: transparent; +@navbarLinkBackgroundActive: darken(@navbarBackground, 5%); + +@navbarBrandColor: @navbarLinkColor; + +// Inverted navbar +@navbarInverseBackground: #111111; +@navbarInverseBackgroundHighlight: #222222; +@navbarInverseBorder: #252525; + +@navbarInverseText: @grayLight; +@navbarInverseLinkColor: @grayLight; +@navbarInverseLinkColorHover: @white; +@navbarInverseLinkColorActive: @navbarInverseLinkColorHover; +@navbarInverseLinkBackgroundHover: transparent; +@navbarInverseLinkBackgroundActive: @navbarInverseBackground; + +@navbarInverseSearchBackground: lighten(@navbarInverseBackground, 25%); +@navbarInverseSearchBackgroundFocus: @white; +@navbarInverseSearchBorder: @navbarInverseBackground; +@navbarInverseSearchPlaceholderColor: #ccc; + +@navbarInverseBrandColor: @navbarInverseLinkColor; + + +// Pagination +// ------------------------- +@paginationBackground: #fff; +@paginationBorder: #ddd; +@paginationActiveBackground: #f5f5f5; + + +// Hero unit +// ------------------------- +@heroUnitBackground: @grayLighter; +@heroUnitHeadingColor: inherit; +@heroUnitLeadColor: inherit; + + +// Form states and alerts +// ------------------------- +@warningText: #c09853; +@warningBackground: #fcf8e3; +@warningBorder: darken(spin(@warningBackground, -10), 3%); + +@errorText: #b94a48; +@errorBackground: #f2dede; +@errorBorder: darken(spin(@errorBackground, -10), 3%); + +@successText: #468847; +@successBackground: #dff0d8; +@successBorder: darken(spin(@successBackground, -10), 5%); + +@infoText: #3a87ad; +@infoBackground: #d9edf7; +@infoBorder: darken(spin(@infoBackground, -10), 7%); + + +// Tooltips and popovers +// ------------------------- +@tooltipColor: #fff; +@tooltipBackground: #000; +@tooltipArrowWidth: 5px; +@tooltipArrowColor: @tooltipBackground; + +@popoverBackground: #fff; +@popoverArrowWidth: 10px; +@popoverArrowColor: #fff; +@popoverTitleBackground: darken(@popoverBackground, 3%); + +// Special enhancement for popovers +@popoverArrowOuterWidth: @popoverArrowWidth + 1; +@popoverArrowOuterColor: rgba(0,0,0,.25); + + + +// GRID +// -------------------------------------------------- + + +// Default 940px grid +// ------------------------- +@gridColumns: 12; +@gridColumnWidth: 60px; +@gridGutterWidth: 20px; +@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1)); + +// 1200px min +@gridColumnWidth1200: 70px; +@gridGutterWidth1200: 30px; +@gridRowWidth1200: (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1)); + +// 768px-979px +@gridColumnWidth768: 42px; +@gridGutterWidth768: 20px; +@gridRowWidth768: (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1)); + + +// Fluid grid +// ------------------------- +@fluidGridColumnWidth: percentage(@gridColumnWidth/@gridRowWidth); +@fluidGridGutterWidth: percentage(@gridGutterWidth/@gridRowWidth); + +// 1200px min +@fluidGridColumnWidth1200: percentage(@gridColumnWidth1200/@gridRowWidth1200); +@fluidGridGutterWidth1200: percentage(@gridGutterWidth1200/@gridRowWidth1200); + +// 768px-979px +@fluidGridColumnWidth768: percentage(@gridColumnWidth768/@gridRowWidth768); +@fluidGridGutterWidth768: percentage(@gridGutterWidth768/@gridRowWidth768); diff --git a/vendors/bootstrap/less/wells.less b/vendors/bootstrap/less/wells.less new file mode 100644 index 000000000..e4e0a9beb --- /dev/null +++ b/vendors/bootstrap/less/wells.less @@ -0,0 +1,29 @@ +// +// Wells +// -------------------------------------------------- + + +// Base class +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: @wellBackground; + border: 1px solid darken(@wellBackground, 7%); + .border-radius(4px); + .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); + blockquote { + border-color: #ddd; + border-color: rgba(0,0,0,.15); + } +} + +// Sizes +.well-large { + padding: 24px; + .border-radius(6px); +} +.well-small { + padding: 9px; + .border-radius(3px); +} diff --git a/vendors/flags/flags-fixed.css b/vendors/flags/flags-fixed.css new file mode 100644 index 000000000..9b6fbfe68 --- /dev/null +++ b/vendors/flags/flags-fixed.css @@ -0,0 +1,32 @@ +.flag-wrapper { + width: 24px; + height: 16px; + display: inline-block; +} + +.flag { + width: 16px; + height: 11px; + display: inline-block; + background: url(flags.png) no-repeat; +} + +.flag.flag-en {background-position: -144px -154px} +.flag.flag-en-us {background-position: -144px -154px} +.flag.flag-en-gb {background-position: -240px -33px} +.flag.flag-en-ca {background-position: -48px -22px} + +.flag.flag-nl, .flag.flag-nl-nl {background-position: -80px -110px} +.flag.flag-ru, .flag.flag-ru-ru {background-position: -224px -121px} +.flag.flag-de, .flag.flag-de-de {background-position: -80px -33px} +.flag.flag-it, .flag.flag-it-it {background-position: -208px -66px} +.flag.flag-is, .flag.flag-is-is {background-position: -192px -66px} +.flag.flag-lv, .flag.flag-lv-lv {background-position: -112px -88px} + +.flag.flag-fr, .flag.flag-fr-fr, .flag.flag-fr-ca {background-position: -144px -44px} +.flag.flag-es, .flag.flag-es-es, .flag.flag-es-la {background-position: -16px -44px} + +.flag.flag-ja, .flag.flag-jp, .flag.flag-ja-jp {background-position: -16px -77px} + +.flag.flag-pt, .flag.flag-pt-pt {background-position: -112px -121px} +.flag.flag-pt-br {background-position: -192px -11px} diff --git a/vendors/flags/flags.css b/vendors/flags/flags.css new file mode 100644 index 000000000..e2808b47c --- /dev/null +++ b/vendors/flags/flags.css @@ -0,0 +1,257 @@ +.flag { + width: 16px; + height: 11px; + background:url(flags.png) no-repeat +} + +.flag.flag-ad {background-position: -16px 0} +.flag.flag-ae {background-position: -32px 0} +.flag.flag-af {background-position: -48px 0} +.flag.flag-ag {background-position: -64px 0} +.flag.flag-ai {background-position: -80px 0} +.flag.flag-al {background-position: -96px 0} +.flag.flag-am {background-position: -112px 0} +.flag.flag-an {background-position: -128px 0} +.flag.flag-ao {background-position: -144px 0} +.flag.flag-ar {background-position: -160px 0} +.flag.flag-as {background-position: -176px 0} +.flag.flag-at {background-position: -192px 0} +.flag.flag-au {background-position: -208px 0} +.flag.flag-aw {background-position: -224px 0} +.flag.flag-az {background-position: -240px 0} +.flag.flag-ba {background-position: 0 -11px} +.flag.flag-bb {background-position: -16px -11px} +.flag.flag-bd {background-position: -32px -11px} +.flag.flag-be {background-position: -48px -11px} +.flag.flag-bf {background-position: -64px -11px} +.flag.flag-bg {background-position: -80px -11px} +.flag.flag-bh {background-position: -96px -11px} +.flag.flag-bi {background-position: -112px -11px} +.flag.flag-bj {background-position: -128px -11px} +.flag.flag-bm {background-position: -144px -11px} +.flag.flag-bn {background-position: -160px -11px} +.flag.flag-bo {background-position: -176px -11px} +.flag.flag-br {background-position: -192px -11px} +.flag.flag-bs {background-position: -208px -11px} +.flag.flag-bt {background-position: -224px -11px} +.flag.flag-bv {background-position: -240px -11px} +.flag.flag-bw {background-position: 0 -22px} +.flag.flag-by {background-position: -16px -22px} +.flag.flag-bz {background-position: -32px -22px} +.flag.flag-ca {background-position: -48px -22px} +.flag.flag-catalonia {background-position: -64px -22px} +.flag.flag-cd {background-position: -80px -22px} +.flag.flag-cf {background-position: -96px -22px} +.flag.flag-cg {background-position: -112px -22px} +.flag.flag-ch {background-position: -128px -22px} +.flag.flag-ci {background-position: -144px -22px} +.flag.flag-ck {background-position: -160px -22px} +.flag.flag-cl {background-position: -176px -22px} +.flag.flag-cm {background-position: -192px -22px} +.flag.flag-cn {background-position: -208px -22px} +.flag.flag-co {background-position: -224px -22px} +.flag.flag-cr {background-position: -240px -22px} +.flag.flag-cu {background-position: 0 -33px} +.flag.flag-cv {background-position: -16px -33px} +.flag.flag-cw {background-position: -32px -33px} +.flag.flag-cy {background-position: -48px -33px} +.flag.flag-cz {background-position: -64px -33px} +.flag.flag-de {background-position: -80px -33px} +.flag.flag-dj {background-position: -96px -33px} +.flag.flag-dk {background-position: -112px -33px} +.flag.flag-dm {background-position: -128px -33px} +.flag.flag-do {background-position: -144px -33px} +.flag.flag-dz {background-position: -160px -33px} +.flag.flag-ec {background-position: -176px -33px} +.flag.flag-ee {background-position: -192px -33px} +.flag.flag-eg {background-position: -208px -33px} +.flag.flag-eh {background-position: -224px -33px} +.flag.flag-england {background-position: -240px -33px} +.flag.flag-er {background-position: 0 -44px} +.flag.flag-es {background-position: -16px -44px} +.flag.flag-et {background-position: -32px -44px} +.flag.flag-eu {background-position: -48px -44px} +.flag.flag-fi {background-position: -64px -44px} +.flag.flag-fj {background-position: -80px -44px} +.flag.flag-fk {background-position: -96px -44px} +.flag.flag-fm {background-position: -112px -44px} +.flag.flag-fo {background-position: -128px -44px} +.flag.flag-fr {background-position: -144px -44px} +.flag.flag-ga {background-position: -160px -44px} +.flag.flag-gb {background-position: -176px -44px} +.flag.flag-gd {background-position: -192px -44px} +.flag.flag-ge {background-position: -208px -44px} +.flag.flag-gf {background-position: -224px -44px} +.flag.flag-gg {background-position: -240px -44px} +.flag.flag-gh {background-position: 0 -55px} +.flag.flag-gi {background-position: -16px -55px} +.flag.flag-gl {background-position: -32px -55px} +.flag.flag-gm {background-position: -48px -55px} +.flag.flag-gn {background-position: -64px -55px} +.flag.flag-gp {background-position: -80px -55px} +.flag.flag-gq {background-position: -96px -55px} +.flag.flag-gr {background-position: -112px -55px} +.flag.flag-gs {background-position: -128px -55px} +.flag.flag-gt {background-position: -144px -55px} +.flag.flag-gu {background-position: -160px -55px} +.flag.flag-gw {background-position: -176px -55px} +.flag.flag-gy {background-position: -192px -55px} +.flag.flag-hk {background-position: -208px -55px} +.flag.flag-hm {background-position: -224px -55px} +.flag.flag-hn {background-position: -240px -55px} +.flag.flag-hr {background-position: 0 -66px} +.flag.flag-ht {background-position: -16px -66px} +.flag.flag-hu {background-position: -32px -66px} +.flag.flag-ic {background-position: -48px -66px} +.flag.flag-id {background-position: -64px -66px} +.flag.flag-ie {background-position: -80px -66px} +.flag.flag-il {background-position: -96px -66px} +.flag.flag-im {background-position: -112px -66px} +.flag.flag-in {background-position: -128px -66px} +.flag.flag-io {background-position: -144px -66px} +.flag.flag-iq {background-position: -160px -66px} +.flag.flag-ir {background-position: -176px -66px} +.flag.flag-is {background-position: -192px -66px} +.flag.flag-it {background-position: -208px -66px} +.flag.flag-je {background-position: -224px -66px} +.flag.flag-jm {background-position: -240px -66px} +.flag.flag-jo {background-position: 0 -77px} +.flag.flag-jp {background-position: -16px -77px} +.flag.flag-ke {background-position: -32px -77px} +.flag.flag-kg {background-position: -48px -77px} +.flag.flag-kh {background-position: -64px -77px} +.flag.flag-ki {background-position: -80px -77px} +.flag.flag-km {background-position: -96px -77px} +.flag.flag-kn {background-position: -112px -77px} +.flag.flag-kp {background-position: -128px -77px} +.flag.flag-kr {background-position: -144px -77px} +.flag.flag-kurdistan {background-position: -160px -77px} +.flag.flag-kw {background-position: -176px -77px} +.flag.flag-ky {background-position: -192px -77px} +.flag.flag-kz {background-position: -208px -77px} +.flag.flag-la {background-position: -224px -77px} +.flag.flag-lb {background-position: -240px -77px} +.flag.flag-lc {background-position: 0 -88px} +.flag.flag-li {background-position: -16px -88px} +.flag.flag-lk {background-position: -32px -88px} +.flag.flag-lr {background-position: -48px -88px} +.flag.flag-ls {background-position: -64px -88px} +.flag.flag-lt {background-position: -80px -88px} +.flag.flag-lu {background-position: -96px -88px} +.flag.flag-lv {background-position: -112px -88px} +.flag.flag-ly {background-position: -128px -88px} +.flag.flag-ma {background-position: -144px -88px} +.flag.flag-mc {background-position: -160px -88px} +.flag.flag-md {background-position: -176px -88px} +.flag.flag-me {background-position: -192px -88px} +.flag.flag-mg {background-position: -208px -88px} +.flag.flag-mh {background-position: -224px -88px} +.flag.flag-mk {background-position: -240px -88px} +.flag.flag-ml {background-position: 0 -99px} +.flag.flag-mm {background-position: -16px -99px} +.flag.flag-mn {background-position: -32px -99px} +.flag.flag-mo {background-position: -48px -99px} +.flag.flag-mp {background-position: -64px -99px} +.flag.flag-mq {background-position: -80px -99px} +.flag.flag-mr {background-position: -96px -99px} +.flag.flag-ms {background-position: -112px -99px} +.flag.flag-mt {background-position: -128px -99px} +.flag.flag-mu {background-position: -144px -99px} +.flag.flag-mv {background-position: -160px -99px} +.flag.flag-mw {background-position: -176px -99px} +.flag.flag-mx {background-position: -192px -99px} +.flag.flag-my {background-position: -208px -99px} +.flag.flag-mz {background-position: -224px -99px} +.flag.flag-na {background-position: -240px -99px} +.flag.flag-nc {background-position: 0 -110px} +.flag.flag-ne {background-position: -16px -110px} +.flag.flag-nf {background-position: -32px -110px} +.flag.flag-ng {background-position: -48px -110px} +.flag.flag-ni {background-position: -64px -110px} +.flag.flag-nl {background-position: -80px -110px} +.flag.flag-no {background-position: -96px -110px} +.flag.flag-np {background-position: -112px -110px} +.flag.flag-nr {background-position: -128px -110px} +.flag.flag-nu {background-position: -144px -110px} +.flag.flag-nz {background-position: -160px -110px} +.flag.flag-om {background-position: -176px -110px} +.flag.flag-pa {background-position: -192px -110px} +.flag.flag-pe {background-position: -208px -110px} +.flag.flag-pf {background-position: -224px -110px} +.flag.flag-pg {background-position: -240px -110px} +.flag.flag-ph {background-position: 0 -121px} +.flag.flag-pk {background-position: -16px -121px} +.flag.flag-pl {background-position: -32px -121px} +.flag.flag-pm {background-position: -48px -121px} +.flag.flag-pn {background-position: -64px -121px} +.flag.flag-pr {background-position: -80px -121px} +.flag.flag-ps {background-position: -96px -121px} +.flag.flag-pt {background-position: -112px -121px} +.flag.flag-pw {background-position: -128px -121px} +.flag.flag-py {background-position: -144px -121px} +.flag.flag-qa {background-position: -160px -121px} +.flag.flag-re {background-position: -176px -121px} +.flag.flag-ro {background-position: -192px -121px} +.flag.flag-rs {background-position: -208px -121px} +.flag.flag-ru {background-position: -224px -121px} +.flag.flag-rw {background-position: -240px -121px} +.flag.flag-sa {background-position: 0 -132px} +.flag.flag-sb {background-position: -16px -132px} +.flag.flag-sc {background-position: -32px -132px} +.flag.flag-scotland {background-position: -48px -132px} +.flag.flag-sd {background-position: -64px -132px} +.flag.flag-se {background-position: -80px -132px} +.flag.flag-sg {background-position: -96px -132px} +.flag.flag-sh {background-position: -112px -132px} +.flag.flag-si {background-position: -128px -132px} +.flag.flag-sk {background-position: -144px -132px} +.flag.flag-sl {background-position: -160px -132px} +.flag.flag-sm {background-position: -176px -132px} +.flag.flag-sn {background-position: -192px -132px} +.flag.flag-so {background-position: -208px -132px} +.flag.flag-somaliland {background-position: -224px -132px} +.flag.flag-sr {background-position: -240px -132px} +.flag.flag-ss {background-position: 0 -143px} +.flag.flag-st {background-position: -16px -143px} +.flag.flag-sv {background-position: -32px -143px} +.flag.flag-sx {background-position: -48px -143px} +.flag.flag-sy {background-position: -64px -143px} +.flag.flag-sz {background-position: -80px -143px} +.flag.flag-tc {background-position: -96px -143px} +.flag.flag-td {background-position: -112px -143px} +.flag.flag-tf {background-position: -128px -143px} +.flag.flag-tg {background-position: -144px -143px} +.flag.flag-th {background-position: -160px -143px} +.flag.flag-tj {background-position: -176px -143px} +.flag.flag-tk {background-position: -192px -143px} +.flag.flag-tl {background-position: -208px -143px} +.flag.flag-tm {background-position: -224px -143px} +.flag.flag-tn {background-position: -240px -143px} +.flag.flag-to {background-position: 0 -154px} +.flag.flag-tr {background-position: -16px -154px} +.flag.flag-tt {background-position: -32px -154px} +.flag.flag-tv {background-position: -48px -154px} +.flag.flag-tw {background-position: -64px -154px} +.flag.flag-tz {background-position: -80px -154px} +.flag.flag-ua {background-position: -96px -154px} +.flag.flag-ug {background-position: -112px -154px} +.flag.flag-um {background-position: -128px -154px} +.flag.flag-us {background-position: -144px -154px} +.flag.flag-uy {background-position: -160px -154px} +.flag.flag-uz {background-position: -176px -154px} +.flag.flag-va {background-position: -192px -154px} +.flag.flag-vc {background-position: -208px -154px} +.flag.flag-ve {background-position: -224px -154px} +.flag.flag-vg {background-position: -240px -154px} +.flag.flag-vi {background-position: 0 -165px} +.flag.flag-vn {background-position: -16px -165px} +.flag.flag-vu {background-position: -32px -165px} +.flag.flag-wales {background-position: -48px -165px} +.flag.flag-wf {background-position: -64px -165px} +.flag.flag-ws {background-position: -80px -165px} +.flag.flag-ye {background-position: -96px -165px} +.flag.flag-yt {background-position: -112px -165px} +.flag.flag-za {background-position: -128px -165px} +.flag.flag-zanzibar {background-position: -144px -165px} +.flag.flag-zm {background-position: -160px -165px} +.flag.flag-zw {background-position: -176px -165px} diff --git a/vendors/flags/flags.png b/vendors/flags/flags.png new file mode 100644 index 0000000000000000000000000000000000000000..7b3a380895c1f5d236075fc64f506a5352fb2350 GIT binary patch literal 78832 zcmV)TK(W7xP)9u?PyxYE6oc>rA|L_^0)iMy z1ZfcnRUkl$q>zLpq;9s~nN#0C&Y8LQ?ruO|-}!vzGjr$OGp9YzbDr`$&kd}#{3pk` zKU!d;$N*prL?Yymw{L|pWf&s?P|E#QRf7SPKMgRv&-)CJ`Ej2g34bs8-*2^OD>^$n z)AB+HRq5123k z+S`i;&|rkXC{zDz<{ zDhROFrft`N@^tsd-z}g!nIOPm5C)9$)2s~27$Rj5#+{Ke2xZ8HQ1QctlI{y(h$7Is zxTl4;!y`=L9KMMr2kg_g?*n}Ps`Ilc*YjG%c&_?u8@IMUMb;QDHV1RX@Z}t^^JX0O zoAuDsPBMFkefOKpynhDJ1_;Ld>X&p2LpGNsiWJ5elrjjTkP62<$`r1`-wOrV5Vqe8 zB30U8RWyKKQ$E{o_W#YJyH_#!=oSF9wI~$=(+L7iCL^#`lFLbq5o9hFSSc_Z%4oDvD63FLp^QXoe>DoJB{S}rL0elJKmF-XUHwL5v;ipz zlqMquR!VYGVuawBF&4Q+4?+uK9rN(L5AzdX{?%8rfdX*{Xlg1ohfPvgqj>ri#hNxr zKCe(xB9)>}N=DC^!Q)ZD>g%@Vxu}*yR+SUxBOYzpo)hI#9th9ins07I7>hIptsHS{ zYthzn@8rA40xh>qcm3BIV+>iXxo=|+$5)1gT66#UZqBRDpp_y}0wX0xN zs#O?Z%QMaZYn|jU#+5M!w8nZNgi`6f6#}H>Z|}cPr-HM`B(!U>Ho#cVV8)_tfHoO4 zA=+5~%$*m_?xuD<+;^W7Hr80Q4$vC3cC;vENKSR}4c=!=xR4M*)v!NMHenQxzx*Ox zeoa66Lu;(kpcR2qWRxP5(v4%$wR^@4ZkSia16PgZ)Km8*`fxLBl;>Nc#?sK#z)OoG zu4rC`R))NgoP6XqWU~RM9J2#6XD#C4UreVhQrtGFg~Q%_lE3VGA`uykHE#HfaeXz$ z@vt`j-XgW-wtHqnx8mx9+yEL2#*dBi<(0K4UtVe_OrDd zTGCq63IeiO*M&7}*P^6EC6gosHWpYBW8)YT$80ROENt#1mJ!WWEg)c9U>KIWR;(n_ z8f!Gyeor!Qk*1|qVzgw(F_Ik)m7F|PkdK^DxvsSp0X*9MJh>0@{MXvG(A9+%k`w>= zDX|IpulNr)4TG!77+h6GP8n8pMU;gBkWWWIt@)CS(LCJN%eN~-w&{uZNm~y} z2u`dF5bF)MuIuCn)gejA> zEp_FRvxxDnwFE(cN>n>*F{@TN0px{?H8DYJC)x8Cqkh|reme(#UXYTor3H;!yrhAR z(s}~+0@65QR>q&!qD|p*V|f6=kj*;TGk30ai<|@@Ey$Q1d5t~8w`gDuxxr0T?Y$fE zh(NBQ1{MjYVjuK}l_Bt@`~ovBLst*6xK@i$_Va!RA7xnNX5}YFi}dD0=MS&;EK`P@{J*1pg*36t%B^x z5p;G5X17DHwg?H+j@q2cxC?@i?rbIBe|#PgVGQZ&Y?WfCjOD7;okVerm4YgzxV3x7K2@SYt81ZeuNF z0W^JMJ(n^RYaH`S31iG0cF(;|OT`j06_r$Nzb$14TnOd$%=_#8eDR0hviRfWYC&*u1+2u|VKdy`We%mFjDmznB1p5GbV( zQX+*wCaeFMXChwy8@9cJ%;863XT6GyEwPM=R79)=^m;qEp_(J|bu8WYGGd!ymqEW{ z`tp-dpC^NDIrN)%v1F_75yUZPJ$WJ7rUne~U`HLl8_~!E@AtBQwuYQl%ox2dr+oPV zkFS!5N)X17>v$64`IL>gnyS_Jqs;DrBotl%NQu>o_q+3qFpBw7B4WWtArP@(s8zh) z8L>lk=*=ie2n?zE4L?;ovs(3H{2VA{P)Z}E>31)sK}yYVSKuXG{EFeB@ z0@miqU8=A>J#LQU*v(HAVSp`a4UM@X;p3U#=3hp4KZCJ~u=+4;#ld|R0NAw=lrU78 zE{@2)$e8kZlm(KC(W59o@Ir#2o29@1?Bz%J@{>2o4jx5S<}=FaVr_elwa-3FQ&Us_ z`UjvnAw+sDtFA_V_q((|Iu{xnd3sHjEoyoQmFDHayRz?~FX&j%#(|rUqIFm;mz=pf zSO4;5PCR@fW!Zp(_8h|Q&$&gQuH*h`6|Mte0~8S7}z^On#BEx1g5eAwd<~s zj|eJq*eF6phP=uX$(Yz{00uD1N&dqhzmaKSE6dz3zfV?lamiyp zAgFN?RRKq}z|F6J&WuIf)LTtPYwmpPZC)MKz@(;LW(keZPGDt+O+hTV6jQqw+8QA5 z2u{0636*9%nzd4Ld3C@woiRcPrq*V7vR$x+)ffR<2(sS6DTH$zY2_GPD}(IE^x6@P zXa3|_;$~FJBBf0Qz%Opyg9|TulWVVe&j}0-Kf8WMF248;gfQuQK{+EPvH6qLQwYq0 z3UW6tMO@zi^#vb*6(arJ%08M$s(o0Cjb6f-&#^{gduL*E2lbnOV+<$uyujX_OEBfD zDBEHJl?VS9K~;6hZ+lkU$k=@^Vd%~~pz@8Zn?HvjETgG$(5CDEy3_w|{Y$U#r<#MA zy;8Eylw*|U@6XI(&hQ#0W;9Pe{|ToazXQ*`_8C%YUVeKiVJ6^(*BATw18ppMp`F_A zO&qD6$>UaiTQC8Vd+*RQT07H88?17xfBBekl#L$47t^NEeD>Ld)iqRZ(?QpqkG)o) zF~&J%{~rW^a`uKYNa+N?vU&Bah%0HCzK)K|%lY!1O2Q8ZF*e?aj@$|m#&P0^cWSy) zPIdej1wh~@t0#((QX+&Pj$`6D#t4D_d@0#i%rRY__5GwZ$N0LqzAN+G01NyB;Py~4MSn!tevv|zO1 z`M<8<``>>JDJ??iREvO!b4@_&8*dOr5ylv-wOnyUo{v8a*|XfR&CToi$t@XPk0PhO zhatACjEapL*&ron6f+!t1-2HO+XtfcfWTH9INzPAPe;A_<*pbb4{x(bB`?!?hi|hZo1<2Qb=il0x za#%=4Ehn(hCWMTS9}xtFIJ+(!`(6BVPPDE$5s=+Y^7Hdau3cdHY?0*f})=>3(nizXU*{ zS_)~1MZk#7m$BrN&3R+e1mrscB?V)*U4rh3u(7~+TQCWw1c_aktP=l%`fvRNU@cNg zq9{s*fQcgPUtc5|+Ju#g+^6#)j!~ju0!Sl4_^^*sSgDapvZr3oUcIkSf8u|a)Y4cw_ zf=VU$$(jy+Sd(Gqx|k@AIkhpz_gA)a@8B}$pb`S36}>?B?PrtS>lSR!O00EJ3#(=6 z)i`ISH5!b27FLhsN6{Y`^6L%M*Vp%7{U%MqKInV}TMEG?AAM9Z{y`A1Xwg<2fBf;O z07<@Iupr>bBPB|~{l5*k;9SLPuZ5|AaG@@Rl#+QJhKaQnp)J;Xv7McN5Vq=@80*YR z(^HrWV<4Bcyt!VZs6r2_=Fx>m5yywnD(Cafl`k^x)B6e4bSk#rj*7#NBD>i^^lY3- zu<9lzP7su5Uqi}j1|NJd_L57m>(-U}PL#qbU09s7ChMPPwZ;w`2Ggbir-9eHj@@qp z6Gji_x;tKTHoDPB=^{H;TjE&pi~D912A08f<$yw-x<5hVRIFMKR${GmT2Jw{o&H-qoB9JnT3ulVF(^g6*O`3%8_I!HvHoj64r8MKm zk7v%DIe?4(3n7T2h&Yb1QG}g0pUMwEa*oF+LdP*OhDhfT+JzAl0pKQEV5Dn@e)cJ% zttOJ&W*e-vMDynI<zi3VV_#Q5+iLNKi^Lq6za@ zGs^weD2z3bEjaS}34o-o> zxgrB=@=55bpa#2eR?+A53eA;p^BaQzjSyMl*b>KO%#F9K`_bzR041BCmKK~6|}TCA)quP zl|)K+CM$(f3Z?D3pw|Oy zlqMWHENz!nigowj&+uu}uwlr$JMW@t`>n9bV6_6HG0N8;3xqNZtIeevK;ppB)~jvC zxKOyCRMSw6N+B^|r6MzAD53Y#BAqb$K|`bS;A-b{2$ceAH4VfV%V3QzF z5EPg_2sMHA(E+0|D2NrNope<$W=a5BTM490oqBk?8v+UtA9omI$mMeBy9N>pGoG=O zm-iPUp)mx6G?f>^f7;@%CO}({Yw<7xhYPU21;)=mY&9_;jv(@99M`a39L8^>L$PrW zhiBek`ww5I{^RN7MvO%5cOb^(2c$og50w`8KXGstMOus(0LB;w*H`kw8;jX)^Co7! zvy|56I^tNPt@E+uBf+I-?8d}#Ly3jvPcOJAQ2yK_$TnZ<1hkc43&Na4qeFR3z&H&6 z=X1H~w$~W<8c3;V$qn&18OP+(C}f%YER9BKjk2D9tVYKg+8`*I^#8-L{o$|KwQD1~ zBSCMsLU+QlkB&=yLdB=qp@0NT9Dv)?A6?b>AGHXUQHnTB&O?DUTi|?O3aEm)3kxW_ z;W3$L`kBez9rA`&nMrCi)IK1 z{z|V3RM9=jGhc!6{cpJa%YNuSV+?BCxO9#bVE*wBOc;W3p6TQ`;e->?`@Vvtn6~;d zesT=E=byBR0=h3!hDbROONw0c03(Nn@l>LK957`#1fa2h|sp-@j6 zpacUv8|XIx<2cgSk-$rfPu1_)g#E8%;j2F_yyfDTpfhs)^mcrDFN#on>AgRVfvPMV zdI59}P*q>#tfD`m*FXU8*$Ia<@W)?{<1AP9fv!bV`U;T-in=n)HeF>8p!=U>5lCrfkXJSq|i6SrESCaSOxpP5O zv0(S{m{^k?HY|<*BAmZPSz7`h2H5(!w=mgG8W$W=Dq)g}06n$9djp=pq90ztOW|m) zzIz_mG<{4qgdeXN$px+5oV3qy+W&A5VV}0ELKPhKPuzTlMNKH;vV`_1u2&U!VC0FJ z(y>>%L~^F6!cClw-|ahj&`$~v%*$@v#vcJwr$R30RF9<5DgM1ELXrwH&*))De)xCD zsy=k*e};l=&hd_kyl@9h4onuzuc7HhuJEX`yF6li@Hx-7s6ht;vJ zP4Pd!d5l+P&*Y#T-oPRV0!82*1|c$4O^&;0B2rmq-2D##uD<;+-*1aiA;HKVtkf__ z5m-egqX@H-$y1N^kX~mS&A9CjSN@`_eR+ei25pLe06AP_3G6C)YjG(${l|k!M-ct zw-0!9U!e^_KHsnYtv~)2pPsmcEh9zmJMYl_(o1BTnm}t*SC=ESiVCdO$mPqaKIBlU z5Bet7S}LbiLIqrXkRLzm#y=AzOw~mY`1uR{{M*8{yL$%bKikW*4{ggS7amTuU_Q3H zo9_%AMqP6gf19&`J?k=r%9%C^7$s@{>=`qt+T4wg?)p8bbr`b|jK*5y%$OkYcX*S= zN{m;N+vYyznt9Xhe*P?h(O`^2L~2c7Txd2_vdF2Yv0BnS?KS|eJNY^v)^qfutwtNo zUK4xCqImYh5M`93OI4u1$AA1dJog+|A9oz=zdxq35+kMaUC;-L3l7j@4ANSpwal13 zo2-KD=AQmAV2$g)+cAO7jl~K@R?Ni)3XLQX3OiHM{iLJ6K|j7arLkX}KAa#3XuR|i zXRf9WO^KE6n)tdFKRv_y0IcQF=R26YDCUGi59W_AwsFF)&yWdX2%O`?O}xMw!9PEb zXl=<+kmHsWYkSe!qD6oeOTp?wxjmB*> z+NoHrX*%yhY!I+^`Y%u&9Som-7q&LXr}=;KtB-yG^MGCb`1Pzz3BN2T!=SOYqjU_d z@TVjQS}_LhGf%<%iB!Jz3Yqo}Y(7tRPy=}tFsZkjc*$bN^g^N&N2iqJ`ix&#bF#Yv zMz6(m{EE1HEuyoN%0X`b1A)X?i8X?tY^2i+T=TK(*Sh&j_9CQ=t_vtgkASpF5)5rF zAR)1=>iiO&Fu74Ycw7(GR${H>z~&7c@o)yAB+5h5N7j!lXike4v10LJ^zp}|o0^f4 z^pIQ}vm21sAdF4-g|wEJfvLe{eG9}&u-XehPrsF0Vg{c}6j?;nL%88`x>g99{`gNa z<61G!kL*Opij@GY+2|azYUxtvuuRZ@QWo~%2ua3|e-@0xUn_X;lU{^0oOHx@_`~yp zllJ&CnLuI#fz`r?Ap}CYuwSA`I3%h^F6jWQX8L`CqxW$d!=rx{OgUd5r1MZpVq`cHZFMP=V==bi6f@R%IICM_%fc+5^?pVZO{KQ+ zHrrsY`zc(1J$CWpQaEmrcRHzma9sm+xd!f>Go2lV?!@V1PNVteo3YlizHK=|Duzv; zp0?w*1=E@F`3!a+wg)s&I{sFpjD!F`hW!~oxq^#+JYBOh=S-MLZv7YJ7cVDhDyMSH zNH#24!)JOhn~P7eQZV|l#~_n&?TBNRoplxpxaFpsxMIqb5w-)rWkz6zOlRX=$1t=(V9O;YVF7KO z#)|iy09FaN;wQ8tg%`x`8u}<)7DzqRN?YEU(~A&>Q;s^B2WG^azW3vVfk+!}wLnOZ zL_#^6KVg1lP%6M$fs&G^UY2MrQBwGF8liQm08pT zpwbOY5~;oBVkAPj>!{jM%({IR?avhLWd-afpTN(5fo*sRb z>T|hq_vzHxa?HAo1WI5VH>2AMPI>j)1SZ4ihB4T{rYo4nd5D$wA`{{msf6kK3jlys z2b_SYsNr|Z>e(U~N+>LIdpGBRErzh+ouz0Y38dSU^`lkgC}Wv6EXH~QoO0DwY}mMw zb?eq~=DFuGZ0JzNwzi`4d1{`#2PFg>^%K;!ShCh))iUI|tFRbE1l?ys?T831d$3kH z&C{C-)+FXaaxYUR49jY1zX5m!r{0G>+~tDH ziZW6bB@J(W&_fh!&OG*X?s+Qa%zYlAtgIl(gwQCJO*H@)qtw1USR>hCyx^U=P5|sM z!EdAy8ewz_RZTPir8QE!(A<`5RSBaN-*5M&a15kmVJ8}R9D?j407R((Fs1Qbd>HZr zptVvXY7*Pj+o?ASY8xG)fB8E>*=c?gPMH%VWmSrgllraOxu~q$zATM&yB3W^T8Xd% zVI|TCgmurAE%p4QX2aH7!>?|`PQ42I*}~E>7@+;VCPG_{v6`xiYBsd5XJN;Db_^!c zIDTt4;hlLFvzU&27o!G`LMqSbUWO}E7=LAaY+ottw?xqjQltq<38NL}MYw##rL1VW zieUaa>g#*3N)o+3hb3d0IJCN*4KjB41+97Wg2Orc&tR8Tv3m7*e-SJFFhzg_UO@zlxe-FpW_d zk`-8Dj3P8Db+iqykND{U-nW5b`U?lLqQ|n+*fMt6+;aWdmN(zsE)|6De6NS=-x$OT zJ^kr#O|Rm{-%5UUxuA8VpF1P^X#!}KIyXtRE$8#Fkz_^nA3@~Flv%PF%Qi=z1BBGx ze=4?8f^_qrJK5yv)jP&pC^^lJ>=bmsDcRwC;!8acu2%RJoD$xMk2x^Zr7eyMtetQUB z|4`DK7aY2`V?rSd0wC2O1gZKZl;G1E#g1LcidQ5Egy8+bg%z|^15h5yDh3b$Mc1PD z1zv^T<;QUGA&RA43Soqgp-SX@!Tr0qa>u=r=7gXGp=?! zmj3Q;YWLX(ausZN>Iuf2cNsb>Sl7OenyMPK(NL2paen-L|4r!P&35AefS9EI23P;m zmFw8DYZ=XIDSEZTFB~l;=2O82zjM(_$z5OG%|SQq#A5vk(^oF!7_R|z&4-|&j71Bx zTy;|~N-8dVX&!g(JB}%5okf+9+5YRgxy{?=N;Fytpk@8bl3^srUsReK=~LRwyZyN4*! zTzJxX-1XI?N`t@VANKUvJI~NN(mpa@Tf&Ck;>gmEl|GwBZny7oka*$UEh-aTWg)Sd=t!HTz?1-J?XO$B{rrJg~TOB2o9Y5B+vcs z2$WGAa@^zCv12_53o3G&EjBm&`Qa>am*valhK}_Mx!>*rQ8!mSGoODv_MH?Jy3-Cj z@ZGb|W|v)d;b{eXYe|oaF`n6tk?7>!`g{M(8ilrsnoPt!9uK0FqOCLJ*gs@Bb5bwo zPri{kQzr4Ds6=YZtUq^i%haFn^isjpzmy?0j2&DC9ewDpwwALGUBkY+NN0naViTaC zi6-j4id?wQ8i~ya@>R#OO6`PMA5dA*iQKq?hKDbqcDGYlJLyDv4!((+4-bWMh1G8S zmt-;wx#)bin< zn|LI#*}W>C*z(Fqly_JnAf5@CR)twofHMCpP|{$$<|h;|1E~Ob_g(C*w_;bV8khl# z+7Cb*tmv!BZNR!|KSOM6W7Hr2%(U%qWY(zJO#ko} zSPKm4-+yDRgAW(?V-xi|CNA1*o-qFag5ZebA9E&x(wLa}Yf6nrLJEPGfgI^E)6icByoOXg4+1o}}ZM-%?ME{pfCnym~v0fxr&& z3H+RTVx5Ldl0o^vkjl_9q}pv0je)X}Zo`6ha7MBcvWl@IYh9>GCmMip8h}!? z)VDa>UTZ$yR`QQ;_|;dd6uLXs6hVQD1b~!^mX;Q8hiQVq+3xPD0B18XR`rK+3Xn$8 zQr+TLckQtTvV@?NR;5r%qg`m4{|ri648;YoJM9EF-U!!T3te3$?+B7)cg5|mf}ia; z4QnmEZ@taNM}AM)$dRBmZNI(;BPH49W->#D@Wp8-GWfJJ+3(PU+3&!=Q1?`w(}4Q) zKO1H+N)xo!d~N%cC%`h_f1|XIH5Zakq*uSGrot!O5ENA4Ak&Pok@G#EsHm5OIk$Of z!k&_UzF$Y&X;`sJvEoa`)SD6m+$|u@*=Fy5QD~zOh}5T{{Hial3-f8K(dZQ1BbB1L zrX`(srJ6YT3CYQmy2)e>cm8P$Mh)^ILhT|YMi(47amZXU~xQ$7P$`R;$}| zYr``SVtR2{a{;EtA(vWD*#qY~Z721BwJiIW(0%{Tv2ZbnENO1U!4+WIVD)w>&5#2Y z0VjWtuSRbcBNB^;!T=%kEbNaigZ|G3`VBzMnl)5aRTU6}cin}#>Z$?Xp#~_w;`3RI zY#+)8J8VU#?^jklPWKrgJB`StBzFu>4!RsE^s&$r{O z_ejyEDRkM-TbOkSSkvoX5LSVzaQ8;Rl8@oYiG5!F?=%456-w!EQ^-?Ag5EAYMvQ>l zZgZ)*Iy(!3GC}+aK|cf_xN9y)*U%|&E|?fhlj9c@n4W))eiBr>0Y-1!$e?ZCX2VCj zGOw|*A9A#B*8zeF?^xSj^h6n#xH5rZ+rBvL;?IEnRu0ZT->q0<#*{)DzoG-lSu?n);k+}i`2PLyZN&I>z${xIlaZx1VF#1Q`W%GEsEK7?O=yqcT4 z-zSUVGBuI!WZO7u*CCwzi67dhMXX_X(Q0;UHN1x6<-`rX&5l<4pIi;sHt???0Nyy#^O^sTdWOSLPl^Hauc9z25rN1d#3bTHGlbbH&hRD+p&K3 zGwfAY{o7F5@==Sq>6*d5?-rvWF0Y`xr@qDhb*;TyhR?nmq9HPuRG8 z8kJKn0U*=WMpac+>iiNN9Rvn44Ru&!D9e`7bpH8d%WE)N^ZD(!I!yjHdlg3CdKjiv zSgXBI2|{>p(|&x>0RW#-Dm+vua-$m1~Qq%Rc0#V4#X!_9q zycshv1_p1}2MV0fV1f-W%F&_E?U2;J_H}Y0Vd_1%G?`8+3Hkr)kGVHif|EP*dTCZv6&y+uC$; zm9cc+bvGu`R8PH}jL%Ik7B0k8HV_VPMgVQUT+Pr?8wv!i9ZnpN7k4nyq#wc~tRz%c zlX<6y@UuJzayhV(gR_$n&C~hA=cjtqnZur6GVVV1thpBU)bzd+qOsIY7)cH=8vgp> znfzDf_59B>=VJnkkzlmNe*QUDN>*->#B+T{7-bnYC~(Z@NoR#DKzXH=Xde&1xLLA& zMG_bH&e6vt!DE|%LO=9SfoYFE+V!=irJrVy9to7SXQk_m*N_sXFFqIM7p6Ff*78;` zaNmkw6Mo!8eftLDwvCuLrhHI6k+kfb7d+9~Ot!ohC7q-B$zPw%p{L%#h~@^8oNj0B zJ_M;Pr|vwM>z-Y~pqfl7e7+Wn?c1M1p#zQjLPA#``mHL8;}=1p4N!ZkB{Os-wWn$} zOx2iPNp5FN*%p%Szm(E{5*E$2wiYRF7AyNefvxVJ7$gA{8A(vyict`+x|9qgn@`fj zs(n+qr;(x7fCP3o`j8q>R|EwU<%fpT!+N-Ho0olL`Un!gU)zT((;WVu?SUPizF4rOQD? z^t|^zS*3ppW^HC-F?N6YR zU(wDf{C@FdpO`~)$++LJN6j^`yC!-kL=#Yr-&22FIqU>US7l-gx5m_>6&QMkGKe@0~}%Ux)6+$>X;o+p&i3g`X1yA-T=RvT?yLy?RQK*bS!z$w^gOT8ktC?qSS8SFRO)?CLUD-zFdhftXLvc<3S6X(w#H*Uf`<8Jg2m`>QpDY{$kBR8=FMc#Ld)eLYuRc_qu2FHezlvM3>k z5E3axzYIO2MvY?DtXb%F>j?hx7x?+lvFDy!fYNSa^^a z0q-n&oqTtmiOt*4Ji3Ohw_U=^uWjz3!~x*`1t--u;@GKnzrKfTO%*|PJ+`a@{ouoN zeX*3GPdIsaJoYML%M-Dm*cGrk^LNpT@U-?-7A zcpU+Eb#+0Nhf){)iHbIobB0O|t}PZ`0{e`_{#0P&K2T^Vto+6GKl6-xcIKIz6acQg zH<^-*Lz`eaQG|q))(L>6+aExjtK{(&_3V-zOsF+8x<|7Ah#FRISdS2Gm{4=X8F%_n zvqDPENf-YX&`{AphbrT`S2m(7sPYO_f@Sy`0gxOi6xt|M;MMd%Vz2e9?-b#n-~&LR z0ZhAQ-K7ewqH-5ScDyA2h9v*GEX3c7=syXUDo_6;JO2V_t6O~i$s!c^`9oqUs^7rs z(@vw|$}7>!m-~oIf&Y;G>rbwkQKMKiYnD@h`a)@?DlmG&^hrvt(ZChXug?>9k5mKHo{#g}pZ=RPoUcfJB9!E=M2Gr-A^ZGel zJn3TEzpRZA+>#gP=A%! zYXvsyGyVYHJld4@moWN(haz41UACluO#mqE9CvN6%;wRFBU!w@lkQ$H%JRvIPg&4d z!}vHtNX0V`p2NYX-r;CdY6oSOhSy(zoxOjwh_JJgOh<&#me3ePT_rZ3@2>_IgRa65 zvwl4#P-v@A_*MT00z1?*;#7gXp;VJ1P^k%EVx8Lf`F9jlO1hpd(0_u3pco(FfmDsB zzr__djb_;zk-~Np4L7+L(jjL>@>yxdG?(-D+uz}H&LGLEZ9J5{FaMP=f3g`!6(t4j z3#E08@6v4d%gt9L7ywwe4*S$o*xT>Go^hH_aG9+7vfs+z7s`ro>9UgSr>j>q(6wzl z)zM%&%bVEHRl)ks4aD_5w5_Z~3Y$6s!Jwijm3St0nP+RxJd+K}mXrNr4c16{2M=ZN zlqpzikx@i0E6~E30G+q5XHafvKe`T8-oLkKBanBas2R^>{WRp?2*B~ z9U=+I5jxxK>$s0FN1O0g&Vy zv_`nycmIk8;7x!>m$fl2FeoXRA7qg}-TU$t8(1V2+44FLo_sq}YlKuNsZq+sd{{_DH) z7n>jk$ZpuMiL9_+qdo;ez-OO*hB^Eg>? z9k-Khe7A-hwty9pOI*;`+n-#Oaal~;Iwa?$mT3fc+y4Difl$ z3s zx$^t9YZSq!y}b9|up_Gr9MOmIzwWsFOgL$rqDL0t*b$hb%}dkw_jqMB3 zLYSpMX~nk(OTOLE$L62ynZK)uko!P+4SljQ7c;F_8NbR2XcT1po_i8V?^g%_<)OIB zCPG&@##aU<-G37l+xm$x*yGq+P*U^u(^smmd}5Ky(lj$}~=V?&1KlCU3XCRSOLl{L-Q>a(&Y z_PZI@1l^s4Kf0Wjqgn=r(k5F?i=nhuI{?PowFJG5v{w56cT*OT$@1|d6R5B6Mr&BJ zK1YMK)Yo;py0t}hTVRP>#bQY?xPegT3A{ZEP(FBw+cgG+VMq`Jl#LlnreUb_8vvE( z)ziDP%ga}Y@s?q2u3$qOiA7-&53O~XbvL|F4wLhQ6NVG)*Pb%|qi>!Bz=#^ZuihA} z3Ej$XL#!>d@t6wOW{|?#mXx@XdTDj5)d4L@yBszlA;6(~!_F(=;5x-o^({rjDdAH| zaF>K(3I=}#6q!Cy=F?7hA*DDXXl-??vQ)Z zkV-RbNUc-ty^1fjPdD#11DB4=aNN1~GJ50?4<#R<{r_%O-(o1Vktj6ba0xYi%GW5D zqKv}$8{=IdQjziXhXX*Nli0uU^(QN{!mWWB6%n=!@lgj+zzrnM?L@#S<^BOkE3A&F z0V>O<^0VKbg!UWkl6^K>JE5wLcB$x%&q(bvR$FWN!;M!GFtf)JnNqZ$qJa8KV1XqF zK$BuQdnVV=+cJ!$U%baIQ+L^PR#GUyD~qUU-6#FwiVEDHUikY8e^T_j z6dI;t7aEfW7q8JyiegGS@b`U=A`GFj63WY=y3YO77|`Q^{(Vqvea_@)-o$qUl^Hnz60rBmz?x2vOpDyve#>H%QYjKJx!>-u+Z8HEsDH{1 z44iEr7w|&d>?ZY7yW7&(DZXhhX==0W)U?JEE`#%b~8r=VR6MGhKW$_Kb<4t zGNGPydFhO#Vlk<|NQel3M#(+UaQ7nKo7+t7V8srtu%UmJ-Ax=>V0FjrOUL*9!cEXu zXXH)JG1s>7^J9i^{=q|v%9obg)H{?hTyWm$p!2TMOxEwDbn)A-@SUf}4Zr?~U%v#a z+n^%n+AS0XD7oLDm88uUNeXRY$Yo){1A|IxF+hXXn6+zZ_W+)O&V=YD+}wBYNas(V z1epo$e;3MsSUw<{H1qMpCB=17D(?;RPNz<_vt&@?CJFn*tB#~SN)b&6rHF(;N8My{ zRV@C=pU7p(fC5ZA`DY(wytfizCdc;Ld90Jv$gt5{o$^=5-M4&0+nfHE1B z2}}O}Olix5Q@i241>-mBhq>;qSGnz?TVdiZkj<2&#r}$8d^Vf?kFxR(GTr2ATlwc| z&Gutz{_XNo=DF;$DSqI6R#~n5jz^V7SX_wJ?<({-i>ID?g1xqc?MK7hFW`#}79W-O zD~)GK&0*evi9C_QdHUd|GTPta$qvU3_}tS5k)XZ#JI*qS6#Dt{o$y{u`MFJBIN1F@PLU9TxH2Hz+Ph;hp` zV?t=Rba(}gF_PAwZUZ<^hmX`LAe_fErmKR@)mXeCP zI>^oKA-|1{jl?^EVl6rD-TNp#^-qXh_OODl4aS7v6n7EnPVhXBYmca9;ADHl#x`5k z#jX;ic*uaies@lheMd_Vj?6K9ai-=@i5Aem8-&qBB+yp^j%X+7RR8+Jyl}g$2WyvJJ zpRiB#yv6yj(@;ZcA$+v}+LOjMfeGQ!>2hPC@|PET8Mdfng$=#F#$c2}Em>y0!_J8m z0!TzTV_@xuWHdlY z#}lcHA+8l-(V`wu*oc+Zk7F=2wQaD9uUr``5wOL^09iL5-LD@yCns8Z8DpZH4{Hb- zkn1v(U8j8}J@E7bqa|KWUz>U7wv~=jOGRb5($#o{Oq1pWuE=UbrLFB}Ti>8E+8-g( zCEue+K>Gc0?JuLd8&<7q%;vUqn4CaZl9@2{u7iL_6AAkD?@xx^(?kA^)+CoMbu|GU zTXHw~l~NMdfY62l^6}|T001BWNklThXU{8#BmLo2GnOE+d z3S+jirq<>+zvs(qNc@P2mt)pEkLhiIf151c1QYnNhRVI>2f|RXWD7uoQf)uqE5q~DEiKo)LR<62lVB^4!mN^o-@Hce^6HNEGuqP}K3TzrF`)WlZhoVUvuF9-F-oU_Jb|_JjAMmXuBvTVE?$R&ZV;qB+~EM^!mw!jJnI3PB*b)z4?N5Q&SJ5wKCs1M?MrM<`NISnjED$B(K2#pg)$&Bl4pVp zKD|JNKpZ;=g!TGBlDp%M_*;#H>YDWI@0^SxC5Y{rz<)o-#^|Lj?`EXLtF9(@`gE2o zSwclcMFgztP1dyY@EalMIOGr-!dU($lt117Zs75}tmr_d{MuBA(o$j*CzA88f6?~9 z!_0X06Q=Kc41spUAllWLSLtJ2c|Olv^g5h0*=7uC*scFe{Vm6jSFYq|)rY_2vhG@cLs#itUwR`|k1P zR0@+yp_3^KPztLSccsulk{lt4yH4=HCRFXQ2bD#I95Ti*d#T}@`G!Pb@U_8Lc8@88 zQ3fvnI^23vrK{RT<<)&3)7}n&rG$!N;BE#A1xOtaUU?qKJdBBhk;tz*dF-HoiQB+? z`RDM%tb6#!{>O6lTLA~}QiL%9UM!!sze2yW>=H3jewiKs;-10yF{|_$vG7bRe9}?D z1#W2+pxA%udJ2OS*KAe8jpGiZ#j7UQdv;?rKg|HfKyIEwYJ)*f%6pWR4N+m z*FE^4U1Eh12q}qIRPgQj=UWRPzW@HP%{Ih@BxlML_GJ?)?WT&hBZ72^&6zVX z)2CzF+Tag=!1D}a1{o3s3z_z9r<<9SJK8-}SO8^jQlV57`pg{t$;+eQ%{Mo_gzl=?U)Js)uT+y|&0b0QCYaVR-Lu)ei`!w*?S5CjYyn8RCd zgHk8h$0BhfV8*iIy(`yTV z0GN%SHvTH*4+ns#VKFH3_}D*;(Ul2Gi?-#5_I3Q&zMctX-2~92>(tvSQlXzhbJ({p z(SOz}q@2mBGH0$ZopZ<#T2m>j#36rPsPsXANhU2YDg3Of3lpSJN!N)=L~af7IG6hG~JNAA#m_lz~rp=kD$EW6|uVlnl#Z#B!KRE zdFz=xwbNSu_1>|>_ci?K=zxZH#no?>@#&-QV~k~$ZE0y?X)H$Ng%{dNG!BXya?zE) z^%lyHbK+&6IIxe3KtKKa7V+#|PrxZjgp#DBAdrHgYMzRUtOm_Zy+`neChfrIrYp zgVBA+%W2tU`*)XL449E4ZEnrW|G{|HVr_WmJz93zi9X$++=b)DQ8acexdR8HwdMNL z&H~u@`s-*RDA{knv<2WMvz)3b%4W=POMu2kMIZKMMEmU-Fq;W@3!eH5} z4Q2HWh#G|NTVgnm(T%gV=+q3IR~|5NdzP* zeEV(8#*K6wb~w7dt;gVHq$ECM2rFmJqG1wTa>yktYhUI7TY}R~l0&8^d2HW+Kiwgy zKTvV@f09fsTFmt?ZHrWr!KH)w=;n`DKpF~bq|C~CGpQs&Zc(IkY0gRIfIJeC2|M!( zK}uQ}`M>+-GqD+N{p4rFiYKV}<0;mvat_zfSGUUA15#4(;Hya^eZ0IQ@vl7$dpm**-{lg>|w@3x@04 zw=Xx{bQ6nO76BHGXiP>mscnX!w;p6Igsx_EuEBiyE-j;Wr7Q!=Jap>RUZMOtnWW{F zSI|K~&83%SMFGO+AA86lZV4bItx{5W)|rTd55q|3yfNvc)-D=A+KZk@N^&M>E;}Q} z(hY{a27bxJF)wn}+h;SkX%NFI7IWJHw{X{|$MT;a_evKaQ82g?-v0~icEX?kw}pQ8 zreD7=Z9)O~_#D5*A6VVFns-)wz?oa0LS=qsj}8R8h9{6wRiwRUy~?=RuSRRuOekoC z<(45?h(&UlZNc={m~v&;eGc!hl?^v(ZR6E;{bk%|U@ATI{&oNeXSDa)-s8Tt_tBJW zvJmR5nO`7G1}m{ihe;xfD}=*_?-``Ptr^4he7K1MXV3IG^&Ow} zP5E3iy^N_vOSyimiHJj$Nt2>R;k``As{>$ZV=NnV2=`UWnd<2QKuD|nDG`v80pAwD zSzDK}!@2~M_CFNU(16a*&+5Z)={I}9Db&rmm|*GBtY_$sy^o&FL2+}23}Gf8qV?ah zp!a0ZJvE{>R) z1MOI;GpOhTWBcD+FPM3mqB4YXYu)?vLze{ka`?6`h5)YYS< z^-_}&v-aGm8_Vzm*z0Zn06Amv3GlQfbMSQNbygY9r;G|VfyD2$9oVW{d8zefKHm5d z1%4s@3;L&_)UMJ{lm% zZ3I$KRa{1(gtG($L0*dGeRI*f?}jlR;es%;sH)bQK|p?IE0h64WCpqqV9Ys7IqCCL`5P@g zo~}ELlWyle&~(>m@)hU+Obk+8PAN*kPl8qu#6Si1Jjc~~CkAZ+1m~U1B|ltZiIV+{ zCJ%4)3$(hcF7F9Hty#YwxqLazW5)DA-a+>B?|MF)WJ7Mc82XNfRjXD}e^h<1V(|Ts zJ<)yParpOhXf3Q^%fXZB`IPQy4w(UKTdd3^NFO`w`^|XwV=4+PV^yZlBJ9K3op;_O zT=v)WU;iab(y(O>nl#EV6LA7bT6upzAQo|&Yu;dws%e)os)u!%N?5VtSWrns?aJY$sm+>WBgnd?(u z{(HvL`qc0Dg&nwxeZGHgI|}o|^oMK+u-2N^whrRYJj1&|9oIbc1J_i3OJT0h<*WO1 zX1_KjOxS^g+9pGt8wA6_P-{qNkg%lx9Xy{uiYuRK=4t;G0(?$exeM0~U(BJq)v^7f z9i+kP;fsfzkjwb%uF7t2jb(Or>+L{Gf*^zuOOkL3{&Lrs7~#{INYXH@fPKDwgC&O^ z!;Poyo_+gUu?17^1TMGYsP6=Q66gxh_jHrtb?dsdf4aSL`}YF{i4`k)3@G7u9+{Cn z@BOdsSNvO{z@xh0kpuq5y)kG+GQW>zevP8BkIgv`tM;ZLpuz$+v|!r9y|BuO|r9%jq85E2WqP<1lSnE-~T$oLQ)ls7*e*`wc!s715SUXgV&!L!^8^@ zA^H70Od`P%wRQBVDdUarySTQ>Bc2~4z>m_ZLrC(n> zLn!gRp8!x?oPPhyZ>grL=~DhuQB7%S>1N-*vC-CsIAX6l*Z@PVqTDoo1;)VH(oM{kE$UV$+X+;R&>3i`OB9j2uP z`Tl!&JMIMi>R7mN;r}n~_nV-=Ngx-E-_*#ETFDl36?^4K7PJax4wSq%B49&~%juV{ zIh24?@1kJ2f$5@@X{D6X=AjqnXz z<25#?EDl`hUWGmi<9Hr{)I28t5AXZo6nyp`v6dEeR~NbE<#b8dRT@6oemf{hLwZ9b zWNncLf###7Q!w+&DgE#*XlsW=7pANfsbd_GNb=vdF|?*UYWCO>;&D1sid0vM_z!c) zTs5_Hx{_YnI@ppzanvsL7-P6|+I;ZH@Z)I8i}SLOmf`y^Z<5GWOIeoMbY6e>{?Ss( zKzl+sD6popvop(C=XoAVDM}kxqJtDBNI_+lLjnROgOyiXxN&$4%auhX+Z?$}LvaHn zVaCEPYWLrdegFMDL;Ke-^!NL4^8-KFDDs>|Ad+|;@ixaW1#s z_66qyYYPq6x2)pmV#QXu3KMgj4_a9GaLlEJtAIJlfP1%VBQ)|!U%e+H2x*c=oXz^m5e zOpvyI-bO`Hkzl(f$<|X8hkYoS*H7|ggW!t>!Sd3;R=;(mjwo!cd6y%dXw`JJ8cJ#c zVtFBtdYVfu;?(nmP2&37I;zT22tQ$Y@3bT(ptR;zN>pAk=Z?!kYPj{y4n)e? z#BN1l6Nl0vO%HhCvlVD<tpDa+WX4GY&R zZfa7DFBTluM^PCMFrJfN5zw3rc&1tKd~-l2g0W=d0CM)+o3fH(;-j}uD`7|~>)I?n zZXYW0a*6M>n^SHHI`_A=UoXlZ9Yqp?uFXS%HIQ?lBzQ~Ul}r3BC5byF`IiO+wTk?O zg55U=cAYI*mm`@~r}$*BVD)waT=uZ%SWP=R73OXq*2U?(d>?YFUL!ZBmjQq@tEzes zJa09yoG@GK-fwQCIg!I&4gbf|)!OIKO(!YZc4astCr5 z2oTC}z-8+kFP&X-2%#N8rD0%goDc6^$c6vtA6XUF%CX5vzVEw`XNJI~?Chljffob> zfVvbs&#~f$*?L)Y?7hg3v2`EYc7V3TD25HLNaM!FUz?s5Q#K3=z?Ay|7~L0Uym2hX z!0|^7Lyx==trU|7NG30mytZEQ@kYUfa=}5*`5-)AJvQKprhw&LE-ahlI1Pcq>n9^8 z`~kDE4SWx=aFLA?b#+;;MIi_t`X?qg&qj`7KEdqo@XJamzGgD=;_h?Ar~m}{%8{?)Ov~O5Kt?SKU$tTR6w83BnPhzIPh!1@}G-%@x!pCEsIU; z+mlH)J%xAPb>u8sNXqlb>D#^YvRPF#uQx9G&>7^iSHp`eZ5@o%ihTw?%iD{O?Dcx3 zE$GIE*Q^Eb=R<$w+<)wVG1@u}>xUzv(GUY9C4tnWM5z2aD!?ISIvdQE zPY<)fY*Gj$sT#Q*udONJQ-3(ge)V`-F=KIzWy40Y?T!-BVv~2c;cjwD4Qu{*1l9k3 z8OHi>bSt@Uzrj;gNAmF!!G^pzB9OfG-FM8~q7S?0XjCeJNO|PNeRdl%kahFEAm;Z+ z1kw!v={3DjnmtEY%tJDz_;%?Al+x_ERW&;gEyozcCqJx>l5Yqk^EVEoy6F<+%B40` zCL~%4o>+QpMqEAQw+o{4oM13>`II+;nb!JHHfKahLo60^Fjt8CptWb045?I<5$DMa zR^o2`zsd6Mz4ZUw8}DZL*dmy-(1Nr=uvTDe@|jc$x%b{#6kRAqd_+BOebd1hK%=Nf zaQkeZ^R^bOP6_H?1$A6IMhog*fMq+_IDEJSk=j0g^4^E=E2>Z{S2*96P4zWeVG0Xv z8SnqTib-~5pdGAi+21*Y|`1 z8zG60aljWX$o->)>J+L`;-!-0x`u0s74li_&djddm6lO^!5h~AI}^sXBKavsx?Dw2QlIrJTZR9)9N_XZnPzCqqPIt?ha%WE>821j4dP+O40pqgAr&U(F5v z0o>jIm1TwnE)BY>!LUXdRtiI`(2!Dw=BuxwV9oca_6}B0IEa>Q_k!STZk`Pn9_}Mk zT}f=#(Jm%g>#4 zX#ExjgE6q*{ASp?7NI2%E|x6Z%H|^!d4eAf3K;b-9|Dh`PHCrfO~C5Fp)oy+nAAZ0 zgro6y*a?OXv-tj0%2@yjUOg=h z1#Z~)aS%zCym3-w0hAun4GJuQ)O1bG9szQt#IFnR`v>SJ0%G3@+R5kVsGQqm9pFGdw^8*j( zz_&HZcu{4ei1#3a1HoYEbIpxZ_c5$K;vj0KzCp6hgO8d4X_psLN9C^qp$Uw!-fp3| z;AjX^AMjpc3uNvfwr!h1?%2M3^_C6kDU){a&0f+%Agw>7Zy#I6efhc$KK@}H)_tKP zs{yHLX|AQDB<*$H|B|(sARrZJKAuw5m}qq@&u-{D-GDf(75lu{QSpDIqv#Z?6H3}Fa7sj1R$kg1_2VuKE(mYlnd%} z0?fs>0?+Y5z#jR6hnfQZz0QGpjD_NM+;%rbef#1YL-K=n$s4zC)K21y&oNSwckyM> zXB|&GNYObL;CUXcV|O6=uKZ2yw>c;!xrGH1)3 z__}&GR^`{xNiJS81wlZLOrlF|NpPJ5u`?uQv0yjxKm-LHAKbHfR@R{k=2#y>Y`MKY zOjC^q0e`#Ucz&$i8YLAY7Jh{<64}>xg@6!+65;yMDz(v?Gj18hcEdMv_7RJ@_r-c9 z-q3(C+E%YI24WW4?8h}R&*dI@r19i3L|FB<Pcs@ zpbbeOIeD*P7-P8Vx$p2i>+G~)Kx;7&qya6VUoLCF|05pW@nT+j)he+-Qr|~#O0i(4d||8asK7-5 zEG2mVT*39l0sGbnZfI5n&1obaKyup4w0!X?rOoTeKjIkMR-xRxc5A=?Zq|SCF=}lS zrI-B;t@Uqizs*5`5eWzqn}-7D0&$TdSuudcE%nSV-J0(X*@2dLAB6UZOGSUB(JF~7 z#?n(M-+9jMI^?&ovTo{nUkJ7qYi;axU|mG5)cty66v@sGiu;t>KsXl7Wt8FPHGR0~ zfjYF(6!o!W4N5Dt)C9?P>ju=>P|CjLInEUOWhkiad5yrQyu^`8C~S!;g{4DN7W*R& z%v=LsUhpou$w8sD1`-Hq=vPzhvgMRp2DnsKVQ0km78GGrU~%;(?htVS$v`5tp|mI` z%adHJV!ZNoBgPnN%JMN9hi|YBL#^%dr#qCit|~?>*`J2$*sps3L||#X3kzZ>2~zrz z_d2@5vuoH`-+pK*@f?k~1_&&DT1{CDDg7ufBc0M~qJ*t*fK$ri1t7_ZCk^9-Lq?Fi zLE%>V!(07*naR2naR&`3qGb$ohT)#GWafDKz#aN;R1aq6G<-j5dd-5etBbeqEB-( zc{}Zve(%1u5Tv4ZEdKq`#Jjr4Ip}aJr&^N;5Gf?1H!92rw zUgAVd$u5x0w+;l7WMdC|+o6*Kd-?R25rEDQgjHH18F3W}+LV)~u-a1V4}L|hpTnjx`e__xFgG|=?bd0DeeL&H+u zXHUlS9`on-?=cIZv!SFHKio_rDM=;+5=lu%GT`5r_e(P&DMb(jB$G+Doj9=vEP3~a z|3D&0L(v1>3lzOOG?1u|u6k@db`Fo;anK|mb>mhirASS0nKC&O6gx{7bs&(3nrO_iV93l&L*#KY-~gVgELrhqcTX+rR2ISxG=LX zvslAt(>4KRE>zY^K;n6lSWHrqFF5g-o>0`FIK~~ZJ8^G|<#z^N;aOG&ALYhr&K&pMRen${0CvB*qx_+wn&*hL>&~K^W<@C&qcdos-DG z(&dfhjr;-gRXG=2^&HDyn*psYtlN4^Dn<|Gs^?a6?zvkK1S)b++M_MuHEr7Ys1CUK zMB9u?8-(=eTUAcX&+h+HVL0o8kTlf#N1nRU(t$tlcnC~M6U*A8aeypraSP{M4bQK> zqM+CQD;lLR`5D-PD72V;T=T{>9{zj<8;-q<;{DEJ(BUIlpA@{Z_$?YcSE6Jx>MLn_ zY5xbNAxX0Wcb7k-WHutUoBphrHjNv9DCF@ghj8-A<4DdPfJt_7=)fVARhRMZq9m8q zHln1aD-fJ;*fzxD9w$v0!}Jdq^7I}5fDHlH-L_|V`v}IaTu9Nw0b1QPvu1eQG6X~idX=)@F$9D1H+-|I_S?{m1EA$v+OLHw~?FK~+U~%I&6b{<1 z+u&!S0inmgjORb=r*Z5;oT6AM-?px_(F|=X{VHXTAq+Nx!n*wMhLQ$I!1qr#(9qBj z-SgEuw!#?0r?Xqoh6o;Pk!R_@3-WzFe!CS@e*>%j>rwLT)08EWsE&Y~&kJZw8vdTw z!cj~2q%CC-L4Z&o0!b>Bq@lr;Q*#oudZYD!B&EGatlOY1wPDd(dvBo(_2sTMqT8C* zJ4IJS{DMbpc$OUB@Ob<<0_COoB&DIY()*wKuRD&w^BT|+MgeN=8a};!CLfQFGydp0 zF5Y$mYZG~_>`ZX)+{akez6>F{2)rQTX9)Y>clXy${xVsCi+9@{Q&dRXOE0C#S)Km) z4GjQX|L$bu_?w6~uO+Xo4V_AnQ(Q#5_SmK?;Ent}X_X#9GT^EI%;A9D2lJ1|K4(xv zIbbcjKxkGrr5u=u3`I9tPHmeMrVxRqpTQFN~)#G}tH6vE9 zrn0&^TGNL!p8a0txsJ$8v{S&;yzgPxU3r$7|e~=Lu(_n zNn7Jxiio5$f`iH+UBwuQS6fg1eXk&IJ_e6G_Njb~V@HLN4ExM};zNwlsDg21QksVY z$oievJ1YF1gU`1Mx*}ftG*fQ~1vXTa#kuCbc`WW6$E}AQNlDv6I%dqoA5lrk9-~+@ zeI`?NCCLTt1VO;T2ao2|Q+J`LD4!pHY~;1q<}iIa)?|-(^lcO*^Eos3K&ER>NQGSn zfMq#$%5N#qVUNU(EFNFR_O%Bw@vb|$ulAC3*=$ED6Um=8mZvf7Kht~vWrw0g=mx>p zhCQWX(VGFU&ij!OC(L8)s2r;E2lC*a6ItEq@!W#xeA+aJm2Hax*(RVWkS;a>}vQHuX3`QbD z-!hMTt{8*@Jf$24K{{65o->Em-39<{2LPE1{tzE;hkVrIZLnUtH6%}vFNe9%_AAaDb7t>4*#4xmp}$wuA^3wJakys!PYa_W5kX;`rdGAsy!yZp3iX=4diqsxOe?7Tz7ma-#qy}T|yEB z0Vkil3$eK2vdf?4%FBPx!3S^4_16PZN70Tj3es!%P}_PCCJK)d5t^tlYU1e5r84Z) z+{SylkYz2i7@fPq!LUgW05ZL{PAbJ!QgXhO3=%f5_e)S>5Ycah{XaxX`u!}KagAWo z;7%^SY8_>LKBs?C0hf(FhYRF5R&;ngHvf56b~IZ*1GqvU*1_s|9tD#pV_I4;OO|5t z3y4jbLec8gbe?k#fvaX6vNE?Gbt+U=@=8;jEsHzxrQ*GcofucXf{j0IVBg^bY3N(R zMW^nxs6ZhDEx53;?l0QwTqi^4IHfN$s^UP~2IsFg)3G+ZOhJQT0jMI*+ zqbT2xCXmwehJ*%OPblWAQv;^GDo7;-o(VYZ)ZU?(nQ_QaF$$P%77}mL zC75Slu~gOJ_uLYo_|i+^sG}_X@exPZb(9JVAg0-O%)<|-&!vR&a>}l}lBVsNY1shH z8$#d>(QFsdkY}9Bu(o>2gLQ5IlIbFh=>ec86gATX4|(zF0B@H#ro`YKo{N4U0iHEbqcd$u}R}!BK;^=gN^eh-4BWV)W^g&-0&t!p5PW z^4jYjNBzO^2uQ2I%B|0Z+;kF=kZB))kY3~|Rm!dLwN-4XG%-)ISHHtB+TiQAU5wn% zpq2L`3*bSiXcmIoq~xDM^3oDPBHxm^DlJgjQmJVjpd77Qd7k9T4c5Jx+5h=Ma*z~! z^liYy4+$>1L=f{jFlI72e!$?8zFfckqjbt5Ui|n)cn@0z$c4JKP?-7iG5hR;nf6~y zL4kz@zw-_{k%$U|g#F+A?hIZkK7h|w3D)U6v{Zcb-#N^wD`sR&@$wsUIr*qDy#B$@ zwoLjLOYvhKZ+*Oo%q?u=yj(b9U(0d$^1Ex0!f^C~HJo^GEd{w=5Baf6fL@@O$NnMU z^G^lIWWXsW{1TKmJ=0(yarB9FOum?(Is=9w$+`LORAeZ>F=$(#QUft~SyTo#X0oD`U<(_@wu4(gm<(f6* z$BPJ5ie;-BY3NtmYx}MG?^aY*l@THt-@R`n;qoUt9O`C&moe%4K8qLUv)y)Uxp40S zq-oLj6kxnnzwyG_zb|XqH*`kkR=5^5YL5QVymH<#V zd`tX?pJl}RCsVfPW2n5m3{%j3PiyOy2g@b5Y#Ds=DQ36bvV}(o%u`QgDSv3LOW=pw zmQ&xio;1dL6T7yItKk~k_kE7q<|p(xcmKdak%R7v@0I{2`~8)+@pQivcsGez*#bt` zS} z%~kBOO^ifJM<%{ibfOtQ{W;NjVSbEH-tGXbM?VN0=}2J9QCY>;2q6gq!9x#z#ChkA zr+!cobLTelpO?RO1As;v&skX3MBkhRV2p{({SZhN!ltbiZGWe;GezCN4>)YshxqLC zT?tC96EL(Alrm8`EmsKc&*(p?1*wdsS{9{xX8*-W%U=+%SW2c81pI!IV6R<#j2VH@ z6KU*>@zne`cz@L_7PS6|3_94NVo16$ON4T@tjM`#WteTZ#k93!KK%r9s zA6Xiq?1K&238^`9?_mrZRKa!ket=XOv_*qzZGmm6l;n;_KEwA66{WT`*<({za`3)I zbS5Mr*~^ZjO8MaH^%3$@E5kO!3i)Ve3t`?!QDK~$r~FJDiDlVQY4U~0)YT&6C=e=x zl~!9)%Cc<-z%{pE)~t#Y)9dOYzq5nXfeL@}>BMv~CLWJWU$lbSdTQ=}0u98Z#H3Pi z&plSix8EKUi&?JxDN`_?eby67>@ePgZyRh`RofQ#>Mc(nv!8!x*-+;EeGaMc{vr)U z?rqH&E&;l~f9w2DDc@q}^uV^M0Vs3!2Jk#K9Q`bOqw!M#zq{`YR<^gHq>8HOgutC8 zsZ>V2d4X1%yupL{?4ytP@ULGmq<;ym9YLC~HLT6&&ckf8Fb!B~Lq$mrw@#Z6SR|i? zB1@<6iXaHjB|^ZHPkqYMPk)UNl0>4Dp+o!G0U*#w8FNc5>^i@<_r_WPm@sD|ZNAzi zczOU)(r|PCySZfPImG_YnMAV4CJF@;1q;16#0Pe+_mO-*=LTtRZ# zGJ^JYN3JVZ}9tEMD1Z2W+Wq3A4aK$-^{mX%NCOU`xZ$0Y%Jt{%m&Vyr>Un*!^ody$SLV@pp0BWis zHy3aDa%gRZfdkVhwr)^hq+?b6|ML7nFZY)UeCs6gJe#-#f|xHE(x>P9SJ&>&jq(bF zktl?V`-idP^sbCTBP||4Yc!G9d@-U{*_J?sEU}JLvvMcI_j#`a2@WkZd95W%|SZ(`Q0g)m7nBDEUB$Lly zsS-;l0+7%M?Nd_TNaS=hV z5shSEX>C+AwY&UCuzs$7{TxJ1eYZod@@yv3RHo*5Z`_Xhpy4gg<)| z_OVE@ptBGA4VcSGqh7X(Vgk_ZXya3PdK0vz?NOa!T4u_@raE}nd$4_%@xZH2UxiO* z1!9esNvif4W(SnO?fD>QHT8J@O~I%`+(f2gl^=MZEdok*zM{%_#?14~&nPKjhi4nJ z?@jg>BM5DHF3Ez`u3da5ZzczD(S40PIp`B|ea&&-Z_5okxAJal9UsmQ^BFpT0JeGx zems#-C=HMIynna9H@8=2wtq$+^cYFI>x6?+GwY$O`>9!{vp5!Gh*HD`O-bifB;8SU z`;mM8*|YyoUDYdWy>8gB9?xIiFcbz3hF4z1R5<2drO+mU)ZZhu#?!;mGS?+~DfEUm z)M;m6mMx>z<}mutH31ZrT;w$Q(@Hz+WG?^|b)k{G4&MbJAG_=OkH zz?7>8TftKy+RP%7w9YU+WV&vANU?R#-@XK(A>;lbrBMjw#W_qe?;ApTXE`YEm@#9r zI`QSDG1hgolUro@@8p_D5T8LG7T|x*L?*L3)J}OncDE&#hPP z?yk4-@v5t?1Ux2Rw^v4Z(#f(`QHt^tS3J{e|M%;xh zJc&N}IE*m_U7GdJ9f2PN6dgMc;xVLB=oel_U3f04ehBJ`M>*!a@jUg+B)-@ZzHHIF z-KuGm)<=;AB^QDMUvgLmo`Q0EgpuEOGdD#qVpEIde-%MSE8O?FNhoU5cbg zfoZo2F1y&+0UfClh*>3&YgRiLX~ue6y0l9X4m@dIgIJyATz7#~%WA7_#g`7*K}k+Y zwiB$Y9n-YHIu(V$tF+I*{3)oZ=^f3tSx2JhaqJEnfA11hdpjD40UcY9M2`C%xy7x> z?_a=sy%UW`vQH`T_I5jqxPibcDFNDT|BF>%Y_^;+4o#eOFVFf8=$X!;>i{BJE4MmTG zhsVm!RcNEK6kZxdpafEN4+jP`lnh9ltr%9XPr7ntAeS!(3@e&CGm45TS8UW0lhjof zSo!Ux|2Nrx3l{Wz{-J{~3+AFPxdMIqDd>N{fSLLtCZ0>{|E(k50R<=K+loskoPwJ1 z7HZ-dsL7XOjN!#kVb7_C{l>0hr!5r&e8uBy1mCnfD7m&Q+S?Wi&aDdQUlK6$3&At* zHn2Vt-)>M?p%k}0buQ-bf5$v}G3NH$5F$maHz=^iK@M@m6d5SIUK|qP03fA_27nOC znW_AlP-HCvr~D#aXI_YiQmXqVlqT8bvr|=y9MACS&vAkv0BuY4bfqAff>Z#x3XH>{ zMy0@|gb=tR9Z#MJ94EW|+;d?_G%krnMGnYKDz0=y6UJfz!ll!ul>e@0tP}5|<9h)D zfeU@6XMGKr){Uh4*090PA%5{~40!!qRu12qjb~1z;)WaWTU)c1H@ap=yn>MsuW@(* z1xB%OT?OAP9Dve_v4a*ctZJ2=`L#qFi5IU%*G=cO4OJXEY%3^?qZcklEL~2)=+VfO zM@!>+_T9T54fQ2VUpfh45`ZL59)0pEdGhHKV9H|5RwJRhuMN@403slmNrS1BvX+ETuEJF9n0F6(Z8sHCGAV-Us%u5&gC=|)U&v4F$0PQ zuwdf?MwXAHygMRm2{CGSqfSw0!ZK&OrI%HR-r!iak!(FSj=!p!5c%e*AUAPb&<4atyV;;evY%!}}Y~o{&8N zNEb^Em0tq6t5y-e<_dCv_BD+xy?g=5q7o`!`46a8Jws%Qcz!i=SClZOq=k)Lif^Vb zbzFo;(r?cf*<(%@A8s2k`|WLc^xkVZQGJ2uc?dM`tayjt)gOSwVm7{B`xUnskasfpxgXz5TeFsyVKrYptpua;xz5hx`X zQ5Z1q`+&Qi7JNO=7AviA_m5`^UzX|em%m`{xC3*}IhZL^x`mU{P{N{)HRQ=^3Pdtu zZwW&WN^0UllM`A1Lc1`Nrce|DOWEZ8e_^LvHeu%0W%Agv@;efK9qlHEF%@&s#JjmW z?N)aFpUK~29BSi6JIlDTVaBaPjkZUf0ZrCQ5i2XFX7)^w>yfTfQCL`Wvlf5}u?#ZH zd7AnD6LvS;__X1?6AVFM`27E|cHUuDRoCDDoO|!|UKp664+w&wh=2u6Y$zHvw%8M} z8)E@WEJW-z#uAMsF^Vm=s1Y@YBA_S=C>Bt9XNESw^tt!!_WrT=xoz%PetFOHTyEi< zIs5Fr*V=2Z^)Q zQNYmF7GrSFeBPh4ikx!GC~N|X>RuMCLe}&rzp$Ng zM^w|dR}t^5yOt5fmt$hLGk_~-KIAQ)9FZt%_Ws8ASl+mT)>t!D`8}!1E$8#CpAiX# z$?2HGjuJ9Su*KXg|t?{}1Zb3t%AFoy%IFutP z0_UK-#uzL7zyCevkw-A+orn4K(^L&;EXt^P$4Ri^O3bG9)_n5=N130LNj4v~K>z?C z07*naRG5In2H!({YPo@hz#W+_FB+d5mc#MidOcE)S8w&uUv0(b!>RvMHO1Fy`npqKyr$FOX-g~|T& zzlJM*lluID1&}P*1~3I4yM~pMb>w|?+r6H)NW$@#91%zy&P@P#K!?BRC7yrp0cFfx zSdYxk=YWAhiL~^W=2y3F=iZVn)NN^rTYYlDvN$M3eADPA=xLmh`)B%Jt5|;RU-@gV z%eZ;kR4$nKKE@c1=`|i-`5aVzAWA8UvI`kiH4U$ISh9$C2$|627Dr}zJjMMI{8 zuad{_oO3V_J%m}m-Y#Zc%%55(NXgeX9RDlI-+KE;$A84`-9LT&(-eRwM2Z4X&I(XU zp{|>P`sZ`#E3ZL$pdNV~)!K-<`9^zAQj`e5mb{br!l!qY`5KO^{hg&(h63=j#QHJ`gD)Kb?Nb9ij);cVGd$G?0ZbKZFzckIn%KfTd9L!4*7 zcUcZEUpkjl&22@IsWds`=s@WJ;Ksz+oa$r9?ng7NOfaiHX&-!rZNk^|G z0+gU@zcxDawZg|BKuOCNPl8h}`R`tEg8hE)Q-=I3!xLAV#QrqtJnQxD9O_e>4CPnP zX7}xrX}sz>vixW#;n&zLK=_Yg?m6)u>YD1T39AydA7#1qmVdQg^1vFm!nswhS4l5k zy7eV4zVZW(Keiuh*Ef-y8>V0HViqmlN@ce^dUeld{-Q1P>r=#rjV+YyHH>wC{G5Rg z=kmMyJvnIqKQVITNG4C7Ov8=_JmaxSthD_oEaFi}!3_CdlvD^Q@U+KdF`4e&yK~oF zcOmY)6K~=~%(7(`477POrn(xlX%lALQJ8gWF)LSMR8)sW3mb{JC)`IQZy?~j2c?_m>9{(Ry0BKNmlO)jU ztEH%uPebjhM?dy=)bZo3LKrv@b=e=#Z_hwI^*DOS9_S>C&93M^$BmWz_E?{sBEjo* zK96k?_*!sbrO%lo1<%*|Jn)?0iPvr2On?Z!L~1Ma$qFD`wFhTi@GpeYWVzpj)JWqz z{7K0iiSSI4w^k%p{9ykaC<4ot;*d~LyO$M8AY>AhS9SsARRXCj!%oT?W(*x29cZob z{TR?njw4o#(TtRWju@z@Ef(WjM>AS$!r}1GRsiusl7LdXSLW-qRe;#Ka{=I>OIBB7 zxc0oH70c^<|3Cqx$NT~0{F#`lTufFN>30_XVCxXHU#bLRE_e>Xax#;yX&gfB~?0F_hhF=e!eiV~jQR zjd4ytmE^ouaRp$Z%<^Z9zsU$?j|=}TccLD=4|U+7=xHCJ@^j+*eRb5~=r0$eF1-wW z+R5mN7oe~F10m+m?oz?%p^AUb zP=NxlRLhlxSuRem5iXn;kV%LDOYVeUo78MBBP3q;YCLJ7kXl+3Cy1GQQec#g=ZAv5 zb+CsCpvZ;Qb^=P}Vzv&-D<#4t_E$S6?`8$VjyG-TI)CiYr1g%7%Q&U8lq`XYN-f$q0ZNbB2ZOpMO0Y@pn?8JYVNqz z5o$<>lb699Nw5lA7_9wGX`9&d@}D$IX~}2>7_BLO^);NYx)V-71FEIP!dbPXvY;~F z$MJXf3c_2Npy0o~a1r> zbx>Q+_mN6dRhEZz2?~)KTdlXIGT$kOfQ?u=W@1pr^=5|g?{fas)^>ujt96^~s=sOp z>b?ii=bRDW>&G2_TBC9!=%*e-|NB4aTW`Y5o{MK|)#peGORJgRAb4rJVw)25 zE=q;MuNIQ4>m=t^Dvlnf7`cz)o%g|G+)R@|>&aB|$T*>->pWk(9PY#}aubs?BIHQ> zF4KMwjT?q=*6ISEVAh&@Qy|1N`hs`>z2{46vlW0h%)kGp?CIO@2)ry{ENCHms-D zuTJl@|JJKk**-}^_jUC-QyY3sn1E<`i__&fR}vX;}qBckG~Bx2rNdOWJI{ z_QOu&|K*KeCdS>p1N8glFFW18yx$;Xw<^>#|3Fui#y$Kg!tdU7;P=?oh`#E2LOZv! z$1`iFZ-$YJp=C9xW0XE_0VuN{%s2oB6@&K=Fc9?QE46HSM9XHzl^=L}J zchdV0O@=@T4Jevp6d{-t-B-5M+uWV>~ zBfC?36Ju`w(P#%JP9A?N7{y}`s|SiZKlM*Knk&|?uHjxR96p`RK2txW3B|kpZf1FL zEmuFil0u&MsEtF*IVx2PB%NlzRt`Cv886 z+`FTXRuj@#k?A~llYdM9-kjmu^uN&+lwAUm3xE@+OkpPQT~av0W`4=I=_Q3gB)tnE znC_ss`T6-kI-mtQK_Sy#TeofnV9JyvC}mO`;-;SqzeQuQjQ7t;f|8O3C5&V&UGLzx+94WsfMm3J`%)&5jY4Q%d-xMVK;^xEia)ebw)&6?8M4pF z#~|r=W;fwBKfVnzB8CxyRny+$t-0{a{!=)r7KTFj)D2hTY+qfbM5#q zU%s5(yLYqq-g}dmm!C5J?d|P+zHkx6CB=*wVM$c$8@7X$u*^rYX3cyQ0!-0UU?k{# zjTS$HRrznzx$5Iq-g|Hezd7qLqN`VbjX@a0L-Q>wvX?f0J*5b{ z`5R7~zsd8s)y@AN_oQB*%$yY`D+ySrf|PtISo*Ak0#{-rbDP8EIwvu9)GePW$~W5!^PJvKEAlM=@_Y~Ea#FnhvbuAMxY84o{bc)cxmq5ejoTb)BPiIvr^!mZ>QpZe`FySGjz(3G|s zuoOukCSjRXdv?#o5lR6Dxup(_cIlwD(>wkeLLv#(w<1(hrQKMRaE*h4=EBZa!xLXL zv2S$~rw#2*exwBGAkNg3^0ErR^SW6jn+!#Ddvl@P_$k5A9)eSI1drdSnR@3m&OP@M zB4#uFYkTwAKyTd+N}_!Ukr1ZUPEI3aylQY94($shIN}DJKRoVhrvW5jM?*3p88m@a^q-vR^}6!UiI|mIdKZ1092(y61S{YbJ$%%_-f+(7bIo#ucH}%9ezaLZRaH;@bKJq(lly zNsn@FW;(L~A`#SKl^}d-5n0;9f7l1# zML~Rl7BM_&DWPx~Tz~q-O|-^ZxpnU2oW1uk4DUAl2l`(F9;)&x(A5bjs<94KB^04- zpDPAR-hWi^=XE|K4?Ky2f!)zkvB&b? zx8G*V)~)pHWvdS5U3yt(vDRU{Y>AiqwN(He$7B2~2&vBJKK7`6{uYJ&ui~^Te?xJ% zVp{@ETWdhOGV#jj`0oW-1!P~6&Gbjhxx98D1yCnRR(e=#8kruczS zSUM2L7y~39{CX)RmHY3Hx#?!q=K8p{LQ3wAwsEBwAxkNy zesnQ+#xyz_vjV6Tk-mK>{qQ||pf>O z6^s}`bmdBVOt}$*$EH90o}590X__;q6O=OogglTjAMNsFP0Yu;r~uQ`mMsteJ`Z_M zvz>&|4vY|l43?E!(ncjcPm%zKbc$R-o|l*j_0JkPNm4p$~c_4Kr2P$-2NfP5ZSyk+;2gD-@v37OA(>`}L6mB^@MRQV`ss%w5gc_tRHQH7(p zW&S&aa`SlYdl(ohCM*;)TDx(0pIm&g2`v@AZ!lNgOzXREqh*wW8}CNEvd;CrriWR} zo%%X32G0mQEyy!X3^ku%h*8XD_A~D>M;}U)F1Fc)L3qY(F@5dX;Dl6!LLS#m=tWV! z4Nu>2ZXYiF^J;dtDvb6J(j%rl`v*dyI0K8F79Iw}%r&$4cIy(FV=Yv#p2=_bonUJ< zB%LRx=1ifL-GdzxnvT$wS~5SK1%+SyV2eAG12R-FQNY*$@+5D=RAjnAuRwelm;*<#F4-S5hC#Vale(?30s2LC?ha%d`a~q0x50 z;>Td?X8XPUG1%`I2v=o1JsAqC=>mk6Vg72ZX!IO;j@$un}AZ9t)D%Hj2>cduE7|^Z_FdSX#PN@-iFkMfo3sZ>(Lyn-(a^c z<$FDh;rdhNnDLIb-W5jiwPiPw$}%g*6x}Pb;=*r?p{zJe_tG%ic0}<)I2?kj&YdoQ zz_(kM@cy#**wwKMtu${hna=3yQ4Fmb+Ufc27T~+@ENt?lk3jes6TzHt66Vs2yVjsd zRzUoB40P*e>A%woi5Q3re{j9lnrt8xvh}&O2gdX8j7OssV8VoyqEKl(myw6C`yo#y zCQmY}s}T~lK@i#7$CL<*Ol%eC%}#l^_GppBdXvQJ8qO;wR9sB)xFZRbmSKFK;$w~> zR9Z?XJInIAC0PJ3@2X+)rN86xIZ=*3a8IhHJiucg3wHaOOHaHXGRm11m*L6%%h?c6gA#|Tel(S&LMK* ziO3l+@Kp z`?Eur)2NF%!o0xy`sf5JvWo^Nr7d@kD>1)yr=Yn_QkZ8Md>fhs8@9&WV&(i(!o(Fo zviunXkACt9$|#J+7O=tN?%DV7%<0b(N_u`NrP~4sftfW6q+~;(PwzvH`$6FkG)^Y% zV=5{zzy3AmpZ`p?0M0xU)2C0$^#F~_=1|^m6iTUh#HoQd(fgVu81pPiTa|D1rLUN6ZnJSU}G$ zGg@hWe`*a&R=0A+^9@Wsr#D(@?tf<|{YKXEWfX4uXbQLd;x=yo&(r-GpgqNH8Xg#Qxv7{tGz`V2okKiWR*2>Z|NE zbO_^rbrN5%8OX=qv_MCcBZlQL?(iPWp7l1bzws95pMO3F9B=?yYp$MgS7(7X5%Rru z`o>0LfQ>ENXgBu}_GG7XfjDB&Ad#PbiY_m=dHG5w61%i@uAwdIOsKGs*2fWK7Gon_R7pBQo!uRh8y?%h1t(ag_sDDYY-^N+ zJR6o(QpbTv$qK*;77w5BFm)|kxahSDP)2d#sELg3GX|vv9^n-Ei)a$8svqnjcxZe! zLcNLq&MT={{CFtE5^oMDspZoTZ$5(Oq=u)P=wHYBam;R;(tqqU9yb-B1*PPRv@7J|50{gG9DD_PmcVJMu_(-`BNJQ_5F^YYl(b3Ok&^i1YW zlPvjGAoM&AIrKQ@fBbLmyvk?53W2#WZ7Y@rMU{XqEJSbINc-LQ*hqjenASGP&&OnC zr4&@vF2bS9%Hol6u%TdM3?F?wk0C>caMNjn_;yqdQW=K#%VF)>6}s$optRH` z7fG#o_|s=P3A6#ca6SdO6#%qH-$bi+GT}0Vc@#l#eY>FVV~^3ElynofTtw>lhX)R% z@tbdeu}<&$&i7cmHOJjuQ=?aLoxTMe+36ZR zkY#!Rg?c;3m}!*i%{-}YWS%+HIsrA76jj6VyYFMnmftgQ^A42r`b#14R|!6zCy_$2 zr_c;F_WzWUD5B=xrdT;(}fsgVVBBCw9*g_R&dM8YT?I8P~>%PwJH;M zMM+R(l>|kmm}ZefQDs&Ez_C3vh4qlzLgM&sCbJ|hWJo8o^9cz}u2oQb&#nID|xd*elCq$KT zuxsMvD#~%^2UU2qhPNN7f=A%@7fT9Ds>#h3JpS+$o}F4l)+Ykq6VSH{D6E5`F8s2C zp*emoTw6$~CcIFKC%R`ksf0(63HtjI@lyLEL+;R;rxJ;|e$)$|a8s8ocKOUuaw zomepbLBuHJCZG_C>Z&4_t}cnwq-$3VSxCNG0pG0mEtf^JhYGv-BQ@FxF3Ea|*UkCX zsyDV2gw$1hW-dZ&&2CddKW$LPLb)xgx8`L&B5UISh!>Hutiou4PNH8kN#m!Lg4K#+ za3IeEIHLz~}tQ!-z(GUVQuuKyu22k-Rat9RW~6~(Y+ zX=x{PUx4z|4*e$MXh01~OiG|R=fi9MCnVsCt3Iq*1yljMNF8tJJTFN4KY;xiPAc|1 z`8`9}G5vVGjk{$rH-vVjApBDLEkFYXNI+a4hoI%=|BV$nns$CBSx6Jvl;`&*+!r&= ztsY^QH=~U$ya3SL?%^v#Zk9$0h)I_aqzy4)Q&qos_rGyjfRK|DnaClC=MSVyv3 zEKloEONxNf80;PnW5EsDxFVa%7TQ!wQaN_dwCgor@lw2#eh3Dsfn)kT^FK{M@$R`b zDLsna+UcMHI`Li0r0)`R2r8!zhvvq_wOYH}izxWE(v0?nWf2ygC&df=-$`*pz-^Q_ z@;@AX*j1YH>}mi1V~VIe!}&kw`ii^{QZJC8R*tjr*+wgOI^Vv3J-BoK9J%4B&JU$= z7Ar1?9B?%k117E@EnW?LEA>*XDXpmZ8SS5vc5j)+pq**t>=TUTEj}^8CBTyz`froF zPwx!(-WT+2h%~l%oOZ19=sPc>R)(e~7`k@|jA8MYn*0J2H-(k9kl7dBX#okh-nk!r z%C|G1qMi}GSM$Y&{(QfsKkFOHktwXIsl^Ijxx;qe9~YP50T1{ZJdHS{nC1;_tejO! z%Qk}+5+w!7vGL}X#i$wHNI~vu0N#H0dX7ANFta{f!M985*yp+zU99|vp~$Tp*Ta#Y zbqz)R@uLt4p_<#>Jro#C7)99FK}$PL$mCEk*mBLe+ zuyST?9O7v|x88Oyt-!c6R%Od=m|!vvSd^7}*HWT{;K}LJ=|fIwR}V*g*WE=XR&e|; ztiJyruD|0!yQK*D9=wVvcHD~uo>7EN3n7z5-${u*uojYKPrU?%G1PCODNh-!`<(^W z1iAnX>jDRu0ix5$Y^2}z%^y;o6NT*Ng? zerxyBN%_`6j(E>1$Epg%grP%36U3w@!uRjylT*}+Z1aeuV#Hb{`IYUgUzkJR zA$AvcStR{C76L`3wL6AOJ~3K~#u5 z(ghS1aB*!K8Z!Pj&>9I*hzCa2;~5nfdRwF33OXiuSw29c1zuK9`xl}XWoLG5$FWm7 zVwI%*TAYeJNU;`p-Fu)3INc0wj#XK!pt6vCS1x3ye1UQ}2qgpsj+J&U9T^`ighwka zgn)dC&|N5jL*4!V&#b=xKdv`Ww?nv;U4xOEAghIU-Y7sT!LN>M#~49ued6y$YI<5A zllvq3<0bJdN=+h*GV$*GFYbHxFNR~wbGarYIk!z+9c{uS=zzfz= z_f0Nky_!(IqGh{g)8c&Ec1IBXtOA)eYXt`%T+3V2zePwzk2~)F@i?&OG3J6l@OoWI z#)%E^%{SkGfqh0C-{m>qwq8z+FA=`5+Y_e%;tm`q@Y?wHH&>=QE63-n?QrS|r($aN zfXXT>{KhGPAdIC{qExz8aYqg%CFs80iEgmK6Ok_bzHe82C-_SERtY!-kSzqwz+wEz z4xmRFY~9`Ee;X1|@)Y6q{kZbAL>;NPkT|RK4_qIIl8Ya>UI#o02|`+oVtbvUU+;F7 zFNe+bZPfH2j$g3vGJd^{sCO2A|A`@x8$q7)6($@`Nv{qAQW_#;fWk}p)7y_GC)@77 zJrA<8!|@egDMP#P@CA&?TFSX4?=hgL2{Z5r%pn(`fAbVPUya#r;0Xl-6y{I?B?|Mt zkNHYs5Ey*Scpo!VVD9xX3k3AB_m2dgU7K%UKeu*h2IYph^W7P=`GQ-ozJY~NkD`!v zI2@CdF&jc?k69~*^TGFnkV+F%S*}o|vITO5-PQ`_*>?#s1rP$`GXJ#8TvFESsYDi9 zYjO(P8Foqo9orRiAFN@>v0EtX?bEzHVhe{L`DW>6X3SiQlo}-!^;iGF(R({i|6t`; zb|uxqC#$*_i~jx`XP6%_ZyVo6Yt6|=pU~wg-W~AAaUE=IZH*IYBqyQxTDXeKsSHPb zi%a-u8tj~Y7iDE-iOFO5Nvz0t9u52e}y9bXx5r zcMV29zJYLg4$)>G1{M;&s+QR0-^I_#!ukP1Ne=D!`1$gux8Iknu50GC_m)#yl+EW$ zx5f*6Mn#wkvz@aGK4g6PYRupRF=Kv*soIm6@wnrmS^RZ0czqN^C1#C;l@ha;z>E}_ z(RRTxJAKS9A9J6;wELJE0ecFV1rZ^g_H=2Uu_)yB@!0*npvh(4H7<#f(>F|X6DZH1 zgh2|s1sKx&9(%MGQ`**KeFRe3{kjXM$fP2ZDyjHnRel-o^LMm4+F}gc-VAA1O(pD# zn%|?174H_(XVgv(y>cZv-P>tzC_#x5t2lN(O1P{d4WxADk6Qqt5C>g+W!J(F-1C>` z@O__C&%C1RlcFS8VRa&e8f2XX6_x`^vt(XFS`&XJ9c1-Wp{$joM#VV|f6nz@C`7N4 zuC1S$Z@tB1k3YtSwd*j(aL4VpbJNtRnNLoFVg~}erjJisu0Tn_^4>nfmxzq4xMXEn zj=o65)n`acf6b5zYlMKB8uUjWfeXzBAzCT5T|ksa;n8->CAWnz+PABIJUr+WfJt=> zD!|j={cRWn-n<&)!HS3PN33g4aVRVM*hDgb;dbN*S_}PnA(=qwXlDs1Daa|2%m+}K z_Nd^^d28deV;wOMsWeAKKIL~63+cAkP|QJ(W6FoHaYu}|U;UPES2ys&UDxne1)wnP z0@EsCgTyR$tNvJFLx@X!Oq;+=^)an-E02(+Ky<-3-GaHy8EXv1hn0i~tI z_^X5hkR66~v-8;F(5-+qX+^VS={qIPA*lGaq8q&)xC>EVPf8(=c;_d0{Vt6 zD7E>C0_;}yhQ*61=+z75`*F}vu*%0RfTZt%H4w?kVdH|X*?3Mp@f2>p^;SNZHJkFH zQW{&+saFz5G87v({)1NdG#U$G9`aoRg_#aT-c?^ud3pKIfBsO2`U@|F(c4j4$B}eW zXpHue(&Lml_acPm>>-mdCSm>ub3g+~YXKw_fI)AG5*k@d`TmROpWlEq;4f`SBUZI? zkZJs`I8{*J;^P~EANErg1PiJY)D{UA#(zOlWd!J0j<(d5H<*5w*eTN%#)`CG7$bG z24Eept`j7X1Wdt_u#z+Ydl;9u9SFblG1^D@SxDbdzch#Dt)-OoY@zO(9BRjIN5+)Z z=1MVi$2PK@1&}frKeT#c`PvS;>>A!)|9Qqq{c+<$j=pXJp>T*dTNkr)eNo2qUcVED z8$rhg-)%SSUR%dge^XZg?Y1F#eI?Vsfonc5=CnNxjU6t!VoZWKLYtKDL9IZop)AjE z{md|z+&r3NFTIqeb?dBm-yz?Ey}nBR?EX(nNl9%jcV{T98XW8EHgfI-=Tb~()|uo( zLjo=w?0tnGBz*S&BC!Idn7>I-ChXv++oP!j4s@_ABWV6MoV* zFm?MUwM2!bO9huGrD+!-B7Peu7Jbb*`zmrqp3U0O-n_qH2k*~&kMGwt5bF?_utzvM zOvtm>>d(O2S76rp&|6}D<73te%v-L{jlj(IF~sm20x{V#HLU^9!+iuNXP)R%o{x z1twp>f)ck7q#~zJALhUG7U$nHEc49n){UI~?cV(D-7~rWl@~Iewh1U{kf?15iz6^~ z)01ZcD6Wx;NShi!NDZV6?zQc5&7z*5PVAfzi2fe~^uq1QvisVbgPyeF23tN7DAe4zk8| zBkR45+294OCh5lYl zf3Jag3um!=cN@Zmv_p|lyiTEZ*cuIlizVhF0mB65X@U8`_5TQg$?`ET3(PcuIn4S2 zSg7D_M}XSaVJBT#F?0w+zaluQ@A;Va-j-Dr2?c_q%gw?Ig33&175ZSe zBh}SzbyIOg7Kh*pTT2kC0VPT5%>Ok5cxVE~MjE=k5l3?xu`LjR194^SQoIWK=YJSTDJTjmoI(sJ^PpTWxO z#y=yJ+#Ns0%4`qoYwA&vMNoB`a1H2ggo|xzxiL);&LO)`;@N}y=*9N) z{cF(}+MY=We&7eNKG)9e@1ED))-*5)XuDLhGpn)>;B#F6-3`u9vW>8uO@tIt9I4{|^!nlF(0B&-*F~w<@?= z!LJp%H+V-~(`I(Ifi~8R(pq4-R;`EL_EHci@m!{c2JJyu^VYOII-%=G`us!iTz~@? zA4V#=PsGb}>44(MApms%guyv3fQ`T2kr4)&4&v1rJ_B6*w1B;cw)d|2~i@XPc* z30@&!{GDx>R-Fp9l_a2~0rWQb9zaSpkPFw&7!W6={XZb7+4;l~{}U2$$t53_W*XP7 z#yt5Pfb311Y~M(k!hjt7mcovVeQqfwp->2|HDkwaCUwLmJ3qS^9m3Xv)rr@~<2tut z!qNlScDYXZ-9VzsQULx*dagkIL@sKh;NY35ZPc2IUV5Ah=@$*O(?(gR`&T^74`X4|*{GAHBLaMJYif%E zD5gu*wAg&#(xf{-MasbJaWF(Bw_blZgZh>8(6ldDFl!}fjoNh^T5Gbh{s^>k=9R}X za_=gxJ^uyl22jJ_-n7wxfL|;5;nLfj{5=Zf!o2L8m>U|zO|Ld{b7(rn5y{o{hjMYh zl^lCe4}Sf8vU<>@Ppqba1OgCouOOEpeF9bT z@ZXN(s6jq8`8{O{ z90X>e#*1oh(uK4L&jLH7hm>Iuxn#+6I^Vx5R$Qs@Lbd~1V-jgZBBeQCg?-XOF(10| z7yyj1^wpKcg1$9^{d)Q2A=%KH!;FQRjXOL?7-~)U$8Pv5v`g;0?I`kcB8(Z{gQxE~ zhSz7-#wU;Gd0cn@3HVZx9SQNPUkqTs&#vLQ>EAK!?nj`p>-MXdW3-J(BpFz3AD_-; zE3^5}qy0GNqMpQ-^@r9Lj_uKtf^H}A!3xQBwGAktX%*H(POJl|4IL`XD^LA}NF+j5 zB*KanE7)tVq2L8YQh-PVbJbOZTUxq=vStIdQ>NJAb*n`j!5FY0Cta7ETKtuR!WKIy zaQgKmL79VXM6jJf2sXOwlUb#W)(lgM(NZzjUH^%cd?y5-N@*($$z)dP5VxLvFW{lI z!dHUwvI0Uv4Bjdj)U4yDzKO zmNV?OHgdu$zLiSej<(jBC`bsYd%hgVp%S=|DSEZ#shFf(~+XqHJp@ zq$3uxm>B0T7&)c~zy4J(^6J--{qSEgr<@WWzeozJtg8T{w1BX(9>n0~3(Ts{P)098 zW+<%yN)Na2rp6B~a-#F$t~HqII%rU^OR-5RnxsL9#LM^^Emn1gQl_)wDup(Jf`~#H z!G!J}k8Eh8RSKG8KE6p}g^e#ehHbmrP|8qU>NBji1zGn!EiKh}l+k;@296lm#q4wrn)lUg^(m< zr?p=wgb^sIIC&4-_tU5JgML>UC?`USE$Cf_?VgH!Kz;LelvZ>I2dMJWd`H^guU(HV^DYS2 zRHK1EUNIdwk@*Ws7`^v=3iI1RD~>&E3zI%PjfV5iCzlv0<>q~#aIc=Me)$y+2KqG^ zCcIL|GY2Xb_P6wA%3(`VL1hUXN$-N*ZtiE3oh6uf?5pJFba2m8N3wB46+#N~^1_@w zaR_4u=TiK@Etom;;uVg)o2Ih(h6zN_5NDOu3aJFzC>t+~(@@*cTqY>vtky(fgDfvX zvuI{ZM~vncIPa(_c!YWSs}CtGg6g~+O0tR(CNXqJvKw=}fl>u$D9ppck|g>z`AGOS zM2XOy>Z@xYrTxY#t@CO^JYCm8MQ&d{YOBQ8bHT)z)Z62ZwTYsm0T|rqM81EY8qJ7m zpJz7=V#bDUjM}S&+0PYl^^sq2gkqCS4 zIfRzhwp8H{umkZv&piG&a631Y9LA>hHmhKiMPvF7)RG`oaYP%wCEw^%QN%1ZqxlG< z4HC^`cMKw$Wpg2-CQAQEKZa!wmx4^^=o`jb9TI1i)j@r8k@m{0001U542e&eX3@;(%3pD4ze8Eoyb4`- zC}A(eSN;CPz`}vNvh^bt)-9wst2plA-NbynISTfWm}L?|5*bab{JtMp048MxibE-r z+pi=cB+qXV?2buJA25z_J;!nK%tc7u%wIRzRW#750V}KZzFSAmm>xS>vZ;la-yO(- z!?TIdgHM*OprCgxS9RZr@M{oC#d8_{@#u++8Qzn+ZOt?`M==IY8MjA@0=V?d5ooPh zwzh%nNC>Gkzde2^Qe44{^6W(W+a$*hkUYIyAR>aJX9#>L5D}~SFB%}YXP%G9Pqe>b z{5gb5OL=Rpp*ByEg<@9T7{(6UNaMGSwD<<;OQbYJMK;BGuOQ_GWNGUI&~E=fddwIr z{OM5S3}L<0{?A2u5u_JEhHRZlK?s3H;NcTOpzuuyVM6YE2;pS``BsP>E3?wJBCxMw z^o-PSbly1Hbq8azNAXeHT+4H(L>ylcct^AyZbzk%0f8OSVi>_qQK1bPSH^zmRZ3ym;`;X&_t0ku%Kc9OZ zIhKj1%>g5MeA-xiU$S%JMDmEmqcO&};qGv+UM&01e<%i)=PUXjC+T=mQa$z0d@CaS zLkQ}HbTv7Aw{@}gIfM}O?$ev;?@tHrrnxnX+nyLtes&w{wv==7>4Q1umt_>c_yp$7 z=?S?x?F_b_b39LPdxLokX2E8NAd{f1Dp>*esS3bkhH`d`BrxLno}?|dl3!L{z|BJ@ z#D9Nb%#(XCw9H^kJ{7O`jjBNFX!Co)ut&}Sq*453$NglH<^E5C3h)F8TJ>}& zvL^-EnOLbawcq#c>aV12vr-si$S$p-HB?M~pS>vUIoMi5(lSv6ehmqvQ zbOsYoo6VIso{5kK-`5CXD1BiXd0{_cQ5oYX&%zA7_FDY0W2rvMW9lna+%=&Q^T1Aq zwFyr4eQp*>)sh26;4GN@w*27X5mK{xTM?C&J-GMJ!zdHG$^GNSn6-8GxeLl^yYFgN z4JhRL#h0^c+j9Ds_6O+{fO0E;0A)>80Pa1_0tld-4dn^{Z6s8}_x^Scn|ClTj(Cx? zYR>}T<+U$!<~L_jP%)6ovT_=9s^8dn5;IU@A{I(&`S`5h2a13+3n0#Fo7VnEHz@vm z;4$o3vL|h#jZLka_(hLjQr}+BANIP0n-JmmWff5i+RB=%bY4;KO_JyHk5o_}|y@ zo`2RtuYG|zd>lJ2Ig@wV7x3WhdujDs5hUhM1c`MpDTiZMK01>Hpff``AABU$yXX1E z?27f}z;}*BE?I^#ngjMef+w%+PkDARCfg&~Bd7sSTbM9dD5>uoVzDkPfVBIkv|roy zUo-z2@*;V}WQ-2kLBxx&E4qsv9XsMYhe|sOAnK!)aVg4*x4+D#XJ{Qyod)xE@5`F{ zEnIcf7WS>_;DMPqN18$^s{k%M=U?1--*N12j&kv7dlQWc?t6LxMjH;=_e6{_-1fwL zgsa>DOQr7JC+ z4?`yL7`heLrCs~MXCe8^D+hAcv7Lf;CXhAfXpE9 zorT|?Cy~+xh@4PJB~U0rQnMLlC!N$hK{8iGT z?u2wCwkoiu{J1y0PnqQHZvqQa#w`F}_!ta_k3NF;=FdPW#gPY%#~6e11sD@YlS*LZ zmb(8(+IfdrQQdv~Gq-GS?9z7WRY6q59z~6!!4jiU6V0o}5{)%#utc%mo zFJ$H7cR2j`0xtXg?o>t-6y9+SX5mtsSJ6T`ubW2Qo};++n?Evd-N*R&-O9h60w@^{ zH-!o^Dt83XGs=0=d(o^0faVrB_(*u^YqtFMLNJEmk3P(~om1h>+0dsd>+3!cRT5J# zAm6r}nLU3v0tgy_oba>a@2sT>k>sQiCs9*e!>)aH z8FumNHm-}7a`zD$wbd@A?9p!%^H&e#t$Ci?g~opFN)G_-ohd$DxRHH#tEO*7A&t$Q zVL?#J>f&u~?Bt8D>pA9-QQZ5?0{47Q{Efgb_jzfN&kOT1P|_;vU=*k#ORd~0hL4ga ztMZ2xU#9P4O7q9(4-9?HlWq#LeH2%B@BMSq|J>Pd@=lWGlohd*TA;LVPh;=37O3EJ zV=dg31&S+X!%{3s8cq02J7=M_{QJ&t!v7p2B)15O5h=HXD2R3WX;If2*it0*=?oNCDJWMk+7>`1gAsthR}!NQl@%V68 zH=C$lw+Qb~w_rM4K26w@hTs31FX9`xqyGDHRb<00Pf*C@=!z5=P2yC}-mUlf4Akw;Zo)HR}9}AU_Y!^Vo91#Y9I8#f&M3 zXciDqQrZlWMDXCd#~rzl)E6V#YO)&iD3gv z@Refck(ET&rcu^G{Y%kGbH&+vGq9?d&ZJMobIX7oJ;YxLYv_{>CG`YS^nj9f*cMO- z#lZf>&h6U0gRoWrftAQ~^7p7HsGvBnxK|X};|fg3lDe(Wzq}iUmtH-F zJMW)O0!AX3RLUk=zSU08`a7E|Z!2E$Sxq;(k0rpsoKHJg&raRKA9V%v%EIPCQ9ZG+ z3(o9L_jMCs%!O)$9|1U)w7*=Q`(6vs!ImvE(OOeoeH3=dugHBz1GV;gbz@r2wx{57 zNzfqZBvw&#?kPRI{Enlfjg70aklRe8RW~$HcEABWl6YbI|GJlC+Yuf)0;@M>Gi$vO zb3L6A;PCC`|M#)bMeYpBindwz_1j;Q7s<;?7r&!}`pJ_+vKJTrp`Xo7t6;lED)T?B(K4czQ%^STJ-gL8;K86}Y(XSTM z@!SN~MWa0;vAGrF{Bd8fHNO-txPOIfUZQ7gs zDfS4rmt2Z0DB}9hPv!TcA0z1}dEmQ?m|XWe-kbRx`Gt8_s?42Mn?SMr@x6GrtuMFz zZ810WTS{Ie!t^ZzIcJ#Ws6)nb{L}T=#xux}WJVlf{D+Ubz0<_zRzPRve{W}HWv(u9 z&_}uFtE##o$eDkS%zYMM)26Va%L;GAh;I4c09nZoJ(rWL@}*+@_9c zx7?R*cGY+KAJgxzowl9SP8C);RaocPBt&@anDrC@eXeuqXAF0rQG@4sRQ>+4v_g^$ zWU?}3&V*p~YqRiBe7$Hq3D1iR-R<-C+Qs|yEL_mrA>sNvPqpu_wDpHq$}NpKK*p_< z1cp+ftbO5?JFcdwsD|&(`7_sceM@~|f4ocf<+m%V*r|O9b7F6Dz`r!n{?8N5j}Xz; zi_r-lBkEIJ@O%UBy!aE&x$G#C%a=i-ixa8`QP!`LH@|A)fQmjg*&{5_o-X&&{~Lz8-+GGCP3X)@9>YRZ950f9a*@ z&dw|ZI=D9WrfNK3K={083{kM#-ksVVWtYIf3=}$0bq-MIa3`jm@U;*uoi&R$faj-A z=V)N8?nPC(ND}#xz`QLn9ogZ>TCo*n&%rMM9mxB_4; z<-#eIR`iw*-9(EZT&V><_S??iA8za0=aWs zMF*j?{qlu0_|8{_Eu`h@^6j$kXBv7?s11p=GONQ+7Zeqi-sf9nN5io|0jcrbFM1?CI zX*K8cX}8Q$4DMeJ_}o)_C1tIbU{VXY@j7k!6O^{ zGGtH%K|iQkTPZp4KvJt$|;JohabCa@hnalGJ>ix^C>J$^8E9H#fufU-`>KnCO^ea zO>0>5#TdIGp;X~n)>+Dj+(*~LUr<;*0+etst?lxKvA*}AHQA{2vWU?TjnlTvM{xJq zStznL8V?VtBpX{cT5?YbB3=Y-G=7HCifuLNhBEh->Ap&XGyzJx_g*ljuc1#Nw)fNN zeGimQptMBjB0KsC#5uH~UlF{1h=#ZKzziM+`6U^W-hrHV(0i*4rrn8O4(OL|0F<#U zHlPBlytK@ArmAefk!vA{xOH%?+o))1L2cbiw4i`B@9$nPXv`C8y96Jsi@N-(B5`1Ng)m>Me<<6*M+th9_WaGe#sa?H$BKo86SsH7>?j-*)W*TJu`b zM9v;Pj-r;$bgo)Mq$*CqnBg?7-prB)LrNNap_tj#k5o~L=eG9ev_7@`N0k!H-J<>b z)AIJ)lplFyxNGtDDt}NxGgm;WOJUa<=ty~CXwn#;O8Iujv%;6k{(r^GuYGS1wsTt>@_<=%&7Mu+ zJ2;9Y(TF69ziC<+nTaT1mO4gO0;1 zDdYKtt&I2j5D}V1EkihBTpwCm>PY&EYx*qbFYRM_wy{4am8@foX{I2*j(1%Hu<3>y zNY&P|^||LTLbB@EW7Cz?Pmi238_@h=!Mfx10vRwZGxv#Og3K(BAqKoe!-bzGorw*jh@;ren;2a5W+GuuIdD-<)|SYuByg z>Q`RjI3f6@6y&cHn1_7KBp)+DVCMT)J?Ir1ehgxmiETt;f@hzVNFiCc(Bg+@o+nIK#6`>;r2L8R|-y}qW zl%HZ_%f@simKN{`hi{VZD043r(3gHV1qe~#An|kKuYBHFJC+d(K4sj=u^uaMrg%lS z=Xan1kW!NOi^be~_8>Ml3#$Vt4bz_9Xr~=2J@t}G+v$i?y{YLFXU0WeveU2zntuLU zG;rLMH)-AVVY*tjV04PgLDS5(jep*5Be3?7kEq=FU_`3HrioT~SaBA63MMkfQ5n5 zwiV0hTOE2!3(^Y;Y+U&ne@~2?kCZgDJ3E(~{z+{>O0GHdP$I&|b4!rHW}{yJ{=`1~ z(3Qa)RpcFM0365^s4!%fpG4vfUMu(R)Dz7m*Ie9R#}=I(U(G4SEbJoF)w|2x%32&>9- z=9v~cP>bStelUlX;nj1_5WS+LmBTQ*PR587X296)J(#P|_!%g#^if*z{HM>;o@@^# zwwpVfdF+G77&~}u+LC6*dcn_4x6yMW`VKJvJyo{B^I-Z~ydM zX8ZrxEgc68mp@g{U8h%n@AHvJgzJBH5C`x7nU#CE^G;^_3)tz=cDB|1>HB+rcZ@i0 zFQ(mF&4$ed>_1@$bC;~Atuy5SB5C(_5O&xvr3?Y1;njWkgHxDbno#xpch!xMSj&Vt}0$B#1%TkLnmrGVQ3YOF>d|~+Qy7AWb zASAv}%t#DkWTBmcNYW^hHV>Y>u5tr!FLVcv1`q)R%cDy-e0No z2p|__HrilvjDXtMDL|mp7NC%m9@AX5pGRY-$uIyKq&^!@w4jV8q07VVxuvn9r~^t2 zw?8dm-cww4-NDp0c7{E*pJhPH-WJVnIj$H!po9%f4KI9C#9y*Ih^H$tQy`EcoIg$_JcoTDLs2V~v3Gy_mfF zNX|QMUyeCoSI)cZ6%t8l4WB}%vEtAspz*`elL>owOt1k-+Sq4@`x$e8tsLSCLfE0C z5YFZhl8hQ(xUfUA(Z=D_lC{ie8jNzj7#1XQQ92{`p0i1j6xvXhjlSVN!=Gwkv zvVG-HR!57Ct{BbNH-8Ozggw2G0&O(MPCAx7NA1ZyZ{CA8nhT~}K)=#{tlYd3A$>=i z^?(A0D0A;40BMAE{d6eg*Zt%bYdfp!8b~HnZc8`i;w+uBl+AbL z*6_iOzA$+i6+5W>>Gggog(Kj!6BsqtaAquxD5XL;oq(X1_l5l|K$(3hxo^PN^wFK9 zN>hBO_8=I-1+KP%)jTYJS(4ltQ{ES9G86DbVj4`NhzCnEO0cOi)B2%Ui z-DMZ2Q%HAJewQ@XiPeDn07g9(P#Sy;R zq8L^wt^d2W1wm;Qo&ZEZc#`U}ABbXV1qGy0&hl!66y(M8DJdvnT;VuI4;YP5f<1=q zflz`C%^MiiZ**v!0=lEXQuT;(Mk7&1mXEYyXQIGTBZx4t99O|{J%ZiJ%q|C7BeyUh zm4`OQxd2!oNGMHpRbkk}+xfb763)R@Ij+F2tp^)R+BvKwQf-I*{mQI9U3BmeB1(jF zS}p7@v!SA`%Rs4;tb6c5R6_$s2-d#x3T41kE$>lSc7RE=&HbK6z&2dQg9l!kOLKdI zfmNjh8&jq$e&97}M{p`&@d2%sTh@~hjo^8pl_BbZl7>h;hSmzVK;*354hWzNAq~|7 zO2QqaWX8&a6lwloM*JX-&adM`J;0@(3Q^*?Qzh0?F}Nu07ZR2~ol*X@LZL#?OKC&@ zl5}3%5uk@uURZ{r*GI#ONj)T1p5?KwkZ zs3VYpLL23lyWP(UA*rseX5G4VeDlpW3?4k#>IeuCHV%R4>I|h=suUM1MI7)L0A!ent+z^aroEp=4Sfr_BmS@?Zfh_s&3R-CJh!Gzv^=&CfIq{=&)j?E1DtI z^+m6Zfam?l^o$NCbN=pG)UkQ_iA3|fP_bDVl~#3j(}G~=Z&wh)Rsf7)#3946G+AzV zz2VK7&~Oni)0y>&1kOAuVU?t3Z&A;kxr*;~f$z;OxSz5McD%?T%Tk%m$;gUYO} zxrN)_x2Dn?W_0)+40?Ew{iz-Ki5QrNv$vemng6&s*7i`&{cat>{Gk`)OU?Mj&(Qe# zjikZu4wp<#1O+C|E!&8ledh0YXuk!Vx8eu}C)e?NIg?|PmotS$Ov(F>lb0XD#?M~E zmZY9u;&z^8A`?htxgO+ZT4v=9&WMZQIX@uNx*eyG%@ezlpAVLl)9K;0ly3dq4c(-$YPP{ORJCn`>E~pl(8^OVA_E0=OIJOq`qBZ@4|4_1 zI278gkSgO;nY}1dN77buXDOdGBS4{ZP}p1)b$j6h1w}<+{sX+wn&R2%SD}wVoao4`QN;`17E{EKS@8YjAwseJDAOQC>=%U2u4dz>iYnm@p*pJMcn?NCYDUj zqO!6-r=4ba`|Ubjdg)ubx_rxOXINqbgN&6rQVbbVOr{r2kkA`CH_(=9Lum_@3@RSX z`sURnR03c4*(h#?6Hbs}nfKdWM)SOIcx5p7sT8WcjoR8`gx1`A$xMvsWPR=Kv~Jr- z>$X}p)|WA5?=@_xA4^g3a6s~S@=uf&PeZS3V5cREVDn~n8a|X{Q6+~qck=Z|%Xu@h z2l-wn!fRu{F>z*n9%WEos2Nn5bC?iKcvJX?b&IvQP@lrH3Mbs zDg5vkGV*`s&DYadyUta3i4=BkLn#DO_(&nB95gti@IZT)aQh}|Iy=)^4BAn1N-4_f z>(G7*+$@;oR;poo@TGs*zvUD+}=us70+Ln{9C2P>Y79FGi(KRS-X#B91 z(#~c(5(whs-Z^jVkZcI(zbXG2Q;`Oje_97VEI6%8+h`|+;hgH5De+el(OsO>*XMSA zM-0j^ri(~q6UQ7=%<$pkdGg8CtXkC;T4()WImUOYu5MW-r~p|@6IzDE-le-=N>ieV z#hbq-7LRes#7lVMnfZH~=L*D#}{G z2&Vk#EBaM7aq7=LuaxL z*5DVQq=zcS2q73g^=Ql)r+se$SigQfcgL~dCB>Zf|41PKCHazMv^k#tao4X-aFt$$6<-OfizkKM@6kR$sOlUTS0j-~IP4F05Yk$s z{Ukc&V`K`?_tWq15b$6RMyrPHvm>h53ed(1%W5E6Qbg$$BLTyfIbVgJhm}9)?-Ngi z^UgCgH@jY21$%D>Bk}H6DGimCaM@*=_$}`JwRK=q0m$Skzshi4dtvi=Tv$Dg4%v@6 zoyUW(iP=_U126+)irHoSMci=1UfglVm&}{DHSF<&ir-TMkZy=g2=x4@`bUhd7|V03 z{!U7#7+yS_ah2mZb*EFg=F@9J7GFcgu>S|3w6?S`^V~&jt*jzH?(wU!d-K)H3z443 z9eYpGeO3+@Y$k)+ju?su2+!J@kG&Y60-5C*ny?8TB-8 ztUm-l6$?iILH4)kJj$a{h(@#WPuJFxdh-?guE+cwh7Qe+zvt29=TVVae%yOKd(D-$ z^80>P10ciC1WLHZR|cyp+L3(L87C5nIG5v$^h(*@Upqj^x2?CUG}>yOC_}cKS%yMZ z531N>hhD=z!wzDe-wZ~v^(XM{QBR_bVZ=38Qu$=PYo!9ir)_p74lZR;%}{tpv+J%N zwYAvFEwD?^IjY#X*I*$+_!?90c$BPp2#h?%;cp9cVWSc%}8G%g+%zuN=yq$f7y=@`LY`dE0i6wmc~mdj22Sg zu@PVSeATdkJLca(ZF?=g@sUQ__M^NU?zsn3UvE*$jQMgnXAE|A4Th6a!k|Iur=O;1 z!v<19;6-DgBPgBXh=UgL`NEOxyK6l~1qs^P?VjZDN4nZdKNXkl@2b5FNcW)XtE=F}l!Uk}kyz?@L#T+vDTt&Hai6>#6gFE`*{+4>MN^c-zRikK#M?^Wf(^vIc6?cZ zZ-TXQFEk`&=6`tK(Z&nAY-9N+$8mdmGngSg#J^{h`u}ddliQC!DqZn?Yx7X95eP;B z0KP9>Z>bSlqog4kjfRj;EMn&m;~T^P03ZNKL_t*cp6A&Hz;XRv@cw>)TbqmqK(M2# z*cgpb8nj*Uhz%IXn73zvl!)ca!34@2CZiFs-DPlC)hmzewOd^GOb|gQa`6S2p zqN*AZBl(@}K(aDcD1mQ$8oIWS7tQ1Jv8Qv#=Xc;6pO5Q4#zagS(|>IXnu&Q zYg-!{*xb@Vby*n(FEqeR+-W7dk6uD?VLSIf^&_hLHn4D64TGJm^*4T#82?|OZ5K>Z5Qi70*xEHJnz= zSB3FXx}1ita+;HcX&Zn$@wGFsIRjM&3Qb`F$9-%#F7+Z5oZfT%b@03ipEug@NkYT{-T@@Cco#4Xp_V2EHkBL=#aLkBfXic@!?zc0% zbU3el_Zsily&s~unjTQf%rL(v{NcNfqwvlfFzah++#02;>p1Rv>L=X&hZ)2pNq%w^!S@ER zX4!{Gr8whfU+~%tyWY~);&I0xZ4XjVXn5p7!;qmT5#hvMhwq-}vES*Zqxap{y?+X% zWPORxkjckvxAF%)rqq(V=(=P5x?|$Fq$r7 zFiBSlwY7rBqCiB3^Wn_*I^(W;xnb%dVTHF1fDEr%h!6!&`Z5$P5e_HT84XLI523Yo zmETUsaGHJ=Xw(6 zN6YVj%z{Bt#)-R0`1KBDcAJj)!fikz()YpkYEn@w2k{2ap!NT#%B*!K&=+HNg4f=_ zJoX5trMdTtn1eEEvWIZK!+(9_bHf+cQ`cU{AvK3kl2^k03-4#ewiQ;SQ>oAf&<&;R zL5IHg@L|iKO~m~Tn7V-orKzhgW5(b2<)?>yN@v0gMJ^Jp5sC|aii_GIl3v%BZdo%R z(E{!~Erj7QXWnS)R`lWO^Ize%`+mjOH2|Lhnxu>(gkf}PJvZH5LiwQLbYYjyIYetW z@=F`>=<3RP|9_7W+&483p6-;xloWsshgzW&tC}gOMTw{ zn~%&FM7C`|{m>ezqT#&$@nsjXx^*;14t^Dk&+F@^^5S>L0^aM=$GdD~hIxvry?we0*^VG2X1jnNnpO;bbMS3J41Nm_2d;uVtlwmm1 z`CRnMjigecUccv1YEnV|+xQ9P@k3Ox!@P9Imr-s=!Jhv|?nrV$K~9(|QtS+Y9jb zMVK!>gNh0$DYjUmYwZZGPV6EJWz2X%&-17*uBJFz9PVE?YxOK%UHd9ZD^emwG#+Ji z#b}gK;Rv7`O6invb|icWC=sEsXfW}CeHdC1LrafU^#^h93;U8tc|<%P--lERqLCCy z-y;$gSSZM<0uSh0ltx~Kb{xFJUxi`b(w|UKoZ_LUCQx1$;oqM`2yl+LNN`5=JM7KB z>AJC#<}TNAyNVqS{hc_7cCumbE?UIpKy#ktrC(OFU{suH=h7Ui>N=J}8Hvz2D77Qq zGEr)&6w(M7B8UlrDcyehk<3uE=#*Ajntv97dXrz(gU`aAFZvSifrvbJmC55qSVpnQvwkY$cRKl z9f}`Kt1>rrDcB5N=ZqtbKIfe*I*E+?-p=4CYTgvKut}L@%;jU!;9V{_7t%@Yz6d&( z^!(d996pvrjsSCj-|`c(`LPIT`cJ!W=V6EcMZhsRk?aXU)pUP}AQrE23%jt73#E(f z*UTgXbBVw_7ptp|$142(5R^Ljp(3oRa3(GnfyVY7OTST9bwZoYCdD#Q=zt`Xxqo9( z?s+X_qi31d+zikB%pT2Kr-a79K*oKqA;Z|hjvWX8_C30il4R1SD=Fzn`n+&ewdEy} zNqnX7eV=49$!=$!*)8`D;H{j5jj`#26NtqK6?nD8D)#=ed-_#u-I}Efk!jP|k)vYJ zp#Q1-k2;&~6m>3ro?DF5uZqXfIaZ0>(wq4M$(;KnMCDi9dTR|=U%i6q)5mh>otsgr zEhCz_g`x0j%pl^{?Ee@59wf*v%ZLqqHA=gb}&KWgyCKCMQt_jpXo&EZ`$+5k&>ad%#zOSyo zA^gwil~=fmU2?b1f>Us{|avW(@-Q313MrY@J~W#8_p<}C1N_Z$vy&3ay< zHB_w|)Ghq17u;T(BBAvcCMWo8l$J33?s3<^sK>HVW;BR1AQB1U?@kGNT=#s~>wZI9 zGX1#Jb~(}4c1y4CL#Zj5)Pm>PUcalAlYe{$%j;M1&6YLnH)0~Cc_l2aTTWp?A*FdG zELbxSqA`f&TchI0wG||@VQVa%9F)}7T{rLq z6iV=q^Z&^cPY>l6zo;Z0hu{6KKfCQ#!2J207M;yPi9Ljjanu2ya?qqjn8LHU_0hip z9Za8oxXZ986DNMh-g{qeEvq<`^hHVJl%7%28Q*x^e8gbh{0(%SF^Zet+JM@cME1!; z1?ev(a#I3PF@^_zF@mC~)qFeR;RS4(2=|}yCoY=ZN<{v5DC_i#k96@jc%!UQ(V)2a z@?*1zQUu}G&6>rz z`1PH)A$_%`5vn&&7)yEDWL)!gq+b+X?BPfBhQ(MMXsz z1IeTU&rnnl$O+~w?d6;u9To+S+B~kHkwzqFNFu=otmx)&aL4 zo(?}3#g)cGYl~7#Wzs7y%5dMK9Z*?NffoTSpskH(Prr{C9%ns!IX50NjRB=q%=mOB z`wX4PKErpzJG&3~?a*(O9eMe1?Ud_W{FPl2#k%ZkEfGQbDe3G0fp?_fwHdDknz~Tm zT94hVAOaY=QeF7cCmzc~NS}nC#9-)5bV3BA;vTS4kf)uU_R&_ zCB5a!Pw7`QnTrk>NMSU>9mfvi$uApt^SxR`MZR^*-Q3ABQ-^ZF{{6$b*=4iV^YOG< za2GUIv~ca-32uFYBT(Wjs|&uzl0o#`d%@h_WjRzH%saRT`y^?y?Kw zv(J$4zfWxHRFY3UMP%quyg`Ez|CyZ?e!#Iuoht2{ubqh5>rVDqG!I(Z$=8aBtCwRs z6HFB`UiFS9DUB8J)Yjh7nSh~#ipcCb?|o17onFnk4$DgcQm zpM|y#jL}ZuR8w%-#oK*8QQ87OmI=f<>c#R%|}HU8y`v=Oie6xhL>J)*eEWEf5Zg3{d&2vF*I-`FojPCWbrC~D%JwQ$E5wG8by)IF~q z0vTb_q}2==;wr!NF%L@2`>x{khO$oV&!*Z=PG7i`t4|uq&ixBHW3PVvbbJM;-M0iG z4bNS@2bBeuR9jHj!I}3jVQAk%C>?AKk-nj>qLIswFXyg9ZXsekvNm}%CjECnmPMoJ zwQJ#;chjwXDjrsTqkUptk}essmENi8`cfgZRSXJIYNdz{8%A=|CiJ`SQZQ{AMoPM_ zzdl0VjXRoZ!aFuV5~NM2hjI+nyl^NIB9M@uZhy3RPMc12e*!fn5No{EC4C?#oZ zE#mI?F93YX1~1^gJ4cf84Hy1q6pugKz_e@EVORMAC$J2QzSHO*I3S-#@BfH{PdSu} zPw&T1man3?c_U`}b@0OTsAb>q&=VU;>ZnzecKU{aUP4txjH@nM&gA8j8J$0xKG8n5 z0^&xWMy7jz*W(9sx}ms2L0igj^k^H_%%z6BsC85d1V^MpsSi8tEZac&DN<25der{Bv+N@d z95IRcjmv0@COK}`DYPcrSy=luKl{J)X-l*ci5CKf%KUQ7pYFDsktmhDm&8#mR+j&t z1tCZm@vUEjS5rgZ=bp6vL6GG&HPIASmFS5t(bNQxCa`D@nNy!XNK6hAg zhZIL0wa|hLT3{X&n76z4yvFx2yY32SoB?;;1$S>lmB*0@!3~eEVE6s|bM+xL^eKq) z##Os#W%^}rtmlKb*CPfLAgb~pY5ic8v4mq?=@u^j@EZOwi57=%Gi084npa6B_ zO?V>{;MZb|Ovhgf{&CoY85=zMSsOfh`NL?tcP{!e5FdU>?0^G^A9*DHJMWUX{dQD) zd$tl#jw-Du1U_)jsSojFEWy7HKAVI7^As(9l&|*u6$gFw3ZM1cgT(v}{FJiN-1tP0 zR2Cq>M0e_wN`nViU$l%wGiN&7Ad5r7-*Nk2&E4%>F-ucnsar z0S|)ZanD`L7iYY|%I{jKXvrg)Qhe~qCbo{7%DCCD@QTYo0{q|v& z_CJMAVHmgUbq19j$tf?Td*GTfkEd?aa7=doOD(|&mTvQTr&iD|1U02ThY#o(1@@(V z7nQ+Cd{%2XalE0X#Euy2P&4djA`26c%El6pY`C>b}k6FVp z2Y$ww5nr*kE5)DZcCoCf1K;?e_-B@?FB+|VrXI7%qKuD8%#S0vFvw1czo~<9M-1W4BZqV=FkfCbi8EeY%_r~GBC3lKed4wP$ZS>NYE{j( zM_#+#%AXa!#x`2oQdsER1|a9^KKHahOQ>vZB~nt7HHX`g3J{4zsF^;U{db+kWgl;( zZeuI6{k^Ot+S(=-FW*c`?t*75LD!ioBl7K2+}E|3LcI%01_g ze&frC)kaj{D=&T3AhZ?FfIN)RY&iKs-h8v3jeku*YARQpGMO!N3K7aW+X(F;Oay5( zQhTIK6v*opCH~$KfJu{(N~b;Eq=LmO9%5*}7{$pscnL*QXPmh$GZ2+O$$*)Rvk>>B zDlOQjpU=Jn1zo<+K?8e7fn`qkN<)`0EZk%mQDNh{px)5jWr#&gcKH7G8-Q1h$#J*q z`RJxfECl8VA2Zj*`v`%V*)s|rv(6-LZ*-C3tOL%XC}xccnX3V1`DF+txNznLq*Thb zl&%5`0luHdnLm4vU4}0~S1jPeEv4M{*=Dyld!Q=pcUSc##!lnv*lBbv%#fIWxQLdO zVGf&uIr?bKu(T(cP=bve8(G)6j-USHry$=#Y)j&A?PB^FJG0M_B8)M#`-;PE`3fO5 zv#*~-NzCJklSc6V?vJB2Q2rY@0a7{OhS9fPL8l|nR zjp*gmxZuj;SliT!RGPPb@@E2eeBYNZM@VUH0Lh3I26g&?qxzTe)ol-ux&XW%+WWch zN!I`yr4Z7h%$~9&qcH|g2fO%a-mO2Je!Jcdx{y_Kry`XAd~V}Z4(q&uwzkb^DNznZ z4X;9=d}$#Z-@;5vD9ZX&^B{la#`V(~x%N-Qw-xcrv66+F^2cS9IpQA%QVg^ z1X`$YZ^QiIgV~?IbKrryF>P8kjg2yU)kqqYOxq2D9g70D*Z~9bxc&C|Fl{i(c;T>G zDnn<%MSS3wGezHkl1ZK~o=$sL#0s3`qRc`5E8hWFJ_akXcHuZXgjPXg-UAA(r0y2J z)`p?wh9?&oQpzx*Pf&Kdhu?Vg(LGjb;rkpnc``(!)X$kiJTI@u@AUz^(lShWg^QQ4 z(*1uFVWVJ#z*MDIFOULL)z67?1r31Pi~hmc585RJr85+LeJ(xpQa)bwaeAnfQGuuI zw~RgqEn&>C&uB#Q^wK*3MvU4Z+ofwg~BjS4WR71eSvQ zxup#q$}E+kLycv8mEpFR4<_Xsjyhok>sC82IvrF%!ZqU%<| zrS2BK)`sVoxM`C%%-?8j0lvx!Uqa*CZ}-}>H@^QqV5KK}JG{)+ir+v72>R^nqo@!@2{~dBeJ3}T^Aw0VV zFRF`p?_c%2wX}tIemjml5B~Y)$9~DtuS&b}HNSRjR$yHSi;~x|N z-!83Hmlq?Xg1kX?8A%Iea}GEyT;K zu(H_SA9q=|k+#*V*?Gx=tj}}JGT&E_&%5_ax{_%kB~WYior|jUwVMiPl2YRP?%tOa z#3IbBSj4*pWBKE|ZA@#MMMX?7XUd&0(96{SLc^mJZ*A9YG}{ zeEawX^si{JD=pebM+~wal80wDJ@z`T@TxHGrt8jdWJfd_ekabEJ%pbG@-V#9Yx+g+ zAl;DnlK0x z?D&3Y{Hyl2-~0ErYFbuqq60W{5Bu}Q`|L{RoF&;9eohCSThxDO__3mzeg%CmSVP0Z zqus*j4?1E$0=BhH=g(8Y3pR~Fx$U|wydeWMV3Sq{7FzJiUuS_2_fGF`BOA83+AS3Y zI&at^ph_Evq%u5m{Wrvi45rUdrn2Rt-_iQT7v%NnZ}BXhn-m#`fz;~Nte1kF;eS%K z)v-3tn>r@^-9Y`-7&qLPZm4YR*5BbfY0b1}KH>Dw^O$qXaLzq#5UCX-puL^rYX(tP zbqsH=Q=Gp`Qz(qiY>d(6Ck2JOT-1GbKHvJ3;;n8>4b>!!Dk!Orumh=p|#HaA0 zdbE;m9xJJT@<{;xeDBXfYAjrOy7aQ}{V(Z%ELuvJ?$Qm-70>;}b(KN-MWcAB6vSc} zZMfvnc0?-JwK+Yd4Ah}td(^2y-*Ssfe}(6aV@4a00#7NM{-HXQ2=VBSnKJfT)0gRYFuipC1jVTHM03ZNKL_t)2NrvKGsYu%z5HS?Bv?AiG%6KSIh6&XA0-PG-DQq}` zEGl;Ckb*$Fb}^FHVks%Fi)D|s7B&~hp1n9yiS}J~Nna?oU7KuTU1w@4wsmV5I1t{L ziuI|qhjXh5X`h9Ns_GblF_J(^ArpoIGn(5!4#Xhpc^>AOXP}?}u!wEjvC+A?^yS!P zf(~N>P-Ubf*+;2ks>r1R&no_MX9u2pV;hHM*D&|Tjwor-M$y0Hx2T3+nDY6V?AVn} zVcQg<{q3SvhMhgP^M`8;N$+axN^x)~xrIH&+i6h{q-3PWm}w!J}GFQ-zK3zHz~ij+~PDCb8=jMefJ&q`|q*ee%l;n4tQX;)>CG3 z;FRzAa@0;vZKnu_S|9^S1nj zz~HQ^MoWSL$;^D{66!?P!eoSKtSDom%WuYQ>@dFOyK^pTNl6ZHO!r>EI@rC9%4ILo zV%#v2diP@I$XgKGs!49!d9RH?qA=5*>T0sGvJR^7MM0E`&6|0xcW(yYznz+`Td`Ub zvXbJ6<}(XY3Eq6;HEMra!w=6*rh3zMv=oFRlH3j*cx5&mHEqfkm ztw`zGiLx!_tW8U!p%jErJbc;=@^Z6js9MYFo$Z*o=nsH!D5{NvC{p9{A7|{bMq@qg zxOgdjUj>ptR1pV*(V&%X{QN?=ob_A80bipbh7(I?2gz%h#+Z9Q zrLL}yw6wHl?@w%agh1xuSc2&4MFcxNi1pGMH6SV5w?nTocTa6m4VwEVZs6&APhj-K ze6Bd%f zu7jEy?29jA*RRJG7Gf{B0NcJD_UNOq-_37y|4@~Lo_U%n7cS)S<^7mk(Tx)-OUYUL z9t2X{v5(+w-sV6|tx4Oauo((oRoGiyi(gkO`DV6c==rVzsI8HF`MKc2OI!iykPWBy zO7(}Gja6l>wN$Ksm^za}+iv&mwFfw?MJ6j&z`O+unD+512F}mmhR5zF?YRClTz5Iy zn>RvgDskQ6cmuH8S|U2F@!zeb!9@6^_!EBD=>k%$OOvpgx7NSK#hor9GmsuDWKrQs zsWo_t?t?O@){5soufhaEL?VK<>o?G&XK%VbG@iPzA0cDVI9|T^N(M+t6;OQY1q9O5 zd8eoq-IHrbv5HlxM>43}7RrCAqCpsvf~lmmzKG<4zSL~J5v#*~1r)BL7+-0}C+-}K z6di$R*YFyJjR=fUv9)*uAbe*czEjdz{wMTYLOLN>rwFb5X_&je0XOX5xDlJ44nM8M zR#jn>levGrK!zpC2$ZizjX8GIw-T1@k zOArz+JYzP!JFMgLWyf$t=bw3J_6f)+%L^QS_~Bf4-F1u`_b656l3VXoKY=XdJblqwPrq(uXzZmHSaI^oK3s7A!Kwp-L2O7(ed0I*^z+8 zVCT)l_U?@xH46LEORo37@=EN=Rn6`ns%fy?c6146^gb0~mU7O6{m35Jilwi^fQ`4J z*tdN!)&?o!IgM-k2ho`j$Wl$>mo&O|rz7m)QF*|G9z1 z8_Q8fGN7TBfrqCz>w%3iAj{ZNpHJ>}e`EVEyD45cgH9)2K*eW^c=(9RF-hqJ(waA7 z4O&na5myWj)t)y&7vR?`@dQS6gOLT35p8zN2FIS3V5lq3Li= z8yb>R`16!CoPW^;SYvqmo$1uo)iL_MarExflM9a>$@&=&aQ3bJsh(TzOiIfZ@owiF z7Vj{Wm~=cPSvdPwR<_BYp9e}r*b@#?Q9Om6y9FvKg``jzC9Ere%I_UjR8`h#HU7fj=>3FjeXCQ=%{TyhlM+pfh! z(BZJn2@JvU7Lg~=#c#S+!RH}VO7EpA|q(hj{95vpqf%*kp=R!#$* zO9WCXAPma&;Ep%22$g^)`!)!RZ-0=&Non~z#+3gAQAS|+y))v*#%?2gcioy~r8)k% zLPlPHEXG>u>jkgBw~EiAQ-G?f*z^La9KJ0jZLJ_PJ*q?JpS6R*+NMhu90m|}drOpb z6-(+yy?@i5-<=Io3ZS+zrHPGIe!clAY<&^dC``j&7^<-V;DPj96fppE*YkvTw?dNcBY>EyuyP}Sh8jUpswBHwA{D-^OtF0Pj}AoBuGbeT&g#TUb0P|C47PoH?8hHr z|MVy9XP>zdK(}stM}b=g6bp*e=z2DpX)HGLV6{9~*$Y?ncZfpW{hM zI8UH*73LO!iTDIns^q*&B-LRbuS^qMbhV@^tOx}a#TD?)l3KcVNFglZP8_21{k-%G zFa~}q67GM-y)3HJ%R<@ zfM=^+h9!(Xl57$;^|-NFgL7A(JDZJCoPL6vKj(e)0?I;)h;WXSd?f@`Qj(+%-r678 z@$?f^Y}-M>n~$RcLA-WRB^HsyY zP#Rwp)AfuoqnmZcNaHDtb%wBL!(gI45W+XM>KIYj$TheBdBL)+fX8Vkbl{0+=ApC& z3}yj%9c!?WDt{xCPtYmB)TjZl$xcX&!b?#+a1Qic)Pru_TauZT;-^3A4%{^ciGrU| zNJwi#n>HCNS#oTn4kYo~E4&xqsMKgbd~@i^Z#bo4&Bj9db^nR#`XtUDIGcf87PGZ1 zm#1b9p<+iXvfHfVy&cIY8FlaOa&XC#rM&abG>$$_G5SxEjPDfoC4t@Agr?l9Dl;gh zNlwzF3Q20ZMJN#)>I)yFi#7mKImjmp(ixhlYAc03`DE}bW42@OE>tTh|T)3{~Y?=V^u zQI^z9e+nQ}lYGNX0gUuLkmfBDZE74tD4H3G&2P^F5^zlC&8Ii>%%)-5v_KI~|I z-B`}6lP=(eDa)AmvEY|o(7He&8zja!0@B#Hwclu0>5bn2xU(kN)2yt5ie1;o9C;*G z;NL=_JeXZ>%}Duisb0VL7cL(s=RZH%?nQ4=b#YF!zZT{nddi#I^G z!|;*<5UJfy!T}woKJ17JDHUznwDFPOgF}Ib)W6T2;s{KVMFoAmxnO*>B80>Q9Uq{5 zmrceRtgws=cLTQhs3Y0 zGF2cbu^7B$L8wD?RFK#JxQ6$zJYN-AS^vJqIp_4#Bc$P@&wt^fb9?dplqD=!wgpfe zF$accDWqxROHJv7cki$H+ve|ITg|Eupy9C;0;5N}!W%_}rJJV2P~ybHU*|?^%-3H- zAxQ13BKws)in2!$^cae+3I**CLe*C|V`R<7b%YMyT8}wyz3h3@>Yk8sl}6-uGcpPjCMVUj`Qk9TWsQ# zz*sf?o9(HW+=C;&4p!AR6Iijp$*(o~M^lWjDFGPgy+)6#;h$61W2>v6FxSn^n=tiz z3)X1TQegKF|NPDG?k^mD&zJ1l6OPe+VWHfTrix<7J{KIrLjC+z1~Nmid{L8(+uPBU z1Wd?-HZMY1eS$J?fVuCFq-{(8Rti)AR565aZJc`n;54o{fcq!DxWvynaL;xQ1x2k} z-keT@=6~DUcL2H;@LwV9@$i0=JdTbUYXRS{A2~Q|wMpI+U@#N-ph=n!D*Y{7+MkI) zdtd`FmIDuU`}pkxy}wsoUEQp<7{7PT&dvSJA8Oe&?p{9c@5m`Hr~Q#fvUBH70165U z*s)>-j2;csru}C8hxT&6#Aah(W%8D5Vd9&xy5}d2e;|?D4l6cSUa?o+J$mFNiW(;- zATc5JKqmZQ2wbn=j58CyKcPwXM>+9WeAApIk2WR%)0?Q;9%LBySYz<3nR>2LJU9C` zbX^^K-8!r>L?tsdF!|>B&C_q9Iqjw?|LQm!TVKbn@{&eXNC5?trZtKh2*k_Z{uGI$ zN9WFe=ED!i(5qKIPd`1MH{SRdP<;92!>s+WjBY*hIsg1oG=BSWdF%3(RbVRc^>Hz7 zd!T!afJb__A_(N{_1?-DIu>s8f4c$zz47;r3W!O_5@R4^B8>{Ao(i){fB>A+GWzTZ z@e>c?zhnHy{fB>zsPF&d!Dn z8?f)a=lm6S@9sL$JMK6jl#z!YcFPa{1&SCr@kF+7*ua$O(^VnU-7r`v4Vop7~dU~jj9+cjZu;=CqQloSnz5Mt-4vlZ%zl`@o{|t=%1HD zFc4t=_F8`jmnLV`p9reDec!(p9vs|QRn}?QX*X9>iZ1zz3lEdzhZIxZkX&+!n^w%2 zF#`-dc((t}t;JX;FBRQ0uB?ahRb``M64KX}oAHvH<~;di^!cqDUTe3hNGa`G*xfq5 zieCGQOjD-355Sub_Gb3-O3pkchuKTrdDgND&g!4Ttfjlje`J2l=$Tk4pM3I3sDzjQ zc>-_Evs`tW;hk>-Tz!h=jd>o|o~(F%P6&O*IamuhHgV^p;j_=)XE2bQtk8M}o@Yo- zx)9~%@b;43gd-Y*ueYb2q*zo@M;pTve{qe^;K7~v^2?31ZJWi|vBMZSav%*2njSs! z*}c1g;lpqC`2rm~OR1SL;{h;x$nE-f_X4c;jfT#`Z%M{$(F#c2t1Y6Wqy$hr_+V#J zQ`@19MYJ79N=gGURcosVq6k!xHf=cD$FxVt@(U)$o{!dDv~+;xy8bAz%#li!ZQy_Uu3Y`t^A8=X3pK zm+|!T&$D{#=MXCFEq32{x;2b{zL~7%^UVC1*a|nAivIV z=4AyWC3zITT+4U68r=N1s2C&n>^uFwu5zNPtTYlWH3TKs_L2+?N`6@(x%F>?-MgJp z@%(cNIq6jxTjJ8Z%~zGx2BfblD{Wj!R%*AOJnEjiFw=vuq0T}Q5^J|RF-v@TGBiY2 z1Bk8)_(Z0acwQmno`Q$}1+$k|vZqe*@44kzYx!VKDb^Z3m{Wo_hK4)tfIT&sx;kt_ zJtiC`kk^vSKKYavZvGu_&9h9KXLxIl+wbtoZ1*fL&+-T>#Z9vwgo-NIQw_B>&K>&I z=hA!GeAF2i5D3g55ST+SsFA7x8yvxv$K*EC1~duRfk1%4h5b3>xNj&gujjPWI()B*^3vG2u>vWaVN(dlG87j2WAA8CrM|SAcB>gyV7*iVT4BBD zN|Ep1(0U1~$S!Q(Au!sY^;WE{jlYM4LutXUmCg`em{|w{0tP0FKd|i%!Nqq!15~+{ zlD))l`u>c9kFzI{x;}%XxK&>A~z7z`Zf;&$zdeey{^&VJ(0nFEzo+b~P!OL>Fj$wj5?scAqNUwJ1c$82JU(1!Pq z8P2q_JGuMz-4N*IcmkmTx9ZT)pnT;Xb6_ZEqN=QRmA^y2V0b4*R=wn3FAKiHskZK6O) zbSVxiAxV<_Js6x3_QI3%_;6l17oD8PhjUB0@Z@|xm|IGfv4kc~ifu{z!Jg9$oe50XrZth()G~7;Y|C8MIXVX9+ z5bgDT#IuSo*VZ>OoN8ZMOc}RaoRu2n-l;_l=XEx}ayZpnOK7DvE5CMXQ=5cy1z#jI zS4-)fY6|CPP)kV**_LIL14(|*pHTTp;3vEQ4GoIgJ!{#t>0=@yiC#Shk)7Q(VKn3` z18M6&gQhYpNDnDMvL_M2$+2i*v>EGw7zvh8{SMHJCEefZ7JQbo3-I|>IDd4>3-o%Y9lFlMq_LRRr9WmHvjh@(J!2_c2nuqrHh=#?UrG3=<05Ov^Te&hKeK~+{NOh9o-AIX{Nl9H{G zTgOXw?Q+YCeS1o78J$i>yH+eJAHaweHr5I!RU~Vau z#!zM~kt?pihQscNIPbc_R;|eU<{KD34}h~D^DxFT`0)@*;wnE8RNYe2uX_&a>!G$5 z8xCWHAnk^yQ9rF9dD1jO!3&9q?O3BoO}-UjllXj1H8o-7kA6%{RapA6YK6JU?0jhh z6RRU+WhKQ&eg~l{+-=2JjOpuh0@0pd#~V&Bh_xZg%4=D^YAT)cT98T+Yk&F={rWwG zQoVtwK#7Biu#!b(g3mTf`sYiMJjoYZ1i$Yj7?9UQ6H|cKbuMGZbY;tyh+8P|W!PVP zt&p@drK^Ro;>NPV`*P3S6lDYmN8JC<8tg^^3m3ZY zEnSLz?>)CG>4Og(lKA!4&ErQ=#t%LKDH%U%6!%S-z~aS=`TqOwxntbJJoD%yt`T_Y zrDpMGmYhOGT_wZXTaIs^O{bg`ZuxYb^S7XhSAOLx^@t8{@ZPR0J{AIebtA1bJ1hJ( zb?w|rD`iNLwfld5pX8DeN!wh-&D|7PwUVi?3ub;U35VS-v>UFGoPAY35t4Xx$=#Gh zPK4Sj$X`N!S|@~##CkYs@Xsbz0ivUt=;!w7$-7Y`hWUbl`> zqek)9r=H?XDbYf>LrPjG#Ta0aQk;2AE+5P(b)$f}Wn6f29xu%)<;Iiq824Ez!MERz z&;PA;cAj96r7yn>MfF^LishBrmQTlq8T?o(Gso_s^%H{PQHH|XBkXzowOIV9EupI5 zFe*QLAE68x8LjaG4`Zz*DLF*Y7$#oY&L5p5OaV-MDi8_;xbcXSoACpQ*ZXA&JcmqU z{4LW~5mR^eKU*YLH_*Oa7H!)+%Hn^IqI`P`&c5YKLP=?qS8fL4I)+kOJS+LJLb9k- za8pm$Q$M^!&^}W#Fwf^>e5bGYICCS_BWZc<^+IOPuHl6j%8}AAVniOFeA1aggVx6y z0HvH6RV-P^yWP)W@vj~`GcyTj!NNtqva&Fpel0+S>k%TAu#|Le-4E*}5s}JAnWIyH zy{U>e8S?HEWlW5}Z7U2MfIa+h?2^UU9z7j_v~VHz(n}qPu)p|Hz_e)~1b?~jKK?X* zJPQ{tWWj>@j2JV97yt5vYXqKuJ|4g9Nro1-z{(PA-5h?X8Nd_YZN^#<+QfR!+dIC> z>ACY5vhZbwE_{Iwxv8LLqDwD>AMU~y7yoz9A9kv;LwhLB%@$PdRE&C5Qc~*nJalO< z7&$sf*It>-+h1D0H0PXL>+F~co)M(hZ?{gr~g(pKxDEto?tteK? zsW?k#U_5N$Law>y8cv)(ojLR7@z+SC5!lp4O3HB!&8(%)!Q}^YOR>iC;+#?{tl@!A zN~x>1h@nGWzDwt+H>?!2ZcW?y^C`OVbEeGkPzug?JO!gHtsk#PM}DDjgoZ7K?DNjU zhQrQ1b0mTdhiNtP3Vzx63!}Ck&L2(>P+hNLS_#o@;o4ZVb=nC|AHq!oj4|Y-g}Cj- zB6hskCtk4+QdL+fHv)BzKvcZqN2x_Gi1kvatC~S|=`6ZrpG-Ti4NDi!r)Aqhl7mV9 z2*8&xQwC)veOd^v?;&_%g%cFLsh6Z{wm=veYXG8C0Ec4ZZ{@a3iB03kw1Un>0THScp?|EsW8 z#8Bptp$SU3FM??wC}X4eZ@%f&d`FFPLw{?rS6zjzt;J5A`rGlN_n$fy8;LM!+&FG~ z@Ik)&?mNEw?mPZC>K=a0b)FQ;5qGG@45TG{|Ow?TM}*%{(M?E?AMHC#Saqmm?Xp8 z$;(sxZP~saL0Y=vi1q#fWAGXpz!*LpHHsI;_n=K1 z%dnFYNEq%X4*N~Q-?TqEvvkZ$ zAu@d}Bc@-$4Yxf)<)*E^s9L9NS7TAYbrtk)%pU{(ih5 zh-8ltF*r_ZHv%}5M>tL1MPIQStu!B8?o^jA5$^2LZ76?Q@!I2x8~p9q`6{0!JOJDi z+c%+<_MNzBf74WS{{-B7Mgd=LC}G{Ye=~kad+z$mEd_=QO;ExnL*3s(8Jop_`e~=( zi>*zR000w9Nkl_aNeX zo~C_k2wi#;k=t)auUduOy&F?ggKcQQG&Hzg-|zW_Qbd$OYE49IlH0YT|Ki28JGL|4 zIhPWc`3<(T6soGAw$>ftFt)zl*&PzErNoTBo)+6S@$;0MX;+XR+m4)Q={MF9l@=4f z_IvnH$YaqFL%8IHN69;T2SpW|W8|DrO;B_t5vBZ zme_zLV?ZywfJYz{BGpTB+lg`0M&TpY z{#m(}UMoq5K7vk1N_K3}tog>Rm0P8`W7bL<4)OW>b%)_MDNVcRwtxi`{~yT zw4Z*h!1$s8R%70VP4oWFfB^#tTzI7Vbkg+V`nv zteXnV95oBh_EF%h1Qa-`LY1g&9Yuk)jynOxWs9{6f~~;1b$0>^bOgLqJTCygOj=sY zmN+v*BD|%L($czhGD=wjfi^%EAi1Ke#8`#rzrSEW(Y1w+;k>BdDE|jg{y_Mu%IPr` zWu>A!CVjM9YX14ki8yuW09p$-0>R+bfo)2+(d6^qj%YYkRoDZHpOl1|J)6SQP9rg_ z|LQAlA3S)k;A)ih8q*n$8U!!C3Lp4YDDm|jDoWWk;rh`>Vd!=6)z_xh!l(ZtBZY(Ueow*(L}U9@6gguz;n(mi8n1a;kp(_`ql!KIH<9TxCZR#n}#~C zxc=`(LE7kb7^v~TUyp0b!U^9S{P3$WnR#OjM!CvvQ2sSO)a35q^21Ht0>Bv$9k=h7 zA3Z06iA}=BZ^48U@>j(XY6D~*^&N)%W)xsF9DVc-|HmB>xO>6fu3|TRfBv~+6iW1e zqHg=4mcQX7l8w!2zorCWA}1TzKMH&xC}yY5og2q(`dhzooZb%JoeTpmgNeW`2N_@Z z2yxT&8ySf!+a~mE5iJQ3h^4=G?{5IG_BH@M_B;&G<=k^A{`~VsS=RIj03$hRFDXt0 z;KM}NxX<)Al`3dj0QQv!(O1~Mt}Y?6D{-;+Cj=%C03qD-hC-M?{MnT;bewt=pg8Zu zTbR`HQrcdA4e7uBdcgVL_dh4@s4qy*?w7Af{rhruzfeQT{m--gl-poeQL}f`B6RP%I2(-rwwZdqLtoxdsrM{@t_OJ9;42T6R49G^yQtla$*M+O;RWO*^bH z6m8n%C;wEJerq{$>{yi6q*gr3Js)9@bk|ahXR`T^T$?5l#7Qi=Vg_oWiWAE8-;J%R!k%&pHr=T!m6Vk5=&8FANzZ{%e3??r#ox~*`Rnwb-S$~+B-;9Ce~04Tb7ve% z-T9vgAqXIiptka_U|W)sau|VNJ}ERH%})e_Ycb|(Y|80~swWZQQtHHRbf`5uD)Q(7 zG*cy&zN&6d-?kO>H^purc!*4l7c>S=1_dcAIZDuA5y`_J#Q8OHbZ7HF3k-%o#jKAd%y8|ivrJrAo5HW+YcA+X8GuA%l(*8ac1u~*bE zZdomxHShKHZoqm6hSFYEa4=Qne=~%XGNfl;g^g^XF0u}5){~YTVA7vYB{}PNG&Gz@Rp~B< z-})xGc?;NDDQK0}f|T@o$j?s){?S;KG+OzEz@DwJSrWT&|0uB0mZd*vgb<7z<1y*a znrbOHN2&utk+pV9V(qTHmZWYyDf`P)v_Jh!DnI`ZkzHX@T4$18R6@&l-l1y2e9G7S zKtX;hOl7sZe?m>N(n(62sJyh01hO*eGJZU1efkjIyqRBy--MCUpU1i(_qX5vN_BOZ zi!SQN!i7Z$;gRP*hYYrhcTj>p>X)kmOlk5k+a?FYQEyB_$oTi}D}lymvDC$PJso^|WWkkZ4G z3Muq{QR4brZi&fS9}LQh=TX(I8`*vy7H!%@RYe6JmToM(05%oX zv#s<9dL8Mk?De}xF@91{wmtYLxz}Ao`7?hfIZ090a36~n9?KbLO3kz@8_ud-jeJhr^mD-<8~ZlVZVgMK~;Z{RxGZp1)4(VN3vHJgf;~v?eJ% z$eMq{_hp}ROvb6?CAFd~QbzfT#k5RMX7|{85kivIGTrI3uUtXx*t;m`)`uy<4;dOc zlb_1IXZ4x?ru8w0vHisbSfy!k#_3pXP<3@NY&N}bU)qiw$;L5bXnpg|6MM=ocnTiF#l>a{E{}Un9p;Icmc1dz`ldxDWc;Papo}Wrewm}oY zC=ZiSM=&LwEgLVOqGAI{Nx4{?Aj#YmCEg{m_Y3R4L*9!W!SF-D36fA+$8lM#aO=FM!K zIFZ)Fhf^|T3K>To1^yI3vl8_8SXGQ&fAA=AQ&ro8L0J>m>y=WhUHcP9_3uwG5a9mE zbI9ACz$(d8!5~368bxM$zHh=i#Go8Xow!yXt@McvfqNgqy?-QD`?A)32B3eKgSCqKc`XQ>cpmRv z|9k$?D(sH{MC^S!e+X_0kXj&_{eL0(|F4J8l~*1{ixw?n!_TSb)iCWx&Be*@P<6o$ zwyYdQs~b8|ZToR-$0O+4Wih$Ashm4Bm5m!K-4tMNDD4D+y+vXxBzBs>zPk^U7Wn3S z$)+N~fWC_BFM?~HttE1)Aaa&Zb{T<;Zl$ymWfhSW1@l1c0%M*2+{(cr+OHR!xXR<( zzG0U2RE&MqW84k(thq`ua0!fkDad{IHBg;g3C3S3lCGi~rQA9C*&nL^a>EU@8$Fub z!Gp=@-=AM@zM15#tbL=*dn35y-k*Q+2#+U!&ESWc z5JJ@PkCVrf5y)WI#tiCfHCo5jnzb=xW`t4NYH&Z~?tj-M7rBCUw~9rT>2s22D= zhTwxE_i*WUk0*vTP~IjPr8SER!d&u^;^#j`Sa`Ii*Q$CN0-6+)>UQ!$%vcmVgorf& zS_tH}ZTvEFBqjmH40Y=kYXA-fB_2QiQFiaHWYeZijZ}$c;;2VDRbnOM;-p==bYb!0 z#RyJUtV?*4rIGbH{ z3X&xE47i@JrX}&ohn19+?{Ijj@0cSh&E2hA8mm{&qU)N()sTY^<*)qei(WRa^wEkR zJxBfeNhOgun^Qb^NYTJ&U*5=#&s4hdXGL5KA#oJ|r>_frMCdNuH$ zbAueUwVoT_^qAYXfljGlF;MFxJ5rJCr{DPUVX?-*uiQo{cO6}-(=lcKLqs{9Dsk)9 zt>fy$(pR!o35vv0x?OR81CR)5IW|5-$IhLouBs*{H;1GlgVFx~JRledP+ne6uim{# zPKkR;GDG2^)fuD*f*jwm6_>aDJzu<*#VMrdm_IZ;*sNKH+proNV!KOaTwel2-tQ+904-x!Iu zegmQtxd12r@xTXQCm%xU{|AD%bLURGSHZ)CLKeM_s=}y*b+bML2Obj2*bP|tJe)8R zI0YC%oZyNQTTSUM{BtsK;nsbr5jRz)P5f=(?bQxZZ3;;yeol;*Na3XdkL=^w4)pmG zQR4q5l$Vz`d2deUTlw^#@{Ntc_fixHg&L!*|2i5J6dZpN59dr~t2ktWPdN9 z!_5EefY@Th!G=9s{=Kkmvv;)@G2{iyod9ibKjKRNrlFmi>Daa-T!-V8_Yr@uBy1+w eAOHU*0sjv|!v+5&0000 + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendors/icomoon/fonts/icomoon.eot b/vendors/icomoon/fonts/icomoon.eot new file mode 100644 index 0000000000000000000000000000000000000000..83497f02e735220ec611763e0f4900ce6ff55215 GIT binary patch literal 13980 zcmdsed5~Q7edq7{-s^YtefJzaJ+JS%)b}x?In<1f(SFcD~p#9)`6{5;)G`7Wov8MEvU-AH4U-;^BWjv-7Jc z;?8X z$|jN5k1alUCSIjG z10-JHIV0}}te?ZpxNN2$NBlHi9`iaz+mDDfz|$X5#@n6xkTM;x4|`=3F4847jC2e! z|lE?=TNz$&4H?E1_~BBGP*#`TJK@cCLE)<JKPjpHvqfA=%RiP2)8!WU0qWfq|S zKrb>cgM>+@E9FuuCi{cMLNydDtf5MxR4D}ga*V#e7+O4g$Kw2Wa#8Us{f^ETYX{cf zvVZqtYGQuzj1smALsC+_K%80+x(QX7=e#(3jc%0e*Um*cTiwNw#fSOttjNzY+WE|M{_YRE}6 z*FQKi)Hg_p&85C!MN!6F&g_wa(NJ8osR@sJ;vlt$0t2bRzR*aA?LRx@vxd_7U0;ZL zoPi0x_r#uN_tR0@!%u-PP<`fg+VlPy4u70|24h*^aEgcM%=>3(!|ULGe)ey1&ik3d zTv%1+wgA!HEBwNLgO`O?V@zGLQ0j=Atha< zE77c5KcNRY=k<#;aw5_Wx2c_t4h8^pcP?Jk0XzmE=EL_KL#8H1%0~$8qMxE3G3tqS z$C--xqP|d7V0x!Utwwkx93ENMY1A7vYIf>)8&sd+z;LHctO@M}Ytf^7oK9bIh&(uo zsZym_2$dCVQ7_%3`uxH9`AmPPZN}87>$T3+Xf`{aRiB?V6Tgo>HN5)rIBgiI534!I zhFPpTVv3iGW%I=ZqP`V*O912V)N95=`VvNHW;*SLF@;8_X%u!^RO_^iWUW;P&ffa8 zus$3g&Y3S7h+3jCd5Ab=1fpe}tywCiL}09RXIE$t1D1NH=J5F(b)ZB1+pX4P4!^_U zr&dk(Ihqb%qhUmyR`b_6+yQ*x0yxw7GxlTUJmV}4nydnUF%YksuVqC#y&|1Nnga21 zoWGv#eqx4ooumguI512U;HM=-?7K>E>AsVIQEq z$N_%{8;n)KUf{0^j#Mcb`wezP&z(CYzUp)6=xuBuJb&n*acro4Xx`;~6)S{-G3%jo z^TruNe*)967C(np7iZ((bE!%-&FQ-w_d{5u6^IB~3E@};1I1ExjzZPcGOoY!2jYd$ z!06OrhkrX#j&6Qr>WIU?EnW=$(Vp4aJ+prp-{#-zm>L}j#REtL>hre(-_A)*b{JoP=+eNwT2>+GDqnMDRV+bOk*S&F-t)um3ERM2Y=5aI^7PhAd;wv zqBQ8Ytjne**ZGuia>!~GJ+@RTX0y3Yh+d&=aa8o!R5Iurwc7>BA? zY3rJ5RQ680CKghIlC=1RQdIx7f!TvAY0QU=5?AJ=kWvjgDPAqFA*wg)b;&s%FFJqk zubg&2HJUoLnhlaP$j!g}T4GbRUT-$B#?aWzJ>>L{6WF7EuoPvP?9pAVi9=~_eQSr2 zNAneDfVW?6ZL*7NEqLAQaoMibwt!yE7M-R+Im?*pPz|rOGkGXZn!!T_&Pi~x5=Jf+ zqx;{weEF@*SDGhIG*5KelRG9ScTgLU%Wrl53qU8Dk8lvTh_0Po-X}l1*Y$W^PuF+B z$8(Cg=sdO92%BN+u>O!VIQ9^~oC3y{vs^BxGgK}?li|st2nodxaH$e1gd%cAtV9Gl z|7d1mY89luS8_?!TX#&&E(8YbA*(wX42*k(yHbVKX^&fS$#$qQ)zY{Y!Aq^_^ym~h z>^|>wDn79~J(TvT{hG~XkBkhAtDQF#W&POD&=^@nt3{Pn^@5OJml1LpEt6r%wZTi< zn2C)|vIVw<)nSR2%Kl2Qk`d%!5~GcS#VM6(oUI52IKg3tAtMQ*E_)2l!ihX!SxrSu zsS46e4^aga5DaDHbSj>bl?Y7}rheP{QTr5Ldan@gybvo;W$LAo$-zh==+Is9u=q^8 zP}l2qz4MACVCmBoYc)AON<{x4STx0@1}uS4blNLtBNu6vAP7$hYxdWK+5P**10z+w4gHXA4 z4qV_ej4nM}UAZ=*}AQ=8AO zSG2_1?M=C2X}ilaf{tP1xUlBm;&u>WVXLx|GL8)xN}3;=SlZ85n6F}liaf%BniH@q z6@d*6$Lzz2;mr7)SbHe#%Jv7dNvG3lwUy(mH#zK^_ii}7X=Io_>yQFTuM(Y|u-nDe z`Tp?au!AVMS``I-bQNVQd+#eNGPDprZ&RMS3@yTxXMEmVmXRj}x!4++oE)JV!p<+6 z)SMhK00Wns%2H~apxA~K8M+vL zIPLN%W$5^wiwVG=A>xAZ_TOmdFK zqJFn;z;6FrmpvRF4v3=FA-G5sBEqe#np z;e)_c)|Kx^)&)sC8q%SOd=CMrjw#VN7 z7~{NlzPW6(LB~n43cH1EhFt{xDqz0!@eia@gn%~q{~E(uQR3xFz5CGNn~c4A$TBe$ z%_hRRXjV9+wz(>%)6C80@h9O#Haaw6iDjdzdWe%ftkxdgT9#+Us$ATshp8KXY!YjO z%j&g;5#DSDEu&V=2!D06abGu19jksjI|vU5tAZ65%ZBzXk5d53AJ@YHNpZdvFH}O@ z2n-l(3_QDxxR#f~T4C5GP2|7iOFlZYIKSW_H z3wr@UsH-(??#YTd3;0uDR?*+nZ*gxG z^ScC~6RyKVf2Y2|v80cxs?q9u$fRg<$79AjKN=iNiH z8)pR?iqT)^YrHEuX!c^XM@s^4dxzcyZ4{76D_pI|lEOdcqMSd^v(;QN4=%@Zupg?0 zJQkZTwUMJcqR;t9ru?tQ*4`QWi|nCuSvs#@h~Bw2O0Nf|M*OcTK8Hdx(dUdz?9R2Z z*C~7MQ1*g;o}z0H#r^_~13yq4K2Qj;SvEx9rmr%Y&w-1JG_jXndX>I<*AMP`)hM4J zo0p$NgsRgO8@v z6wO_$y>+uGHMvN|bAt1Yiw*r_2q_CctkCOQu%)^>0%)RVLo2Xr)7TZ*5ZoVPSQ6O8 zB9zr4m?w9r>F}R5+6Go5Xw>V};stQRG<0}|mW%2-M+IHawB0!GABE+{;EPH@>8%u_ zAvoHSy@e}rm0J!}xoenQBKHs4h7+Dt zU!~H=*LB$*;+{n;_Kmh6e5@f0-ZZuoQ8h$wcIy6c*iTJ_osIT$c1oPHpLuZlE5|8uXP-bW-v- zK5FdSxN#p|aVV1+N+x+I2!T*}%a(E|AjpQR5Lk)50{{D3_}{_ot3B=x=?MqUFuf|< zoR+&}`7VpoChzz>Ld#*_NeJOWCkT81Ohf^}6Ovg&luvU6&TYGYG7EeENwkhmj!|NM)I zh57r#G&a0pcxvk0R9n*`eSOEbZqLlkWwviU-q#n=o^-8=Om9>FaE)tG-8Q}CbZ*mi zOa*Jv<0FtgKCviLwAyO58q`{1E!?IvxUXw1ZY%Wa1)#Z%!~eV%jpI?sd9Js0bvLes z`(?2!q|2VDWhKw~h%~je&MwX2^E#VeXU*wta!+|`pwk*if%&z3gI@2TuW?;O4S;wx zKs(KWRBC`~b)IiIy+R^~`tzQbkTCN>Bjwq@F-S$<&ZgCZmisYUQR_50*S(p!^+-5kbu-~`W$?>jaBJx zJd$tJYApy66m;6Wgmj}wM|vABCmKBK@DcJpN2hI6G|P-#$9dqbus7(3ul`Cvr)8G$ z#we)OuocGnf8RJ4I2Flq9L`zjgz=ntmkOek^KqEOMOneL;9i1tTm&H&VI;>ZxK3J> zhIb_N@IJD@p=_ajVLh>9SXx{ZTyp?VFR2rJlsbQz|X)8kJ(BmR~mP6MQ#-Y_@yl3uA|OobGNuaCCFS`pwqk} z3V$HD>kxzYOAv@}+aPpxqk`_Xb>5~Hip4h-lnVGHfSX33aozOeX}A?%#Y)_#olM1) zN~jV-lv3cyEmVrgg2AUgfi^~;3ReBK=as!Ft)#icBFalE&O25;|s;)P2u zUb_8>%TGQz*6F;}dD8eO;hJt0VM*vD_}Yr=R{6;b_~{pO+mzC`r_L*XhL_*l%f$xtQ#>49ar!HC?tE)w}!FqhT&nxF=wNu_&aH z!QJHahoqKybXVyMh-H2;!EY}@0q)_C&}v~0lT6_nkW-j*MYzrD>@+!bQQhgilABmq zm5XJ9qk|KJqrpt0OUu_q9fKChpuf)l()@e4F1tIZ$g9AML^*3?(u zh94p<fSoaK_Yw#O}Q;2%ouq&#$Ae%lEI$Q2Wxo2R?iD4vzf(%N@2d$M*nw5$w$$ zgKljsz;9=RC9uwN2^WaLVmiu|S|nu)XM~1-gqQLa1|cCZTqOKbCHPax(`StYzDuXF z+3#fOk$|f)K0DTM1uK))oahd@g1P8WN$9*S310gSeo#tbq{waah&8d(snu$~ zzj2*Zn~^3Cw8~P+IF1dXGX6ZVK3%`FAbQL(fNKO$e{h(J;9+3m&{VkygP0Q7CW}12 zZpPuX*X>Tn%(`*evT3sf(5&46*=GTgzEnvjE6FR@s;q3)t+Kh-NnL@twP}K{iTme<`R5U0*IF~grD3h{O(;{ZM%>gwoL56)(DsNuAoZmN3^5q? zw`8kTrn+qH?Cq6Z1%WV!Z_H}9TgN(W&_xZ~G3d3*-OBro0?0rKI)FgmXMN!J3O0XqV!QCkwg0>X@5v`$~z7#RvH^4t8!$!?Bx4$P5)DwqrAGSt zAwE)x%&}vc#Eq!F!I_;F3R-zw*L(f6RXnxp4x`~2VYV3I?_+7zI^4c0*|W3^6p(R-cqcljLi zQz*@7s9-e09&p~<-2<25Q({R7kFF;Ke02p?fv=g4z^({@qRiciysA-=yUn@bV@MVw z1PVU5(-%~4zjgtngGJ$zr)vl3jyk6>UY$4MdMOGnr~_W@!o$4XOM_l+obV)9X!&`A z&s3uCz-L-SrmH5Tq1fXN*eUoU0{=b@rbhuzai&24WHT}IKK?Lj-H0Og^9ZaT!7=v-~zmNZGfwT2sA7um;l%AigNzh2A0Y2 zG<1oKOC%h-lEAiZN^w#Me>9=YamcW6~S;qOsR$WPF1dI`n7j($DE<^cqfN@2fQCgS7D(zWq4DKnUN5 z%09>6#a(&y09texs!McsFml`wBh)% z(;JSTJbFYgWODjy-NcI2)T+r00nW|(?|U@K!X&fA&NjW>J+6I z#VJ8aN>Q3dXq3kA{lf&Uq73A9j`CE%Hz_45Q-!KDNmKYbdYWcv7TUuas?jYp4}aM@ zT2C8j0bfdQqRq4g|6y?}ZKLh9gLcv`x{Y?z?X-vX(mwhW?N=T?cHaj0(RsZ7TAVlY z1v4(1amkF!W?V7jsu@q3@st_gV#f1kyw;4@nelov-q4Nn<~Z^u{=A7lZ{p9J`12(FPr$wCjPRCzii?!oA}En{xYmFPJxhcP}Gp(+zpy89-bHB@qz|y + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendors/icomoon/fonts/icomoon.ttf b/vendors/icomoon/fonts/icomoon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2f6034e574cfc8b30e9ed18aac234d8df71e18d1 GIT binary patch literal 13816 zcmdsed6Zn$dFTD!d-ayu_v)p(`qkc>YG1n5i;C9L+R%oOWJ!o>kPr}%1PB=?ImZ=C z2W+IAC<2QEHpdlgvViT#2TwdWW~OYCli(qQabQkP;)G)2Va}Xk=4d<L z{eRrfm~;)K%8)Hs;W~OYg9Zz?POeOc0DW z@hQFEA*1CmdyLtQCO(slwwgJF=%48#voMvm(_Ls=F!O(8{p=hAC=2$f_XE1izg>52 zJj!Zqc9l_ksm(ILE!r?};zN2UVjqkj>V7=^yxq*pX8CdCPvhY^A7jk@h+IQ^`Xl=I zyoWxdPe060_I38xl%sp;41JDX zpdZmMg_LlI@QiR()WxIXH^m=`Kb2G|A?=XvlU}#%u{>&d!*W&rBgL-NmDg2W{knQp z+oV0N{fYLzHDXQxPz&CLg zIH9FB1VWpiorj_V>!8vxPDx;XmZbOTSe%3W}md_@T}9X;rohw3!68^QI~$V!P>C;md-ci0RPlf+!1r z<4|iB(V|E+CCN(Xal0z&!($w`ewL^IPQS%Gj3qO2ysU)Eg@{P+k>u}RQ`x=d<(EgN zZpvm07H=s#H5R_}`4>-0&VdZD=aiVox_%2XE6A9SPfb_5FAzedjOFE*U%v1CmtRh- zDNck0%@rA4M_V>N|Kh^YdHxoquQ)0ObA`#V@Jc)&9g~4-IuKK2Wlki(e|FEH7Mj|+ z@f#;!eE!a7iW8&7K80_dz{)H@e@ZVhFN20jrYq%ADkl4b#X>a{EUcqSqEsma{c?=H zzZhCPd)wmtcydwkEB%hn7i)($-gI#9VrpW3@wT&zfkj2>bAIX2O`8th1RiDVcC4$; zY%IizY#n3OIDhXn6)L5avZ9=f8z6_sYzz2bGdA*6Dsa^3^?{$ zEf(uu6!vSf+xUa{GKmFJIbmsjtwCQ!oKR^3D(0M;om`#;w|+_wbk6G+Y2;L-9d1)Q8yyUw(cQUtQAgtm zG-5sc%z-jBfhorj)Jz~@o?c$k=`J%p1RbYCjMy*D8Bpe>u&}q~gHEMS1cp6ln z;f>)=n^==e`D=U+>hvXt$OBSLl`6$TsI1_KdgUh7=MT@%XZk~JGp9yfuXV0Qv)TEq z`uwa}_$HqwtyKri-u|?(KO7$D%ohzrEzy`fM4U4M(K2XjmP#oR5G&o)6&l0< zrQWGId_G4V;E?}jtM!<}?{N63RnvWrro-207+I&){8irW06a(m&@}!T=dp5~ah3*8 zRsp{lh*!<~J}tVhnx8#IRZ2~5LY{2W$YoQ*@yr7G1l=kIdd4`q>7pdw@? z1hNVSilyotg{rA#SbyaY#0#N;(W#>j|4x(~-TKJXF^7Lgycqg-`(|hN&HiD0hkw6g zYIGnJ51WK)wHd`dVuWVMPOTPhW^*<7bYuTZu)Dtc@x z8T5_X?SkZT4>%(G2Xf!quJ72geO)ywd#7C!3#ma#TKqyOs{hKs?BSI>=0in^D|1pv zsRo@Cua?&l)tmLYJy_|=@zX&Rif45<#& z@Y+06hJw-z87go|0?JAlwN#Amee3e&w=Q34o;uY$)oD-enw;E4ZM0l|tMgybbgKCX zZ{i-&HQMFx!;@=6mbS4H8=GVcY#Xb?6D^hfm0%?!$iXDAjYGsKm1)pcgaVx5 zu)>g01XGtihGgMP9GIYo>>&0uBgaKqxxxm9vqH zv_=qwr-XF}Yr^co1LN^RK9-GHr{a~g$M3YoY<;B>yS)%68{Ss0FZB($yrf5u`DZPX zl$32&)h0Vdh57FT@Lg zu@C9sE%i($Up=tdrPZm;SJ&%WV(s>pT(Pv%B zr?-p@(`Ox0An8@2vlDi^xHjJ(o*Z@%CD*E=ppUMhY-RsFWkrS+!q;u;Q`^YO(=iZ2 z3a06tkS=8@HBK;WLy8Pr41b_@d6+oIRJf8rT1lrYNUO515P%dd=Smf95_;hY$i}Wz zU_V4iu7acRvQ@_fRS+)+Lq0!<7RLsAH54cY1N6K#-WTzx5f_nU5s1J-9!U*|T7X;* z%_U_mqN-Zt;r#4uAq^Kqk_GB~UyTaN@PjteWFf7|E}N%cl!{kG)fKZ_-F8`~MOI&rPS?eV&*g?h(azK|tQzZwZCt*tPQPfW&?RciolH<8k^CQ;qAS{U$t*S8KA*eO&}V0T%e{48 zYVw5B5ll94ZX0$`9_Pc7-1mVUP^soB`CI_v8rF^y%yZKS+O(9;Rk`H@DPGFwf<*{+ zL=^bp7--@YWon=O?%5KAu&O$I;FKfhj>O67b3o7`Kva5j8O`=>XV2cYdrpB&mwXP7 zl_nm;gcX&mAMBrrOh!#0$hoSOaDOsLVpJ@icxSK!C*Ih2qUXjprKp@ z2gC3pj11a}F50ZO+S~*E>-D3Wr@wz8I&ZU$e@Gi`wAtpP3;q2b?Wn%Kf52_K)rx^1 zYy%#{EI|*^BMjC?!Vgs#%feqkk}9pEG*2o8a3N2E=nm0CYFZ7cd-ozqt31E1{@@4O zQ{8bXV;*07jIE)+r{CbwD&}_y04J=1M1QBg!J(v&tEw^Ud#I#nYe@Y|z(i{o#`jR> zdkI@+l%AmP@io9KsrEGEu#AOpJOwtd=dtJ>Y4wz+xHUbXQeIni{+?snVH z^qP1tKo~Io7%;}TbNEEMB?ov-m%(P8r~#(c~q$hLRrUGPQ$m9)amdTc4; zV=l`1^SoNk74wjCyaxZFTF7Iw`Bob>x-I&ge`L!4YHa=OvA@V3IhUpL`i1E2>!b8~ zU~0tws^W7fG!uQ!sKjnxAA6m$=Z<7A=;tZA{z&XEFgfr8#o+^o5SwK~^lkbolldCB zx=0gy>7`fct9Sh1j#rKT2||tcCk;!pO0V*+HU{ze+cDqlhxLg!RIi`U`=9L2=gxj; z<$Q5j&ifE2>q{a#t@52!RW0Nqag&^lD&;9ag$pPRC#Eat4N68Dv-IxsD=d%4asMA8MRV| z!)}DE5Qy`2p13AK+nQ6uUp?nG+H!n@P$WoX=te}dsO9k0I}L|#7w>AAf>%?zBXg&C z!zoSaG!^X%FJFNQAto&Sf__4O#m)>>9sHibja&3Q{PZyZh?@IpIkR+Xnk(i{NspHWK>%wt z9~rQ%v3OiA!6Nq$+J+OJR9~gi$M<#FAL5ZkZ1(lOAY!Z`3!XHN6InGxZ+7bbaM({x zq@B(7b9PFcv!8oYf7Ac^>u3%8J8h$1_lG-8bf3fD?Ka!@{ja>jZ*jTr`3um_pTQ@b z`B*yuC69PxDOKgX&M660MYFlH0SPQr54B_iqi~9<_aRFE^ zDUE7UY;eJ`{D(SK(YFR0BKB7!*t+PjS_`J@h*I9FVn>w$2Sb6@upNeJ+Gzuq& zm2V3{15&%`bMVtPcBOmpD85mvwV*`M(P{G@(v2=1@!Xs z^uTA~Z15hw`zsqdEwhhLMn|oNqcG_IeS=3Z|6vak#`qS;4Xp zUV?XA1S1yVB*!bbPFj?PcO~@j0kR;VY@q{TJ+W(8T3i%db7-E*UCvFRY0f3I^vc); z^)$KMJeuZq(P{O<7y|wgG}daUL}I|FYpa3ta34K@I0G{xW-EhSY23*bxmOV2m$Jya zfjXPb-Qo(BpmS}3PV@!mcfytVI%7cRYc>DDJMKl$WXr}I|lN#mo0YqnK{C1I1`Yb$PB&EmTRegh7< zk?qO`!#G8lSQd@*h+BGoo6zOjEa4s=rc}e>yP!Jf96syMe2zAZ9^Y>|w1&0W`SX}8 z4_Z8y*bl6-uE@_-pOZo2-#)K_wC(E8%MKrmB9}!jcIvPnr~%CZF^yqO zeTAHLL(eiE8sT37AR1xBAyOi&7BdcKEIml7i`)J6U=p;A)J|jx}7t%49Vsxu4qN4PH(|1bdSsmu^K>3VC^gjf@g&kgg>BgC$^W~fWUTjPgNrrwCSX@xki zhQy%l5qm)DOAQ!mFzj#1R;x^P+1lCP>$?gDVGiGz)o!YUXeD6|~bpmW+AwmK>>J;48^XIK@!Fkl8s9(Gp9}?aCMOFEy zQ%_p$!pw|dw?27F^GW*WWchPCK2pVUuf3OR*AIWQ!i{#9;G|)KBe4!bwgR`RlKN@LhKbLFvFaQ2a z0S9!svCEP&UApwdOdkFT{t9O<16`hCcX)bXTn69uIup z6*CCy&C#kiJ5#09NMAqHM=FsyaUzqr9@ICuu+u_8E6*!?%MUzI-n#-erzv zg$}#YKWPLOufUcy6}O|2`Y7FFIbME*Un#D)~f+KhOg6i$pE`W8gDO~e({Q%uj=N!g|^GVz;MaKnoz^h$& zn9qA@(94|@UgQQXr#Hk*CHf9xrbSe`W9Ms#m61?rq%xGh*(oSfk|>gG?qF$R_jEiyy?bJ8=WtTB+vur= zYPH$4bUKu-%v92$sf;X2Qenq-P5t*p`>OpLRX>@%l!^Lg*fZ5Aw7ZH%2;dp z26c{H=YGXzQ|Jkvet5Z_G(+MeImiNq{+>gr7z8h&!FYf!QcMW`v)(5 zie5Xk_x8>k!us_Bjr1)p_Kgsw5AC}B(6%F+e|OuV&46lWm$?+fk6`7x&9Z>(_6YWf|>n zvwPT`_yXX5JSW)+#_qZES8 zGSJsK%2NT~q?D*k6{^xCP2ub4X_}!~SP$!{MmNzs;$<6XBW%FPQKPCj5d4zhJ^InD7fG{DKL;V8Sn$@CzpV zf(gH9!Y`WeizfV{3BPEa=@QWt=q6xob!Y`Td zOD6o13BP2*FPZT1;f_H!B@=$hgkLh@mrVF26Mo5rUozpBO!y@ee%XXyHsO~|_+=A* z*@Ry<;g?PLWq4zp1EJwysG-EA8!TP?cwI!q3l^|Z<86Edd+iG+VX?0Me^37(;x0lz literal 0 HcmV?d00001 diff --git a/vendors/icomoon/fonts/icomoon.woff b/vendors/icomoon/fonts/icomoon.woff new file mode 100644 index 0000000000000000000000000000000000000000..108ab11f89a42db7071a5821d0e9eabbcf1ebbce GIT binary patch literal 19584 zcmaf(Q;;S>mxkN6?P=S#ZQC}!wr$(Sw5Dy_wykL!JG*LS5Q?|00NQ?0D=Yj*Ak9^fdBjYf18N7I1vyKFcc7w6dVvx)Yxb7laaW%svHoI zG}^yxoPWYI+YP{y5ET>u#~A;4{C^?>3I_sHP+?&H#}xm0nSU~5*xKSYu`_b~$8!F8 zzJGO<_pI)xEzOKf|FNxqjQ*e4zW_?bmjB?t+y0IDuNDvx85kN6x22sc;2)#?=l|sc zo7X}@#@HDF{?(I7_{SjrN7{-&_C|JQ|5(O9zxgjO*iCi*)6v1j_22XU6VU(G1O);D zh|xtcVhOqnaW|Yn8{&xv4BU$ zqlFu+7x-9$4K@Jmdm3qm5O;Vk(B|z6>!qNkioz>t3`GK*s?UfzqP)c#&q(u7f`^cp zguCcRB0WUIGJau1%nlph{nn)NL&hCOXwbkzE*}O@WPph^B%P`-RAsZqfsZK@mnr@| zKi;<4wtHsBYXrv#fonBVJz{xiXA*VS!!-Ijq-pA7=i~5cTf@$QO$92J<`%=K;TtIIr9|K1p7QQYtY*l#B zrf|P`?pE6pK*!qk|6l+-gZ^Oj>g@qr*MAJb;2DGlW#(>CSiAmXC<@P@G$^xli^A6R zAHy^peHr+=(y&$KL7U3`=A~P0YXF^2_T+3UOeo_Bu0vot1(v)?(On$Vcm`Zgp0zB? z4jXgKOU(J+9rg(1h^$E()8;GEC;w`O#S{ky79loa@QVN&KMMv4tHGdnC=mN6M>Z#p~D0~Nc1+z1P;ASy;;>Uz_H2A zbPQXkf^KGKy{A)FGBdbPZXjqN58nTmv21&HVyiem-ka-D#aM7+JGw#LR<(4eHEC6D zEwGOs}27t zmTriibZye+eV5I=UfvQZ?U4ux{ceHoVO$pym>@o@esJtOIGqqy1bHs1*!7ti1gfj- zav5aR<|MS0r#EH&pQhTBP>r7Sh3ykys%ZThs^ew?465D_uT0tvYK{HtNxsr9?NVN6 zZ*%F)UT(Z`(CAWHP1E#+2YZ}%8ZT`87#&J6NAbcG2R%JHvGAx}?p*hBm5J!gI?x+@ zx>Bg@715~MWQ!6cV%S{uu0wz0?Tb9+s|iAe(Bsh)$*44zRkTP*PS4X8@Wwj^5W`I| z!6G{mgW5whtrQmc3^I45fM3TQ6zbAS?am4YKR~yhrL83u-A`m;w}VuBm@Yhw*WIX` z0))Rp?~p5yomWAqY(2z4caHe`9&?=mHrEufzX%H_Al(#)zc16HtlhPmXk1fivjCG; z;gO$xV-%%r{(Fp69ybOhg5Q!szq=_wQa*veI(ML!p15}e4?fW=5UqgP1n8YWZb753 zGjfwbAtdKXJZQaipFofRcjF%=pQglTI2~41DTfoQkocuJK^~1ZXZXr(H{y*sqTeN7 zlwEIgXXdE~w-TKtl9G}s%%-O}7P4T~HHqRc$m?gX+q)vAIhz#fQKvY@8y45U1KlTI zd?yGt-@J8;y+jS_CP`dvK2YEu4k_45DIZ)}JGSpLSVrOxyOr&?_6O&ikM8sLEr%(y zyIvd647L__`;plkokI%NmtQem5YyV{UZG ze`5{N``6}^iYea$8)}_ADeX->x@D9$p(~$&6Yh~-oW^fKj&L^rWlbth{!NP?dxRcy zdhoa#ApXq=S2VR|Qo&|%>_+wO_Jz_cAN>3H*t(??Fs(G$LYcU~9vf&q^M=zKxP zTV~!wg@NdGZY)za{Fn6n@suPv>FZk3Rzp;sfMZpaC7ORGzU)@S<5+)sUjz$b`u*Bn zm9jn#Cz@bzQh=D`vBzB12zqk=QPwG8Qql3Sw(__6Y;w`{l5RcsPk+Sk3Q6ZV=NaXCR`&_g41_gT6hxi}78O6ANN-O8PaDN4Fat{m~~ zh3`|u?YA8Z6AEunW7xDwpF|y=8oY??7TQLK0$(0LuZ$a%nzRUA8%PQLaj*g+Aj5Ei zhkNHzYH-U=AOUhC7rQ}a!Z)`p+r_i!%TBV|Xeqq2uoots(a3_sKBed+8=bTINn@8r zEH>6d2H6*7&*tevF3NgWBmMr9K=Nur;oq$GC6yISJQ@wcG7FCAOz^?nbX*>&D69Sk z1KuD8Ydo4EUt~1G6xg5>TM9JaJ3;O2kj&Ka#&rg*N2=8ai`@Q@2ko^nV35!T>=K~*FYeSf@ z73QH;`vs9$oPyQk6~)@Y+pw_j?Q!XM5?1g%5?ev!WxquhOZ}2BhRC#h0$f@3o48M* z)_~gT4^Sei?=|&uD7R9)`8r1jv`)6v@(N$nWYMx$^^y1T=V5l|+Cq7XeR|r0-Rwal zmV0(ZN3IL#LRxR&qroEq{{DH*>#MGj%hVjWV^J3YJA!cHqAS~9bZ_e_o;BPnXCpt6 zJK+>xyoJTAmngJE7kv<6bXt`JcKZ&Ei7&YZ{!827&-Dhof<=ABR-(0i{XqY-zD|&z zi!$xfyT>pPtF3KnEWvmINQjPOy?Bo4>@w!6F`RuVxMx!|G7QrYz=AGW4>?L`Fk4pz7%=GOruxYLi(!s}J_ z{(+61khH;z4n?f&=Vjtr?+A0y+z3FAVWwqxE4LAL*kVBOChDPUyc6iSd#X3cTyZ1~ zS^+Bv_YtIOYCsmX;1dxC`!$~z3sKKpz^yt3EiBk$1Iy(3y%I5u>X;i>qt|1-S$nbc zr`xF~3*L>bLl_6{n{=t#U74D*#IR@afnXV>LQ-)!59wqYZaAAFfp~O8fE)?KybqUv zpONOVjVBebvO1I1fJ9Pxe0*jPni9Lyz!Q$+E#WiFHVFR&sO9PnY)dvoaE4B zKkXJwq4Sf7rf;Ewkb|C;`9`|669_| zZ>6YO*s{JdFWbnJe7d$(*|fvZI$M~d=k;Jsock?dsGkCUtOd`F4r2K5AQty-W`$pT zIWq(&Kb4j8j*D-Q>48nrL>Z(BsK=Pw_=h3)2HkBK$ypUjOE)%aj1Go4rr?@uW{o38 z$Ds>ZK;|;6=8`vR5kaL{PVl@=`;3fr>|RM|aX)Zo_aubnXQC&Jqs*QI`A4t%XzAzF zT;?om7$eW90k_9SLKcU6ZfAwy$xOdkMQQ;GCU6SZVKoLHjN)DAy@DqDJH=T2EoD?^ zd#$TRoQu}&Ye4QJ(30@&cE;GM4oK0B42DYHtsKKe7eI1E14PI4U91FOQ(nes;XQcj zzLUkb@{Q+_L(>4vk+}dCqL;TgGpYfC&Y)+zonLfDENueQN|bm(D|M@w!Zqi%nxm~t z;VvlH(0LtSvCyKxmTYpJ=*z`XC6pXTwBk&7=FR}Hp^Z`w|52<>1dzXx|&~y6XkY9yv z-xjQZ5ElTsZ?ZQsLu{Ae49$k^I~a!9ce9AvaLqriv&)L#H-H+rHnR*5?6QB+^#o%6 zL4aURI;OoeCjVwur7~OxEZeZ6U3PH@E1!GM(b%k#gO=R@$xi)F&mV;%*kKsRT#F~-f$0U`)-y&=K!vtX^W3#yGaWjvo;Sa6+AV5{@U^Cdg`b;Dhwx4|Jp2 zz-6QmsqvL^Zez_$?B3@eb|*A|@yOKUzH zRhj7hMCZ5xBNd?kp+L=hX~&=Q?tKBVvL3WenvAa9q;e$kMbWF=5&d?dMxJS4_s3J2 zOLuW$J(Qs0=6j{H;LhPb-%_PI*$g+*EEEXlS)mW=*J|11P@d_+Rg9wpp?=o&P_0F+ z`bF2~PU&Wot0)K)R#gD=Ox}U|r_uRPx(jjYwBrG94(t^&F#|YJlcR}m=iW7+~d?iS1{#Gne!%wTA4 zOd-Ux;@w33LT}A>V!Y-p2q(iWojtxz$iD$$Wgb2YA_f*`#%)eEn%)YZX0m;0S`|&d ziEZoXG-no;@$9!aScuR3d+g|AK4;<$5Aw3)1zN##lXQ55#W^lHgrYh>G)js3CK@z& zf>vAl7wehN-8On~B5vyJgZ&jxTwx0w-)M+bym6_;03?YUh$6h&?%*sbfofPOy}+?M zyFti$*8%jsMq~$jY)8%;#I04u%rf#*kkzTddiWd%ezdeuu!*nmM}pZ-Pkrs@NMd%A z(}Ck}iplzomT!8#LVquH2UFY3o$Ibcdz@bSU@E{ol@o*ZE(q3qgtjFHcs9LIqMv;x zF0llsIZC%O0k4Hq1WBVF4r2FX@2Hv>oP=X95DjN3S9QCwZbn9SzK65_rion9e$Bf zi4^meT)GTGt@UT&8)Hn8YLA0fMBF(noW&-b@9XZ}+#9^WLJ8Z@Ugg8+P>_fgHP_eW z3Bl218%e%JFHhmLJ>Xxg@IfUsMK=!Cf|=;kzVM5k7xK3U78&}R$CxF$pr?{+^ga<= z)US>b7X`yB_Ip)!V!OZ_hYXtyJp+QrnTzy12hJ*oB{>w_!WI0)8YAsX`MO%J%^nbF zx9pqg8KYW`j4x9n2Ad={EW(O3V0cE*L0c^n!b#W($pd+eIX)ZKprHJVjKG-wuV@h} zwGP|L@O};!iuWL+$SZ{Hq1>vc;3K`r<2+e(ne&mF}eVZ2%U_0Y!fsZV<20gdGr2m!0sN-iaMQO`pe^2 zsQGHGj)k$gKVk6sgeNRroPBT;rzZm`yk5ab*40jEEn1O{p-PVh#N*!b1cVl_^0NkTg{pM@k=hi_K z&RdfDDz;N@Fs|2I8UQAK?jqSlc<*)ABX6oKQ_!oF4n6c_X!ILJb5hFVGLWCyfv%*nEQ4uV^ z0~ZWcX+PMV^>Id?v_Xf)0UOpbf^jk_ye)T%YZ4Y$rU~pWiF#V^a#WU&OFg|>Ok8E` zE_caI$+okFuI?iDKUg#G`<7kKu`13v>RLz1rcf1;?@bX|UK67MMqbNJ4H}$mPxpe3`4@#(Q zHyHH|-|fC8*pFK9_MVw=bkCf7GsG#HHSg-_G)1<^owsclSOS?6ExpAl|k} zDLV7qlywPkj*UK0c*u>FC80CdX_Fb>%=vkV&V;`tp z)+@6@m~P>w$^mXbxZ3Bss!+ivl&DdKsopN!CHv;D=+$8ZbsZLc7JCn6l-?Dm2c5mK(WfijxX%!sZNZ33&t{dhtPj?OO`KEEQ$M zb{zhS*-r+?BgF&zAbq$(&J$H2f#(lnJ;Vy06qh&uMK%IRww)r&5L?IPsJypyaF6Kq zLB;)5|5k>@aq;mkHJ97K%dIhtu%*N(RgAU$0hT4_v+BfLpj}^Nw%;{BW>nu8kQRLw z97$!1;AGo0fHOvj2u@D5dtZ6e%W(VY^fG1%AevH6u2egA0vyRCd)XwByQkdusv9-CkdA6fx zp-4p;A!IgEE+QVjXbw!HQ;8XT116GI3{lkv#86apTQtI3Q*j?{6b}9cS=Lm_{pdf$ zq>0=zcuP3^NlP~F5I}bYM-4U`5wg%=vLH6JC|Cdo2ZF5i$ec1_r>U*f52?6#2DZ`^ zvlX6Y))RbDgT;^RTHx-{^@E^o5m<-Mup&H76gFu~I16#2ky66739sr9yuYM&=5kpi zZG&ZnQA1&*lP8oHcGEf%v@2XaV``|oM7sUU17zPSSW6wro=a1-NFYb@lDkUD5@6Ji zleUWDV3Hlp_#0;T(vU4xcK^L_tU1_%825qg_w#_)p24J0&2L@${ptqC2=#bCKu@L* zI;~P$3h)PU`&gpU(O_y~F&Y$GU+XB-HA&+YtE?%wW5E~NxQ5)ZF#))J{Rv~8Ai^Zq9qlJ3~^ z^L50!_5v20f2P8NKrl=_UemfMQl;So9N88$H2@XEtsjxm zBzh0KqeiemC|=XzGQ#^g#Vr^Io=Mt@JOc>DLFO-7)YsUVcc z6ct(C9nCu(Z|pi-8;8q2yXFJ(om@eg-zywaPpI>_OC0#&w>(SHHd2?M#scVHnLHj4 z^R9aq@`olb*aT+61G&Fz9mV?d&UzgbpKuwygM>)pH{8-2$dVz3g)!Z0^5aLg5a4)I~ZcE`oHa%R@6K|Lb+&FuM1DWiM--H`imXZ|h zUrbA#y6%vS4oRTLX+Ac;ppNph`iD@C4Ik|%=!?YMplGhXBrGZWGLk?AfVntKYx=Sc z77arrYbfWv#vcUBxalT)V)R$?AA8VTV(o8nI^hb&VZwEKE8ig=2NI-l>wzF$)D+sf zpA8DRuBOj#O843stUP0MqD#NdDjt;MLUg_13{P+1pXZiXFc)n!y;}jpK=>RlY|AZH6*CkEP~gm z71IGDaxWm~?*`rpDraCPL)!{r5{#cKNv zL2$yUj+NWfU`MyP+i0^e_kNewb0J^JGz1E5M0nyrG9%kWvLEc99}0!#Hk`97|IqB3 z8fHaEKhm;|X^4Q-_sc$6Y@6GzT9R$xn-`p8y{A%GwcPA-GG)yv+vZ?QFnc?q7brW% zsd(TbZy!yJ0T$_e`Bl~HLuLupz( zKP`lKP$p8CnWvrf2AlYchptCIt9zuxmbc!8DM}@c*ozy?^C!2Q)fo~Y_@d})Tn2cV z=Bn~&690T6&ghS7p7fWzwZ>nqX!wP+3%B47E|QU ze5u8H#2u*1`V@c|CkgQCYaOx{t$8ZsBd9GHRBlOly+J*Wiib z%a`F5>-swXf-<#X%c@2B?Ild?;84#Y>$hr4=voF`h4?84jbNZTi!8iAG6IG;h>H!^ zAsAUby3aURbQkF?4>=c4@e0C-Jn4XufPK+NA|bR=+s_mf3zy{L``)W2))M31v3h+C z6zRG9jz@-f+O9w$%Hy9uqh3AlAgP=pRqy>AG|Yjv8~*mx-gr_#j-MQMVM<8IZ)kmW zI#51Id-G9oL!(1UsM;qowcO^%Zr-q+&xKrqD+ee-RG_{`NT!Kk8sPE*NtJrVGsWtM zI)o6odasI6fE%uqcA(@A1VpUL5{wg#B^+Qx`V?jfHuIw|i6S@JBD7%fIfivW}QTL-w=qE8iYHcTPFQ=St zX(A00KE$zwF=&WqJK~jdTv#GT&M+wxW6>4q&_Z@{@(r#0u4f5qX469h92LczpHec6 zOfOWIe=i;A=tEC%F)Miz^Za5!&r(XOP}PznyWK8V!c}F`d(GN$wGmt{7I3w#$7H9T z-_?wq8$piXfTj`j$d%Q5EIvel?4DjunL8m10@4O$Rne5yQM>fuS3|C7+%iLm0Z5nl z$`-&Id07DADJ%if ztARi_h##at55c(Ud0wry} zjlJD82@2AM)Ef>JJUk(YA~L^j2x@ zjHo>eB>tLwvfjbf*eAp^+|KxJkMZd+Y z1iAC4!j~cG9TwY_Z)VgRi?%tWxWk2bDBk5;M|sHyz8+D|67rA}JIo13M0~>@&M)M3 zULdh^SIjv?;tzmK`W^^n3Y*HmEcAgzL44N7A2#9BlMJqr2P^BxlT!0D&T01cO1`&t zj5)(|R8-R>Xp^>xy;UEl*~lLEE}Fc|!m`3k;MY}^vh5MZ+=x}Q)zFo0tf_-r%yXwS z9^DJ4hofR_JFUmi9q&&opHb%Df|NDnRcyZI!@^wmr}w)xS2MsZMOFXEtlxqAjI`RG zR_v&Sg6ht|7Sjxw$mOzptD=KoCHO3@@O@i4Mf5LOLzDg^e#2t-@co-66G{&^xm=M= zKi;9crywfc-UpV$5I#>`Mg7a^+}P!ujzNW;$q|N^$L7QND0jHPik8nQu~uX6a_eXU zi(GR^5cAfsn{cg|aOhk+-?>OBsWZlXe2yj&15@~A47J=2H6YjZKmO?M^nvG54ho#y7|wd>SZV)+w_o63eq2VT-ob**%Il=J%zK1#A9^4*LPe_2wtNvhQlg+$SMuV{ zA}Gi@L3dCx{nnl>{}3;6Z(wme_&KzTf8s)}*89 zQ$&ZsGP7YOQsbtpZ)S+SG<$AlGc4)J)TzI&{d^Ll_3I+gGN{pAws3+0VRp*Fnz?>cUp&d2Yp zjg_iVX`@M&hoWiMp%83YGD?{eN}Ckrq@$!T*Pb&y%D}q$6(dO2==pCb&A4($Fg4Em z7=VdgBjENI4(8r6n*$u!*7xSLlXQ~Pb}pwICe31Sf!`rVR^E9CKe^j`{7%(WZIeL0 zRdcX)daC%|XgmD91C^XS7!?@wRv<)u2BP<8GT!$50*~~meIhKL(&S0<@6>rtRG*c< zQ_4qj%^yzsA|c(oV}NsfN;^P^CT?Mc{-TVG&$x`1?(ro2@_uqJYQr4!8@eX9hI-l$ z`^eQ-wm*%m{$p0Y!LlNrodF0gO5`=z{*eH@SLYsCI|haZ8@1ta z4^oKd#^2F{H!IxM|Dm4nyzZcmrLnfFzrt}P`X6-Q-v=XB#hc;Q-4-~ zbIjFMgGn3m0Ws*ZXjRPKNH~h9x(8B@2L_Hv>Yw@6sniO`^|&{9R{%e0@d z&cQ?s_fXN(`EejI&6+G8VH6O8(`Rm$P!2r8= z7;ax{nX<{x$cR_*rjwv$XW}vec$)m*t9OvO|C@o|>g1$lr)qbC3enD;`S|8wYbCq1 zO=XprYWT3~>B!o=_U}933j--_!3c1@lBwKrfgip@Uo^zj_MtrlBVIi-rbSM?ikBzE z2&^X`7Hawyx9jSv32TUHkv~f7>+zR>YSni+K?;=r<~f}$;XwUJG`$Xo(OoNUSGT@9 zB4AE1-=&mNCRW`vkdzy8hvjf z>IoyGz3K>Y{6+}d-5kv(Z%YWXah?Xt4YO8tefVa@@I9A z*WQ?ns~=|Lh|Kz$p>$*s&0(KF^PZu7?|zBAL<2s2oS)yT?GE#>D4M(}J4zEjJ&03; zIIT$cN7}UHOdT$Rf3e3jrG=J5q>zWog zA=)`U18CLOo1McMTM((7%snrWlyi5rV0LDCMmV3F*W9l<(`pg%#F@voF6g%jcjr_{ zdc-SdqszwI?h4-jOO;^V+wEsLOwY6znhtV6m$g zif_$!8IvHDA+Tf)o^W7(1tV4&X@8Z%M;4m=CK0-;_r2xt`MczRhPFrGQiv$WhWyrm zOE9l@3V=!vFP{)pj^5Fgj20j@iPT2z(~A|qB{N52WGWk+f;&BhZVsvzJYlN^{^;aD zO!IlUf}$kGMAXeYzDv9k#d?|)xfsnD_2vj$x)vftpfC8e-438FPu{IOuF^wkzhtTx z<03fUxded13CqTJ^9AiTFK&NaB;pjDp6~?9EY>ZS@aFuHj*9Ev1rOR5z!Tno<1MLV zLYHAp8f?|Ii@zzm53wPCC-*GgB6gHb4sNLn<6Y zyAp=fns=Aw8*$dyU32w@5D|4sJRD0!Q5Z_UQbM1V73qo{pNGQoc4!gI*5a(AP|gM6 z^p|4v3^JLbsyC!|GB?OTpTPnheJ;rRTEC)VU5i(5zRpd-@_L75Z|p=Vc83pxd0&G7 zQ1c;#PL;m3jiKkq>O~XohCRqV7$Ff19ncw0F>G@Sx_A9tm@!#`UXeNUtE*%|XKx|i z5?VApw!V=jW9h|*C2RX7xoG-}3#SAMwl_OJxNf$!A>By%q?7y4sV-Igy^E=Ea%Z>) z(3ITyWl0QnOU&-VZOnp3H)-HZPkG|>G5h-rtS@7T>scDU$E}J^Zlh{Qw;zvHQzw)k(5gt zOU@3N1IjlVndhHvr5iYhr1u&TD`IbQM8b`QP&6TgFeg=73U(Go%pou}tl_oHq6IR_ zh1?ja?olX(GA%x$QzgElLRX4%&g&gfoPKu*HyCGEhl*~N;nkV^2e<_w37%^{VR4of zma$T!LgmIVqy(BVCn`;O@NmQLqG=L?Y@s7LkD5%BvdJNCQL$WB@t&Lk4I}$mSFUSp zc?F4bw!!REM~mbtIO$vsVA+e6Xdt42^#hm>nweA=q+b<0N(82(?=bURU*c@)%?`3l z(av$ES!$W|JmyT(`*Mw35-us@CxE(2fads}wXkE?jb^%kmzO=>x6()lh>Mrsj*Pqc z+O`zC%L=OtC3|}ym+H((ww*vQqu9TVlBKZq$?dTZ7)SXGzS_7z3EEGBv}_JniR@3p z<59akmU5%N5pj(CtLCt7;Bp?pd!PX*`Pu0g`$rvCqgD=#q4~;PWIr@B`33hOalilLC znt*w-4~fGLEjW-K2i97Yt@l>5jp85qHpvDyy*7t_Q?vW)B3Gl(25eb=#th1mC}x)3 zyV5?31J0^rXiG?^+oI>oT@7Sr>mpPLB1ZG#HQhAUlk^k~wNj}fdOvy%3DX7TQdT+H@$ie>Yg}FWTl=;hW>GsMtR!_k`0O?awNl}+d%<&jkwMcuW1eP%H$ zHBXcwaj>rb@{2;eck0_<_;povjuCtk4M9CNwPNhc*_aw{kskG9=iibr`pTMagEn=S0cw*`?y$KnE}2=G4v&wK!b{8I>JFP{Sd$h}(fl z)eMmjZNeLRXbv;saVIonlaR!W&jnhNAPelk&j*O$s|rD|2(c&Nx zT6sucAnIsOM!Bhp8KPPxZ6ddsJY!QuYko3ddKqVWeNyy@d@C?dAaW#PvyQBZbxEg9 z)g(Zdpusw7%i@zY3SiyEguTs~=9E$3KK=AcHp#d%f+sU9laYq1@GFs8uY@<_E2=DI ztCex5Rtl3iwqBpDH1TVftA2*x-#9ge>Oq{vdNpkK`*QXzh1;Jf1TeLaO3K74kyfp z_WM#Dqfw3FR-(-AQ^C2`7oFCx?8P7p1q3Z~43e8io;WflWpHK_P&*x*hL85IuCC-l zxVI(+m(Svo4*yYzY0P>go*8hSw34H8AM2cr39sfzA*tI}?u$5qNlAh>vx zbN?lX>G(=PdlERNfd72w%!1^nr!$7SnrPfD(cM2Ow^ZYI7=9onQfp3E)Lg@blDJck zmFa3Z4X}ZO%2Wb_kQPx+nZTXU_ktBaj2Ee|iWWSnzSvYHaN_$pXR#DtnQphE*G_rU zkIL!|7Gi%I$_ceQw%Q0J%6gF>i=12~vW_D7#2916fv({?n&k217}6Omu^eC^x=hcd z7NgkN!}j@D)MQvRg3goD?XM$B+LTcW45zVP7d&>I8rBr11xKEPLdcJ;-X?@{Gz?EPWW z3*_qk$}sZi=rza7rY^>GEp912PiknqBPi}tWOI1K6DvhlR{~yy@bFlHtN``N#p?}M zSrFpbcBF<_nl=`AvsDytcb&5_kwaQ-vYC2_a8~PhJ>}<3v+f9B9V_=BvAXeIQmV}b zLoRxk3(iJ9e02Xq?aj}=XyHO${yHG`oin}KzA)kL5k>*3@&tC5FLTB06K7PmJ75IF zEFI+{^l%qKXQl%iJ<6bc$svp@vVYM(j{jM|E1M}ie{c~MJ^S#WM&VWCs~ezigJ;SpjMsDaACQS0!3e*5wCjO-GRoV zx`fPw#)0P2bQ@ov!lv)B(+Z*zLw*?IY^70;U)ko2v^S1SpUC9gDbC%LeP@|*ul0uvTEh&Xn7iK-K*C+JHz&P`4g zUtwu4WM4#Fb3x_^2JM^&>eMv!8`6st4t6Ss-{l>T?GZeg*o+w0wsKBye7t_)LXf`3 zX@=$cz?mzP#pvTocAo05oM2@tpN4wKqLoe|x7iiiBeVwFEI01GjQcm!|`M z;n-JZ?b0e1{XH4CF7F}u%33e9*M;V%*~4THH#9U8!B;F^OymV1(z)V}`!2nB+fl5m zOXG0JKg%iH12@_Gt!=3HX>+RgsgrKRmv<;T_gK=6!7X#uMCxuPS)~N)eLq^6nL=%5 zONzZU!=cS%w%4XcAT<&8^|?AjfM0`Rjw9Dc7kg+0`D}5%2v<;lS=TlHtI9ivA ze5#6W7)hVv7NjoSnZIGdieU_jo%o|+9Ax6u8OY`dKQ_S76G1V%<5m?ET^@3blX zO6m~%Fm(GOlTC^wj#&vYeX*=+g-= z2wfIxp=I7j?SPhz_c3L%32i4-rxij>E}h-11nL~U=_zmJN5bYa-?X1+vUaKkh)W2A zhr>Bc&Y1%~mIkIGN@uGx$hxmifT1h-)zP7D<;(%+Q;TfIew$;c^5a3D&?9PYlOmjl& zL98d9%STIVq7~EMr)yX30^0>g@ax11%@o*T1WN<4-3nhNvC7*^DwtOcN`FBJ2keN` z)RQ`A=WO5VGf2yqyuN(`zXbVjBMJTK$a1RlM=I&mvdInQIc&)D!r6|*4quU|1OFR) zgv|iot3*PJN2xAhQu83(zLp|ZMD z75SsK{Lgb1tGrdK@9<2W6q*CPlwBwY6sfY9YQ?W|&&GX2@d z$lb}x{DNBzCMf>yp4rSpxm3IGf*-oXbd*)wr7}o{(^# z3rJVN`@3%aq32LNqPRwQAywmPc41s|BTR!ed&6gT`YIpf%Pl`*`}`XPIw308o@Zi_ zp4UQy{GLIBmUG5U=$(b3i_wAzMl(Z((*vCDK5vym`NHY_ZGY zLMrRHdR_~ja+%1HQ;-Y}l5r;np&m|!Ot6GuvZz%xtd~nsP`&X1VIk-U;VSke(MMxk z9!rtLiMM^Kuu2FNb7~<=L*N%_3qII=m&9y%zDTDhFoXoj1B2?H%e!$J8$|8y`a%kq zC^7twt7QS3DYCeDp3K`7^{)f2TizWK?5ReNOw(JX?g$g~Ct)^k4u}=CQvW8*^rGhj z=KX5=<6%k4Xf=KXBl8p0UHJl1vlwS%S8JRj42g;C1n~XO8Oe_d>7~*CQbes^|>3G(W@D zx_muK^cn8bsWv(}G|FKf4KK9_aA&^_kK=3Zhj$!g)ib-PXJ>1TEzFXszy?1%mCQaj ziH5nFzq}3uiF<=zAj46owo|j+!M~r^LxS8j@U6bKOmYT$8s2*-O!XM>v1}mkG<=Fa z1*`UzUqkX!e=F-ma$^9Oni*Y*7T`j58PMDz2V(@%!E&jCw{dFh-8!g{m&-PKF%)$*(yhLDj@I`R z7tSg(#+PH|QxhAx37R)Z4qCA~Oubg&r6(XBq@$b3iZS0$ifpJF%* zawms8L8A%$M%CIjTg8fiYx?;KiRiJz9wym9p;P3wI4QeenfaL<3Q=H2bIq|Oh^bG| zgXIi|TNacBJF!$xXieTdF+1OF06297eCCxNRm;j_TZF-Pk%<(dP*__H(KEYH-zcV3 znjuGknI7~+UXJp)p?lL92J|ViswGOWL4V_YjBqanc2GTgFi_GyYwbe3Cw<-J@>dLS zrZA)%`(;M*le?5jO#qV#mbx}vgs6GMg)9|;v8!rGBb~EG4D?8LYa|D!c2$A*R%WEp zZxzP1%>~r(ME0T!&3EN1Nqcg#KRjXT`v(#y$?~^bmX+VyHE!G71=*|2FGTf9K(!!@ zW{Rw%|B>!O(8Ib^wmQ*N8@Q(LV1Vo2Xv(8m@h-I)HqNbdv-E5p)|AHw*7_yA%2CEX zp}IjeTpQ*hC$;0sWFDp*!_7wei~12WGR~s#5=zVlq0qJw`{MB!Bl8Nch_RunnENL= z@zpk{mk$N~2_b^|+igfED&Hq?6K{9r$>1tYx}8~XYnm_%7-V~Cqpi#qQ4>8`oJZnv zY+uJ@bb~OMaI~$i>Nc&B07QXPR{57o>JT`Ihl}bivz8G#H_7!aJ~m5m+IS#WcYn^| z1d;w^zx7|vocBCxqycRL*@Spn+s(0z(#oS0g94DC~+2%dk*c@s`!T|2#Qf%`+!xS zFezE*<};inj||uqXMAV9`RD*B9KasFlU%w@(HXE+GsizZy%4yx{w70p@BYAAYoJNz zN!A9SxvY|tZ#Z^lS1ar>YjKH>*)TVw^@fhi?8Y~b_O(*}nl8F`w+0;G@*nirS>mLy zd4P+{3yw%-T05>P4{> z{0DxAPfL_n+YuS=rT!!2Ie&WaFx|h&<~tPREOGcS^X8*L=BELAo3V_yrnjbbEF`06 zm4IY)>$Ra$luQ~sb?j7zsyZllA>B+TsgkKveYO%3uf5nYGq(&&ZrQ0-;$y%7-@~UL z0?vAu)D&8JIMgYoB>z5*RueaDA6?t&Ki{NeT&gU3eU)(d&*AJ$Dfv;vpURV^|Lh>A zd#UY@&+cU2u*6C`ah&rv&hY*FZyElsGB*7}Na$_SShlafG^X$C@6bO|ChXiEE$Chw zHU&f39u-Jbamwaf%^b}aZFycFxfe;5fxPsSf!BTNE}h&tV4jMsd3xDF7%_}Wo?wJI z6rBa+jx%^~?Oyu@4ESjGRy-fXQ0w*P-{aktZ>7xZmll{iO|f&a-vlYo_M78R<}#Vb z7jLslroY)T=7yO$)hW7Hpjz9_80}GpQ>|ONYRDpN&N~{OFSiV2CQ7GiZdIJqR|ECs z=1EbRq#$H*3&Ze)=gaXLN1}ASIgErF%lNwrwYgOyYKAAOIPB*j&B%Q!-7iH|ip{9* zwUCgNs#ST$?#~Y7oo0#b}$e7*z+o)3iNk-A@j4@vD)+-W(VrTcm*Bhh9y;T%VPmK1yj8Rq&(dMxvOT5Fwu2KLK>$5BN@wNv4)8% zD?enD-*jqr7Q_I3MGjEZ?;eJ<7Fqi;_nWFW=WQgXX7JN9-bjVSsul#2?rltxUgL!6 zB~-ka$R28e6*T|;UA=7}g2`_}#3IM_XJAs){tJ>P{kgv83sj*~b>*mU73VtimXqp6 z7I8m|-N*uRtlGv=8!JJaU@zCDLB98fNAq;V;AQK{5#(Ib6BQ2WKG0~G?gL4h?gKBr zQ++s9dklWx;2r8lrZ^UK*BGik0Ir|zBOs^H(g-SkL`9|6<;^ zmp1l;{t>4I=Kg%_|CsGP8M##ZwW-+isN!l+H=d>_tU|r4K13<2LOy(3mU>u(E4w;c z#ho1~3(c0dD7E3wU8I_jNA{82eStD^uv7 zQn8&(*MHQfI|?j!XJ7=gKT^P&<9gm~cAW6dTndNdQUk*PU*=GgIp|~#-(?;+@#Pkh zP{|}&vLYYPxRs4nM0J_uwXp9h9NTH;)HJ9*YOAAH46~5tvHGaV$N0~*-J{i%)M5B0 z!_6Ny4KTo!t)wk(lQcf7i3a#hr{tBbqzt)mzcX2!Q^vP44Ry$-7$Y85`xrVaIa#G< zxI~^&h@1ds`j3eKiifIdIyI*)pF`L4v|ml>5gLePSW8sM%+#rAwN+B^tI-E6cHm07 zcc$U#Gm1?|+wSwXi_gWC=0y3v$q0;n_^IRa)1*Ysq)xJrIstB%0w3--+lzC`?J_-# z4ATx(4%`)Am4KY`wG?LOlT&V_QnI3tOQ$zbDO073Ou&^gGe1_e)T!bhbJwGeIxtmo zUNiNKsx-+zuPJIm%@4(jqXjn|n^d{tZ?B43P5)_+BA4$t=i4)X^>CePxpm_2x@zEv9c)|w!T zc7KtLnil@FqB;b?oDlr+N8>mwOykaO+@p-xD@B7I>oA(rn*rGjEIdRaa@QlrgZjpgO91Kq zis-LXhmOnv#)@_Itopqyy8X0jDb=q`qxB$8-iJ?3mqvpJ8bc1u;x8R6a-?Il-1L2X z%1Kfn)^~x$?5B3gqWsWwjCSfr4@mKd_bDkJt_0t9`N)T*d|?XaeE#$tq*)P=NC?>mzsdbq=?C*V=}U963C? zAUI_B$PeeocskqWfB512X!n?q`CRg>dF8GJ#jWjO;D)J#FwxH^@!J4iuw{@jiYj`L zMU~K ztVM1ZkMbWHg_`NS+VJ&y$1xd&{E1k>Gx>$x`BQ55M)9X_7|I<(n~PWS6!2KNO7Iv{ z(AlQTMUd~M2u=x(_5_Ehj4sy+9%I7(QS|*^oaqfyXJB0F3`|Ja*HSd3x~NXkU!Te; zlCrBVlj5A6ZyWG(2NA2Jah+se1P*d}=*L4p)>>1`W1rUiD-+26M;#^mJNnzU)J`f4 zqA7R#P?!5Cy3HJiNL{suZyQi2{SG_8-M|}b4f{WZNRT;roMT{MU}OM-lb!j7Ao`p( zM=^{B069AZ+yDT0oMT{QU|`?_VhIKiU}9hd!bl)y0rMCD2ps^70001ZoMT{S{KYtd zft7)S(T6dOfq}stN`GaLWN2YvU}9ipW`F|$1d|~k%{7I=;Q_-32F3^fA28@KK44I2 zU|?W`D^LJJMgVHI4Hy7;oMT{MU}k_|83slM5by!=7{PoN1_L0?0fbB-i3i~y82#519^2viIg<^*D8Jo3d@#1wE~m>dJ+BnEjP ztpub&Y?!z$6#GDFWPKpagl5lPs2>^#_yOG1X2}FZ>wyrT@v9q|Z`b z+o>ye#Bau3<`l-M^pkOq5f|gW^j{j*1h%Tc4w`k?h9LOFQ*&g)im2At$IVKxXnlwF zj&gV$6}i$JGu8dRn>Hn5qN?O7`OuQEJ1j!1y{q!V&77r*rr9K`ic+3OA6qIive)}9 iplrig`nYejqRfkjv;SsJIcxxUoMT{SzzYBXeE + + +Your Font/Glyphs + + + + + +
    +
    +
    +

    Your font contains the following glyphs

    +

    The generated SVG font can be imported back to IcoMoon for modification.

    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    +

    Class Names

    +
    + + +  icon-paperplane + + + +  icon-reply + + + +  icon-reply-all + + + +  icon-forward + + + +  icon-search + + + +  icon-add-to-list + + + +  icon-info + + + +  icon-arrow-right + + + +  icon-arrow-down + + + +  icon-ellipsis + + + +  icon-pencil + + + +  icon-image + + + +  icon-music + + + +  icon-film + + + +  icon-print + + + +  icon-calendar + + + +  icon-key + + + +  icon-cog + + + +  icon-fire + + + +  icon-rocket + + + +  icon-checkbox-checked + + + +  icon-checkbox-unchecked + + + +  icon-checkbox-partial + + + +  icon-radio-checked + + + +  icon-radio-unchecked + + + +  icon-google + + + +  icon-google-plus + + + +  icon-facebook + + + +  icon-twitter + + + +  icon-youtube + + + +  icon-file-pdf + + + +  icon-file-word + + + +  icon-file-excel + + + +  icon-file-powerpoint + + + +  icon-file-xml + + + +  icon-file-css + + + +  icon-warning + + + +  icon-switch + + + +  icon-wrench + + + +  icon-remove + + + +  icon-ok + + + +  icon-plus + + + +  icon-minus + + + +  icon-attachment + + + +  icon-arrow-left + + + +  icon-arrow-up--upload + + + +  icon-arrow-right-2 + + + +  icon-arrow-down-2 + + + +  icon-file + + + +  icon-file-zip + + + +  icon-console + + + +  icon-floppy + + + +  icon-user + + + +  icon-envelope + + + +  icon-user-add + + + +  icon-eye + + + +  icon-arrow-right-3 + + + +  icon-arrow-down-3 + + + +  icon-facebook-2 + + + +  icon-spinner + + + +  icon-lightning + + + +  icon-trash + + + +  icon-download + + + +  icon-upload + + + +  icon-settings5 + + + +  icon-bug + + + +  icon-libreoffice + + + +  icon-file-openoffice + + + +  icon-google-drive + + + +  icon-edit2 + + + +  icon-phonebook + + + +  icon-book + + + +  icon-spinner-2 + + + +  icon-bell + + + +  icon-cart + + + +  icon-cog-2 + + + +  icon-legacyfilemanager + + + +  icon-favorite + + + +  icon-favorite2 + + + +  icon-loved + + + +  icon-love + + + +  icon-scaleup + + + +  icon-scaledown + + + +  icon-opennewwindow + + + +  icon-repeat + + + +  icon-reorder + + + +  icon-skype + + + +  icon-dropbox + +
    + +
    + + + \ No newline at end of file diff --git a/vendors/icomoon/license.txt b/vendors/icomoon/license.txt new file mode 100644 index 000000000..a9c25af01 --- /dev/null +++ b/vendors/icomoon/license.txt @@ -0,0 +1,18 @@ +Icon Set: WebHostingHub Glyphs -- http://www.webhostinghub.com/glyphs/ +License: CC BY 3.0 -- http://creativecommons.org/licenses/by/3.0/ + + +Icon Set: Font Awesome -- http://fortawesome.github.com/Font-Awesome/ +License: CC BY 3.0 -- http://creativecommons.org/licenses/by/3.0/ + + +Icon Set: Entypo -- http://www.entypo.com/ +License: CC BY-SA 3.0 -- http://creativecommons.org/licenses/by-sa/3.0/ + + +Icon Set: IcoMoon - Free -- http://keyamoon.com/icomoon/ +License: CC BY-SA 3.0 -- http://creativecommons.org/licenses/by-sa/3.0/ + + +Icon Set: Broccolidry -- http://dribbble.com/shots/587469-Free-16px-Broccolidryiconsaniconsetitisfullof-icons +License: Aribitrary -- http://licence.visualidiot.com/ \ No newline at end of file diff --git a/vendors/icomoon/lte-ie7.js b/vendors/icomoon/lte-ie7.js new file mode 100644 index 000000000..77a29b353 --- /dev/null +++ b/vendors/icomoon/lte-ie7.js @@ -0,0 +1,115 @@ +/* Load this script using conditional IE comments if you need to support IE 7 and IE 6. */ + +window.onload = function() { + function addIcon(el, entity) { + var html = el.innerHTML; + el.innerHTML = '' + entity + '' + html; + } + var icons = { + 'icon-paperplane' : '', + 'icon-reply' : '', + 'icon-reply-all' : '', + 'icon-forward' : '', + 'icon-search' : '', + 'icon-add-to-list' : '', + 'icon-info' : '', + 'icon-arrow-right' : '', + 'icon-arrow-down' : '', + 'icon-ellipsis' : '', + 'icon-pencil' : '', + 'icon-image' : '', + 'icon-music' : '', + 'icon-film' : '', + 'icon-print' : '', + 'icon-calendar' : '', + 'icon-key' : '', + 'icon-cog' : '', + 'icon-fire' : '', + 'icon-rocket' : '', + 'icon-checkbox-checked' : '', + 'icon-checkbox-unchecked' : '', + 'icon-checkbox-partial' : '', + 'icon-radio-checked' : '', + 'icon-radio-unchecked' : '', + 'icon-google' : '', + 'icon-google-plus' : '', + 'icon-facebook' : '', + 'icon-twitter' : '', + 'icon-youtube' : '', + 'icon-file-pdf' : '', + 'icon-file-word' : '', + 'icon-file-excel' : '', + 'icon-file-powerpoint' : '', + 'icon-file-xml' : '', + 'icon-file-css' : '', + 'icon-warning' : '', + 'icon-switch' : '', + 'icon-wrench' : '', + 'icon-remove' : '', + 'icon-ok' : '', + 'icon-plus' : '', + 'icon-minus' : '', + 'icon-attachment' : '', + 'icon-arrow-left' : '', + 'icon-arrow-up--upload' : '', + 'icon-arrow-right-2' : '', + 'icon-arrow-down-2' : '', + 'icon-file' : '', + 'icon-file-zip' : '', + 'icon-console' : '', + 'icon-floppy' : '', + 'icon-user' : '', + 'icon-envelope' : '', + 'icon-user-add' : '', + 'icon-eye' : '', + 'icon-arrow-right-3' : '', + 'icon-arrow-down-3' : '', + 'icon-facebook-2' : '', + 'icon-spinner' : '', + 'icon-lightning' : '', + 'icon-trash' : '', + 'icon-download' : '', + 'icon-upload' : '', + 'icon-settings5' : '', + 'icon-bug' : '', + 'icon-libreoffice' : '', + 'icon-file-openoffice' : '', + 'icon-google-drive' : '', + 'icon-edit2' : '', + 'icon-phonebook' : '', + 'icon-book' : '', + 'icon-spinner-2' : '', + 'icon-bell' : '', + 'icon-cart' : '', + 'icon-cog-2' : '', + 'icon-legacyfilemanager' : '', + 'icon-favorite' : '', + 'icon-favorite2' : '', + 'icon-loved' : '', + 'icon-love' : '', + 'icon-scaleup' : '', + 'icon-scaledown' : '', + 'icon-opennewwindow' : '', + 'icon-repeat' : '', + 'icon-reorder' : '', + 'icon-skype' : '', + 'icon-dropbox' : '' + }, + els = document.getElementsByTagName('*'), + i, attr, html, c, el; + for (i = 0; ; i += 1) { + el = els[i]; + if(!el) { + break; + } + attr = el.getAttribute('data-icon'); + if (attr) { + addIcon(el, attr); + } + c = el.className; + c = c.match(/icon-[^\s'"]+/); + if (c && icons[c[0]]) { + addIcon(el, icons[c[0]]); + } + } +}; \ No newline at end of file diff --git a/vendors/icomoon/style.css b/vendors/icomoon/style.css new file mode 100644 index 000000000..0930aa458 --- /dev/null +++ b/vendors/icomoon/style.css @@ -0,0 +1,303 @@ +@font-face { + font-family: 'icomoon'; + src:url('fonts/icomoon.eot'); + src:url('fonts/icomoon.eot?#iefix') format('embedded-opentype'), + url('fonts/icomoon.woff') format('woff'), + url('fonts/icomoon.ttf') format('truetype'), + url('fonts/icomoon.svg#icomoon') format('svg'); + font-weight: normal; + font-style: normal; +} + +/* Use the following CSS code if you want to use data attributes for inserting your icons */ +[data-icon]:before { + font-family: 'icomoon'; + content: attr(data-icon); + speak: none; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; +} + +/* Use the following CSS code if you want to have a class per icon */ +/* +Instead of a list of all class selectors, +you can use the generic selector below, but it's slower: +[class*="icon-"] { +*/ +.icon-paperplane, .icon-reply, .icon-reply-all, .icon-forward, .icon-search, .icon-add-to-list, .icon-info, .icon-arrow-right, .icon-arrow-down, .icon-ellipsis, .icon-pencil, .icon-image, .icon-music, .icon-film, .icon-print, .icon-calendar, .icon-key, .icon-cog, .icon-fire, .icon-rocket, .icon-checkbox-checked, .icon-checkbox-unchecked, .icon-checkbox-partial, .icon-radio-checked, .icon-radio-unchecked, .icon-google, .icon-google-plus, .icon-facebook, .icon-twitter, .icon-youtube, .icon-file-pdf, .icon-file-word, .icon-file-excel, .icon-file-powerpoint, .icon-file-xml, .icon-file-css, .icon-warning, .icon-switch, .icon-wrench, .icon-remove, .icon-ok, .icon-plus, .icon-minus, .icon-attachment, .icon-arrow-left, .icon-arrow-up--upload, .icon-arrow-right-2, .icon-arrow-down-2, .icon-file, .icon-file-zip, .icon-console, .icon-floppy, .icon-user, .icon-envelope, .icon-user-add, .icon-eye, .icon-arrow-right-3, .icon-arrow-down-3, .icon-facebook-2, .icon-spinner, .icon-lightning, .icon-trash, .icon-download, .icon-upload, .icon-settings5, .icon-bug, .icon-libreoffice, .icon-file-openoffice, .icon-google-drive, .icon-edit2, .icon-phonebook, .icon-book, .icon-spinner-2, .icon-bell, .icon-cart, .icon-cog-2, .icon-legacyfilemanager, .icon-favorite, .icon-favorite2, .icon-loved, .icon-love, .icon-scaleup, .icon-scaledown, .icon-opennewwindow, .icon-repeat, .icon-reorder, .icon-skype, .icon-dropbox { + font-family: 'icomoon'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + -webkit-font-smoothing: antialiased; +} +.icon-paperplane:before { + content: "\e000"; +} +.icon-reply:before { + content: "\e001"; +} +.icon-reply-all:before { + content: "\e002"; +} +.icon-forward:before { + content: "\e003"; +} +.icon-search:before { + content: "\e004"; +} +.icon-add-to-list:before { + content: "\e005"; +} +.icon-info:before { + content: "\e006"; +} +.icon-arrow-right:before { + content: "\e007"; +} +.icon-arrow-down:before { + content: "\e008"; +} +.icon-ellipsis:before { + content: "\e009"; +} +.icon-pencil:before { + content: "\e00a"; +} +.icon-image:before { + content: "\e00b"; +} +.icon-music:before { + content: "\e00c"; +} +.icon-film:before { + content: "\e00d"; +} +.icon-print:before { + content: "\e00e"; +} +.icon-calendar:before { + content: "\e00f"; +} +.icon-key:before { + content: "\e010"; +} +.icon-cog:before { + content: "\e011"; +} +.icon-fire:before { + content: "\e012"; +} +.icon-rocket:before { + content: "\e013"; +} +.icon-checkbox-checked:before { + content: "\e014"; +} +.icon-checkbox-unchecked:before { + content: "\e015"; +} +.icon-checkbox-partial:before { + content: "\e016"; +} +.icon-radio-checked:before { + content: "\e017"; +} +.icon-radio-unchecked:before { + content: "\e018"; +} +.icon-google:before { + content: "\e019"; +} +.icon-google-plus:before { + content: "\e01a"; +} +.icon-facebook:before { + content: "\e01b"; +} +.icon-twitter:before { + content: "\e01c"; +} +.icon-youtube:before { + content: "\e01d"; +} +.icon-file-pdf:before { + content: "\e01e"; +} +.icon-file-word:before { + content: "\e01f"; +} +.icon-file-excel:before { + content: "\e020"; +} +.icon-file-powerpoint:before { + content: "\e021"; +} +.icon-file-xml:before { + content: "\e022"; +} +.icon-file-css:before { + content: "\e023"; +} +.icon-warning:before { + content: "\e024"; +} +.icon-switch:before { + content: "\e025"; +} +.icon-wrench:before { + content: "\e026"; +} +.icon-remove:before { + content: "\e027"; +} +.icon-ok:before { + content: "\e028"; +} +.icon-plus:before { + content: "\e029"; +} +.icon-minus:before { + content: "\e02a"; +} +.icon-attachment:before { + content: "\e02b"; +} +.icon-arrow-left:before { + content: "\e02c"; +} +.icon-arrow-up--upload:before { + content: "\e02d"; +} +.icon-arrow-right-2:before { + content: "\e02e"; +} +.icon-arrow-down-2:before { + content: "\e02f"; +} +.icon-file:before { + content: "\e030"; +} +.icon-file-zip:before { + content: "\e031"; +} +.icon-console:before { + content: "\e032"; +} +.icon-floppy:before { + content: "\e033"; +} +.icon-user:before { + content: "\e034"; +} +.icon-envelope:before { + content: "\e035"; +} +.icon-user-add:before { + content: "\e036"; +} +.icon-eye:before { + content: "\e037"; +} +.icon-arrow-right-3:before { + content: "\e038"; +} +.icon-arrow-down-3:before { + content: "\e039"; +} +.icon-facebook-2:before { + content: "\e03a"; +} +.icon-spinner:before { + content: "\e03b"; +} +.icon-lightning:before { + content: "\e03c"; +} +.icon-trash:before { + content: "\e03d"; +} +.icon-download:before { + content: "\e03e"; +} +.icon-upload:before { + content: "\e03f"; +} +.icon-settings5:before { + content: "\e040"; +} +.icon-bug:before { + content: "\e041"; +} +.icon-libreoffice:before { + content: "\e042"; +} +.icon-file-openoffice:before { + content: "\e043"; +} +.icon-google-drive:before { + content: "\e044"; +} +.icon-edit2:before { + content: "\e045"; +} +.icon-phonebook:before { + content: "\e046"; +} +.icon-book:before { + content: "\e047"; +} +.icon-spinner-2:before { + content: "\e048"; +} +.icon-bell:before { + content: "\e049"; +} +.icon-cart:before { + content: "\e04a"; +} +.icon-cog-2:before { + content: "\e04b"; +} +.icon-legacyfilemanager:before { + content: "\e04c"; +} +.icon-favorite:before { + content: "\e04d"; +} +.icon-favorite2:before { + content: "\e04e"; +} +.icon-loved:before { + content: "\e04f"; +} +.icon-love:before { + content: "\e050"; +} +.icon-scaleup:before { + content: "\e051"; +} +.icon-scaledown:before { + content: "\e052"; +} +.icon-opennewwindow:before { + content: "\e053"; +} +.icon-repeat:before { + content: "\e054"; +} +.icon-reorder:before { + content: "\e055"; +} +.icon-skype:before { + content: "\e056"; +} +.icon-dropbox:before { + content: "\e057"; +} diff --git a/vendors/jquery-1.10.1.min.js b/vendors/jquery-1.10.1.min.js new file mode 100644 index 000000000..95fb44347 --- /dev/null +++ b/vendors/jquery-1.10.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.10.1 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license*/ +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.1",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=lt(),k=lt(),E=lt(),S=!1,A=function(){return 0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=bt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+xt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return At(e.replace(z,"$1"),t,n,i)}function st(e){return K.test(e+"")}function lt(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function ut(e){return e[b]=!0,e}function ct(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function pt(e,t,n){e=e.split("|");var r,i=e.length,a=n?null:t;while(i--)(r=o.attrHandle[e[i]])&&r!==t||(o.attrHandle[e[i]]=a)}function ft(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:e[t]===!0?t.toLowerCase():null}function dt(e,t){return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function ht(e){return"input"===e.nodeName.toLowerCase()?e.defaultValue:t}function gt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function mt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function yt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function vt(e){return ut(function(t){return t=+t,ut(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.parentWindow;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.frameElement&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ct(function(e){return e.innerHTML="",pt("type|href|height|width",dt,"#"===e.firstChild.getAttribute("href")),pt(B,ft,null==e.getAttribute("disabled")),e.className="i",!e.getAttribute("className")}),r.input=ct(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}),pt("value",ht,r.attributes&&r.input),r.getElementsByTagName=ct(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ct(function(e){return e.innerHTML="
    ",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ct(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=st(n.querySelectorAll))&&(ct(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ct(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=st(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=st(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},r.sortDetached=ct(function(e){return 1&e.compareDocumentPosition(n.createElement("div"))}),A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return gt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?gt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:ut,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=bt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?ut(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ut(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?ut(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ut(function(e){return function(t){return at(e,t).length>0}}),contains:ut(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:ut(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:vt(function(){return[0]}),last:vt(function(e,t){return[t-1]}),eq:vt(function(e,t,n){return[0>n?n+t:n]}),even:vt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:vt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:vt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:vt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=mt(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=yt(n);function bt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function xt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function wt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function Tt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function Ct(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function Nt(e,t,n,r,i,o){return r&&!r[b]&&(r=Nt(r)),i&&!i[b]&&(i=Nt(i,o)),ut(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||St(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:Ct(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=Ct(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=Ct(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function kt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=wt(function(e){return e===t},s,!0),p=wt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[wt(Tt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return Nt(l>1&&Tt(f),l>1&&xt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&kt(e.slice(l,r)),i>r&&kt(e=e.slice(r)),i>r&&xt(e))}f.push(n)}return Tt(f)}function Et(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=Ct(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?ut(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=bt(e)),n=t.length;while(n--)o=kt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Et(i,r))}return o};function St(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function At(e,t,n,i){var a,s,u,c,p,f=bt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&xt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}o.pseudos.nth=o.pseudos.eq;function jt(){}jt.prototype=o.filters=o.pseudos,o.setFilters=new jt,r.sortStable=b.split("").sort(A).join("")===b,p(),[0,0].sort(A),r.detectDuplicates=S,x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!u||(n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
    a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
    t
    ",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
    ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null) +}),n=s=l=u=r=o=null,t}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=x(this),l=t,u=e.match(T)||[];while(o=u[a++])l=r?l:!s.hasClass(o),s[l?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("'+ + '', + + srcAction: 'iframe_src', + + // we don't care and support only one default type of URL by default + patterns: { + youtube: { + index: 'youtube.com', + id: 'v=', + src: '//www.youtube.com/embed/%id%?autoplay=1' + }, + vimeo: { + index: 'vimeo.com/', + id: '/', + src: '//player.vimeo.com/video/%id%?autoplay=1' + }, + gmaps: { + index: '//maps.google.', + src: '%id%&output=embed' + } + } + }, + + proto: { + initIframe: function() { + mfp.types.push(IFRAME_NS); + + _mfpOn('BeforeChange', function(e, prevType, newType) { + if(prevType !== newType) { + if(prevType === IFRAME_NS) { + _fixIframeBugs(); // iframe if removed + } else if(newType === IFRAME_NS) { + _fixIframeBugs(true); // iframe is showing + } + }// else { + // iframe source is switched, don't do anything + //} + }); + + _mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() { + _fixIframeBugs(); + }); + }, + + getIframe: function(item, template) { + var embedSrc = item.src; + var iframeSt = mfp.st.iframe; + + $.each(iframeSt.patterns, function() { + if(embedSrc.indexOf( this.index ) > -1) { + if(this.id) { + if(typeof this.id === 'string') { + embedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length); + } else { + embedSrc = this.id.call( this, embedSrc ); + } + } + embedSrc = this.src.replace('%id%', embedSrc ); + return false; // break; + } + }); + + var dataObj = {}; + if(iframeSt.srcAction) { + dataObj[iframeSt.srcAction] = embedSrc; + } + mfp._parseMarkup(template, dataObj, item); + + mfp.updateStatus('ready'); + + return template; + } + } +}); + + + +/*>>iframe*/ + +/*>>gallery*/ +/** + * Get looped index depending on number of slides + */ +var _getLoopedId = function(index) { + var numSlides = mfp.items.length; + if(index > numSlides - 1) { + return index - numSlides; + } else if(index < 0) { + return numSlides + index; + } + return index; + }, + _replaceCurrTotal = function(text, curr, total) { + return text.replace(/%curr%/gi, curr + 1).replace(/%total%/gi, total); + }; + +$.magnificPopup.registerModule('gallery', { + + options: { + enabled: false, + arrowMarkup: '', + preload: [0,2], + navigateByImgClick: true, + arrows: true, + + tPrev: 'Previous (Left arrow key)', + tNext: 'Next (Right arrow key)', + tCounter: '%curr% of %total%' + }, + + proto: { + initGallery: function() { + + var gSt = mfp.st.gallery, + ns = '.mfp-gallery', + supportsFastClick = Boolean($.fn.mfpFastClick); + + mfp.direction = true; // true - next, false - prev + + if(!gSt || !gSt.enabled ) return false; + + _wrapClasses += ' mfp-gallery'; + + _mfpOn(OPEN_EVENT+ns, function() { + + if(gSt.navigateByImgClick) { + mfp.wrap.on('click'+ns, '.mfp-img', function() { + if(mfp.items.length > 1) { + mfp.next(); + return false; + } + }); + } + + _document.on('keydown'+ns, function(e) { + if (e.keyCode === 37) { + mfp.prev(); + } else if (e.keyCode === 39) { + mfp.next(); + } + }); + }); + + _mfpOn('UpdateStatus'+ns, function(e, data) { + if(data.text) { + data.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length); + } + }); + + _mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) { + var l = mfp.items.length; + values.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : ''; + }); + + _mfpOn('BuildControls' + ns, function() { + if(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) { + var markup = gSt.arrowMarkup, + arrowLeft = mfp.arrowLeft = $( markup.replace(/%title%/gi, gSt.tPrev).replace(/%dir%/gi, 'left') ).addClass(PREVENT_CLOSE_CLASS), + arrowRight = mfp.arrowRight = $( markup.replace(/%title%/gi, gSt.tNext).replace(/%dir%/gi, 'right') ).addClass(PREVENT_CLOSE_CLASS); + + var eName = supportsFastClick ? 'mfpFastClick' : 'click'; + arrowLeft[eName](function() { + mfp.prev(); + }); + arrowRight[eName](function() { + mfp.next(); + }); + + // Polyfill for :before and :after (adds elements with classes mfp-a and mfp-b) + if(mfp.isIE7) { + _getEl('b', arrowLeft[0], false, true); + _getEl('a', arrowLeft[0], false, true); + _getEl('b', arrowRight[0], false, true); + _getEl('a', arrowRight[0], false, true); + } + + mfp.container.append(arrowLeft.add(arrowRight)); + } + }); + + _mfpOn(CHANGE_EVENT+ns, function() { + if(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout); + + mfp._preloadTimeout = setTimeout(function() { + mfp.preloadNearbyImages(); + mfp._preloadTimeout = null; + }, 16); + }); + + + _mfpOn(CLOSE_EVENT+ns, function() { + _document.off(ns); + mfp.wrap.off('click'+ns); + + if(mfp.arrowLeft && supportsFastClick) { + mfp.arrowLeft.add(mfp.arrowRight).destroyMfpFastClick(); + } + mfp.arrowRight = mfp.arrowLeft = null; + }); + + }, + next: function() { + mfp.direction = true; + mfp.index = _getLoopedId(mfp.index + 1); + mfp.updateItemHTML(); + }, + prev: function() { + mfp.direction = false; + mfp.index = _getLoopedId(mfp.index - 1); + mfp.updateItemHTML(); + }, + goTo: function(newIndex) { + mfp.direction = (newIndex >= mfp.index); + mfp.index = newIndex; + mfp.updateItemHTML(); + }, + preloadNearbyImages: function() { + var p = mfp.st.gallery.preload, + preloadBefore = Math.min(p[0], mfp.items.length), + preloadAfter = Math.min(p[1], mfp.items.length), + i; + + for(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) { + mfp._preloadItem(mfp.index+i); + } + for(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) { + mfp._preloadItem(mfp.index-i); + } + }, + _preloadItem: function(index) { + index = _getLoopedId(index); + + if(mfp.items[index].preloaded) { + return; + } + + var item = mfp.items[index]; + if(!item.parsed) { + item = mfp.parseEl( index ); + } + + _mfpTrigger('LazyLoad', item); + + if(item.type === 'image') { + item.img = $('').on('load.mfploader', function() { + item.hasSize = true; + }).on('error.mfploader', function() { + item.hasSize = true; + item.loadError = true; + _mfpTrigger('LazyLoadError', item); + }).attr('src', item.src); + } + + + item.preloaded = true; + } + } +}); + +/* +Touch Support that might be implemented some day + +addSwipeGesture: function() { + var startX, + moved, + multipleTouches; + + return; + + var namespace = '.mfp', + addEventNames = function(pref, down, move, up, cancel) { + mfp._tStart = pref + down + namespace; + mfp._tMove = pref + move + namespace; + mfp._tEnd = pref + up + namespace; + mfp._tCancel = pref + cancel + namespace; + }; + + if(window.navigator.msPointerEnabled) { + addEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel'); + } else if('ontouchstart' in window) { + addEventNames('touch', 'start', 'move', 'end', 'cancel'); + } else { + return; + } + _window.on(mfp._tStart, function(e) { + var oE = e.originalEvent; + multipleTouches = moved = false; + startX = oE.pageX || oE.changedTouches[0].pageX; + }).on(mfp._tMove, function(e) { + if(e.originalEvent.touches.length > 1) { + multipleTouches = e.originalEvent.touches.length; + } else { + //e.preventDefault(); + moved = true; + } + }).on(mfp._tEnd + ' ' + mfp._tCancel, function(e) { + if(moved && !multipleTouches) { + var oE = e.originalEvent, + diff = startX - (oE.pageX || oE.changedTouches[0].pageX); + + if(diff > 20) { + mfp.next(); + } else if(diff < -20) { + mfp.prev(); + } + } + }); +}, +*/ + + +/*>>gallery*/ + +/*>>retina*/ + +var RETINA_NS = 'retina'; + +$.magnificPopup.registerModule(RETINA_NS, { + options: { + replaceSrc: function(item) { + return item.src.replace(/\.\w+$/, function(m) { return '@2x' + m; }); + }, + ratio: 1 // Function or number. Set to 1 to disable. + }, + proto: { + initRetina: function() { + if(window.devicePixelRatio > 1) { + + var st = mfp.st.retina, + ratio = st.ratio; + + ratio = !isNaN(ratio) ? ratio : ratio(); + + if(ratio > 1) { + _mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) { + item.img.css({ + 'max-width': item.img[0].naturalWidth / ratio, + 'width': '100%' + }); + }); + _mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) { + item.src = st.replaceSrc(item, ratio); + }); + } + } + + } + } +}); + +/*>>retina*/ + +/*>>fastclick*/ +/** + * FastClick event implementation. (removes 300ms delay on touch devices) + * Based on https://developers.google.com/mobile/articles/fast_buttons + * + * You may use it outside the Magnific Popup by calling just: + * + * $('.your-el').mfpFastClick(function() { + * console.log('Clicked!'); + * }); + * + * To unbind: + * $('.your-el').destroyMfpFastClick(); + * + * + * Note that it's a very basic and simple implementation, it blocks ghost click on the same element where it was bound. + * If you need something more advanced, use plugin by FT Labs https://github.com/ftlabs/fastclick + * + */ + +(function() { + var ghostClickDelay = 1000, + supportsTouch = 'ontouchstart' in window, + unbindTouchMove = function() { + _window.off('touchmove'+ns+' touchend'+ns); + }, + eName = 'mfpFastClick', + ns = '.'+eName; + + + // As Zepto.js doesn't have an easy way to add custom events (like jQuery), so we implement it in this way + $.fn.mfpFastClick = function(callback) { + + return $(this).each(function() { + + var elem = $(this), + lock; + + if( supportsTouch ) { + + var timeout, + startX, + startY, + pointerMoved, + point, + numPointers; + + elem.on('touchstart' + ns, function(e) { + pointerMoved = false; + numPointers = 1; + + point = e.originalEvent ? e.originalEvent.touches[0] : e.touches[0]; + startX = point.clientX; + startY = point.clientY; + + _window.on('touchmove'+ns, function(e) { + point = e.originalEvent ? e.originalEvent.touches : e.touches; + numPointers = point.length; + point = point[0]; + if (Math.abs(point.clientX - startX) > 10 || + Math.abs(point.clientY - startY) > 10) { + pointerMoved = true; + unbindTouchMove(); + } + }).on('touchend'+ns, function(e) { + unbindTouchMove(); + if(pointerMoved || numPointers > 1) { + return; + } + lock = true; + e.preventDefault(); + clearTimeout(timeout); + timeout = setTimeout(function() { + lock = false; + }, ghostClickDelay); + callback(); + }); + }); + + } + + elem.on('click' + ns, function() { + if(!lock) { + callback(); + } + }); + }); + }; + + $.fn.destroyMfpFastClick = function() { + $(this).off('touchstart' + ns + ' click' + ns); + if(supportsTouch) _window.off('touchmove'+ns+' touchend'+ns); + }; +})(); + +/*>>fastclick*/ +})(window.jQuery || window.Zepto); \ No newline at end of file diff --git a/vendors/jquery-magnific-popup/jquery.magnific-popup.min.js b/vendors/jquery-magnific-popup/jquery.magnific-popup.min.js new file mode 100644 index 000000000..2348bd752 --- /dev/null +++ b/vendors/jquery-magnific-popup/jquery.magnific-popup.min.js @@ -0,0 +1,4 @@ +/*! Magnific Popup - v0.9.8 - 2013-10-26 +* http://dimsemenov.com/plugins/magnific-popup/ +* Copyright (c) 2013 Dmitry Semenov; MIT */ +(function(e){var t,i,n,o,r,a,s,l="Close",c="BeforeClose",d="AfterClose",u="BeforeAppend",p="MarkupParse",f="Open",m="Change",g="mfp",v="."+g,h="mfp-ready",C="mfp-removing",y="mfp-prevent-close",w=function(){},b=!!window.jQuery,I=e(window),x=function(e,i){t.ev.on(g+e+v,i)},k=function(t,i,n,o){var r=document.createElement("div");return r.className="mfp-"+t,n&&(r.innerHTML=n),o?i&&i.appendChild(r):(r=e(r),i&&r.appendTo(i)),r},T=function(i,n){t.ev.triggerHandler(g+i,n),t.st.callbacks&&(i=i.charAt(0).toLowerCase()+i.slice(1),t.st.callbacks[i]&&t.st.callbacks[i].apply(t,e.isArray(n)?n:[n]))},E=function(){(t.st.focus?t.content.find(t.st.focus).eq(0):t.wrap).focus()},S=function(i){return i===s&&t.currTemplate.closeBtn||(t.currTemplate.closeBtn=e(t.st.closeMarkup.replace("%title%",t.st.tClose)),s=i),t.currTemplate.closeBtn},P=function(){e.magnificPopup.instance||(t=new w,t.init(),e.magnificPopup.instance=t)},_=function(){var e=document.createElement("p").style,t=["ms","O","Moz","Webkit"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+"Transition"in e)return!0;return!1};w.prototype={constructor:w,init:function(){var i=navigator.appVersion;t.isIE7=-1!==i.indexOf("MSIE 7."),t.isIE8=-1!==i.indexOf("MSIE 8."),t.isLowIE=t.isIE7||t.isIE8,t.isAndroid=/android/gi.test(i),t.isIOS=/iphone|ipad|ipod/gi.test(i),t.supportsTransition=_(),t.probablyMobile=t.isAndroid||t.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),n=e(document.body),o=e(document),t.popupsCache={}},open:function(i){var n;if(i.isObj===!1){t.items=i.items.toArray(),t.index=0;var r,s=i.items;for(n=0;s.length>n;n++)if(r=s[n],r.parsed&&(r=r.el[0]),r===i.el[0]){t.index=n;break}}else t.items=e.isArray(i.items)?i.items:[i.items],t.index=i.index||0;if(t.isOpen)return t.updateItemHTML(),void 0;t.types=[],a="",t.ev=i.mainEl&&i.mainEl.length?i.mainEl.eq(0):o,i.key?(t.popupsCache[i.key]||(t.popupsCache[i.key]={}),t.currTemplate=t.popupsCache[i.key]):t.currTemplate={},t.st=e.extend(!0,{},e.magnificPopup.defaults,i),t.fixedContentPos="auto"===t.st.fixedContentPos?!t.probablyMobile:t.st.fixedContentPos,t.st.modal&&(t.st.closeOnContentClick=!1,t.st.closeOnBgClick=!1,t.st.showCloseBtn=!1,t.st.enableEscapeKey=!1),t.bgOverlay||(t.bgOverlay=k("bg").on("click"+v,function(){t.close()}),t.wrap=k("wrap").attr("tabindex",-1).on("click"+v,function(e){t._checkIfClose(e.target)&&t.close()}),t.container=k("container",t.wrap)),t.contentContainer=k("content"),t.st.preloader&&(t.preloader=k("preloader",t.container,t.st.tLoading));var l=e.magnificPopup.modules;for(n=0;l.length>n;n++){var c=l[n];c=c.charAt(0).toUpperCase()+c.slice(1),t["init"+c].call(t)}T("BeforeOpen"),t.st.showCloseBtn&&(t.st.closeBtnInside?(x(p,function(e,t,i,n){i.close_replaceWith=S(n.type)}),a+=" mfp-close-btn-in"):t.wrap.append(S())),t.st.alignTop&&(a+=" mfp-align-top"),t.fixedContentPos?t.wrap.css({overflow:t.st.overflowY,overflowX:"hidden",overflowY:t.st.overflowY}):t.wrap.css({top:I.scrollTop(),position:"absolute"}),(t.st.fixedBgPos===!1||"auto"===t.st.fixedBgPos&&!t.fixedContentPos)&&t.bgOverlay.css({height:o.height(),position:"absolute"}),t.st.enableEscapeKey&&o.on("keyup"+v,function(e){27===e.keyCode&&t.close()}),I.on("resize"+v,function(){t.updateSize()}),t.st.closeOnContentClick||(a+=" mfp-auto-cursor"),a&&t.wrap.addClass(a);var d=t.wH=I.height(),u={};if(t.fixedContentPos&&t._hasScrollBar(d)){var m=t._getScrollbarSize();m&&(u.marginRight=m)}t.fixedContentPos&&(t.isIE7?e("body, html").css("overflow","hidden"):u.overflow="hidden");var g=t.st.mainClass;return t.isIE7&&(g+=" mfp-ie7"),g&&t._addClassToMFP(g),t.updateItemHTML(),T("BuildControls"),e("html").css(u),t.bgOverlay.add(t.wrap).prependTo(document.body),t._lastFocusedEl=document.activeElement,setTimeout(function(){t.content?(t._addClassToMFP(h),E()):t.bgOverlay.addClass(h),o.on("focusin"+v,function(i){return i.target===t.wrap[0]||e.contains(t.wrap[0],i.target)?void 0:(E(),!1)})},16),t.isOpen=!0,t.updateSize(d),T(f),i},close:function(){t.isOpen&&(T(c),t.isOpen=!1,t.st.removalDelay&&!t.isLowIE&&t.supportsTransition?(t._addClassToMFP(C),setTimeout(function(){t._close()},t.st.removalDelay)):t._close())},_close:function(){T(l);var i=C+" "+h+" ";if(t.bgOverlay.detach(),t.wrap.detach(),t.container.empty(),t.st.mainClass&&(i+=t.st.mainClass+" "),t._removeClassFromMFP(i),t.fixedContentPos){var n={marginRight:""};t.isIE7?e("body, html").css("overflow",""):n.overflow="",e("html").css(n)}o.off("keyup"+v+" focusin"+v),t.ev.off(v),t.wrap.attr("class","mfp-wrap").removeAttr("style"),t.bgOverlay.attr("class","mfp-bg"),t.container.attr("class","mfp-container"),!t.st.showCloseBtn||t.st.closeBtnInside&&t.currTemplate[t.currItem.type]!==!0||t.currTemplate.closeBtn&&t.currTemplate.closeBtn.detach(),t._lastFocusedEl&&e(t._lastFocusedEl).focus(),t.currItem=null,t.content=null,t.currTemplate=null,t.prevHeight=0,T(d)},updateSize:function(e){if(t.isIOS){var i=document.documentElement.clientWidth/window.innerWidth,n=window.innerHeight*i;t.wrap.css("height",n),t.wH=n}else t.wH=e||I.height();t.fixedContentPos||t.wrap.css("height",t.wH),T("Resize")},updateItemHTML:function(){var i=t.items[t.index];t.contentContainer.detach(),t.content&&t.content.detach(),i.parsed||(i=t.parseEl(t.index));var n=i.type;if(T("BeforeChange",[t.currItem?t.currItem.type:"",n]),t.currItem=i,!t.currTemplate[n]){var o=t.st[n]?t.st[n].markup:!1;T("FirstMarkupParse",o),t.currTemplate[n]=o?e(o):!0}r&&r!==i.type&&t.container.removeClass("mfp-"+r+"-holder");var a=t["get"+n.charAt(0).toUpperCase()+n.slice(1)](i,t.currTemplate[n]);t.appendContent(a,n),i.preloaded=!0,T(m,i),r=i.type,t.container.prepend(t.contentContainer),T("AfterChange")},appendContent:function(e,i){t.content=e,e?t.st.showCloseBtn&&t.st.closeBtnInside&&t.currTemplate[i]===!0?t.content.find(".mfp-close").length||t.content.append(S()):t.content=e:t.content="",T(u),t.container.addClass("mfp-"+i+"-holder"),t.contentContainer.append(t.content)},parseEl:function(i){var n=t.items[i],o=n.type;if(n=n.tagName?{el:e(n)}:{data:n,src:n.src},n.el){for(var r=t.types,a=0;r.length>a;a++)if(n.el.hasClass("mfp-"+r[a])){o=r[a];break}n.src=n.el.attr("data-mfp-src"),n.src||(n.src=n.el.attr("href"))}return n.type=o||t.st.type||"inline",n.index=i,n.parsed=!0,t.items[i]=n,T("ElementParse",n),t.items[i]},addGroup:function(e,i){var n=function(n){n.mfpEl=this,t._openClick(n,e,i)};i||(i={});var o="click.magnificPopup";i.mainEl=e,i.items?(i.isObj=!0,e.off(o).on(o,n)):(i.isObj=!1,i.delegate?e.off(o).on(o,i.delegate,n):(i.items=e,e.off(o).on(o,n)))},_openClick:function(i,n,o){var r=void 0!==o.midClick?o.midClick:e.magnificPopup.defaults.midClick;if(r||2!==i.which&&!i.ctrlKey&&!i.metaKey){var a=void 0!==o.disableOn?o.disableOn:e.magnificPopup.defaults.disableOn;if(a)if(e.isFunction(a)){if(!a.call(t))return!0}else if(a>I.width())return!0;i.type&&(i.preventDefault(),t.isOpen&&i.stopPropagation()),o.el=e(i.mfpEl),o.delegate&&(o.items=n.find(o.delegate)),t.open(o)}},updateStatus:function(e,n){if(t.preloader){i!==e&&t.container.removeClass("mfp-s-"+i),n||"loading"!==e||(n=t.st.tLoading);var o={status:e,text:n};T("UpdateStatus",o),e=o.status,n=o.text,t.preloader.html(n),t.preloader.find("a").on("click",function(e){e.stopImmediatePropagation()}),t.container.addClass("mfp-s-"+e),i=e}},_checkIfClose:function(i){if(!e(i).hasClass(y)){var n=t.st.closeOnContentClick,o=t.st.closeOnBgClick;if(n&&o)return!0;if(!t.content||e(i).hasClass("mfp-close")||t.preloader&&i===t.preloader[0])return!0;if(i===t.content[0]||e.contains(t.content[0],i)){if(n)return!0}else if(o&&e.contains(document,i))return!0;return!1}},_addClassToMFP:function(e){t.bgOverlay.addClass(e),t.wrap.addClass(e)},_removeClassFromMFP:function(e){this.bgOverlay.removeClass(e),t.wrap.removeClass(e)},_hasScrollBar:function(e){return(t.isIE7?o.height():document.body.scrollHeight)>(e||I.height())},_parseMarkup:function(t,i,n){var o;n.data&&(i=e.extend(n.data,i)),T(p,[t,i,n]),e.each(i,function(e,i){if(void 0===i||i===!1)return!0;if(o=e.split("_"),o.length>1){var n=t.find(v+"-"+o[0]);if(n.length>0){var r=o[1];"replaceWith"===r?n[0]!==i[0]&&n.replaceWith(i):"img"===r?n.is("img")?n.attr("src",i):n.replaceWith(''):n.attr(o[1],i)}}else t.find(v+"-"+e).html(i)})},_getScrollbarSize:function(){if(void 0===t.scrollbarSize){var e=document.createElement("div");e.id="mfp-sbm",e.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(e),t.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)}return t.scrollbarSize}},e.magnificPopup={instance:null,proto:w.prototype,modules:[],open:function(t,i){return P(),t=t?e.extend(!0,{},t):{},t.isObj=!0,t.index=i||0,this.instance.open(t)},close:function(){return e.magnificPopup.instance&&e.magnificPopup.instance.close()},registerModule:function(t,i){i.options&&(e.magnificPopup.defaults[t]=i.options),e.extend(this.proto,i.proto),this.modules.push(t)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading..."}},e.fn.magnificPopup=function(i){P();var n=e(this);if("string"==typeof i)if("open"===i){var o,r=b?n.data("magnificPopup"):n[0].magnificPopup,a=parseInt(arguments[1],10)||0;r.items?o=r.items[a]:(o=n,r.delegate&&(o=o.find(r.delegate)),o=o.eq(a)),t._openClick({mfpEl:o},n,r)}else t.isOpen&&t[i].apply(t,Array.prototype.slice.call(arguments,1));else i=e.extend(!0,{},i),b?n.data("magnificPopup",i):n[0].magnificPopup=i,t.addGroup(n,i);return n};var O,z,M,B="inline",H=function(){M&&(z.after(M.addClass(O)).detach(),M=null)};e.magnificPopup.registerModule(B,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){t.types.push(B),x(l+"."+B,function(){H()})},getInline:function(i,n){if(H(),i.src){var o=t.st.inline,r=e(i.src);if(r.length){var a=r[0].parentNode;a&&a.tagName&&(z||(O=o.hiddenClass,z=k(O),O="mfp-"+O),M=r.after(z).detach().removeClass(O)),t.updateStatus("ready")}else t.updateStatus("error",o.tNotFound),r=e("
    ");return i.inlineElement=r,r}return t.updateStatus("ready"),t._parseMarkup(n,{},i),n}}});var L,A="ajax",F=function(){L&&n.removeClass(L)},j=function(){F(),t.req&&t.req.abort()};e.magnificPopup.registerModule(A,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){t.types.push(A),L=t.st.ajax.cursor,x(l+"."+A,j),x("BeforeChange."+A,j)},getAjax:function(i){L&&n.addClass(L),t.updateStatus("loading");var o=e.extend({url:i.src,success:function(n,o,r){var a={data:n,xhr:r};T("ParseAjax",a),t.appendContent(e(a.data),A),i.finished=!0,F(),E(),setTimeout(function(){t.wrap.addClass(h)},16),t.updateStatus("ready"),T("AjaxContentAdded")},error:function(){F(),i.finished=i.loadError=!0,t.updateStatus("error",t.st.ajax.tError.replace("%url%",i.src))}},t.st.ajax.settings);return t.req=e.ajax(o),""}}});var N,W=function(i){if(i.data&&void 0!==i.data.title)return i.data.title;var n=t.st.image.titleSrc;if(n){if(e.isFunction(n))return n.call(t,i);if(i.el)return i.el.attr(n)||""}return""};e.magnificPopup.registerModule("image",{options:{markup:'
    ',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var e=t.st.image,i=".image";t.types.push("image"),x(f+i,function(){"image"===t.currItem.type&&e.cursor&&n.addClass(e.cursor)}),x(l+i,function(){e.cursor&&n.removeClass(e.cursor),I.off("resize"+v)}),x("Resize"+i,t.resizeImage),t.isLowIE&&x("AfterChange",t.resizeImage)},resizeImage:function(){var e=t.currItem;if(e&&e.img&&t.st.image.verticalFit){var i=0;t.isLowIE&&(i=parseInt(e.img.css("padding-top"),10)+parseInt(e.img.css("padding-bottom"),10)),e.img.css("max-height",t.wH-i)}},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,N&&clearInterval(N),e.isCheckingImgSize=!1,T("ImageHasSize",e),e.imgHidden&&(t.content&&t.content.removeClass("mfp-loading"),e.imgHidden=!1))},findImageSize:function(e){var i=0,n=e.img[0],o=function(r){N&&clearInterval(N),N=setInterval(function(){return n.naturalWidth>0?(t._onImageHasSize(e),void 0):(i>200&&clearInterval(N),i++,3===i?o(10):40===i?o(50):100===i&&o(500),void 0)},r)};o(1)},getImage:function(i,n){var o=0,r=function(){i&&(i.img[0].complete?(i.img.off(".mfploader"),i===t.currItem&&(t._onImageHasSize(i),t.updateStatus("ready")),i.hasSize=!0,i.loaded=!0,T("ImageLoadComplete")):(o++,200>o?setTimeout(r,100):a()))},a=function(){i&&(i.img.off(".mfploader"),i===t.currItem&&(t._onImageHasSize(i),t.updateStatus("error",s.tError.replace("%url%",i.src))),i.hasSize=!0,i.loaded=!0,i.loadError=!0)},s=t.st.image,l=n.find(".mfp-img");if(l.length){var c=document.createElement("img");c.className="mfp-img",i.img=e(c).on("load.mfploader",r).on("error.mfploader",a),c.src=i.src,l.is("img")&&(i.img=i.img.clone()),i.img[0].naturalWidth>0&&(i.hasSize=!0)}return t._parseMarkup(n,{title:W(i),img_replaceWith:i.img},i),t.resizeImage(),i.hasSize?(N&&clearInterval(N),i.loadError?(n.addClass("mfp-loading"),t.updateStatus("error",s.tError.replace("%url%",i.src))):(n.removeClass("mfp-loading"),t.updateStatus("ready")),n):(t.updateStatus("loading"),i.loading=!0,i.hasSize||(i.imgHidden=!0,n.addClass("mfp-loading"),t.findImageSize(i)),n)}}});var R,Z=function(){return void 0===R&&(R=void 0!==document.createElement("p").style.MozTransform),R};e.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(e){return e.is("img")?e:e.find("img")}},proto:{initZoom:function(){var e,i=t.st.zoom,n=".zoom";if(i.enabled&&t.supportsTransition){var o,r,a=i.duration,s=function(e){var t=e.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),n="all "+i.duration/1e3+"s "+i.easing,o={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},r="transition";return o["-webkit-"+r]=o["-moz-"+r]=o["-o-"+r]=o[r]=n,t.css(o),t},d=function(){t.content.css("visibility","visible")};x("BuildControls"+n,function(){if(t._allowZoom()){if(clearTimeout(o),t.content.css("visibility","hidden"),e=t._getItemToZoom(),!e)return d(),void 0;r=s(e),r.css(t._getOffset()),t.wrap.append(r),o=setTimeout(function(){r.css(t._getOffset(!0)),o=setTimeout(function(){d(),setTimeout(function(){r.remove(),e=r=null,T("ZoomAnimationEnded")},16)},a)},16)}}),x(c+n,function(){if(t._allowZoom()){if(clearTimeout(o),t.st.removalDelay=a,!e){if(e=t._getItemToZoom(),!e)return;r=s(e)}r.css(t._getOffset(!0)),t.wrap.append(r),t.content.css("visibility","hidden"),setTimeout(function(){r.css(t._getOffset())},16)}}),x(l+n,function(){t._allowZoom()&&(d(),r&&r.remove(),e=null)})}},_allowZoom:function(){return"image"===t.currItem.type},_getItemToZoom:function(){return t.currItem.hasSize?t.currItem.img:!1},_getOffset:function(i){var n;n=i?t.currItem.img:t.st.zoom.opener(t.currItem.el||t.currItem);var o=n.offset(),r=parseInt(n.css("padding-top"),10),a=parseInt(n.css("padding-bottom"),10);o.top-=e(window).scrollTop()-r;var s={width:n.width(),height:(b?n.innerHeight():n[0].offsetHeight)-a-r};return Z()?s["-moz-transform"]=s.transform="translate("+o.left+"px,"+o.top+"px)":(s.left=o.left,s.top=o.top),s}}});var q="iframe",D="//about:blank",K=function(e){if(t.currTemplate[q]){var i=t.currTemplate[q].find("iframe");i.length&&(e||(i[0].src=D),t.isIE8&&i.css("display",e?"block":"none"))}};e.magnificPopup.registerModule(q,{options:{markup:'
    ',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){t.types.push(q),x("BeforeChange",function(e,t,i){t!==i&&(t===q?K():i===q&&K(!0))}),x(l+"."+q,function(){K()})},getIframe:function(i,n){var o=i.src,r=t.st.iframe;e.each(r.patterns,function(){return o.indexOf(this.index)>-1?(this.id&&(o="string"==typeof this.id?o.substr(o.lastIndexOf(this.id)+this.id.length,o.length):this.id.call(this,o)),o=this.src.replace("%id%",o),!1):void 0});var a={};return r.srcAction&&(a[r.srcAction]=o),t._parseMarkup(n,a,i),t.updateStatus("ready"),n}}});var Y=function(e){var i=t.items.length;return e>i-1?e-i:0>e?i+e:e},U=function(e,t,i){return e.replace(/%curr%/gi,t+1).replace(/%total%/gi,i)};e.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var i=t.st.gallery,n=".mfp-gallery",r=Boolean(e.fn.mfpFastClick);return t.direction=!0,i&&i.enabled?(a+=" mfp-gallery",x(f+n,function(){i.navigateByImgClick&&t.wrap.on("click"+n,".mfp-img",function(){return t.items.length>1?(t.next(),!1):void 0}),o.on("keydown"+n,function(e){37===e.keyCode?t.prev():39===e.keyCode&&t.next()})}),x("UpdateStatus"+n,function(e,i){i.text&&(i.text=U(i.text,t.currItem.index,t.items.length))}),x(p+n,function(e,n,o,r){var a=t.items.length;o.counter=a>1?U(i.tCounter,r.index,a):""}),x("BuildControls"+n,function(){if(t.items.length>1&&i.arrows&&!t.arrowLeft){var n=i.arrowMarkup,o=t.arrowLeft=e(n.replace(/%title%/gi,i.tPrev).replace(/%dir%/gi,"left")).addClass(y),a=t.arrowRight=e(n.replace(/%title%/gi,i.tNext).replace(/%dir%/gi,"right")).addClass(y),s=r?"mfpFastClick":"click";o[s](function(){t.prev()}),a[s](function(){t.next()}),t.isIE7&&(k("b",o[0],!1,!0),k("a",o[0],!1,!0),k("b",a[0],!1,!0),k("a",a[0],!1,!0)),t.container.append(o.add(a))}}),x(m+n,function(){t._preloadTimeout&&clearTimeout(t._preloadTimeout),t._preloadTimeout=setTimeout(function(){t.preloadNearbyImages(),t._preloadTimeout=null},16)}),x(l+n,function(){o.off(n),t.wrap.off("click"+n),t.arrowLeft&&r&&t.arrowLeft.add(t.arrowRight).destroyMfpFastClick(),t.arrowRight=t.arrowLeft=null}),void 0):!1},next:function(){t.direction=!0,t.index=Y(t.index+1),t.updateItemHTML()},prev:function(){t.direction=!1,t.index=Y(t.index-1),t.updateItemHTML()},goTo:function(e){t.direction=e>=t.index,t.index=e,t.updateItemHTML()},preloadNearbyImages:function(){var e,i=t.st.gallery.preload,n=Math.min(i[0],t.items.length),o=Math.min(i[1],t.items.length);for(e=1;(t.direction?o:n)>=e;e++)t._preloadItem(t.index+e);for(e=1;(t.direction?n:o)>=e;e++)t._preloadItem(t.index-e)},_preloadItem:function(i){if(i=Y(i),!t.items[i].preloaded){var n=t.items[i];n.parsed||(n=t.parseEl(i)),T("LazyLoad",n),"image"===n.type&&(n.img=e('').on("load.mfploader",function(){n.hasSize=!0}).on("error.mfploader",function(){n.hasSize=!0,n.loadError=!0,T("LazyLoadError",n)}).attr("src",n.src)),n.preloaded=!0}}}});var G="retina";e.magnificPopup.registerModule(G,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var e=t.st.retina,i=e.ratio;i=isNaN(i)?i():i,i>1&&(x("ImageHasSize."+G,function(e,t){t.img.css({"max-width":t.img[0].naturalWidth/i,width:"100%"})}),x("ElementParse."+G,function(t,n){n.src=e.replaceSrc(n,i)}))}}}}),function(){var t=1e3,i="ontouchstart"in window,n=function(){I.off("touchmove"+r+" touchend"+r)},o="mfpFastClick",r="."+o;e.fn.mfpFastClick=function(o){return e(this).each(function(){var a,s=e(this);if(i){var l,c,d,u,p,f;s.on("touchstart"+r,function(e){u=!1,f=1,p=e.originalEvent?e.originalEvent.touches[0]:e.touches[0],c=p.clientX,d=p.clientY,I.on("touchmove"+r,function(e){p=e.originalEvent?e.originalEvent.touches:e.touches,f=p.length,p=p[0],(Math.abs(p.clientX-c)>10||Math.abs(p.clientY-d)>10)&&(u=!0,n())}).on("touchend"+r,function(e){n(),u||f>1||(a=!0,e.preventDefault(),clearTimeout(l),l=setTimeout(function(){a=!1},t),o())})})}s.on("click"+r,function(){a||o()})})},e.fn.destroyMfpFastClick=function(){e(this).off("touchstart"+r+" click"+r),i&&I.off("touchmove"+r+" touchend"+r)}}()})(window.jQuery||window.Zepto); \ No newline at end of file diff --git a/vendors/jquery-magnific-popup/magnific-popup-animations.css b/vendors/jquery-magnific-popup/magnific-popup-animations.css new file mode 100644 index 000000000..3dfd27a65 --- /dev/null +++ b/vendors/jquery-magnific-popup/magnific-popup-animations.css @@ -0,0 +1,45 @@ + +/* overlay at start */ +.mfp-fade.mfp-bg { + opacity: 0; + + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +/* overlay animate in */ +.mfp-fade.mfp-bg.mfp-ready { + opacity: 0.8; +} +/* overlay animate out */ +.mfp-fade.mfp-bg.mfp-removing { + opacity: 0; +} + +/* content at start */ +.mfp-fade.mfp-wrap .mfp-content { + opacity: 0; + + -webkit-transition: all 0.15s ease-out; + -moz-transition: all 0.15s ease-out; + transition: all 0.15s ease-out; + + -webkit-transform: translateX(-50px); + -moz-transform: translateX(-50px); + transform: translateX(-50px); +} + +/* content animate it */ +.mfp-fade.mfp-wrap.mfp-ready .mfp-content { + opacity: 1; + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + transform: translateX(0); +} +/* content animate out */ +.mfp-fade.mfp-wrap.mfp-removing .mfp-content { + opacity: 0; + -webkit-transform: translateX(50px); + -moz-transform: translateX(50px); + transform: translateX(50px); +} diff --git a/vendors/jquery-magnific-popup/magnific-popup.css b/vendors/jquery-magnific-popup/magnific-popup.css new file mode 100644 index 000000000..947eb50cf --- /dev/null +++ b/vendors/jquery-magnific-popup/magnific-popup.css @@ -0,0 +1,364 @@ +/* Magnific Popup CSS */ +.mfp-bg { + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1042; + overflow: hidden; + position: fixed; + background: #0b0b0b; + opacity: 0.8; + filter: alpha(opacity=80); } + +.mfp-wrap { + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1043; + position: fixed; + outline: none !important; + -webkit-backface-visibility: hidden; } + +.mfp-container { + text-align: center; + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + padding: 0 8px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +.mfp-container:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; } + +.mfp-align-top .mfp-container:before { + display: none; } + +.mfp-content { + position: relative; + display: inline-block; + vertical-align: middle; + margin: 0 auto; + text-align: left; + z-index: 1045; } + +.mfp-inline-holder .mfp-content, .mfp-ajax-holder .mfp-content { + width: 100%; + cursor: auto; } + +.mfp-ajax-cur { + cursor: progress; } + +.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close { + cursor: -moz-zoom-out; + cursor: -webkit-zoom-out; + cursor: zoom-out; } + +.mfp-zoom { + cursor: pointer; + cursor: -webkit-zoom-in; + cursor: -moz-zoom-in; + cursor: zoom-in; } + +.mfp-auto-cursor .mfp-content { + cursor: auto; } + +.mfp-close, .mfp-arrow, .mfp-preloader, .mfp-counter { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; } + +.mfp-loading.mfp-figure { + display: none; } + +.mfp-hide { + display: none !important; } + +.mfp-preloader { + color: #cccccc; + position: absolute; + top: 50%; + width: auto; + text-align: center; + margin-top: -0.8em; + left: 8px; + right: 8px; + z-index: 1044; } + .mfp-preloader a { + color: #cccccc; } + .mfp-preloader a:hover { + color: white; } + +.mfp-s-ready .mfp-preloader { + display: none; } + +.mfp-s-error .mfp-content { + display: none; } + +button.mfp-close, button.mfp-arrow { + overflow: visible; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + display: block; + outline: none; + padding: 0; + z-index: 1046; + -webkit-box-shadow: none; + box-shadow: none; } +button::-moz-focus-inner { + padding: 0; + border: 0; } + +.mfp-close { + width: 44px; + height: 44px; + line-height: 44px; + position: absolute; + right: 0; + top: 0; + text-decoration: none; + text-align: center; + opacity: 0.65; + padding: 0 0 18px 10px; + color: white; + font-style: normal; + font-size: 28px; + font-family: Arial, Baskerville, monospace; } + .mfp-close:hover, .mfp-close:focus { + opacity: 1; } + .mfp-close:active { + top: 1px; } + +.mfp-close-btn-in .mfp-close { + color: #333333; } + +.mfp-image-holder .mfp-close, .mfp-iframe-holder .mfp-close { + color: white; + right: -6px; + text-align: right; + padding-right: 6px; + width: 100%; } + +.mfp-counter { + position: absolute; + top: 0; + right: 0; + color: #cccccc; + font-size: 12px; + line-height: 18px; } + +.mfp-arrow { + position: absolute; + opacity: 0.65; + margin: 0; + top: 50%; + margin-top: -55px; + padding: 0; + width: 90px; + height: 110px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + .mfp-arrow:active { + margin-top: -54px; } + .mfp-arrow:hover, .mfp-arrow:focus { + opacity: 1; } + .mfp-arrow:before, .mfp-arrow:after, .mfp-arrow .mfp-b, .mfp-arrow .mfp-a { + content: ''; + display: block; + width: 0; + height: 0; + position: absolute; + left: 0; + top: 0; + margin-top: 35px; + margin-left: 35px; + border: medium inset transparent; } + .mfp-arrow:after, .mfp-arrow .mfp-a { + border-top-width: 13px; + border-bottom-width: 13px; + top: 8px; } + .mfp-arrow:before, .mfp-arrow .mfp-b { + border-top-width: 21px; + border-bottom-width: 21px; } + +.mfp-arrow-left { + left: 0; } + .mfp-arrow-left:after, .mfp-arrow-left .mfp-a { + border-right: 17px solid white; + margin-left: 31px; } + .mfp-arrow-left:before, .mfp-arrow-left .mfp-b { + margin-left: 25px; + border-right: 27px solid #3f3f3f; } + +.mfp-arrow-right { + right: 0; } + .mfp-arrow-right:after, .mfp-arrow-right .mfp-a { + border-left: 17px solid white; + margin-left: 39px; } + .mfp-arrow-right:before, .mfp-arrow-right .mfp-b { + border-left: 27px solid #3f3f3f; } + +.mfp-iframe-holder { + padding-top: 40px; + padding-bottom: 40px; } + .mfp-iframe-holder .mfp-content { + line-height: 0; + width: 100%; + max-width: 900px; } + .mfp-iframe-holder .mfp-close { + top: -40px; } + +.mfp-iframe-scaler { + width: 100%; + height: 0; + overflow: hidden; + padding-top: 56.25%; } + .mfp-iframe-scaler iframe { + position: absolute; + display: block; + top: 0; + left: 0; + width: 100%; + height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); + background: black; } + +/* Main image in popup */ +img.mfp-img { + width: auto; + max-width: 100%; + height: auto; + display: block; + line-height: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 40px 0 40px; + margin: 0 auto; } + +/* The shadow behind the image */ +.mfp-figure { + line-height: 0; } + .mfp-figure:after { + content: ''; + position: absolute; + left: 0; + top: 40px; + bottom: 40px; + display: block; + right: 0; + width: auto; + height: auto; + z-index: -1; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); + background: #444444; } + .mfp-figure small { + color: #bdbdbd; + display: block; + font-size: 12px; + line-height: 14px; } + +.mfp-bottom-bar { + margin-top: -36px; + position: absolute; + top: 100%; + left: 0; + width: 100%; + cursor: auto; } + +.mfp-title { + text-align: left; + line-height: 18px; + color: #f3f3f3; + word-wrap: break-word; + padding-right: 36px; } + +.mfp-image-holder .mfp-content { + max-width: 100%; } + +.mfp-gallery .mfp-image-holder .mfp-figure { + cursor: pointer; } + +@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) { + /** + * Remove all paddings around the image on small screen + */ + .mfp-img-mobile .mfp-image-holder { + padding-left: 0; + padding-right: 0; } + .mfp-img-mobile img.mfp-img { + padding: 0; } + .mfp-img-mobile .mfp-figure { + /* The shadow behind the image */ } + .mfp-img-mobile .mfp-figure:after { + top: 0; + bottom: 0; } + .mfp-img-mobile .mfp-figure small { + display: inline; + margin-left: 5px; } + .mfp-img-mobile .mfp-bottom-bar { + background: rgba(0, 0, 0, 0.6); + bottom: 0; + margin: 0; + top: auto; + padding: 3px 5px; + position: fixed; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + .mfp-img-mobile .mfp-bottom-bar:empty { + padding: 0; } + .mfp-img-mobile .mfp-counter { + right: 5px; + top: 3px; } + .mfp-img-mobile .mfp-close { + top: 0; + right: 0; + width: 35px; + height: 35px; + line-height: 35px; + background: rgba(0, 0, 0, 0.6); + position: fixed; + text-align: center; + padding: 0; } } + +@media all and (max-width: 900px) { + .mfp-arrow { + -webkit-transform: scale(0.75); + transform: scale(0.75); } + .mfp-arrow-left { + -webkit-transform-origin: 0; + transform-origin: 0; } + .mfp-arrow-right { + -webkit-transform-origin: 100%; + transform-origin: 100%; } + .mfp-container { + padding-left: 6px; + padding-right: 6px; } } + +.mfp-ie7 .mfp-img { + padding: 0; } +.mfp-ie7 .mfp-bottom-bar { + width: 600px; + left: 50%; + margin-left: -300px; + margin-top: 5px; + padding-bottom: 5px; } +.mfp-ie7 .mfp-container { + padding: 0; } +.mfp-ie7 .mfp-content { + padding-top: 44px; } +.mfp-ie7 .mfp-close { + top: 0; + right: 0; + padding-top: 0; } + diff --git a/vendors/jquery-magnific-popup/magnific-popup.jquery.json b/vendors/jquery-magnific-popup/magnific-popup.jquery.json new file mode 100644 index 000000000..aeb3d1efe --- /dev/null +++ b/vendors/jquery-magnific-popup/magnific-popup.jquery.json @@ -0,0 +1,29 @@ +{ + "name": "magnific-popup", + "title": "Magnific Popup", + "description": "Fast, light, mobile-friendly and responsive lightbox and modal dialog plugin. Open inline HTML, ajax loaded content, image, form, iframe (YouTube video, Vimeo, Google Maps), photo gallery. Animation effects added with CSS3 transitions. For jQuery or Zepto.", + "version": "0.9.8", + "homepage": "http://dimsemenov.com/plugins/magnific-popup/", + "demo": "http://dimsemenov.com/plugins/magnific-popup/", + "docs": "http://dimsemenov.com/plugins/magnific-popup/documentation.html", + "author": { + "name": "Dmitry Semenov", + "email": "diiiimaaaa@gmail.com", + "url": "http://dimsemenov.com" + }, + "repository": { + "type": "git", + "url": "https://github.com/dimsemenov/Magnific-Popup.git" + }, + "bugs": "https://github.com/dimsemenov/Magnific-Popup/issues", + "dependencies": { + "jquery": ">=1.7.2" + }, + "keywords": ["lightbox","popup","modal","window","dialog","ui","gallery","slideshow","video","image","ajax","html5","animation","jquery","photo","responsive","mobile"], + "licenses": [ + { + "type": "MIT", + "url": "http://www.opensource.org/licenses/mit-license.php" + } + ] +} \ No newline at end of file diff --git a/vendors/jquery-magnific-popup/package.json b/vendors/jquery-magnific-popup/package.json new file mode 100644 index 000000000..7640f60af --- /dev/null +++ b/vendors/jquery-magnific-popup/package.json @@ -0,0 +1,26 @@ +{ + "name": "magnific-popup", + "version": "0.0.0-ignored", + "engines": { + "node": ">= 0.8.0" + }, + "scripts": { + "test": "grunt jshint" + }, + "devDependencies": { + "grunt-contrib-jshint": "~0.1.1", + "grunt-contrib-concat": "~0.1.2", + "grunt-contrib-uglify": "~0.1.1", + "grunt-contrib-watch": "~0.2.0", + "grunt-contrib-clean": "~0.4.0", + "grunt": "~0.4.0", + "grunt-contrib-cssmin": "~0.4.1", + "grunt-contrib-copy": "~0.4.0", + "grunt-jekyll": "~0.3.9", + "grunt-sass": "~0.6.1" + }, + "repository": { + "type": "git", + "url": "https://github.com/nschonni/Magnific-Popup.git" + } +} diff --git a/vendors/jquery-mousewheel/ChangeLog.markdown b/vendors/jquery-mousewheel/ChangeLog.markdown new file mode 100644 index 000000000..5c88a1e80 --- /dev/null +++ b/vendors/jquery-mousewheel/ChangeLog.markdown @@ -0,0 +1,96 @@ +# Mouse Wheel ChangeLog + +## 3.1.4 + +* Always set the deltaY +* Add back in the deltaX and deltaY support for older Firefox versions + +## 3.1.3 + +* Include `MozMousePixelScroll` in the to fix list to avoid inconsistent behavior in older Firefox + +## 3.1.2 + +* Include grunt utilities for development purposes (jshint and uglify) +* Include support for browserify +* Some basic cleaning up + +## 3.1.1 + +* Fix rounding issue with deltas less than zero + + +## 3.1.0 + +* Fix Firefox 17+ issues by using new wheel event +* Normalize delta values +* Adds horizontal support for IE 9+ by using new wheel event +* Support AMD loaders + + +## 3.0.6 + +* Fix issue with delta being 0 in Firefox + + +## 3.0.5 + +* jQuery 1.7 compatibility + + +## 3.0.4 + +* Fix IE issue + + +## 3.0.3 + +* Added `deltaX` and `deltaY` for horizontal scrolling support (Thanks to Seamus Leahy) + + +## 3.0.2 + +* Fixed delta being opposite value in latest Opera +* No longer fix `pageX`, `pageY` for older Mozilla browsers +* Removed browser detection +* Cleaned up the code + + +## 3.0.1 + +* Bad release... creating a new release due to plugins.jquery.com issue :( + + +## 3.0 + +* Uses new special events API in jQuery 1.2.2+ +* You can now treat `mousewheel` as a normal event and use `.bind`, `.unbind` and `.trigger` +* Using jQuery.data API for expandos + + +## 2.2 + +* Fixed `pageX`, `pageY`, `clientX` and `clientY` event properties for Mozilla based browsers + + +## 2.1.1 + +* Updated to work with jQuery 1.1.3 +* Used one instead of bind to do unload event for clean up + + +## 2.1 + +* Fixed an issue with the unload handler + + +## 2.0 + +* Major reduction in code size and complexity (internals have change a whole lot) + + +## 1.0 + +* Fixed Opera issue +* Fixed an issue with children elements that also have a mousewheel handler +* Added ability to handle multiple handlers diff --git a/vendors/jquery-mousewheel/LICENSE.txt b/vendors/jquery-mousewheel/LICENSE.txt new file mode 100644 index 000000000..d64b7076b --- /dev/null +++ b/vendors/jquery-mousewheel/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2013, Brandon Aaron (http://brandonaaron.net/) + +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. diff --git a/vendors/jquery-mousewheel/README.markdown b/vendors/jquery-mousewheel/README.markdown new file mode 100644 index 000000000..15e1735e7 --- /dev/null +++ b/vendors/jquery-mousewheel/README.markdown @@ -0,0 +1,58 @@ +# jQuery Mouse Wheel Plugin + +A [jQuery](http://jquery.com/) plugin that adds cross-browser mouse wheel support. + +In order to use the plugin, simply bind the `mousewheel` event to an element. +It also provides two helper methods called `mousewheel` and `unmousewheel` +that act just like other event helper methods in jQuery. The event callback +receives three extra arguments which are the normalized "deltas" of the mouse wheel. + +Here is an example of using both the bind and helper method syntax: + +```js +// using bind +$('#my_elem').on('mousewheel', function(event, delta, deltaX, deltaY) { + console.log(delta, deltaX, deltaY); +}); + +// using the event helper +$('#my_elem').mousewheel(function(event, delta, deltaX, deltaY) { + console.log(delta, deltaX, deltaY); +}); +``` + +## See it in action +[See the tests on Github](http://brandonaaron.github.io/jquery-mousewheel/test). + +## Using with [Browserify](http://browserify.org) + +Support for browserify is baked in. + +```bash +npm install jquery-mousewheel +npm install jquery-browserify +``` + +In your server-side node.js code: + +```js +var express = require('express'); +var app = express.createServer(); + +app.use(require('browserify')({ + require : [ 'jquery-browserify', 'jquery-mousewheel' ] +})); +``` + +In your browser-side javascript: + +```js +var $ = require('jquery-browserify'); +require('jquery-mousewheel')($); +``` + +## License + +This plugin is licensed under the [MIT License](LICENSE.txt). + +Copyright (c) 2013 [Brandon Aaron](http://brandon.aaron.sh) diff --git a/vendors/jquery-mousewheel/jquery.mousewheel-3.1.4.min.js b/vendors/jquery-mousewheel/jquery.mousewheel-3.1.4.min.js new file mode 100644 index 000000000..e62186803 --- /dev/null +++ b/vendors/jquery-mousewheel/jquery.mousewheel-3.1.4.min.js @@ -0,0 +1,2 @@ +/*! jquery.mousewheel v3.1.4 (c) 2013 Brandon Aaron (http://brandon.aaron.sh) | MIT */ +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a:a(jQuery)}(function(a){function b(b){var e,f=b||window.event,g=[].slice.call(arguments,1),h=0,i=0,j=0,k=0,l=0;return b=a.event.fix(f),b.type="mousewheel",f.wheelDelta&&(h=f.wheelDelta),f.detail&&(h=-1*f.detail),j=h,void 0!==f.axis&&f.axis===f.HORIZONTAL_AXIS&&(j=0,i=-1*h),f.deltaY&&(j=-1*f.deltaY,h=j),f.deltaX&&(i=f.deltaX,h=-1*i),void 0!==f.wheelDeltaY&&(j=f.wheelDeltaY),void 0!==f.wheelDeltaX&&(i=-1*f.wheelDeltaX),k=Math.abs(h),(!c||c>k)&&(c=k),l=Math.max(Math.abs(j),Math.abs(i)),(!d||d>l)&&(d=l),e=h>0?"floor":"ceil",h=Math[e](h/c),i=Math[e](i/d),j=Math[e](j/d),g.unshift(b,h,i,j),(a.event.dispatch||a.event.handle).apply(this,g)}var c,d,e=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],f="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"];if(a.event.fixHooks)for(var g=e.length;g;)a.event.fixHooks[e[--g]]=a.event.mouseHooks;a.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=f.length;a;)this.addEventListener(f[--a],b,!1);else this.onmousewheel=b},teardown:function(){if(this.removeEventListener)for(var a=f.length;a;)this.removeEventListener(f[--a],b,!1);else this.onmousewheel=null}},a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})}); \ No newline at end of file diff --git a/vendors/jquery-mousewheel/jquery.mousewheel.js b/vendors/jquery-mousewheel/jquery.mousewheel.js new file mode 100644 index 000000000..e1d0e50b3 --- /dev/null +++ b/vendors/jquery-mousewheel/jquery.mousewheel.js @@ -0,0 +1,122 @@ +/*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh) + * Licensed under the MIT License (LICENSE.txt). + * + * Version: 3.1.4 + * + * Requires: 1.2.2+ + */ + +(function (factory) { + if ( typeof define === 'function' && define.amd ) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS style for Browserify + module.exports = factory; + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + + var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll']; + var toBind = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll']; + var lowestDelta, lowestDeltaXY; + + if ( $.event.fixHooks ) { + for ( var i = toFix.length; i; ) { + $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; + } + } + + $.event.special.mousewheel = { + setup: function() { + if ( this.addEventListener ) { + for ( var i = toBind.length; i; ) { + this.addEventListener( toBind[--i], handler, false ); + } + } else { + this.onmousewheel = handler; + } + }, + + teardown: function() { + if ( this.removeEventListener ) { + for ( var i = toBind.length; i; ) { + this.removeEventListener( toBind[--i], handler, false ); + } + } else { + this.onmousewheel = null; + } + } + }; + + $.fn.extend({ + mousewheel: function(fn) { + return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); + }, + + unmousewheel: function(fn) { + return this.unbind('mousewheel', fn); + } + }); + + + function handler(event) { + var orgEvent = event || window.event, + args = [].slice.call(arguments, 1), + delta = 0, + deltaX = 0, + deltaY = 0, + absDelta = 0, + absDeltaXY = 0, + fn; + event = $.event.fix(orgEvent); + event.type = 'mousewheel'; + + // Old school scrollwheel delta + if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta; } + if ( orgEvent.detail ) { delta = orgEvent.detail * -1; } + + // At a minimum, setup the deltaY to be delta + deltaY = delta; + + // Firefox < 17 related to DOMMouseScroll event + if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { + deltaY = 0; + deltaX = delta * -1; + } + + // New school wheel delta (wheel event) + if ( orgEvent.deltaY ) { + deltaY = orgEvent.deltaY * -1; + delta = deltaY; + } + if ( orgEvent.deltaX ) { + deltaX = orgEvent.deltaX; + delta = deltaX * -1; + } + + // Webkit + if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY; } + if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = orgEvent.wheelDeltaX * -1; } + + // Look for lowest delta to normalize the delta values + absDelta = Math.abs(delta); + if ( !lowestDelta || absDelta < lowestDelta ) { lowestDelta = absDelta; } + absDeltaXY = Math.max(Math.abs(deltaY), Math.abs(deltaX)); + if ( !lowestDeltaXY || absDeltaXY < lowestDeltaXY ) { lowestDeltaXY = absDeltaXY; } + + // Get a whole value for the deltas + fn = delta > 0 ? 'floor' : 'ceil'; + delta = Math[fn](delta / lowestDelta); + deltaX = Math[fn](deltaX / lowestDeltaXY); + deltaY = Math[fn](deltaY / lowestDeltaXY); + + // Add event and delta to the front of the arguments + args.unshift(event, delta, deltaX, deltaY); + + return ($.event.dispatch || $.event.handle).apply(this, args); + } + +})); diff --git a/vendors/jquery-mousewheel/mousewheel.jquery.json b/vendors/jquery-mousewheel/mousewheel.jquery.json new file mode 100644 index 000000000..e5a68ed14 --- /dev/null +++ b/vendors/jquery-mousewheel/mousewheel.jquery.json @@ -0,0 +1,27 @@ +{ + "name": "mousewheel", + "title": "jQuery Mousewheel", + "description": "A jQuery plugin that adds cross-browser mouse wheel support.", + "keywords": [ + "mousewheel", + "mouse", + "event" + ], + "version": "3.1.4", + "author": { + "name": "Brandon Aaron", + "url": "http://brandonaaron.net" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://raw.github.com/brandonaaron/jquery-mousewheel/master/LICENSE.txt" + } + ], + "bugs": "https://github.com/brandonaaron/jquery-mousewheel/issues", + "homepage": "https://github.com/brandonaaron/jquery-mousewheel", + "download": "https://github.com/brandonaaron/jquery-mousewheel/tags", + "dependencies": { + "jquery": ">=1.2.2" + } +} diff --git a/vendors/jquery-mousewheel/package.json b/vendors/jquery-mousewheel/package.json new file mode 100644 index 000000000..49e99cf03 --- /dev/null +++ b/vendors/jquery-mousewheel/package.json @@ -0,0 +1,43 @@ +{ + "name": "jquery-mousewheel", + "version": "3.1.4", + "author": "Brandon Aaron (http://brandonaaron.net/)", + "description": "A jQuery plugin that adds cross-browser mouse wheel support.", + "main": "./jquery.mousewheel.js", + "repository": { + "type": "git", + "url": "https://github.com/brandonaaron/jquery-mousewheel.git" + }, + "bugs": { + "url": "https://github.com/brandonaaron/jquery-mousewheel/issues" + }, + "keywords": [ + "jquery", + "mouse", + "wheel", + "event", + "mousewheel", + "plugin", + "browser" + ], + "licenses": [ + { + "type": "MIT", + "url": "https://raw.github.com/brandonaaron/jquery-mousewheel/master/LICENSE.txt" + } + ], + "devDependencies": { + "grunt": "~0.4.1", + "grunt-contrib-jshint": "~0.6.4", + "grunt-contrib-uglify": "~0.2.4" + }, + "readmeFilename": "README.markdown", + "directories": { + "test": "test" + }, + "jam": { + "dependencies": { + "jquery": ">=1.2.2" + } + } +} diff --git a/vendors/jquery-nanoscroller/jquery.nanoscroller-0.7.min.js b/vendors/jquery-nanoscroller/jquery.nanoscroller-0.7.min.js new file mode 100644 index 000000000..31235e26c --- /dev/null +++ b/vendors/jquery-nanoscroller/jquery.nanoscroller-0.7.min.js @@ -0,0 +1,2 @@ +/*! nanoScrollerJS v0.7 (c) 2013 James Florentino; modified by RainLoop Team | MIT */ +!function(a,b,c){"use strict";var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;w={paneClass:"pane",sliderClass:"slider",contentClass:"content",iOSNativeScrolling:!1,preventPageScrolling:!1,disableResize:!1,alwaysVisible:!1,flashDelay:1500,sliderMinHeight:20,sliderMaxHeight:null},s="scrollbar",r="scroll",k="mousedown",l="mousemove",n="mousewheel",m="mouseup",q="resize",h="drag",u="up",p="panedown",f="DOMMouseScroll",g="down",v="wheel",i="keydown",j="keyup",t="touchmove",d="Microsoft Internet Explorer"===b.navigator.appName&&/msie 7./i.test(b.navigator.appVersion)&&b.ActiveXObject,e=null,x=function(){var a,b,d;return a=c.createElement("div"),b=a.style,b.position="absolute",b.width="100px",b.height="100px",b.overflow=r,b.top="-9999px",a.className="nano-visibility-hidden",c.body.appendChild(a),d=a.offsetWidth-a.clientWidth,c.body.removeChild(a),d},o=function(){function i(d,f){this.el=d,this.options=f,e||(e=x()),this.$el=a(this.el),this.doc=a(c),this.win=a(b),this.$content=this.$el.children("."+f.contentClass),this.$content.attr("tabindex",0),this.content=this.$content[0],this.options.iOSNativeScrolling&&null!=this.el.style.WebkitOverflowScrolling?this.nativeScrolling():this.generate(),this.createEvents(),this.addEvents(),this.reset()}return i.prototype.preventScrolling=function(a,b){if(this.isActive||this.isActive2)if(a.type===f)(b===g&&a.originalEvent.detail>0||b===u&&a.originalEvent.detail<0)&&a.preventDefault();else if(a.type===n){if(!a.originalEvent||!a.originalEvent.wheelDelta)return;(b===g&&a.originalEvent.wheelDelta<0||b===u&&a.originalEvent.wheelDelta>0)&&a.preventDefault()}},i.prototype.nativeScrolling=function(){this.$content.css({WebkitOverflowScrolling:"touch"}),this.iOSNativeScrolling=!0,this.isActive=!0,this.isActive2=!0},i.prototype.updateScrollValues=function(){var a;a=this.content,this.maxScrollTop=a.scrollHeight-a.clientHeight,this.maxScroll2Left=a.scrollWidth-a.clientWidth,this.contentScrollTop=a.scrollTop,this.contentScroll2Left=a.scrollLeft,this.iOSNativeScrolling||(this.maxSliderTop=this.paneHeight-this.sliderHeight,this.maxSlider2Left=this.pane2Width-this.slider2Width,this.sliderTop=this.contentScrollTop*this.maxSliderTop/this.maxScrollTop,this.slider2Left=this.contentScroll2Left*this.maxSlider2Left/this.maxScroll2Left)},i.prototype.createEvents=function(){var a=this;this.events={down:function(b){return a.isBeingDragged=!0,a.offsetY=b.pageY-a.slider.offset().top,a.pane.addClass("active"),a.doc.bind(l,a.events[h]).bind(m,a.events[u]),!1},down2:function(b){return a.isBeingDragged2=!0,a.offsetX=b.pageX-a.slider2.offset().left,a.pane2.addClass("active"),a.doc.bind(l,a.events.drag2).bind(m,a.events.up2),!1},drag:function(b){return a.sliderY=b.pageY-a.$el.offset().top-a.offsetY,a.scroll(),a.updateScrollValues(),a.contentScrollTop>=a.maxScrollTop?a.$el.trigger("scrollend"):0===a.contentScrollTop&&a.$el.trigger("scrolltop"),!1},drag2:function(b){return a.slider2X=b.pageX-a.$el.offset().left-a.offsetX,a.scroll(),a.updateScrollValues(),!1},up:function(){return a.isBeingDragged=!1,a.pane.removeClass("active"),a.doc.unbind(l,a.events[h]).unbind(m,a.events[u]),!1},up2:function(){return a.isBeingDragged2=!1,a.pane2.removeClass("active"),a.doc.unbind(l,a.events.drag2).unbind(m,a.events.up2),!1},resize:function(){a.reset()},panedown:function(b){return a.sliderY=(b.offsetY||b.originalEvent.layerY)-.5*a.sliderHeight,a.scroll(),a.events.down(b),!1},panedown2:function(b){return a.slider2X=(b.offsetX||b.originalEvent.layerX)-.5*a.slider2Width,a.scroll(),a.events.down2(b),!1},scroll:function(b){a.isBeingDragged||a.isBeingDragged2||(a.updateScrollValues(),a.iOSNativeScrolling||(a.sliderY=a.sliderTop,a.slider.css({top:a.sliderTop}),a.slider2X=a.slider2Left,a.slider2.css({left:a.slider2Left})),b&&(a.contentScrollTop>=a.maxScrollTop?(a.options.preventPageScrolling&&a.preventScrolling(b,g),a.$el.trigger("scrollend")):0===a.contentScrollTop&&(a.options.preventPageScrolling&&a.preventScrolling(b,u),a.$el.trigger("scrolltop"))))},wheel:function(b){return b&&void 0!==b.wheelDeltaY&&void 0!==b.delta?(a.sliderY+=-b.wheelDeltaY||-b.delta,a.scroll(),!1):void 0}}},i.prototype.addEvents=function(){var a;this.removeEvents(),a=this.events,this.options.disableResize||this.win.bind(q,a[q]),this.iOSNativeScrolling||(this.slider.bind(k,a[g]),this.slider2.bind(k,a.down2),this.pane.bind(k,a[p]),this.pane2.bind(k,a.panedown2)),this.$content.bind(""+r+" "+n+" "+f+" "+t,a[r])},i.prototype.removeEvents=function(){var a;a=this.events,this.win.unbind(q,a[q]),this.iOSNativeScrolling||(this.slider.unbind(),this.pane.unbind(),this.slider2.unbind(),this.pane2.unbind()),this.$content.unbind(""+r+" "+n+" "+f+" "+t,a[r])},i.prototype.generate=function(){var a,b,c,d,f;return c=this.options,d=c.paneClass,f=c.sliderClass,a=c.contentClass,this.$el.find("."+d).length||this.$el.find("."+f).length||this.$el.append('
    '),this.$el.find(".pane2").length||this.$el.find(".slider2").length||this.$el.append('
    '),this.slider=this.$el.find("."+f),this.slider2=this.$el.find(".slider2"),this.pane=this.$el.find("."+d),this.pane2=this.$el.find(".pane2"),e&&(b="rtl"===this.$el.css("direction")?{left:-e,bottom:-e}:{right:-e,bottom:-e},this.$el.addClass("has-scrollbar")),null!=b&&this.$content.css(b),this},i.prototype.restore=function(){this.stopped=!1,this.pane.show(),this.pane2.show(),this.addEvents()},i.prototype.reset=function(){var a,b,c,f,g,h,i,j,k,l,m,n,o,p,q,s;return this.iOSNativeScrolling?(this.contentHeight=this.content.scrollHeight,this.contentWidth=this.content.scrollWidth,void 0):(this.$el.find("."+this.options.paneClass).length||this.generate().stop(),this.$el.find(".pane2").length||this.generate().stop(),this.stopped&&this.restore(),a=this.content,c=a.style,f=c.overflowY,l=c.overflowX,d&&this.$content.css({height:this.$content.height()}),b=a.scrollHeight+e,m=a.scrollWidth+e,h=this.pane.outerHeight(),n=this.pane2.outerWidth(),j=parseInt(this.pane.css("top"),10),p=parseInt(this.pane2.css("left"),10),g=parseInt(this.pane.css("bottom"),10),o=parseInt(this.pane2.css("right"),10),i=h+j+g,q=n+p+o,k=Math.round(i/b*i),s=Math.round(q/m*q),kthis.options.sliderMaxHeight&&(k=this.options.sliderMaxHeight),sthis.options.sliderMaxHeight&&(s=this.options.sliderMaxHeight),f===r&&c.overflowX!==r&&(k+=e),l===r&&c.overflowY!==r&&(s+=e),this.maxSliderTop=i-k,this.maxSlider2Left=q-s,this.contentHeight=b,this.contentWidth=m,this.paneHeight=h,this.pane2Width=n,this.paneOuterHeight=i,this.pane2OuterWidth=q,this.sliderHeight=k,this.slider2Width=s,this.slider.height(k),this.slider2.width(s),this.events.scroll(),this.pane.show(),this.pane2.show(),this.isActive=!0,a.scrollHeight===a.clientHeight||this.pane.outerHeight(!0)>=a.scrollHeight&&f!==r?(this.pane.hide(),this.isActive=!1):this.el.clientHeight===a.scrollHeight&&f===r?this.slider.hide():this.slider.show(),this.isActive2=!0,a.scrollWidth===a.clientWidth||this.pane2.outerWidth(!0)>=a.scrollWidth-30&&l!==r?(this.pane2.hide(),this.isActive2=!1):this.el.clientWidth===a.scrollWidth&&l===r?this.slider2.hide():this.slider2.show(),this.pane.css({opacity:this.options.alwaysVisible?1:"",visibility:this.options.alwaysVisible?"visible":""}),this.pane2.css({opacity:this.options.alwaysVisible?1:"",visibility:this.options.alwaysVisible?"visible":""}),this)},i.prototype.scroll=function(){return this.isActive||this.isActive2?(this.isActive&&(this.sliderY=Math.max(0,this.sliderY),this.sliderY=Math.min(this.maxSliderTop,this.sliderY),this.$content.scrollTop((this.paneHeight-this.contentHeight+e)*this.sliderY/this.maxSliderTop*-1)),this.isActive2&&(this.slider2X=Math.max(0,this.slider2X),this.slider2X=Math.min(this.maxSlider2Left,this.slider2X),this.$content.scrollLeft((this.pane2Width-this.contentWidth+e)*this.slider2X/this.maxSlider2Left*-1)),this.iOSNativeScrolling||(this.isActive&&this.slider.css({top:this.sliderY}),this.isActive2&&this.slider2.css({left:this.slider2X})),this):void 0},i.prototype.scrollBottom=function(a){return this.isActive||this.isActive2?(this.reset(),this.$content.scrollTop(this.contentHeight-this.$content.height()-a).trigger(n),this):void 0},i.prototype.scrollTop=function(a){return this.isActive||this.isActive2?(this.reset(),this.$content.scrollTop(+a).trigger(n),this):void 0},i.prototype.scrollTo=function(b){return this.isActive||this.isActive2?(this.reset(),this.scrollTop(a(b).get(0).offsetTop),this):void 0},i.prototype.stop=function(){return this.stopped=!0,this.removeEvents(),this.pane.hide(),this},i.prototype.flash=function(){var a=this;if(this.isActive||this.isActive2)return this.reset(),this.pane.addClass("flashed"),setTimeout(function(){a.pane.removeClass("flashed")},this.options.flashDelay),this},i}(),a.fn.nanoScroller=function(b){return this.each(function(){var c,d;if((d=this.nanoscroller)||(c=a.extend({},w,b),this.nanoscroller=d=new o(this,c)),b&&"object"==typeof b){if(a.extend(d.options,b),b.scrollBottom)return d.scrollBottom(b.scrollBottom);if(b.scrollTop)return d.scrollTop(b.scrollTop);if(b.scrollTo)return d.scrollTo(b.scrollTo);if("bottom"===b.scroll)return d.scrollBottom(0);if("top"===b.scroll)return d.scrollTop(0);if(b.scroll&&b.scroll instanceof a)return d.scrollTo(b.scroll);if(b.stop)return d.stop();if(b.flash)return d.flash()}return d.reset()})}}(jQuery,window,document); \ No newline at end of file diff --git a/vendors/jquery-nanoscroller/jquery.nanoscroller.js b/vendors/jquery-nanoscroller/jquery.nanoscroller.js new file mode 100644 index 000000000..82278b0be --- /dev/null +++ b/vendors/jquery-nanoscroller/jquery.nanoscroller.js @@ -0,0 +1,867 @@ +/*! nanoScrollerJS - v0.7 +* http://jamesflorentino.github.com/nanoScrollerJS/ +* Copyright (c) 2013 James Florentino; Licensed under MIT +* +* modified by RainLoop Team +*/ + +(function($, window, document) { + "use strict"; + + var BROWSER_IS_IE7, BROWSER_SCROLLBAR_WIDTH, DOMSCROLL, DOWN, DRAG, KEYDOWN, KEYUP, MOUSEDOWN, MOUSEMOVE, MOUSEUP, MOUSEWHEEL, NanoScroll, PANEDOWN, RESIZE, SCROLL, SCROLLBAR, TOUCHMOVE, UP, WHEEL, defaults, getBrowserScrollbarWidth; + defaults = { + /** + a classname for the pane element. + @property paneClass + @type {string} + @default 'pane' + */ + + paneClass: 'pane', + /** + a classname for the slider element. + @property sliderClass + @type {string} + @default 'slider' + */ + + sliderClass: 'slider', + /** + a classname for the content element. + @property contentClass + @type {string} + @default 'content' + */ + + contentClass: 'content', + /** + a setting to enable native scrolling in iOS devices. + @property iOSNativeScrolling + @type {boolean} + @default false + */ + + iOSNativeScrolling: false, + /** + a setting to prevent the rest of the page being + scrolled when user scrolls the `.content` element. + @property preventPageScrolling + @type {boolean} + @default false + */ + + preventPageScrolling: false, + /** + a setting to disable binding to the resize event. + @property disableResize + @type {boolean} + @default false + */ + + disableResize: false, + /** + a setting to make the scrollbar always visible. + @property alwaysVisible + @type {boolean} + @default false + */ + + alwaysVisible: false, + /** + a default timeout for the `flash()` method. + @property flashDelay + @type {number} + @default 1500 + */ + + flashDelay: 1500, + /** + a minimum height for the `.slider` element. + @property sliderMinHeight + @type {number} + @default 20 + */ + + sliderMinHeight: 20, + /** + a maximum height for the `.slider` element. + @property sliderMaxHeight + @type {?number} + @default null + */ + + sliderMaxHeight: null + }; + /** + @property SCROLLBAR + @type {string} + @static + @final + @private + */ + + SCROLLBAR = 'scrollbar'; + /** + @property SCROLL + @type {string} + @static + @final + @private + */ + + SCROLL = 'scroll'; + /** + @property MOUSEDOWN + @type {string} + @final + @private + */ + + MOUSEDOWN = 'mousedown'; + /** + @property MOUSEMOVE + @type {string} + @static + @final + @private + */ + + MOUSEMOVE = 'mousemove'; + /** + @property MOUSEWHEEL + @type {string} + @final + @private + */ + + MOUSEWHEEL = 'mousewheel'; + /** + @property MOUSEUP + @type {string} + @static + @final + @private + */ + + MOUSEUP = 'mouseup'; + /** + @property RESIZE + @type {string} + @final + @private + */ + + RESIZE = 'resize'; + /** + @property DRAG + @type {string} + @static + @final + @private + */ + + DRAG = 'drag'; + /** + @property UP + @type {string} + @static + @final + @private + */ + + UP = 'up'; + /** + @property PANEDOWN + @type {string} + @static + @final + @private + */ + + PANEDOWN = 'panedown'; + /** + @property DOMSCROLL + @type {string} + @static + @final + @private + */ + + DOMSCROLL = 'DOMMouseScroll'; + /** + @property DOWN + @type {string} + @static + @final + @private + */ + + DOWN = 'down'; + /** + @property WHEEL + @type {string} + @static + @final + @private + */ + + WHEEL = 'wheel'; + /** + @property KEYDOWN + @type {string} + @static + @final + @private + */ + + KEYDOWN = 'keydown'; + /** + @property KEYUP + @type {string} + @static + @final + @private + */ + + KEYUP = 'keyup'; + /** + @property TOUCHMOVE + @type {string} + @static + @final + @private + */ + + TOUCHMOVE = 'touchmove'; + /** + @property BROWSER_IS_IE7 + @type {boolean} + @static + @final + @private + */ + + BROWSER_IS_IE7 = window.navigator.appName === 'Microsoft Internet Explorer' && /msie 7./i.test(window.navigator.appVersion) && window.ActiveXObject; + /** + @property BROWSER_SCROLLBAR_WIDTH + @type Number + @static + @default null + @private + */ + + BROWSER_SCROLLBAR_WIDTH = null; + /** + Returns browser's native scrollbar width + @method getBrowserScrollbarWidth + @return {number} the scrollbar width in pixels + @static + @private + */ + + getBrowserScrollbarWidth = function() { + var outer, outerStyle, scrollbarWidth; + outer = document.createElement('div'); + outerStyle = outer.style; + outerStyle.position = 'absolute'; + outerStyle.width = '100px'; + outerStyle.height = '100px'; + outerStyle.overflow = SCROLL; + outerStyle.top = '-9999px'; + outer.className = 'nano-visibility-hidden'; + document.body.appendChild(outer); + scrollbarWidth = outer.offsetWidth - outer.clientWidth; + document.body.removeChild(outer); + return scrollbarWidth; + }; + /** + @class NanoScroll + @param element {HTMLElement|Node} the main element + @param options {Object} nanoScroller's options + @constructor + */ + + NanoScroll = (function() { + + function NanoScroll(el, options) { + this.el = el; + this.options = options; + BROWSER_SCROLLBAR_WIDTH || (BROWSER_SCROLLBAR_WIDTH = getBrowserScrollbarWidth()); + this.$el = $(this.el); + this.doc = $(document); + this.win = $(window); + this.$content = this.$el.children("." + options.contentClass); + this.$content.attr('tabindex', 0); + this.content = this.$content[0]; + if (this.options.iOSNativeScrolling && (this.el.style.WebkitOverflowScrolling != null)) { + this.nativeScrolling(); + } else { + this.generate(); + } + this.createEvents(); + this.addEvents(); + this.reset(); + } + + /** + Prevents the rest of the page being scrolled + when user scrolls the `.content` element. + @method preventScrolling + @param e {Event} + @param direction {String} Scroll direction (up or down) + @private + */ + + + NanoScroll.prototype.preventScrolling = function(e, direction) { + if (!this.isActive && !this.isActive2) { + return; + } + if (e.type === DOMSCROLL) { + if (direction === DOWN && e.originalEvent.detail > 0 || direction === UP && e.originalEvent.detail < 0) { + e.preventDefault(); + } + } else if (e.type === MOUSEWHEEL) { + if (!e.originalEvent || !e.originalEvent.wheelDelta) { + return; + } + if (direction === DOWN && e.originalEvent.wheelDelta < 0 || direction === UP && e.originalEvent.wheelDelta > 0) { + e.preventDefault(); + } + } + }; + + /** + Enable iOS native scrolling + */ + + + NanoScroll.prototype.nativeScrolling = function() { + this.$content.css({ + WebkitOverflowScrolling: 'touch' + }); + this.iOSNativeScrolling = true; + this.isActive = true; + this.isActive2 = true; + }; + + /** + Updates those nanoScroller properties that + are related to current scrollbar position. + @method updateScrollValues + @private + */ + + + NanoScroll.prototype.updateScrollValues = function() { + var content; + content = this.content; + this.maxScrollTop = content.scrollHeight - content.clientHeight; + this.maxScroll2Left = content.scrollWidth - content.clientWidth; + this.contentScrollTop = content.scrollTop; + this.contentScroll2Left = content.scrollLeft; + if (!this.iOSNativeScrolling) { + this.maxSliderTop = this.paneHeight - this.sliderHeight; + this.maxSlider2Left = this.pane2Width - this.slider2Width; + this.sliderTop = this.contentScrollTop * this.maxSliderTop / this.maxScrollTop; + this.slider2Left = this.contentScroll2Left * this.maxSlider2Left / this.maxScroll2Left; + } + }; + + /** + Creates event related methods + @method createEvents + @private + */ + + + NanoScroll.prototype.createEvents = function() { + var _this = this; + this.events = { + down: function(e) { + _this.isBeingDragged = true; + _this.offsetY = e.pageY - _this.slider.offset().top; + _this.pane.addClass('active'); + _this.doc.bind(MOUSEMOVE, _this.events[DRAG]).bind(MOUSEUP, _this.events[UP]); + return false; + }, + down2: function(e) { + _this.isBeingDragged2 = true; + _this.offsetX = e.pageX - _this.slider2.offset().left; + _this.pane2.addClass('active'); + _this.doc.bind(MOUSEMOVE, _this.events['drag2']).bind(MOUSEUP, _this.events['up2']); + return false; + }, + drag: function(e) { + _this.sliderY = e.pageY - _this.$el.offset().top - _this.offsetY; + _this.scroll(); + _this.updateScrollValues(); + if (_this.contentScrollTop >= _this.maxScrollTop) { + _this.$el.trigger('scrollend'); + } else if (_this.contentScrollTop === 0) { + _this.$el.trigger('scrolltop'); + } + return false; + }, + drag2: function(e) { + _this.slider2X = e.pageX - _this.$el.offset().left - _this.offsetX; + _this.scroll(); + _this.updateScrollValues(); +/* if (_this.contentScrollLeft >= _this.maxScrollLeft) { + _this.$el.trigger('scrollend'); + } else if (_this.contentScrollLeft === 0) { + _this.$el.trigger('scrolltop'); + }*/ + return false; + }, + up: function() { + _this.isBeingDragged = false; + _this.pane.removeClass('active'); + _this.doc.unbind(MOUSEMOVE, _this.events[DRAG]).unbind(MOUSEUP, _this.events[UP]); + return false; + }, + up2: function() { + _this.isBeingDragged2 = false; + _this.pane2.removeClass('active'); + _this.doc.unbind(MOUSEMOVE, _this.events['drag2']).unbind(MOUSEUP, _this.events['up2']); + return false; + }, + resize: function() { + _this.reset(); + }, + panedown: function(e) { + _this.sliderY = (e.offsetY || e.originalEvent.layerY) - (_this.sliderHeight * 0.5); + _this.scroll(); + _this.events.down(e); + return false; + }, + panedown2: function(e) { + _this.slider2X = (e.offsetX || e.originalEvent.layerX) - (_this.slider2Width * 0.5); + _this.scroll(); + _this.events.down2(e); + return false; + }, + scroll: function(e) { + if (_this.isBeingDragged || _this.isBeingDragged2) { + return; + } + + _this.updateScrollValues(); + if (!_this.iOSNativeScrolling) { + _this.sliderY = _this.sliderTop; + _this.slider.css({ + top: _this.sliderTop + }); + _this.slider2X = _this.slider2Left; + _this.slider2.css({ + left: _this.slider2Left + }); + } + if (!e) { + return; + } + if (_this.contentScrollTop >= _this.maxScrollTop) { + if (_this.options.preventPageScrolling) { + _this.preventScrolling(e, DOWN); + } + _this.$el.trigger('scrollend'); + } else if (_this.contentScrollTop === 0) { + if (_this.options.preventPageScrolling) { + _this.preventScrolling(e, UP); + } + _this.$el.trigger('scrolltop'); + } + }, + /** + * @param {{wheelDeltaY:number, delta:number}} e + */ + wheel: function(e) { + if (!e || undefined === e.wheelDeltaY || undefined === e.delta) { + return; + } + _this.sliderY += -e.wheelDeltaY || -e.delta; + _this.scroll(); + return false; + } + }; + }; + + /** + Adds event listeners with jQuery. + @method addEvents + @private + */ + + + NanoScroll.prototype.addEvents = function() { + var events; + this.removeEvents(); + events = this.events; + if (!this.options.disableResize) { + this.win.bind(RESIZE, events[RESIZE]); + } + if (!this.iOSNativeScrolling) { + this.slider.bind(MOUSEDOWN, events[DOWN]); + this.slider2.bind(MOUSEDOWN, events['down2']); + this.pane.bind(MOUSEDOWN, events[PANEDOWN]);//.bind("" + MOUSEWHEEL + " " + DOMSCROLL, events[WHEEL]); + this.pane2.bind(MOUSEDOWN, events['panedown2']);//.bind("" + MOUSEWHEEL + " " + DOMSCROLL, events[WHEEL]); + } + this.$content.bind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]); + }; + + /** + Removes event listeners with jQuery. + @method removeEvents + @private + */ + + + NanoScroll.prototype.removeEvents = function() { + var events; + events = this.events; + this.win.unbind(RESIZE, events[RESIZE]); + if (!this.iOSNativeScrolling) { + this.slider.unbind(); + this.pane.unbind(); + this.slider2.unbind(); + this.pane2.unbind(); + } + this.$content.unbind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]); + }; + + /** + Generates nanoScroller's scrollbar and elements for it. + @method generate + @chainable + @private + */ + + + NanoScroll.prototype.generate = function() { + var contentClass, cssRule, options, paneClass, sliderClass; + options = this.options; + paneClass = options.paneClass, sliderClass = options.sliderClass, contentClass = options.contentClass; + if (!this.$el.find("." + paneClass).length && !this.$el.find("." + sliderClass).length) { + this.$el.append("
    "); + } + if (!this.$el.find(".pane2").length && !this.$el.find(".slider2").length) { + this.$el.append("
    "); + } + this.slider = this.$el.find("." + sliderClass); + this.slider2 = this.$el.find(".slider2"); + this.pane = this.$el.find("." + paneClass); + this.pane2 = this.$el.find(".pane2"); + if (BROWSER_SCROLLBAR_WIDTH) { + cssRule = this.$el.css('direction') === 'rtl' ? { + left: -BROWSER_SCROLLBAR_WIDTH, + bottom: -BROWSER_SCROLLBAR_WIDTH + } : { + right: -BROWSER_SCROLLBAR_WIDTH, + bottom: -BROWSER_SCROLLBAR_WIDTH + }; + this.$el.addClass('has-scrollbar'); + } + if (cssRule != null) { + this.$content.css(cssRule); + } + return this; + }; + + /** + @method restore + @private + */ + + + NanoScroll.prototype.restore = function() { + this.stopped = false; + this.pane.show(); + this.pane2.show(); + this.addEvents(); + }; + + /** + Resets nanoScroller's scrollbar. + @method reset + @chainable + @example + $(".nano").nanoScroller(); + */ + + + NanoScroll.prototype.reset = function() { + var content, contentHeight, contentStyle, contentStyleOverflowY, paneBottom, paneHeight, paneOuterHeight, paneTop, sliderHeight, + contentStyleOverflowX, contentWidth, pane2Width, pane2Right, pane2Left, pane2OuterWidth, slider2Width; + if (this.iOSNativeScrolling) { + this.contentHeight = this.content.scrollHeight; + this.contentWidth = this.content.scrollWidth; + return; + } + if (!this.$el.find("." + this.options.paneClass).length) { + this.generate().stop(); + } + if (!this.$el.find(".pane2").length) { + this.generate().stop(); + } + if (this.stopped) { + this.restore(); + } + content = this.content; + contentStyle = content.style; + contentStyleOverflowY = contentStyle.overflowY; + contentStyleOverflowX = contentStyle.overflowX; + if (BROWSER_IS_IE7) { + this.$content.css({ + height: this.$content.height() + }); + } + contentHeight = content.scrollHeight + BROWSER_SCROLLBAR_WIDTH; + contentWidth = content.scrollWidth + BROWSER_SCROLLBAR_WIDTH; + paneHeight = this.pane.outerHeight(); + pane2Width = this.pane2.outerWidth(); + paneTop = parseInt(this.pane.css('top'), 10); + pane2Left = parseInt(this.pane2.css('left'), 10); + paneBottom = parseInt(this.pane.css('bottom'), 10); + pane2Right = parseInt(this.pane2.css('right'), 10); + paneOuterHeight = paneHeight + paneTop + paneBottom; + pane2OuterWidth = pane2Width + pane2Left + pane2Right; + sliderHeight = Math.round(paneOuterHeight / contentHeight * paneOuterHeight); + slider2Width = Math.round(pane2OuterWidth / contentWidth * pane2OuterWidth); + if (sliderHeight < this.options.sliderMinHeight) { + sliderHeight = this.options.sliderMinHeight; + } else if ((this.options.sliderMaxHeight != null) && sliderHeight > this.options.sliderMaxHeight) { + sliderHeight = this.options.sliderMaxHeight; + } + if (slider2Width < this.options.sliderMinHeight) { + slider2Width = this.options.sliderMinHeight; + } else if ((this.options.sliderMaxHeight != null) && slider2Width > this.options.sliderMaxHeight) { + slider2Width = this.options.sliderMaxHeight; + } + if (contentStyleOverflowY === SCROLL && contentStyle.overflowX !== SCROLL) { + sliderHeight += BROWSER_SCROLLBAR_WIDTH; + } + if (contentStyleOverflowX === SCROLL && contentStyle.overflowY !== SCROLL) { + slider2Width += BROWSER_SCROLLBAR_WIDTH; + } + this.maxSliderTop = paneOuterHeight - sliderHeight; + this.maxSlider2Left = pane2OuterWidth - slider2Width; + this.contentHeight = contentHeight; + this.contentWidth = contentWidth; + this.paneHeight = paneHeight; + this.pane2Width = pane2Width; + this.paneOuterHeight = paneOuterHeight; + this.pane2OuterWidth = pane2OuterWidth; + this.sliderHeight = sliderHeight; + this.slider2Width = slider2Width; + this.slider.height(sliderHeight); + this.slider2.width(slider2Width); + this.events.scroll(); + this.pane.show(); + this.pane2.show(); + this.isActive = true; + if ((content.scrollHeight === content.clientHeight) || (this.pane.outerHeight(true) >= content.scrollHeight && contentStyleOverflowY !== SCROLL)) { + this.pane.hide(); + this.isActive = false; + } else if (this.el.clientHeight === content.scrollHeight && contentStyleOverflowY === SCROLL) { + this.slider.hide(); + } else { + this.slider.show(); + } + this.isActive2 = true; + if ((content.scrollWidth === content.clientWidth) || (this.pane2.outerWidth(true) >= content.scrollWidth - 30 && contentStyleOverflowX !== SCROLL)) { + this.pane2.hide(); + this.isActive2 = false; + } else if (this.el.clientWidth === content.scrollWidth && contentStyleOverflowX === SCROLL) { + this.slider2.hide(); + } else { + this.slider2.show(); + } + this.pane.css({ + opacity: (this.options.alwaysVisible ? 1 : ''), + visibility: (this.options.alwaysVisible ? 'visible' : '') + }); + this.pane2.css({ + opacity: (this.options.alwaysVisible ? 1 : ''), + visibility: (this.options.alwaysVisible ? 'visible' : '') + }); + return this; + }; + + /** + @method scroll + @private + @example + $(".nano").nanoScroller({ scroll: 'top' }); + */ + + + NanoScroll.prototype.scroll = function() { + if (!this.isActive && !this.isActive2) { + return; + } + + if (this.isActive) { + this.sliderY = Math.max(0, this.sliderY); + this.sliderY = Math.min(this.maxSliderTop, this.sliderY); + this.$content.scrollTop((this.paneHeight - this.contentHeight + BROWSER_SCROLLBAR_WIDTH) * this.sliderY / this.maxSliderTop * -1); + } + + if (this.isActive2) { + this.slider2X = Math.max(0, this.slider2X); + this.slider2X = Math.min(this.maxSlider2Left, this.slider2X); + this.$content.scrollLeft((this.pane2Width - this.contentWidth + BROWSER_SCROLLBAR_WIDTH) * this.slider2X / this.maxSlider2Left * -1); + } + if (!this.iOSNativeScrolling) { + + if (this.isActive) { + this.slider.css({ + top: this.sliderY + }); + } + if (this.isActive2) { + this.slider2.css({ + left: this.slider2X + }); + } + } + return this; + }; + + /** + Scroll at the bottom with an offset value + @method scrollBottom + @param offsetY {Number} + @chainable + @example + $(".nano").nanoScroller({ scrollBottom: value }); + */ + + + NanoScroll.prototype.scrollBottom = function(offsetY) { + if (!this.isActive && !this.isActive2) { + return; + } + this.reset(); + this.$content.scrollTop(this.contentHeight - this.$content.height() - offsetY).trigger(MOUSEWHEEL); + return this; + }; + + /** + Scroll at the top with an offset value + @method scrollTop + @param offsetY {Number} + @chainable + @example + $(".nano").nanoScroller({ scrollTop: value }); + */ + + + NanoScroll.prototype.scrollTop = function(offsetY) { + if (!this.isActive && !this.isActive2) { + return; + } + this.reset(); + this.$content.scrollTop(+offsetY).trigger(MOUSEWHEEL); + return this; + }; + + /** + Scroll to an element + @method scrollTo + @param node {Node} A node to scroll to. + @chainable + @example + $(".nano").nanoScroller({ scrollTo: $('#a_node') }); + */ + + + NanoScroll.prototype.scrollTo = function(node) { + if (!this.isActive && !this.isActive2) { + return; + } + this.reset(); + this.scrollTop($(node).get(0).offsetTop); + return this; + }; + + /** + To stop the operation. + This option will tell the plugin to disable all event bindings and hide the gadget scrollbar from the UI. + @method stop + @chainable + @example + $(".nano").nanoScroller({ stop: true }); + */ + + + NanoScroll.prototype.stop = function() { + this.stopped = true; + this.removeEvents(); + this.pane.hide(); + return this; + }; + + /** + To flash the scrollbar gadget for an amount of time defined in plugin settings (defaults to 1,5s). + Useful if you want to show the user (e.g. on pageload) that there is more content waiting for him. + @method flash + @chainable + @example + $(".nano").nanoScroller({ flash: true }); + */ + + + NanoScroll.prototype.flash = function() { + var _this = this; + if (!this.isActive && !this.isActive2) { + return; + } + this.reset(); + this.pane.addClass('flashed'); + setTimeout(function() { + _this.pane.removeClass('flashed'); + }, this.options.flashDelay); + return this; + }; + + return NanoScroll; + + })(); + $.fn.nanoScroller = function(settings) { + return this.each(function() { + var options, scrollbar; + if (!(scrollbar = this.nanoscroller)) { + options = $.extend({}, defaults, settings); + this.nanoscroller = scrollbar = new NanoScroll(this, options); + } + if (settings && typeof settings === "object") { + $.extend(scrollbar.options, settings); + if (settings.scrollBottom) { + return scrollbar.scrollBottom(settings.scrollBottom); + } + if (settings.scrollTop) { + return scrollbar.scrollTop(settings.scrollTop); + } + if (settings.scrollTo) { + return scrollbar.scrollTo(settings.scrollTo); + } + if (settings.scroll === 'bottom') { + return scrollbar.scrollBottom(0); + } + if (settings.scroll === 'top') { + return scrollbar.scrollTop(0); + } + if (settings.scroll && settings.scroll instanceof $) { + return scrollbar.scrollTo(settings.scroll); + } + if (settings.stop) { + return scrollbar.stop(); + } + if (settings.flash) { + return scrollbar.flash(); + } + } + return scrollbar.reset(); + }); + }; +})(jQuery, window, document); diff --git a/vendors/jquery-nanoscroller/jquery.nanoscroller.orig.js b/vendors/jquery-nanoscroller/jquery.nanoscroller.orig.js new file mode 100644 index 000000000..f41fb3895 --- /dev/null +++ b/vendors/jquery-nanoscroller/jquery.nanoscroller.orig.js @@ -0,0 +1,753 @@ +/*! nanoScrollerJS - v0.7 +* http://jamesflorentino.github.com/nanoScrollerJS/ +* Copyright (c) 2013 James Florentino; Licensed under MIT */ + + +(function($, window, document) { + "use strict"; + + var BROWSER_IS_IE7, BROWSER_SCROLLBAR_WIDTH, DOMSCROLL, DOWN, DRAG, KEYDOWN, KEYUP, MOUSEDOWN, MOUSEMOVE, MOUSEUP, MOUSEWHEEL, NanoScroll, PANEDOWN, RESIZE, SCROLL, SCROLLBAR, TOUCHMOVE, UP, WHEEL, defaults, getBrowserScrollbarWidth; + defaults = { + /** + a classname for the pane element. + @property paneClass + @type String + @default 'pane' + */ + + paneClass: 'pane', + /** + a classname for the slider element. + @property sliderClass + @type String + @default 'slider' + */ + + sliderClass: 'slider', + /** + a classname for the content element. + @property contentClass + @type String + @default 'content' + */ + + contentClass: 'content', + /** + a setting to enable native scrolling in iOS devices. + @property iOSNativeScrolling + @type Boolean + @default false + */ + + iOSNativeScrolling: false, + /** + a setting to prevent the rest of the page being + scrolled when user scrolls the `.content` element. + @property preventPageScrolling + @type Boolean + @default false + */ + + preventPageScrolling: false, + /** + a setting to disable binding to the resize event. + @property disableResize + @type Boolean + @default false + */ + + disableResize: false, + /** + a setting to make the scrollbar always visible. + @property alwaysVisible + @type Boolean + @default false + */ + + alwaysVisible: false, + /** + a default timeout for the `flash()` method. + @property flashDelay + @type Number + @default 1500 + */ + + flashDelay: 1500, + /** + a minimum height for the `.slider` element. + @property sliderMinHeight + @type Number + @default 20 + */ + + sliderMinHeight: 20, + /** + a maximum height for the `.slider` element. + @property sliderMaxHeight + @type Number + @default null + */ + + sliderMaxHeight: null + }; + /** + @property SCROLLBAR + @type String + @static + @final + @private + */ + + SCROLLBAR = 'scrollbar'; + /** + @property SCROLL + @type String + @static + @final + @private + */ + + SCROLL = 'scroll'; + /** + @property MOUSEDOWN + @type String + @final + @private + */ + + MOUSEDOWN = 'mousedown'; + /** + @property MOUSEMOVE + @type String + @static + @final + @private + */ + + MOUSEMOVE = 'mousemove'; + /** + @property MOUSEWHEEL + @type String + @final + @private + */ + + MOUSEWHEEL = 'mousewheel'; + /** + @property MOUSEUP + @type String + @static + @final + @private + */ + + MOUSEUP = 'mouseup'; + /** + @property RESIZE + @type String + @final + @private + */ + + RESIZE = 'resize'; + /** + @property DRAG + @type String + @static + @final + @private + */ + + DRAG = 'drag'; + /** + @property UP + @type String + @static + @final + @private + */ + + UP = 'up'; + /** + @property PANEDOWN + @type String + @static + @final + @private + */ + + PANEDOWN = 'panedown'; + /** + @property DOMSCROLL + @type String + @static + @final + @private + */ + + DOMSCROLL = 'DOMMouseScroll'; + /** + @property DOWN + @type String + @static + @final + @private + */ + + DOWN = 'down'; + /** + @property WHEEL + @type String + @static + @final + @private + */ + + WHEEL = 'wheel'; + /** + @property KEYDOWN + @type String + @static + @final + @private + */ + + KEYDOWN = 'keydown'; + /** + @property KEYUP + @type String + @static + @final + @private + */ + + KEYUP = 'keyup'; + /** + @property TOUCHMOVE + @type String + @static + @final + @private + */ + + TOUCHMOVE = 'touchmove'; + /** + @property BROWSER_IS_IE7 + @type Boolean + @static + @final + @private + */ + + BROWSER_IS_IE7 = window.navigator.appName === 'Microsoft Internet Explorer' && /msie 7./i.test(window.navigator.appVersion) && window.ActiveXObject; + /** + @property BROWSER_SCROLLBAR_WIDTH + @type Number + @static + @default null + @private + */ + + BROWSER_SCROLLBAR_WIDTH = null; + /** + Returns browser's native scrollbar width + @method getBrowserScrollbarWidth + @return {Number} the scrollbar width in pixels + @static + @private + */ + + getBrowserScrollbarWidth = function() { + var outer, outerStyle, scrollbarWidth; + outer = document.createElement('div'); + outerStyle = outer.style; + outerStyle.position = 'absolute'; + outerStyle.width = '100px'; + outerStyle.height = '100px'; + outerStyle.overflow = SCROLL; + outerStyle.top = '-9999px'; + document.body.appendChild(outer); + scrollbarWidth = outer.offsetWidth - outer.clientWidth; + document.body.removeChild(outer); + return scrollbarWidth; + }; + /** + @class NanoScroll + @param element {HTMLElement|Node} the main element + @param options {Object} nanoScroller's options + @constructor + */ + + NanoScroll = (function() { + + function NanoScroll(el, options) { + this.el = el; + this.options = options; + BROWSER_SCROLLBAR_WIDTH || (BROWSER_SCROLLBAR_WIDTH = getBrowserScrollbarWidth()); + this.$el = $(this.el); + this.doc = $(document); + this.win = $(window); + this.$content = this.$el.children("." + options.contentClass); + this.$content.attr('tabindex', 0); + this.content = this.$content[0]; + if (this.options.iOSNativeScrolling && (this.el.style.WebkitOverflowScrolling != null)) { + this.nativeScrolling(); + } else { + this.generate(); + } + this.createEvents(); + this.addEvents(); + this.reset(); + } + + /** + Prevents the rest of the page being scrolled + when user scrolls the `.content` element. + @method preventScrolling + @param event {Event} + @param direction {String} Scroll direction (up or down) + @private + */ + + + NanoScroll.prototype.preventScrolling = function(e, direction) { + if (!this.isActive) { + return; + } + if (e.type === DOMSCROLL) { + if (direction === DOWN && e.originalEvent.detail > 0 || direction === UP && e.originalEvent.detail < 0) { + e.preventDefault(); + } + } else if (e.type === MOUSEWHEEL) { + if (!e.originalEvent || !e.originalEvent.wheelDelta) { + return; + } + if (direction === DOWN && e.originalEvent.wheelDelta < 0 || direction === UP && e.originalEvent.wheelDelta > 0) { + e.preventDefault(); + } + } + }; + + /** + Enable iOS native scrolling + */ + + + NanoScroll.prototype.nativeScrolling = function() { + this.$content.css({ + WebkitOverflowScrolling: 'touch' + }); + this.iOSNativeScrolling = true; + this.isActive = true; + }; + + /** + Updates those nanoScroller properties that + are related to current scrollbar position. + @method updateScrollValues + @private + */ + + + NanoScroll.prototype.updateScrollValues = function() { + var content; + content = this.content; + this.maxScrollTop = content.scrollHeight - content.clientHeight; + this.contentScrollTop = content.scrollTop; + if (!this.iOSNativeScrolling) { + this.maxSliderTop = this.paneHeight - this.sliderHeight; + this.sliderTop = this.contentScrollTop * this.maxSliderTop / this.maxScrollTop; + } + }; + + /** + Creates event related methods + @method createEvents + @private + */ + + + NanoScroll.prototype.createEvents = function() { + var _this = this; + this.events = { + down: function(e) { + _this.isBeingDragged = true; + _this.offsetY = e.pageY - _this.slider.offset().top; + _this.pane.addClass('active'); + _this.doc.bind(MOUSEMOVE, _this.events[DRAG]).bind(MOUSEUP, _this.events[UP]); + return false; + }, + drag: function(e) { + _this.sliderY = e.pageY - _this.$el.offset().top - _this.offsetY; + _this.scroll(); + _this.updateScrollValues(); + if (_this.contentScrollTop >= _this.maxScrollTop) { + _this.$el.trigger('scrollend'); + } else if (_this.contentScrollTop === 0) { + _this.$el.trigger('scrolltop'); + } + return false; + }, + up: function(e) { + _this.isBeingDragged = false; + _this.pane.removeClass('active'); + _this.doc.unbind(MOUSEMOVE, _this.events[DRAG]).unbind(MOUSEUP, _this.events[UP]); + return false; + }, + resize: function(e) { + _this.reset(); + }, + panedown: function(e) { + _this.sliderY = (e.offsetY || e.originalEvent.layerY) - (_this.sliderHeight * 0.5); + _this.scroll(); + _this.events.down(e); + return false; + }, + scroll: function(e) { + if (_this.isBeingDragged) { + return; + } + _this.updateScrollValues(); + if (!_this.iOSNativeScrolling) { + _this.sliderY = _this.sliderTop; + _this.slider.css({ + top: _this.sliderTop + }); + } + if (e == null) { + return; + } + if (_this.contentScrollTop >= _this.maxScrollTop) { + if (_this.options.preventPageScrolling) { + _this.preventScrolling(e, DOWN); + } + _this.$el.trigger('scrollend'); + } else if (_this.contentScrollTop === 0) { + if (_this.options.preventPageScrolling) { + _this.preventScrolling(e, UP); + } + _this.$el.trigger('scrolltop'); + } + }, + wheel: function(e) { + if (e == null) { + return; + } + _this.sliderY += -e.wheelDeltaY || -e.delta; + _this.scroll(); + return false; + } + }; + }; + + /** + Adds event listeners with jQuery. + @method addEvents + @private + */ + + + NanoScroll.prototype.addEvents = function() { + var events; + this.removeEvents(); + events = this.events; + if (!this.options.disableResize) { + this.win.bind(RESIZE, events[RESIZE]); + } + if (!this.iOSNativeScrolling) { + this.slider.bind(MOUSEDOWN, events[DOWN]); + this.pane.bind(MOUSEDOWN, events[PANEDOWN]).bind("" + MOUSEWHEEL + " " + DOMSCROLL, events[WHEEL]); + } + this.$content.bind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]); + }; + + /** + Removes event listeners with jQuery. + @method removeEvents + @private + */ + + + NanoScroll.prototype.removeEvents = function() { + var events; + events = this.events; + this.win.unbind(RESIZE, events[RESIZE]); + if (!this.iOSNativeScrolling) { + this.slider.unbind(); + this.pane.unbind(); + } + this.$content.unbind("" + SCROLL + " " + MOUSEWHEEL + " " + DOMSCROLL + " " + TOUCHMOVE, events[SCROLL]); + }; + + /** + Generates nanoScroller's scrollbar and elements for it. + @method generate + @chainable + @private + */ + + + NanoScroll.prototype.generate = function() { + var contentClass, cssRule, options, paneClass, sliderClass; + options = this.options; + paneClass = options.paneClass, sliderClass = options.sliderClass, contentClass = options.contentClass; + if (!this.$el.find("" + paneClass).length && !this.$el.find("" + sliderClass).length) { + this.$el.append("
    "); + } + this.slider = this.$el.find("." + sliderClass); + this.pane = this.$el.find("." + paneClass); + if (BROWSER_SCROLLBAR_WIDTH) { + cssRule = this.$el.css('direction') === 'rtl' ? { + left: -BROWSER_SCROLLBAR_WIDTH + } : { + right: -BROWSER_SCROLLBAR_WIDTH, + bottom: -BROWSER_SCROLLBAR_WIDTH + }; + this.$el.addClass('has-scrollbar'); + } + if (cssRule != null) { + this.$content.css(cssRule); + } + return this; + }; + + /** + @method restore + @private + */ + + + NanoScroll.prototype.restore = function() { + this.stopped = false; + this.pane.show(); + this.addEvents(); + }; + + /** + Resets nanoScroller's scrollbar. + @method reset + @chainable + @example + $(".nano").nanoScroller(); + */ + + + NanoScroll.prototype.reset = function() { + var content, contentHeight, contentStyle, contentStyleOverflowY, paneBottom, paneHeight, paneOuterHeight, paneTop, sliderHeight; + if (this.iOSNativeScrolling) { + this.contentHeight = this.content.scrollHeight; + return; + } + if (!this.$el.find("." + this.options.paneClass).length) { + this.generate().stop(); + } + if (this.stopped) { + this.restore(); + } + content = this.content; + contentStyle = content.style; + contentStyleOverflowY = contentStyle.overflowY; + if (BROWSER_IS_IE7) { + this.$content.css({ + height: this.$content.height() + }); + } + contentHeight = content.scrollHeight + BROWSER_SCROLLBAR_WIDTH; + paneHeight = this.pane.outerHeight(); + paneTop = parseInt(this.pane.css('top'), 10); + paneBottom = parseInt(this.pane.css('bottom'), 10); + paneOuterHeight = paneHeight + paneTop + paneBottom; + sliderHeight = Math.round(paneOuterHeight / contentHeight * paneOuterHeight); + if (sliderHeight < this.options.sliderMinHeight) { + sliderHeight = this.options.sliderMinHeight; + } else if ((this.options.sliderMaxHeight != null) && sliderHeight > this.options.sliderMaxHeight) { + sliderHeight = this.options.sliderMaxHeight; + } + if (contentStyleOverflowY === SCROLL && contentStyle.overflowX !== SCROLL) { + sliderHeight += BROWSER_SCROLLBAR_WIDTH; + } + this.maxSliderTop = paneOuterHeight - sliderHeight; + this.contentHeight = contentHeight; + this.paneHeight = paneHeight; + this.paneOuterHeight = paneOuterHeight; + this.sliderHeight = sliderHeight; + this.slider.height(sliderHeight); + this.events.scroll(); + this.pane.show(); + this.isActive = true; + if ((content.scrollHeight === content.clientHeight) || (this.pane.outerHeight(true) >= content.scrollHeight && contentStyleOverflowY !== SCROLL)) { + this.pane.hide(); + this.isActive = false; + } else if (this.el.clientHeight === content.scrollHeight && contentStyleOverflowY === SCROLL) { + this.slider.hide(); + } else { + this.slider.show(); + } + this.pane.css({ + opacity: (this.options.alwaysVisible ? 1 : ''), + visibility: (this.options.alwaysVisible ? 'visible' : '') + }); + return this; + }; + + /** + @method scroll + @private + @example + $(".nano").nanoScroller({ scroll: 'top' }); + */ + + + NanoScroll.prototype.scroll = function() { + if (!this.isActive) { + return; + } + this.sliderY = Math.max(0, this.sliderY); + this.sliderY = Math.min(this.maxSliderTop, this.sliderY); + this.$content.scrollTop((this.paneHeight - this.contentHeight + BROWSER_SCROLLBAR_WIDTH) * this.sliderY / this.maxSliderTop * -1); + if (!this.iOSNativeScrolling) { + this.slider.css({ + top: this.sliderY + }); + } + return this; + }; + + /** + Scroll at the bottom with an offset value + @method scrollBottom + @param offsetY {Number} + @chainable + @example + $(".nano").nanoScroller({ scrollBottom: value }); + */ + + + NanoScroll.prototype.scrollBottom = function(offsetY) { + if (!this.isActive) { + return; + } + this.reset(); + this.$content.scrollTop(this.contentHeight - this.$content.height() - offsetY).trigger(MOUSEWHEEL); + return this; + }; + + /** + Scroll at the top with an offset value + @method scrollTop + @param offsetY {Number} + @chainable + @example + $(".nano").nanoScroller({ scrollTop: value }); + */ + + + NanoScroll.prototype.scrollTop = function(offsetY) { + if (!this.isActive) { + return; + } + this.reset(); + this.$content.scrollTop(+offsetY).trigger(MOUSEWHEEL); + return this; + }; + + /** + Scroll to an element + @method scrollTo + @param node {Node} A node to scroll to. + @chainable + @example + $(".nano").nanoScroller({ scrollTo: $('#a_node') }); + */ + + + NanoScroll.prototype.scrollTo = function(node) { + if (!this.isActive) { + return; + } + this.reset(); + this.scrollTop($(node).get(0).offsetTop); + return this; + }; + + /** + To stop the operation. + This option will tell the plugin to disable all event bindings and hide the gadget scrollbar from the UI. + @method stop + @chainable + @example + $(".nano").nanoScroller({ stop: true }); + */ + + + NanoScroll.prototype.stop = function() { + this.stopped = true; + this.removeEvents(); + this.pane.hide(); + return this; + }; + + /** + To flash the scrollbar gadget for an amount of time defined in plugin settings (defaults to 1,5s). + Useful if you want to show the user (e.g. on pageload) that there is more content waiting for him. + @method flash + @chainable + @example + $(".nano").nanoScroller({ flash: true }); + */ + + + NanoScroll.prototype.flash = function() { + var _this = this; + if (!this.isActive) { + return; + } + this.reset(); + this.pane.addClass('flashed'); + setTimeout(function() { + _this.pane.removeClass('flashed'); + }, this.options.flashDelay); + return this; + }; + + return NanoScroll; + + })(); + $.fn.nanoScroller = function(settings) { + return this.each(function() { + var options, scrollbar; + if (!(scrollbar = this.nanoscroller)) { + options = $.extend({}, defaults, settings); + this.nanoscroller = scrollbar = new NanoScroll(this, options); + } + if (settings && typeof settings === "object") { + $.extend(scrollbar.options, settings); + if (settings.scrollBottom) { + return scrollbar.scrollBottom(settings.scrollBottom); + } + if (settings.scrollTop) { + return scrollbar.scrollTop(settings.scrollTop); + } + if (settings.scrollTo) { + return scrollbar.scrollTo(settings.scrollTo); + } + if (settings.scroll === 'bottom') { + return scrollbar.scrollBottom(0); + } + if (settings.scroll === 'top') { + return scrollbar.scrollTop(0); + } + if (settings.scroll && settings.scroll instanceof $) { + return scrollbar.scrollTo(settings.scroll); + } + if (settings.stop) { + return scrollbar.stop(); + } + if (settings.flash) { + return scrollbar.flash(); + } + } + return scrollbar.reset(); + }); + }; +})(jQuery, window, document); diff --git a/vendors/jquery-nanoscroller/jquery.nanoscroller.orig.min.js b/vendors/jquery-nanoscroller/jquery.nanoscroller.orig.min.js new file mode 100644 index 000000000..4e683db59 --- /dev/null +++ b/vendors/jquery-nanoscroller/jquery.nanoscroller.orig.min.js @@ -0,0 +1,3 @@ +/*! nanoScrollerJS v0.7 (c) 2013 James Florentino; Licensed under MIT */ + +(function(e,t,n){"use strict";var r,i,s,o,u,a,f,l,c,h,p,d,v,m,g,y,b,w,E,S,x;S={paneClass:"pane",sliderClass:"slider",contentClass:"content",iOSNativeScrolling:!1,preventPageScrolling:!1,disableResize:!1,alwaysVisible:!1,flashDelay:1500,sliderMinHeight:20,sliderMaxHeight:null},y="scrollbar",g="scroll",l="mousedown",c="mousemove",p="mousewheel",h="mouseup",m="resize",u="drag",w="up",v="panedown",s="DOMMouseScroll",o="down",E="wheel",a="keydown",f="keyup",b="touchmove",r=t.navigator.appName==="Microsoft Internet Explorer"&&/msie 7./i.test(t.navigator.appVersion)&&t.ActiveXObject,i=null,x=function(){var e,t,r;return e=n.createElement("div"),t=e.style,t.position="absolute",t.width="100px",t.height="100px",t.overflow=g,t.top="-9999px",n.body.appendChild(e),r=e.offsetWidth-e.clientWidth,n.body.removeChild(e),r},d=function(){function a(r,s){this.el=r,this.options=s,i||(i=x()),this.$el=e(this.el),this.doc=e(n),this.win=e(t),this.$content=this.$el.children("."+s.contentClass),this.$content.attr("tabindex",0),this.content=this.$content[0],this.options.iOSNativeScrolling&&this.el.style.WebkitOverflowScrolling!=null?this.nativeScrolling():this.generate(),this.createEvents(),this.addEvents(),this.reset()}return a.prototype.preventScrolling=function(e,t){if(!this.isActive)return;if(e.type===s)(t===o&&e.originalEvent.detail>0||t===w&&e.originalEvent.detail<0)&&e.preventDefault();else if(e.type===p){if(!e.originalEvent||!e.originalEvent.wheelDelta)return;(t===o&&e.originalEvent.wheelDelta<0||t===w&&e.originalEvent.wheelDelta>0)&&e.preventDefault()}},a.prototype.nativeScrolling=function(){this.$content.css({WebkitOverflowScrolling:"touch"}),this.iOSNativeScrolling=!0,this.isActive=!0},a.prototype.updateScrollValues=function(){var e;e=this.content,this.maxScrollTop=e.scrollHeight-e.clientHeight,this.contentScrollTop=e.scrollTop,this.iOSNativeScrolling||(this.maxSliderTop=this.paneHeight-this.sliderHeight,this.sliderTop=this.contentScrollTop*this.maxSliderTop/this.maxScrollTop)},a.prototype.createEvents=function(){var e=this;this.events={down:function(t){return e.isBeingDragged=!0,e.offsetY=t.pageY-e.slider.offset().top,e.pane.addClass("active"),e.doc.bind(c,e.events[u]).bind(h,e.events[w]),!1},drag:function(t){return e.sliderY=t.pageY-e.$el.offset().top-e.offsetY,e.scroll(),e.updateScrollValues(),e.contentScrollTop>=e.maxScrollTop?e.$el.trigger("scrollend"):e.contentScrollTop===0&&e.$el.trigger("scrolltop"),!1},up:function(t){return e.isBeingDragged=!1,e.pane.removeClass("active"),e.doc.unbind(c,e.events[u]).unbind(h,e.events[w]),!1},resize:function(t){e.reset()},panedown:function(t){return e.sliderY=(t.offsetY||t.originalEvent.layerY)-e.sliderHeight*.5,e.scroll(),e.events.down(t),!1},scroll:function(t){if(e.isBeingDragged)return;e.updateScrollValues(),e.iOSNativeScrolling||(e.sliderY=e.sliderTop,e.slider.css({top:e.sliderTop}));if(t==null)return;e.contentScrollTop>=e.maxScrollTop?(e.options.preventPageScrolling&&e.preventScrolling(t,o),e.$el.trigger("scrollend")):e.contentScrollTop===0&&(e.options.preventPageScrolling&&e.preventScrolling(t,w),e.$el.trigger("scrolltop"))},wheel:function(t){if(t==null)return;return e.sliderY+=-t.wheelDeltaY||-t.delta,e.scroll(),!1}}},a.prototype.addEvents=function(){var e;this.removeEvents(),e=this.events,this.options.disableResize||this.win.bind(m,e[m]),this.iOSNativeScrolling||(this.slider.bind(l,e[o]),this.pane.bind(l,e[v]).bind(""+p+" "+s,e[E])),this.$content.bind(""+g+" "+p+" "+s+" "+b,e[g])},a.prototype.removeEvents=function(){var e;e=this.events,this.win.unbind(m,e[m]),this.iOSNativeScrolling||(this.slider.unbind(),this.pane.unbind()),this.$content.unbind(""+g+" "+p+" "+s+" "+b,e[g])},a.prototype.generate=function(){var e,t,n,r,s;return n=this.options,r=n.paneClass,s=n.sliderClass,e=n.contentClass,!this.$el.find(""+r).length&&!this.$el.find(""+s).length&&this.$el.append('
    '),this.slider=this.$el.find("."+s),this.pane=this.$el.find("."+r),i&&(t=this.$el.css("direction")==="rtl"?{left:-i}:{right:-i},this.$el.addClass("has-scrollbar")),t!=null&&this.$content.css(t),this},a.prototype.restore=function(){this.stopped=!1,this.pane.show(),this.addEvents()},a.prototype.reset=function(){var e,t,n,s,o,u,a,f,l;if(this.iOSNativeScrolling){this.contentHeight=this.content.scrollHeight;return}return this.$el.find("."+this.options.paneClass).length||this.generate().stop(),this.stopped&&this.restore(),e=this.content,n=e.style,s=n.overflowY,r&&this.$content.css({height:this.$content.height()}),t=e.scrollHeight+i,u=this.pane.outerHeight(),f=parseInt(this.pane.css("top"),10),o=parseInt(this.pane.css("bottom"),10),a=u+f+o,l=Math.round(a/t*a),lthis.options.sliderMaxHeight&&(l=this.options.sliderMaxHeight),s===g&&n.overflowX!==g&&(l+=i),this.maxSliderTop=a-l,this.contentHeight=t,this.paneHeight=u,this.paneOuterHeight=a,this.sliderHeight=l,this.slider.height(l),this.events.scroll(),this.pane.show(),this.isActive=!0,e.scrollHeight===e.clientHeight||this.pane.outerHeight(!0)>=e.scrollHeight&&s!==g?(this.pane.hide(),this.isActive=!1):this.el.clientHeight===e.scrollHeight&&s===g?this.slider.hide():this.slider.show(),this.pane.css({opacity:this.options.alwaysVisible?1:"",visibility:this.options.alwaysVisible?"visible":""}),this},a.prototype.scroll=function(){if(!this.isActive)return;return this.sliderY=Math.max(0,this.sliderY),this.sliderY=Math.min(this.maxSliderTop,this.sliderY),this.$content.scrollTop((this.paneHeight-this.contentHeight+i)*this.sliderY/this.maxSliderTop*-1),this.iOSNativeScrolling||this.slider.css({top:this.sliderY}),this},a.prototype.scrollBottom=function(e){if(!this.isActive)return;return this.reset(),this.$content.scrollTop(this.contentHeight-this.$content.height()-e).trigger(p),this},a.prototype.scrollTop=function(e){if(!this.isActive)return;return this.reset(),this.$content.scrollTop(+e).trigger(p),this},a.prototype.scrollTo=function(t){if(!this.isActive)return;return this.reset(),this.scrollTop(e(t).get(0).offsetTop),this},a.prototype.stop=function(){return this.stopped=!0,this.removeEvents(),this.pane.hide(),this},a.prototype.flash=function(){var e=this;if(!this.isActive)return;return this.reset(),this.pane.addClass("flashed"),setTimeout(function(){e.pane.removeClass("flashed")},this.options.flashDelay),this},a}(),e.fn.nanoScroller=function(t){return this.each(function(){var n,r;(r=this.nanoscroller)||(n=e.extend({},S,t),this.nanoscroller=r=new d(this,n));if(t&&typeof t=="object"){e.extend(r.options,t);if(t.scrollBottom)return r.scrollBottom(t.scrollBottom);if(t.scrollTop)return r.scrollTop(t.scrollTop);if(t.scrollTo)return r.scrollTo(t.scrollTo);if(t.scroll==="bottom")return r.scrollBottom(0);if(t.scroll==="top")return r.scrollTop(0);if(t.scroll&&t.scroll instanceof e)return r.scrollTo(t.scroll);if(t.stop)return r.stop();if(t.flash)return r.flash()}return r.reset()})}})(jQuery,window,document); \ No newline at end of file diff --git a/vendors/jquery-nanoscroller/nanoscroller.css b/vendors/jquery-nanoscroller/nanoscroller.css new file mode 100644 index 000000000..9267fa59b --- /dev/null +++ b/vendors/jquery-nanoscroller/nanoscroller.css @@ -0,0 +1,116 @@ +/** initial setup **/ +.nano { +/* + position : relative; + width : 100%; + height : 100%;*/ + overflow : hidden !important; +} + +.nano .content { + position : absolute; + overflow : scroll; + /*overflow-x : hidden;*/ + top : 0; + right : 0; + bottom : 0; + left : 0; + -webkit-overflow-scrolling: touch; +} + +.nano .content .content-wrapper { + height: 100%; +} + +.nano .content::-webkit-scrollbar { + visibility: hidden; +} +.has-scrollbar .content::-webkit-scrollbar { + /*visibility: visible;*/ + visibility: hidden; +} +.nano-visibility-hidden::-webkit-scrollbar { + visibility: hidden; +} + +.nano > .pane { + background : none; + position : absolute; + width : 5px; + right : 0; + top : 1px; + bottom : 1px; + opacity : .01; + filter: alpha(opacity=1); + -webkit-transition : .4s; + -moz-transition : .4s; + -o-transition : .4s; + transition : .4s; + -moz-border-radius : 5px; + -webkit-border-radius : 5px; + border-radius : 5px; + z-index: 10000; + margin : 2px; +} + +.nano > .pane2 { + background : none; + position : absolute; + height : 5px; + right : 1px; + left : 1px; + bottom : 0; + opacity : .01; + filter: alpha(opacity=1); + -webkit-transition : .4s; + -moz-transition : .4s; + -o-transition : .4s; + transition : .4s; + -moz-border-radius : 5px; + -webkit-border-radius : 5px; + border-radius : 5px; + z-index: 10000; + margin : 2px; +} + +.nano > .pane > .slider { + background-color: #999; + background-color: rgba(0, 0, 0, 0.3); + position : relative; + margin : 0; + -moz-border-radius : 3px; + -webkit-border-radius : 3px; + border-radius : 3px; + width : 5px; +} + +.nano > .pane2 > .slider2 { + background-color: #999; + background-color: rgba(0, 0, 0, 0.3); + position : relative; + margin : 0; + -moz-border-radius : 3px; + -webkit-border-radius : 3px; + border-radius : 3px; + height : 5px; +} + +.nano:hover > .pane, .nano:hover > .pane2, .pane.active, .pane2.active, .pane.flashed, .pane2.flashed { + visibility : visible\9; /* Target only IE7 and IE8 with this hack */ + opacity : 0.99; + filter: alpha(opacity=99); +} + +.nano > .pane:hover, .nano > .pane.active { + background-color: rgba(0, 0, 0, 0.15); +} +.nano > .pane2:hover, .nano > .pane2.active { + background-color: rgba(0, 0, 0, 0.15); +} + +.nano > .pane:hover > .slider, .nano > .pane.active > .slider { + background-color: rgba(0, 0, 0, 0.4); +} +.nano > .pane2:hover > .slider2, .nano > .pane2.active > .slider2 { + background-color: rgba(0, 0, 0, 0.4); +} diff --git a/vendors/jquery-scrollstop/jquery.scrollstop.js b/vendors/jquery-scrollstop/jquery.scrollstop.js new file mode 100644 index 000000000..a0bb63710 --- /dev/null +++ b/vendors/jquery-scrollstop/jquery.scrollstop.js @@ -0,0 +1,72 @@ +/* http://james.padolsey.com/javascript/special-scroll-events-for-jquery/ */ + +(function(){ + + var special = jQuery.event.special, + uid1 = "D" + (+new Date()), + uid2 = "D" + (+new Date() + 1); + + special.scrollstart = { + setup: function() { + + var timer, + handler = function(evt) { + + var _self = this, + _args = arguments; + + if (timer) { + clearTimeout(timer); + } else { + evt.type = "scrollstart"; + jQuery.event.dispatch.apply(_self, _args); + } + + timer = setTimeout( function(){ + timer = null; + }, special.scrollstop.latency); + + }; + + jQuery(this).bind("scroll", handler).data(uid1, handler); + + }, + teardown: function(){ + jQuery(this).unbind( "scroll", jQuery(this).data(uid1) ); + } + }; + + special.scrollstop = { + latency: 300, + setup: function() { + + var timer, + handler = function(evt) { + + var _self = this, + _args = arguments; + + if (timer) { + clearTimeout(timer); + } + + timer = setTimeout( function(){ + + timer = null; + evt.type = "scrollstop"; + jQuery.event.dispatch.apply(_self, _args); + + + }, special.scrollstop.latency); + + }; + + jQuery(this).bind("scroll", handler).data(uid2, handler); + + }, + teardown: function() { + jQuery(this).unbind( "scroll", jQuery(this).data(uid2) ); + } + }; + +})(); \ No newline at end of file diff --git a/vendors/jquery-scrollstop/jquery.scrollstop.min.js b/vendors/jquery-scrollstop/jquery.scrollstop.min.js new file mode 100644 index 000000000..5c4162ed9 --- /dev/null +++ b/vendors/jquery-scrollstop/jquery.scrollstop.min.js @@ -0,0 +1,2 @@ +/* http://james.padolsey.com/javascript/special-scroll-events-for-jquery/ */ +!function(){var a=jQuery.event.special,b="D"+ +new Date,c="D"+(+new Date+1);a.scrollstart={setup:function(){var c,d=function(b){var d=this,e=arguments;c?clearTimeout(c):(b.type="scrollstart",jQuery.event.dispatch.apply(d,e)),c=setTimeout(function(){c=null},a.scrollstop.latency)};jQuery(this).bind("scroll",d).data(b,d)},teardown:function(){jQuery(this).unbind("scroll",jQuery(this).data(b))}},a.scrollstop={latency:300,setup:function(){var b,d=function(c){var d=this,e=arguments;b&&clearTimeout(b),b=setTimeout(function(){b=null,c.type="scrollstop",jQuery.event.dispatch.apply(d,e)},a.scrollstop.latency)};jQuery(this).bind("scroll",d).data(c,d)},teardown:function(){jQuery(this).unbind("scroll",jQuery(this).data(c))}}}(); \ No newline at end of file diff --git a/vendors/jquery-ui/AUTHORS.txt b/vendors/jquery-ui/AUTHORS.txt new file mode 100644 index 000000000..fae527dae --- /dev/null +++ b/vendors/jquery-ui/AUTHORS.txt @@ -0,0 +1,245 @@ +Authors ordered by first contribution +A list of current team members is available at http://jqueryui.com/about + +Paul Bakaus +Richard Worth +Yehuda Katz +Sean Catchpole +John Resig +Tane Piper +Dmitri Gaskin +Klaus Hartl +Stefan Petre +Gilles van den Hoven +Micheil Bryan Smith +Jörn Zaefferer +Marc Grabanski +Keith Wood +Brandon Aaron +Scott González +Eduardo Lundgren +Aaron Eisenberger +Joan Piedra +Bruno Basto +Remy Sharp +Bohdan Ganicky +David Bolter +Chi Cheng +Ca-Phun Ung +Ariel Flesler +Maggie Costello Wachs +Scott Jehl +Todd Parker +Andrew Powell +Brant Burnett +Douglas Neiner +Paul Irish +Ralph Whitbeck +Thibault Duplessis +Dominique Vincent +Jack Hsu +Adam Sontag +Carl Fürstenberg +Kevin Dalman +Alberto Fernández Capel +Jacek Jędrzejewski (http://jacek.jedrzejewski.name) +Ting Kuei +Samuel Cormier-Iijima +Jon Palmer +Ben Hollis +Justin MacCarthy +Eyal Kobrigo +Tiago Freire +Diego Tres +Holger Rüprich +Ziling Zhao +Mike Alsup +Robson Braga Araujo +Pierre-Henri Ausseil +Christopher McCulloh +Andrew Newcomb +Lim Chee Aun +Jorge Barreiro +Daniel Steigerwald +John Firebaugh +John Enters +Andrey Kapitcyn +Dmitry Petrov +Eric Hynds +Chairat Sunthornwiphat +Josh Varner +Stéphane Raimbault +Jay Merrifield +J. Ryan Stinnett +Peter Heiberg +Alex Dovenmuehle +Jamie Gegerson +Raymond Schwartz +Phillip Barnes +Kyle Wilkinson +Khaled AlHourani +Marian Rudzynski +Jean-Francois Remy +Doug Blood +Filippo Cavallarin +Heiko Henning +Aliaksandr Rahalevich +Mario Visic +Xavi Ramirez +Max Schnur +Saji Nediyanchath +Corey Frang +Aaron Peterson +Ivan Peters +Mohamed Cherif Bouchelaghem +Marcos Sousa +Michael DellaNoce +George Marshall +Tobias Brunner +Martin Solli +David Petersen +Dan Heberden +William Kevin Manire +Gilmore Davidson +Michael Wu +Adam Parod +Guillaume Gautreau +Marcel Toele +Dan Streetman +Matt Hoskins +Giovanni Giacobbi +Kyle Florence +Pavol Hluchý +Hans Hillen +Mark Johnson +Trey Hunner +Shane Whittet +Edward A Faulkner +Adam Baratz +Kato Kazuyoshi +Eike Send +Kris Borchers +Eddie Monge +Israel Tsadok +Carson McDonald +Jason Davies +Garrison Locke +David Murdoch +Benjamin Scott Boyle +Jesse Baird +Jonathan Vingiano +Dylan Just +Hiroshi Tomita +Glenn Goodrich +Tarafder Ashek-E-Elahi +Ryan Neufeld +Marc Neuwirth +Philip Graham +Benjamin Sterling +Wesley Walser +Kouhei Sutou +Karl Kirch +Chris Kelly +Jay Oster +Alexander Polomoshnov +David Leal +Igor Milla +Dave Methvin +Florian Gutmann +Marwan Al Jubeh +Milan Broum +Sebastian Sauer +Gaëtan Muller +Michel Weimerskirch +William Griffiths +Stojce Slavkovski +David Soms +David De Sloovere +Michael P. Jung +Shannon Pekary +Matthew Edward Hutton +James Khoury +Rob Loach +Alberto Monteiro +Alex Rhea +Krzysztof Rosiński +Ryan Olton +Genie <386@mail.com> +Rick Waldron +Ian Simpson +Lev Kitsis +TJ VanToll +Justin Domnitz +Douglas Cerna +Bert ter Heide +Jasvir Nagra +Petr Hromadko +Harri Kilpiö +Lado Lomidze +Amir E. Aharoni +Simon Sattes +Jo Liss +Guntupalli Karunakar +Shahyar Ghobadpour +Lukasz Lipinski +Timo Tijhof +Jason Moon +Martin Frost +Eneko Illarramendi +EungJun Yi +Courtland Allen +Viktar Varvanovich +Danny Trunk +Pavel Stetina +Michael Stay +Steven Roussey +Michael Hollis +Lee Rowlands +Timmy Willison +Karl Swedberg +Baoju Yuan +Maciej Mroziński +Luis Dalmolin +Mark Aaron Shirley +Martin Hoch +Jiayi Yang +Philipp Benjamin Köppchen +Sindre Sorhus +Bernhard Sirlinger +Jared A. Scheel +Rafael Xavier de Souza +John Chen +Dale Kocian +Mike Sherov +Andrew Couch +Marc-Andre Lafortune +Nate Eagle +David Souther +Mathias Stenbom +Sergey Kartashov +Avinash R +Ethan Romba +Cory Gackenheimer +Juan Pablo Kaniefsky +Roman Salnikov +Anika Henke +Samuel Bovée +Fabrício Matté +Viktor Kojouharov +Pawel Maruszczyk +Pavel Selitskas +Bjørn Johansen +Matthieu Penant +Dominic Barnes +David Sullivan +Thomas Jaggi +Vahid Sohrabloo +Travis Carden +Bruno M. Custódio +Nathanael Silverman +Christian Wenz +Steve Urmston +Zaven Muradyan +Woody Gilk +Zbigniew Motyka +Suhail Alkowaileet diff --git a/vendors/jquery-ui/MIT-LICENSE.txt b/vendors/jquery-ui/MIT-LICENSE.txt new file mode 100644 index 000000000..1c693e3d4 --- /dev/null +++ b/vendors/jquery-ui/MIT-LICENSE.txt @@ -0,0 +1,26 @@ +Copyright 2013 jQuery Foundation and other contributors, +http://jqueryui.com/ + +This software consists of voluntary contributions made by many +individuals (AUTHORS.txt, http://jqueryui.com/about) For exact +contribution history, see the revision history and logs, available +at http://jquery-ui.googlecode.com/svn/ + +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. diff --git a/vendors/jquery-ui/README.md b/vendors/jquery-ui/README.md new file mode 100644 index 000000000..e7ae90e8a --- /dev/null +++ b/vendors/jquery-ui/README.md @@ -0,0 +1,99 @@ +[jQuery UI](http://jqueryui.com/) - Interactions and Widgets for the web +================================ + +jQuery UI provides interactions like Drag and Drop and widgets like Autocomplete, Tabs and Slider and makes these as easy to use as jQuery itself. + +If you want to use jQuery UI, go to [jqueryui.com](http://jqueryui.com) to get started. Or visit the [Using jQuery UI Forum](http://forum.jquery.com/using-jquery-ui) for discussions and questions. + +If you are interested in helping develop jQuery UI, you are in the right place. +To discuss development with team members and the community, visit the [Developing jQuery UI Forum](http://forum.jquery.com/developing-jquery-ui) or in #jquery on irc.freednode.net. + + +For contributors +--- + +If you want to help and provide a patch for a bugfix or new feature, please take +a few minutes and look at [our Getting Involved guide](http://wiki.jqueryui.com/w/page/35263114/Getting-Involved). +In particular check out the [Coding standards](http://wiki.jqueryui.com/w/page/12137737/Coding-standards) +and [Commit Message Style Guide](http://wiki.jqueryui.com/w/page/25941597/Commit-Message-Style-Guide). + +In general, fork the project, create a branch for a specific change and send a +pull request for that branch. Don't mix unrelated changes. You can use the commit +message as the description for the pull request. + + +Running the Unit Tests +--- + +Run the unit tests with a local server that supports PHP. No database is required. Pre-configured php local servers are available for Windows and Mac. Here are some options: + +- Windows: [WAMP download](http://www.wampserver.com/en/) +- Mac: [MAMP download](http://www.mamp.info/en/index.html) +- Linux: [Setting up LAMP](https://www.linux.com/learn/tutorials/288158-easy-lamp-server-installation) +- [Mongoose (most platforms)](http://code.google.com/p/mongoose/) + + +Building jQuery UI +--- + +jQuery UI uses the [grunt](http://github.com/cowboy/grunt) build system. Building jQuery UI requires node.js and a command line zip program. + +Install grunt. + +`npm install grunt -g` + +Clone the jQuery UI git repo. + +`git clone git://github.com/jquery/jquery-ui.git` + +`cd jquery-ui` + +Install node modules. + +`npm install` + +Run grunt. + +`grunt build` + +There are many other tasks that can be run through grunt. For a list of all tasks: + +`grunt --help` + + +For committers +--- + +When looking at pull requests, first check for [proper commit messages](http://wiki.jqueryui.com/w/page/12137724/Bug-Fixing-Guide). + +Do not merge pull requests directly through GitHub's interface. +Most pull requests are a single commit; cherry-picking will avoid creating a merge commit. +It's also common for contributors to make minor fixes in an additional one or two commits. +These should be squashed before landing in master. + +**Make sure the author has a valid name and email address associated with the commit.** + +Fetch the remote first: + + git fetch [their-fork.git] [their-branch] + +Then cherry-pick the commit(s): + + git cherry-pick [sha-of-commit] + +If you need to edit the commit message: + + git cherry-pick -e [sha-of-commit] + +If you need to edit the changes: + + git cherry-pick -n [sha-of-commit] + # make changes + git commit --author="[author-name-and-email]" + +If it should go to the stable brach, cherry-pick it to stable: + + git checkout 1-8-stable + git cherry-pick -x [sha-of-commit-from-master] + +*NOTE: Do not cherry-pick into 1-8-stable until you have pushed the commit from master upstream.* diff --git a/vendors/jquery-ui/css/no-theme/jquery-ui-1.10.3.custom.css b/vendors/jquery-ui/css/no-theme/jquery-ui-1.10.3.custom.css new file mode 100644 index 000000000..9d96113e1 --- /dev/null +++ b/vendors/jquery-ui/css/no-theme/jquery-ui-1.10.3.custom.css @@ -0,0 +1,155 @@ +/*! jQuery UI - v1.10.3 - 2013-11-02 +* http://jqueryui.com +* Includes: jquery.ui.core.css, jquery.ui.resizable.css +* Copyright 2013 jQuery Foundation and other contributors; Licensed under MIT */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-clearfix { + min-height: 0; /* support: IE7 */ +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; +} + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} diff --git a/vendors/jquery-ui/css/no-theme/jquery-ui-1.10.3.custom.min.css b/vendors/jquery-ui/css/no-theme/jquery-ui-1.10.3.custom.min.css new file mode 100644 index 000000000..8b1eb791d --- /dev/null +++ b/vendors/jquery-ui/css/no-theme/jquery-ui-1.10.3.custom.min.css @@ -0,0 +1,6 @@ +/*! jQuery UI - v1.10.3 - 2013-11-02 +* http://jqueryui.com +* Includes: jquery.ui.core.css, jquery.ui.resizable.css +* Copyright 2013 jQuery Foundation and other contributors; Licensed under MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px} \ No newline at end of file diff --git a/vendors/jquery-ui/js/jquery-ui-1.10.3.custom.js b/vendors/jquery-ui/js/jquery-ui-1.10.3.custom.js new file mode 100644 index 000000000..c78a401a8 --- /dev/null +++ b/vendors/jquery-ui/js/jquery-ui-1.10.3.custom.js @@ -0,0 +1,3234 @@ +/*! jQuery UI - v1.10.3 - 2013-11-02 +* http://jqueryui.com +* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js +* Copyright 2013 jQuery Foundation and other contributors; Licensed under MIT */ + +(function( $, undefined ) { + +var uuid = 0, + runiqueId = /^ui-id-\d+$/; + +// $.ui might exist from components with no dependencies, e.g., $.ui.position +$.ui = $.ui || {}; + +$.extend( $.ui, { + version: "1.10.3", + + keyCode: { + BACKSPACE: 8, + COMMA: 188, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + LEFT: 37, + NUMPAD_ADD: 107, + NUMPAD_DECIMAL: 110, + NUMPAD_DIVIDE: 111, + NUMPAD_ENTER: 108, + NUMPAD_MULTIPLY: 106, + NUMPAD_SUBTRACT: 109, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SPACE: 32, + TAB: 9, + UP: 38 + } +}); + +// plugins +$.fn.extend({ + focus: (function( orig ) { + return function( delay, fn ) { + return typeof delay === "number" ? + this.each(function() { + var elem = this; + setTimeout(function() { + $( elem ).focus(); + if ( fn ) { + fn.call( elem ); + } + }, delay ); + }) : + orig.apply( this, arguments ); + }; + })( $.fn.focus ), + + scrollParent: function() { + var scrollParent; + if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) { + scrollParent = this.parents().filter(function() { + return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x")); + }).eq(0); + } else { + scrollParent = this.parents().filter(function() { + return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x")); + }).eq(0); + } + + return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent; + }, + + zIndex: function( zIndex ) { + if ( zIndex !== undefined ) { + return this.css( "zIndex", zIndex ); + } + + if ( this.length ) { + var elem = $( this[ 0 ] ), position, value; + while ( elem.length && elem[ 0 ] !== document ) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css( "position" ); + if ( position === "absolute" || position === "relative" || position === "fixed" ) { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + //
    + value = parseInt( elem.css( "zIndex" ), 10 ); + if ( !isNaN( value ) && value !== 0 ) { + return value; + } + } + elem = elem.parent(); + } + } + + return 0; + }, + + uniqueId: function() { + return this.each(function() { + if ( !this.id ) { + this.id = "ui-id-" + (++uuid); + } + }); + }, + + removeUniqueId: function() { + return this.each(function() { + if ( runiqueId.test( this.id ) ) { + $( this ).removeAttr( "id" ); + } + }); + } +}); + +// selectors +function focusable( element, isTabIndexNotNaN ) { + var map, mapName, img, + nodeName = element.nodeName.toLowerCase(); + if ( "area" === nodeName ) { + map = element.parentNode; + mapName = map.name; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap=#" + mapName + "]" )[0]; + return !!img && visible( img ); + } + return ( /input|select|textarea|button|object/.test( nodeName ) ? + !element.disabled : + "a" === nodeName ? + element.href || isTabIndexNotNaN : + isTabIndexNotNaN) && + // the element and all of its ancestors must be visible + visible( element ); +} + +function visible( element ) { + return $.expr.filters.visible( element ) && + !$( element ).parents().addBack().filter(function() { + return $.css( this, "visibility" ) === "hidden"; + }).length; +} + +$.extend( $.expr[ ":" ], { + data: $.expr.createPseudo ? + $.expr.createPseudo(function( dataName ) { + return function( elem ) { + return !!$.data( elem, dataName ); + }; + }) : + // support: jQuery <1.8 + function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + }, + + focusable: function( element ) { + return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); + }, + + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ), + isTabIndexNaN = isNaN( tabIndex ); + return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); + } +}); + +// support: jQuery <1.8 +if ( !$( "" ).outerWidth( 1 ).jquery ) { + $.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; + if ( border ) { + size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; + } + }); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each(function() { + $( this ).css( type, reduce( this, size ) + "px" ); + }); + }; + + $.fn[ "outer" + name] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each(function() { + $( this).css( type, reduce( this, size, true, margin ) + "px" ); + }); + }; + }); +} + +// support: jQuery <1.8 +if ( !$.fn.addBack ) { + $.fn.addBack = function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + }; +} + +// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) +if ( $( "" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { + $.fn.removeData = (function( removeData ) { + return function( key ) { + if ( arguments.length ) { + return removeData.call( this, $.camelCase( key ) ); + } else { + return removeData.call( this ); + } + }; + })( $.fn.removeData ); +} + + + + + +// deprecated +$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); + +$.support.selectstart = "onselectstart" in document.createElement( "div" ); +$.fn.extend({ + disableSelection: function() { + return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) + + ".ui-disableSelection", function( event ) { + event.preventDefault(); + }); + }, + + enableSelection: function() { + return this.unbind( ".ui-disableSelection" ); + } +}); + +$.extend( $.ui, { + // $.ui.plugin is deprecated. Use $.widget() extensions instead. + plugin: { + add: function( module, option, set ) { + var i, + proto = $.ui[ module ].prototype; + for ( i in set ) { + proto.plugins[ i ] = proto.plugins[ i ] || []; + proto.plugins[ i ].push( [ option, set[ i ] ] ); + } + }, + call: function( instance, name, args ) { + var i, + set = instance.plugins[ name ]; + if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) { + return; + } + + for ( i = 0; i < set.length; i++ ) { + if ( instance.options[ set[ i ][ 0 ] ] ) { + set[ i ][ 1 ].apply( instance.element, args ); + } + } + } + }, + + // only used by resizable + hasScroll: function( el, a ) { + + //If overflow is hidden, the element might have extra content, but the user wants to hide it + if ( $( el ).css( "overflow" ) === "hidden") { + return false; + } + + var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop", + has = false; + + if ( el[ scroll ] > 0 ) { + return true; + } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[ scroll ] = 1; + has = ( el[ scroll ] > 0 ); + el[ scroll ] = 0; + return has; + } +}); + +})( jQuery ); +(function( $, undefined ) { + +var uuid = 0, + slice = Array.prototype.slice, + _cleanData = $.cleanData; +$.cleanData = function( elems ) { + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + try { + $( elem ).triggerHandler( "remove" ); + // http://bugs.jquery.com/ticket/8235 + } catch( e ) {} + } + _cleanData( elems ); +}; + +$.widget = function( name, base, prototype ) { + var fullName, existingConstructor, constructor, basePrototype, + // proxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + proxiedPrototype = {}, + namespace = name.split( "." )[ 0 ]; + + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + // extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + // copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + // track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + }); + + basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = (function() { + var _super = function() { + return base.prototype[ prop ].apply( this, arguments ); + }, + _superApply = function( args ) { + return base.prototype[ prop ].apply( this, args ); + }; + return function() { + var __super = this._super, + __superApply = this._superApply, + returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + })(); + }); + constructor.prototype = $.widget.extend( basePrototype, { + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + }); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); + }); + // remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); +}; + +$.widget.extend = function( target ) { + var input = slice.call( arguments, 1 ), + inputIndex = 0, + inputLength = input.length, + key, + value; + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.widget.extend.apply( null, [ options ].concat(args) ) : + options; + + if ( isMethodCall ) { + this.each(function() { + var methodValue, + instance = $.data( this, fullName ); + if ( !instance ) { + return $.error( "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + " widget instance" ); + } + methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} )._init(); + } else { + $.data( this, fullName, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "
    ", + options: { + disabled: false, + + // callbacks + create: null + }, + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = uuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + }); + this.document = $( element.style ? + // element within the document + element.ownerDocument : + // element is window or document + element.document || element ); + this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); + } + + this._create(); + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + _getCreateOptions: $.noop, + _getCreateEventData: $.noop, + _create: $.noop, + _init: $.noop, + + destroy: function() { + this._destroy(); + // we can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .unbind( this.eventNamespace ) + // 1.9 BC for #7810 + // TODO remove dual storage + .removeData( this.widgetName ) + .removeData( this.widgetFullName ) + // support: jquery <1.6.3 + // http://bugs.jquery.com/ticket/9413 + .removeData( $.camelCase( this.widgetFullName ) ); + this.widget() + .unbind( this.eventNamespace ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetFullName + "-disabled " + + "ui-state-disabled" ); + + // clean up events and states + this.bindings.unbind( this.eventNamespace ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + }, + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key, + parts, + curOption, + i; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( value === undefined ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( value === undefined ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value ) + .attr( "aria-disabled", value ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + } + + return this; + }, + + enable: function() { + return this._setOption( "disabled", false ); + }, + disable: function() { + return this._setOption( "disabled", true ); + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement, + instance = this; + + // no suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // no element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + // accept selectors, DOM elements + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + // allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^(\w+)\s*(.*)$/ ), + eventName = match[1] + instance.eventNamespace, + selector = match[2]; + if ( selector ) { + delegateElement.delegate( selector, eventName, handlerProxy ); + } else { + element.bind( eventName, handlerProxy ); + } + }); + }, + + _off: function( element, eventName ) { + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace; + element.unbind( eventName ).undelegate( eventName ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + $( event.currentTarget ).addClass( "ui-state-hover" ); + }, + mouseleave: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-hover" ); + } + }); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + $( event.currentTarget ).addClass( "ui-state-focus" ); + }, + focusout: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-focus" ); + } + }); + }, + + _trigger: function( type, event, data ) { + var prop, orig, + callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + // the original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[0], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + var hasOptions, + effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + if ( options.delay ) { + element.delay( options.delay ); + } + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue(function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + }); + } + }; +}); + +})( jQuery ); +(function( $, undefined ) { + +var mouseHandled = false; +$( document ).mouseup( function() { + mouseHandled = false; +}); + +$.widget("ui.mouse", { + version: "1.10.3", + options: { + cancel: "input,textarea,button,select,option", + distance: 1, + delay: 0 + }, + _mouseInit: function() { + var that = this; + + this.element + .bind("mousedown."+this.widgetName, function(event) { + return that._mouseDown(event); + }) + .bind("click."+this.widgetName, function(event) { + if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { + $.removeData(event.target, that.widgetName + ".preventClickEvent"); + event.stopImmediatePropagation(); + return false; + } + }); + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.unbind("."+this.widgetName); + if ( this._mouseMoveDelegate ) { + $(document) + .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate) + .unbind("mouseup."+this.widgetName, this._mouseUpDelegate); + } + }, + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + if( mouseHandled ) { return; } + + // we may have missed mouseup (out of window) + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + + var that = this, + btnIsLeft = (event.which === 1), + // event.target.nodeName works around a bug in IE 8 with + // disabled inputs (#7620) + elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + that.mouseDelayMet = true; + }, this.options.delay); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); + if (!this._mouseStarted) { + event.preventDefault(); + return true; + } + } + + // Click event may never have fired (Gecko & Opera) + if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { + $.removeData(event.target, this.widgetName + ".preventClickEvent"); + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(event) { + return that._mouseMove(event); + }; + this._mouseUpDelegate = function(event) { + return that._mouseUp(event); + }; + $(document) + .bind("mousemove."+this.widgetName, this._mouseMoveDelegate) + .bind("mouseup."+this.widgetName, this._mouseUpDelegate); + + event.preventDefault(); + + mouseHandled = true; + return true; + }, + + _mouseMove: function(event) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) { + return this._mouseUp(event); + } + + if (this._mouseStarted) { + this._mouseDrag(event); + return event.preventDefault(); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); + } + + return !this._mouseStarted; + }, + + _mouseUp: function(event) { + $(document) + .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate) + .unbind("mouseup."+this.widgetName, this._mouseUpDelegate); + + if (this._mouseStarted) { + this._mouseStarted = false; + + if (event.target === this._mouseDownEvent.target) { + $.data(event.target, this.widgetName + ".preventClickEvent", true); + } + + this._mouseStop(event); + } + + return false; + }, + + _mouseDistanceMet: function(event) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function(/* event */) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function(/* event */) {}, + _mouseDrag: function(/* event */) {}, + _mouseStop: function(/* event */) {}, + _mouseCapture: function(/* event */) { return true; } +}); + +})(jQuery); +(function( $, undefined ) { + +$.widget("ui.draggable", $.ui.mouse, { + version: "1.10.3", + widgetEventPrefix: "drag", + options: { + addClasses: true, + appendTo: "parent", + axis: false, + connectToSortable: false, + containment: false, + cursor: "auto", + cursorAt: false, + grid: false, + handle: false, + helper: "original", + iframeFix: false, + opacity: false, + refreshPositions: false, + revert: false, + revertDuration: 500, + scope: "default", + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + snap: false, + snapMode: "both", + snapTolerance: 20, + stack: false, + zIndex: false, + + // callbacks + drag: null, + start: null, + stop: null + }, + _create: function() { + + if (this.options.helper === "original" && !(/^(?:r|a|f)/).test(this.element.css("position"))) { + this.element[0].style.position = "relative"; + } + if (this.options.addClasses){ + this.element.addClass("ui-draggable"); + } + if (this.options.disabled){ + this.element.addClass("ui-draggable-disabled"); + } + + this._mouseInit(); + + }, + + _destroy: function() { + this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" ); + this._mouseDestroy(); + }, + + _mouseCapture: function(event) { + + var o = this.options; + + // among others, prevent a drag on a resizable-handle + if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) { + return false; + } + + //Quit if we're not on a valid handle + this.handle = this._getHandle(event); + if (!this.handle) { + return false; + } + + $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() { + $("
    ") + .css({ + width: this.offsetWidth+"px", height: this.offsetHeight+"px", + position: "absolute", opacity: "0.001", zIndex: 1000 + }) + .css($(this).offset()) + .appendTo("body"); + }); + + return true; + + }, + + _mouseStart: function(event) { + + var o = this.options; + + //Create and append the visible helper + this.helper = this._createHelper(event); + + this.helper.addClass("ui-draggable-dragging"); + + //Cache the helper size + this._cacheHelperProportions(); + + //If ddmanager is used for droppables, set the global draggable + if($.ui.ddmanager) { + $.ui.ddmanager.current = this; + } + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins(); + + //Store the helper's css position + this.cssPosition = this.helper.css( "position" ); + this.scrollParent = this.helper.scrollParent(); + this.offsetParent = this.helper.offsetParent(); + this.offsetParentCssPosition = this.offsetParent.css( "position" ); + + //The element's absolute position on the page minus margins + this.offset = this.positionAbs = this.element.offset(); + this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + //Reset scroll cache + this.offset.scroll = false; + + $.extend(this.offset, { + click: { //Where the click happened, relative to the element + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper + }); + + //Generate the original position + this.originalPosition = this.position = this._generatePosition(event); + this.originalPageX = event.pageX; + this.originalPageY = event.pageY; + + //Adjust the mouse offset relative to the helper if "cursorAt" is supplied + (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); + + //Set a containment if given in the options + this._setContainment(); + + //Trigger event + callbacks + if(this._trigger("start", event) === false) { + this._clear(); + return false; + } + + //Recache the helper size + this._cacheHelperProportions(); + + //Prepare the droppable offsets + if ($.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(this, event); + } + + + this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position + + //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003) + if ( $.ui.ddmanager ) { + $.ui.ddmanager.dragStart(this, event); + } + + return true; + }, + + _mouseDrag: function(event, noPropagation) { + // reset any necessary cached properties (see #5009) + if ( this.offsetParentCssPosition === "fixed" ) { + this.offset.parent = this._getParentOffset(); + } + + //Compute the helpers position + this.position = this._generatePosition(event); + this.positionAbs = this._convertPositionTo("absolute"); + + //Call plugins and callbacks and use the resulting position if something is returned + if (!noPropagation) { + var ui = this._uiHash(); + if(this._trigger("drag", event, ui) === false) { + this._mouseUp({}); + return false; + } + this.position = ui.position; + } + + if(!this.options.axis || this.options.axis !== "y") { + this.helper[0].style.left = this.position.left+"px"; + } + if(!this.options.axis || this.options.axis !== "x") { + this.helper[0].style.top = this.position.top+"px"; + } + if($.ui.ddmanager) { + $.ui.ddmanager.drag(this, event); + } + + return false; + }, + + _mouseStop: function(event) { + + //If we are using droppables, inform the manager about the drop + var that = this, + dropped = false; + if ($.ui.ddmanager && !this.options.dropBehaviour) { + dropped = $.ui.ddmanager.drop(this, event); + } + + //if a drop comes from outside (a sortable) + if(this.dropped) { + dropped = this.dropped; + this.dropped = false; + } + + //if the original element is no longer in the DOM don't bother to continue (see #8269) + if ( this.options.helper === "original" && !$.contains( this.element[ 0 ].ownerDocument, this.element[ 0 ] ) ) { + return false; + } + + if((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) { + $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() { + if(that._trigger("stop", event) !== false) { + that._clear(); + } + }); + } else { + if(this._trigger("stop", event) !== false) { + this._clear(); + } + } + + return false; + }, + + _mouseUp: function(event) { + //Remove frame helpers + $("div.ui-draggable-iframeFix").each(function() { + this.parentNode.removeChild(this); + }); + + //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003) + if( $.ui.ddmanager ) { + $.ui.ddmanager.dragStop(this, event); + } + + return $.ui.mouse.prototype._mouseUp.call(this, event); + }, + + cancel: function() { + + if(this.helper.is(".ui-draggable-dragging")) { + this._mouseUp({}); + } else { + this._clear(); + } + + return this; + + }, + + _getHandle: function(event) { + return this.options.handle ? + !!$( event.target ).closest( this.element.find( this.options.handle ) ).length : + true; + }, + + _createHelper: function(event) { + + var o = this.options, + helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper === "clone" ? this.element.clone().removeAttr("id") : this.element); + + if(!helper.parents("body").length) { + helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo)); + } + + if(helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) { + helper.css("position", "absolute"); + } + + return helper; + + }, + + _adjustOffsetFromHelper: function(obj) { + if (typeof obj === "string") { + obj = obj.split(" "); + } + if ($.isArray(obj)) { + obj = {left: +obj[0], top: +obj[1] || 0}; + } + if ("left" in obj) { + this.offset.click.left = obj.left + this.margins.left; + } + if ("right" in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; + } + if ("top" in obj) { + this.offset.click.top = obj.top + this.margins.top; + } + if ("bottom" in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; + } + }, + + _getParentOffset: function() { + + //Get the offsetParent and cache its position + var po = this.offsetParent.offset(); + + // This is a special case where we need to modify a offset calculated on start, since the following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that + // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag + if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) { + po.left += this.scrollParent.scrollLeft(); + po.top += this.scrollParent.scrollTop(); + } + + //This needs to be actually done for all browsers, since pageX/pageY includes this information + //Ugly IE fix + if((this.offsetParent[0] === document.body) || + (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) { + po = { top: 0, left: 0 }; + } + + return { + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + }, + + _getRelativeOffset: function() { + + if(this.cssPosition === "relative") { + var p = this.element.position(); + return { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), + left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() + }; + } else { + return { top: 0, left: 0 }; + } + + }, + + _cacheMargins: function() { + this.margins = { + left: (parseInt(this.element.css("marginLeft"),10) || 0), + top: (parseInt(this.element.css("marginTop"),10) || 0), + right: (parseInt(this.element.css("marginRight"),10) || 0), + bottom: (parseInt(this.element.css("marginBottom"),10) || 0) + }; + }, + + _cacheHelperProportions: function() { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + }; + }, + + _setContainment: function() { + + var over, c, ce, + o = this.options; + + if ( !o.containment ) { + this.containment = null; + return; + } + + if ( o.containment === "window" ) { + this.containment = [ + $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left, + $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top, + $( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left, + $( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top + ]; + return; + } + + if ( o.containment === "document") { + this.containment = [ + 0, + 0, + $( document ).width() - this.helperProportions.width - this.margins.left, + ( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top + ]; + return; + } + + if ( o.containment.constructor === Array ) { + this.containment = o.containment; + return; + } + + if ( o.containment === "parent" ) { + o.containment = this.helper[ 0 ].parentNode; + } + + c = $( o.containment ); + ce = c[ 0 ]; + + if( !ce ) { + return; + } + + over = c.css( "overflow" ) !== "hidden"; + + this.containment = [ + ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ), + ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ) , + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) - this.helperProportions.width - this.margins.left - this.margins.right, + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) - ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) - this.helperProportions.height - this.margins.top - this.margins.bottom + ]; + this.relative_container = c; + }, + + _convertPositionTo: function(d, pos) { + + if(!pos) { + pos = this.position; + } + + var mod = d === "absolute" ? 1 : -1, + scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent; + + //Cache the scroll + if (!this.offset.scroll) { + this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()}; + } + + return { + top: ( + pos.top + // The absolute mouse position + this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top ) * mod ) + ), + left: ( + pos.left + // The absolute mouse position + this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left ) * mod ) + ) + }; + + }, + + _generatePosition: function(event) { + + var containment, co, top, left, + o = this.options, + scroll = this.cssPosition === "absolute" && !( this.scrollParent[ 0 ] !== document && $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? this.offsetParent : this.scrollParent, + pageX = event.pageX, + pageY = event.pageY; + + //Cache the scroll + if (!this.offset.scroll) { + this.offset.scroll = {top : scroll.scrollTop(), left : scroll.scrollLeft()}; + } + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + // If we are not dragging yet, we won't check for options + if ( this.originalPosition ) { + if ( this.containment ) { + if ( this.relative_container ){ + co = this.relative_container.offset(); + containment = [ + this.containment[ 0 ] + co.left, + this.containment[ 1 ] + co.top, + this.containment[ 2 ] + co.left, + this.containment[ 3 ] + co.top + ]; + } + else { + containment = this.containment; + } + + if(event.pageX - this.offset.click.left < containment[0]) { + pageX = containment[0] + this.offset.click.left; + } + if(event.pageY - this.offset.click.top < containment[1]) { + pageY = containment[1] + this.offset.click.top; + } + if(event.pageX - this.offset.click.left > containment[2]) { + pageX = containment[2] + this.offset.click.left; + } + if(event.pageY - this.offset.click.top > containment[3]) { + pageY = containment[3] + this.offset.click.top; + } + } + + if(o.grid) { + //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950) + top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY; + pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX; + pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + } + + return { + top: ( + pageY - // The absolute mouse position + this.offset.click.top - // Click offset (relative to the element) + this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top + // The offsetParent's offset without borders (offset + border) + ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : this.offset.scroll.top ) + ), + left: ( + pageX - // The absolute mouse position + this.offset.click.left - // Click offset (relative to the element) + this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left + // The offsetParent's offset without borders (offset + border) + ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : this.offset.scroll.left ) + ) + }; + + }, + + _clear: function() { + this.helper.removeClass("ui-draggable-dragging"); + if(this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) { + this.helper.remove(); + } + this.helper = null; + this.cancelHelperRemoval = false; + }, + + // From now on bulk stuff - mainly helpers + + _trigger: function(type, event, ui) { + ui = ui || this._uiHash(); + $.ui.plugin.call(this, type, [event, ui]); + //The absolute position has to be recalculated after plugins + if(type === "drag") { + this.positionAbs = this._convertPositionTo("absolute"); + } + return $.Widget.prototype._trigger.call(this, type, event, ui); + }, + + plugins: {}, + + _uiHash: function() { + return { + helper: this.helper, + position: this.position, + originalPosition: this.originalPosition, + offset: this.positionAbs + }; + } + +}); + +$.ui.plugin.add("draggable", "connectToSortable", { + start: function(event, ui) { + + var inst = $(this).data("ui-draggable"), o = inst.options, + uiSortable = $.extend({}, ui, { item: inst.element }); + inst.sortables = []; + $(o.connectToSortable).each(function() { + var sortable = $.data(this, "ui-sortable"); + if (sortable && !sortable.options.disabled) { + inst.sortables.push({ + instance: sortable, + shouldRevert: sortable.options.revert + }); + sortable.refreshPositions(); // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page). + sortable._trigger("activate", event, uiSortable); + } + }); + + }, + stop: function(event, ui) { + + //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper + var inst = $(this).data("ui-draggable"), + uiSortable = $.extend({}, ui, { item: inst.element }); + + $.each(inst.sortables, function() { + if(this.instance.isOver) { + + this.instance.isOver = 0; + + inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance + this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work) + + //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: "valid/invalid" + if(this.shouldRevert) { + this.instance.options.revert = this.shouldRevert; + } + + //Trigger the stop of the sortable + this.instance._mouseStop(event); + + this.instance.options.helper = this.instance.options._helper; + + //If the helper has been the original item, restore properties in the sortable + if(inst.options.helper === "original") { + this.instance.currentItem.css({ top: "auto", left: "auto" }); + } + + } else { + this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance + this.instance._trigger("deactivate", event, uiSortable); + } + + }); + + }, + drag: function(event, ui) { + + var inst = $(this).data("ui-draggable"), that = this; + + $.each(inst.sortables, function() { + + var innermostIntersecting = false, + thisSortable = this; + + //Copy over some variables to allow calling the sortable's native _intersectsWith + this.instance.positionAbs = inst.positionAbs; + this.instance.helperProportions = inst.helperProportions; + this.instance.offset.click = inst.offset.click; + + if(this.instance._intersectsWith(this.instance.containerCache)) { + innermostIntersecting = true; + $.each(inst.sortables, function () { + this.instance.positionAbs = inst.positionAbs; + this.instance.helperProportions = inst.helperProportions; + this.instance.offset.click = inst.offset.click; + if (this !== thisSortable && + this.instance._intersectsWith(this.instance.containerCache) && + $.contains(thisSortable.instance.element[0], this.instance.element[0]) + ) { + innermostIntersecting = false; + } + return innermostIntersecting; + }); + } + + + if(innermostIntersecting) { + //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once + if(!this.instance.isOver) { + + this.instance.isOver = 1; + //Now we fake the start of dragging for the sortable instance, + //by cloning the list group item, appending it to the sortable and using it as inst.currentItem + //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one) + this.instance.currentItem = $(that).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item", true); + this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it + this.instance.options.helper = function() { return ui.helper[0]; }; + + event.target = this.instance.currentItem[0]; + this.instance._mouseCapture(event, true); + this.instance._mouseStart(event, true, true); + + //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes + this.instance.offset.click.top = inst.offset.click.top; + this.instance.offset.click.left = inst.offset.click.left; + this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left; + this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top; + + inst._trigger("toSortable", event); + inst.dropped = this.instance.element; //draggable revert needs that + //hack so receive/update callbacks work (mostly) + inst.currentItem = inst.element; + this.instance.fromOutside = inst; + + } + + //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable + if(this.instance.currentItem) { + this.instance._mouseDrag(event); + } + + } else { + + //If it doesn't intersect with the sortable, and it intersected before, + //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval + if(this.instance.isOver) { + + this.instance.isOver = 0; + this.instance.cancelHelperRemoval = true; + + //Prevent reverting on this forced stop + this.instance.options.revert = false; + + // The out event needs to be triggered independently + this.instance._trigger("out", event, this.instance._uiHash(this.instance)); + + this.instance._mouseStop(event, true); + this.instance.options.helper = this.instance.options._helper; + + //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size + this.instance.currentItem.remove(); + if(this.instance.placeholder) { + this.instance.placeholder.remove(); + } + + inst._trigger("fromSortable", event); + inst.dropped = false; //draggable revert needs that + } + + } + + }); + + } +}); + +$.ui.plugin.add("draggable", "cursor", { + start: function() { + var t = $("body"), o = $(this).data("ui-draggable").options; + if (t.css("cursor")) { + o._cursor = t.css("cursor"); + } + t.css("cursor", o.cursor); + }, + stop: function() { + var o = $(this).data("ui-draggable").options; + if (o._cursor) { + $("body").css("cursor", o._cursor); + } + } +}); + +$.ui.plugin.add("draggable", "opacity", { + start: function(event, ui) { + var t = $(ui.helper), o = $(this).data("ui-draggable").options; + if(t.css("opacity")) { + o._opacity = t.css("opacity"); + } + t.css("opacity", o.opacity); + }, + stop: function(event, ui) { + var o = $(this).data("ui-draggable").options; + if(o._opacity) { + $(ui.helper).css("opacity", o._opacity); + } + } +}); + +$.ui.plugin.add("draggable", "scroll", { + start: function() { + var i = $(this).data("ui-draggable"); + if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") { + i.overflowOffset = i.scrollParent.offset(); + } + }, + drag: function( event ) { + + var i = $(this).data("ui-draggable"), o = i.options, scrolled = false; + + if(i.scrollParent[0] !== document && i.scrollParent[0].tagName !== "HTML") { + + if(!o.axis || o.axis !== "x") { + if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) { + i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed; + } else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) { + i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed; + } + } + + if(!o.axis || o.axis !== "y") { + if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) { + i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed; + } else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) { + i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed; + } + } + + } else { + + if(!o.axis || o.axis !== "x") { + if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) { + scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) { + scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + } + } + + if(!o.axis || o.axis !== "y") { + if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) { + scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) { + scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + } + } + + } + + if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(i, event); + } + + } +}); + +$.ui.plugin.add("draggable", "snap", { + start: function() { + + var i = $(this).data("ui-draggable"), + o = i.options; + + i.snapElements = []; + + $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() { + var $t = $(this), + $o = $t.offset(); + if(this !== i.element[0]) { + i.snapElements.push({ + item: this, + width: $t.outerWidth(), height: $t.outerHeight(), + top: $o.top, left: $o.left + }); + } + }); + + }, + drag: function(event, ui) { + + var ts, bs, ls, rs, l, r, t, b, i, first, + inst = $(this).data("ui-draggable"), + o = inst.options, + d = o.snapTolerance, + x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width, + y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height; + + for (i = inst.snapElements.length - 1; i >= 0; i--){ + + l = inst.snapElements[i].left; + r = l + inst.snapElements[i].width; + t = inst.snapElements[i].top; + b = t + inst.snapElements[i].height; + + if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) { + if(inst.snapElements[i].snapping) { + (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + } + inst.snapElements[i].snapping = false; + continue; + } + + if(o.snapMode !== "inner") { + ts = Math.abs(t - y2) <= d; + bs = Math.abs(b - y1) <= d; + ls = Math.abs(l - x2) <= d; + rs = Math.abs(r - x1) <= d; + if(ts) { + ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top; + } + if(bs) { + ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top; + } + if(ls) { + ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left; + } + if(rs) { + ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left; + } + } + + first = (ts || bs || ls || rs); + + if(o.snapMode !== "outer") { + ts = Math.abs(t - y1) <= d; + bs = Math.abs(b - y2) <= d; + ls = Math.abs(l - x1) <= d; + rs = Math.abs(r - x2) <= d; + if(ts) { + ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top; + } + if(bs) { + ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top; + } + if(ls) { + ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left; + } + if(rs) { + ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left; + } + } + + if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) { + (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + } + inst.snapElements[i].snapping = (ts || bs || ls || rs || first); + + } + + } +}); + +$.ui.plugin.add("draggable", "stack", { + start: function() { + var min, + o = this.data("ui-draggable").options, + group = $.makeArray($(o.stack)).sort(function(a,b) { + return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0); + }); + + if (!group.length) { return; } + + min = parseInt($(group[0]).css("zIndex"), 10) || 0; + $(group).each(function(i) { + $(this).css("zIndex", min + i); + }); + this.css("zIndex", (min + group.length)); + } +}); + +$.ui.plugin.add("draggable", "zIndex", { + start: function(event, ui) { + var t = $(ui.helper), o = $(this).data("ui-draggable").options; + if(t.css("zIndex")) { + o._zIndex = t.css("zIndex"); + } + t.css("zIndex", o.zIndex); + }, + stop: function(event, ui) { + var o = $(this).data("ui-draggable").options; + if(o._zIndex) { + $(ui.helper).css("zIndex", o._zIndex); + } + } +}); + +})(jQuery); +(function( $, undefined ) { + +function isOverAxis( x, reference, size ) { + return ( x > reference ) && ( x < ( reference + size ) ); +} + +$.widget("ui.droppable", { + version: "1.10.3", + widgetEventPrefix: "drop", + options: { + accept: "*", + activeClass: false, + addClasses: true, + greedy: false, + hoverClass: false, + scope: "default", + tolerance: "intersect", + + // callbacks + activate: null, + deactivate: null, + drop: null, + out: null, + over: null + }, + _create: function() { + + var o = this.options, + accept = o.accept; + + this.isover = false; + this.isout = true; + + this.accept = $.isFunction(accept) ? accept : function(d) { + return d.is(accept); + }; + + //Store the droppable's proportions + this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight }; + + // Add the reference and positions to the manager + $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || []; + $.ui.ddmanager.droppables[o.scope].push(this); + + (o.addClasses && this.element.addClass("ui-droppable")); + + }, + + _destroy: function() { + var i = 0, + drop = $.ui.ddmanager.droppables[this.options.scope]; + + for ( ; i < drop.length; i++ ) { + if ( drop[i] === this ) { + drop.splice(i, 1); + } + } + + this.element.removeClass("ui-droppable ui-droppable-disabled"); + }, + + _setOption: function(key, value) { + + if(key === "accept") { + this.accept = $.isFunction(value) ? value : function(d) { + return d.is(value); + }; + } + $.Widget.prototype._setOption.apply(this, arguments); + }, + + _activate: function(event) { + var draggable = $.ui.ddmanager.current; + if(this.options.activeClass) { + this.element.addClass(this.options.activeClass); + } + if(draggable){ + this._trigger("activate", event, this.ui(draggable)); + } + }, + + _deactivate: function(event) { + var draggable = $.ui.ddmanager.current; + if(this.options.activeClass) { + this.element.removeClass(this.options.activeClass); + } + if(draggable){ + this._trigger("deactivate", event, this.ui(draggable)); + } + }, + + _over: function(event) { + + var draggable = $.ui.ddmanager.current; + + // Bail if draggable and droppable are same element + if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) { + return; + } + + if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.hoverClass) { + this.element.addClass(this.options.hoverClass); + } + this._trigger("over", event, this.ui(draggable)); + } + + }, + + _out: function(event) { + + var draggable = $.ui.ddmanager.current; + + // Bail if draggable and droppable are same element + if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) { + return; + } + + if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.hoverClass) { + this.element.removeClass(this.options.hoverClass); + } + this._trigger("out", event, this.ui(draggable)); + } + + }, + + _drop: function(event,custom) { + + var draggable = custom || $.ui.ddmanager.current, + childrenIntersection = false; + + // Bail if draggable and droppable are same element + if (!draggable || (draggable.currentItem || draggable.element)[0] === this.element[0]) { + return false; + } + + this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function() { + var inst = $.data(this, "ui-droppable"); + if( + inst.options.greedy && + !inst.options.disabled && + inst.options.scope === draggable.options.scope && + inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element)) && + $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance) + ) { childrenIntersection = true; return false; } + }); + if(childrenIntersection) { + return false; + } + + if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.activeClass) { + this.element.removeClass(this.options.activeClass); + } + if(this.options.hoverClass) { + this.element.removeClass(this.options.hoverClass); + } + this._trigger("drop", event, this.ui(draggable)); + return this.element; + } + + return false; + + }, + + ui: function(c) { + return { + draggable: (c.currentItem || c.element), + helper: c.helper, + position: c.position, + offset: c.positionAbs + }; + } + +}); + +$.ui.intersect = function(draggable, droppable, toleranceMode) { + + if (!droppable.offset) { + return false; + } + + var draggableLeft, draggableTop, + x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width, + y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height, + l = droppable.offset.left, r = l + droppable.proportions.width, + t = droppable.offset.top, b = t + droppable.proportions.height; + + switch (toleranceMode) { + case "fit": + return (l <= x1 && x2 <= r && t <= y1 && y2 <= b); + case "intersect": + return (l < x1 + (draggable.helperProportions.width / 2) && // Right Half + x2 - (draggable.helperProportions.width / 2) < r && // Left Half + t < y1 + (draggable.helperProportions.height / 2) && // Bottom Half + y2 - (draggable.helperProportions.height / 2) < b ); // Top Half + case "pointer": + draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left); + draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top); + return isOverAxis( draggableTop, t, droppable.proportions.height ) && isOverAxis( draggableLeft, l, droppable.proportions.width ); + case "touch": + return ( + (y1 >= t && y1 <= b) || // Top edge touching + (y2 >= t && y2 <= b) || // Bottom edge touching + (y1 < t && y2 > b) // Surrounded vertically + ) && ( + (x1 >= l && x1 <= r) || // Left edge touching + (x2 >= l && x2 <= r) || // Right edge touching + (x1 < l && x2 > r) // Surrounded horizontally + ); + default: + return false; + } + +}; + +/* + This manager tracks offsets of draggables and droppables +*/ +$.ui.ddmanager = { + current: null, + droppables: { "default": [] }, + prepareOffsets: function(t, event) { + + var i, j, + m = $.ui.ddmanager.droppables[t.options.scope] || [], + type = event ? event.type : null, // workaround for #2317 + list = (t.currentItem || t.element).find(":data(ui-droppable)").addBack(); + + droppablesLoop: for (i = 0; i < m.length; i++) { + + //No disabled and non-accepted + if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) { + continue; + } + + // Filter out elements in the current dragged item + for (j=0; j < list.length; j++) { + if(list[j] === m[i].element[0]) { + m[i].proportions.height = 0; + continue droppablesLoop; + } + } + + m[i].visible = m[i].element.css("display") !== "none"; + if(!m[i].visible) { + continue; + } + + //Activate the droppable if used directly from draggables + if(type === "mousedown") { + m[i]._activate.call(m[i], event); + } + + m[i].offset = m[i].element.offset(); + m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight }; + + } + + }, + drop: function(draggable, event) { + + var dropped = false; + // Create a copy of the droppables in case the list changes during the drop (#9116) + $.each(($.ui.ddmanager.droppables[draggable.options.scope] || []).slice(), function() { + + if(!this.options) { + return; + } + if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) { + dropped = this._drop.call(this, event) || dropped; + } + + if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + this.isout = true; + this.isover = false; + this._deactivate.call(this, event); + } + + }); + return dropped; + + }, + dragStart: function( draggable, event ) { + //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003) + draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() { + if( !draggable.options.refreshPositions ) { + $.ui.ddmanager.prepareOffsets( draggable, event ); + } + }); + }, + drag: function(draggable, event) { + + //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse. + if(draggable.options.refreshPositions) { + $.ui.ddmanager.prepareOffsets(draggable, event); + } + + //Run through all droppables and check their positions based on specific tolerance options + $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() { + + if(this.options.disabled || this.greedyChild || !this.visible) { + return; + } + + var parentInstance, scope, parent, + intersects = $.ui.intersect(draggable, this, this.options.tolerance), + c = !intersects && this.isover ? "isout" : (intersects && !this.isover ? "isover" : null); + if(!c) { + return; + } + + if (this.options.greedy) { + // find droppable parents with same scope + scope = this.options.scope; + parent = this.element.parents(":data(ui-droppable)").filter(function () { + return $.data(this, "ui-droppable").options.scope === scope; + }); + + if (parent.length) { + parentInstance = $.data(parent[0], "ui-droppable"); + parentInstance.greedyChild = (c === "isover"); + } + } + + // we just moved into a greedy child + if (parentInstance && c === "isover") { + parentInstance.isover = false; + parentInstance.isout = true; + parentInstance._out.call(parentInstance, event); + } + + this[c] = true; + this[c === "isout" ? "isover" : "isout"] = false; + this[c === "isover" ? "_over" : "_out"].call(this, event); + + // we just moved out of a greedy child + if (parentInstance && c === "isout") { + parentInstance.isout = false; + parentInstance.isover = true; + parentInstance._over.call(parentInstance, event); + } + }); + + }, + dragStop: function( draggable, event ) { + draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" ); + //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003) + if( !draggable.options.refreshPositions ) { + $.ui.ddmanager.prepareOffsets( draggable, event ); + } + } +}; + +})(jQuery); +(function( $, undefined ) { + +function num(v) { + return parseInt(v, 10) || 0; +} + +function isNumber(value) { + return !isNaN(parseInt(value, 10)); +} + +$.widget("ui.resizable", $.ui.mouse, { + version: "1.10.3", + widgetEventPrefix: "resize", + options: { + alsoResize: false, + animate: false, + animateDuration: "slow", + animateEasing: "swing", + aspectRatio: false, + autoHide: false, + containment: false, + ghost: false, + grid: false, + handles: "e,s,se", + helper: false, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + // See #7960 + zIndex: 90, + + // callbacks + resize: null, + start: null, + stop: null + }, + _create: function() { + + var n, i, handle, axis, hname, + that = this, + o = this.options; + this.element.addClass("ui-resizable"); + + $.extend(this, { + _aspectRatio: !!(o.aspectRatio), + aspectRatio: o.aspectRatio, + originalElement: this.element, + _proportionallyResizeElements: [], + _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null + }); + + //Wrap the element if it cannot hold child nodes + if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) { + + //Create a wrapper element and set the wrapper to the new current internal element + this.element.wrap( + $("
    ").css({ + position: this.element.css("position"), + width: this.element.outerWidth(), + height: this.element.outerHeight(), + top: this.element.css("top"), + left: this.element.css("left") + }) + ); + + //Overwrite the original this.element + this.element = this.element.parent().data( + "ui-resizable", this.element.data("ui-resizable") + ); + + this.elementIsWrapper = true; + + //Move margins to the wrapper + this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") }); + this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0}); + + //Prevent Safari textarea resize + this.originalResizeStyle = this.originalElement.css("resize"); + this.originalElement.css("resize", "none"); + + //Push the actual element to our proportionallyResize internal array + this._proportionallyResizeElements.push(this.originalElement.css({ position: "static", zoom: 1, display: "block" })); + + // avoid IE jump (hard set the margin) + this.originalElement.css({ margin: this.originalElement.css("margin") }); + + // fix handlers offset + this._proportionallyResize(); + + } + + this.handles = o.handles || (!$(".ui-resizable-handle", this.element).length ? "e,s,se" : { n: ".ui-resizable-n", e: ".ui-resizable-e", s: ".ui-resizable-s", w: ".ui-resizable-w", se: ".ui-resizable-se", sw: ".ui-resizable-sw", ne: ".ui-resizable-ne", nw: ".ui-resizable-nw" }); + if(this.handles.constructor === String) { + + if ( this.handles === "all") { + this.handles = "n,e,s,w,se,sw,ne,nw"; + } + + n = this.handles.split(","); + this.handles = {}; + + for(i = 0; i < n.length; i++) { + + handle = $.trim(n[i]); + hname = "ui-resizable-"+handle; + axis = $("
    "); + + // Apply zIndex to all handles - see #7960 + axis.css({ zIndex: o.zIndex }); + + //TODO : What's going on here? + if ("se" === handle) { + axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se"); + } + + //Insert into internal handles object and append to element + this.handles[handle] = ".ui-resizable-"+handle; + this.element.append(axis); + } + + } + + this._renderAxis = function(target) { + + var i, axis, padPos, padWrapper; + + target = target || this.element; + + for(i in this.handles) { + + if(this.handles[i].constructor === String) { + this.handles[i] = $(this.handles[i], this.element).show(); + } + + //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls) + if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) { + + axis = $(this.handles[i], this.element); + + //Checking the correct pad and border + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth(); + + //The padding type i have to apply... + padPos = [ "padding", + /ne|nw|n/.test(i) ? "Top" : + /se|sw|s/.test(i) ? "Bottom" : + /^e$/.test(i) ? "Right" : "Left" ].join(""); + + target.css(padPos, padWrapper); + + this._proportionallyResize(); + + } + + //TODO: What's that good for? There's not anything to be executed left + if(!$(this.handles[i]).length) { + continue; + } + } + }; + + //TODO: make renderAxis a prototype function + this._renderAxis(this.element); + + this._handles = $(".ui-resizable-handle", this.element) + .disableSelection(); + + //Matching axis name + this._handles.mouseover(function() { + if (!that.resizing) { + if (this.className) { + axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); + } + //Axis, default = se + that.axis = axis && axis[1] ? axis[1] : "se"; + } + }); + + //If we want to auto hide the elements + if (o.autoHide) { + this._handles.hide(); + $(this.element) + .addClass("ui-resizable-autohide") + .mouseenter(function() { + if (o.disabled) { + return; + } + $(this).removeClass("ui-resizable-autohide"); + that._handles.show(); + }) + .mouseleave(function(){ + if (o.disabled) { + return; + } + if (!that.resizing) { + $(this).addClass("ui-resizable-autohide"); + that._handles.hide(); + } + }); + } + + //Initialize the mouse interaction + this._mouseInit(); + + }, + + _destroy: function() { + + this._mouseDestroy(); + + var wrapper, + _destroy = function(exp) { + $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing") + .removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove(); + }; + + //TODO: Unwrap at same DOM position + if (this.elementIsWrapper) { + _destroy(this.element); + wrapper = this.element; + this.originalElement.css({ + position: wrapper.css("position"), + width: wrapper.outerWidth(), + height: wrapper.outerHeight(), + top: wrapper.css("top"), + left: wrapper.css("left") + }).insertAfter( wrapper ); + wrapper.remove(); + } + + this.originalElement.css("resize", this.originalResizeStyle); + _destroy(this.originalElement); + + return this; + }, + + _mouseCapture: function(event) { + var i, handle, + capture = false; + + for (i in this.handles) { + handle = $(this.handles[i])[0]; + if (handle === event.target || $.contains(handle, event.target)) { + capture = true; + } + } + + return !this.options.disabled && capture; + }, + + _mouseStart: function(event) { + + var curleft, curtop, cursor, + o = this.options, + iniPos = this.element.position(), + el = this.element; + + this.resizing = true; + + // bugfix for http://dev.jquery.com/ticket/1749 + if ( (/absolute/).test( el.css("position") ) ) { + el.css({ position: "absolute", top: el.css("top"), left: el.css("left") }); + } else if (el.is(".ui-draggable")) { + el.css({ position: "absolute", top: iniPos.top, left: iniPos.left }); + } + + this._renderProxy(); + + curleft = num(this.helper.css("left")); + curtop = num(this.helper.css("top")); + + if (o.containment) { + curleft += $(o.containment).scrollLeft() || 0; + curtop += $(o.containment).scrollTop() || 0; + } + + //Store needed variables + this.offset = this.helper.offset(); + this.position = { left: curleft, top: curtop }; + this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalPosition = { left: curleft, top: curtop }; + this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() }; + this.originalMousePosition = { left: event.pageX, top: event.pageY }; + + //Aspect Ratio + this.aspectRatio = (typeof o.aspectRatio === "number") ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1); + + cursor = $(".ui-resizable-" + this.axis).css("cursor"); + $("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor); + + el.addClass("ui-resizable-resizing"); + this._propagate("start", event); + return true; + }, + + _mouseDrag: function(event) { + + //Increase performance, avoid regex + var data, + el = this.helper, props = {}, + smp = this.originalMousePosition, + a = this.axis, + prevTop = this.position.top, + prevLeft = this.position.left, + prevWidth = this.size.width, + prevHeight = this.size.height, + dx = (event.pageX-smp.left)||0, + dy = (event.pageY-smp.top)||0, + trigger = this._change[a]; + + if (!trigger) { + return false; + } + + // Calculate the attrs that will be change + data = trigger.apply(this, [event, dx, dy]); + + // Put this in the mouseDrag handler since the user can start pressing shift while resizing + this._updateVirtualBoundaries(event.shiftKey); + if (this._aspectRatio || event.shiftKey) { + data = this._updateRatio(data, event); + } + + data = this._respectSize(data, event); + + this._updateCache(data); + + // plugins callbacks need to be called first + this._propagate("resize", event); + + if (this.position.top !== prevTop) { + props.top = this.position.top + "px"; + } + if (this.position.left !== prevLeft) { + props.left = this.position.left + "px"; + } + if (this.size.width !== prevWidth) { + props.width = this.size.width + "px"; + } + if (this.size.height !== prevHeight) { + props.height = this.size.height + "px"; + } + el.css(props); + + if (!this._helper && this._proportionallyResizeElements.length) { + this._proportionallyResize(); + } + + // Call the user callback if the element was resized + if ( ! $.isEmptyObject(props) ) { + this._trigger("resize", event, this.ui()); + } + + return false; + }, + + _mouseStop: function(event) { + + this.resizing = false; + var pr, ista, soffseth, soffsetw, s, left, top, + o = this.options, that = this; + + if(this._helper) { + + pr = this._proportionallyResizeElements; + ista = pr.length && (/textarea/i).test(pr[0].nodeName); + soffseth = ista && $.ui.hasScroll(pr[0], "left") /* TODO - jump height */ ? 0 : that.sizeDiff.height; + soffsetw = ista ? 0 : that.sizeDiff.width; + + s = { width: (that.helper.width() - soffsetw), height: (that.helper.height() - soffseth) }; + left = (parseInt(that.element.css("left"), 10) + (that.position.left - that.originalPosition.left)) || null; + top = (parseInt(that.element.css("top"), 10) + (that.position.top - that.originalPosition.top)) || null; + + if (!o.animate) { + this.element.css($.extend(s, { top: top, left: left })); + } + + that.helper.height(that.size.height); + that.helper.width(that.size.width); + + if (this._helper && !o.animate) { + this._proportionallyResize(); + } + } + + $("body").css("cursor", "auto"); + + this.element.removeClass("ui-resizable-resizing"); + + this._propagate("stop", event); + + if (this._helper) { + this.helper.remove(); + } + + return false; + + }, + + _updateVirtualBoundaries: function(forceAspectRatio) { + var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b, + o = this.options; + + b = { + minWidth: isNumber(o.minWidth) ? o.minWidth : 0, + maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity, + minHeight: isNumber(o.minHeight) ? o.minHeight : 0, + maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity + }; + + if(this._aspectRatio || forceAspectRatio) { + // We want to create an enclosing box whose aspect ration is the requested one + // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension + pMinWidth = b.minHeight * this.aspectRatio; + pMinHeight = b.minWidth / this.aspectRatio; + pMaxWidth = b.maxHeight * this.aspectRatio; + pMaxHeight = b.maxWidth / this.aspectRatio; + + if(pMinWidth > b.minWidth) { + b.minWidth = pMinWidth; + } + if(pMinHeight > b.minHeight) { + b.minHeight = pMinHeight; + } + if(pMaxWidth < b.maxWidth) { + b.maxWidth = pMaxWidth; + } + if(pMaxHeight < b.maxHeight) { + b.maxHeight = pMaxHeight; + } + } + this._vBoundaries = b; + }, + + _updateCache: function(data) { + this.offset = this.helper.offset(); + if (isNumber(data.left)) { + this.position.left = data.left; + } + if (isNumber(data.top)) { + this.position.top = data.top; + } + if (isNumber(data.height)) { + this.size.height = data.height; + } + if (isNumber(data.width)) { + this.size.width = data.width; + } + }, + + _updateRatio: function( data ) { + + var cpos = this.position, + csize = this.size, + a = this.axis; + + if (isNumber(data.height)) { + data.width = (data.height * this.aspectRatio); + } else if (isNumber(data.width)) { + data.height = (data.width / this.aspectRatio); + } + + if (a === "sw") { + data.left = cpos.left + (csize.width - data.width); + data.top = null; + } + if (a === "nw") { + data.top = cpos.top + (csize.height - data.height); + data.left = cpos.left + (csize.width - data.width); + } + + return data; + }, + + _respectSize: function( data ) { + + var o = this._vBoundaries, + a = this.axis, + ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height), + isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height), + dw = this.originalPosition.left + this.originalSize.width, + dh = this.position.top + this.size.height, + cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); + if (isminw) { + data.width = o.minWidth; + } + if (isminh) { + data.height = o.minHeight; + } + if (ismaxw) { + data.width = o.maxWidth; + } + if (ismaxh) { + data.height = o.maxHeight; + } + + if (isminw && cw) { + data.left = dw - o.minWidth; + } + if (ismaxw && cw) { + data.left = dw - o.maxWidth; + } + if (isminh && ch) { + data.top = dh - o.minHeight; + } + if (ismaxh && ch) { + data.top = dh - o.maxHeight; + } + + // fixing jump error on top/left - bug #2330 + if (!data.width && !data.height && !data.left && data.top) { + data.top = null; + } else if (!data.width && !data.height && !data.top && data.left) { + data.left = null; + } + + return data; + }, + + _proportionallyResize: function() { + + if (!this._proportionallyResizeElements.length) { + return; + } + + var i, j, borders, paddings, prel, + element = this.helper || this.element; + + for ( i=0; i < this._proportionallyResizeElements.length; i++) { + + prel = this._proportionallyResizeElements[i]; + + if (!this.borderDif) { + this.borderDif = []; + borders = [prel.css("borderTopWidth"), prel.css("borderRightWidth"), prel.css("borderBottomWidth"), prel.css("borderLeftWidth")]; + paddings = [prel.css("paddingTop"), prel.css("paddingRight"), prel.css("paddingBottom"), prel.css("paddingLeft")]; + + for ( j = 0; j < borders.length; j++ ) { + this.borderDif[ j ] = ( parseInt( borders[ j ], 10 ) || 0 ) + ( parseInt( paddings[ j ], 10 ) || 0 ); + } + } + + prel.css({ + height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0, + width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0 + }); + + } + + }, + + _renderProxy: function() { + + var el = this.element, o = this.options; + this.elementOffset = el.offset(); + + if(this._helper) { + + this.helper = this.helper || $("
    "); + + this.helper.addClass(this._helper).css({ + width: this.element.outerWidth() - 1, + height: this.element.outerHeight() - 1, + position: "absolute", + left: this.elementOffset.left +"px", + top: this.elementOffset.top +"px", + zIndex: ++o.zIndex //TODO: Don't modify option + }); + + this.helper + .appendTo("body") + .disableSelection(); + + } else { + this.helper = this.element; + } + + }, + + _change: { + e: function(event, dx) { + return { width: this.originalSize.width + dx }; + }, + w: function(event, dx) { + var cs = this.originalSize, sp = this.originalPosition; + return { left: sp.left + dx, width: cs.width - dx }; + }, + n: function(event, dx, dy) { + var cs = this.originalSize, sp = this.originalPosition; + return { top: sp.top + dy, height: cs.height - dy }; + }, + s: function(event, dx, dy) { + return { height: this.originalSize.height + dy }; + }, + se: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + sw: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + }, + ne: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + nw: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + } + }, + + _propagate: function(n, event) { + $.ui.plugin.call(this, n, [event, this.ui()]); + (n !== "resize" && this._trigger(n, event, this.ui())); + }, + + plugins: {}, + + ui: function() { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + originalSize: this.originalSize, + originalPosition: this.originalPosition + }; + } + +}); + +/* + * Resizable Extensions + */ + +$.ui.plugin.add("resizable", "animate", { + + stop: function( event ) { + var that = $(this).data("ui-resizable"), + o = that.options, + pr = that._proportionallyResizeElements, + ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && $.ui.hasScroll(pr[0], "left") /* TODO - jump height */ ? 0 : that.sizeDiff.height, + soffsetw = ista ? 0 : that.sizeDiff.width, + style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) }, + left = (parseInt(that.element.css("left"), 10) + (that.position.left - that.originalPosition.left)) || null, + top = (parseInt(that.element.css("top"), 10) + (that.position.top - that.originalPosition.top)) || null; + + that.element.animate( + $.extend(style, top && left ? { top: top, left: left } : {}), { + duration: o.animateDuration, + easing: o.animateEasing, + step: function() { + + var data = { + width: parseInt(that.element.css("width"), 10), + height: parseInt(that.element.css("height"), 10), + top: parseInt(that.element.css("top"), 10), + left: parseInt(that.element.css("left"), 10) + }; + + if (pr && pr.length) { + $(pr[0]).css({ width: data.width, height: data.height }); + } + + // propagating resize, and updating values for each animation step + that._updateCache(data); + that._propagate("resize", event); + + } + } + ); + } + +}); + +$.ui.plugin.add("resizable", "containment", { + + start: function() { + var element, p, co, ch, cw, width, height, + that = $(this).data("ui-resizable"), + o = that.options, + el = that.element, + oc = o.containment, + ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc; + + if (!ce) { + return; + } + + that.containerElement = $(ce); + + if (/document/.test(oc) || oc === document) { + that.containerOffset = { left: 0, top: 0 }; + that.containerPosition = { left: 0, top: 0 }; + + that.parentData = { + element: $(document), left: 0, top: 0, + width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight + }; + } + + // i'm a node, so compute top, left, right, bottom + else { + element = $(ce); + p = []; + $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); }); + + that.containerOffset = element.offset(); + that.containerPosition = element.position(); + that.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) }; + + co = that.containerOffset; + ch = that.containerSize.height; + cw = that.containerSize.width; + width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ); + height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch); + + that.parentData = { + element: ce, left: co.left, top: co.top, width: width, height: height + }; + } + }, + + resize: function( event ) { + var woset, hoset, isParent, isOffsetRelative, + that = $(this).data("ui-resizable"), + o = that.options, + co = that.containerOffset, cp = that.position, + pRatio = that._aspectRatio || event.shiftKey, + cop = { top:0, left:0 }, ce = that.containerElement; + + if (ce[0] !== document && (/static/).test(ce.css("position"))) { + cop = co; + } + + if (cp.left < (that._helper ? co.left : 0)) { + that.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left)); + if (pRatio) { + that.size.height = that.size.width / that.aspectRatio; + } + that.position.left = o.helper ? co.left : 0; + } + + if (cp.top < (that._helper ? co.top : 0)) { + that.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top); + if (pRatio) { + that.size.width = that.size.height * that.aspectRatio; + } + that.position.top = that._helper ? co.top : 0; + } + + that.offset.left = that.parentData.left+that.position.left; + that.offset.top = that.parentData.top+that.position.top; + + woset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width ); + hoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height ); + + isParent = that.containerElement.get(0) === that.element.parent().get(0); + isOffsetRelative = /relative|absolute/.test(that.containerElement.css("position")); + + if(isParent && isOffsetRelative) { + woset -= that.parentData.left; + } + + if (woset + that.size.width >= that.parentData.width) { + that.size.width = that.parentData.width - woset; + if (pRatio) { + that.size.height = that.size.width / that.aspectRatio; + } + } + + if (hoset + that.size.height >= that.parentData.height) { + that.size.height = that.parentData.height - hoset; + if (pRatio) { + that.size.width = that.size.height * that.aspectRatio; + } + } + }, + + stop: function(){ + var that = $(this).data("ui-resizable"), + o = that.options, + co = that.containerOffset, + cop = that.containerPosition, + ce = that.containerElement, + helper = $(that.helper), + ho = helper.offset(), + w = helper.outerWidth() - that.sizeDiff.width, + h = helper.outerHeight() - that.sizeDiff.height; + + if (that._helper && !o.animate && (/relative/).test(ce.css("position"))) { + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + } + + if (that._helper && !o.animate && (/static/).test(ce.css("position"))) { + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + } + + } +}); + +$.ui.plugin.add("resizable", "alsoResize", { + + start: function () { + var that = $(this).data("ui-resizable"), + o = that.options, + _store = function (exp) { + $(exp).each(function() { + var el = $(this); + el.data("ui-resizable-alsoresize", { + width: parseInt(el.width(), 10), height: parseInt(el.height(), 10), + left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10) + }); + }); + }; + + if (typeof(o.alsoResize) === "object" && !o.alsoResize.parentNode) { + if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); } + else { $.each(o.alsoResize, function (exp) { _store(exp); }); } + }else{ + _store(o.alsoResize); + } + }, + + resize: function (event, ui) { + var that = $(this).data("ui-resizable"), + o = that.options, + os = that.originalSize, + op = that.originalPosition, + delta = { + height: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0, + top: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0 + }, + + _alsoResize = function (exp, c) { + $(exp).each(function() { + var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {}, + css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ["width", "height"] : ["width", "height", "top", "left"]; + + $.each(css, function (i, prop) { + var sum = (start[prop]||0) + (delta[prop]||0); + if (sum && sum >= 0) { + style[prop] = sum || null; + } + }); + + el.css(style); + }); + }; + + if (typeof(o.alsoResize) === "object" && !o.alsoResize.nodeType) { + $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); }); + }else{ + _alsoResize(o.alsoResize); + } + }, + + stop: function () { + $(this).removeData("resizable-alsoresize"); + } +}); + +$.ui.plugin.add("resizable", "ghost", { + + start: function() { + + var that = $(this).data("ui-resizable"), o = that.options, cs = that.size; + + that.ghost = that.originalElement.clone(); + that.ghost + .css({ opacity: 0.25, display: "block", position: "relative", height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 }) + .addClass("ui-resizable-ghost") + .addClass(typeof o.ghost === "string" ? o.ghost : ""); + + that.ghost.appendTo(that.helper); + + }, + + resize: function(){ + var that = $(this).data("ui-resizable"); + if (that.ghost) { + that.ghost.css({ position: "relative", height: that.size.height, width: that.size.width }); + } + }, + + stop: function() { + var that = $(this).data("ui-resizable"); + if (that.ghost && that.helper) { + that.helper.get(0).removeChild(that.ghost.get(0)); + } + } + +}); + +$.ui.plugin.add("resizable", "grid", { + + resize: function() { + var that = $(this).data("ui-resizable"), + o = that.options, + cs = that.size, + os = that.originalSize, + op = that.originalPosition, + a = that.axis, + grid = typeof o.grid === "number" ? [o.grid, o.grid] : o.grid, + gridX = (grid[0]||1), + gridY = (grid[1]||1), + ox = Math.round((cs.width - os.width) / gridX) * gridX, + oy = Math.round((cs.height - os.height) / gridY) * gridY, + newWidth = os.width + ox, + newHeight = os.height + oy, + isMaxWidth = o.maxWidth && (o.maxWidth < newWidth), + isMaxHeight = o.maxHeight && (o.maxHeight < newHeight), + isMinWidth = o.minWidth && (o.minWidth > newWidth), + isMinHeight = o.minHeight && (o.minHeight > newHeight); + + o.grid = grid; + + if (isMinWidth) { + newWidth = newWidth + gridX; + } + if (isMinHeight) { + newHeight = newHeight + gridY; + } + if (isMaxWidth) { + newWidth = newWidth - gridX; + } + if (isMaxHeight) { + newHeight = newHeight - gridY; + } + + if (/^(se|s|e)$/.test(a)) { + that.size.width = newWidth; + that.size.height = newHeight; + } else if (/^(ne)$/.test(a)) { + that.size.width = newWidth; + that.size.height = newHeight; + that.position.top = op.top - oy; + } else if (/^(sw)$/.test(a)) { + that.size.width = newWidth; + that.size.height = newHeight; + that.position.left = op.left - ox; + } else { + that.size.width = newWidth; + that.size.height = newHeight; + that.position.top = op.top - oy; + that.position.left = op.left - ox; + } + } + +}); + +})(jQuery); diff --git a/vendors/jquery-ui/js/jquery-ui-1.10.3.custom.min.js b/vendors/jquery-ui/js/jquery-ui-1.10.3.custom.min.js new file mode 100644 index 000000000..f662cff53 --- /dev/null +++ b/vendors/jquery-ui/js/jquery-ui-1.10.3.custom.min.js @@ -0,0 +1,6 @@ +/*! jQuery UI - v1.10.3 - 2013-11-02 +* http://jqueryui.com +* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js +* Copyright 2013 jQuery Foundation and other contributors; Licensed under MIT */ + +(function(e,t){function i(t,i){var s,n,r,o=t.nodeName.toLowerCase();return"area"===o?(s=t.parentNode,n=s.name,t.href&&n&&"map"===s.nodeName.toLowerCase()?(r=e("img[usemap=#"+n+"]")[0],!!r&&a(r)):!1):(/input|select|textarea|button|object/.test(o)?!t.disabled:"a"===o?t.href||i:i)&&a(t)}function a(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var s=0,n=/^ui-id-\d+$/;e.ui=e.ui||{},e.extend(e.ui,{version:"1.10.3",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({focus:function(t){return function(i,a){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),a&&a.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var a,s,n=e(this[0]);n.length&&n[0]!==document;){if(a=n.css("position"),("absolute"===a||"relative"===a||"fixed"===a)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++s)})},removeUniqueId:function(){return this.each(function(){n.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,a){return!!e.data(t,a[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var a=e.attr(t,"tabindex"),s=isNaN(a);return(s||a>=0)&&i(t,!s)}}),e("
    ").outerWidth(1).jquery||e.each(["Width","Height"],function(i,a){function s(t,i,a,s){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,a&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===a?["Left","Right"]:["Top","Bottom"],r=a.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+a]=function(i){return i===t?o["inner"+a].call(this):this.each(function(){e(this).css(r,s(this,i)+"px")})},e.fn["outer"+a]=function(t,i){return"number"!=typeof t?o["outer"+a].call(this,t):this.each(function(){e(this).css(r,s(this,t,!0,i)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,a){var s,n=e.ui[t].prototype;for(s in a)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([i,a[s]])},call:function(e,t,i){var a,s=e.plugins[t];if(s&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(a=0;s.length>a;a++)e.options[s[a][0]]&&s[a][1].apply(e.element,i)}},hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var a=i&&"left"===i?"scrollLeft":"scrollTop",s=!1;return t[a]>0?!0:(t[a]=1,s=t[a]>0,t[a]=0,s)}})})(jQuery);(function(e,t){var i=0,s=Array.prototype.slice,a=e.cleanData;e.cleanData=function(t){for(var i,s=0;null!=(i=t[s]);s++)try{e(i).triggerHandler("remove")}catch(n){}a(t)},e.widget=function(i,s,a){var n,r,o,h,l={},u=i.split(".")[0];i=i.split(".")[1],n=u+"-"+i,a||(a=s,s=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[u]=e[u]||{},r=e[u][i],o=e[u][i]=function(e,i){return this._createWidget?(arguments.length&&this._createWidget(e,i),t):new o(e,i)},e.extend(o,r,{version:a.version,_proto:e.extend({},a),_childConstructors:[]}),h=new s,h.options=e.widget.extend({},h.options),e.each(a,function(i,a){return e.isFunction(a)?(l[i]=function(){var e=function(){return s.prototype[i].apply(this,arguments)},t=function(e){return s.prototype[i].apply(this,e)};return function(){var i,s=this._super,n=this._superApply;return this._super=e,this._superApply=t,i=a.apply(this,arguments),this._super=s,this._superApply=n,i}}(),t):(l[i]=a,t)}),o.prototype=e.widget.extend(h,{widgetEventPrefix:r?h.widgetEventPrefix:i},l,{constructor:o,namespace:u,widgetName:i,widgetFullName:n}),r?(e.each(r._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete r._childConstructors):s._childConstructors.push(o),e.widget.bridge(i,o)},e.widget.extend=function(i){for(var a,n,r=s.call(arguments,1),o=0,h=r.length;h>o;o++)for(a in r[o])n=r[o][a],r[o].hasOwnProperty(a)&&n!==t&&(i[a]=e.isPlainObject(n)?e.isPlainObject(i[a])?e.widget.extend({},i[a],n):e.widget.extend({},n):n);return i},e.widget.bridge=function(i,a){var n=a.prototype.widgetFullName||i;e.fn[i]=function(r){var o="string"==typeof r,h=s.call(arguments,1),l=this;return r=!o&&h.length?e.widget.extend.apply(null,[r].concat(h)):r,o?this.each(function(){var s,a=e.data(this,n);return a?e.isFunction(a[r])&&"_"!==r.charAt(0)?(s=a[r].apply(a,h),s!==a&&s!==t?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):t):e.error("no such method '"+r+"' for "+i+" widget instance"):e.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+r+"'")}):this.each(function(){var t=e.data(this,n);t?t.option(r||{})._init():e.data(this,n,new a(r,this))}),l}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{disabled:!1,create:null},_createWidget:function(t,s){s=e(s||this.defaultElement||this)[0],this.element=e(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),s!==this&&(e.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===s&&this.destroy()}}),this.document=e(s.style?s.ownerDocument:s.document||s),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(i,s){var a,n,r,o=i;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof i)if(o={},a=i.split("."),i=a.shift(),a.length){for(n=o[i]=e.widget.extend({},this.options[i]),r=0;a.length-1>r;r++)n[a[r]]=n[a[r]]||{},n=n[a[r]];if(i=a.pop(),s===t)return n[i]===t?null:n[i];n[i]=s}else{if(s===t)return this.options[i]===t?null:this.options[i];o[i]=s}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!t).attr("aria-disabled",t),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,a){var n,r=this;"boolean"!=typeof i&&(a=s,s=i,i=!1),a?(s=n=e(s),this.bindings=this.bindings.add(s)):(a=s,s=this.element,n=this.widget()),e.each(a,function(a,o){function h(){return i||r.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?r[o]:o).apply(r,arguments):t}"string"!=typeof o&&(h.guid=o.guid=o.guid||h.guid||e.guid++);var l=a.match(/^(\w+)\s*(.*)$/),u=l[1]+r.eventNamespace,c=l[2];c?n.delegate(c,u,h):s.bind(u,h)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var a,n,r=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],n=i.originalEvent)for(a in n)a in i||(i[a]=n[a]);return this.element.trigger(i,s),!(e.isFunction(r)&&r.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,a,n){"string"==typeof a&&(a={effect:a});var r,o=a?a===!0||"number"==typeof a?i:a.effect||i:t;a=a||{},"number"==typeof a&&(a={duration:a}),r=!e.isEmptyObject(a),a.complete=n,a.delay&&s.delay(a.delay),r&&e.effects&&e.effects.effect[o]?s[t](a):o!==t&&s[o]?s[o](a.duration,a.easing,n):s.queue(function(i){e(this)[t](),n&&n.call(s[0]),i()})}})})(jQuery);(function(e){var t=!1;e(document).mouseup(function(){t=!1}),e.widget("ui.mouse",{version:"1.10.3",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!t){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,a=1===i.which,n="string"==typeof this.options.cancel&&i.target.nodeName?e(i.target).closest(this.options.cancel).length:!1;return a&&!n&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===e.data(i.target,this.widgetName+".preventClickEvent")&&e.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return s._mouseMove(e)},this._mouseUpDelegate=function(e){return s._mouseUp(e)},e(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),t=!0,!0)):!0}},_mouseMove:function(t){return e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button?this._mouseUp(t):this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})})(jQuery);(function(e){e.widget("ui.draggable",e.ui.mouse,{version:"1.10.3",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"!==this.options.helper||/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},_destroy:function(){this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy()},_mouseCapture:function(t){var i=this.options;return this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(e(i.iframeFix===!0?"iframe":i.iframeFix).each(function(){e("
    ").css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(e(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offsetParent=this.helper.offsetParent(),this.offsetParentCssPosition=this.offsetParent.css("position"),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.offset.scroll=!1,e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_mouseDrag:function(t,i){if("fixed"===this.offsetParentCssPosition&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),!i){var a=this._uiHash();if(this._trigger("drag",t,a)===!1)return this._mouseUp({}),!1;this.position=a.position}return this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,a=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(a=e.ui.ddmanager.drop(this,t)),this.dropped&&(a=this.dropped,this.dropped=!1),"original"!==this.options.helper||e.contains(this.element[0].ownerDocument,this.element[0])?("invalid"===this.options.revert&&!a||"valid"===this.options.revert&&a||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,a)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1):!1},_mouseUp:function(t){return e("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_createHelper:function(t){var i=this.options,a=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return a.parents("body").length||a.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),a[0]===this.element[0]||/(fixed|absolute)/.test(a.css("position"))||a.css("position","absolute"),a},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.element.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,a,s=this.options;return s.containment?"window"===s.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):"document"===s.containment?(this.containment=[0,0,e(document).width()-this.helperProportions.width-this.margins.left,(e(document).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):s.containment.constructor===Array?(this.containment=s.containment,undefined):("parent"===s.containment&&(s.containment=this.helper[0].parentNode),i=e(s.containment),a=i[0],a&&(t="hidden"!==i.css("overflow"),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(a.scrollWidth,a.offsetWidth):a.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(a.scrollHeight,a.offsetHeight):a.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=i),undefined):(this.containment=null,undefined)},_convertPositionTo:function(t,i){i||(i=this.position);var a="absolute"===t?1:-1,s="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent;return this.offset.scroll||(this.offset.scroll={top:s.scrollTop(),left:s.scrollLeft()}),{top:i.top+this.offset.relative.top*a+this.offset.parent.top*a-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top)*a,left:i.left+this.offset.relative.left*a+this.offset.parent.left*a-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)*a}},_generatePosition:function(t){var i,a,s,n,r=this.options,o="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,l=t.pageX,h=t.pageY;return this.offset.scroll||(this.offset.scroll={top:o.scrollTop(),left:o.scrollLeft()}),this.originalPosition&&(this.containment&&(this.relative_container?(a=this.relative_container.offset(),i=[this.containment[0]+a.left,this.containment[1]+a.top,this.containment[2]+a.left,this.containment[3]+a.top]):i=this.containment,t.pageX-this.offset.click.lefti[2]&&(l=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(h=i[3]+this.offset.click.top)),r.grid&&(s=r.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/r.grid[1])*r.grid[1]:this.originalPageY,h=i?s-this.offset.click.top>=i[1]||s-this.offset.click.top>i[3]?s:s-this.offset.click.top>=i[1]?s-r.grid[1]:s+r.grid[1]:s,n=r.grid[0]?this.originalPageX+Math.round((l-this.originalPageX)/r.grid[0])*r.grid[0]:this.originalPageX,l=i?n-this.offset.click.left>=i[0]||n-this.offset.click.left>i[2]?n:n-this.offset.click.left>=i[0]?n-r.grid[0]:n+r.grid[0]:n)),{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top),left:l-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(t,i,a){return a=a||this._uiHash(),e.ui.plugin.call(this,t,[i,a]),"drag"===t&&(this.positionAbs=this._convertPositionTo("absolute")),e.Widget.prototype._trigger.call(this,t,i,a)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i){var a=e(this).data("ui-draggable"),s=a.options,n=e.extend({},i,{item:a.element});a.sortables=[],e(s.connectToSortable).each(function(){var i=e.data(this,"ui-sortable");i&&!i.options.disabled&&(a.sortables.push({instance:i,shouldRevert:i.options.revert}),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i){var a=e(this).data("ui-draggable"),s=e.extend({},i,{item:a.element});e.each(a.sortables,function(){this.instance.isOver?(this.instance.isOver=0,a.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=this.shouldRevert),this.instance._mouseStop(t),this.instance.options.helper=this.instance.options._helper,"original"===a.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",t,s))})},drag:function(t,i){var a=e(this).data("ui-draggable"),s=this;e.each(a.sortables,function(){var n=!1,r=this;this.instance.positionAbs=a.positionAbs,this.instance.helperProportions=a.helperProportions,this.instance.offset.click=a.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(n=!0,e.each(a.sortables,function(){return this.instance.positionAbs=a.positionAbs,this.instance.helperProportions=a.helperProportions,this.instance.offset.click=a.offset.click,this!==r&&this.instance._intersectsWith(this.instance.containerCache)&&e.contains(r.instance.element[0],this.instance.element[0])&&(n=!1),n})),n?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=e(s).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return i.helper[0]},t.target=this.instance.currentItem[0],this.instance._mouseCapture(t,!0),this.instance._mouseStart(t,!0,!0),this.instance.offset.click.top=a.offset.click.top,this.instance.offset.click.left=a.offset.click.left,this.instance.offset.parent.left-=a.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=a.offset.parent.top-this.instance.offset.parent.top,a._trigger("toSortable",t),a.dropped=this.instance.element,a.currentItem=a.element,this.instance.fromOutside=a),this.instance.currentItem&&this.instance._mouseDrag(t)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",t,this.instance._uiHash(this.instance)),this.instance._mouseStop(t,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),a._trigger("fromSortable",t),a.dropped=!1)})}}),e.ui.plugin.add("draggable","cursor",{start:function(){var t=e("body"),i=e(this).data("ui-draggable").options;t.css("cursor")&&(i._cursor=t.css("cursor")),t.css("cursor",i.cursor)},stop:function(){var t=e(this).data("ui-draggable").options;t._cursor&&e("body").css("cursor",t._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i){var a=e(i.helper),s=e(this).data("ui-draggable").options;a.css("opacity")&&(s._opacity=a.css("opacity")),a.css("opacity",s.opacity)},stop:function(t,i){var a=e(this).data("ui-draggable").options;a._opacity&&e(i.helper).css("opacity",a._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(){var t=e(this).data("ui-draggable");t.scrollParent[0]!==document&&"HTML"!==t.scrollParent[0].tagName&&(t.overflowOffset=t.scrollParent.offset())},drag:function(t){var i=e(this).data("ui-draggable"),a=i.options,s=!1;i.scrollParent[0]!==document&&"HTML"!==i.scrollParent[0].tagName?(a.axis&&"x"===a.axis||(i.overflowOffset.top+i.scrollParent[0].offsetHeight-t.pageY=0;d--)o=p.snapElements[d].left,l=o+p.snapElements[d].width,h=p.snapElements[d].top,u=h+p.snapElements[d].height,o-m>v||g>l+m||h-m>b||y>u+m||!e.contains(p.snapElements[d].item.ownerDocument,p.snapElements[d].item)?(p.snapElements[d].snapping&&p.options.snap.release&&p.options.snap.release.call(p.element,t,e.extend(p._uiHash(),{snapItem:p.snapElements[d].item})),p.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(a=m>=Math.abs(h-b),s=m>=Math.abs(u-y),n=m>=Math.abs(o-v),r=m>=Math.abs(l-g),a&&(i.position.top=p._convertPositionTo("relative",{top:h-p.helperProportions.height,left:0}).top-p.margins.top),s&&(i.position.top=p._convertPositionTo("relative",{top:u,left:0}).top-p.margins.top),n&&(i.position.left=p._convertPositionTo("relative",{top:0,left:o-p.helperProportions.width}).left-p.margins.left),r&&(i.position.left=p._convertPositionTo("relative",{top:0,left:l}).left-p.margins.left)),c=a||s||n||r,"outer"!==f.snapMode&&(a=m>=Math.abs(h-y),s=m>=Math.abs(u-b),n=m>=Math.abs(o-g),r=m>=Math.abs(l-v),a&&(i.position.top=p._convertPositionTo("relative",{top:h,left:0}).top-p.margins.top),s&&(i.position.top=p._convertPositionTo("relative",{top:u-p.helperProportions.height,left:0}).top-p.margins.top),n&&(i.position.left=p._convertPositionTo("relative",{top:0,left:o}).left-p.margins.left),r&&(i.position.left=p._convertPositionTo("relative",{top:0,left:l-p.helperProportions.width}).left-p.margins.left)),!p.snapElements[d].snapping&&(a||s||n||r||c)&&p.options.snap.snap&&p.options.snap.snap.call(p.element,t,e.extend(p._uiHash(),{snapItem:p.snapElements[d].item})),p.snapElements[d].snapping=a||s||n||r||c)}}),e.ui.plugin.add("draggable","stack",{start:function(){var t,i=this.data("ui-draggable").options,a=e.makeArray(e(i.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});a.length&&(t=parseInt(e(a[0]).css("zIndex"),10)||0,e(a).each(function(i){e(this).css("zIndex",t+i)}),this.css("zIndex",t+a.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i){var a=e(i.helper),s=e(this).data("ui-draggable").options;a.css("zIndex")&&(s._zIndex=a.css("zIndex")),a.css("zIndex",s.zIndex)},stop:function(t,i){var a=e(this).data("ui-draggable").options;a._zIndex&&e(i.helper).css("zIndex",a._zIndex)}})})(jQuery);(function(e){function t(e,t,i){return e>t&&t+i>e}e.widget("ui.droppable",{version:"1.10.3",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t=this.options,i=t.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(i)?i:function(e){return e.is(i)},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},e.ui.ddmanager.droppables[t.scope]=e.ui.ddmanager.droppables[t.scope]||[],e.ui.ddmanager.droppables[t.scope].push(this),t.addClasses&&this.element.addClass("ui-droppable")},_destroy:function(){for(var t=0,i=e.ui.ddmanager.droppables[this.options.scope];i.length>t;t++)i[t]===this&&i.splice(t,1);this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){"accept"===t&&(this.accept=e.isFunction(i)?i:function(e){return e.is(i)}),e.Widget.prototype._setOption.apply(this,arguments)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var a=i||e.ui.ddmanager.current,s=!1;return a&&(a.currentItem||a.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var t=e.data(this,"ui-droppable");return t.options.greedy&&!t.options.disabled&&t.options.scope===a.options.scope&&t.accept.call(t.element[0],a.currentItem||a.element)&&e.ui.intersect(a,e.extend(t,{offset:t.element.offset()}),t.options.tolerance)?(s=!0,!1):undefined}),s?!1:this.accept.call(this.element[0],a.currentItem||a.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(a)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(e,i,a){if(!i.offset)return!1;var s,n,r=(e.positionAbs||e.position.absolute).left,o=r+e.helperProportions.width,l=(e.positionAbs||e.position.absolute).top,h=l+e.helperProportions.height,u=i.offset.left,d=u+i.proportions.width,c=i.offset.top,p=c+i.proportions.height;switch(a){case"fit":return r>=u&&d>=o&&l>=c&&p>=h;case"intersect":return r+e.helperProportions.width/2>u&&d>o-e.helperProportions.width/2&&l+e.helperProportions.height/2>c&&p>h-e.helperProportions.height/2;case"pointer":return s=(e.positionAbs||e.position.absolute).left+(e.clickOffset||e.offset.click).left,n=(e.positionAbs||e.position.absolute).top+(e.clickOffset||e.offset.click).top,t(n,c,i.proportions.height)&&t(s,u,i.proportions.width);case"touch":return(l>=c&&p>=l||h>=c&&p>=h||c>l&&h>p)&&(r>=u&&d>=r||o>=u&&d>=o||u>r&&o>d);default:return!1}},e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var a,s,n=e.ui.ddmanager.droppables[t.options.scope]||[],r=i?i.type:null,o=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(a=0;n.length>a;a++)if(!(n[a].options.disabled||t&&!n[a].accept.call(n[a].element[0],t.currentItem||t.element))){for(s=0;o.length>s;s++)if(o[s]===n[a].element[0]){n[a].proportions.height=0;continue e}n[a].visible="none"!==n[a].element.css("display"),n[a].visible&&("mousedown"===r&&n[a]._activate.call(n[a],i),n[a].offset=n[a].element.offset(),n[a].proportions={width:n[a].element[0].offsetWidth,height:n[a].element[0].offsetHeight})}},drop:function(t,i){var a=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance)&&(a=this._drop.call(this,i)||a),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),a},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var a,s,n,r=e.ui.intersect(t,this,this.options.tolerance),o=!r&&this.isover?"isout":r&&!this.isover?"isover":null;o&&(this.options.greedy&&(s=this.options.scope,n=this.element.parents(":data(ui-droppable)").filter(function(){return e.data(this,"ui-droppable").options.scope===s}),n.length&&(a=e.data(n[0],"ui-droppable"),a.greedyChild="isover"===o)),a&&"isover"===o&&(a.isover=!1,a.isout=!0,a._out.call(a,i)),this[o]=!0,this["isout"===o?"isover":"isout"]=!1,this["isover"===o?"_over":"_out"].call(this,i),a&&"isout"===o&&(a.isout=!1,a.isover=!0,a._over.call(a,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}}})(jQuery);(function(e){function t(e){return parseInt(e,10)||0}function i(e){return!isNaN(parseInt(e,10))}e.widget("ui.resizable",e.ui.mouse,{version:"1.10.3",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_create:function(){var t,i,s,a,n,r=this,o=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!o.aspectRatio,aspectRatio:o.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:o.helper||o.ghost||o.animate?o.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e("
    ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.data("ui-resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=o.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),n="ui-resizable-"+s,a=e("
    "),a.css({zIndex:o.zIndex}),"se"===s&&a.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(a);this._renderAxis=function(t){var i,s,a,n;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=e(this.handles[i],this.element).show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=e(this.handles[i],this.element),n=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),a=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(a,n),this._proportionallyResize()),e(this.handles[i]).length},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){r.resizing||(this.className&&(a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=a&&a[1]?a[1]:"se")}),o.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){o.disabled||(e(this).removeClass("ui-resizable-autohide"),r._handles.show())}).mouseleave(function(){o.disabled||r.resizing||(e(this).addClass("ui-resizable-autohide"),r._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,a=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(a=!0);return!this.options.disabled&&a},_mouseStart:function(i){var s,a,n,r=this.options,o=this.element.position(),h=this.element;return this.resizing=!0,/absolute/.test(h.css("position"))?h.css({position:"absolute",top:h.css("top"),left:h.css("left")}):h.is(".ui-draggable")&&h.css({position:"absolute",top:o.top,left:o.left}),this._renderProxy(),s=t(this.helper.css("left")),a=t(this.helper.css("top")),r.containment&&(s+=e(r.containment).scrollLeft()||0,a+=e(r.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:s,top:a},this.size=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalSize=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalPosition={left:s,top:a},this.sizeDiff={width:h.outerWidth()-h.width(),height:h.outerHeight()-h.height()},this.originalMousePosition={left:i.pageX,top:i.pageY},this.aspectRatio="number"==typeof r.aspectRatio?r.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),h.addClass("ui-resizable-resizing"),this._propagate("start",i),!0},_mouseDrag:function(t){var i,s=this.helper,a={},n=this.originalMousePosition,r=this.axis,o=this.position.top,h=this.position.left,l=this.size.width,u=this.size.height,c=t.pageX-n.left||0,d=t.pageY-n.top||0,p=this._change[r];return p?(i=p.apply(this,[t,c,d]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),this.position.top!==o&&(a.top=this.position.top+"px"),this.position.left!==h&&(a.left=this.position.left+"px"),this.size.width!==l&&(a.width=this.size.width+"px"),this.size.height!==u&&(a.height=this.size.height+"px"),s.css(a),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(a)||this._trigger("resize",t,this.ui()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,a,n,r,o,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),a=s&&e.ui.hasScroll(i[0],"left")?0:u.sizeDiff.height,n=s?0:u.sizeDiff.width,r={width:u.helper.width()-n,height:u.helper.height()-a},o=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(r,{top:h,left:o})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(e){var t,s,a,n,r,o=this.options;r={minWidth:i(o.minWidth)?o.minWidth:0,maxWidth:i(o.maxWidth)?o.maxWidth:1/0,minHeight:i(o.minHeight)?o.minHeight:0,maxHeight:i(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=r.minHeight*this.aspectRatio,a=r.minWidth/this.aspectRatio,s=r.maxHeight*this.aspectRatio,n=r.maxWidth/this.aspectRatio,t>r.minWidth&&(r.minWidth=t),a>r.minHeight&&(r.minHeight=a),r.maxWidth>s&&(r.maxWidth=s),r.maxHeight>n&&(r.maxHeight=n)),this._vBoundaries=r},_updateCache:function(e){this.offset=this.helper.offset(),i(e.left)&&(this.position.left=e.left),i(e.top)&&(this.position.top=e.top),i(e.height)&&(this.size.height=e.height),i(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,s=this.size,a=this.axis;return i(e.height)?e.width=e.height*this.aspectRatio:i(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===a&&(e.left=t.left+(s.width-e.width),e.top=null),"nw"===a&&(e.top=t.top+(s.height-e.height),e.left=t.left+(s.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,s=this.axis,a=i(e.width)&&t.maxWidth&&t.maxWidthe.width,o=i(e.height)&&t.minHeight&&t.minHeight>e.height,h=this.originalPosition.left+this.originalSize.width,l=this.position.top+this.size.height,u=/sw|nw|w/.test(s),c=/nw|ne|n/.test(s);return r&&(e.width=t.minWidth),o&&(e.height=t.minHeight),a&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),r&&u&&(e.left=h-t.minWidth),a&&u&&(e.left=h-t.maxWidth),o&&c&&(e.top=l-t.minHeight),n&&c&&(e.top=l-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_proportionallyResize:function(){if(this._proportionallyResizeElements.length){var e,t,i,s,a,n=this.helper||this.element;for(e=0;this._proportionallyResizeElements.length>e;e++){if(a=this._proportionallyResizeElements[e],!this.borderDif)for(this.borderDif=[],i=[a.css("borderTopWidth"),a.css("borderRightWidth"),a.css("borderBottomWidth"),a.css("borderLeftWidth")],s=[a.css("paddingTop"),a.css("paddingRight"),a.css("paddingBottom"),a.css("paddingLeft")],t=0;i.length>t;t++)this.borderDif[t]=(parseInt(i[t],10)||0)+(parseInt(s[t],10)||0);a.css({height:n.height()-this.borderDif[0]-this.borderDif[2]||0,width:n.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("
    "),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,a=this.originalPosition;return{top:a.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).data("ui-resizable"),s=i.options,a=i._proportionallyResizeElements,n=a.length&&/textarea/i.test(a[0].nodeName),r=n&&e.ui.hasScroll(a[0],"left")?0:i.sizeDiff.height,o=n?0:i.sizeDiff.width,h={width:i.size.width-o,height:i.size.height-r},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};a&&a.length&&e(a[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var i,s,a,n,r,o,h,l=e(this).data("ui-resizable"),u=l.options,c=l.element,d=u.containment,p=d instanceof e?d.get(0):/parent/.test(d)?c.parent().get(0):d;p&&(l.containerElement=e(p),/document/.test(d)||d===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(i=e(p),s=[],e(["Top","Right","Left","Bottom"]).each(function(e,a){s[e]=t(i.css("padding"+a))}),l.containerOffset=i.offset(),l.containerPosition=i.position(),l.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},a=l.containerOffset,n=l.containerSize.height,r=l.containerSize.width,o=e.ui.hasScroll(p,"left")?p.scrollWidth:r,h=e.ui.hasScroll(p)?p.scrollHeight:n,l.parentData={element:p,left:a.left,top:a.top,width:o,height:h}))},resize:function(t){var i,s,a,n,r=e(this).data("ui-resizable"),o=r.options,h=r.containerOffset,l=r.position,u=r._aspectRatio||t.shiftKey,c={top:0,left:0},d=r.containerElement;d[0]!==document&&/static/.test(d.css("position"))&&(c=h),l.left<(r._helper?h.left:0)&&(r.size.width=r.size.width+(r._helper?r.position.left-h.left:r.position.left-c.left),u&&(r.size.height=r.size.width/r.aspectRatio),r.position.left=o.helper?h.left:0),l.top<(r._helper?h.top:0)&&(r.size.height=r.size.height+(r._helper?r.position.top-h.top:r.position.top),u&&(r.size.width=r.size.height*r.aspectRatio),r.position.top=r._helper?h.top:0),r.offset.left=r.parentData.left+r.position.left,r.offset.top=r.parentData.top+r.position.top,i=Math.abs((r._helper?r.offset.left-c.left:r.offset.left-c.left)+r.sizeDiff.width),s=Math.abs((r._helper?r.offset.top-c.top:r.offset.top-h.top)+r.sizeDiff.height),a=r.containerElement.get(0)===r.element.parent().get(0),n=/relative|absolute/.test(r.containerElement.css("position")),a&&n&&(i-=r.parentData.left),i+r.size.width>=r.parentData.width&&(r.size.width=r.parentData.width-i,u&&(r.size.height=r.size.width/r.aspectRatio)),s+r.size.height>=r.parentData.height&&(r.size.height=r.parentData.height-s,u&&(r.size.width=r.size.height*r.aspectRatio))},stop:function(){var t=e(this).data("ui-resizable"),i=t.options,s=t.containerOffset,a=t.containerPosition,n=t.containerElement,r=e(t.helper),o=r.offset(),h=r.outerWidth()-t.sizeDiff.width,l=r.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(n.css("position"))&&e(this).css({left:o.left-a.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(n.css("position"))&&e(this).css({left:o.left-a.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).data("ui-resizable"),i=t.options,s=function(t){e(t).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)})},resize:function(t,i){var s=e(this).data("ui-resizable"),a=s.options,n=s.originalSize,r=s.originalPosition,o={height:s.size.height-n.height||0,width:s.size.width-n.width||0,top:s.position.top-r.top||0,left:s.position.left-r.left||0},h=function(t,s){e(t).each(function(){var t=e(this),a=e(this).data("ui-resizable-alsoresize"),n={},r=s&&s.length?s:t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(e,t){var i=(a[t]||0)+(o[t]||0);i&&i>=0&&(n[t]=i||null)}),t.css(n)})};"object"!=typeof a.alsoResize||a.alsoResize.nodeType?h(a.alsoResize):e.each(a.alsoResize,function(e,t){h(e,t)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).data("ui-resizable"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).data("ui-resizable");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).data("ui-resizable");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t=e(this).data("ui-resizable"),i=t.options,s=t.size,a=t.originalSize,n=t.originalPosition,r=t.axis,o="number"==typeof i.grid?[i.grid,i.grid]:i.grid,h=o[0]||1,l=o[1]||1,u=Math.round((s.width-a.width)/h)*h,c=Math.round((s.height-a.height)/l)*l,d=a.width+u,p=a.height+c,f=i.maxWidth&&d>i.maxWidth,m=i.maxHeight&&p>i.maxHeight,g=i.minWidth&&i.minWidth>d,v=i.minHeight&&i.minHeight>p;i.grid=o,g&&(d+=h),v&&(p+=l),f&&(d-=h),m&&(p-=l),/^(se|s|e)$/.test(r)?(t.size.width=d,t.size.height=p):/^(ne)$/.test(r)?(t.size.width=d,t.size.height=p,t.position.top=n.top-c):/^(sw)$/.test(r)?(t.size.width=d,t.size.height=p,t.position.left=n.left-u):(t.size.width=d,t.size.height=p,t.position.top=n.top-c,t.position.left=n.left-u)}})})(jQuery); \ No newline at end of file diff --git a/vendors/jquery-ui/package.json b/vendors/jquery-ui/package.json new file mode 100644 index 000000000..a89dcc874 --- /dev/null +++ b/vendors/jquery-ui/package.json @@ -0,0 +1,70 @@ +{ + "name": "jquery-ui", + "title": "jQuery UI", + "description": "A curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library.", + "version": "1.10.3", + "homepage": "http://jqueryui.com", + "author": { + "name": "jQuery Foundation and other contributors", + "url": "https://github.com/jquery/jquery-ui/blob/1.10.3/AUTHORS.txt" + }, + "maintainers": [ + { + "name": "Scott González", + "email": "scott.gonzalez@gmail.com", + "url": "http://scottgonzalez.com" + }, + { + "name": "Jörn Zaefferer", + "email": "joern.zaefferer@gmail.com", + "url": "http://bassistance.de" + }, + { + "name": "Kris Borchers", + "email": "kris.borchers@gmail.com", + "url": "http://krisborchers.com" + }, + { + "name": "Corey Frang", + "email": "gnarf37@gmail.com", + "url": "http://gnarf.net" + }, + { + "name": "Mike Sherov", + "email": "mike.sherov@gmail.com", + "url": "http://mike.sherov.com" + }, + { + "name": "TJ VanToll", + "email": "tj.vantoll@gmail.com", + "url": "http://tjvantoll.com" + } + ], + "repository": { + "type": "git", + "url": "git://github.com/jquery/jquery-ui.git" + }, + "bugs": "http://bugs.jqueryui.com/", + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/jquery/jquery-ui/blob/1.10.3/MIT-LICENSE.txt" + } + ], + "dependencies": {}, + "devDependencies": { + "grunt": "0.4.1", + "grunt-contrib-jshint": "0.4.1", + "grunt-contrib-uglify": "0.1.1", + "grunt-contrib-concat": "0.1.3", + "grunt-contrib-qunit": "0.2.0", + "grunt-contrib-csslint": "0.1.0", + "grunt-contrib-cssmin": "0.4.2", + "grunt-compare-size": "0.3.1", + "grunt-html": "0.3.3", + "grunt-git-authors": "1.2.0", + "rimraf": "2.1.4", + "testswarm": "1.0.0-alpha" + }, + "keywords": [] +} diff --git a/vendors/jquery-wakeup/jquery.wakeup.js b/vendors/jquery-wakeup/jquery.wakeup.js new file mode 100644 index 000000000..9806c4618 --- /dev/null +++ b/vendors/jquery-wakeup/jquery.wakeup.js @@ -0,0 +1,69 @@ +/*! + * jQuery WakeUp plugin + * + * A JQuery plugin that will help detecting waking up from sleep and/or + * hibernation and executing assigned functions. + * + * Based on code provided by Andrew Mu: + * http://stackoverflow.com/questions/4079115 + * + * Copyright (c) 2013, Paul Okopny + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ +(function ($, document, undefined) { + var default_wakeup_interval = 1000; + var wake_up_ids = new Array(); + // returns intervalId, which can be used to cancel future waking + $.wakeUp = function (on_wakeup, params, interval) { + + if ((!interval) || typeof(interval) !== 'number' ){ + interval = default_wakeup_interval; + }; + // on_wakeup should be a function + if (typeof(on_wakeup) !== "function") { + return null; + } + var lastTime = (new Date()).getTime(); + var intervalId = setInterval(function() { + var currentTime = (new Date()).getTime(); + if (currentTime > (lastTime + interval + 1000)) { // + var sleepTime = currentTime - lastTime; + lastTime = currentTime; + if (params) { + on_wakeup(sleepTime, params);} else {on_wakeup(sleepTime); } + } else {lastTime = currentTime;} + }, interval); + //add interval id to wake_up_ids array + wake_up_ids.push(intervalId); + return intervalId; + }; + + $.ignoreBell = function(interval_id) { + if (interval_id) { + // delete only one wakeUp call + wake_up_ids.splice($.inArray(interval_id, wake_up_ids),1); + clearInterval(interval_id); + }; + }; + + $.dreamOn = function() { + // delete all current wake Up calls + $.each(wake_up_ids, function(index_of, interval_id) { + clearInterval(interval_id) + }); + wake_up_ids = new Array(); + }; + +})(jQuery, document); \ No newline at end of file diff --git a/vendors/jquery-wakeup/jquery.wakeup.min.js b/vendors/jquery-wakeup/jquery.wakeup.min.js new file mode 100644 index 000000000..c21ce521a --- /dev/null +++ b/vendors/jquery-wakeup/jquery.wakeup.min.js @@ -0,0 +1,2 @@ +/*! jQuery WakeUp plugin (c) 2013 Paul Okopny | MIT */ +!function(a){var b=1e3,c=new Array;a.wakeUp=function(a,d,e){if(e&&"number"==typeof e||(e=b),"function"!=typeof a)return null;var f=(new Date).getTime(),g=setInterval(function(){var b=(new Date).getTime();if(b>f+e+1e3){var c=b-f;f=b,d?a(c,d):a(c)}else f=b},e);return c.push(g),g},a.ignoreBell=function(b){b&&(c.splice(a.inArray(b,c),1),clearInterval(b))},a.dreamOn=function(){a.each(c,function(a,b){clearInterval(b)}),c=new Array}}(jQuery,document); \ No newline at end of file diff --git a/vendors/json2.min.js b/vendors/json2.min.js new file mode 100644 index 000000000..aca6ca901 --- /dev/null +++ b/vendors/json2.min.js @@ -0,0 +1,2 @@ +/*! See http://www.JSON.org/js.html */ +var JSON;JSON||(JSON={}),function(){function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c iLimit && fLimitCallback) + { + bCallLimit = true; + fLimitCallback(iInputLimit); + } + } + }); + } + else if (bAllowFolderDragAndDrop && oItem['isDirectory'] && oItem['createReader']) + { + var + oDirReader = oItem['createReader'](), + iIndex = 0, + iLen = 0 + ; + + if (oDirReader && oDirReader['readEntries']) + { + oDirReader['readEntries'](function (aEntries) { + if (aEntries && isNonEmptyArray(aEntries)) + { + for (iIndex = 0, iLen = aEntries.length; iIndex < iLen; iIndex++) + { + fTraverseFileTree(aEntries[iIndex], sPath + oItem['name'] + '/', fCallback, fLimitCallbackProxy); + } + } + }); + } + } + } + } + ; + + bAllowFolderDragAndDrop = isUndefined(bAllowFolderDragAndDrop) ? true : !!bAllowFolderDragAndDrop; + + bEntry = isUndefined(bEntry) ? false : !!bEntry; + iLimit = isUndefined(iLimit) ? Jua.iDefLimit : pInt(iLimit); + iInputLimit = iLimit; + bUseLimit = 0 < iLimit; + + aItems = aItems && 0 < aItems.length ? aItems : null; + if (aItems) + { + for (iIndex = 0, iLen = aItems.length; iIndex < iLen; iIndex++) + { + oItem = aItems[iIndex]; + if (oItem) + { + if (bEntry) + { + if ('file' === oItem['kind'] && oItem['webkitGetAsEntry']) + { + oEntry = oItem['webkitGetAsEntry'](); + if (oEntry) + { + fTraverseFileTree(oEntry, '', fFileCallback, fLimitCallback); + } + } + } + else + { + if (!bUseLimit || 0 <= --iLimit) + { + fFileCallback(getDataFromFile(oItem)); + } + else if (bUseLimit && !bCallLimit) + { + if (0 > iLimit && fLimitCallback) + { + bCallLimit = true; + fLimitCallback(iInputLimit); + } + } + } + } + } + } + } + + /** + * @param {*} oInput + * @param {Function} fFileCallback + * @param {number=} iLimit = 20 + * @param {Function=} fLimitCallback + */ + function getDataFromInput(oInput, fFileCallback, iLimit, fLimitCallback) + { + var aFiles = oInput && oInput.files && 0 < oInput.files.length ? oInput.files : null; + if (aFiles) + { + getDataFromFiles(aFiles, fFileCallback, false, false, iLimit, fLimitCallback); + } + else + { + fFileCallback({ + 'FileName': oInput.value.split('\\').pop().split('/').pop(), + 'Size': null, + 'Type': null, + 'Folder': '', + 'File' : null + }); + } + } + + function eventContainsFiles(oEvent) + { + if (oEvent) + { + if (!isUndefined(oEvent['__memEventContainsFiles'])) + { + return oEvent['__memEventContainsFiles']; + } + + var bResult = false; + if (oEvent && oEvent.dataTransfer && oEvent.dataTransfer.types && oEvent.dataTransfer.types.length) + { + var + iIindex = 0, + iLen = oEvent.dataTransfer.types.length + ; + + for (; iIindex < iLen; iIindex++) + { + if (oEvent.dataTransfer.types[iIindex].toLowerCase() === 'files') + { + bResult = true; + break; + } + } + } + + oEvent['__memEventContainsFiles'] = bResult; + } + + return oEvent ? oEvent['__memEventContainsFiles'] : false; + } + + /** + * @param {Event} oEvent + * @param {Function} fFileCallback + * @param {number=} iLimit = 20 + * @param {Function=} fLimitCallback + * @param {boolean=} bAllowFolderDragAndDrop = true + */ + function getDataFromDragEvent(oEvent, fFileCallback, iLimit, fLimitCallback, bAllowFolderDragAndDrop) + { + var + aItems = null, + aFiles = null + ; + + oEvent = getEvent(oEvent); + if (oEvent) + { + aItems = (oEvent.dataTransfer ? getValue(oEvent.dataTransfer, 'items', null) : null) || getValue(oEvent, 'items', null); + if (aItems && 0 < aItems.length && aItems[0] && aItems[0]['webkitGetAsEntry']) + { + getDataFromFiles(aItems, fFileCallback, true, bAllowFolderDragAndDrop, iLimit, fLimitCallback); + } + else if (eventContainsFiles(oEvent)) + { + aFiles = (getValue(oEvent, 'files', null) || (oEvent.dataTransfer ? + getValue(oEvent.dataTransfer, 'files', null) : null)); + + if (aFiles && 0 < aFiles.length) + { + getDataFromFiles(aFiles, fFileCallback, false, false, iLimit, fLimitCallback); + } + } + } + } + + function createNextLabel() + { + return $('').css({ + 'opacity': 0 + }); + } + + function createNextInput() + { + return $(''); + } + + /** + * @param {string=} sName + * @param {boolean=} bMultiple = true + * @return {?Object} + */ + function getNewInput(sName, bMultiple) + { + sName = isUndefined(sName) ? '' : sName.toString(); + + var oLocal = createNextInput(); + if (0 < sName.length) + { + oLocal.attr('name', sName); + } + + if (isUndefined(bMultiple) ? true : bMultiple) + { + oLocal.prop('multiple', true); + } + + return oLocal; + } + + /** + * @param {?} mStringOrFunction + * @param {Array=} aFunctionParams + * @return {string} + */ + function getStringOrCallFunction(mStringOrFunction, aFunctionParams) + { + return $.isFunction(mStringOrFunction) ? + mStringOrFunction.apply(null, $.isArray(aFunctionParams) ? aFunctionParams : []).toString() : + mStringOrFunction.toString(); + } + + /** + * @constructor + * @param {Jua} oJua + * @param {Object} oOptions + */ + function AjaxDriver(oJua, oOptions) + { + this.oXhrs = {}; + this.oUids = {}; + this.oJua = oJua; + this.oOptions = oOptions; + } + + /** + * @type {Object} + */ + AjaxDriver.prototype.oXhrs = {}; + + /** + * @type {Object} + */ + AjaxDriver.prototype.oUids = {}; + + /** + * @type {?Jua} + */ + AjaxDriver.prototype.oJua = null; + + /** + * @type {Object} + */ + AjaxDriver.prototype.oOptions = {}; + + /** + * @return {boolean} + */ + AjaxDriver.prototype.isDragAndDropSupported = function () + { + return true; + }; + + /** + * @param {string} sUid + */ + AjaxDriver.prototype.regTaskUid = function (sUid) + { + this.oUids[sUid] = true; + }; + + /** + * @param {string} sUid + * @param {?} oFileInfo + * @param {Function} fCallback + */ + AjaxDriver.prototype.uploadTask = function (sUid, oFileInfo, fCallback) + { + if (false === this.oUids[sUid] || !oFileInfo || !oFileInfo['File']) + { + fCallback(null, sUid); + return false; + } + + try + { + var + self = this, + oXhr = new XMLHttpRequest(), + oFormData = new FormData(), + sAction = getValue(this.oOptions, 'action', ''), + aHidden = getValue(this.oOptions, 'hidden', {}), + fStartFunction = getValue(this.oOptions, 'onStart', null), + fCompleteFunction = getValue(this.oOptions, 'onComplete', null), + fProgressFunction = getValue(this.oOptions, 'onProgress', null) + ; + + oXhr.open('POST', sAction, true); + + if (fProgressFunction && oXhr.upload) + { + oXhr.upload.onprogress = function (oEvent) { + if (oEvent && oEvent.lengthComputable && !isUndefined(oEvent.loaded) && !isUndefined(oEvent.total)) + { + fProgressFunction(sUid, oEvent.loaded, oEvent.total); + } + }; + } + + oXhr.onreadystatechange = function () { + if (4 === oXhr.readyState && 200 === oXhr.status) + { + if (fCompleteFunction) + { + var + bResult = false, + oResult = null + ; + + try + { + oResult = $.parseJSON(oXhr.responseText); + bResult = true; + } + catch (oException) + { + oResult = null; + } + + fCompleteFunction(sUid, bResult, oResult); + } + + if (!isUndefined(self.oXhrs[sUid])) + { + self.oXhrs[sUid] = null; + } + + fCallback(null, sUid); + } + else + { + if (4 === oXhr.readyState) + { + fCompleteFunction(sUid, false, null); + fCallback(null, sUid); + } + } + }; + + if (fStartFunction) + { + fStartFunction(sUid); + } + + oFormData.append('jua-post-type', 'ajax'); + oFormData.append(getValue(this.oOptions, 'name', 'juaFile'), oFileInfo['File']); + $.each(aHidden, function (sKey, sValue) { + oFormData.append(sKey, getStringOrCallFunction(sValue, [oFileInfo])); + }); + + oXhr.send(oFormData); + + this.oXhrs[sUid] = oXhr; + return true; + } + catch (oError) + { + } + + fCallback(null, sUid); + return false; + }; + + AjaxDriver.prototype.generateNewInput = function (oClickElement) + { + var + self = this, + oLabel = null, + oInput = null + ; + + if (oClickElement) + { + oInput = getNewInput('', !getValue(this.oOptions, 'disableMultiple', false)); + oLabel = createNextLabel(); + oLabel.append(oInput); + + $(oClickElement).append(oLabel); + + oInput + .on('click', function () { + var fOn = getValue(self.oOptions, 'onDialog', null); + if (fOn) + { + fOn(); + } + }) + .on('change', function () { + getDataFromInput(this, function (oFile) { + self.oJua.addNewFile(oFile); + self.generateNewInput(oClickElement); + + setTimeout(function () { + oLabel.remove(); + }, 10); + }, + getValue(self.oOptions, 'multipleSizeLimit', Jua.iDefLimit), + getValue(self.oOptions, 'onLimitReached', Jua.fEmptyFunction) + ); + }) + ; + } + }; + + AjaxDriver.prototype.cancel = function (sUid) + { + this.oUids[sUid] = false; + if (this.oXhrs[sUid]) + { + try + { + if (this.oXhrs[sUid].abort) + { + this.oXhrs[sUid].abort(); + } + } + catch (oError) + { + } + + this.oXhrs[sUid] = null; + } + }; + + /** + * @constructor + * @param {Jua} oJua + * @param {Object} oOptions + */ + function IframeDriver(oJua, oOptions) + { + this.oUids = {}; + this.oForms = {}; + this.oJua = oJua; + this.oOptions = oOptions; + } + + /** + * @type {Object} + */ + IframeDriver.prototype.oUids = {}; + + /** + * @type {Object} + */ + IframeDriver.prototype.oForms = {}; + + /** + * @type {?Jua} + */ + IframeDriver.prototype.oJua = null; + + /** + * @type {Object} + */ + IframeDriver.prototype.oOptions = {}; + + /** + * @return {boolean} + */ + IframeDriver.prototype.isDragAndDropSupported = function () + { + return false; + }; + + /** + * @param {string} sUid + */ + IframeDriver.prototype.regTaskUid = function (sUid) + { + this.oUids[sUid] = true; + }; + + + /** + * @param {string} sUid + * @param {?} oFileInfo + * @param {Function} fCallback + */ + IframeDriver.prototype.uploadTask = function (sUid, oFileInfo, fCallback) + { + if (false === this.oUids[sUid]) + { + fCallback(null, sUid); + return false; + } + + var + oForm = this.oForms[sUid], + aHidden = getValue(this.oOptions, 'hidden', {}), + fStartFunction = getValue(this.oOptions, 'onStart', null), + fCompleteFunction = getValue(this.oOptions, 'onComplete', null) + ; + + if (oForm) + { + oForm.append($('').attr('name', 'jua-post-type').val('iframe')); + $.each(aHidden, function (sKey, sValue) { + oForm.append($('').attr('name', sKey).val(getStringOrCallFunction(sValue, [oFileInfo]))); + }); + + oForm.trigger('submit'); + if (fStartFunction) + { + fStartFunction(sUid); + } + + oForm.find('iframe').on('load', function (oEvent) { + + var + bResult = false, + oIframeDoc = null, + oResult = {} + ; + + if (fCompleteFunction) + { + try + { + oIframeDoc = this.contentDocument ? this.contentDocument: this.contentWindow.document; + oResult = $.parseJSON(oIframeDoc.body.innerHTML); + bResult = true; + } + catch (oErr) + { + oResult = {}; + } + + fCompleteFunction(sUid, bResult, oResult); + } + + fCallback(null, sUid); + + window.setTimeout(function () { + oForm.remove(); + }, 100); + }); + } + else + { + fCallback(null, sUid); + } + + return true; + }; + + IframeDriver.prototype.generateNewInput = function (oClickElement) + { + var + self = this, + sUid = '', + oInput = null, + oIframe = null, + sAction = getValue(this.oOptions, 'action', ''), + oForm = null + ; + + if (oClickElement) + { + sUid = getNewUid(); + + oInput = getNewInput(getValue(this.oOptions, 'name', 'juaFile'), !getValue(this.oOptions, 'disableMultiple', false)); + + oForm = $('
    '); + + oIframe = $('
    ',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){m.types.push(N),w("BeforeChange",function(a,b,c){b!==c&&(b===N?P():c===N&&P(!0))}),w(b+"."+N,function(){P()})},getIframe:function(b,c){var d=b.src,e=m.st.iframe;a.each(e.patterns,function(){if(d.indexOf(this.index)>-1)return this.id&&(typeof this.id=="string"?d=d.substr(d.lastIndexOf(this.id)+this.id.length,d.length):d=this.id.call(this,d)),d=this.src.replace("%id%",d),!1});var f={};return e.srcAction&&(f[e.srcAction]=d),m._parseMarkup(c,f,b),m.updateStatus("ready"),c}}});var Q=function(a){var b=m.items.length;return a>b-1?a-b:a<0?b+a:a},R=function(a,b,c){return a.replace("%curr%",b+1).replace("%total%",c)};a.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var c=m.st.gallery,d=".mfp-gallery",h=Boolean(a.fn.mfpFastClick);m.direction=!0;if(!c||!c.enabled)return!1;u+=" mfp-gallery",w(f+d,function(){c.navigateByImgClick&&m.wrap.on("click"+d,".mfp-img",function(){if(m.items.length>1)return m.next(),!1}),s.on("keydown"+d,function(a){a.keyCode===37?m.prev():a.keyCode===39&&m.next()})}),w("UpdateStatus"+d,function(a,b){b.text&&(b.text=R(b.text,m.currItem.index,m.items.length))}),w(e+d,function(a,b,d,e){var f=m.items.length;d.counter=f>1?R(c.tCounter,e.index,f):""}),w("BuildControls"+d,function(){if(m.items.length>1&&c.arrows&&!m.arrowLeft){var b=c.arrowMarkup,d=m.arrowLeft=a(b.replace("%title%",c.tPrev).replace("%dir%","left")).addClass(l),e=m.arrowRight=a(b.replace("%title%",c.tNext).replace("%dir%","right")).addClass(l),f=h?"mfpFastClick":"click";d[f](function(){m.prev()}),e[f](function(){m.next()}),m.isIE7&&(x("b",d[0],!1,!0),x("a",d[0],!1,!0),x("b",e[0],!1,!0),x("a",e[0],!1,!0)),m.container.append(d.add(e))}}),w(g+d,function(){m._preloadTimeout&&clearTimeout(m._preloadTimeout),m._preloadTimeout=setTimeout(function(){m.preloadNearbyImages(),m._preloadTimeout=null},16)}),w(b+d,function(){s.off(d),m.wrap.off("click"+d),m.arrowLeft&&h&&m.arrowLeft.add(m.arrowRight).destroyMfpFastClick(),m.arrowRight=m.arrowLeft=null})},next:function(){m.direction=!0,m.index=Q(m.index+1),m.updateItemHTML()},prev:function(){m.direction=!1,m.index=Q(m.index-1),m.updateItemHTML()},goTo:function(a){m.direction=a>=m.index,m.index=a,m.updateItemHTML()},preloadNearbyImages:function(){var a=m.st.gallery.preload,b=Math.min(a[0],m.items.length),c=Math.min(a[1],m.items.length),d;for(d=1;d<=(m.direction?c:b);d++)m._preloadItem(m.index+d);for(d=1;d<=(m.direction?b:c);d++)m._preloadItem(m.index-d)},_preloadItem:function(b){b=Q(b);if(m.items[b].preloaded)return;var c=m.items[b];c.parsed||(c=m.parseEl(b)),y("LazyLoad",c),c.type==="image"&&(c.img=a('').on("load.mfploader",function(){c.hasSize=!0}).on("error.mfploader",function(){c.hasSize=!0,c.loadError=!0}).attr("src",c.src)),c.preloaded=!0}}});var S="retina";a.magnificPopup.registerModule(S,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=m.st.retina,b=a.ratio;b=isNaN(b)?b():b,b>1&&(w("ImageHasSize."+S,function(a,c){c.img.css({"max-width":c.img[0].naturalWidth/b,width:"100%"})}),w("ElementParse."+S,function(c,d){d.src=a.replaceSrc(d,b)}))}}}}),function(){var b=1e3,c="ontouchstart"in window,d=function(){q.off("touchmove"+f+" touchend"+f)},e="mfpFastClick",f="."+e;a.fn.mfpFastClick=function(e){return a(this).each(function(){var g=a(this),h;if(c){var i,j,k,l,m,n;g.on("touchstart"+f,function(a){l=!1,n=1,m=a.originalEvent?a.originalEvent.touches[0]:a.touches[0],j=m.clientX,k=m.clientY,q.on("touchmove"+f,function(a){m=a.originalEvent?a.originalEvent.touches:a.touches,n=m.length,m=m[0];if(Math.abs(m.clientX-j)>10||Math.abs(m.clientY-k)>10)l=!0,d()}).on("touchend"+f,function(a){d();if(l||n>1)return;h=!0,a.preventDefault(),clearTimeout(i),i=setTimeout(function(){h=!1},b),e()})})}g.on("click"+f,function(){h||e()})})},a.fn.destroyMfpFastClick=function(){a(this).off("touchstart"+f+" click"+f),c&&q.off("touchmove"+f+" touchend"+f)}}()})(window.jQuery||window.Zepto); \ No newline at end of file diff --git a/vendors/modernizr.js b/vendors/modernizr.js new file mode 100644 index 000000000..655f2d5cd --- /dev/null +++ b/vendors/modernizr.js @@ -0,0 +1,4 @@ +/* Modernizr 2.6.2 (Custom Build) | MIT & BSD + * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-svg-touch-shiv-cssclasses-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-fullscreen_api + */ +;window.Modernizr=function(a,b,c){function C(a){j.cssText=a}function D(a,b){return C(n.join(a+";")+(b||""))}function E(a,b){return typeof a===b}function F(a,b){return!!~(""+a).indexOf(b)}function G(a,b){for(var d in a){var e=a[d];if(!F(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function H(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:E(f,"function")?f.bind(d||b):f}return!1}function I(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return E(b,"string")||E(b,"undefined")?G(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),H(e,b,c))}function J(){e.input=function(c){for(var d=0,e=c.length;d',a,""].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=E(e[d],"function"),E(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),A={}.hasOwnProperty,B;!E(A,"undefined")&&!E(A.call,"undefined")?B=function(a,b){return A.call(a,b)}:B=function(a,b){return b in a&&E(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return I("flexWrap")},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!I("indexedDB",a)},s.hashchange=function(){return z("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return C("background-color:rgba(150,255,150,.5)"),F(j.backgroundColor,"rgba")},s.hsla=function(){return C("background-color:hsla(120,40%,100%,.5)"),F(j.backgroundColor,"rgba")||F(j.backgroundColor,"hsla")},s.multiplebgs=function(){return C("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return I("backgroundSize")},s.borderimage=function(){return I("borderImage")},s.borderradius=function(){return I("borderRadius")},s.boxshadow=function(){return I("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return D("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return I("animationName")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return C((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),F(j.backgroundImage,"gradient")},s.cssreflections=function(){return I("boxReflect")},s.csstransforms=function(){return!!I("transform")},s.csstransforms3d=function(){var a=!!I("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return I("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect};for(var K in s)B(s,K)&&(x=K.toLowerCase(),e[x]=s[K](),v.push((e[x]?"":"no-")+x));return e.input||J(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)B(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},C(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.hasEvent=z,e.testProp=function(a){return G([a])},e.testAllProps=I,e.testStyles=y,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),Modernizr.addTest("fullscreen",function(){for(var a=0;a` and submit the pull request to the `develop` branch. + +Pull requests for enhancements for features should be submitted to the `develop` branch as well. + +When submitting a bugfix, please check if there is an existing bugfix branch. If the latest stable version is `1.5.0`, the bugfix branch would be `hotfix/1.5.1`. All pull requests for bug fixes should be on a `hotfix` branch, unless the bug fix depends on a new feature. + +The `master` branch should always have the latest stable version. When bugfix or minor releases are needed, the develop/hotfix branch will be merged into master and released. + diff --git a/vendors/moment/LICENSE b/vendors/moment/LICENSE new file mode 100644 index 000000000..b44e3a68c --- /dev/null +++ b/vendors/moment/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2011-2013 Tim Wood, Iskren Chernev, Moment.js contributors + +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. diff --git a/vendors/moment/bower.json b/vendors/moment/bower.json new file mode 100644 index 000000000..4d5d304b7 --- /dev/null +++ b/vendors/moment/bower.json @@ -0,0 +1,20 @@ +{ + "name": "moment", + "version": "2.3.1", + "main": "moment.js", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests", + "tasks", + "component.json", + "composer.json", + "CONTRIBUTING.md", + "ender.js", + "Gruntfile.js", + "package.js", + "package.json" + ] +} diff --git a/vendors/moment/component.json b/vendors/moment/component.json new file mode 100644 index 000000000..a7a4bf4a3 --- /dev/null +++ b/vendors/moment/component.json @@ -0,0 +1,72 @@ +{ + "name": "moment", + "version": "2.3.1", + "main": "moment.js", + "description": "Parse, validate, manipulate, and display dates in javascript.", + "files": [ + "moment.js", + "lang/ar-ma.js", + "lang/ar.js", + "lang/bg.js", + "lang/br.js", + "lang/bs.js", + "lang/ca.js", + "lang/cs.js", + "lang/cv.js", + "lang/da.js", + "lang/de.js", + "lang/el.js", + "lang/en-au.js", + "lang/en-ca.js", + "lang/en-gb.js", + "lang/eo.js", + "lang/es.js", + "lang/et.js", + "lang/eu.js", + "lang/fa.js", + "lang/fi.js", + "lang/fr-ca.js", + "lang/fr.js", + "lang/gl.js", + "lang/he.js", + "lang/hi.js", + "lang/hr.js", + "lang/hu.js", + "lang/id.js", + "lang/is.js", + "lang/it.js", + "lang/ja.js", + "lang/ka.js", + "lang/ko.js", + "lang/lt.js", + "lang/lv.js", + "lang/ml.js", + "lang/mr.js", + "lang/ms-my.js", + "lang/nb.js", + "lang/ne.js", + "lang/nl.js", + "lang/nn.js", + "lang/pl.js", + "lang/pt-br.js", + "lang/pt.js", + "lang/ro.js", + "lang/ru.js", + "lang/sk.js", + "lang/sl.js", + "lang/sq.js", + "lang/sv.js", + "lang/th.js", + "lang/tr.js", + "lang/tzm-la.js", + "lang/tzm.js", + "lang/uk.js", + "lang/uz.js", + "lang/vn.js", + "lang/zh-cn.js", + "lang/zh-tw.js" + ], + "scripts": [ + "moment.js" + ] +} \ No newline at end of file diff --git a/vendors/moment/composer.json b/vendors/moment/composer.json new file mode 100644 index 000000000..10be06085 --- /dev/null +++ b/vendors/moment/composer.json @@ -0,0 +1,18 @@ +{ + "name": "moment/moment", + "description": "Parse, validate, manipulate, and display dates in javascript.", + "keywords": [ + "moment", + "date", + "time", + "parse", + "format", + "validate", + "i18n", + "l10n", + "ender" + ], + "homepage": "http://github.com/moment/moment/", + "author": "Tim Wood (http://timwoodcreates.com/)", + "license": "MIT" +} diff --git a/vendors/moment/lang/ar-ma.js b/vendors/moment/lang/ar-ma.js new file mode 100644 index 000000000..1c159f102 --- /dev/null +++ b/vendors/moment/lang/ar-ma.js @@ -0,0 +1,56 @@ +// moment.js language configuration +// language : Moroccan Arabic (ar-ma) +// author : ElFadili Yassine : https://github.com/ElFadiliY +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ar-ma', { + months : "يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"), + monthsShort : "يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"), + weekdays : "الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"), + weekdaysShort : "احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"), + weekdaysMin : "Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[اليوم على الساعة] LT", + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : "ÙÙŠ %s", + past : "منذ %s", + s : "ثوان", + m : "دقيقة", + mm : "%d دقائق", + h : "ساعة", + hh : "%d ساعات", + d : "يوم", + dd : "%d أيام", + M : "شهر", + MM : "%d أشهر", + y : "سنة", + yy : "%d سنوات" + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/ar.js b/vendors/moment/lang/ar.js new file mode 100644 index 000000000..6e27d29a9 --- /dev/null +++ b/vendors/moment/lang/ar.js @@ -0,0 +1,56 @@ +// moment.js language configuration +// language : Arabic (ar) +// author : Abdel Said : https://github.com/abdelsaid +// changes in months, weekdays : Ahmed Elkhatib + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ar', { + months : "يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"), + monthsShort : "يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"), + weekdays : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"), + weekdaysShort : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"), + weekdaysMin : "Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[اليوم على الساعة] LT", + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : "ÙÙŠ %s", + past : "منذ %s", + s : "ثوان", + m : "دقيقة", + mm : "%d دقائق", + h : "ساعة", + hh : "%d ساعات", + d : "يوم", + dd : "%d أيام", + M : "شهر", + MM : "%d أشهر", + y : "سنة", + yy : "%d سنوات" + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/bg.js b/vendors/moment/lang/bg.js new file mode 100644 index 000000000..f47ed65a9 --- /dev/null +++ b/vendors/moment/lang/bg.js @@ -0,0 +1,86 @@ +// moment.js language configuration +// language : bulgarian (bg) +// author : Krasen Borisov : https://github.com/kraz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('bg', { + months : "Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"), + monthsShort : "Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"), + weekdays : "неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"), + weekdaysShort : "нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"), + weekdaysMin : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + longDateFormat : { + LT : "H:mm", + L : "D.MM.YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Ð’ изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Ð’ изминалиÑ] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : "Ñлед %s", + past : "преди %s", + s : "нÑколко Ñекунди", + m : "минута", + mm : "%d минути", + h : "чаÑ", + hh : "%d чаÑа", + d : "ден", + dd : "%d дни", + M : "меÑец", + MM : "%d меÑеца", + y : "година", + yy : "%d години" + }, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/br.js b/vendors/moment/lang/br.js new file mode 100644 index 000000000..39c60df07 --- /dev/null +++ b/vendors/moment/lang/br.js @@ -0,0 +1,107 @@ +// moment.js language configuration +// language : breton (br) +// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': "munutenn", + 'MM': "miz", + 'dd': "devezh" + }; + return number + ' ' + mutation(format[key], number); + } + + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + return moment.lang('br', { + months : "Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"), + monthsShort : "Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"), + weekdays : "Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"), + weekdaysShort : "Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"), + weekdaysMin : "Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"), + longDateFormat : { + LT : "h[e]mm A", + L : "DD/MM/YYYY", + LL : "D [a viz] MMMM YYYY", + LLL : "D [a viz] MMMM YYYY LT", + LLLL : "dddd, D [a viz] MMMM YYYY LT" + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : "a-benn %s", + past : "%s 'zo", + s : "un nebeud segondennoù", + m : "ur vunutenn", + mm : relativeTimeWithMutation, + h : "un eur", + hh : "%d eur", + d : "un devezh", + dd : relativeTimeWithMutation, + M : "ur miz", + MM : relativeTimeWithMutation, + y : "ur bloaz", + yy : specialMutationForYears + }, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/bs.js b/vendors/moment/lang/bs.js new file mode 100644 index 000000000..83a9b4c07 --- /dev/null +++ b/vendors/moment/lang/bs.js @@ -0,0 +1,139 @@ +// moment.js language configuration +// language : bosnian (bs) +// author : Nedim Cholich : https://github.com/frontyard +// based on (hr) translation by Bojan Marković + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + + function translate(number, withoutSuffix, key) { + var result = number + " "; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.lang('bs', { + months : "januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"), + monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"), + weekdays : "nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"), + weekdaysShort : "ned._pon._uto._sri._Äet._pet._sub.".split("_"), + weekdaysMin : "ne_po_ut_sr_Äe_pe_su".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD. MM. YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : "za %s", + past : "prije %s", + s : "par sekundi", + m : translate, + mm : translate, + h : translate, + hh : translate, + d : "dan", + dd : translate, + M : "mjesec", + MM : translate, + y : "godinu", + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/ca.js b/vendors/moment/lang/ca.js new file mode 100644 index 000000000..f0cc02167 --- /dev/null +++ b/vendors/moment/lang/ca.js @@ -0,0 +1,66 @@ +// moment.js language configuration +// language : catalan (ca) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ca', { + months : "Gener_Febrer_Març_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre".split("_"), + monthsShort : "Gen._Febr._Mar._Abr._Mai._Jun._Jul._Ag._Set._Oct._Nov._Des.".split("_"), + weekdays : "Diumenge_Dilluns_Dimarts_Dimecres_Dijous_Divendres_Dissabte".split("_"), + weekdaysShort : "Dg._Dl._Dt._Dc._Dj._Dv._Ds.".split("_"), + weekdaysMin : "Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : "en %s", + past : "fa %s", + s : "uns segons", + m : "un minut", + mm : "%d minuts", + h : "una hora", + hh : "%d hores", + d : "un dia", + dd : "%d dies", + M : "un mes", + MM : "%d mesos", + y : "un any", + yy : "%d anys" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/cs.js b/vendors/moment/lang/cs.js new file mode 100644 index 000000000..c1396cfbf --- /dev/null +++ b/vendors/moment/lang/cs.js @@ -0,0 +1,155 @@ +// moment.js language configuration +// language : czech (cs) +// author : petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var months = "leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"), + monthsShort = "led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_"); + + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + " "; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár vteÅ™in' : 'pár vteÅ™inami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); + } else { + return result + 'mÄ›síci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + return moment.lang('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : "nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"), + weekdaysShort : "ne_po_út_st_Ät_pá_so".split("_"), + weekdaysMin : "ne_po_út_st_Ät_pá_so".split("_"), + longDateFormat : { + LT: "H:mm", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd D. MMMM YYYY LT" + }, + calendar : { + sameDay: "[dnes v] LT", + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedÄ›li v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve stÅ™edu v] LT'; + case 4: + return '[ve Ätvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[vÄera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou nedÄ›li v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou stÅ™edu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: "L" + }, + relativeTime : { + future : "za %s", + past : "pÅ™ed %s", + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/cv.js b/vendors/moment/lang/cv.js new file mode 100644 index 000000000..a5812deba --- /dev/null +++ b/vendors/moment/lang/cv.js @@ -0,0 +1,59 @@ +// moment.js language configuration +// language : chuvash (cv) +// author : Anatoly Mironov : https://github.com/mirontoli + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('cv', { + months : "кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"), + monthsShort : "кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"), + weekdays : "вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"), + weekdaysShort : "выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"), + weekdaysMin : "вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD-MM-YYYY", + LL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]", + LLL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT", + LLLL : "dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT" + }, + calendar : { + sameDay: '[ПаÑн] LT [Ñехетре]', + nextDay: '[Ыран] LT [Ñехетре]', + lastDay: '[Ĕнер] LT [Ñехетре]', + nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', + lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /Ñехет$/i.exec(output) ? "рен" : /çул$/i.exec(output) ? "тан" : "ран"; + return output + affix; + }, + past : "%s каÑлла", + s : "пĕр-ик çеккунт", + m : "пĕр минут", + mm : "%d минут", + h : "пĕр Ñехет", + hh : "%d Ñехет", + d : "пĕр кун", + dd : "%d кун", + M : "пĕр уйăх", + MM : "%d уйăх", + y : "пĕр çул", + yy : "%d çул" + }, + ordinal : '%d-мĕш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/da.js b/vendors/moment/lang/da.js new file mode 100644 index 000000000..2fa8244c0 --- /dev/null +++ b/vendors/moment/lang/da.js @@ -0,0 +1,56 @@ +// moment.js language configuration +// language : danish (da) +// author : Ulrik Nielsen : https://github.com/mrbase + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('da', { + months : "januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"), + monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"), + weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"), + weekdaysShort : "søn_man_tir_ons_tor_fre_lør".split("_"), + weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D. MMMM, YYYY LT" + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I gÃ¥r kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : "om %s", + past : "%s siden", + s : "fÃ¥ sekunder", + m : "et minut", + mm : "%d minutter", + h : "en time", + hh : "%d timer", + d : "en dag", + dd : "%d dage", + M : "en mÃ¥ned", + MM : "%d mÃ¥neder", + y : "et Ã¥r", + yy : "%d Ã¥r" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/de.js b/vendors/moment/lang/de.js new file mode 100644 index 000000000..988f32882 --- /dev/null +++ b/vendors/moment/lang/de.js @@ -0,0 +1,71 @@ +// moment.js language configuration +// language : german (de) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.lang('de', { + months : "Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"), + monthsShort : "Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"), + weekdays : "Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"), + weekdaysShort : "So._Mo._Di._Mi._Do._Fr._Sa.".split("_"), + weekdaysMin : "So_Mo_Di_Mi_Do_Fr_Sa".split("_"), + longDateFormat : { + LT: "H:mm [Uhr]", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay: "[Heute um] LT", + sameElse: "L", + nextDay: '[Morgen um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gestern um] LT', + lastWeek: '[letzten] dddd [um] LT' + }, + relativeTime : { + future : "in %s", + past : "vor %s", + s : "ein paar Sekunden", + m : processRelativeTime, + mm : "%d Minuten", + h : processRelativeTime, + hh : "%d Stunden", + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/el.js b/vendors/moment/lang/el.js new file mode 100644 index 000000000..9dfea239d --- /dev/null +++ b/vendors/moment/lang/el.js @@ -0,0 +1,79 @@ +// moment.js language configuration +// language : modern greek (el) +// author : Aggelos Karalias : https://github.com/mehiel + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('el', { + monthsNominativeEl : "ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"), + monthsGenitiveEl : "ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf("MMMM")))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : "Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"), + weekdays : "ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"), + weekdaysShort : "ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"), + weekdaysMin : "Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + longDateFormat : { + LT : "h:mm A", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendarEl : { + sameDay : '[ΣήμεÏα {}] LT', + nextDay : '[ΑÏÏιο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : '[την Ï€ÏοηγοÏμενη] dddd [{}] LT', + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + + return output.replace("{}", (hours % 12 === 1 ? "στη" : "στις")); + }, + relativeTime : { + future : "σε %s", + past : "%s Ï€Ïιν", + s : "δευτεÏόλεπτα", + m : "ένα λεπτό", + mm : "%d λεπτά", + h : "μία ÏŽÏα", + hh : "%d ÏŽÏες", + d : "μία μέÏα", + dd : "%d μέÏες", + M : "ένας μήνας", + MM : "%d μήνες", + y : "ένας χÏόνος", + yy : "%d χÏόνια" + }, + ordinal : function (number) { + return number + 'η'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/en-au.js b/vendors/moment/lang/en-au.js new file mode 100644 index 000000000..4d91e2569 --- /dev/null +++ b/vendors/moment/lang/en-au.js @@ -0,0 +1,62 @@ +// moment.js language configuration +// language : australian english (en-au) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('en-au', { + months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + longDateFormat : { + LT : "h:mm A", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + ordinal : function (number) { + var b = number % 10, + output = (~~ (number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/en-ca.js b/vendors/moment/lang/en-ca.js new file mode 100644 index 000000000..a97e9f396 --- /dev/null +++ b/vendors/moment/lang/en-ca.js @@ -0,0 +1,59 @@ +// moment.js language configuration +// language : canadian english (en-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('en-ca', { + months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + longDateFormat : { + LT : "h:mm A", + L : "YYYY-MM-DD", + LL : "D MMMM, YYYY", + LLL : "D MMMM, YYYY LT", + LLLL : "dddd, D MMMM, YYYY LT" + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + ordinal : function (number) { + var b = number % 10, + output = (~~ (number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); +})); diff --git a/vendors/moment/lang/en-gb.js b/vendors/moment/lang/en-gb.js new file mode 100644 index 000000000..3a7907be5 --- /dev/null +++ b/vendors/moment/lang/en-gb.js @@ -0,0 +1,63 @@ +// moment.js language configuration +// language : great britain english (en-gb) +// author : Chris Gedrim : https://github.com/chrisgedrim + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('en-gb', { + months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + ordinal : function (number) { + var b = number % 10, + output = (~~ (number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/eo.js b/vendors/moment/lang/eo.js new file mode 100644 index 000000000..03b1abff1 --- /dev/null +++ b/vendors/moment/lang/eo.js @@ -0,0 +1,65 @@ +// moment.js language configuration +// language : esperanto (eo) +// author : Colin Dean : https://github.com/colindean +// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. +// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('eo', { + months : "januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"), + monthsShort : "jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"), + weekdays : "Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"), + weekdaysShort : "Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"), + weekdaysMin : "Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "D[-an de] MMMM, YYYY", + LLL : "D[-an de] MMMM, YYYY LT", + LLLL : "dddd, [la] D[-an de] MMMM, YYYY LT" + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[HodiaÅ­ je] LT', + nextDay : '[MorgaÅ­ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[HieraÅ­ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : "je %s", + past : "antaÅ­ %s", + s : "sekundoj", + m : "minuto", + mm : "%d minutoj", + h : "horo", + hh : "%d horoj", + d : "tago",//ne 'diurno', ĉar estas uzita por proksimumo + dd : "%d tagoj", + M : "monato", + MM : "%d monatoj", + y : "jaro", + yy : "%d jaroj" + }, + ordinal : "%da", + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/es.js b/vendors/moment/lang/es.js new file mode 100644 index 000000000..0a38396d3 --- /dev/null +++ b/vendors/moment/lang/es.js @@ -0,0 +1,66 @@ +// moment.js language configuration +// language : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('es', { + months : "enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"), + monthsShort : "ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"), + weekdays : "domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"), + weekdaysShort : "dom._lun._mar._mié._jue._vie._sáb.".split("_"), + weekdaysMin : "Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D [de] MMMM [de] YYYY", + LLL : "D [de] MMMM [de] YYYY LT", + LLLL : "dddd, D [de] MMMM [de] YYYY LT" + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : "en %s", + past : "hace %s", + s : "unos segundos", + m : "un minuto", + mm : "%d minutos", + h : "una hora", + hh : "%d horas", + d : "un día", + dd : "%d días", + M : "un mes", + MM : "%d meses", + y : "un año", + yy : "%d años" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/et.js b/vendors/moment/lang/et.js new file mode 100644 index 000000000..6dacb77c4 --- /dev/null +++ b/vendors/moment/lang/et.js @@ -0,0 +1,60 @@ +// moment.js language configuration +// language : estonian (et) +// author : Henry Kehlmann : https://github.com/madhenry + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function translateSeconds(number, withoutSuffix, key, isFuture) { + return (isFuture || withoutSuffix) ? 'paari sekundi' : 'paar sekundit'; + } + + return moment.lang('et', { + months : "jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"), + monthsShort : "jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"), + weekdays : "pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"), + weekdaysShort : "P_E_T_K_N_R_L".split("_"), + weekdaysMin : "P_E_T_K_N_R_L".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s pärast", + past : "%s tagasi", + s : translateSeconds, + m : "minut", + mm : "%d minutit", + h : "tund", + hh : "%d tundi", + d : "päev", + dd : "%d päeva", + M : "kuu", + MM : "%d kuud", + y : "aasta", + yy : "%d aastat" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/eu.js b/vendors/moment/lang/eu.js new file mode 100644 index 000000000..659b739bf --- /dev/null +++ b/vendors/moment/lang/eu.js @@ -0,0 +1,60 @@ +// moment.js language configuration +// language : euskara (eu) +// author : Eneko Illarramendi : https://github.com/eillarra + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('eu', { + months : "urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"), + monthsShort : "urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"), + weekdays : "igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"), + weekdaysShort : "ig._al._ar._az._og._ol._lr.".split("_"), + weekdaysMin : "ig_al_ar_az_og_ol_lr".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "YYYY[ko] MMMM[ren] D[a]", + LLL : "YYYY[ko] MMMM[ren] D[a] LT", + LLLL : "dddd, YYYY[ko] MMMM[ren] D[a] LT", + l : "YYYY-M-D", + ll : "YYYY[ko] MMM D[a]", + lll : "YYYY[ko] MMM D[a] LT", + llll : "ddd, YYYY[ko] MMM D[a] LT" + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : "%s barru", + past : "duela %s", + s : "segundo batzuk", + m : "minutu bat", + mm : "%d minutu", + h : "ordu bat", + hh : "%d ordu", + d : "egun bat", + dd : "%d egun", + M : "hilabete bat", + MM : "%d hilabete", + y : "urte bat", + yy : "%d urte" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/fa.js b/vendors/moment/lang/fa.js new file mode 100644 index 000000000..4a690c407 --- /dev/null +++ b/vendors/moment/lang/fa.js @@ -0,0 +1,97 @@ +// moment.js language configuration +// language : Persian Language +// author : Ebrahim Byagowi : https://github.com/ebraminio + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var symbolMap = { + '1': 'Û±', + '2': 'Û²', + '3': 'Û³', + '4': 'Û´', + '5': 'Ûµ', + '6': 'Û¶', + '7': 'Û·', + '8': 'Û¸', + '9': 'Û¹', + '0': 'Û°' + }, numberMap = { + 'Û±': '1', + 'Û²': '2', + 'Û³': '3', + 'Û´': '4', + 'Ûµ': '5', + 'Û¶': '6', + 'Û·': '7', + 'Û¸': '8', + 'Û¹': '9', + 'Û°': '0' + }; + + return moment.lang('fa', { + months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), + longDateFormat : { + LT : 'HH:mm', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return "قبل از ظهر"; + } else { + return "بعد از ظهر"; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[Ùردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[Û°-Û¹]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + ordinal : '%dÙ…', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/fi.js b/vendors/moment/lang/fi.js new file mode 100644 index 000000000..18529c10d --- /dev/null +++ b/vendors/moment/lang/fi.js @@ -0,0 +1,103 @@ +// moment.js language configuration +// language : finnish (fi) +// author : Tarmo Aidantausta : https://github.com/bleadof + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var numbers_past = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbers_future = ['nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbers_past[7], numbers_past[8], numbers_past[9]]; + + function translate(number, withoutSuffix, key, isFuture) { + var result = ""; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbal_number(number, isFuture) + " " + result; + return result; + } + + function verbal_number(number, isFuture) { + return number < 10 ? (isFuture ? numbers_future[number] : numbers_past[number]) : number; + } + + return moment.lang('fi', { + months : "tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"), + monthsShort : "tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"), + weekdays : "sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"), + weekdaysShort : "su_ma_ti_ke_to_pe_la".split("_"), + weekdaysMin : "su_ma_ti_ke_to_pe_la".split("_"), + longDateFormat : { + LT : "HH.mm", + L : "DD.MM.YYYY", + LL : "Do MMMM[ta] YYYY", + LLL : "Do MMMM[ta] YYYY, [klo] LT", + LLLL : "dddd, Do MMMM[ta] YYYY, [klo] LT", + l : "D.M.YYYY", + ll : "Do MMM YYYY", + lll : "Do MMM YYYY, [klo] LT", + llll : "ddd, Do MMM YYYY, [klo] LT" + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s päästä", + past : "%s sitten", + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : "%d.", + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/fr-ca.js b/vendors/moment/lang/fr-ca.js new file mode 100644 index 000000000..3280d7945 --- /dev/null +++ b/vendors/moment/lang/fr-ca.js @@ -0,0 +1,54 @@ +// moment.js language configuration +// language : canadian french (fr-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('fr-ca', { + months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"), + monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"), + weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"), + weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"), + weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[Aujourd'hui à] LT", + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : "dans %s", + past : "il y a %s", + s : "quelques secondes", + m : "une minute", + mm : "%d minutes", + h : "une heure", + hh : "%d heures", + d : "un jour", + dd : "%d jours", + M : "un mois", + MM : "%d mois", + y : "un an", + yy : "%d ans" + }, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + } + }); +})); diff --git a/vendors/moment/lang/fr.js b/vendors/moment/lang/fr.js new file mode 100644 index 000000000..6b3dc526e --- /dev/null +++ b/vendors/moment/lang/fr.js @@ -0,0 +1,58 @@ +// moment.js language configuration +// language : french (fr) +// author : John Fischer : https://github.com/jfroffice + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('fr', { + months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"), + monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"), + weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"), + weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"), + weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[Aujourd'hui à] LT", + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : "dans %s", + past : "il y a %s", + s : "quelques secondes", + m : "une minute", + mm : "%d minutes", + h : "une heure", + hh : "%d heures", + d : "un jour", + dd : "%d jours", + M : "un mois", + MM : "%d mois", + y : "un an", + yy : "%d ans" + }, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/gl.js b/vendors/moment/lang/gl.js new file mode 100644 index 000000000..8b141278e --- /dev/null +++ b/vendors/moment/lang/gl.js @@ -0,0 +1,71 @@ +// moment.js language configuration +// language : galician (gl) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('gl', { + months : "Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"), + monthsShort : "Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"), + weekdays : "Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"), + weekdaysShort : "Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"), + weekdaysMin : "Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === "uns segundos") { + return "nuns segundos"; + } + return "en " + str; + }, + past : "hai %s", + s : "uns segundos", + m : "un minuto", + mm : "%d minutos", + h : "unha hora", + hh : "%d horas", + d : "un día", + dd : "%d días", + M : "un mes", + MM : "%d meses", + y : "un ano", + yy : "%d anos" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/he.js b/vendors/moment/lang/he.js new file mode 100644 index 000000000..b85dbe858 --- /dev/null +++ b/vendors/moment/lang/he.js @@ -0,0 +1,77 @@ +// moment.js language configuration +// language : Hebrew (he) +// author : Tomer Cohen : https://github.com/tomer +// author : Moshe Simantov : https://github.com/DevelopmentIL +// author : Tal Ater : https://github.com/TalAter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('he', { + months : "ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"), + monthsShort : "ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"), + weekdays : "ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"), + weekdaysShort : "×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"), + weekdaysMin : "×_ב_×’_ד_×”_ו_ש".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D [ב]MMMM YYYY", + LLL : "D [ב]MMMM YYYY LT", + LLLL : "dddd, D [ב]MMMM YYYY LT", + l : "D/M/YYYY", + ll : "D MMM YYYY", + lll : "D MMM YYYY LT", + llll : "ddd, D MMM YYYY LT" + }, + calendar : { + sameDay : '[×”×™×•× ×‘Ö¾]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[×תמול ב־]LT', + lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : "בעוד %s", + past : "לפני %s", + s : "מספר שניות", + m : "דקה", + mm : "%d דקות", + h : "שעה", + hh : function (number) { + if (number === 2) { + return "שעתיי×"; + } + return number + " שעות"; + }, + d : "יו×", + dd : function (number) { + if (number === 2) { + return "יומיי×"; + } + return number + " ימי×"; + }, + M : "חודש", + MM : function (number) { + if (number === 2) { + return "חודשיי×"; + } + return number + " חודשי×"; + }, + y : "שנה", + yy : function (number) { + if (number === 2) { + return "שנתיי×"; + } + return number + " שני×"; + } + } + }); +})); diff --git a/vendors/moment/lang/hi.js b/vendors/moment/lang/hi.js new file mode 100644 index 000000000..8e6e99c19 --- /dev/null +++ b/vendors/moment/lang/hi.js @@ -0,0 +1,105 @@ +// moment.js language configuration +// language : hindi (hi) +// author : Mayank Singhal : https://github.com/mayanksinghal + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.lang('hi', { + months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split("_"), + monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split("_"), + weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split("_"), + weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split("_"), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split("_"), + longDateFormat : { + LT : "A h:mm बजे", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY, LT", + LLLL : "dddd, D MMMM YYYY, LT" + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s में", + past : "%s पहले", + s : "कà¥à¤› ही कà¥à¤·à¤£", + m : "à¤à¤• मिनट", + mm : "%d मिनट", + h : "à¤à¤• घंटा", + hh : "%d घंटे", + d : "à¤à¤• दिन", + dd : "%d दिन", + M : "à¤à¤• महीने", + MM : "%d महीने", + y : "à¤à¤• वरà¥à¤·", + yy : "%d वरà¥à¤·" + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return "रात"; + } else if (hour < 10) { + return "सà¥à¤¬à¤¹"; + } else if (hour < 17) { + return "दोपहर"; + } else if (hour < 20) { + return "शाम"; + } else { + return "रात"; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/hr.js b/vendors/moment/lang/hr.js new file mode 100644 index 000000000..2e3bf1128 --- /dev/null +++ b/vendors/moment/lang/hr.js @@ -0,0 +1,140 @@ +// moment.js language configuration +// language : hrvatski (hr) +// author : Bojan Marković : https://github.com/bmarkovic + +// based on (sl) translation by Robert SedovÅ¡ek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + + function translate(number, withoutSuffix, key) { + var result = number + " "; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.lang('hr', { + months : "sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"), + monthsShort : "sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"), + weekdays : "nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"), + weekdaysShort : "ned._pon._uto._sri._Äet._pet._sub.".split("_"), + weekdaysMin : "ne_po_ut_sr_Äe_pe_su".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD. MM. YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : "za %s", + past : "prije %s", + s : "par sekundi", + m : translate, + mm : translate, + h : translate, + hh : translate, + d : "dan", + dd : translate, + M : "mjesec", + MM : translate, + y : "godinu", + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/hu.js b/vendors/moment/lang/hu.js new file mode 100644 index 000000000..4d84ebdf6 --- /dev/null +++ b/vendors/moment/lang/hu.js @@ -0,0 +1,98 @@ +// moment.js language configuration +// language : hungarian (hu) +// author : Adam Brunner : https://github.com/adambrunner + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); + + function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + + return ''; + } + + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + return moment.lang('hu', { + months : "január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"), + monthsShort : "jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"), + weekdays : "vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"), + weekdaysShort : "vas_hét_kedd_sze_csüt_pén_szo".split("_"), + weekdaysMin : "v_h_k_sze_cs_p_szo".split("_"), + longDateFormat : { + LT : "H:mm", + L : "YYYY.MM.DD.", + LL : "YYYY. MMMM D.", + LLL : "YYYY. MMMM D., LT", + LLLL : "YYYY. MMMM D., dddd LT" + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : "%s múlva", + past : "%s", + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/id.js b/vendors/moment/lang/id.js new file mode 100644 index 000000000..f186280d8 --- /dev/null +++ b/vendors/moment/lang/id.js @@ -0,0 +1,67 @@ +// moment.js language configuration +// language : Bahasa Indonesia (id) +// author : Mohammad Satrio Utomo : https://github.com/tyok +// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('id', { + months : "Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"), + monthsShort : "Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"), + weekdays : "Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"), + weekdaysShort : "Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"), + weekdaysMin : "Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"), + longDateFormat : { + LT : "HH.mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY [pukul] LT", + LLLL : "dddd, D MMMM YYYY [pukul] LT" + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : "dalam %s", + past : "%s yang lalu", + s : "beberapa detik", + m : "semenit", + mm : "%d menit", + h : "sejam", + hh : "%d jam", + d : "sehari", + dd : "%d hari", + M : "sebulan", + MM : "%d bulan", + y : "setahun", + yy : "%d tahun" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/is.js b/vendors/moment/lang/is.js new file mode 100644 index 000000000..5b6b2a821 --- /dev/null +++ b/vendors/moment/lang/is.js @@ -0,0 +1,124 @@ +// moment.js language configuration +// language : icelandic (is) +// author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + " "; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + return moment.lang('is', { + months : "janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"), + monthsShort : "jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"), + weekdays : "sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"), + weekdaysShort : "sun_mán_þri_mið_fim_fös_lau".split("_"), + weekdaysMin : "Su_Má_Þr_Mi_Fi_Fö_La".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY [kl.] LT", + LLLL : "dddd, D. MMMM YYYY [kl.] LT" + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : "eftir %s", + past : "fyrir %s síðan", + s : translate, + m : translate, + mm : translate, + h : "klukkustund", + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/it.js b/vendors/moment/lang/it.js new file mode 100644 index 000000000..5b8a99fb1 --- /dev/null +++ b/vendors/moment/lang/it.js @@ -0,0 +1,59 @@ +// moment.js language configuration +// language : italian (it) +// author : Lorenzo : https://github.com/aliem +// author: Mattia Larentis: https://github.com/nostalgiaz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('it', { + months : "Gennaio_Febbraio_Marzo_Aprile_Maggio_Giugno_Luglio_Agosto_Settembre_Ottobre_Novembre_Dicembre".split("_"), + monthsShort : "Gen_Feb_Mar_Apr_Mag_Giu_Lug_Ago_Set_Ott_Nov_Dic".split("_"), + weekdays : "Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"), + weekdaysShort : "Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"), + weekdaysMin : "D_L_Ma_Me_G_V_S".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: '[lo scorso] dddd [alle] LT', + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? "tra" : "in") + " " + s; + }, + past : "%s fa", + s : "secondi", + m : "un minuto", + mm : "%d minuti", + h : "un'ora", + hh : "%d ore", + d : "un giorno", + dd : "%d giorni", + M : "un mese", + MM : "%d mesi", + y : "un anno", + yy : "%d anni" + }, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/ja.js b/vendors/moment/lang/ja.js new file mode 100644 index 000000000..9cd7e9e98 --- /dev/null +++ b/vendors/moment/lang/ja.js @@ -0,0 +1,58 @@ +// moment.js language configuration +// language : japanese (ja) +// author : LI Long : https://github.com/baryon + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ja', { + months : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), + monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), + weekdays : "日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"), + weekdaysShort : "æ—¥_月_ç«_æ°´_木_金_土".split("_"), + weekdaysMin : "æ—¥_月_ç«_æ°´_木_金_土".split("_"), + longDateFormat : { + LT : "Ah時m分", + L : "YYYY/MM/DD", + LL : "YYYYå¹´M月Dæ—¥", + LLL : "YYYYå¹´M月Dæ—¥LT", + LLLL : "YYYYå¹´M月Dæ—¥LT dddd" + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return "åˆå‰"; + } else { + return "åˆå¾Œ"; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[æ¥é€±]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[å‰é€±]dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s後", + past : "%så‰", + s : "数秒", + m : "1分", + mm : "%d分", + h : "1時間", + hh : "%d時間", + d : "1æ—¥", + dd : "%dæ—¥", + M : "1ヶ月", + MM : "%dヶ月", + y : "1å¹´", + yy : "%då¹´" + } + }); +})); diff --git a/vendors/moment/lang/ka.js b/vendors/moment/lang/ka.js new file mode 100644 index 000000000..0cebdaae2 --- /dev/null +++ b/vendors/moment/lang/ka.js @@ -0,0 +1,108 @@ +// moment.js language configuration +// language : Georgian (ka) +// author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), + 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') + }, + + nounCase = (/D[oD] *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), + 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') + }, + + nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.lang('ka', { + months : monthsCaseReplace, + monthsShort : "იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"), + weekdays : weekdaysCaseReplace, + weekdaysShort : "კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"), + weekdaysMin : "კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"), + longDateFormat : { + LT : "h:mm A", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვáƒáƒš] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინáƒ] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? + s.replace(/ი$/, "ში") : + s + "ში"; + }, + past : function (s) { + if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, "ის წინ"); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, "წლის წინ"); + } + }, + s : "რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜", + m : "წუთი", + mm : "%d წუთი", + h : "სáƒáƒáƒ—ი", + hh : "%d სáƒáƒáƒ—ი", + d : "დღე", + dd : "%d დღე", + M : "თვე", + MM : "%d თვე", + y : "წელი", + yy : "%d წელი" + }, + ordinal : function (number) { + if (number === 0) { + return number; + } + + if (number === 1) { + return number + "-ლი"; + } + + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return "მე-" + number; + } + + return number + "-ე"; + }, + week : { + dow : 1, + doy : 7 + } + }); +})); diff --git a/vendors/moment/lang/ko.js b/vendors/moment/lang/ko.js new file mode 100644 index 000000000..69a6e3812 --- /dev/null +++ b/vendors/moment/lang/ko.js @@ -0,0 +1,56 @@ +// moment.js language configuration +// language : korean (ko) +// author : Kyungwook, Park : https://github.com/kyungw00k + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ko', { + months : "1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"), + monthsShort : "1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"), + weekdays : "ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"), + weekdaysShort : "ì¼_ì›”_í™”_수_목_금_토".split("_"), + weekdaysMin : "ì¼_ì›”_í™”_수_목_금_토".split("_"), + longDateFormat : { + LT : "A hì‹œ mm분", + L : "YYYY.MM.DD", + LL : "YYYYë…„ MMMM Dì¼", + LLL : "YYYYë…„ MMMM Dì¼ LT", + LLLL : "YYYYë…„ MMMM Dì¼ dddd LT" + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + }, + calendar : { + sameDay : '오늘 LT', + nextDay : 'ë‚´ì¼ LT', + nextWeek : 'dddd LT', + lastDay : 'ì–´ì œ LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s 후", + past : "%s ì „", + s : "몇초", + ss : "%dì´ˆ", + m : "ì¼ë¶„", + mm : "%d분", + h : "한시간", + hh : "%d시간", + d : "하루", + dd : "%dì¼", + M : "한달", + MM : "%d달", + y : "ì¼ë…„", + yy : "%dë…„" + }, + ordinal : '%dì¼' + }); +})); diff --git a/vendors/moment/lang/lt.js b/vendors/moment/lang/lt.js new file mode 100644 index 000000000..1cf6457d2 --- /dev/null +++ b/vendors/moment/lang/lt.js @@ -0,0 +1,118 @@ +// moment.js language configuration +// language : Lithuanian (lt) +// author : Mindaugas MozÅ«ras : https://github.com/mmozuras + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var units = { + "m" : "minutÄ—_minutÄ—s_minutÄ™", + "mm": "minutÄ—s_minuÄių_minutes", + "h" : "valanda_valandos_valandÄ…", + "hh": "valandos_valandų_valandas", + "d" : "diena_dienos_dienÄ…", + "dd": "dienos_dienų_dienas", + "M" : "mÄ—nuo_mÄ—nesio_mÄ—nesį", + "MM": "mÄ—nesiai_mÄ—nesių_mÄ—nesius", + "y" : "metai_metų_metus", + "yy": "metai_metų_metus" + }, + weekDays = "pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis_sekmadienis".split("_"); + + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return "kelios sekundÄ—s"; + } else { + return isFuture ? "kelių sekundžių" : "kelias sekundes"; + } + } + + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + + function forms(key) { + return units[key].split("_"); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + " "; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + + function relativeWeekDay(moment, format) { + var nominative = format.indexOf('dddd LT') === -1, + weekDay = weekDays[moment.weekday()]; + + return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + "į"; + } + + return moment.lang("lt", { + months : "sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"), + monthsShort : "sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"), + weekdays : relativeWeekDay, + weekdaysShort : "Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"), + weekdaysMin : "S_P_A_T_K_Pn_Å ".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "YYYY [m.] MMMM D [d.]", + LLL : "YYYY [m.] MMMM D [d.], LT [val.]", + LLLL : "YYYY [m.] MMMM D [d.], dddd, LT [val.]", + l : "YYYY-MM-DD", + ll : "YYYY [m.] MMMM D [d.]", + lll : "YYYY [m.] MMMM D [d.], LT [val.]", + llll : "YYYY [m.] MMMM D [d.], ddd, LT [val.]" + }, + calendar : { + sameDay : "[Å iandien] LT", + nextDay : "[Rytoj] LT", + nextWeek : "dddd LT", + lastDay : "[Vakar] LT", + lastWeek : "[PraÄ—jusį] dddd LT", + sameElse : "L" + }, + relativeTime : { + future : "po %s", + past : "prieÅ¡ %s", + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/lv.js b/vendors/moment/lang/lv.js new file mode 100644 index 000000000..ffe25cfe4 --- /dev/null +++ b/vendors/moment/lang/lv.js @@ -0,0 +1,77 @@ +// moment.js language configuration +// language : latvian (lv) +// author : Kristaps Karlsons : https://github.com/skakri + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var units = { + 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', + 'hh': 'stundu_stundas_stunda_stundas', + 'dd': 'dienu_dienas_diena_dienas', + 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', + 'yy': 'gadu_gadus_gads_gadi' + }; + + function format(word, number, withoutSuffix) { + var forms = word.split('_'); + if (withoutSuffix) { + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + + return moment.lang('lv', { + months : "janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"), + monthsShort : "jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"), + weekdays : "svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"), + weekdaysShort : "Sv_P_O_T_C_Pk_S".split("_"), + weekdaysMin : "Sv_P_O_T_C_Pk_S".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "YYYY. [gada] D. MMMM", + LLL : "YYYY. [gada] D. MMMM, LT", + LLLL : "YYYY. [gada] D. MMMM, dddd, LT" + }, + calendar : { + sameDay : '[Å odien pulksten] LT', + nextDay : '[RÄ«t pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s vÄ“lÄk", + past : "%s agrÄk", + s : "dažas sekundes", + m : "minÅ«ti", + mm : relativeTimeWithPlural, + h : "stundu", + hh : relativeTimeWithPlural, + d : "dienu", + dd : relativeTimeWithPlural, + M : "mÄ“nesi", + MM : relativeTimeWithPlural, + y : "gadu", + yy : relativeTimeWithPlural + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/ml.js b/vendors/moment/lang/ml.js new file mode 100644 index 000000000..cc7db9a30 --- /dev/null +++ b/vendors/moment/lang/ml.js @@ -0,0 +1,64 @@ +// moment.js language configuration +// language : malayalam (ml) +// author : Floyd Pink : https://github.com/floydpink + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ml', { + months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split("_"), + monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split("_"), + weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split("_"), + weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split("_"), + weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split("_"), + longDateFormat : { + LT : "A h:mm -à´¨àµ", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY, LT", + LLLL : "dddd, D MMMM YYYY, LT" + }, + calendar : { + sameDay : '[ഇനàµà´¨àµ] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇനàµà´¨à´²àµ†] LT', + lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s à´•à´´à´¿à´žàµà´žàµ", + past : "%s à´®àµàµ»à´ªàµ", + s : "അൽപ നിമിഷങàµà´™àµ¾", + m : "ഒരൠമിനിറàµà´±àµ", + mm : "%d മിനിറàµà´±àµ", + h : "ഒരൠമണികàµà´•àµ‚ർ", + hh : "%d മണികàµà´•àµ‚ർ", + d : "ഒരൠദിവസം", + dd : "%d ദിവസം", + M : "ഒരൠമാസം", + MM : "%d മാസം", + y : "ഒരൠവർഷം", + yy : "%d വർഷം" + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return "രാതàµà´°à´¿"; + } else if (hour < 12) { + return "രാവിലെ"; + } else if (hour < 17) { + return "ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ"; + } else if (hour < 20) { + return "വൈകàµà´¨àµà´¨àµ‡à´°à´‚"; + } else { + return "രാതàµà´°à´¿"; + } + } + }); +})); diff --git a/vendors/moment/lang/mr.js b/vendors/moment/lang/mr.js new file mode 100644 index 000000000..0d1adfd64 --- /dev/null +++ b/vendors/moment/lang/mr.js @@ -0,0 +1,104 @@ +// moment.js language configuration +// language : Marathi (mr) +// author : Harshad Kale : https://github.com/kalehv + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.lang('mr', { + months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split("_"), + monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split("_"), + weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split("_"), + weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split("_"), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split("_"), + longDateFormat : { + LT : "A h:mm वाजता", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY, LT", + LLLL : "dddd, D MMMM YYYY, LT" + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उदà¥à¤¯à¤¾] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s नंतर", + past : "%s पूरà¥à¤µà¥€", + s : "सेकंद", + m: "à¤à¤• मिनिट", + mm: "%d मिनिटे", + h : "à¤à¤• तास", + hh : "%d तास", + d : "à¤à¤• दिवस", + dd : "%d दिवस", + M : "à¤à¤• महिना", + MM : "%d महिने", + y : "à¤à¤• वरà¥à¤·", + yy : "%d वरà¥à¤·à¥‡" + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiem: function (hour, minute, isLower) + { + if (hour < 4) { + return "रातà¥à¤°à¥€"; + } else if (hour < 10) { + return "सकाळी"; + } else if (hour < 17) { + return "दà¥à¤ªà¤¾à¤°à¥€"; + } else if (hour < 20) { + return "सायंकाळी"; + } else { + return "रातà¥à¤°à¥€"; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/ms-my.js b/vendors/moment/lang/ms-my.js new file mode 100644 index 000000000..501d5aaa0 --- /dev/null +++ b/vendors/moment/lang/ms-my.js @@ -0,0 +1,66 @@ +// moment.js language configuration +// language : Bahasa Malaysia (ms-MY) +// author : Weldan Jamili : https://github.com/weldan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ms-my', { + months : "Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"), + monthsShort : "Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"), + weekdays : "Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"), + weekdaysShort : "Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"), + weekdaysMin : "Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"), + longDateFormat : { + LT : "HH.mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY [pukul] LT", + LLLL : "dddd, D MMMM YYYY [pukul] LT" + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : "dalam %s", + past : "%s yang lepas", + s : "beberapa saat", + m : "seminit", + mm : "%d minit", + h : "sejam", + hh : "%d jam", + d : "sehari", + dd : "%d hari", + M : "sebulan", + MM : "%d bulan", + y : "setahun", + yy : "%d tahun" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/nb.js b/vendors/moment/lang/nb.js new file mode 100644 index 000000000..2f652efd1 --- /dev/null +++ b/vendors/moment/lang/nb.js @@ -0,0 +1,57 @@ +// moment.js language configuration +// language : norwegian bokmÃ¥l (nb) +// authors : Espen Hovlandsdal : https://github.com/rexxars +// Sigurd Gartmann : https://github.com/sigurdga + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('nb', { + months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"), + monthsShort : "jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"), + weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"), + weekdaysShort : "sø._ma._ti._on._to._fr._lø.".split("_"), + weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"), + longDateFormat : { + LT : "H.mm", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY [kl.] LT", + LLLL : "dddd D. MMMM YYYY [kl.] LT" + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i gÃ¥r kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : "om %s", + past : "for %s siden", + s : "noen sekunder", + m : "ett minutt", + mm : "%d minutter", + h : "en time", + hh : "%d timer", + d : "en dag", + dd : "%d dager", + M : "en mÃ¥ned", + MM : "%d mÃ¥neder", + y : "ett Ã¥r", + yy : "%d Ã¥r" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/ne.js b/vendors/moment/lang/ne.js new file mode 100644 index 000000000..1d57b8cbf --- /dev/null +++ b/vendors/moment/lang/ne.js @@ -0,0 +1,105 @@ +// moment.js language configuration +// language : nepali/nepalese +// author : suvash : https://github.com/suvash + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.lang('ne', { + months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split("_"), + monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split("_"), + weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split("_"), + weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split("_"), + weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split("_"), + longDateFormat : { + LT : "Aको h:mm बजे", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY, LT", + LLLL : "dddd, D MMMM YYYY, LT" + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return "राती"; + } else if (hour < 10) { + return "बिहान"; + } else if (hour < 15) { + return "दिउà¤à¤¸à¥‹"; + } else if (hour < 18) { + return "बेलà¥à¤•à¤¾"; + } else if (hour < 20) { + return "साà¤à¤"; + } else { + return "राती"; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोली] LT', + nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : "%sमा", + past : "%s अगाडी", + s : "केही समय", + m : "à¤à¤• मिनेट", + mm : "%d मिनेट", + h : "à¤à¤• घणà¥à¤Ÿà¤¾", + hh : "%d घणà¥à¤Ÿà¤¾", + d : "à¤à¤• दिन", + dd : "%d दिन", + M : "à¤à¤• महिना", + MM : "%d महिना", + y : "à¤à¤• बरà¥à¤·", + yy : "%d बरà¥à¤·" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/nl.js b/vendors/moment/lang/nl.js new file mode 100644 index 000000000..ffd454faf --- /dev/null +++ b/vendors/moment/lang/nl.js @@ -0,0 +1,67 @@ +// moment.js language configuration +// language : dutch (nl) +// author : Joris Röling : https://github.com/jjupiter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var monthsShortWithDots = "jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"), + monthsShortWithoutDots = "jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"); + + return moment.lang('nl', { + months : "januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : "zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"), + weekdaysShort : "zo._ma._di._wo._do._vr._za.".split("_"), + weekdaysMin : "Zo_Ma_Di_Wo_Do_Vr_Za".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD-MM-YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : "over %s", + past : "%s geleden", + s : "een paar seconden", + m : "één minuut", + mm : "%d minuten", + h : "één uur", + hh : "%d uur", + d : "één dag", + dd : "%d dagen", + M : "één maand", + MM : "%d maanden", + y : "één jaar", + yy : "%d jaar" + }, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/nn.js b/vendors/moment/lang/nn.js new file mode 100644 index 000000000..f59c4153b --- /dev/null +++ b/vendors/moment/lang/nn.js @@ -0,0 +1,56 @@ +// moment.js language configuration +// language : norwegian nynorsk (nn) +// author : https://github.com/mechuwind + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('nn', { + months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"), + monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"), + weekdays : "sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"), + weekdaysShort : "sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"), + weekdaysMin : "su_mÃ¥_ty_on_to_fr_lø".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I gÃ¥r klokka] LT', + lastWeek: '[FøregÃ¥ende] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : "om %s", + past : "for %s siden", + s : "noen sekund", + m : "ett minutt", + mm : "%d minutt", + h : "en time", + hh : "%d timar", + d : "en dag", + dd : "%d dagar", + M : "en mÃ¥nad", + MM : "%d mÃ¥nader", + y : "ett Ã¥r", + yy : "%d Ã¥r" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/pl.js b/vendors/moment/lang/pl.js new file mode 100644 index 000000000..4ee33462c --- /dev/null +++ b/vendors/moment/lang/pl.js @@ -0,0 +1,98 @@ +// moment.js language configuration +// language : polish (pl) +// author : Rafal Hirsz : https://github.com/evoL + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var monthsNominative = "styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"), + monthsSubjective = "stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_"); + + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key) { + var result = number + " "; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutÄ™'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinÄ™'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + return moment.lang('pl', { + months : function (momentToFormat, format) { + if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : "sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"), + weekdays : "niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"), + weekdaysShort : "nie_pon_wt_Å›r_czw_pt_sb".split("_"), + weekdaysMin : "N_Pn_Wt_Åšr_Cz_Pt_So".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay: '[DziÅ› o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; + case 3: + return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; + case 6: + return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; + default: + return '[W zeszÅ‚y] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : "za %s", + past : "%s temu", + s : "kilka sekund", + m : translate, + mm : translate, + h : translate, + hh : translate, + d : "1 dzieÅ„", + dd : '%d dni', + M : "miesiÄ…c", + MM : translate, + y : "rok", + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/pt-br.js b/vendors/moment/lang/pt-br.js new file mode 100644 index 000000000..5cac19b69 --- /dev/null +++ b/vendors/moment/lang/pt-br.js @@ -0,0 +1,56 @@ +// moment.js language configuration +// language : brazilian portuguese (pt-br) +// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('pt-br', { + months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"), + monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"), + weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"), + weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"), + weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D [de] MMMM [de] YYYY", + LLL : "D [de] MMMM [de] YYYY LT", + LLLL : "dddd, D [de] MMMM [de] YYYY LT" + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : "em %s", + past : "%s atrás", + s : "segundos", + m : "um minuto", + mm : "%d minutos", + h : "uma hora", + hh : "%d horas", + d : "um dia", + dd : "%d dias", + M : "um mês", + MM : "%d meses", + y : "um ano", + yy : "%d anos" + }, + ordinal : '%dº' + }); +})); diff --git a/vendors/moment/lang/pt.js b/vendors/moment/lang/pt.js new file mode 100644 index 000000000..7c1f2b5ce --- /dev/null +++ b/vendors/moment/lang/pt.js @@ -0,0 +1,60 @@ +// moment.js language configuration +// language : portuguese (pt) +// author : Jefferson : https://github.com/jalex79 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('pt', { + months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"), + monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"), + weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"), + weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"), + weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D [de] MMMM [de] YYYY", + LLL : "D [de] MMMM [de] YYYY LT", + LLLL : "dddd, D [de] MMMM [de] YYYY LT" + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : "em %s", + past : "%s atrás", + s : "segundos", + m : "um minuto", + mm : "%d minutos", + h : "uma hora", + hh : "%d horas", + d : "um dia", + dd : "%d dias", + M : "um mês", + MM : "%d meses", + y : "um ano", + yy : "%d anos" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/ro.js b/vendors/moment/lang/ro.js new file mode 100644 index 000000000..e0bcc8f7a --- /dev/null +++ b/vendors/moment/lang/ro.js @@ -0,0 +1,56 @@ +// moment.js language configuration +// language : romanian (ro) +// author : Vlad Gurdiga : https://github.com/gurdiga +// author : Valentin Agachi : https://github.com/avaly + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ro', { + months : "Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie".split("_"), + monthsShort : "Ian_Feb_Mar_Apr_Mai_Iun_Iul_Aug_Sep_Oct_Noi_Dec".split("_"), + weekdays : "Duminică_Luni_MarÅ£i_Miercuri_Joi_Vineri_Sâmbătă".split("_"), + weekdaysShort : "Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"), + weekdaysMin : "Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY H:mm", + LLLL : "dddd, D MMMM YYYY H:mm" + }, + calendar : { + sameDay: "[azi la] LT", + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : "peste %s", + past : "%s în urmă", + s : "câteva secunde", + m : "un minut", + mm : "%d minute", + h : "o oră", + hh : "%d ore", + d : "o zi", + dd : "%d zile", + M : "o lună", + MM : "%d luni", + y : "un an", + yy : "%d ani" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/ru.js b/vendors/moment/lang/ru.js new file mode 100644 index 000000000..e8d589007 --- /dev/null +++ b/vendors/moment/lang/ru.js @@ -0,0 +1,163 @@ +// moment.js language configuration +// language : russian (ru) +// author : Viktorminator : https://github.com/Viktorminator +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'минута_минуты_минут', + 'hh': 'чаÑ_чаÑа_чаÑов', + 'dd': 'день_днÑ_дней', + 'MM': 'меÑÑц_меÑÑца_меÑÑцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = { + 'nominative': 'Ñнв_фев_мар_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), + 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return monthsShort[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), + 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.lang('ru', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : "вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + weekdaysMin : "вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY г.", + LLL : "D MMMM YYYY г., LT", + LLLL : "dddd, D MMMM YYYY г., LT" + }, + calendar : { + sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function () { + return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + return '[Ð’ прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[Ð’ прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[Ð’ прошлую] dddd [в] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : "через %s", + past : "%s назад", + s : "неÑколько Ñекунд", + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : "чаÑ", + hh : relativeTimeWithPlural, + d : "день", + dd : relativeTimeWithPlural, + M : "меÑÑц", + MM : relativeTimeWithPlural, + y : "год", + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return "ночи"; + } else if (hour < 12) { + return "утра"; + } else if (hour < 17) { + return "днÑ"; + } else { + return "вечера"; + } + }, + + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-Ñ'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/sk.js b/vendors/moment/lang/sk.js new file mode 100644 index 000000000..ed8a41d48 --- /dev/null +++ b/vendors/moment/lang/sk.js @@ -0,0 +1,156 @@ +// moment.js language configuration +// language : slovak (sk) +// author : Martin Minka : https://github.com/k2s +// based on work of petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var months = "január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"), + monthsShort = "jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_"); + + function plural(n) { + return (n > 1) && (n < 5); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + " "; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + return moment.lang('sk', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : "nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"), + weekdaysShort : "ne_po_ut_st_Å¡t_pi_so".split("_"), + weekdaysMin : "ne_po_ut_st_Å¡t_pi_so".split("_"), + longDateFormat : { + LT: "H:mm", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd D. MMMM YYYY LT" + }, + calendar : { + sameDay: "[dnes o] LT", + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo Å¡tvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[vÄera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: "L" + }, + relativeTime : { + future : "za %s", + past : "pred %s", + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/sl.js b/vendors/moment/lang/sl.js new file mode 100644 index 000000000..d260f80d9 --- /dev/null +++ b/vendors/moment/lang/sl.js @@ -0,0 +1,144 @@ +// moment.js language configuration +// language : slovenian (sl) +// author : Robert SedovÅ¡ek : https://github.com/sedovsek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + " "; + switch (key) { + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2) { + result += 'minuti'; + } else if (number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minut'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += 'ura'; + } else if (number === 2) { + result += 'uri'; + } else if (number === 3 || number === 4) { + result += 'ure'; + } else { + result += 'ur'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dni'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mesec'; + } else if (number === 2) { + result += 'meseca'; + } else if (number === 3 || number === 4) { + result += 'mesece'; + } else { + result += 'mesecev'; + } + return result; + case 'yy': + if (number === 1) { + result += 'leto'; + } else if (number === 2) { + result += 'leti'; + } else if (number === 3 || number === 4) { + result += 'leta'; + } else { + result += 'let'; + } + return result; + } + } + + return moment.lang('sl', { + months : "januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"), + monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"), + weekdays : "nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"), + weekdaysShort : "ned._pon._tor._sre._Äet._pet._sob.".split("_"), + weekdaysMin : "ne_po_to_sr_Äe_pe_so".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD. MM. YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[vÄeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[prejÅ¡nja] dddd [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejÅ¡nji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : "Äez %s", + past : "%s nazaj", + s : "nekaj sekund", + m : translate, + mm : translate, + h : translate, + hh : translate, + d : "en dan", + dd : translate, + M : "en mesec", + MM : translate, + y : "eno leto", + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/sq.js b/vendors/moment/lang/sq.js new file mode 100644 index 000000000..eb735c6dc --- /dev/null +++ b/vendors/moment/lang/sq.js @@ -0,0 +1,57 @@ +// moment.js language configuration +// language : Albanian (sq) +// author : Flakërim Ismani : https://github.com/flakerimi +// author: Menelion Elensúle: https://github.com/Oire (tests) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('sq', { + months : "Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"), + monthsShort : "Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"), + weekdays : "E Diel_E Hënë_E Marte_E Mërkure_E Enjte_E Premte_E Shtunë".split("_"), + weekdaysShort : "Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"), + weekdaysMin : "D_H_Ma_Më_E_P_Sh".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Neser në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : "në %s", + past : "%s me parë", + s : "disa seconda", + m : "një minut", + mm : "%d minutea", + h : "një orë", + hh : "%d orë", + d : "një ditë", + dd : "%d ditë", + M : "një muaj", + MM : "%d muaj", + y : "një vit", + yy : "%d vite" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/sv.js b/vendors/moment/lang/sv.js new file mode 100644 index 000000000..0de8c40ba --- /dev/null +++ b/vendors/moment/lang/sv.js @@ -0,0 +1,63 @@ +// moment.js language configuration +// language : swedish (sv) +// author : Jens Alm : https://github.com/ulmus + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('sv', { + months : "januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"), + monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"), + weekdays : "söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"), + weekdaysShort : "sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"), + weekdaysMin : "sö_mÃ¥_ti_on_to_fr_lö".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[IgÃ¥r] LT', + nextWeek: 'dddd LT', + lastWeek: '[Förra] dddd[en] LT', + sameElse: 'L' + }, + relativeTime : { + future : "om %s", + past : "för %s sedan", + s : "nÃ¥gra sekunder", + m : "en minut", + mm : "%d minuter", + h : "en timme", + hh : "%d timmar", + d : "en dag", + dd : "%d dagar", + M : "en mÃ¥nad", + MM : "%d mÃ¥nader", + y : "ett Ã¥r", + yy : "%d Ã¥r" + }, + ordinal : function (number) { + var b = number % 10, + output = (~~ (number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/th.js b/vendors/moment/lang/th.js new file mode 100644 index 000000000..70336c87e --- /dev/null +++ b/vendors/moment/lang/th.js @@ -0,0 +1,58 @@ +// moment.js language configuration +// language : thai (th) +// author : Kridsada Thanabulpong : https://github.com/sirn + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('th', { + months : "มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"), + monthsShort : "มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"), + weekdays : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"), + weekdaysShort : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"), // yes, three characters difference + weekdaysMin : "อา._จ._อ._พ._พฤ._ศ._ส.".split("_"), + longDateFormat : { + LT : "H นาฬิà¸à¸² m นาที", + L : "YYYY/MM/DD", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY เวลา LT", + LLLL : "วันddddที่ D MMMM YYYY เวลา LT" + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return "à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง"; + } else { + return "หลังเที่ยง"; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : "อีภ%s", + past : "%sที่à¹à¸¥à¹‰à¸§", + s : "ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี", + m : "1 นาที", + mm : "%d นาที", + h : "1 ชั่วโมง", + hh : "%d ชั่วโมง", + d : "1 วัน", + dd : "%d วัน", + M : "1 เดือน", + MM : "%d เดือน", + y : "1 ปี", + yy : "%d ปี" + } + }); +})); diff --git a/vendors/moment/lang/tr.js b/vendors/moment/lang/tr.js new file mode 100644 index 000000000..e90f250e5 --- /dev/null +++ b/vendors/moment/lang/tr.js @@ -0,0 +1,93 @@ +// moment.js language configuration +// language : turkish (tr) +// authors : Erhan Gundogan : https://github.com/erhangundogan, +// Burak YiÄŸit Kaya: https://github.com/BYK + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + + var suffixes = { + 1: "'inci", + 5: "'inci", + 8: "'inci", + 70: "'inci", + 80: "'inci", + + 2: "'nci", + 7: "'nci", + 20: "'nci", + 50: "'nci", + + 3: "'üncü", + 4: "'üncü", + 100: "'üncü", + + 6: "'ncı", + + 9: "'uncu", + 10: "'uncu", + 30: "'uncu", + + 60: "'ıncı", + 90: "'ıncı" + }; + + return moment.lang('tr', { + months : "Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"), + monthsShort : "Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"), + weekdays : "Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"), + weekdaysShort : "Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"), + weekdaysMin : "Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s sonra", + past : "%s önce", + s : "birkaç saniye", + m : "bir dakika", + mm : "%d dakika", + h : "bir saat", + hh : "%d saat", + d : "bir gün", + dd : "%d gün", + M : "bir ay", + MM : "%d ay", + y : "bir yıl", + yy : "%d yıl" + }, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + "'ıncı"; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/tzm-la.js b/vendors/moment/lang/tzm-la.js new file mode 100644 index 000000000..be1d878dd --- /dev/null +++ b/vendors/moment/lang/tzm-la.js @@ -0,0 +1,55 @@ +// moment.js language configuration +// language : Morocco Central Atlas TamaziÉ£t in Latin (tzm-la) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('tzm-la', { + months : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"), + monthsShort : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"), + weekdays : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"), + weekdaysShort : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"), + weekdaysMin : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[asdkh g] LT", + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : "dadkh s yan %s", + past : "yan %s", + s : "imik", + m : "minuá¸", + mm : "%d minuá¸", + h : "saÉ›a", + hh : "%d tassaÉ›in", + d : "ass", + dd : "%d ossan", + M : "ayowr", + MM : "%d iyyirn", + y : "asgas", + yy : "%d isgasn" + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/tzm.js b/vendors/moment/lang/tzm.js new file mode 100644 index 000000000..c7c76bdc6 --- /dev/null +++ b/vendors/moment/lang/tzm.js @@ -0,0 +1,55 @@ +// moment.js language configuration +// language : Morocco Central Atlas TamaziÉ£t (tzm) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('tzm', { + months : "ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"), + monthsShort : "ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"), + weekdays : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"), + weekdaysShort : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"), + weekdaysMin : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[ⴰⵙⴷⵅ â´´] LT", + nextDay: '[ⴰⵙⴽⴰ â´´] LT', + nextWeek: 'dddd [â´´] LT', + lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', + lastWeek: 'dddd [â´´] LT', + sameElse: 'L' + }, + relativeTime : { + future : "â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s", + past : "ⵢⴰⵠ%s", + s : "ⵉⵎⵉⴽ", + m : "ⵎⵉâµâµ“â´º", + mm : "%d ⵎⵉâµâµ“â´º", + h : "ⵙⴰⵄⴰ", + hh : "%d ⵜⴰⵙⵙⴰⵄⵉâµ", + d : "ⴰⵙⵙ", + dd : "%d oⵙⵙⴰâµ", + M : "â´°âµ¢oⵓⵔ", + MM : "%d ⵉⵢⵢⵉⵔâµ", + y : "ⴰⵙⴳⴰⵙ", + yy : "%d ⵉⵙⴳⴰⵙâµ" + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/uk.js b/vendors/moment/lang/uk.js new file mode 100644 index 000000000..47056cb64 --- /dev/null +++ b/vendors/moment/lang/uk.js @@ -0,0 +1,157 @@ +// moment.js language configuration +// language : ukrainian (uk) +// author : zemlanin : https://github.com/zemlanin +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'хвилина_хвилини_хвилин', + 'hh': 'година_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'міÑÑць_міÑÑці_міÑÑців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), + 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') + }, + + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + + return weekdays[nounCase][m.day()]; + } + + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + return moment.lang('uk', { + months : monthsCaseReplace, + monthsShort : "Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"), + weekdays : weekdaysCaseReplace, + weekdaysShort : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + weekdaysMin : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY Ñ€.", + LLL : "D MMMM YYYY Ñ€., LT", + LLLL : "dddd, D MMMM YYYY Ñ€., LT" + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : "за %s", + past : "%s тому", + s : "декілька Ñекунд", + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : "годину", + hh : relativeTimeWithPlural, + d : "день", + dd : relativeTimeWithPlural, + M : "міÑÑць", + MM : relativeTimeWithPlural, + y : "рік", + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return "ночі"; + } else if (hour < 12) { + return "ранку"; + } else if (hour < 17) { + return "днÑ"; + } else { + return "вечора"; + } + }, + + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/uz.js b/vendors/moment/lang/uz.js new file mode 100644 index 000000000..a5b06fa9f --- /dev/null +++ b/vendors/moment/lang/uz.js @@ -0,0 +1,55 @@ +// moment.js language configuration +// language : uzbek +// author : Sardor Muminov : https://github.com/muminoff + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('uz', { + months : "Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"), + monthsShort : "Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"), + weekdays : "Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"), + weekdaysShort : "Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"), + weekdaysMin : "Як_Ду_Се_Чо_Па_Жу_Ша".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "D MMMM YYYY, dddd LT" + }, + calendar : { + sameDay : '[Бугун Ñоат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни Ñоат] LT [да]', + lastDay : '[Кеча Ñоат] LT [да]', + lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : "Якин %s ичида", + past : "Бир неча %s олдин", + s : "фурÑат", + m : "бир дакика", + mm : "%d дакика", + h : "бир Ñоат", + hh : "%d Ñоат", + d : "бир кун", + dd : "%d кун", + M : "бир ой", + MM : "%d ой", + y : "бир йил", + yy : "%d йил" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/vn.js b/vendors/moment/lang/vn.js new file mode 100644 index 000000000..f28e7c3b3 --- /dev/null +++ b/vendors/moment/lang/vn.js @@ -0,0 +1,62 @@ +// moment.js language configuration +// language : vietnamese (vn) +// author : Bang Nguyen : https://github.com/bangnk + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('vn', { + months : "tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"), + monthsShort : "Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"), + weekdays : "chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"), + weekdaysShort : "CN_T2_T3_T4_T5_T6_T7".split("_"), + weekdaysMin : "CN_T2_T3_T4_T5_T6_T7".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM [năm] YYYY", + LLL : "D MMMM [năm] YYYY LT", + LLLL : "dddd, D MMMM [năm] YYYY LT", + l : "DD/M/YYYY", + ll : "D MMM YYYY", + lll : "D MMM YYYY LT", + llll : "ddd, D MMM YYYY LT" + }, + calendar : { + sameDay: "[Hôm nay lúc] LT", + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tá»›i lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : "%s tá»›i", + past : "%s trÆ°á»›c", + s : "vài giây", + m : "má»™t phút", + mm : "%d phút", + h : "má»™t giá»", + hh : "%d giá»", + d : "má»™t ngày", + dd : "%d ngày", + M : "má»™t tháng", + MM : "%d tháng", + y : "má»™t năm", + yy : "%d năm" + }, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/zh-cn.js b/vendors/moment/lang/zh-cn.js new file mode 100644 index 000000000..80aefe0d2 --- /dev/null +++ b/vendors/moment/lang/zh-cn.js @@ -0,0 +1,108 @@ +// moment.js language configuration +// language : chinese +// author : suupic : https://github.com/suupic +// author : Zeno Zeng : https://github.com/zenozeng + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('zh-cn', { + months : "一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"), + monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), + weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"), + weekdaysShort : "周日_周一_周二_周三_周四_周五_周六".split("_"), + weekdaysMin : "æ—¥_一_二_三_å››_五_å…­".split("_"), + longDateFormat : { + LT : "Ah点mm", + L : "YYYYå¹´MMMDæ—¥", + LL : "YYYYå¹´MMMDæ—¥", + LLL : "YYYYå¹´MMMDæ—¥LT", + LLLL : "YYYYå¹´MMMDæ—¥ddddLT", + l : "YYYYå¹´MMMDæ—¥", + ll : "YYYYå¹´MMMDæ—¥", + lll : "YYYYå¹´MMMDæ—¥LT", + llll : "YYYYå¹´MMMDæ—¥ddddLT" + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 600) { + return "凌晨"; + } else if (hm < 900) { + return "早上"; + } else if (hm < 1130) { + return "上åˆ"; + } else if (hm < 1230) { + return "中åˆ"; + } else if (hm < 1800) { + return "下åˆ"; + } else { + return "晚上"; + } + }, + calendar : { + sameDay : function () { + return this.minutes() === 0 ? "[今天]Ah[点整]" : "[今天]LT"; + }, + nextDay : function () { + return this.minutes() === 0 ? "[明天]Ah[点整]" : "[明天]LT"; + }, + lastDay : function () { + return this.minutes() === 0 ? "[昨天]Ah[点整]" : "[昨天]LT"; + }, + nextWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]'; + return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm"; + }, + lastWeek : function () { + var startOfWeek, prefix; + startOfWeek = moment().startOf('week'); + prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]'; + return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm"; + }, + sameElse : 'L' + }, + ordinal : function (number, period) { + switch (period) { + case "d": + case "D": + case "DDD": + return number + "æ—¥"; + case "M": + return number + "月"; + case "w": + case "W": + return number + "周"; + default: + return number; + } + }, + relativeTime : { + future : "%s内", + past : "%så‰", + s : "几秒", + m : "1分钟", + mm : "%d分钟", + h : "1å°æ—¶", + hh : "%då°æ—¶", + d : "1天", + dd : "%d天", + M : "1个月", + MM : "%d个月", + y : "1å¹´", + yy : "%då¹´" + }, + week : { + // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效 + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); diff --git a/vendors/moment/lang/zh-tw.js b/vendors/moment/lang/zh-tw.js new file mode 100644 index 000000000..bbb07376e --- /dev/null +++ b/vendors/moment/lang/zh-tw.js @@ -0,0 +1,84 @@ +// moment.js language configuration +// language : traditional chinese (zh-tw) +// author : Ben : https://github.com/ben-lin + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('zh-tw', { + months : "一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"), + monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), + weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"), + weekdaysShort : "週日_週一_週二_週三_週四_週五_週六".split("_"), + weekdaysMin : "æ—¥_一_二_三_å››_五_å…­".split("_"), + longDateFormat : { + LT : "Ah點mm", + L : "YYYYå¹´MMMDæ—¥", + LL : "YYYYå¹´MMMDæ—¥", + LLL : "YYYYå¹´MMMDæ—¥LT", + LLLL : "YYYYå¹´MMMDæ—¥ddddLT", + l : "YYYYå¹´MMMDæ—¥", + ll : "YYYYå¹´MMMDæ—¥", + lll : "YYYYå¹´MMMDæ—¥LT", + llll : "YYYYå¹´MMMDæ—¥ddddLT" + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return "早上"; + } else if (hm < 1130) { + return "上åˆ"; + } else if (hm < 1230) { + return "中åˆ"; + } else if (hm < 1800) { + return "下åˆ"; + } else { + return "晚上"; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinal : function (number, period) { + switch (period) { + case "d" : + case "D" : + case "DDD" : + return number + "æ—¥"; + case "M" : + return number + "月"; + case "w" : + case "W" : + return number + "週"; + default : + return number; + } + }, + relativeTime : { + future : "%så…§", + past : "%så‰", + s : "幾秒", + m : "一分é˜", + mm : "%d分é˜", + h : "一å°æ™‚", + hh : "%då°æ™‚", + d : "一天", + dd : "%d天", + M : "一個月", + MM : "%d個月", + y : "一年", + yy : "%då¹´" + } + }); +})); diff --git a/vendors/moment/min/langs.js b/vendors/moment/min/langs.js new file mode 100644 index 000000000..9e5198aec --- /dev/null +++ b/vendors/moment/min/langs.js @@ -0,0 +1,4969 @@ +// moment.js language configuration +// language : Moroccan Arabic (ar-ma) +// author : ElFadili Yassine : https://github.com/ElFadiliY +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ar-ma', { + months : "يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"), + monthsShort : "يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"), + weekdays : "الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"), + weekdaysShort : "احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"), + weekdaysMin : "Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[اليوم على الساعة] LT", + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : "ÙÙŠ %s", + past : "منذ %s", + s : "ثوان", + m : "دقيقة", + mm : "%d دقائق", + h : "ساعة", + hh : "%d ساعات", + d : "يوم", + dd : "%d أيام", + M : "شهر", + MM : "%d أشهر", + y : "سنة", + yy : "%d سنوات" + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : Arabic (ar) +// author : Abdel Said : https://github.com/abdelsaid +// changes in months, weekdays : Ahmed Elkhatib + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ar', { + months : "يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"), + monthsShort : "يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"), + weekdays : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"), + weekdaysShort : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"), + weekdaysMin : "Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[اليوم على الساعة] LT", + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : "ÙÙŠ %s", + past : "منذ %s", + s : "ثوان", + m : "دقيقة", + mm : "%d دقائق", + h : "ساعة", + hh : "%d ساعات", + d : "يوم", + dd : "%d أيام", + M : "شهر", + MM : "%d أشهر", + y : "سنة", + yy : "%d سنوات" + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : bulgarian (bg) +// author : Krasen Borisov : https://github.com/kraz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('bg', { + months : "Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"), + monthsShort : "Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"), + weekdays : "неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"), + weekdaysShort : "нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"), + weekdaysMin : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + longDateFormat : { + LT : "H:mm", + L : "D.MM.YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Ð’ изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Ð’ изминалиÑ] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : "Ñлед %s", + past : "преди %s", + s : "нÑколко Ñекунди", + m : "минута", + mm : "%d минути", + h : "чаÑ", + hh : "%d чаÑа", + d : "ден", + dd : "%d дни", + M : "меÑец", + MM : "%d меÑеца", + y : "година", + yy : "%d години" + }, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : breton (br) +// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': "munutenn", + 'MM': "miz", + 'dd': "devezh" + }; + return number + ' ' + mutation(format[key], number); + } + + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + return moment.lang('br', { + months : "Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"), + monthsShort : "Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"), + weekdays : "Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"), + weekdaysShort : "Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"), + weekdaysMin : "Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"), + longDateFormat : { + LT : "h[e]mm A", + L : "DD/MM/YYYY", + LL : "D [a viz] MMMM YYYY", + LLL : "D [a viz] MMMM YYYY LT", + LLLL : "dddd, D [a viz] MMMM YYYY LT" + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : "a-benn %s", + past : "%s 'zo", + s : "un nebeud segondennoù", + m : "ur vunutenn", + mm : relativeTimeWithMutation, + h : "un eur", + hh : "%d eur", + d : "un devezh", + dd : relativeTimeWithMutation, + M : "ur miz", + MM : relativeTimeWithMutation, + y : "ur bloaz", + yy : specialMutationForYears + }, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : bosnian (bs) +// author : Nedim Cholich : https://github.com/frontyard +// based on (hr) translation by Bojan Marković + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + + function translate(number, withoutSuffix, key) { + var result = number + " "; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.lang('bs', { + months : "januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"), + monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"), + weekdays : "nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"), + weekdaysShort : "ned._pon._uto._sri._Äet._pet._sub.".split("_"), + weekdaysMin : "ne_po_ut_sr_Äe_pe_su".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD. MM. YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : "za %s", + past : "prije %s", + s : "par sekundi", + m : translate, + mm : translate, + h : translate, + hh : translate, + d : "dan", + dd : translate, + M : "mjesec", + MM : translate, + y : "godinu", + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : catalan (ca) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ca', { + months : "Gener_Febrer_Març_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre".split("_"), + monthsShort : "Gen._Febr._Mar._Abr._Mai._Jun._Jul._Ag._Set._Oct._Nov._Des.".split("_"), + weekdays : "Diumenge_Dilluns_Dimarts_Dimecres_Dijous_Divendres_Dissabte".split("_"), + weekdaysShort : "Dg._Dl._Dt._Dc._Dj._Dv._Ds.".split("_"), + weekdaysMin : "Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : "en %s", + past : "fa %s", + s : "uns segons", + m : "un minut", + mm : "%d minuts", + h : "una hora", + hh : "%d hores", + d : "un dia", + dd : "%d dies", + M : "un mes", + MM : "%d mesos", + y : "un any", + yy : "%d anys" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : czech (cs) +// author : petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var months = "leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"), + monthsShort = "led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_"); + + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + " "; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár vteÅ™in' : 'pár vteÅ™inami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); + } else { + return result + 'mÄ›síci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + return moment.lang('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : "nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"), + weekdaysShort : "ne_po_út_st_Ät_pá_so".split("_"), + weekdaysMin : "ne_po_út_st_Ät_pá_so".split("_"), + longDateFormat : { + LT: "H:mm", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd D. MMMM YYYY LT" + }, + calendar : { + sameDay: "[dnes v] LT", + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedÄ›li v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve stÅ™edu v] LT'; + case 4: + return '[ve Ätvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[vÄera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou nedÄ›li v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou stÅ™edu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: "L" + }, + relativeTime : { + future : "za %s", + past : "pÅ™ed %s", + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : chuvash (cv) +// author : Anatoly Mironov : https://github.com/mirontoli + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('cv', { + months : "кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"), + monthsShort : "кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"), + weekdays : "вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"), + weekdaysShort : "выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"), + weekdaysMin : "вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD-MM-YYYY", + LL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]", + LLL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT", + LLLL : "dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT" + }, + calendar : { + sameDay: '[ПаÑн] LT [Ñехетре]', + nextDay: '[Ыран] LT [Ñехетре]', + lastDay: '[Ĕнер] LT [Ñехетре]', + nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', + lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /Ñехет$/i.exec(output) ? "рен" : /çул$/i.exec(output) ? "тан" : "ран"; + return output + affix; + }, + past : "%s каÑлла", + s : "пĕр-ик çеккунт", + m : "пĕр минут", + mm : "%d минут", + h : "пĕр Ñехет", + hh : "%d Ñехет", + d : "пĕр кун", + dd : "%d кун", + M : "пĕр уйăх", + MM : "%d уйăх", + y : "пĕр çул", + yy : "%d çул" + }, + ordinal : '%d-мĕш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : danish (da) +// author : Ulrik Nielsen : https://github.com/mrbase + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('da', { + months : "januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"), + monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"), + weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"), + weekdaysShort : "søn_man_tir_ons_tor_fre_lør".split("_"), + weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D. MMMM, YYYY LT" + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I gÃ¥r kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : "om %s", + past : "%s siden", + s : "fÃ¥ sekunder", + m : "et minut", + mm : "%d minutter", + h : "en time", + hh : "%d timer", + d : "en dag", + dd : "%d dage", + M : "en mÃ¥ned", + MM : "%d mÃ¥neder", + y : "et Ã¥r", + yy : "%d Ã¥r" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : german (de) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.lang('de', { + months : "Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"), + monthsShort : "Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"), + weekdays : "Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"), + weekdaysShort : "So._Mo._Di._Mi._Do._Fr._Sa.".split("_"), + weekdaysMin : "So_Mo_Di_Mi_Do_Fr_Sa".split("_"), + longDateFormat : { + LT: "H:mm [Uhr]", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay: "[Heute um] LT", + sameElse: "L", + nextDay: '[Morgen um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gestern um] LT', + lastWeek: '[letzten] dddd [um] LT' + }, + relativeTime : { + future : "in %s", + past : "vor %s", + s : "ein paar Sekunden", + m : processRelativeTime, + mm : "%d Minuten", + h : processRelativeTime, + hh : "%d Stunden", + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : modern greek (el) +// author : Aggelos Karalias : https://github.com/mehiel + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('el', { + monthsNominativeEl : "ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"), + monthsGenitiveEl : "ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf("MMMM")))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : "Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"), + weekdays : "ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"), + weekdaysShort : "ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"), + weekdaysMin : "Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + longDateFormat : { + LT : "h:mm A", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendarEl : { + sameDay : '[ΣήμεÏα {}] LT', + nextDay : '[ΑÏÏιο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : '[την Ï€ÏοηγοÏμενη] dddd [{}] LT', + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + + return output.replace("{}", (hours % 12 === 1 ? "στη" : "στις")); + }, + relativeTime : { + future : "σε %s", + past : "%s Ï€Ïιν", + s : "δευτεÏόλεπτα", + m : "ένα λεπτό", + mm : "%d λεπτά", + h : "μία ÏŽÏα", + hh : "%d ÏŽÏες", + d : "μία μέÏα", + dd : "%d μέÏες", + M : "ένας μήνας", + MM : "%d μήνες", + y : "ένας χÏόνος", + yy : "%d χÏόνια" + }, + ordinal : function (number) { + return number + 'η'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : australian english (en-au) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('en-au', { + months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + longDateFormat : { + LT : "h:mm A", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + ordinal : function (number) { + var b = number % 10, + output = (~~ (number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : canadian english (en-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('en-ca', { + months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + longDateFormat : { + LT : "h:mm A", + L : "YYYY-MM-DD", + LL : "D MMMM, YYYY", + LLL : "D MMMM, YYYY LT", + LLLL : "dddd, D MMMM, YYYY LT" + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + ordinal : function (number) { + var b = number % 10, + output = (~~ (number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); +})); + +// moment.js language configuration +// language : great britain english (en-gb) +// author : Chris Gedrim : https://github.com/chrisgedrim + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('en-gb', { + months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + ordinal : function (number) { + var b = number % 10, + output = (~~ (number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : esperanto (eo) +// author : Colin Dean : https://github.com/colindean +// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. +// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('eo', { + months : "januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"), + monthsShort : "jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"), + weekdays : "Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"), + weekdaysShort : "Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"), + weekdaysMin : "Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "D[-an de] MMMM, YYYY", + LLL : "D[-an de] MMMM, YYYY LT", + LLLL : "dddd, [la] D[-an de] MMMM, YYYY LT" + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[HodiaÅ­ je] LT', + nextDay : '[MorgaÅ­ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[HieraÅ­ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : "je %s", + past : "antaÅ­ %s", + s : "sekundoj", + m : "minuto", + mm : "%d minutoj", + h : "horo", + hh : "%d horoj", + d : "tago",//ne 'diurno', ĉar estas uzita por proksimumo + dd : "%d tagoj", + M : "monato", + MM : "%d monatoj", + y : "jaro", + yy : "%d jaroj" + }, + ordinal : "%da", + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('es', { + months : "enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"), + monthsShort : "ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"), + weekdays : "domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"), + weekdaysShort : "dom._lun._mar._mié._jue._vie._sáb.".split("_"), + weekdaysMin : "Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D [de] MMMM [de] YYYY", + LLL : "D [de] MMMM [de] YYYY LT", + LLLL : "dddd, D [de] MMMM [de] YYYY LT" + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : "en %s", + past : "hace %s", + s : "unos segundos", + m : "un minuto", + mm : "%d minutos", + h : "una hora", + hh : "%d horas", + d : "un día", + dd : "%d días", + M : "un mes", + MM : "%d meses", + y : "un año", + yy : "%d años" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : estonian (et) +// author : Henry Kehlmann : https://github.com/madhenry + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function translateSeconds(number, withoutSuffix, key, isFuture) { + return (isFuture || withoutSuffix) ? 'paari sekundi' : 'paar sekundit'; + } + + return moment.lang('et', { + months : "jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"), + monthsShort : "jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"), + weekdays : "pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"), + weekdaysShort : "P_E_T_K_N_R_L".split("_"), + weekdaysMin : "P_E_T_K_N_R_L".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s pärast", + past : "%s tagasi", + s : translateSeconds, + m : "minut", + mm : "%d minutit", + h : "tund", + hh : "%d tundi", + d : "päev", + dd : "%d päeva", + M : "kuu", + MM : "%d kuud", + y : "aasta", + yy : "%d aastat" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : euskara (eu) +// author : Eneko Illarramendi : https://github.com/eillarra + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('eu', { + months : "urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"), + monthsShort : "urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"), + weekdays : "igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"), + weekdaysShort : "ig._al._ar._az._og._ol._lr.".split("_"), + weekdaysMin : "ig_al_ar_az_og_ol_lr".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "YYYY[ko] MMMM[ren] D[a]", + LLL : "YYYY[ko] MMMM[ren] D[a] LT", + LLLL : "dddd, YYYY[ko] MMMM[ren] D[a] LT", + l : "YYYY-M-D", + ll : "YYYY[ko] MMM D[a]", + lll : "YYYY[ko] MMM D[a] LT", + llll : "ddd, YYYY[ko] MMM D[a] LT" + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : "%s barru", + past : "duela %s", + s : "segundo batzuk", + m : "minutu bat", + mm : "%d minutu", + h : "ordu bat", + hh : "%d ordu", + d : "egun bat", + dd : "%d egun", + M : "hilabete bat", + MM : "%d hilabete", + y : "urte bat", + yy : "%d urte" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : Persian Language +// author : Ebrahim Byagowi : https://github.com/ebraminio + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var symbolMap = { + '1': 'Û±', + '2': 'Û²', + '3': 'Û³', + '4': 'Û´', + '5': 'Ûµ', + '6': 'Û¶', + '7': 'Û·', + '8': 'Û¸', + '9': 'Û¹', + '0': 'Û°' + }, numberMap = { + 'Û±': '1', + 'Û²': '2', + 'Û³': '3', + 'Û´': '4', + 'Ûµ': '5', + 'Û¶': '6', + 'Û·': '7', + 'Û¸': '8', + 'Û¹': '9', + 'Û°': '0' + }; + + return moment.lang('fa', { + months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), + longDateFormat : { + LT : 'HH:mm', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return "قبل از ظهر"; + } else { + return "بعد از ظهر"; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[Ùردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[Û°-Û¹]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + ordinal : '%dÙ…', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : finnish (fi) +// author : Tarmo Aidantausta : https://github.com/bleadof + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var numbers_past = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbers_future = ['nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbers_past[7], numbers_past[8], numbers_past[9]]; + + function translate(number, withoutSuffix, key, isFuture) { + var result = ""; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbal_number(number, isFuture) + " " + result; + return result; + } + + function verbal_number(number, isFuture) { + return number < 10 ? (isFuture ? numbers_future[number] : numbers_past[number]) : number; + } + + return moment.lang('fi', { + months : "tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"), + monthsShort : "tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"), + weekdays : "sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"), + weekdaysShort : "su_ma_ti_ke_to_pe_la".split("_"), + weekdaysMin : "su_ma_ti_ke_to_pe_la".split("_"), + longDateFormat : { + LT : "HH.mm", + L : "DD.MM.YYYY", + LL : "Do MMMM[ta] YYYY", + LLL : "Do MMMM[ta] YYYY, [klo] LT", + LLLL : "dddd, Do MMMM[ta] YYYY, [klo] LT", + l : "D.M.YYYY", + ll : "Do MMM YYYY", + lll : "Do MMM YYYY, [klo] LT", + llll : "ddd, Do MMM YYYY, [klo] LT" + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s päästä", + past : "%s sitten", + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : "%d.", + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : canadian french (fr-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('fr-ca', { + months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"), + monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"), + weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"), + weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"), + weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[Aujourd'hui à] LT", + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : "dans %s", + past : "il y a %s", + s : "quelques secondes", + m : "une minute", + mm : "%d minutes", + h : "une heure", + hh : "%d heures", + d : "un jour", + dd : "%d jours", + M : "un mois", + MM : "%d mois", + y : "un an", + yy : "%d ans" + }, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + } + }); +})); + +// moment.js language configuration +// language : french (fr) +// author : John Fischer : https://github.com/jfroffice + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('fr', { + months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"), + monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"), + weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"), + weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"), + weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[Aujourd'hui à] LT", + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : "dans %s", + past : "il y a %s", + s : "quelques secondes", + m : "une minute", + mm : "%d minutes", + h : "une heure", + hh : "%d heures", + d : "un jour", + dd : "%d jours", + M : "un mois", + MM : "%d mois", + y : "un an", + yy : "%d ans" + }, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : galician (gl) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('gl', { + months : "Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"), + monthsShort : "Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"), + weekdays : "Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"), + weekdaysShort : "Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"), + weekdaysMin : "Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === "uns segundos") { + return "nuns segundos"; + } + return "en " + str; + }, + past : "hai %s", + s : "uns segundos", + m : "un minuto", + mm : "%d minutos", + h : "unha hora", + hh : "%d horas", + d : "un día", + dd : "%d días", + M : "un mes", + MM : "%d meses", + y : "un ano", + yy : "%d anos" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : Hebrew (he) +// author : Tomer Cohen : https://github.com/tomer +// author : Moshe Simantov : https://github.com/DevelopmentIL +// author : Tal Ater : https://github.com/TalAter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('he', { + months : "ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"), + monthsShort : "ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"), + weekdays : "ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"), + weekdaysShort : "×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"), + weekdaysMin : "×_ב_×’_ד_×”_ו_ש".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D [ב]MMMM YYYY", + LLL : "D [ב]MMMM YYYY LT", + LLLL : "dddd, D [ב]MMMM YYYY LT", + l : "D/M/YYYY", + ll : "D MMM YYYY", + lll : "D MMM YYYY LT", + llll : "ddd, D MMM YYYY LT" + }, + calendar : { + sameDay : '[×”×™×•× ×‘Ö¾]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[×תמול ב־]LT', + lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : "בעוד %s", + past : "לפני %s", + s : "מספר שניות", + m : "דקה", + mm : "%d דקות", + h : "שעה", + hh : function (number) { + if (number === 2) { + return "שעתיי×"; + } + return number + " שעות"; + }, + d : "יו×", + dd : function (number) { + if (number === 2) { + return "יומיי×"; + } + return number + " ימי×"; + }, + M : "חודש", + MM : function (number) { + if (number === 2) { + return "חודשיי×"; + } + return number + " חודשי×"; + }, + y : "שנה", + yy : function (number) { + if (number === 2) { + return "שנתיי×"; + } + return number + " שני×"; + } + } + }); +})); + +// moment.js language configuration +// language : hindi (hi) +// author : Mayank Singhal : https://github.com/mayanksinghal + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.lang('hi', { + months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split("_"), + monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split("_"), + weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split("_"), + weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split("_"), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split("_"), + longDateFormat : { + LT : "A h:mm बजे", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY, LT", + LLLL : "dddd, D MMMM YYYY, LT" + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s में", + past : "%s पहले", + s : "कà¥à¤› ही कà¥à¤·à¤£", + m : "à¤à¤• मिनट", + mm : "%d मिनट", + h : "à¤à¤• घंटा", + hh : "%d घंटे", + d : "à¤à¤• दिन", + dd : "%d दिन", + M : "à¤à¤• महीने", + MM : "%d महीने", + y : "à¤à¤• वरà¥à¤·", + yy : "%d वरà¥à¤·" + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return "रात"; + } else if (hour < 10) { + return "सà¥à¤¬à¤¹"; + } else if (hour < 17) { + return "दोपहर"; + } else if (hour < 20) { + return "शाम"; + } else { + return "रात"; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : hrvatski (hr) +// author : Bojan Marković : https://github.com/bmarkovic + +// based on (sl) translation by Robert SedovÅ¡ek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + + function translate(number, withoutSuffix, key) { + var result = number + " "; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.lang('hr', { + months : "sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"), + monthsShort : "sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"), + weekdays : "nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"), + weekdaysShort : "ned._pon._uto._sri._Äet._pet._sub.".split("_"), + weekdaysMin : "ne_po_ut_sr_Äe_pe_su".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD. MM. YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : "za %s", + past : "prije %s", + s : "par sekundi", + m : translate, + mm : translate, + h : translate, + hh : translate, + d : "dan", + dd : translate, + M : "mjesec", + MM : translate, + y : "godinu", + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : hungarian (hu) +// author : Adam Brunner : https://github.com/adambrunner + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); + + function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + + return ''; + } + + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + return moment.lang('hu', { + months : "január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"), + monthsShort : "jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"), + weekdays : "vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"), + weekdaysShort : "vas_hét_kedd_sze_csüt_pén_szo".split("_"), + weekdaysMin : "v_h_k_sze_cs_p_szo".split("_"), + longDateFormat : { + LT : "H:mm", + L : "YYYY.MM.DD.", + LL : "YYYY. MMMM D.", + LLL : "YYYY. MMMM D., LT", + LLLL : "YYYY. MMMM D., dddd LT" + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : "%s múlva", + past : "%s", + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : Bahasa Indonesia (id) +// author : Mohammad Satrio Utomo : https://github.com/tyok +// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('id', { + months : "Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"), + monthsShort : "Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"), + weekdays : "Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"), + weekdaysShort : "Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"), + weekdaysMin : "Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"), + longDateFormat : { + LT : "HH.mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY [pukul] LT", + LLLL : "dddd, D MMMM YYYY [pukul] LT" + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : "dalam %s", + past : "%s yang lalu", + s : "beberapa detik", + m : "semenit", + mm : "%d menit", + h : "sejam", + hh : "%d jam", + d : "sehari", + dd : "%d hari", + M : "sebulan", + MM : "%d bulan", + y : "setahun", + yy : "%d tahun" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : icelandic (is) +// author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + " "; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + return moment.lang('is', { + months : "janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"), + monthsShort : "jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"), + weekdays : "sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"), + weekdaysShort : "sun_mán_þri_mið_fim_fös_lau".split("_"), + weekdaysMin : "Su_Má_Þr_Mi_Fi_Fö_La".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY [kl.] LT", + LLLL : "dddd, D. MMMM YYYY [kl.] LT" + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : "eftir %s", + past : "fyrir %s síðan", + s : translate, + m : translate, + mm : translate, + h : "klukkustund", + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : italian (it) +// author : Lorenzo : https://github.com/aliem +// author: Mattia Larentis: https://github.com/nostalgiaz + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('it', { + months : "Gennaio_Febbraio_Marzo_Aprile_Maggio_Giugno_Luglio_Agosto_Settembre_Ottobre_Novembre_Dicembre".split("_"), + monthsShort : "Gen_Feb_Mar_Apr_Mag_Giu_Lug_Ago_Set_Ott_Nov_Dic".split("_"), + weekdays : "Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"), + weekdaysShort : "Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"), + weekdaysMin : "D_L_Ma_Me_G_V_S".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: '[lo scorso] dddd [alle] LT', + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? "tra" : "in") + " " + s; + }, + past : "%s fa", + s : "secondi", + m : "un minuto", + mm : "%d minuti", + h : "un'ora", + hh : "%d ore", + d : "un giorno", + dd : "%d giorni", + M : "un mese", + MM : "%d mesi", + y : "un anno", + yy : "%d anni" + }, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : japanese (ja) +// author : LI Long : https://github.com/baryon + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ja', { + months : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), + monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), + weekdays : "日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"), + weekdaysShort : "æ—¥_月_ç«_æ°´_木_金_土".split("_"), + weekdaysMin : "æ—¥_月_ç«_æ°´_木_金_土".split("_"), + longDateFormat : { + LT : "Ah時m分", + L : "YYYY/MM/DD", + LL : "YYYYå¹´M月Dæ—¥", + LLL : "YYYYå¹´M月Dæ—¥LT", + LLLL : "YYYYå¹´M月Dæ—¥LT dddd" + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return "åˆå‰"; + } else { + return "åˆå¾Œ"; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[æ¥é€±]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[å‰é€±]dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s後", + past : "%så‰", + s : "数秒", + m : "1分", + mm : "%d分", + h : "1時間", + hh : "%d時間", + d : "1æ—¥", + dd : "%dæ—¥", + M : "1ヶ月", + MM : "%dヶ月", + y : "1å¹´", + yy : "%då¹´" + } + }); +})); + +// moment.js language configuration +// language : Georgian (ka) +// author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), + 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') + }, + + nounCase = (/D[oD] *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), + 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') + }, + + nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.lang('ka', { + months : monthsCaseReplace, + monthsShort : "იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"), + weekdays : weekdaysCaseReplace, + weekdaysShort : "კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"), + weekdaysMin : "კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"), + longDateFormat : { + LT : "h:mm A", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვáƒáƒš] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინáƒ] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? + s.replace(/ი$/, "ში") : + s + "ში"; + }, + past : function (s) { + if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, "ის წინ"); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, "წლის წინ"); + } + }, + s : "რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜", + m : "წუთი", + mm : "%d წუთი", + h : "სáƒáƒáƒ—ი", + hh : "%d სáƒáƒáƒ—ი", + d : "დღე", + dd : "%d დღე", + M : "თვე", + MM : "%d თვე", + y : "წელი", + yy : "%d წელი" + }, + ordinal : function (number) { + if (number === 0) { + return number; + } + + if (number === 1) { + return number + "-ლი"; + } + + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return "მე-" + number; + } + + return number + "-ე"; + }, + week : { + dow : 1, + doy : 7 + } + }); +})); + +// moment.js language configuration +// language : korean (ko) +// author : Kyungwook, Park : https://github.com/kyungw00k + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ko', { + months : "1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"), + monthsShort : "1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"), + weekdays : "ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"), + weekdaysShort : "ì¼_ì›”_í™”_수_목_금_토".split("_"), + weekdaysMin : "ì¼_ì›”_í™”_수_목_금_토".split("_"), + longDateFormat : { + LT : "A hì‹œ mm분", + L : "YYYY.MM.DD", + LL : "YYYYë…„ MMMM Dì¼", + LLL : "YYYYë…„ MMMM Dì¼ LT", + LLLL : "YYYYë…„ MMMM Dì¼ dddd LT" + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + }, + calendar : { + sameDay : '오늘 LT', + nextDay : 'ë‚´ì¼ LT', + nextWeek : 'dddd LT', + lastDay : 'ì–´ì œ LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s 후", + past : "%s ì „", + s : "몇초", + ss : "%dì´ˆ", + m : "ì¼ë¶„", + mm : "%d분", + h : "한시간", + hh : "%d시간", + d : "하루", + dd : "%dì¼", + M : "한달", + MM : "%d달", + y : "ì¼ë…„", + yy : "%dë…„" + }, + ordinal : '%dì¼' + }); +})); + +// moment.js language configuration +// language : Lithuanian (lt) +// author : Mindaugas MozÅ«ras : https://github.com/mmozuras + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var units = { + "m" : "minutÄ—_minutÄ—s_minutÄ™", + "mm": "minutÄ—s_minuÄių_minutes", + "h" : "valanda_valandos_valandÄ…", + "hh": "valandos_valandų_valandas", + "d" : "diena_dienos_dienÄ…", + "dd": "dienos_dienų_dienas", + "M" : "mÄ—nuo_mÄ—nesio_mÄ—nesį", + "MM": "mÄ—nesiai_mÄ—nesių_mÄ—nesius", + "y" : "metai_metų_metus", + "yy": "metai_metų_metus" + }, + weekDays = "pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis_sekmadienis".split("_"); + + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return "kelios sekundÄ—s"; + } else { + return isFuture ? "kelių sekundžių" : "kelias sekundes"; + } + } + + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + + function forms(key) { + return units[key].split("_"); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + " "; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + + function relativeWeekDay(moment, format) { + var nominative = format.indexOf('dddd LT') === -1, + weekDay = weekDays[moment.weekday()]; + + return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + "į"; + } + + return moment.lang("lt", { + months : "sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"), + monthsShort : "sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"), + weekdays : relativeWeekDay, + weekdaysShort : "Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"), + weekdaysMin : "S_P_A_T_K_Pn_Å ".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "YYYY [m.] MMMM D [d.]", + LLL : "YYYY [m.] MMMM D [d.], LT [val.]", + LLLL : "YYYY [m.] MMMM D [d.], dddd, LT [val.]", + l : "YYYY-MM-DD", + ll : "YYYY [m.] MMMM D [d.]", + lll : "YYYY [m.] MMMM D [d.], LT [val.]", + llll : "YYYY [m.] MMMM D [d.], ddd, LT [val.]" + }, + calendar : { + sameDay : "[Å iandien] LT", + nextDay : "[Rytoj] LT", + nextWeek : "dddd LT", + lastDay : "[Vakar] LT", + lastWeek : "[PraÄ—jusį] dddd LT", + sameElse : "L" + }, + relativeTime : { + future : "po %s", + past : "prieÅ¡ %s", + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : latvian (lv) +// author : Kristaps Karlsons : https://github.com/skakri + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var units = { + 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', + 'hh': 'stundu_stundas_stunda_stundas', + 'dd': 'dienu_dienas_diena_dienas', + 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', + 'yy': 'gadu_gadus_gads_gadi' + }; + + function format(word, number, withoutSuffix) { + var forms = word.split('_'); + if (withoutSuffix) { + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + + return moment.lang('lv', { + months : "janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"), + monthsShort : "jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"), + weekdays : "svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"), + weekdaysShort : "Sv_P_O_T_C_Pk_S".split("_"), + weekdaysMin : "Sv_P_O_T_C_Pk_S".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "YYYY. [gada] D. MMMM", + LLL : "YYYY. [gada] D. MMMM, LT", + LLLL : "YYYY. [gada] D. MMMM, dddd, LT" + }, + calendar : { + sameDay : '[Å odien pulksten] LT', + nextDay : '[RÄ«t pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s vÄ“lÄk", + past : "%s agrÄk", + s : "dažas sekundes", + m : "minÅ«ti", + mm : relativeTimeWithPlural, + h : "stundu", + hh : relativeTimeWithPlural, + d : "dienu", + dd : relativeTimeWithPlural, + M : "mÄ“nesi", + MM : relativeTimeWithPlural, + y : "gadu", + yy : relativeTimeWithPlural + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : malayalam (ml) +// author : Floyd Pink : https://github.com/floydpink + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ml', { + months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split("_"), + monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split("_"), + weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split("_"), + weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split("_"), + weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split("_"), + longDateFormat : { + LT : "A h:mm -à´¨àµ", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY, LT", + LLLL : "dddd, D MMMM YYYY, LT" + }, + calendar : { + sameDay : '[ഇനàµà´¨àµ] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇനàµà´¨à´²àµ†] LT', + lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s à´•à´´à´¿à´žàµà´žàµ", + past : "%s à´®àµàµ»à´ªàµ", + s : "അൽപ നിമിഷങàµà´™àµ¾", + m : "ഒരൠമിനിറàµà´±àµ", + mm : "%d മിനിറàµà´±àµ", + h : "ഒരൠമണികàµà´•àµ‚ർ", + hh : "%d മണികàµà´•àµ‚ർ", + d : "ഒരൠദിവസം", + dd : "%d ദിവസം", + M : "ഒരൠമാസം", + MM : "%d മാസം", + y : "ഒരൠവർഷം", + yy : "%d വർഷം" + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return "രാതàµà´°à´¿"; + } else if (hour < 12) { + return "രാവിലെ"; + } else if (hour < 17) { + return "ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ"; + } else if (hour < 20) { + return "വൈകàµà´¨àµà´¨àµ‡à´°à´‚"; + } else { + return "രാതàµà´°à´¿"; + } + } + }); +})); + +// moment.js language configuration +// language : Marathi (mr) +// author : Harshad Kale : https://github.com/kalehv + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.lang('mr', { + months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split("_"), + monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split("_"), + weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split("_"), + weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split("_"), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split("_"), + longDateFormat : { + LT : "A h:mm वाजता", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY, LT", + LLLL : "dddd, D MMMM YYYY, LT" + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उदà¥à¤¯à¤¾] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s नंतर", + past : "%s पूरà¥à¤µà¥€", + s : "सेकंद", + m: "à¤à¤• मिनिट", + mm: "%d मिनिटे", + h : "à¤à¤• तास", + hh : "%d तास", + d : "à¤à¤• दिवस", + dd : "%d दिवस", + M : "à¤à¤• महिना", + MM : "%d महिने", + y : "à¤à¤• वरà¥à¤·", + yy : "%d वरà¥à¤·à¥‡" + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiem: function (hour, minute, isLower) + { + if (hour < 4) { + return "रातà¥à¤°à¥€"; + } else if (hour < 10) { + return "सकाळी"; + } else if (hour < 17) { + return "दà¥à¤ªà¤¾à¤°à¥€"; + } else if (hour < 20) { + return "सायंकाळी"; + } else { + return "रातà¥à¤°à¥€"; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : Bahasa Malaysia (ms-MY) +// author : Weldan Jamili : https://github.com/weldan + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ms-my', { + months : "Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"), + monthsShort : "Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"), + weekdays : "Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"), + weekdaysShort : "Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"), + weekdaysMin : "Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"), + longDateFormat : { + LT : "HH.mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY [pukul] LT", + LLLL : "dddd, D MMMM YYYY [pukul] LT" + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : "dalam %s", + past : "%s yang lepas", + s : "beberapa saat", + m : "seminit", + mm : "%d minit", + h : "sejam", + hh : "%d jam", + d : "sehari", + dd : "%d hari", + M : "sebulan", + MM : "%d bulan", + y : "setahun", + yy : "%d tahun" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : norwegian bokmÃ¥l (nb) +// authors : Espen Hovlandsdal : https://github.com/rexxars +// Sigurd Gartmann : https://github.com/sigurdga + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('nb', { + months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"), + monthsShort : "jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"), + weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"), + weekdaysShort : "sø._ma._ti._on._to._fr._lø.".split("_"), + weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"), + longDateFormat : { + LT : "H.mm", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY [kl.] LT", + LLLL : "dddd D. MMMM YYYY [kl.] LT" + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i gÃ¥r kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : "om %s", + past : "for %s siden", + s : "noen sekunder", + m : "ett minutt", + mm : "%d minutter", + h : "en time", + hh : "%d timer", + d : "en dag", + dd : "%d dager", + M : "en mÃ¥ned", + MM : "%d mÃ¥neder", + y : "ett Ã¥r", + yy : "%d Ã¥r" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : nepali/nepalese +// author : suvash : https://github.com/suvash + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.lang('ne', { + months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split("_"), + monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split("_"), + weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split("_"), + weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split("_"), + weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split("_"), + longDateFormat : { + LT : "Aको h:mm बजे", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY, LT", + LLLL : "dddd, D MMMM YYYY, LT" + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return "राती"; + } else if (hour < 10) { + return "बिहान"; + } else if (hour < 15) { + return "दिउà¤à¤¸à¥‹"; + } else if (hour < 18) { + return "बेलà¥à¤•à¤¾"; + } else if (hour < 20) { + return "साà¤à¤"; + } else { + return "राती"; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोली] LT', + nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : "%sमा", + past : "%s अगाडी", + s : "केही समय", + m : "à¤à¤• मिनेट", + mm : "%d मिनेट", + h : "à¤à¤• घणà¥à¤Ÿà¤¾", + hh : "%d घणà¥à¤Ÿà¤¾", + d : "à¤à¤• दिन", + dd : "%d दिन", + M : "à¤à¤• महिना", + MM : "%d महिना", + y : "à¤à¤• बरà¥à¤·", + yy : "%d बरà¥à¤·" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : dutch (nl) +// author : Joris Röling : https://github.com/jjupiter + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var monthsShortWithDots = "jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"), + monthsShortWithoutDots = "jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"); + + return moment.lang('nl', { + months : "januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : "zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"), + weekdaysShort : "zo._ma._di._wo._do._vr._za.".split("_"), + weekdaysMin : "Zo_Ma_Di_Wo_Do_Vr_Za".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD-MM-YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : "over %s", + past : "%s geleden", + s : "een paar seconden", + m : "één minuut", + mm : "%d minuten", + h : "één uur", + hh : "%d uur", + d : "één dag", + dd : "%d dagen", + M : "één maand", + MM : "%d maanden", + y : "één jaar", + yy : "%d jaar" + }, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : norwegian nynorsk (nn) +// author : https://github.com/mechuwind + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('nn', { + months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"), + monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"), + weekdays : "sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"), + weekdaysShort : "sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"), + weekdaysMin : "su_mÃ¥_ty_on_to_fr_lø".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I gÃ¥r klokka] LT', + lastWeek: '[FøregÃ¥ende] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : "om %s", + past : "for %s siden", + s : "noen sekund", + m : "ett minutt", + mm : "%d minutt", + h : "en time", + hh : "%d timar", + d : "en dag", + dd : "%d dagar", + M : "en mÃ¥nad", + MM : "%d mÃ¥nader", + y : "ett Ã¥r", + yy : "%d Ã¥r" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : polish (pl) +// author : Rafal Hirsz : https://github.com/evoL + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var monthsNominative = "styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"), + monthsSubjective = "stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_"); + + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key) { + var result = number + " "; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutÄ™'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinÄ™'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + return moment.lang('pl', { + months : function (momentToFormat, format) { + if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : "sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"), + weekdays : "niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"), + weekdaysShort : "nie_pon_wt_Å›r_czw_pt_sb".split("_"), + weekdaysMin : "N_Pn_Wt_Åšr_Cz_Pt_So".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay: '[DziÅ› o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; + case 3: + return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; + case 6: + return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; + default: + return '[W zeszÅ‚y] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : "za %s", + past : "%s temu", + s : "kilka sekund", + m : translate, + mm : translate, + h : translate, + hh : translate, + d : "1 dzieÅ„", + dd : '%d dni', + M : "miesiÄ…c", + MM : translate, + y : "rok", + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : brazilian portuguese (pt-br) +// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('pt-br', { + months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"), + monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"), + weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"), + weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"), + weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D [de] MMMM [de] YYYY", + LLL : "D [de] MMMM [de] YYYY LT", + LLLL : "dddd, D [de] MMMM [de] YYYY LT" + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : "em %s", + past : "%s atrás", + s : "segundos", + m : "um minuto", + mm : "%d minutos", + h : "uma hora", + hh : "%d horas", + d : "um dia", + dd : "%d dias", + M : "um mês", + MM : "%d meses", + y : "um ano", + yy : "%d anos" + }, + ordinal : '%dº' + }); +})); + +// moment.js language configuration +// language : portuguese (pt) +// author : Jefferson : https://github.com/jalex79 + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('pt', { + months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"), + monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"), + weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"), + weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"), + weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D [de] MMMM [de] YYYY", + LLL : "D [de] MMMM [de] YYYY LT", + LLLL : "dddd, D [de] MMMM [de] YYYY LT" + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : "em %s", + past : "%s atrás", + s : "segundos", + m : "um minuto", + mm : "%d minutos", + h : "uma hora", + hh : "%d horas", + d : "um dia", + dd : "%d dias", + M : "um mês", + MM : "%d meses", + y : "um ano", + yy : "%d anos" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : romanian (ro) +// author : Vlad Gurdiga : https://github.com/gurdiga +// author : Valentin Agachi : https://github.com/avaly + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('ro', { + months : "Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie".split("_"), + monthsShort : "Ian_Feb_Mar_Apr_Mai_Iun_Iul_Aug_Sep_Oct_Noi_Dec".split("_"), + weekdays : "Duminică_Luni_MarÅ£i_Miercuri_Joi_Vineri_Sâmbătă".split("_"), + weekdaysShort : "Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"), + weekdaysMin : "Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY H:mm", + LLLL : "dddd, D MMMM YYYY H:mm" + }, + calendar : { + sameDay: "[azi la] LT", + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : "peste %s", + past : "%s în urmă", + s : "câteva secunde", + m : "un minut", + mm : "%d minute", + h : "o oră", + hh : "%d ore", + d : "o zi", + dd : "%d zile", + M : "o lună", + MM : "%d luni", + y : "un an", + yy : "%d ani" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : russian (ru) +// author : Viktorminator : https://github.com/Viktorminator +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'минута_минуты_минут', + 'hh': 'чаÑ_чаÑа_чаÑов', + 'dd': 'день_днÑ_дней', + 'MM': 'меÑÑц_меÑÑца_меÑÑцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = { + 'nominative': 'Ñнв_фев_мар_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), + 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return monthsShort[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), + 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.lang('ru', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : "вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + weekdaysMin : "вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY г.", + LLL : "D MMMM YYYY г., LT", + LLLL : "dddd, D MMMM YYYY г., LT" + }, + calendar : { + sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function () { + return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + return '[Ð’ прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[Ð’ прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[Ð’ прошлую] dddd [в] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : "через %s", + past : "%s назад", + s : "неÑколько Ñекунд", + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : "чаÑ", + hh : relativeTimeWithPlural, + d : "день", + dd : relativeTimeWithPlural, + M : "меÑÑц", + MM : relativeTimeWithPlural, + y : "год", + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return "ночи"; + } else if (hour < 12) { + return "утра"; + } else if (hour < 17) { + return "днÑ"; + } else { + return "вечера"; + } + }, + + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-Ñ'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : slovak (sk) +// author : Martin Minka : https://github.com/k2s +// based on work of petrbela : https://github.com/petrbela + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + var months = "január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"), + monthsShort = "jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_"); + + function plural(n) { + return (n > 1) && (n < 5); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + " "; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + return moment.lang('sk', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : "nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"), + weekdaysShort : "ne_po_ut_st_Å¡t_pi_so".split("_"), + weekdaysMin : "ne_po_ut_st_Å¡t_pi_so".split("_"), + longDateFormat : { + LT: "H:mm", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd D. MMMM YYYY LT" + }, + calendar : { + sameDay: "[dnes o] LT", + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo Å¡tvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[vÄera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: "L" + }, + relativeTime : { + future : "za %s", + past : "pred %s", + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : slovenian (sl) +// author : Robert SedovÅ¡ek : https://github.com/sedovsek + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + " "; + switch (key) { + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2) { + result += 'minuti'; + } else if (number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minut'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += 'ura'; + } else if (number === 2) { + result += 'uri'; + } else if (number === 3 || number === 4) { + result += 'ure'; + } else { + result += 'ur'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dni'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mesec'; + } else if (number === 2) { + result += 'meseca'; + } else if (number === 3 || number === 4) { + result += 'mesece'; + } else { + result += 'mesecev'; + } + return result; + case 'yy': + if (number === 1) { + result += 'leto'; + } else if (number === 2) { + result += 'leti'; + } else if (number === 3 || number === 4) { + result += 'leta'; + } else { + result += 'let'; + } + return result; + } + } + + return moment.lang('sl', { + months : "januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"), + monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"), + weekdays : "nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"), + weekdaysShort : "ned._pon._tor._sre._Äet._pet._sob.".split("_"), + weekdaysMin : "ne_po_to_sr_Äe_pe_so".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD. MM. YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[vÄeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[prejÅ¡nja] dddd [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejÅ¡nji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : "Äez %s", + past : "%s nazaj", + s : "nekaj sekund", + m : translate, + mm : translate, + h : translate, + hh : translate, + d : "en dan", + dd : translate, + M : "en mesec", + MM : translate, + y : "eno leto", + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : Albanian (sq) +// author : Flakërim Ismani : https://github.com/flakerimi +// author: Menelion Elensúle: https://github.com/Oire (tests) + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('sq', { + months : "Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"), + monthsShort : "Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"), + weekdays : "E Diel_E Hënë_E Marte_E Mërkure_E Enjte_E Premte_E Shtunë".split("_"), + weekdaysShort : "Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"), + weekdaysMin : "D_H_Ma_Më_E_P_Sh".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Neser në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : "në %s", + past : "%s me parë", + s : "disa seconda", + m : "një minut", + mm : "%d minutea", + h : "një orë", + hh : "%d orë", + d : "një ditë", + dd : "%d ditë", + M : "një muaj", + MM : "%d muaj", + y : "një vit", + yy : "%d vite" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : swedish (sv) +// author : Jens Alm : https://github.com/ulmus + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('sv', { + months : "januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"), + monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"), + weekdays : "söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"), + weekdaysShort : "sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"), + weekdaysMin : "sö_mÃ¥_ti_on_to_fr_lö".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[IgÃ¥r] LT', + nextWeek: 'dddd LT', + lastWeek: '[Förra] dddd[en] LT', + sameElse: 'L' + }, + relativeTime : { + future : "om %s", + past : "för %s sedan", + s : "nÃ¥gra sekunder", + m : "en minut", + mm : "%d minuter", + h : "en timme", + hh : "%d timmar", + d : "en dag", + dd : "%d dagar", + M : "en mÃ¥nad", + MM : "%d mÃ¥nader", + y : "ett Ã¥r", + yy : "%d Ã¥r" + }, + ordinal : function (number) { + var b = number % 10, + output = (~~ (number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : thai (th) +// author : Kridsada Thanabulpong : https://github.com/sirn + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('th', { + months : "มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"), + monthsShort : "มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"), + weekdays : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"), + weekdaysShort : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"), // yes, three characters difference + weekdaysMin : "อา._จ._อ._พ._พฤ._ศ._ส.".split("_"), + longDateFormat : { + LT : "H นาฬิà¸à¸² m นาที", + L : "YYYY/MM/DD", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY เวลา LT", + LLLL : "วันddddที่ D MMMM YYYY เวลา LT" + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return "à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง"; + } else { + return "หลังเที่ยง"; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : "อีภ%s", + past : "%sที่à¹à¸¥à¹‰à¸§", + s : "ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี", + m : "1 นาที", + mm : "%d นาที", + h : "1 ชั่วโมง", + hh : "%d ชั่วโมง", + d : "1 วัน", + dd : "%d วัน", + M : "1 เดือน", + MM : "%d เดือน", + y : "1 ปี", + yy : "%d ปี" + } + }); +})); + +// moment.js language configuration +// language : turkish (tr) +// authors : Erhan Gundogan : https://github.com/erhangundogan, +// Burak YiÄŸit Kaya: https://github.com/BYK + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + + var suffixes = { + 1: "'inci", + 5: "'inci", + 8: "'inci", + 70: "'inci", + 80: "'inci", + + 2: "'nci", + 7: "'nci", + 20: "'nci", + 50: "'nci", + + 3: "'üncü", + 4: "'üncü", + 100: "'üncü", + + 6: "'ncı", + + 9: "'uncu", + 10: "'uncu", + 30: "'uncu", + + 60: "'ıncı", + 90: "'ıncı" + }; + + return moment.lang('tr', { + months : "Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"), + monthsShort : "Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"), + weekdays : "Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"), + weekdaysShort : "Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"), + weekdaysMin : "Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s sonra", + past : "%s önce", + s : "birkaç saniye", + m : "bir dakika", + mm : "%d dakika", + h : "bir saat", + hh : "%d saat", + d : "bir gün", + dd : "%d gün", + M : "bir ay", + MM : "%d ay", + y : "bir yıl", + yy : "%d yıl" + }, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + "'ıncı"; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : Morocco Central Atlas TamaziÉ£t in Latin (tzm-la) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('tzm-la', { + months : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"), + monthsShort : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"), + weekdays : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"), + weekdaysShort : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"), + weekdaysMin : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[asdkh g] LT", + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : "dadkh s yan %s", + past : "yan %s", + s : "imik", + m : "minuá¸", + mm : "%d minuá¸", + h : "saÉ›a", + hh : "%d tassaÉ›in", + d : "ass", + dd : "%d ossan", + M : "ayowr", + MM : "%d iyyirn", + y : "asgas", + yy : "%d isgasn" + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : Morocco Central Atlas TamaziÉ£t (tzm) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('tzm', { + months : "ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"), + monthsShort : "ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"), + weekdays : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"), + weekdaysShort : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"), + weekdaysMin : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[ⴰⵙⴷⵅ â´´] LT", + nextDay: '[ⴰⵙⴽⴰ â´´] LT', + nextWeek: 'dddd [â´´] LT', + lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', + lastWeek: 'dddd [â´´] LT', + sameElse: 'L' + }, + relativeTime : { + future : "â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s", + past : "ⵢⴰⵠ%s", + s : "ⵉⵎⵉⴽ", + m : "ⵎⵉâµâµ“â´º", + mm : "%d ⵎⵉâµâµ“â´º", + h : "ⵙⴰⵄⴰ", + hh : "%d ⵜⴰⵙⵙⴰⵄⵉâµ", + d : "ⴰⵙⵙ", + dd : "%d oⵙⵙⴰâµ", + M : "â´°âµ¢oⵓⵔ", + MM : "%d ⵉⵢⵢⵉⵔâµ", + y : "ⴰⵙⴳⴰⵙ", + yy : "%d ⵉⵙⴳⴰⵙâµ" + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : ukrainian (uk) +// author : zemlanin : https://github.com/zemlanin +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'хвилина_хвилини_хвилин', + 'hh': 'година_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'міÑÑць_міÑÑці_міÑÑців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), + 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') + }, + + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + + return weekdays[nounCase][m.day()]; + } + + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + return moment.lang('uk', { + months : monthsCaseReplace, + monthsShort : "Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"), + weekdays : weekdaysCaseReplace, + weekdaysShort : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + weekdaysMin : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY Ñ€.", + LLL : "D MMMM YYYY Ñ€., LT", + LLLL : "dddd, D MMMM YYYY Ñ€., LT" + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : "за %s", + past : "%s тому", + s : "декілька Ñекунд", + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : "годину", + hh : relativeTimeWithPlural, + d : "день", + dd : relativeTimeWithPlural, + M : "міÑÑць", + MM : relativeTimeWithPlural, + y : "рік", + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return "ночі"; + } else if (hour < 12) { + return "ранку"; + } else if (hour < 17) { + return "днÑ"; + } else { + return "вечора"; + } + }, + + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : uzbek +// author : Sardor Muminov : https://github.com/muminoff + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('uz', { + months : "Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"), + monthsShort : "Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"), + weekdays : "Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"), + weekdaysShort : "Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"), + weekdaysMin : "Як_Ду_Се_Чо_Па_Жу_Ша".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "D MMMM YYYY, dddd LT" + }, + calendar : { + sameDay : '[Бугун Ñоат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни Ñоат] LT [да]', + lastDay : '[Кеча Ñоат] LT [да]', + lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : "Якин %s ичида", + past : "Бир неча %s олдин", + s : "фурÑат", + m : "бир дакика", + mm : "%d дакика", + h : "бир Ñоат", + hh : "%d Ñоат", + d : "бир кун", + dd : "%d кун", + M : "бир ой", + MM : "%d ой", + y : "бир йил", + yy : "%d йил" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : vietnamese (vn) +// author : Bang Nguyen : https://github.com/bangnk + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('vn', { + months : "tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"), + monthsShort : "Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"), + weekdays : "chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"), + weekdaysShort : "CN_T2_T3_T4_T5_T6_T7".split("_"), + weekdaysMin : "CN_T2_T3_T4_T5_T6_T7".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM [năm] YYYY", + LLL : "D MMMM [năm] YYYY LT", + LLLL : "dddd, D MMMM [năm] YYYY LT", + l : "DD/M/YYYY", + ll : "D MMM YYYY", + lll : "D MMM YYYY LT", + llll : "ddd, D MMM YYYY LT" + }, + calendar : { + sameDay: "[Hôm nay lúc] LT", + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tá»›i lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : "%s tá»›i", + past : "%s trÆ°á»›c", + s : "vài giây", + m : "má»™t phút", + mm : "%d phút", + h : "má»™t giá»", + hh : "%d giá»", + d : "má»™t ngày", + dd : "%d ngày", + M : "má»™t tháng", + MM : "%d tháng", + y : "má»™t năm", + yy : "%d năm" + }, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); + +// moment.js language configuration +// language : chinese +// author : suupic : https://github.com/suupic + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('zh-cn', { + months : "一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"), + monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), + weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"), + weekdaysShort : "周日_周一_周二_周三_周四_周五_周六".split("_"), + weekdaysMin : "æ—¥_一_二_三_å››_五_å…­".split("_"), + longDateFormat : { + LT : "Ah点mm", + L : "YYYYå¹´MMMDæ—¥", + LL : "YYYYå¹´MMMDæ—¥", + LLL : "YYYYå¹´MMMDæ—¥LT", + LLLL : "YYYYå¹´MMMDæ—¥ddddLT", + l : "YYYYå¹´MMMDæ—¥", + ll : "YYYYå¹´MMMDæ—¥", + lll : "YYYYå¹´MMMDæ—¥LT", + llll : "YYYYå¹´MMMDæ—¥ddddLT" + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return "早上"; + } else if (hm < 1130) { + return "上åˆ"; + } else if (hm < 1230) { + return "中åˆ"; + } else if (hm < 1800) { + return "下åˆ"; + } else { + return "晚上"; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinal : function (number, period) { + switch (period) { + case "d" : + case "D" : + case "DDD" : + return number + "æ—¥"; + case "M" : + return number + "月"; + case "w" : + case "W" : + return number + "周"; + default : + return number; + } + }, + relativeTime : { + future : "%s内", + past : "%så‰", + s : "几秒", + m : "1分钟", + mm : "%d分钟", + h : "1å°æ—¶", + hh : "%då°æ—¶", + d : "1天", + dd : "%d天", + M : "1个月", + MM : "%d个月", + y : "1å¹´", + yy : "%då¹´" + } + }); +})); + +// moment.js language configuration +// language : traditional chinese (zh-tw) +// author : Ben : https://github.com/ben-lin + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['moment'], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(require('../moment')); // Node + } else { + factory(window.moment); // Browser global + } +}(function (moment) { + return moment.lang('zh-tw', { + months : "一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"), + monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), + weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"), + weekdaysShort : "週日_週一_週二_週三_週四_週五_週六".split("_"), + weekdaysMin : "æ—¥_一_二_三_å››_五_å…­".split("_"), + longDateFormat : { + LT : "Ah點mm", + L : "YYYYå¹´MMMDæ—¥", + LL : "YYYYå¹´MMMDæ—¥", + LLL : "YYYYå¹´MMMDæ—¥LT", + LLLL : "YYYYå¹´MMMDæ—¥ddddLT", + l : "YYYYå¹´MMMDæ—¥", + ll : "YYYYå¹´MMMDæ—¥", + lll : "YYYYå¹´MMMDæ—¥LT", + llll : "YYYYå¹´MMMDæ—¥ddddLT" + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return "早上"; + } else if (hm < 1130) { + return "上åˆ"; + } else if (hm < 1230) { + return "中åˆ"; + } else if (hm < 1800) { + return "下åˆ"; + } else { + return "晚上"; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinal : function (number, period) { + switch (period) { + case "d" : + case "D" : + case "DDD" : + return number + "æ—¥"; + case "M" : + return number + "月"; + case "w" : + case "W" : + return number + "週"; + default : + return number; + } + }, + relativeTime : { + future : "%så…§", + past : "%så‰", + s : "幾秒", + m : "一分é˜", + mm : "%d分é˜", + h : "一å°æ™‚", + hh : "%då°æ™‚", + d : "一天", + dd : "%d天", + M : "一個月", + MM : "%d個月", + y : "一年", + yy : "%då¹´" + } + }); +})); diff --git a/vendors/moment/min/langs.min.js b/vendors/moment/min/langs.min.js new file mode 100644 index 000000000..1e8fa6076 --- /dev/null +++ b/vendors/moment/min/langs.min.js @@ -0,0 +1,3 @@ +!function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("ar-ma",{months:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("ar",{months:"يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),monthsShort:"يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("bg",{months:"Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),weekdaysShort:"нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"H:mm",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Ð”Ð½ÐµÑ Ð²] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Ð’ изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Ð’ изминалиÑ] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"Ñлед %s",past:"преди %s",s:"нÑколко Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дни",M:"меÑец",MM:"%d меÑеца",y:"година",yy:"%d години"},ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+"-ев":0===c?a+"-ен":c>10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b,c){var d={mm:"munutenn",MM:"miz",dd:"devezh"};return a+" "+e(d[c],a)}function c(a){switch(d(a)){case 1:case 3:case 4:case 5:case 9:return a+" bloaz";default:return a+" vloaz"}}function d(a){return a>9?d(a%10):a}function e(a,b){return 2===b?f(a):a}function f(a){var b={m:"v",b:"v",d:"z"};return void 0===b[a.charAt(0)]?a:b[a.charAt(0)]+a.substring(1)}return a.lang("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:b,h:"un eur",hh:"%d eur",d:"un devezh",dd:b,M:"ur miz",MM:b,y:"ur bloaz",yy:c},ordinal:function(a){var b=1===a?"añ":"vet";return a+b},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.lang("bs",{months:"januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("ca",{months:"Gener_Febrer_Març_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre".split("_"),monthsShort:"Gen._Febr._Mar._Abr._Mai._Jun._Jul._Ag._Set._Oct._Nov._Des.".split("_"),weekdays:"Diumenge_Dilluns_Dimarts_Dimecres_Dijous_Divendres_Dissabte".split("_"),weekdaysShort:"Dg._Dl._Dt._Dc._Dj._Dv._Ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a){return a>1&&5>a&&1!==~~(a/10)}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár vteÅ™in":"pár vteÅ™inami";case"m":return c?"minuta":e?"minutu":"minutou";case"mm":return c||e?f+(b(a)?"minuty":"minut"):f+"minutami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodin"):f+"hodinami";break;case"d":return c||e?"den":"dnem";case"dd":return c||e?f+(b(a)?"dny":"dní"):f+"dny";break;case"M":return c||e?"mÄ›síc":"mÄ›sícem";case"MM":return c||e?f+(b(a)?"mÄ›síce":"mÄ›síců"):f+"mÄ›síci";break;case"y":return c||e?"rok":"rokem";case"yy":return c||e?f+(b(a)?"roky":"let"):f+"lety"}}var d="leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),e="led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_");return a.lang("cs",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_Ät_pá_so".split("_"),weekdaysMin:"ne_po_út_st_Ät_pá_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedÄ›li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve stÅ™edu v] LT";case 4:return"[ve Ätvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[vÄera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou nedÄ›li v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou stÅ™edu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pÅ™ed %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("cv",{months:"кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"),weekdaysMin:"вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[ПаÑн] LT [Ñехетре]",nextDay:"[Ыран] LT [Ñехетре]",lastDay:"[Ĕнер] LT [Ñехетре]",nextWeek:"[ÇитеÑ] dddd LT [Ñехетре]",lastWeek:"[Иртнĕ] dddd LT [Ñехетре]",sameElse:"L"},relativeTime:{future:function(a){var b=/Ñехет$/i.exec(a)?"рен":/çул$/i.exec(a)?"тан":"ран";return a+b},past:"%s каÑлла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр Ñехет",hh:"%d Ñехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinal:"%d-мĕш",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I gÃ¥r kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"fÃ¥ sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"et Ã¥r",yy:"%d Ã¥r"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.lang("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("el",{monthsNominativeEl:"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),monthsGenitiveEl:"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),weekdays:"ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),weekdaysShort:"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[ΣήμεÏα {}] LT",nextDay:"[ΑÏÏιο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:"[την Ï€ÏοηγοÏμενη] dddd [{}] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return c.replace("{}",1===d%12?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s Ï€Ïιν",s:"δευτεÏόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ÏŽÏα",hh:"%d ÏŽÏες",d:"μία μέÏα",dd:"%d μέÏες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χÏόνος",yy:"%d χÏόνια"},ordinal:function(a){return a+"η"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiem:function(a,b,c){return a>11?c?"p.t.m.":"P.T.M.":c?"a.t.m.":"A.T.M."},calendar:{sameDay:"[HodiaÅ­ je] LT",nextDay:"[MorgaÅ­ je] LT",nextWeek:"dddd [je] LT",lastDay:"[HieraÅ­ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaÅ­ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinal:"%da",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:"ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b,c,d){return d||b?"paari sekundi":"paar sekundit"}return a.lang("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,m:"minut",mm:"%d minutit",h:"tund",hh:"%d tundi",d:"päev",dd:"%d päeva",M:"kuu",MM:"%d kuud",y:"aasta",yy:"%d aastat"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){var b={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},c={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"};return a.lang("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiem:function(a){return 12>a?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},ordinal:"%dÙ…",week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b,d,e){var f="";switch(d){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=c(a,e)+" "+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),e=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",d[7],d[8],d[9]];return a.lang("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(a){return a+(1===a?"er":"")}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(a){return"uns segundos"===a?"nuns segundos":"en "+a},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיי×":a+" שעות"},d:"יו×",dd:function(a){return 2===a?"יומיי×":a+" ימי×"},M:"חודש",MM:function(a){return 2===a?"חודשיי×":a+" חודשי×"},y:"שנה",yy:function(a){return 2===a?"שנתיי×":a+" שני×"}}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.lang("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a] +})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiem:function(a){return 4>a?"रात":10>a?"सà¥à¤¬à¤¹":17>a?"दोपहर":20>a?"शाम":"रात"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.lang("hr",{months:"sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function c(a){return(a?"":"[múlt] ")+"["+d[this.day()]+"] LT[-kor]"}var d="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" ");return a.lang("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(a){return 11>a?"pagi":15>a?"siang":19>a?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a){return 11===a%100?!0:1===a%10?!1:!0}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return c?"mínúta":"mínútu";case"mm":return b(a)?f+(c||e?"mínútur":"mínútum"):c?f+"mínúta":f+"mínútu";case"hh":return b(a)?f+(c||e?"klukkustundir":"klukkustundum"):f+"klukkustund";case"d":return c?"dagur":e?"dag":"degi";case"dd":return b(a)?c?f+"dagar":f+(e?"daga":"dögum"):c?f+"dagur":f+(e?"dag":"degi");case"M":return c?"mánuður":e?"mánuð":"mánuði";case"MM":return b(a)?c?f+"mánuðir":f+(e?"mánuði":"mánuðum"):c?f+"mánuður":f+(e?"mánuð":"mánuði");case"y":return c||e?"ár":"ári";case"yy":return b(a)?f+(c||e?"ár":"árum"):f+(c||e?"ár":"ári")}}return a.lang("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:c,m:c,mm:c,h:"klukkustund",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("it",{months:"Gennaio_Febbraio_Marzo_Aprile_Maggio_Giugno_Luglio_Agosto_Settembre_Ottobre_Novembre_Dicembre".split("_"),monthsShort:"Gen_Feb_Mar_Apr_Mag_Giu_Lug_Ago_Set_Ott_Nov_Dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:"[lo scorso] dddd [alle] LT",sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥LT",LLLL:"YYYYå¹´M月Dæ—¥LT dddd"},meridiem:function(a){return 12>a?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b){var c={nominative:"იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი".split("_"),accusative:"იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს".split("_")},d=/D[oD] *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a,b){var c={nominative:"კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი".split("_"),accusative:"კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს".split("_")},d=/(წინáƒ|შემდეგ)/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.lang("ka",{months:b,monthsShort:"იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"),weekdays:c,weekdaysShort:"კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"),weekdaysMin:"კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვáƒáƒš] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინáƒ] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/.test(a)?a.replace(/ი$/,"ში"):a+"ში"},past:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(a)?a.replace(/წელი$/,"წლის წინ"):void 0},s:"რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜",m:"წუთი",mm:"%d წუთი",h:"სáƒáƒáƒ—ი",hh:"%d სáƒáƒáƒ—ი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinal:function(a){return 0===a?a:1===a?a+"-ლი":20>a||100>=a&&0===a%20||0===a%100?"მე-"+a:a+"-ე"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ mm분",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ LT",LLLL:"YYYYë…„ MMMM Dì¼ dddd LT"},meridiem:function(a){return 12>a?"오전":"오후"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇초",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"한달",MM:"%d달",y:"ì¼ë…„",yy:"%dë…„"},ordinal:"%dì¼"})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b,c,d){return b?"kelios sekundÄ—s":d?"kelių sekundžių":"kelias sekundes"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2]}function d(a){return 0===a%10||a>10&&20>a}function e(a){return h[a].split("_")}function f(a,b,f,g){var h=a+" ";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}function g(a,b){var c=-1===b.indexOf("dddd LT"),d=i[a.weekday()];return c?d:d.substring(0,d.length-2)+"į"}var h={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i="pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis_sekmadienis".split("_");return a.lang("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:g,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:b,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinal:function(a){return a+"-oji"},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b,c){var d=a.split("_");return c?1===b%10&&11!==b?d[2]:d[3]:1===b%10&&11!==b?d[0]:d[1]}function c(a,c,e){return a+" "+b(d[e],a,c)}var d={mm:"minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i",yy:"gadu_gadus_gads_gadi"};return a.lang("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vÄ“lÄk",past:"%s agrÄk",s:"dažas sekundes",m:"minÅ«ti",mm:c,h:"stundu",hh:c,d:"dienu",dd:c,M:"mÄ“nesi",MM:c,y:"gadu",yy:c},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("ml",{months:"ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š".split("_"),weekdaysShort:"ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി".split("_"),weekdaysMin:"à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶".split("_"),longDateFormat:{LT:"A h:mm -à´¨àµ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇനàµà´¨àµ] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇനàµà´¨à´²àµ†] LT",lastWeek:"[à´•à´´à´¿à´žàµà´ž] dddd, LT",sameElse:"L"},relativeTime:{future:"%s à´•à´´à´¿à´žàµà´žàµ",past:"%s à´®àµàµ»à´ªàµ",s:"അൽപ നിമിഷങàµà´™àµ¾",m:"ഒരൠമിനിറàµà´±àµ",mm:"%d മിനിറàµà´±àµ",h:"ഒരൠമണികàµà´•àµ‚ർ",hh:"%d മണികàµà´•àµ‚ർ",d:"ഒരൠദിവസം",dd:"%d ദിവസം",M:"ഒരൠമാസം",MM:"%d മാസം",y:"ഒരൠവർഷം",yy:"%d വർഷം"},meridiem:function(a){return 4>a?"രാതàµà´°à´¿":12>a?"രാവിലെ":17>a?"ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ":20>a?"വൈകàµà´¨àµà´¨àµ‡à´°à´‚":"രാതàµà´°à´¿"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.lang("mr",{months:"जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर".split("_"),monthsShort:"जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उदà¥à¤¯à¤¾] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूरà¥à¤µà¥€",s:"सेकंद",m:"à¤à¤• मिनिट",mm:"%d मिनिटे",h:"à¤à¤• तास",hh:"%d तास",d:"à¤à¤• दिवस",dd:"%d दिवस",M:"à¤à¤• महिना",MM:"%d महिने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·à¥‡"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiem:function(a){return 4>a?"रातà¥à¤°à¥€":10>a?"सकाळी":17>a?"दà¥à¤ªà¤¾à¤°à¥€":20>a?"सायंकाळी":"रातà¥à¤°à¥€"},week:{dow:0,doy:6}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(a){return 11>a?"pagi":15>a?"tengahari":19>a?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.lang("ne",{months:"जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.".split("_"),weekdaysMin:"आइ._सो._मङà¥_बà¥._बि._शà¥._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiem:function(a){return 3>a?"राती":10>a?"बिहान":15>a?"दिउà¤à¤¸à¥‹":18>a?"बेलà¥à¤•à¤¾":20>a?"साà¤à¤":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउà¤à¤¦à¥‹] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गà¤à¤•à¥‹] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"à¤à¤• मिनेट",mm:"%d मिनेट",h:"à¤à¤• घणà¥à¤Ÿà¤¾",hh:"%d घणà¥à¤Ÿà¤¾",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महिना",MM:"%d महिना",y:"à¤à¤• बरà¥à¤·",yy:"%d बरà¥à¤·"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),c="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return a.lang("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ende] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekund",m:"ett minutt",mm:"%d minutt",h:"en time",hh:"%d timar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a){return 5>a%10&&a%10>1&&1!==~~(a/10)}function c(a,c,d){var e=a+" ";switch(d){case"m":return c?"minuta":"minutÄ™";case"mm":return e+(b(a)?"minuty":"minut");case"h":return c?"godzina":"godzinÄ™";case"hh":return e+(b(a)?"godziny":"godzin");case"MM":return e+(b(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return e+(b(a)?"lata":"lat")}}var d="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_");return a.lang("pl",{months:function(a,b){return/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"nie_pon_wt_Å›r_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:c,mm:c,h:c,hh:c,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:c,y:"rok",yy:c},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº"})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("pt",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("ro",{months:"Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie".split("_"),monthsShort:"Ian_Feb_Mar_Apr_Mai_Iun_Iul_Aug_Sep_Oct_Noi_Dec".split("_"),weekdays:"Duminică_Luni_MarÅ£i_Miercuri_Joi_Vineri_Sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:"%d minute",h:"o oră",hh:"%d ore",d:"o zi",dd:"%d zile",M:"o lună",MM:"%d luni",y:"un an",yy:"%d ani"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b){var c=a.split("_");return 1===b%10&&11!==b%100?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:"минута_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===d?c?"минута":"минуту":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),accusative:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"Ñнв_фев_мар_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек".split("_"),accusative:"Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function f(a,b){var c={nominative:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),accusative:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_")},d=/\[ ?[Вв] ?(?:прошлую|Ñледующую)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.lang("ru",{months:d,monthsShort:e,weekdays:f,weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|Ñ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT"},lastWeek:function(){switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:c,mm:c,h:"чаÑ",hh:c,d:"день",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiem:function(a){return 4>a?"ночи":12>a?"утра":17>a?"днÑ":"вечера"},ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-Ñ";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a){return a>1&&5>a}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekúnd":"pár sekundami";case"m":return c?"minúta":e?"minútu":"minútou";case"mm":return c||e?f+(b(a)?"minúty":"minút"):f+"minútami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodín"):f+"hodinami";break;case"d":return c||e?"deň":"dňom";case"dd":return c||e?f+(b(a)?"dni":"dní"):f+"dňami";break;case"M":return c||e?"mesiac":"mesiacom";case"MM":return c||e?f+(b(a)?"mesiace":"mesiacov"):f+"mesiacmi";break;case"y":return c||e?"rok":"rokom";case"yy":return c||e?f+(b(a)?"roky":"rokov"):f+"rokmi"}}var d="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),e="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return a.lang("sk",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT"; +case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"ena minuta":"eno minuto";case"mm":return d+=1===a?"minuta":2===a?"minuti":3===a||4===a?"minute":"minut";case"h":return b?"ena ura":"eno uro";case"hh":return d+=1===a?"ura":2===a?"uri":3===a||4===a?"ure":"ur";case"dd":return d+=1===a?"dan":"dni";case"MM":return d+=1===a?"mesec":2===a?"meseca":3===a||4===a?"mesece":"mesecev";case"yy":return d+=1===a?"leto":2===a?"leti":3===a||4===a?"leta":"let"}}return a.lang("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejÅ¡nja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"%s nazaj",s:"nekaj sekund",m:b,mm:b,h:b,hh:b,d:"en dan",dd:b,M:"en mesec",MM:b,y:"eno leto",yy:b},ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Marte_E Mërkure_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Neser në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s me parë",s:"disa seconda",m:"një minut",mm:"%d minutea",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":3===b?"e":"e";return a+c},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิà¸à¸² m นาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiem:function(a){return 12>a?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return a.lang("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(a){if(0===a)return a+"'ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("tzm-la",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuá¸",mm:"%d minuá¸",h:"saÉ›a",hh:"%d tassaÉ›in",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("tzm",{months:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),monthsShort:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ â´´] LT",nextDay:"[ⴰⵙⴽⴰ â´´] LT",nextWeek:"dddd [â´´] LT",lastDay:"[ⴰⵚⴰâµâµœ â´´] LT",lastWeek:"dddd [â´´] LT",sameElse:"L"},relativeTime:{future:"â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s",past:"ⵢⴰⵠ%s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉâµâµ“â´º",mm:"%d ⵎⵉâµâµ“â´º",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉâµ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰâµ",M:"â´°âµ¢oⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔâµ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙâµ"},week:{dow:6,doy:12}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){function b(a,b){var c=a.split("_");return 1===b%10&&11!==b%100?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===d?c?"хвилина":"хвилину":"h"===d?c?"година":"годину":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_"),accusative:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function f(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}return a.lang("uk",{months:d,monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:e,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., LT",LLLL:"dddd, D MMMM YYYY Ñ€., LT"},calendar:{sameDay:f("[Сьогодні "),nextDay:f("[Завтра "),lastDay:f("[Вчора "),nextWeek:f("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return f("[Минулої] dddd [").call(this);case 1:case 2:case 4:return f("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:c,mm:c,h:"годину",hh:c,d:"день",dd:c,M:"міÑÑць",MM:c,y:"рік",yy:c},meridiem:function(a){return 4>a?"ночі":12>a?"ранку":17>a?"днÑ":"вечора"},ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("uz",{months:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),monthsShort:"Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун Ñоат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни Ñоат] LT [да]",lastDay:"[Кеча Ñоат] LT [да]",lastWeek:"[Утган] dddd [куни Ñоат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурÑат",m:"бир дакика",mm:"%d дакика",h:"бир Ñоат",hh:"%d Ñоат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("vn",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm",L:"YYYYå¹´MMMDæ—¥",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥LT",LLLL:"YYYYå¹´MMMDæ—¥ddddLT",l:"YYYYå¹´MMMDæ—¥",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥LT",llll:"YYYYå¹´MMMDæ—¥ddddLT"},meridiem:function(a,b){var c=100*a+b;return 900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"æ—¥";case"M":return a+"月";case"w":case"W":return a+"周";default:return a}},relativeTime:{future:"%s内",past:"%så‰",s:"几秒",m:"1分钟",mm:"%d分钟",h:"1å°æ—¶",hh:"%då°æ—¶",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1å¹´",yy:"%då¹´"}})}),function(a){"function"==typeof define&&define.amd?define(["moment"],a):"object"==typeof exports?module.exports=a(require("../moment")):a(window.moment)}(function(a){return a.lang("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah點mm",L:"YYYYå¹´MMMDæ—¥",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥LT",LLLL:"YYYYå¹´MMMDæ—¥ddddLT",l:"YYYYå¹´MMMDæ—¥",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥LT",llll:"YYYYå¹´MMMDæ—¥ddddLT"},meridiem:function(a,b){var c=100*a+b;return 900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"æ—¥";case"M":return a+"月";case"w":case"W":return a+"週";default:return a}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"一分é˜",mm:"%d分é˜",h:"一å°æ™‚",hh:"%då°æ™‚",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%då¹´"}})}); \ No newline at end of file diff --git a/vendors/moment/min/moment-with-langs.js b/vendors/moment/min/moment-with-langs.js new file mode 100644 index 000000000..11e572f90 --- /dev/null +++ b/vendors/moment/min/moment-with-langs.js @@ -0,0 +1,6841 @@ +//! moment.js +//! version : 2.3.1 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +(function (undefined) { + + /************************************ + Constants + ************************************/ + + var moment, + VERSION = "2.3.1", + round = Math.round, + i, + + YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + + // internal storage for language config files + languages = {}, + + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module.exports), + + // ASP.NET json date format regex + aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, + aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + + // format tokens + formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|SS?S?|X|zz?|ZZ?|.)/g, + localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g, + + // parsing token regexes + parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 + parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 + parseTokenThreeDigits = /\d{3}/, // 000 - 999 + parseTokenFourDigits = /\d{1,4}/, // 0 - 9999 + parseTokenSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 + parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. + parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/i, // +00:00 -00:00 +0000 -0000 or Z + parseTokenT = /T/i, // T (ISO seperator) + parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 + + // preliminary iso regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000) + isoRegex = /^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d\d?\d?)?)?)?)?([\+\-]\d\d:?\d\d)?)?$/, + + isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', + + isoDates = [ + 'YYYY-MM-DD', + 'GGGG-[W]WW', + 'GGGG-[W]WW-E', + 'YYYY-DDD' + ], + + // iso time formats and regexes + isoTimes = [ + ['HH:mm:ss.S', /(T| )\d\d:\d\d:\d\d\.\d{1,3}/], + ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], + ['HH:mm', /(T| )\d\d:\d\d/], + ['HH', /(T| )\d\d/] + ], + + // timezone chunker "+10:00" > ["10", "00"] or "-1530" > ["-15", "30"] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, + + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, + + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, + + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, + + // format function strings + formatFunctions = {}, + + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), + + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.lang().monthsShort(this, format); + }, + MMMM : function (format) { + return this.lang().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.lang().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.lang().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.lang().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return this.weekYear(); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return this.isoWeekYear(); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.lang().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.lang().meridiem(this.hours(), this.minutes(), false); + }, + H : function () { + return this.hours(); + }, + h : function () { + return this.hours() % 12 || 12; + }, + m : function () { + return this.minutes(); + }, + s : function () { + return this.seconds(); + }, + S : function () { + return toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = -this.zone(), + b = "+"; + if (a < 0) { + a = -a; + b = "-"; + } + return b + leftZeroFill(toInt(a / 60), 2) + ":" + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = -this.zone(), + b = "+"; + if (a < 0) { + a = -a; + b = "-"; + } + return b + leftZeroFill(toInt(10 * a / 6), 4); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + X : function () { + return this.unix(); + } + }, + + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin']; + + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.lang().ordinal(func.call(this, a), period); + }; + } + + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + + + /************************************ + Constructors + ************************************/ + + function Language() { + + } + + // Moment prototype object + function Moment(config) { + checkOverflow(config); + extend(this, config); + } + + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // store reference to input for deterministic cloning + this._input = duration; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + years * 12; + + this._data = {}; + + this._bubble(); + } + + /************************************ + Helpers + ************************************/ + + + function extend(a, b) { + for (var i in b) { + if (b.hasOwnProperty(i)) { + a[i] = b[i]; + } + } + + if (b.hasOwnProperty("toString")) { + a.toString = b.toString; + } + + if (b.hasOwnProperty("valueOf")) { + a.valueOf = b.valueOf; + } + + return a; + } + + function absRound(number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength) { + var output = number + ''; + while (output.length < targetLength) { + output = '0' + output; + } + return output; + } + + // helper function for _.addTime and _.subtractTime + function addOrSubtractDurationFromMoment(mom, duration, isAdding, ignoreUpdateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months, + minutes, + hours; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + // store the minutes and hours so we can restore them + if (days || months) { + minutes = mom.minute(); + hours = mom.hour(); + } + if (days) { + mom.date(mom.date() + days * isAdding); + } + if (months) { + mom.month(mom.month() + months * isAdding); + } + if (milliseconds && !ignoreUpdateOffset) { + moment.updateOffset(mom); + } + // restore the minutes and hours after possibly changing dst + if (days || months) { + mom.minute(minutes); + mom.hour(hours); + } + } + + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } + + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]'; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; + } + return units; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop, + index; + + for (prop in inputObject) { + if (inputObject.hasOwnProperty(prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + function makeList(field) { + var count, setter; + + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } + + moment[field] = function (format, index) { + var i, getter, + method = moment.fn._lang[field], + results = []; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment.fn._lang, m, format || ''); + }; + + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } + + return value; + } + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + + m._pf.overflow = overflow; + } + } + + function initializeParsingFlags(config) { + config._pf = { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false + }; + } + + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0; + } + } + return m._isValid; + } + + function normalizeLanguage(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + /************************************ + Languages + ************************************/ + + + extend(Language.prototype, { + + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + }, + + _months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + months : function (m) { + return this._months[m.month()]; + }, + + _monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, + + monthsParse : function (monthName) { + var i, mom, regex; + + if (!this._monthsParse) { + this._monthsParse = []; + } + + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + if (!this._monthsParse[i]) { + mom = moment.utc([2000, i]); + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._monthsParse[i].test(monthName)) { + return i; + } + } + }, + + _weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, + + _weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, + + _weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, + + weekdaysParse : function (weekdayName) { + var i, mom, regex; + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, + + _longDateFormat : { + LT : "h:mm A", + L : "MM/DD/YYYY", + LL : "MMMM D YYYY", + LLL : "MMMM D YYYY LT", + LLLL : "dddd, MMMM D YYYY LT" + }, + longDateFormat : function (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + }, + + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, + + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + }, + + _calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom) : output; + }, + + _relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + relativeTime : function (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, + + ordinal : function (number) { + return this._ordinal.replace("%d", number); + }, + _ordinal : "%d", + + preparse : function (string) { + return string; + }, + + postformat : function (string) { + return string; + }, + + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, + + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, + + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; + } + }); + + // Loads a language definition into the `languages` cache. The function + // takes a key and optionally values. If not in the browser and no values + // are provided, it will load the language file module. As a convenience, + // this function also returns the language values. + function loadLang(key, values) { + values.abbr = key; + if (!languages[key]) { + languages[key] = new Language(); + } + languages[key].set(values); + return languages[key]; + } + + // Remove a language from the `languages` cache. Mostly useful in tests. + function unloadLang(key) { + delete languages[key]; + } + + // Determines which language definition to use and returns it. + // + // With no parameters, it will return the global language. If you + // pass in a language key, such as 'en', it will return the + // definition for 'en', so long as 'en' has already been loaded using + // moment.lang. + function getLangDefinition(key) { + var i = 0, j, lang, next, split, + get = function (k) { + if (!languages[k] && hasModule) { + try { + require('./lang/' + k); + } catch (e) { } + } + return languages[k]; + }; + + if (!key) { + return moment.fn._lang; + } + + if (!isArray(key)) { + //short-circuit everything else + lang = get(key); + if (lang) { + return lang; + } + key = [key]; + } + + //pick the language from the array + //try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + //substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + while (i < key.length) { + split = normalizeLanguage(key[i]).split('-'); + j = split.length; + next = normalizeLanguage(key[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + lang = get(split.slice(0, j).join('-')); + if (lang) { + return lang; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return moment.fn._lang; + } + + /************************************ + Formatting + ************************************/ + + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ""); + } + return input.replace(/\\/g, ""); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ""; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + + if (!m.isValid()) { + return m.lang().invalidDate(); + } + + format = expandFormat(format, m.lang()); + + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } + + return formatFunctions[format](m); + } + + function expandFormat(format, lang) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return lang.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + + /************************************ + Parsing + ************************************/ + + + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a; + switch (token) { + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return parseTokenFourDigits; + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return parseTokenSixDigits; + case 'S': + case 'SS': + case 'SSS': + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return getLangDefinition(config._l)._meridiemParse; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i")); + return a; + } + } + + function timezoneMinutesFromString(string) { + var tzchunk = (parseTokenTimezone.exec(string) || [])[0], + parts = (tzchunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? -minutes : minutes; + } + + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; + + switch (token) { + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; + } + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = getLangDefinition(config._l).monthsParse(input); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; + } + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); + } + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); + } + + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + break; + case 'YYYY' : + case 'YYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._isPm = getLangDefinition(config._l).isPM(input); + break; + // 24 HOUR + case 'H' : // fall through to hh + case 'HH' : // fall through to hh + case 'h' : // fall through to hh + case 'hh' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = timezoneMinutesFromString(input); + break; + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'dd': + case 'ddd': + case 'dddd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gg': + case 'gggg': + case 'GG': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = input; + } + break; + } + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, + yearToUse, fixYear, w, temp, lang, weekday, week; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + fixYear = function (val) { + return val ? + (val.length < 3 ? (parseInt(val, 10) > 68 ? '19' + val : '20' + val) : val) : + (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]); + }; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + temp = dayOfYearFromWeeks(fixYear(w.GG), w.W || 1, w.E, 4, 1); + } + else { + lang = getLangDefinition(config._l); + weekday = w.d != null ? parseWeekday(w.d, lang) : + (w.e != null ? parseInt(w.e, 10) + lang._week.dow : 0); + + week = parseInt(w.w, 10) || 1; + + //if we're parsing 'd', then the low day numbers may be next week + if (w.d != null && weekday < lang._week.dow) { + week++; + } + + temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow); + } + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = config._a[YEAR] == null ? currentDate[YEAR] : config._a[YEAR]; + + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } + + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // add the offsets to the time to be parsed so that we can have a clean array for checking isValid + input[HOUR] += toInt((config._tzm || 0) / 60); + input[MINUTE] += toInt((config._tzm || 0) % 60); + + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + } + + function dateFromObject(config) { + var normalizedInput; + + if (config._d) { + return; + } + + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; + + dateFromConfig(config); + } + + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } + + // date from string and format string + function makeDateFromStringAndFormat(config) { + + config._a = []; + config._pf.empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var lang = getLangDefinition(config._l), + string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, lang).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (getParseRegexForToken(token, config).exec(string) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } + + // handle am pm + if (config._isPm && config._a[HOUR] < 12) { + config._a[HOUR] += 12; + } + // if is 12 am, change hours to 0 + if (config._isPm === false && config._a[HOUR] === 12) { + config._a[HOUR] = 0; + } + + dateFromConfig(config); + checkOverflow(config); + } + + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = extend({}, config); + initializeParsingFlags(tempConfig); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; + + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; + + tempConfig._pf.score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + // date from iso format + function makeDateFromString(config) { + var i, + string = config._i, + match = isoRegex.exec(string); + + if (match) { + for (i = 4; i > 0; i--) { + if (match[i]) { + // match[5] should be "T" or undefined + config._f = isoDates[i - 1] + (match[6] || " "); + break; + } + } + for (i = 0; i < 4; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (parseTokenTimezone.exec(string)) { + config._f += " Z"; + } + makeDateFromStringAndFormat(config); + } + else { + config._d = new Date(string); + } + } + + function makeDateFromInput(config) { + var input = config._i, + matched = aspNetJsonRegex.exec(input); + + if (input === undefined) { + config._d = new Date(); + } else if (matched) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = input.slice(0); + dateFromConfig(config); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else { + config._d = new Date(input); + } + } + + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } + + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } + + function parseWeekday(input, language) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = language.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } + + /************************************ + Relative Time + ************************************/ + + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) { + return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime(milliseconds, withoutSuffix, lang) { + var seconds = round(Math.abs(milliseconds) / 1000), + minutes = round(seconds / 60), + hours = round(minutes / 60), + days = round(hours / 24), + years = round(days / 365), + args = seconds < 45 && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < 45 && ['mm', minutes] || + hours === 1 && ['h'] || + hours < 22 && ['hh', hours] || + days === 1 && ['d'] || + days <= 25 && ['dd', days] || + days <= 45 && ['M'] || + days < 345 && ['MM', round(days / 30)] || + years === 1 && ['y'] || ['yy', years]; + args[2] = withoutSuffix; + args[3] = milliseconds > 0; + args[4] = lang; + return substituteTimeAgo.apply({}, args); + } + + + /************************************ + Week of Year + ************************************/ + + + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; + + + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } + + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } + + adjustedMoment = moment(mom).add('d', daysToDayOfWeek); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = new Date(Date.UTC(year, 0)).getUTCDay(), + daysToAdd, dayOfYear; + + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } + + /************************************ + Top Level Functions + ************************************/ + + function makeMoment(config) { + var input = config._i, + format = config._f; + + if (typeof config._pf === 'undefined') { + initializeParsingFlags(config); + } + + if (input === null) { + return moment.invalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = getLangDefinition().preparse(input); + } + + + if (moment.isMoment(input)) { + config = extend({}, input); + + config._d = new Date(+input._d); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } + + return new Moment(config); + } + + moment = function (input, format, lang, strict) { + if (typeof(lang) === "boolean") { + strict = lang; + lang = undefined; + } + return makeMoment({ + _i : input, + _f : format, + _l : lang, + _strict : strict, + _isUTC : false + }); + }; + + // creating with utc + moment.utc = function (input, format, lang, strict) { + var m; + + if (typeof(lang) === "boolean") { + strict = lang; + lang = undefined; + } + m = makeMoment({ + _useUTC : true, + _isUTC : true, + _l : lang, + _i : input, + _f : format, + _strict : strict + }).utc(); + + return m; + }; + + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; + + // duration + moment.duration = function (input, key) { + var isDuration = moment.isDuration(input), + isNumber = (typeof input === 'number'), + duration = (isDuration ? input._input : (isNumber ? {} : input)), + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso, + timeEmpty, + dateTimeEmpty; + + if (isNumber) { + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === "-") ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === "-") ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } + + ret = new Duration(duration); + + if (isDuration && input.hasOwnProperty('_lang')) { + ret._lang = input._lang; + } + + return ret; + }; + + // version number + moment.version = VERSION; + + // default format + moment.defaultFormat = isoFormat; + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; + + // This function will load languages and then set the global language. If + // no arguments are passed in, it will simply return the current global + // language key. + moment.lang = function (key, values) { + var r; + if (!key) { + return moment.fn._lang._abbr; + } + if (values) { + loadLang(normalizeLanguage(key), values); + } else if (values === null) { + unloadLang(key); + key = 'en'; + } else if (!languages[key]) { + getLangDefinition(key); + } + r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key); + return r._abbr; + }; + + // returns language data + moment.langData = function (key) { + if (key && key._lang && key._lang._abbr) { + key = key._lang._abbr; + } + return getLangDefinition(key); + }; + + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment; + }; + + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; + + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } + + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; + + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; + } + + return m; + }; + + moment.parseZone = function (input) { + return moment(input).parseZone(); + }; + + /************************************ + Moment Prototype + ************************************/ + + + extend(moment.fn = Moment.prototype, { + + clone : function () { + return moment(this); + }, + + valueOf : function () { + return +this._d + ((this._offset || 0) * 60000); + }, + + unix : function () { + return Math.floor(+this / 1000); + }, + + toString : function () { + return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ"); + }, + + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, + + toISOString : function () { + return formatMoment(moment(this).utc(), 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + }, + + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, + + isValid : function () { + return isValid(this); + }, + + isDSTShifted : function () { + + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } + + return false; + }, + + parsingFlags : function () { + return extend({}, this._pf); + }, + + invalidAt: function () { + return this._pf.overflow; + }, + + utc : function () { + return this.zone(0); + }, + + local : function () { + this.zone(0); + this._isUTC = false; + return this; + }, + + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.lang().postformat(output); + }, + + add : function (input, val) { + var dur; + // switch args to support add('s', 1) and add(1, 's') + if (typeof input === 'string') { + dur = moment.duration(+val, input); + } else { + dur = moment.duration(input, val); + } + addOrSubtractDurationFromMoment(this, dur, 1); + return this; + }, + + subtract : function (input, val) { + var dur; + // switch args to support subtract('s', 1) and subtract(1, 's') + if (typeof input === 'string') { + dur = moment.duration(+val, input); + } else { + dur = moment.duration(input, val); + } + addOrSubtractDurationFromMoment(this, dur, -1); + return this; + }, + + diff : function (input, units, asFloat) { + var that = this._isUTC ? moment(input).zone(this._offset || 0) : moment(input).local(), + zoneDiff = (this.zone() - that.zone()) * 6e4, + diff, output; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month') { + // average number of days in the months in the given dates + diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2 + // difference in months + output = ((this.year() - that.year()) * 12) + (this.month() - that.month()); + // adjust by taking difference in days, average number of days + // and dst in the given months. + output += ((this - moment(this).startOf('month')) - + (that - moment(that).startOf('month'))) / diff; + // same as above but with zones, to negate all dst + output -= ((this.zone() - moment(this).startOf('month').zone()) - + (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff; + if (units === 'year') { + output = output / 12; + } + } else { + diff = (this - that); + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, + + from : function (time, withoutSuffix) { + return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix); + }, + + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, + + calendar : function () { + var diff = this.diff(moment().zone(this.zone()).startOf('day'), 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.lang().calendar(format, this)); + }, + + isLeapYear : function () { + return isLeapYear(this.year()); + }, + + isDST : function () { + return (this.zone() < this.clone().month(0).zone() || + this.zone() < this.clone().month(5).zone()); + }, + + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.lang()); + return this.add({ d : input - day }); + } else { + return day; + } + }, + + month : function (input) { + var utc = this._isUTC ? 'UTC' : '', + dayOfMonth; + + if (input != null) { + if (typeof input === 'string') { + input = this.lang().monthsParse(input); + if (typeof input !== 'number') { + return this; + } + } + + dayOfMonth = this.date(); + this.date(1); + this._d['set' + utc + 'Month'](input); + this.date(Math.min(dayOfMonth, this.daysInMonth())); + + moment.updateOffset(this); + return this; + } else { + return this._d['get' + utc + 'Month'](); + } + }, + + startOf: function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } + + return this; + }, + + endOf: function (units) { + units = normalizeUnits(units); + return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1); + }, + + isAfter: function (input, units) { + units = typeof units !== 'undefined' ? units : 'millisecond'; + return +this.clone().startOf(units) > +moment(input).startOf(units); + }, + + isBefore: function (input, units) { + units = typeof units !== 'undefined' ? units : 'millisecond'; + return +this.clone().startOf(units) < +moment(input).startOf(units); + }, + + isSame: function (input, units) { + units = typeof units !== 'undefined' ? units : 'millisecond'; + return +this.clone().startOf(units) === +moment(input).startOf(units); + }, + + min: function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + }, + + max: function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + }, + + zone : function (input) { + var offset = this._offset || 0; + if (input != null) { + if (typeof input === "string") { + input = timezoneMinutesFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + this._offset = input; + this._isUTC = true; + if (offset !== input) { + addOrSubtractDurationFromMoment(this, moment.duration(offset - input, 'm'), 1, true); + } + } else { + return this._isUTC ? offset : this._d.getTimezoneOffset(); + } + return this; + }, + + zoneAbbr : function () { + return this._isUTC ? "UTC" : ""; + }, + + zoneName : function () { + return this._isUTC ? "Coordinated Universal Time" : ""; + }, + + parseZone : function () { + if (typeof this._i === 'string') { + this.zone(this._i); + } + return this; + }, + + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).zone(); + } + + return (this.zone() - input) % 60 === 0; + }, + + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, + + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add("d", (input - dayOfYear)); + }, + + weekYear : function (input) { + var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year; + return input == null ? year : this.add("y", (input - year)); + }, + + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add("y", (input - year)); + }, + + week : function (input) { + var week = this.lang().week(this); + return input == null ? week : this.add("d", (input - week) * 7); + }, + + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add("d", (input - week) * 7); + }, + + weekday : function (input) { + var weekday = (this.day() + 7 - this.lang()._week.dow) % 7; + return input == null ? weekday : this.add("d", input - weekday); + }, + + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, + + set : function (units, value) { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + return this; + }, + + // If passed a language key, it will set the language for this + // instance. Otherwise, it will return the language configuration + // variables for this instance. + lang : function (key) { + if (key === undefined) { + return this._lang; + } else { + this._lang = getLangDefinition(key); + return this; + } + } + }); + + // helper for adding shortcuts + function makeGetterAndSetter(name, key) { + moment.fn[name] = moment.fn[name + 's'] = function (input) { + var utc = this._isUTC ? 'UTC' : ''; + if (input != null) { + this._d['set' + utc + key](input); + moment.updateOffset(this); + return this; + } else { + return this._d['get' + utc + key](); + } + }; + } + + // loop through and add shortcuts (Month, Date, Hours, Minutes, Seconds, Milliseconds) + for (i = 0; i < proxyGettersAndSetters.length; i ++) { + makeGetterAndSetter(proxyGettersAndSetters[i].toLowerCase().replace(/s$/, ''), proxyGettersAndSetters[i]); + } + + // add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear') + makeGetterAndSetter('year', 'FullYear'); + + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; + + /************************************ + Duration Prototype + ************************************/ + + + extend(moment.duration.fn = Duration.prototype, { + + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years; + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; + + hours = absRound(minutes / 60); + data.hours = hours % 24; + + days += absRound(hours / 24); + data.days = days % 30; + + months += absRound(days / 30); + data.months = months % 12; + + years = absRound(months / 12); + data.years = years; + }, + + weeks : function () { + return absRound(this.days() / 7); + }, + + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, + + humanize : function (withSuffix) { + var difference = +this, + output = relativeTime(difference, !withSuffix, this.lang()); + + if (withSuffix) { + output = this.lang().pastFuture(difference, output); + } + + return this.lang().postformat(output); + }, + + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); + + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; + + this._bubble(); + + return this; + }, + + subtract : function (input, val) { + var dur = moment.duration(input, val); + + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; + + this._bubble(); + + return this; + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, + + as : function (units) { + units = normalizeUnits(units); + return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's'](); + }, + + lang : moment.fn.lang, + + toIsoString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + } + }); + + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } + + function makeDurationAsGetter(name, factor) { + moment.duration.fn['as' + name] = function () { + return +this / factor; + }; + } + + for (i in unitMillisecondFactors) { + if (unitMillisecondFactors.hasOwnProperty(i)) { + makeDurationAsGetter(i, unitMillisecondFactors[i]); + makeDurationGetter(i.toLowerCase()); + } + } + + makeDurationAsGetter('Weeks', 6048e5); + moment.duration.fn.asMonths = function () { + return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12; + }; + + + /************************************ + Default Lang + ************************************/ + + + // Set default language, other languages will inherit from English. + moment.lang('en', { + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + // moment.js language configuration +// language : Moroccan Arabic (ar-ma) +// author : ElFadili Yassine : https://github.com/ElFadiliY +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('ar-ma', { + months : "يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"), + monthsShort : "يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"), + weekdays : "الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"), + weekdaysShort : "احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"), + weekdaysMin : "Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[اليوم على الساعة] LT", + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : "ÙÙŠ %s", + past : "منذ %s", + s : "ثوان", + m : "دقيقة", + mm : "%d دقائق", + h : "ساعة", + hh : "%d ساعات", + d : "يوم", + dd : "%d أيام", + M : "شهر", + MM : "%d أشهر", + y : "سنة", + yy : "%d سنوات" + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : Arabic (ar) +// author : Abdel Said : https://github.com/abdelsaid +// changes in months, weekdays : Ahmed Elkhatib + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('ar', { + months : "يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"), + monthsShort : "يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"), + weekdays : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"), + weekdaysShort : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"), + weekdaysMin : "Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[اليوم على الساعة] LT", + nextDay: '[غدا على الساعة] LT', + nextWeek: 'dddd [على الساعة] LT', + lastDay: '[أمس على الساعة] LT', + lastWeek: 'dddd [على الساعة] LT', + sameElse: 'L' + }, + relativeTime : { + future : "ÙÙŠ %s", + past : "منذ %s", + s : "ثوان", + m : "دقيقة", + mm : "%d دقائق", + h : "ساعة", + hh : "%d ساعات", + d : "يوم", + dd : "%d أيام", + M : "شهر", + MM : "%d أشهر", + y : "سنة", + yy : "%d سنوات" + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : bulgarian (bg) +// author : Krasen Borisov : https://github.com/kraz + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('bg', { + months : "Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"), + monthsShort : "Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"), + weekdays : "неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"), + weekdaysShort : "нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"), + weekdaysMin : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + longDateFormat : { + LT : "H:mm", + L : "D.MM.YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[Ð”Ð½ÐµÑ Ð²] LT', + nextDay : '[Утре в] LT', + nextWeek : 'dddd [в] LT', + lastDay : '[Вчера в] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[Ð’ изминалата] dddd [в] LT'; + case 1: + case 2: + case 4: + case 5: + return '[Ð’ изминалиÑ] dddd [в] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : "Ñлед %s", + past : "преди %s", + s : "нÑколко Ñекунди", + m : "минута", + mm : "%d минути", + h : "чаÑ", + hh : "%d чаÑа", + d : "ден", + dd : "%d дни", + M : "меÑец", + MM : "%d меÑеца", + y : "година", + yy : "%d години" + }, + ordinal : function (number) { + var lastDigit = number % 10, + last2Digits = number % 100; + if (number === 0) { + return number + '-ев'; + } else if (last2Digits === 0) { + return number + '-ен'; + } else if (last2Digits > 10 && last2Digits < 20) { + return number + '-ти'; + } else if (lastDigit === 1) { + return number + '-ви'; + } else if (lastDigit === 2) { + return number + '-ри'; + } else if (lastDigit === 7 || lastDigit === 8) { + return number + '-ми'; + } else { + return number + '-ти'; + } + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : breton (br) +// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou + +(function (factory) { + factory(moment); +}(function (moment) { + function relativeTimeWithMutation(number, withoutSuffix, key) { + var format = { + 'mm': "munutenn", + 'MM': "miz", + 'dd': "devezh" + }; + return number + ' ' + mutation(format[key], number); + } + + function specialMutationForYears(number) { + switch (lastNumber(number)) { + case 1: + case 3: + case 4: + case 5: + case 9: + return number + ' bloaz'; + default: + return number + ' vloaz'; + } + } + + function lastNumber(number) { + if (number > 9) { + return lastNumber(number % 10); + } + return number; + } + + function mutation(text, number) { + if (number === 2) { + return softMutation(text); + } + return text; + } + + function softMutation(text) { + var mutationTable = { + 'm': 'v', + 'b': 'v', + 'd': 'z' + }; + if (mutationTable[text.charAt(0)] === undefined) { + return text; + } + return mutationTable[text.charAt(0)] + text.substring(1); + } + + return moment.lang('br', { + months : "Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"), + monthsShort : "Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"), + weekdays : "Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"), + weekdaysShort : "Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"), + weekdaysMin : "Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"), + longDateFormat : { + LT : "h[e]mm A", + L : "DD/MM/YYYY", + LL : "D [a viz] MMMM YYYY", + LLL : "D [a viz] MMMM YYYY LT", + LLLL : "dddd, D [a viz] MMMM YYYY LT" + }, + calendar : { + sameDay : '[Hiziv da] LT', + nextDay : '[Warc\'hoazh da] LT', + nextWeek : 'dddd [da] LT', + lastDay : '[Dec\'h da] LT', + lastWeek : 'dddd [paset da] LT', + sameElse : 'L' + }, + relativeTime : { + future : "a-benn %s", + past : "%s 'zo", + s : "un nebeud segondennoù", + m : "ur vunutenn", + mm : relativeTimeWithMutation, + h : "un eur", + hh : "%d eur", + d : "un devezh", + dd : relativeTimeWithMutation, + M : "ur miz", + MM : relativeTimeWithMutation, + y : "ur bloaz", + yy : specialMutationForYears + }, + ordinal : function (number) { + var output = (number === 1) ? 'añ' : 'vet'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : bosnian (bs) +// author : Nedim Cholich : https://github.com/frontyard +// based on (hr) translation by Bojan Marković + +(function (factory) { + factory(moment); +}(function (moment) { + + function translate(number, withoutSuffix, key) { + var result = number + " "; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.lang('bs', { + months : "januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"), + monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"), + weekdays : "nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"), + weekdaysShort : "ned._pon._uto._sri._Äet._pet._sub.".split("_"), + weekdaysMin : "ne_po_ut_sr_Äe_pe_su".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD. MM. YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : "za %s", + past : "prije %s", + s : "par sekundi", + m : translate, + mm : translate, + h : translate, + hh : translate, + d : "dan", + dd : translate, + M : "mjesec", + MM : translate, + y : "godinu", + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : catalan (ca) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('ca', { + months : "Gener_Febrer_Març_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre".split("_"), + monthsShort : "Gen._Febr._Mar._Abr._Mai._Jun._Jul._Ag._Set._Oct._Nov._Des.".split("_"), + weekdays : "Diumenge_Dilluns_Dimarts_Dimecres_Dijous_Divendres_Dissabte".split("_"), + weekdaysShort : "Dg._Dl._Dt._Dc._Dj._Dv._Ds.".split("_"), + weekdaysMin : "Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay : function () { + return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextDay : function () { + return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastDay : function () { + return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : "en %s", + past : "fa %s", + s : "uns segons", + m : "un minut", + mm : "%d minuts", + h : "una hora", + hh : "%d hores", + d : "un dia", + dd : "%d dies", + M : "un mes", + MM : "%d mesos", + y : "un any", + yy : "%d anys" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : czech (cs) +// author : petrbela : https://github.com/petrbela + +(function (factory) { + factory(moment); +}(function (moment) { + var months = "leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"), + monthsShort = "led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_"); + + function plural(n) { + return (n > 1) && (n < 5) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + " "; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár vteÅ™in' : 'pár vteÅ™inami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minuty' : 'minut'); + } else { + return result + 'minutami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodin'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'den' : 'dnem'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dny' : 'dní'); + } else { + return result + 'dny'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mÄ›síc' : 'mÄ›sícem'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mÄ›síce' : 'mÄ›síců'); + } else { + return result + 'mÄ›síci'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokem'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'let'); + } else { + return result + 'lety'; + } + break; + } + } + + return moment.lang('cs', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : "nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"), + weekdaysShort : "ne_po_út_st_Ät_pá_so".split("_"), + weekdaysMin : "ne_po_út_st_Ät_pá_so".split("_"), + longDateFormat : { + LT: "H:mm", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd D. MMMM YYYY LT" + }, + calendar : { + sameDay: "[dnes v] LT", + nextDay: '[zítra v] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedÄ›li v] LT'; + case 1: + case 2: + return '[v] dddd [v] LT'; + case 3: + return '[ve stÅ™edu v] LT'; + case 4: + return '[ve Ätvrtek v] LT'; + case 5: + return '[v pátek v] LT'; + case 6: + return '[v sobotu v] LT'; + } + }, + lastDay: '[vÄera v] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulou nedÄ›li v] LT'; + case 1: + case 2: + return '[minulé] dddd [v] LT'; + case 3: + return '[minulou stÅ™edu v] LT'; + case 4: + case 5: + return '[minulý] dddd [v] LT'; + case 6: + return '[minulou sobotu v] LT'; + } + }, + sameElse: "L" + }, + relativeTime : { + future : "za %s", + past : "pÅ™ed %s", + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : chuvash (cv) +// author : Anatoly Mironov : https://github.com/mirontoli + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('cv', { + months : "кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"), + monthsShort : "кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"), + weekdays : "вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"), + weekdaysShort : "выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"), + weekdaysMin : "вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD-MM-YYYY", + LL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]", + LLL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT", + LLLL : "dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT" + }, + calendar : { + sameDay: '[ПаÑн] LT [Ñехетре]', + nextDay: '[Ыран] LT [Ñехетре]', + lastDay: '[Ĕнер] LT [Ñехетре]', + nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]', + lastWeek: '[Иртнĕ] dddd LT [Ñехетре]', + sameElse: 'L' + }, + relativeTime : { + future : function (output) { + var affix = /Ñехет$/i.exec(output) ? "рен" : /çул$/i.exec(output) ? "тан" : "ран"; + return output + affix; + }, + past : "%s каÑлла", + s : "пĕр-ик çеккунт", + m : "пĕр минут", + mm : "%d минут", + h : "пĕр Ñехет", + hh : "%d Ñехет", + d : "пĕр кун", + dd : "%d кун", + M : "пĕр уйăх", + MM : "%d уйăх", + y : "пĕр çул", + yy : "%d çул" + }, + ordinal : '%d-мĕш', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : danish (da) +// author : Ulrik Nielsen : https://github.com/mrbase + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('da', { + months : "januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"), + monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"), + weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"), + weekdaysShort : "søn_man_tir_ons_tor_fre_lør".split("_"), + weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D. MMMM, YYYY LT" + }, + calendar : { + sameDay : '[I dag kl.] LT', + nextDay : '[I morgen kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[I gÃ¥r kl.] LT', + lastWeek : '[sidste] dddd [kl] LT', + sameElse : 'L' + }, + relativeTime : { + future : "om %s", + past : "%s siden", + s : "fÃ¥ sekunder", + m : "et minut", + mm : "%d minutter", + h : "en time", + hh : "%d timer", + d : "en dag", + dd : "%d dage", + M : "en mÃ¥ned", + MM : "%d mÃ¥neder", + y : "et Ã¥r", + yy : "%d Ã¥r" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : german (de) +// author : lluchs : https://github.com/lluchs +// author: Menelion Elensúle: https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function processRelativeTime(number, withoutSuffix, key, isFuture) { + var format = { + 'm': ['eine Minute', 'einer Minute'], + 'h': ['eine Stunde', 'einer Stunde'], + 'd': ['ein Tag', 'einem Tag'], + 'dd': [number + ' Tage', number + ' Tagen'], + 'M': ['ein Monat', 'einem Monat'], + 'MM': [number + ' Monate', number + ' Monaten'], + 'y': ['ein Jahr', 'einem Jahr'], + 'yy': [number + ' Jahre', number + ' Jahren'] + }; + return withoutSuffix ? format[key][0] : format[key][1]; + } + + return moment.lang('de', { + months : "Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"), + monthsShort : "Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"), + weekdays : "Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"), + weekdaysShort : "So._Mo._Di._Mi._Do._Fr._Sa.".split("_"), + weekdaysMin : "So_Mo_Di_Mi_Do_Fr_Sa".split("_"), + longDateFormat : { + LT: "H:mm [Uhr]", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay: "[Heute um] LT", + sameElse: "L", + nextDay: '[Morgen um] LT', + nextWeek: 'dddd [um] LT', + lastDay: '[Gestern um] LT', + lastWeek: '[letzten] dddd [um] LT' + }, + relativeTime : { + future : "in %s", + past : "vor %s", + s : "ein paar Sekunden", + m : processRelativeTime, + mm : "%d Minuten", + h : processRelativeTime, + hh : "%d Stunden", + d : processRelativeTime, + dd : processRelativeTime, + M : processRelativeTime, + MM : processRelativeTime, + y : processRelativeTime, + yy : processRelativeTime + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : modern greek (el) +// author : Aggelos Karalias : https://github.com/mehiel + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('el', { + monthsNominativeEl : "ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"), + monthsGenitiveEl : "ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"), + months : function (momentToFormat, format) { + if (/D/.test(format.substring(0, format.indexOf("MMMM")))) { // if there is a day number before 'MMMM' + return this._monthsGenitiveEl[momentToFormat.month()]; + } else { + return this._monthsNominativeEl[momentToFormat.month()]; + } + }, + monthsShort : "Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"), + weekdays : "ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"), + weekdaysShort : "ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"), + weekdaysMin : "Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"), + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'μμ' : 'ΜΜ'; + } else { + return isLower ? 'πμ' : 'ΠΜ'; + } + }, + longDateFormat : { + LT : "h:mm A", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendarEl : { + sameDay : '[ΣήμεÏα {}] LT', + nextDay : '[ΑÏÏιο {}] LT', + nextWeek : 'dddd [{}] LT', + lastDay : '[Χθες {}] LT', + lastWeek : '[την Ï€ÏοηγοÏμενη] dddd [{}] LT', + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendarEl[key], + hours = mom && mom.hours(); + + return output.replace("{}", (hours % 12 === 1 ? "στη" : "στις")); + }, + relativeTime : { + future : "σε %s", + past : "%s Ï€Ïιν", + s : "δευτεÏόλεπτα", + m : "ένα λεπτό", + mm : "%d λεπτά", + h : "μία ÏŽÏα", + hh : "%d ÏŽÏες", + d : "μία μέÏα", + dd : "%d μέÏες", + M : "ένας μήνας", + MM : "%d μήνες", + y : "ένας χÏόνος", + yy : "%d χÏόνια" + }, + ordinal : function (number) { + return number + 'η'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : australian english (en-au) + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('en-au', { + months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + longDateFormat : { + LT : "h:mm A", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + ordinal : function (number) { + var b = number % 10, + output = (~~ (number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : canadian english (en-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('en-ca', { + months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + longDateFormat : { + LT : "h:mm A", + L : "YYYY-MM-DD", + LL : "D MMMM, YYYY", + LLL : "D MMMM, YYYY LT", + LLLL : "dddd, D MMMM, YYYY LT" + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + ordinal : function (number) { + var b = number % 10, + output = (~~ (number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); +})); +// moment.js language configuration +// language : great britain english (en-gb) +// author : Chris Gedrim : https://github.com/chrisgedrim + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('en-gb', { + months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + ordinal : function (number) { + var b = number % 10, + output = (~~ (number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : esperanto (eo) +// author : Colin Dean : https://github.com/colindean +// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko. +// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni! + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('eo', { + months : "januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"), + monthsShort : "jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"), + weekdays : "Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"), + weekdaysShort : "Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"), + weekdaysMin : "Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "D[-an de] MMMM, YYYY", + LLL : "D[-an de] MMMM, YYYY LT", + LLLL : "dddd, [la] D[-an de] MMMM, YYYY LT" + }, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'p.t.m.' : 'P.T.M.'; + } else { + return isLower ? 'a.t.m.' : 'A.T.M.'; + } + }, + calendar : { + sameDay : '[HodiaÅ­ je] LT', + nextDay : '[MorgaÅ­ je] LT', + nextWeek : 'dddd [je] LT', + lastDay : '[HieraÅ­ je] LT', + lastWeek : '[pasinta] dddd [je] LT', + sameElse : 'L' + }, + relativeTime : { + future : "je %s", + past : "antaÅ­ %s", + s : "sekundoj", + m : "minuto", + mm : "%d minutoj", + h : "horo", + hh : "%d horoj", + d : "tago",//ne 'diurno', ĉar estas uzita por proksimumo + dd : "%d tagoj", + M : "monato", + MM : "%d monatoj", + y : "jaro", + yy : "%d jaroj" + }, + ordinal : "%da", + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : spanish (es) +// author : Julio Napurí : https://github.com/julionc + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('es', { + months : "enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"), + monthsShort : "ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"), + weekdays : "domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"), + weekdaysShort : "dom._lun._mar._mié._jue._vie._sáb.".split("_"), + weekdaysMin : "Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D [de] MMMM [de] YYYY", + LLL : "D [de] MMMM [de] YYYY LT", + LLLL : "dddd, D [de] MMMM [de] YYYY LT" + }, + calendar : { + sameDay : function () { + return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextDay : function () { + return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + nextWeek : function () { + return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastDay : function () { + return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + lastWeek : function () { + return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? 's' : '') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : "en %s", + past : "hace %s", + s : "unos segundos", + m : "un minuto", + mm : "%d minutos", + h : "una hora", + hh : "%d horas", + d : "un día", + dd : "%d días", + M : "un mes", + MM : "%d meses", + y : "un año", + yy : "%d años" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : estonian (et) +// author : Henry Kehlmann : https://github.com/madhenry + +(function (factory) { + factory(moment); +}(function (moment) { + function translateSeconds(number, withoutSuffix, key, isFuture) { + return (isFuture || withoutSuffix) ? 'paari sekundi' : 'paar sekundit'; + } + + return moment.lang('et', { + months : "jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"), + monthsShort : "jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"), + weekdays : "pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"), + weekdaysShort : "P_E_T_K_N_R_L".split("_"), + weekdaysMin : "P_E_T_K_N_R_L".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay : '[Täna,] LT', + nextDay : '[Homme,] LT', + nextWeek : '[Järgmine] dddd LT', + lastDay : '[Eile,] LT', + lastWeek : '[Eelmine] dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s pärast", + past : "%s tagasi", + s : translateSeconds, + m : "minut", + mm : "%d minutit", + h : "tund", + hh : "%d tundi", + d : "päev", + dd : "%d päeva", + M : "kuu", + MM : "%d kuud", + y : "aasta", + yy : "%d aastat" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : euskara (eu) +// author : Eneko Illarramendi : https://github.com/eillarra + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('eu', { + months : "urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"), + monthsShort : "urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"), + weekdays : "igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"), + weekdaysShort : "ig._al._ar._az._og._ol._lr.".split("_"), + weekdaysMin : "ig_al_ar_az_og_ol_lr".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "YYYY[ko] MMMM[ren] D[a]", + LLL : "YYYY[ko] MMMM[ren] D[a] LT", + LLLL : "dddd, YYYY[ko] MMMM[ren] D[a] LT", + l : "YYYY-M-D", + ll : "YYYY[ko] MMM D[a]", + lll : "YYYY[ko] MMM D[a] LT", + llll : "ddd, YYYY[ko] MMM D[a] LT" + }, + calendar : { + sameDay : '[gaur] LT[etan]', + nextDay : '[bihar] LT[etan]', + nextWeek : 'dddd LT[etan]', + lastDay : '[atzo] LT[etan]', + lastWeek : '[aurreko] dddd LT[etan]', + sameElse : 'L' + }, + relativeTime : { + future : "%s barru", + past : "duela %s", + s : "segundo batzuk", + m : "minutu bat", + mm : "%d minutu", + h : "ordu bat", + hh : "%d ordu", + d : "egun bat", + dd : "%d egun", + M : "hilabete bat", + MM : "%d hilabete", + y : "urte bat", + yy : "%d urte" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : Persian Language +// author : Ebrahim Byagowi : https://github.com/ebraminio + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': 'Û±', + '2': 'Û²', + '3': 'Û³', + '4': 'Û´', + '5': 'Ûµ', + '6': 'Û¶', + '7': 'Û·', + '8': 'Û¸', + '9': 'Û¹', + '0': 'Û°' + }, numberMap = { + 'Û±': '1', + 'Û²': '2', + 'Û³': '3', + 'Û´': '4', + 'Ûµ': '5', + 'Û¶': '6', + 'Û·': '7', + 'Û¸': '8', + 'Û¹': '9', + 'Û°': '0' + }; + + return moment.lang('fa', { + months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'), + weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'), + weekdaysMin : 'ÛŒ_د_س_Ú†_Ù¾_ج_Ø´'.split('_'), + longDateFormat : { + LT : 'HH:mm', + L : 'DD/MM/YYYY', + LL : 'D MMMM YYYY', + LLL : 'D MMMM YYYY LT', + LLLL : 'dddd, D MMMM YYYY LT' + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return "قبل از ظهر"; + } else { + return "بعد از ظهر"; + } + }, + calendar : { + sameDay : '[امروز ساعت] LT', + nextDay : '[Ùردا ساعت] LT', + nextWeek : 'dddd [ساعت] LT', + lastDay : '[دیروز ساعت] LT', + lastWeek : 'dddd [پیش] [ساعت] LT', + sameElse : 'L' + }, + relativeTime : { + future : 'در %s', + past : '%s پیش', + s : 'چندین ثانیه', + m : 'یک دقیقه', + mm : '%d دقیقه', + h : 'یک ساعت', + hh : '%d ساعت', + d : 'یک روز', + dd : '%d روز', + M : 'یک ماه', + MM : '%d ماه', + y : 'یک سال', + yy : '%d سال' + }, + preparse: function (string) { + return string.replace(/[Û°-Û¹]/g, function (match) { + return numberMap[match]; + }).replace(/ØŒ/g, ','); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }).replace(/,/g, 'ØŒ'); + }, + ordinal : '%dÙ…', + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : finnish (fi) +// author : Tarmo Aidantausta : https://github.com/bleadof + +(function (factory) { + factory(moment); +}(function (moment) { + var numbers_past = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '), + numbers_future = ['nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden', + numbers_past[7], numbers_past[8], numbers_past[9]]; + + function translate(number, withoutSuffix, key, isFuture) { + var result = ""; + switch (key) { + case 's': + return isFuture ? 'muutaman sekunnin' : 'muutama sekunti'; + case 'm': + return isFuture ? 'minuutin' : 'minuutti'; + case 'mm': + result = isFuture ? 'minuutin' : 'minuuttia'; + break; + case 'h': + return isFuture ? 'tunnin' : 'tunti'; + case 'hh': + result = isFuture ? 'tunnin' : 'tuntia'; + break; + case 'd': + return isFuture ? 'päivän' : 'päivä'; + case 'dd': + result = isFuture ? 'päivän' : 'päivää'; + break; + case 'M': + return isFuture ? 'kuukauden' : 'kuukausi'; + case 'MM': + result = isFuture ? 'kuukauden' : 'kuukautta'; + break; + case 'y': + return isFuture ? 'vuoden' : 'vuosi'; + case 'yy': + result = isFuture ? 'vuoden' : 'vuotta'; + break; + } + result = verbal_number(number, isFuture) + " " + result; + return result; + } + + function verbal_number(number, isFuture) { + return number < 10 ? (isFuture ? numbers_future[number] : numbers_past[number]) : number; + } + + return moment.lang('fi', { + months : "tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"), + monthsShort : "tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"), + weekdays : "sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"), + weekdaysShort : "su_ma_ti_ke_to_pe_la".split("_"), + weekdaysMin : "su_ma_ti_ke_to_pe_la".split("_"), + longDateFormat : { + LT : "HH.mm", + L : "DD.MM.YYYY", + LL : "Do MMMM[ta] YYYY", + LLL : "Do MMMM[ta] YYYY, [klo] LT", + LLLL : "dddd, Do MMMM[ta] YYYY, [klo] LT", + l : "D.M.YYYY", + ll : "Do MMM YYYY", + lll : "Do MMM YYYY, [klo] LT", + llll : "ddd, Do MMM YYYY, [klo] LT" + }, + calendar : { + sameDay : '[tänään] [klo] LT', + nextDay : '[huomenna] [klo] LT', + nextWeek : 'dddd [klo] LT', + lastDay : '[eilen] [klo] LT', + lastWeek : '[viime] dddd[na] [klo] LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s päästä", + past : "%s sitten", + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : "%d.", + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : canadian french (fr-ca) +// author : Jonathan Abourbih : https://github.com/jonbca + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('fr-ca', { + months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"), + monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"), + weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"), + weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"), + weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[Aujourd'hui à] LT", + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : "dans %s", + past : "il y a %s", + s : "quelques secondes", + m : "une minute", + mm : "%d minutes", + h : "une heure", + hh : "%d heures", + d : "un jour", + dd : "%d jours", + M : "un mois", + MM : "%d mois", + y : "un an", + yy : "%d ans" + }, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + } + }); +})); +// moment.js language configuration +// language : french (fr) +// author : John Fischer : https://github.com/jfroffice + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('fr', { + months : "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"), + monthsShort : "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"), + weekdays : "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"), + weekdaysShort : "dim._lun._mar._mer._jeu._ven._sam.".split("_"), + weekdaysMin : "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[Aujourd'hui à] LT", + nextDay: '[Demain à] LT', + nextWeek: 'dddd [à] LT', + lastDay: '[Hier à] LT', + lastWeek: 'dddd [dernier à] LT', + sameElse: 'L' + }, + relativeTime : { + future : "dans %s", + past : "il y a %s", + s : "quelques secondes", + m : "une minute", + mm : "%d minutes", + h : "une heure", + hh : "%d heures", + d : "un jour", + dd : "%d jours", + M : "un mois", + MM : "%d mois", + y : "un an", + yy : "%d ans" + }, + ordinal : function (number) { + return number + (number === 1 ? 'er' : ''); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : galician (gl) +// author : Juan G. Hurtado : https://github.com/juanghurtado + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('gl', { + months : "Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"), + monthsShort : "Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"), + weekdays : "Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"), + weekdaysShort : "Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"), + weekdaysMin : "Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay : function () { + return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextDay : function () { + return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT'; + }, + nextWeek : function () { + return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + lastDay : function () { + return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT'; + }, + lastWeek : function () { + return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT'; + }, + sameElse : 'L' + }, + relativeTime : { + future : function (str) { + if (str === "uns segundos") { + return "nuns segundos"; + } + return "en " + str; + }, + past : "hai %s", + s : "uns segundos", + m : "un minuto", + mm : "%d minutos", + h : "unha hora", + hh : "%d horas", + d : "un día", + dd : "%d días", + M : "un mes", + MM : "%d meses", + y : "un ano", + yy : "%d anos" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : Hebrew (he) +// author : Tomer Cohen : https://github.com/tomer +// author : Moshe Simantov : https://github.com/DevelopmentIL +// author : Tal Ater : https://github.com/TalAter + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('he', { + months : "ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"), + monthsShort : "ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"), + weekdays : "ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"), + weekdaysShort : "×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"), + weekdaysMin : "×_ב_×’_ד_×”_ו_ש".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D [ב]MMMM YYYY", + LLL : "D [ב]MMMM YYYY LT", + LLLL : "dddd, D [ב]MMMM YYYY LT", + l : "D/M/YYYY", + ll : "D MMM YYYY", + lll : "D MMM YYYY LT", + llll : "ddd, D MMM YYYY LT" + }, + calendar : { + sameDay : '[×”×™×•× ×‘Ö¾]LT', + nextDay : '[מחר ב־]LT', + nextWeek : 'dddd [בשעה] LT', + lastDay : '[×תמול ב־]LT', + lastWeek : '[ביו×] dddd [×”×חרון בשעה] LT', + sameElse : 'L' + }, + relativeTime : { + future : "בעוד %s", + past : "לפני %s", + s : "מספר שניות", + m : "דקה", + mm : "%d דקות", + h : "שעה", + hh : function (number) { + if (number === 2) { + return "שעתיי×"; + } + return number + " שעות"; + }, + d : "יו×", + dd : function (number) { + if (number === 2) { + return "יומיי×"; + } + return number + " ימי×"; + }, + M : "חודש", + MM : function (number) { + if (number === 2) { + return "חודשיי×"; + } + return number + " חודשי×"; + }, + y : "שנה", + yy : function (number) { + if (number === 2) { + return "שנתיי×"; + } + return number + " שני×"; + } + } + }); +})); +// moment.js language configuration +// language : hindi (hi) +// author : Mayank Singhal : https://github.com/mayanksinghal + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.lang('hi', { + months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split("_"), + monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split("_"), + weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split("_"), + weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split("_"), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split("_"), + longDateFormat : { + LT : "A h:mm बजे", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY, LT", + LLLL : "dddd, D MMMM YYYY, LT" + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[कल] LT', + nextWeek : 'dddd, LT', + lastDay : '[कल] LT', + lastWeek : '[पिछले] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s में", + past : "%s पहले", + s : "कà¥à¤› ही कà¥à¤·à¤£", + m : "à¤à¤• मिनट", + mm : "%d मिनट", + h : "à¤à¤• घंटा", + hh : "%d घंटे", + d : "à¤à¤• दिन", + dd : "%d दिन", + M : "à¤à¤• महीने", + MM : "%d महीने", + y : "à¤à¤• वरà¥à¤·", + yy : "%d वरà¥à¤·" + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + // Hindi notation for meridiems are quite fuzzy in practice. While there exists + // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi. + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return "रात"; + } else if (hour < 10) { + return "सà¥à¤¬à¤¹"; + } else if (hour < 17) { + return "दोपहर"; + } else if (hour < 20) { + return "शाम"; + } else { + return "रात"; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : hrvatski (hr) +// author : Bojan Marković : https://github.com/bmarkovic + +// based on (sl) translation by Robert SedovÅ¡ek + +(function (factory) { + factory(moment); +}(function (moment) { + + function translate(number, withoutSuffix, key) { + var result = number + " "; + switch (key) { + case 'm': + return withoutSuffix ? 'jedna minuta' : 'jedne minute'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minuta'; + } + return result; + case 'h': + return withoutSuffix ? 'jedan sat' : 'jednog sata'; + case 'hh': + if (number === 1) { + result += 'sat'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'sata'; + } else { + result += 'sati'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dana'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mjesec'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'mjeseca'; + } else { + result += 'mjeseci'; + } + return result; + case 'yy': + if (number === 1) { + result += 'godina'; + } else if (number === 2 || number === 3 || number === 4) { + result += 'godine'; + } else { + result += 'godina'; + } + return result; + } + } + + return moment.lang('hr', { + months : "sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"), + monthsShort : "sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"), + weekdays : "nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"), + weekdaysShort : "ned._pon._uto._sri._Äet._pet._sub.".split("_"), + weekdaysMin : "ne_po_ut_sr_Äe_pe_su".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD. MM. YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay : '[danas u] LT', + nextDay : '[sutra u] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[u] dddd [u] LT'; + } + }, + lastDay : '[juÄer u] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + return '[proÅ¡lu] dddd [u] LT'; + case 6: + return '[proÅ¡le] [subote] [u] LT'; + case 1: + case 2: + case 4: + case 5: + return '[proÅ¡li] dddd [u] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : "za %s", + past : "prije %s", + s : "par sekundi", + m : translate, + mm : translate, + h : translate, + hh : translate, + d : "dan", + dd : translate, + M : "mjesec", + MM : translate, + y : "godinu", + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : hungarian (hu) +// author : Adam Brunner : https://github.com/adambrunner + +(function (factory) { + factory(moment); +}(function (moment) { + var weekEndings = 'vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton'.split(' '); + + function translate(number, withoutSuffix, key, isFuture) { + var num = number, + suffix; + + switch (key) { + case 's': + return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce'; + case 'm': + return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'mm': + return num + (isFuture || withoutSuffix ? ' perc' : ' perce'); + case 'h': + return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'hh': + return num + (isFuture || withoutSuffix ? ' óra' : ' órája'); + case 'd': + return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'dd': + return num + (isFuture || withoutSuffix ? ' nap' : ' napja'); + case 'M': + return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'MM': + return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja'); + case 'y': + return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve'); + case 'yy': + return num + (isFuture || withoutSuffix ? ' év' : ' éve'); + } + + return ''; + } + + function week(isFuture) { + return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]'; + } + + return moment.lang('hu', { + months : "január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"), + monthsShort : "jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"), + weekdays : "vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"), + weekdaysShort : "vas_hét_kedd_sze_csüt_pén_szo".split("_"), + weekdaysMin : "v_h_k_sze_cs_p_szo".split("_"), + longDateFormat : { + LT : "H:mm", + L : "YYYY.MM.DD.", + LL : "YYYY. MMMM D.", + LLL : "YYYY. MMMM D., LT", + LLLL : "YYYY. MMMM D., dddd LT" + }, + calendar : { + sameDay : '[ma] LT[-kor]', + nextDay : '[holnap] LT[-kor]', + nextWeek : function () { + return week.call(this, true); + }, + lastDay : '[tegnap] LT[-kor]', + lastWeek : function () { + return week.call(this, false); + }, + sameElse : 'L' + }, + relativeTime : { + future : "%s múlva", + past : "%s", + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : Bahasa Indonesia (id) +// author : Mohammad Satrio Utomo : https://github.com/tyok +// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('id', { + months : "Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"), + monthsShort : "Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"), + weekdays : "Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"), + weekdaysShort : "Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"), + weekdaysMin : "Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"), + longDateFormat : { + LT : "HH.mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY [pukul] LT", + LLLL : "dddd, D MMMM YYYY [pukul] LT" + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'siang'; + } else if (hours < 19) { + return 'sore'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Besok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kemarin pukul] LT', + lastWeek : 'dddd [lalu pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : "dalam %s", + past : "%s yang lalu", + s : "beberapa detik", + m : "semenit", + mm : "%d menit", + h : "sejam", + hh : "%d jam", + d : "sehari", + dd : "%d hari", + M : "sebulan", + MM : "%d bulan", + y : "setahun", + yy : "%d tahun" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : icelandic (is) +// author : Hinrik Örn Sigurðsson : https://github.com/hinrik + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(n) { + if (n % 100 === 11) { + return true; + } else if (n % 10 === 1) { + return false; + } + return true; + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + " "; + switch (key) { + case 's': + return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum'; + case 'm': + return withoutSuffix ? 'mínúta' : 'mínútu'; + case 'mm': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum'); + } else if (withoutSuffix) { + return result + 'mínúta'; + } + return result + 'mínútu'; + case 'hh': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum'); + } + return result + 'klukkustund'; + case 'd': + if (withoutSuffix) { + return 'dagur'; + } + return isFuture ? 'dag' : 'degi'; + case 'dd': + if (plural(number)) { + if (withoutSuffix) { + return result + 'dagar'; + } + return result + (isFuture ? 'daga' : 'dögum'); + } else if (withoutSuffix) { + return result + 'dagur'; + } + return result + (isFuture ? 'dag' : 'degi'); + case 'M': + if (withoutSuffix) { + return 'mánuður'; + } + return isFuture ? 'mánuð' : 'mánuði'; + case 'MM': + if (plural(number)) { + if (withoutSuffix) { + return result + 'mánuðir'; + } + return result + (isFuture ? 'mánuði' : 'mánuðum'); + } else if (withoutSuffix) { + return result + 'mánuður'; + } + return result + (isFuture ? 'mánuð' : 'mánuði'); + case 'y': + return withoutSuffix || isFuture ? 'ár' : 'ári'; + case 'yy': + if (plural(number)) { + return result + (withoutSuffix || isFuture ? 'ár' : 'árum'); + } + return result + (withoutSuffix || isFuture ? 'ár' : 'ári'); + } + } + + return moment.lang('is', { + months : "janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"), + monthsShort : "jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"), + weekdays : "sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"), + weekdaysShort : "sun_mán_þri_mið_fim_fös_lau".split("_"), + weekdaysMin : "Su_Má_Þr_Mi_Fi_Fö_La".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY [kl.] LT", + LLLL : "dddd, D. MMMM YYYY [kl.] LT" + }, + calendar : { + sameDay : '[í dag kl.] LT', + nextDay : '[á morgun kl.] LT', + nextWeek : 'dddd [kl.] LT', + lastDay : '[í gær kl.] LT', + lastWeek : '[síðasta] dddd [kl.] LT', + sameElse : 'L' + }, + relativeTime : { + future : "eftir %s", + past : "fyrir %s síðan", + s : translate, + m : translate, + mm : translate, + h : "klukkustund", + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : italian (it) +// author : Lorenzo : https://github.com/aliem +// author: Mattia Larentis: https://github.com/nostalgiaz + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('it', { + months : "Gennaio_Febbraio_Marzo_Aprile_Maggio_Giugno_Luglio_Agosto_Settembre_Ottobre_Novembre_Dicembre".split("_"), + monthsShort : "Gen_Feb_Mar_Apr_Mag_Giu_Lug_Ago_Set_Ott_Nov_Dic".split("_"), + weekdays : "Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"), + weekdaysShort : "Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"), + weekdaysMin : "D_L_Ma_Me_G_V_S".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay: '[Oggi alle] LT', + nextDay: '[Domani alle] LT', + nextWeek: 'dddd [alle] LT', + lastDay: '[Ieri alle] LT', + lastWeek: '[lo scorso] dddd [alle] LT', + sameElse: 'L' + }, + relativeTime : { + future : function (s) { + return ((/^[0-9].+$/).test(s) ? "tra" : "in") + " " + s; + }, + past : "%s fa", + s : "secondi", + m : "un minuto", + mm : "%d minuti", + h : "un'ora", + hh : "%d ore", + d : "un giorno", + dd : "%d giorni", + M : "un mese", + MM : "%d mesi", + y : "un anno", + yy : "%d anni" + }, + ordinal: '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : japanese (ja) +// author : LI Long : https://github.com/baryon + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('ja', { + months : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), + monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), + weekdays : "日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"), + weekdaysShort : "æ—¥_月_ç«_æ°´_木_金_土".split("_"), + weekdaysMin : "æ—¥_月_ç«_æ°´_木_金_土".split("_"), + longDateFormat : { + LT : "Ah時m分", + L : "YYYY/MM/DD", + LL : "YYYYå¹´M月Dæ—¥", + LLL : "YYYYå¹´M月Dæ—¥LT", + LLLL : "YYYYå¹´M月Dæ—¥LT dddd" + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return "åˆå‰"; + } else { + return "åˆå¾Œ"; + } + }, + calendar : { + sameDay : '[今日] LT', + nextDay : '[明日] LT', + nextWeek : '[æ¥é€±]dddd LT', + lastDay : '[昨日] LT', + lastWeek : '[å‰é€±]dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s後", + past : "%så‰", + s : "数秒", + m : "1分", + mm : "%d分", + h : "1時間", + hh : "%d時間", + d : "1æ—¥", + dd : "%dæ—¥", + M : "1ヶ月", + MM : "%dヶ月", + y : "1å¹´", + yy : "%då¹´" + } + }); +})); +// moment.js language configuration +// language : Georgian (ka) +// author : Irakli Janiashvili : https://github.com/irakli-janiashvili + +(function (factory) { + factory(moment); +}(function (moment) { + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'), + 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_') + }, + + nounCase = (/D[oD] *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'), + 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_') + }, + + nounCase = (/(წინáƒ|შემდეგ)/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.lang('ka', { + months : monthsCaseReplace, + monthsShort : "იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"), + weekdays : weekdaysCaseReplace, + weekdaysShort : "კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"), + weekdaysMin : "კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"), + longDateFormat : { + LT : "h:mm A", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[დღეს] LT[-ზე]', + nextDay : '[ხვáƒáƒš] LT[-ზე]', + lastDay : '[გუშინ] LT[-ზე]', + nextWeek : '[შემდეგ] dddd LT[-ზე]', + lastWeek : '[წინáƒ] dddd LT-ზე', + sameElse : 'L' + }, + relativeTime : { + future : function (s) { + return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ? + s.replace(/ი$/, "ში") : + s + "ში"; + }, + past : function (s) { + if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) { + return s.replace(/(ი|ე)$/, "ის წინ"); + } + if ((/წელი/).test(s)) { + return s.replace(/წელი$/, "წლის წინ"); + } + }, + s : "რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜", + m : "წუთი", + mm : "%d წუთი", + h : "სáƒáƒáƒ—ი", + hh : "%d სáƒáƒáƒ—ი", + d : "დღე", + dd : "%d დღე", + M : "თვე", + MM : "%d თვე", + y : "წელი", + yy : "%d წელი" + }, + ordinal : function (number) { + if (number === 0) { + return number; + } + + if (number === 1) { + return number + "-ლი"; + } + + if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) { + return "მე-" + number; + } + + return number + "-ე"; + }, + week : { + dow : 1, + doy : 7 + } + }); +})); +// moment.js language configuration +// language : korean (ko) +// author : Kyungwook, Park : https://github.com/kyungw00k + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('ko', { + months : "1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"), + monthsShort : "1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"), + weekdays : "ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"), + weekdaysShort : "ì¼_ì›”_í™”_수_목_금_토".split("_"), + weekdaysMin : "ì¼_ì›”_í™”_수_목_금_토".split("_"), + longDateFormat : { + LT : "A hì‹œ mm분", + L : "YYYY.MM.DD", + LL : "YYYYë…„ MMMM Dì¼", + LLL : "YYYYë…„ MMMM Dì¼ LT", + LLLL : "YYYYë…„ MMMM Dì¼ dddd LT" + }, + meridiem : function (hour, minute, isUpper) { + return hour < 12 ? '오전' : '오후'; + }, + calendar : { + sameDay : '오늘 LT', + nextDay : 'ë‚´ì¼ LT', + nextWeek : 'dddd LT', + lastDay : 'ì–´ì œ LT', + lastWeek : '지난주 dddd LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s 후", + past : "%s ì „", + s : "몇초", + ss : "%dì´ˆ", + m : "ì¼ë¶„", + mm : "%d분", + h : "한시간", + hh : "%d시간", + d : "하루", + dd : "%dì¼", + M : "한달", + MM : "%d달", + y : "ì¼ë…„", + yy : "%dë…„" + }, + ordinal : '%dì¼' + }); +})); +// moment.js language configuration +// language : Lithuanian (lt) +// author : Mindaugas MozÅ«ras : https://github.com/mmozuras + +(function (factory) { + factory(moment); +}(function (moment) { + var units = { + "m" : "minutÄ—_minutÄ—s_minutÄ™", + "mm": "minutÄ—s_minuÄių_minutes", + "h" : "valanda_valandos_valandÄ…", + "hh": "valandos_valandų_valandas", + "d" : "diena_dienos_dienÄ…", + "dd": "dienos_dienų_dienas", + "M" : "mÄ—nuo_mÄ—nesio_mÄ—nesį", + "MM": "mÄ—nesiai_mÄ—nesių_mÄ—nesius", + "y" : "metai_metų_metus", + "yy": "metai_metų_metus" + }, + weekDays = "pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis_sekmadienis".split("_"); + + function translateSeconds(number, withoutSuffix, key, isFuture) { + if (withoutSuffix) { + return "kelios sekundÄ—s"; + } else { + return isFuture ? "kelių sekundžių" : "kelias sekundes"; + } + } + + function translateSingular(number, withoutSuffix, key, isFuture) { + return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]); + } + + function special(number) { + return number % 10 === 0 || (number > 10 && number < 20); + } + + function forms(key) { + return units[key].split("_"); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + " "; + if (number === 1) { + return result + translateSingular(number, withoutSuffix, key[0], isFuture); + } else if (withoutSuffix) { + return result + (special(number) ? forms(key)[1] : forms(key)[0]); + } else { + if (isFuture) { + return result + forms(key)[1]; + } else { + return result + (special(number) ? forms(key)[1] : forms(key)[2]); + } + } + } + + function relativeWeekDay(moment, format) { + var nominative = format.indexOf('dddd LT') === -1, + weekDay = weekDays[moment.weekday()]; + + return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + "į"; + } + + return moment.lang("lt", { + months : "sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"), + monthsShort : "sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"), + weekdays : relativeWeekDay, + weekdaysShort : "Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"), + weekdaysMin : "S_P_A_T_K_Pn_Å ".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "YYYY [m.] MMMM D [d.]", + LLL : "YYYY [m.] MMMM D [d.], LT [val.]", + LLLL : "YYYY [m.] MMMM D [d.], dddd, LT [val.]", + l : "YYYY-MM-DD", + ll : "YYYY [m.] MMMM D [d.]", + lll : "YYYY [m.] MMMM D [d.], LT [val.]", + llll : "YYYY [m.] MMMM D [d.], ddd, LT [val.]" + }, + calendar : { + sameDay : "[Å iandien] LT", + nextDay : "[Rytoj] LT", + nextWeek : "dddd LT", + lastDay : "[Vakar] LT", + lastWeek : "[PraÄ—jusį] dddd LT", + sameElse : "L" + }, + relativeTime : { + future : "po %s", + past : "prieÅ¡ %s", + s : translateSeconds, + m : translateSingular, + mm : translate, + h : translateSingular, + hh : translate, + d : translateSingular, + dd : translate, + M : translateSingular, + MM : translate, + y : translateSingular, + yy : translate + }, + ordinal : function (number) { + return number + '-oji'; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : latvian (lv) +// author : Kristaps Karlsons : https://github.com/skakri + +(function (factory) { + factory(moment); +}(function (moment) { + var units = { + 'mm': 'minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes', + 'hh': 'stundu_stundas_stunda_stundas', + 'dd': 'dienu_dienas_diena_dienas', + 'MM': 'mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i', + 'yy': 'gadu_gadus_gads_gadi' + }; + + function format(word, number, withoutSuffix) { + var forms = word.split('_'); + if (withoutSuffix) { + return number % 10 === 1 && number !== 11 ? forms[2] : forms[3]; + } else { + return number % 10 === 1 && number !== 11 ? forms[0] : forms[1]; + } + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + return number + ' ' + format(units[key], number, withoutSuffix); + } + + return moment.lang('lv', { + months : "janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"), + monthsShort : "jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"), + weekdays : "svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"), + weekdaysShort : "Sv_P_O_T_C_Pk_S".split("_"), + weekdaysMin : "Sv_P_O_T_C_Pk_S".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "YYYY. [gada] D. MMMM", + LLL : "YYYY. [gada] D. MMMM, LT", + LLLL : "YYYY. [gada] D. MMMM, dddd, LT" + }, + calendar : { + sameDay : '[Å odien pulksten] LT', + nextDay : '[RÄ«t pulksten] LT', + nextWeek : 'dddd [pulksten] LT', + lastDay : '[Vakar pulksten] LT', + lastWeek : '[PagÄjuÅ¡Ä] dddd [pulksten] LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s vÄ“lÄk", + past : "%s agrÄk", + s : "dažas sekundes", + m : "minÅ«ti", + mm : relativeTimeWithPlural, + h : "stundu", + hh : relativeTimeWithPlural, + d : "dienu", + dd : relativeTimeWithPlural, + M : "mÄ“nesi", + MM : relativeTimeWithPlural, + y : "gadu", + yy : relativeTimeWithPlural + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : malayalam (ml) +// author : Floyd Pink : https://github.com/floydpink + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('ml', { + months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split("_"), + monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split("_"), + weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split("_"), + weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split("_"), + weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split("_"), + longDateFormat : { + LT : "A h:mm -à´¨àµ", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY, LT", + LLLL : "dddd, D MMMM YYYY, LT" + }, + calendar : { + sameDay : '[ഇനàµà´¨àµ] LT', + nextDay : '[നാളെ] LT', + nextWeek : 'dddd, LT', + lastDay : '[ഇനàµà´¨à´²àµ†] LT', + lastWeek : '[à´•à´´à´¿à´žàµà´ž] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s à´•à´´à´¿à´žàµà´žàµ", + past : "%s à´®àµàµ»à´ªàµ", + s : "അൽപ നിമിഷങàµà´™àµ¾", + m : "ഒരൠമിനിറàµà´±àµ", + mm : "%d മിനിറàµà´±àµ", + h : "ഒരൠമണികàµà´•àµ‚ർ", + hh : "%d മണികàµà´•àµ‚ർ", + d : "ഒരൠദിവസം", + dd : "%d ദിവസം", + M : "ഒരൠമാസം", + MM : "%d മാസം", + y : "ഒരൠവർഷം", + yy : "%d വർഷം" + }, + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return "രാതàµà´°à´¿"; + } else if (hour < 12) { + return "രാവിലെ"; + } else if (hour < 17) { + return "ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ"; + } else if (hour < 20) { + return "വൈകàµà´¨àµà´¨àµ‡à´°à´‚"; + } else { + return "രാതàµà´°à´¿"; + } + } + }); +})); +// moment.js language configuration +// language : Marathi (mr) +// author : Harshad Kale : https://github.com/kalehv + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.lang('mr', { + months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split("_"), + monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split("_"), + weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split("_"), + weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split("_"), + weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split("_"), + longDateFormat : { + LT : "A h:mm वाजता", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY, LT", + LLLL : "dddd, D MMMM YYYY, LT" + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[उदà¥à¤¯à¤¾] LT', + nextWeek : 'dddd, LT', + lastDay : '[काल] LT', + lastWeek: '[मागील] dddd, LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s नंतर", + past : "%s पूरà¥à¤µà¥€", + s : "सेकंद", + m: "à¤à¤• मिनिट", + mm: "%d मिनिटे", + h : "à¤à¤• तास", + hh : "%d तास", + d : "à¤à¤• दिवस", + dd : "%d दिवस", + M : "à¤à¤• महिना", + MM : "%d महिने", + y : "à¤à¤• वरà¥à¤·", + yy : "%d वरà¥à¤·à¥‡" + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiem: function (hour, minute, isLower) + { + if (hour < 4) { + return "रातà¥à¤°à¥€"; + } else if (hour < 10) { + return "सकाळी"; + } else if (hour < 17) { + return "दà¥à¤ªà¤¾à¤°à¥€"; + } else if (hour < 20) { + return "सायंकाळी"; + } else { + return "रातà¥à¤°à¥€"; + } + }, + week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : Bahasa Malaysia (ms-MY) +// author : Weldan Jamili : https://github.com/weldan + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('ms-my', { + months : "Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"), + monthsShort : "Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"), + weekdays : "Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"), + weekdaysShort : "Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"), + weekdaysMin : "Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"), + longDateFormat : { + LT : "HH.mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY [pukul] LT", + LLLL : "dddd, D MMMM YYYY [pukul] LT" + }, + meridiem : function (hours, minutes, isLower) { + if (hours < 11) { + return 'pagi'; + } else if (hours < 15) { + return 'tengahari'; + } else if (hours < 19) { + return 'petang'; + } else { + return 'malam'; + } + }, + calendar : { + sameDay : '[Hari ini pukul] LT', + nextDay : '[Esok pukul] LT', + nextWeek : 'dddd [pukul] LT', + lastDay : '[Kelmarin pukul] LT', + lastWeek : 'dddd [lepas pukul] LT', + sameElse : 'L' + }, + relativeTime : { + future : "dalam %s", + past : "%s yang lepas", + s : "beberapa saat", + m : "seminit", + mm : "%d minit", + h : "sejam", + hh : "%d jam", + d : "sehari", + dd : "%d hari", + M : "sebulan", + MM : "%d bulan", + y : "setahun", + yy : "%d tahun" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : norwegian bokmÃ¥l (nb) +// authors : Espen Hovlandsdal : https://github.com/rexxars +// Sigurd Gartmann : https://github.com/sigurdga + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('nb', { + months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"), + monthsShort : "jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"), + weekdays : "søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"), + weekdaysShort : "sø._ma._ti._on._to._fr._lø.".split("_"), + weekdaysMin : "sø_ma_ti_on_to_fr_lø".split("_"), + longDateFormat : { + LT : "H.mm", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY [kl.] LT", + LLLL : "dddd D. MMMM YYYY [kl.] LT" + }, + calendar : { + sameDay: '[i dag kl.] LT', + nextDay: '[i morgen kl.] LT', + nextWeek: 'dddd [kl.] LT', + lastDay: '[i gÃ¥r kl.] LT', + lastWeek: '[forrige] dddd [kl.] LT', + sameElse: 'L' + }, + relativeTime : { + future : "om %s", + past : "for %s siden", + s : "noen sekunder", + m : "ett minutt", + mm : "%d minutter", + h : "en time", + hh : "%d timer", + d : "en dag", + dd : "%d dager", + M : "en mÃ¥ned", + MM : "%d mÃ¥neder", + y : "ett Ã¥r", + yy : "%d Ã¥r" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : nepali/nepalese +// author : suvash : https://github.com/suvash + +(function (factory) { + factory(moment); +}(function (moment) { + var symbolMap = { + '1': '१', + '2': '२', + '3': '३', + '4': '४', + '5': '५', + '6': '६', + '7': '७', + '8': '८', + '9': '९', + '0': '०' + }, + numberMap = { + '१': '1', + '२': '2', + '३': '3', + '४': '4', + '५': '5', + '६': '6', + '७': '7', + '८': '8', + '९': '9', + '०': '0' + }; + + return moment.lang('ne', { + months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split("_"), + monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split("_"), + weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split("_"), + weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split("_"), + weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split("_"), + longDateFormat : { + LT : "Aको h:mm बजे", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY, LT", + LLLL : "dddd, D MMMM YYYY, LT" + }, + preparse: function (string) { + return string.replace(/[१२३४५६७८९०]/g, function (match) { + return numberMap[match]; + }); + }, + postformat: function (string) { + return string.replace(/\d/g, function (match) { + return symbolMap[match]; + }); + }, + meridiem : function (hour, minute, isLower) { + if (hour < 3) { + return "राती"; + } else if (hour < 10) { + return "बिहान"; + } else if (hour < 15) { + return "दिउà¤à¤¸à¥‹"; + } else if (hour < 18) { + return "बेलà¥à¤•à¤¾"; + } else if (hour < 20) { + return "साà¤à¤"; + } else { + return "राती"; + } + }, + calendar : { + sameDay : '[आज] LT', + nextDay : '[भोली] LT', + nextWeek : '[आउà¤à¤¦à¥‹] dddd[,] LT', + lastDay : '[हिजो] LT', + lastWeek : '[गà¤à¤•à¥‹] dddd[,] LT', + sameElse : 'L' + }, + relativeTime : { + future : "%sमा", + past : "%s अगाडी", + s : "केही समय", + m : "à¤à¤• मिनेट", + mm : "%d मिनेट", + h : "à¤à¤• घणà¥à¤Ÿà¤¾", + hh : "%d घणà¥à¤Ÿà¤¾", + d : "à¤à¤• दिन", + dd : "%d दिन", + M : "à¤à¤• महिना", + MM : "%d महिना", + y : "à¤à¤• बरà¥à¤·", + yy : "%d बरà¥à¤·" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : dutch (nl) +// author : Joris Röling : https://github.com/jjupiter + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsShortWithDots = "jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"), + monthsShortWithoutDots = "jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"); + + return moment.lang('nl', { + months : "januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"), + monthsShort : function (m, format) { + if (/-MMM-/.test(format)) { + return monthsShortWithoutDots[m.month()]; + } else { + return monthsShortWithDots[m.month()]; + } + }, + weekdays : "zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"), + weekdaysShort : "zo._ma._di._wo._do._vr._za.".split("_"), + weekdaysMin : "Zo_Ma_Di_Wo_Do_Vr_Za".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD-MM-YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: '[vandaag om] LT', + nextDay: '[morgen om] LT', + nextWeek: 'dddd [om] LT', + lastDay: '[gisteren om] LT', + lastWeek: '[afgelopen] dddd [om] LT', + sameElse: 'L' + }, + relativeTime : { + future : "over %s", + past : "%s geleden", + s : "een paar seconden", + m : "één minuut", + mm : "%d minuten", + h : "één uur", + hh : "%d uur", + d : "één dag", + dd : "%d dagen", + M : "één maand", + MM : "%d maanden", + y : "één jaar", + yy : "%d jaar" + }, + ordinal : function (number) { + return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de'); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : norwegian nynorsk (nn) +// author : https://github.com/mechuwind + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('nn', { + months : "januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"), + monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"), + weekdays : "sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"), + weekdaysShort : "sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"), + weekdaysMin : "su_mÃ¥_ty_on_to_fr_lø".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: '[I dag klokka] LT', + nextDay: '[I morgon klokka] LT', + nextWeek: 'dddd [klokka] LT', + lastDay: '[I gÃ¥r klokka] LT', + lastWeek: '[FøregÃ¥ende] dddd [klokka] LT', + sameElse: 'L' + }, + relativeTime : { + future : "om %s", + past : "for %s siden", + s : "noen sekund", + m : "ett minutt", + mm : "%d minutt", + h : "en time", + hh : "%d timar", + d : "en dag", + dd : "%d dagar", + M : "en mÃ¥nad", + MM : "%d mÃ¥nader", + y : "ett Ã¥r", + yy : "%d Ã¥r" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : polish (pl) +// author : Rafal Hirsz : https://github.com/evoL + +(function (factory) { + factory(moment); +}(function (moment) { + var monthsNominative = "styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"), + monthsSubjective = "stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_"); + + function plural(n) { + return (n % 10 < 5) && (n % 10 > 1) && (~~(n / 10) !== 1); + } + + function translate(number, withoutSuffix, key) { + var result = number + " "; + switch (key) { + case 'm': + return withoutSuffix ? 'minuta' : 'minutÄ™'; + case 'mm': + return result + (plural(number) ? 'minuty' : 'minut'); + case 'h': + return withoutSuffix ? 'godzina' : 'godzinÄ™'; + case 'hh': + return result + (plural(number) ? 'godziny' : 'godzin'); + case 'MM': + return result + (plural(number) ? 'miesiÄ…ce' : 'miesiÄ™cy'); + case 'yy': + return result + (plural(number) ? 'lata' : 'lat'); + } + } + + return moment.lang('pl', { + months : function (momentToFormat, format) { + if (/D MMMM/.test(format)) { + return monthsSubjective[momentToFormat.month()]; + } else { + return monthsNominative[momentToFormat.month()]; + } + }, + monthsShort : "sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"), + weekdays : "niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"), + weekdaysShort : "nie_pon_wt_Å›r_czw_pt_sb".split("_"), + weekdaysMin : "N_Pn_Wt_Åšr_Cz_Pt_So".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay: '[DziÅ› o] LT', + nextDay: '[Jutro o] LT', + nextWeek: '[W] dddd [o] LT', + lastDay: '[Wczoraj o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[W zeszÅ‚Ä… niedzielÄ™ o] LT'; + case 3: + return '[W zeszÅ‚Ä… Å›rodÄ™ o] LT'; + case 6: + return '[W zeszÅ‚Ä… sobotÄ™ o] LT'; + default: + return '[W zeszÅ‚y] dddd [o] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : "za %s", + past : "%s temu", + s : "kilka sekund", + m : translate, + mm : translate, + h : translate, + hh : translate, + d : "1 dzieÅ„", + dd : '%d dni', + M : "miesiÄ…c", + MM : translate, + y : "rok", + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : brazilian portuguese (pt-br) +// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('pt-br', { + months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"), + monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"), + weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"), + weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"), + weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D [de] MMMM [de] YYYY", + LLL : "D [de] MMMM [de] YYYY LT", + LLLL : "dddd, D [de] MMMM [de] YYYY LT" + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : "em %s", + past : "%s atrás", + s : "segundos", + m : "um minuto", + mm : "%d minutos", + h : "uma hora", + hh : "%d horas", + d : "um dia", + dd : "%d dias", + M : "um mês", + MM : "%d meses", + y : "um ano", + yy : "%d anos" + }, + ordinal : '%dº' + }); +})); +// moment.js language configuration +// language : portuguese (pt) +// author : Jefferson : https://github.com/jalex79 + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('pt', { + months : "Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"), + monthsShort : "Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"), + weekdays : "Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"), + weekdaysShort : "Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"), + weekdaysMin : "Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D [de] MMMM [de] YYYY", + LLL : "D [de] MMMM [de] YYYY LT", + LLLL : "dddd, D [de] MMMM [de] YYYY LT" + }, + calendar : { + sameDay: '[Hoje às] LT', + nextDay: '[Amanhã às] LT', + nextWeek: 'dddd [às] LT', + lastDay: '[Ontem às] LT', + lastWeek: function () { + return (this.day() === 0 || this.day() === 6) ? + '[Último] dddd [às] LT' : // Saturday + Sunday + '[Última] dddd [às] LT'; // Monday - Friday + }, + sameElse: 'L' + }, + relativeTime : { + future : "em %s", + past : "%s atrás", + s : "segundos", + m : "um minuto", + mm : "%d minutos", + h : "uma hora", + hh : "%d horas", + d : "um dia", + dd : "%d dias", + M : "um mês", + MM : "%d meses", + y : "um ano", + yy : "%d anos" + }, + ordinal : '%dº', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : romanian (ro) +// author : Vlad Gurdiga : https://github.com/gurdiga +// author : Valentin Agachi : https://github.com/avaly + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('ro', { + months : "Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie".split("_"), + monthsShort : "Ian_Feb_Mar_Apr_Mai_Iun_Iul_Aug_Sep_Oct_Noi_Dec".split("_"), + weekdays : "Duminică_Luni_MarÅ£i_Miercuri_Joi_Vineri_Sâmbătă".split("_"), + weekdaysShort : "Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"), + weekdaysMin : "Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY H:mm", + LLLL : "dddd, D MMMM YYYY H:mm" + }, + calendar : { + sameDay: "[azi la] LT", + nextDay: '[mâine la] LT', + nextWeek: 'dddd [la] LT', + lastDay: '[ieri la] LT', + lastWeek: '[fosta] dddd [la] LT', + sameElse: 'L' + }, + relativeTime : { + future : "peste %s", + past : "%s în urmă", + s : "câteva secunde", + m : "un minut", + mm : "%d minute", + h : "o oră", + hh : "%d ore", + d : "o zi", + dd : "%d zile", + M : "o lună", + MM : "%d luni", + y : "un an", + yy : "%d ani" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : russian (ru) +// author : Viktorminator : https://github.com/Viktorminator +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'минута_минуты_минут', + 'hh': 'чаÑ_чаÑа_чаÑов', + 'dd': 'день_днÑ_дней', + 'MM': 'меÑÑц_меÑÑца_меÑÑцев', + 'yy': 'год_года_лет' + }; + if (key === 'm') { + return withoutSuffix ? 'минута' : 'минуту'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'), + 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function monthsShortCaseReplace(m, format) { + var monthsShort = { + 'nominative': 'Ñнв_фев_мар_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'), + 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return monthsShort[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'), + 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_') + }, + + nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую)? ?\] ?dddd/).test(format) ? + 'accusative' : + 'nominative'; + + return weekdays[nounCase][m.day()]; + } + + return moment.lang('ru', { + months : monthsCaseReplace, + monthsShort : monthsShortCaseReplace, + weekdays : weekdaysCaseReplace, + weekdaysShort : "вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + weekdaysMin : "вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i], + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY г.", + LLL : "D MMMM YYYY г., LT", + LLLL : "dddd, D MMMM YYYY г., LT" + }, + calendar : { + sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT', + nextDay: '[Завтра в] LT', + lastDay: '[Вчера в] LT', + nextWeek: function () { + return this.day() === 2 ? '[Во] dddd [в] LT' : '[Ð’] dddd [в] LT'; + }, + lastWeek: function () { + switch (this.day()) { + case 0: + return '[Ð’ прошлое] dddd [в] LT'; + case 1: + case 2: + case 4: + return '[Ð’ прошлый] dddd [в] LT'; + case 3: + case 5: + case 6: + return '[Ð’ прошлую] dddd [в] LT'; + } + }, + sameElse: 'L' + }, + relativeTime : { + future : "через %s", + past : "%s назад", + s : "неÑколько Ñекунд", + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : "чаÑ", + hh : relativeTimeWithPlural, + d : "день", + dd : relativeTimeWithPlural, + M : "меÑÑц", + MM : relativeTimeWithPlural, + y : "год", + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return "ночи"; + } else if (hour < 12) { + return "утра"; + } else if (hour < 17) { + return "днÑ"; + } else { + return "вечера"; + } + }, + + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + return number + '-й'; + case 'D': + return number + '-го'; + case 'w': + case 'W': + return number + '-Ñ'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : slovak (sk) +// author : Martin Minka : https://github.com/k2s +// based on work of petrbela : https://github.com/petrbela + +(function (factory) { + factory(moment); +}(function (moment) { + var months = "január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"), + monthsShort = "jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_"); + + function plural(n) { + return (n > 1) && (n < 5); + } + + function translate(number, withoutSuffix, key, isFuture) { + var result = number + " "; + switch (key) { + case 's': // a few seconds / in a few seconds / a few seconds ago + return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami'; + case 'm': // a minute / in a minute / a minute ago + return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou'); + case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'minúty' : 'minút'); + } else { + return result + 'minútami'; + } + break; + case 'h': // an hour / in an hour / an hour ago + return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou'); + case 'hh': // 9 hours / in 9 hours / 9 hours ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'hodiny' : 'hodín'); + } else { + return result + 'hodinami'; + } + break; + case 'd': // a day / in a day / a day ago + return (withoutSuffix || isFuture) ? 'deň' : 'dňom'; + case 'dd': // 9 days / in 9 days / 9 days ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'dni' : 'dní'); + } else { + return result + 'dňami'; + } + break; + case 'M': // a month / in a month / a month ago + return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom'; + case 'MM': // 9 months / in 9 months / 9 months ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'mesiace' : 'mesiacov'); + } else { + return result + 'mesiacmi'; + } + break; + case 'y': // a year / in a year / a year ago + return (withoutSuffix || isFuture) ? 'rok' : 'rokom'; + case 'yy': // 9 years / in 9 years / 9 years ago + if (withoutSuffix || isFuture) { + return result + (plural(number) ? 'roky' : 'rokov'); + } else { + return result + 'rokmi'; + } + break; + } + } + + return moment.lang('sk', { + months : months, + monthsShort : monthsShort, + monthsParse : (function (months, monthsShort) { + var i, _monthsParse = []; + for (i = 0; i < 12; i++) { + // use custom parser to solve problem with July (Äervenec) + _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i'); + } + return _monthsParse; + }(months, monthsShort)), + weekdays : "nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"), + weekdaysShort : "ne_po_ut_st_Å¡t_pi_so".split("_"), + weekdaysMin : "ne_po_ut_st_Å¡t_pi_so".split("_"), + longDateFormat : { + LT: "H:mm", + L : "DD.MM.YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd D. MMMM YYYY LT" + }, + calendar : { + sameDay: "[dnes o] LT", + nextDay: '[zajtra o] LT', + nextWeek: function () { + switch (this.day()) { + case 0: + return '[v nedeľu o] LT'; + case 1: + case 2: + return '[v] dddd [o] LT'; + case 3: + return '[v stredu o] LT'; + case 4: + return '[vo Å¡tvrtok o] LT'; + case 5: + return '[v piatok o] LT'; + case 6: + return '[v sobotu o] LT'; + } + }, + lastDay: '[vÄera o] LT', + lastWeek: function () { + switch (this.day()) { + case 0: + return '[minulú nedeľu o] LT'; + case 1: + case 2: + return '[minulý] dddd [o] LT'; + case 3: + return '[minulú stredu o] LT'; + case 4: + case 5: + return '[minulý] dddd [o] LT'; + case 6: + return '[minulú sobotu o] LT'; + } + }, + sameElse: "L" + }, + relativeTime : { + future : "za %s", + past : "pred %s", + s : translate, + m : translate, + mm : translate, + h : translate, + hh : translate, + d : translate, + dd : translate, + M : translate, + MM : translate, + y : translate, + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : slovenian (sl) +// author : Robert SedovÅ¡ek : https://github.com/sedovsek + +(function (factory) { + factory(moment); +}(function (moment) { + function translate(number, withoutSuffix, key) { + var result = number + " "; + switch (key) { + case 'm': + return withoutSuffix ? 'ena minuta' : 'eno minuto'; + case 'mm': + if (number === 1) { + result += 'minuta'; + } else if (number === 2) { + result += 'minuti'; + } else if (number === 3 || number === 4) { + result += 'minute'; + } else { + result += 'minut'; + } + return result; + case 'h': + return withoutSuffix ? 'ena ura' : 'eno uro'; + case 'hh': + if (number === 1) { + result += 'ura'; + } else if (number === 2) { + result += 'uri'; + } else if (number === 3 || number === 4) { + result += 'ure'; + } else { + result += 'ur'; + } + return result; + case 'dd': + if (number === 1) { + result += 'dan'; + } else { + result += 'dni'; + } + return result; + case 'MM': + if (number === 1) { + result += 'mesec'; + } else if (number === 2) { + result += 'meseca'; + } else if (number === 3 || number === 4) { + result += 'mesece'; + } else { + result += 'mesecev'; + } + return result; + case 'yy': + if (number === 1) { + result += 'leto'; + } else if (number === 2) { + result += 'leti'; + } else if (number === 3 || number === 4) { + result += 'leta'; + } else { + result += 'let'; + } + return result; + } + } + + return moment.lang('sl', { + months : "januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"), + monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"), + weekdays : "nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"), + weekdaysShort : "ned._pon._tor._sre._Äet._pet._sob.".split("_"), + weekdaysMin : "ne_po_to_sr_Äe_pe_so".split("_"), + longDateFormat : { + LT : "H:mm", + L : "DD. MM. YYYY", + LL : "D. MMMM YYYY", + LLL : "D. MMMM YYYY LT", + LLLL : "dddd, D. MMMM YYYY LT" + }, + calendar : { + sameDay : '[danes ob] LT', + nextDay : '[jutri ob] LT', + + nextWeek : function () { + switch (this.day()) { + case 0: + return '[v] [nedeljo] [ob] LT'; + case 3: + return '[v] [sredo] [ob] LT'; + case 6: + return '[v] [soboto] [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[v] dddd [ob] LT'; + } + }, + lastDay : '[vÄeraj ob] LT', + lastWeek : function () { + switch (this.day()) { + case 0: + case 3: + case 6: + return '[prejÅ¡nja] dddd [ob] LT'; + case 1: + case 2: + case 4: + case 5: + return '[prejÅ¡nji] dddd [ob] LT'; + } + }, + sameElse : 'L' + }, + relativeTime : { + future : "Äez %s", + past : "%s nazaj", + s : "nekaj sekund", + m : translate, + mm : translate, + h : translate, + hh : translate, + d : "en dan", + dd : translate, + M : "en mesec", + MM : translate, + y : "eno leto", + yy : translate + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : Albanian (sq) +// author : Flakërim Ismani : https://github.com/flakerimi +// author: Menelion Elensúle: https://github.com/Oire (tests) + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('sq', { + months : "Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"), + monthsShort : "Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"), + weekdays : "E Diel_E Hënë_E Marte_E Mërkure_E Enjte_E Premte_E Shtunë".split("_"), + weekdaysShort : "Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"), + weekdaysMin : "D_H_Ma_Më_E_P_Sh".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[Sot në] LT', + nextDay : '[Neser në] LT', + nextWeek : 'dddd [në] LT', + lastDay : '[Dje në] LT', + lastWeek : 'dddd [e kaluar në] LT', + sameElse : 'L' + }, + relativeTime : { + future : "në %s", + past : "%s me parë", + s : "disa seconda", + m : "një minut", + mm : "%d minutea", + h : "një orë", + hh : "%d orë", + d : "një ditë", + dd : "%d ditë", + M : "një muaj", + MM : "%d muaj", + y : "një vit", + yy : "%d vite" + }, + ordinal : '%d.', + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : swedish (sv) +// author : Jens Alm : https://github.com/ulmus + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('sv', { + months : "januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"), + monthsShort : "jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"), + weekdays : "söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"), + weekdaysShort : "sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"), + weekdaysMin : "sö_mÃ¥_ti_on_to_fr_lö".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "YYYY-MM-DD", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: '[Idag] LT', + nextDay: '[Imorgon] LT', + lastDay: '[IgÃ¥r] LT', + nextWeek: 'dddd LT', + lastWeek: '[Förra] dddd[en] LT', + sameElse: 'L' + }, + relativeTime : { + future : "om %s", + past : "för %s sedan", + s : "nÃ¥gra sekunder", + m : "en minut", + mm : "%d minuter", + h : "en timme", + hh : "%d timmar", + d : "en dag", + dd : "%d dagar", + M : "en mÃ¥nad", + MM : "%d mÃ¥nader", + y : "ett Ã¥r", + yy : "%d Ã¥r" + }, + ordinal : function (number) { + var b = number % 10, + output = (~~ (number % 100 / 10) === 1) ? 'e' : + (b === 1) ? 'a' : + (b === 2) ? 'a' : + (b === 3) ? 'e' : 'e'; + return number + output; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : thai (th) +// author : Kridsada Thanabulpong : https://github.com/sirn + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('th', { + months : "มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"), + monthsShort : "มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"), + weekdays : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"), + weekdaysShort : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"), // yes, three characters difference + weekdaysMin : "อา._จ._อ._พ._พฤ._ศ._ส.".split("_"), + longDateFormat : { + LT : "H นาฬิà¸à¸² m นาที", + L : "YYYY/MM/DD", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY เวลา LT", + LLLL : "วันddddที่ D MMMM YYYY เวลา LT" + }, + meridiem : function (hour, minute, isLower) { + if (hour < 12) { + return "à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง"; + } else { + return "หลังเที่ยง"; + } + }, + calendar : { + sameDay : '[วันนี้ เวลา] LT', + nextDay : '[พรุ่งนี้ เวลา] LT', + nextWeek : 'dddd[หน้า เวลา] LT', + lastDay : '[เมื่อวานนี้ เวลา] LT', + lastWeek : '[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT', + sameElse : 'L' + }, + relativeTime : { + future : "อีภ%s", + past : "%sที่à¹à¸¥à¹‰à¸§", + s : "ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี", + m : "1 นาที", + mm : "%d นาที", + h : "1 ชั่วโมง", + hh : "%d ชั่วโมง", + d : "1 วัน", + dd : "%d วัน", + M : "1 เดือน", + MM : "%d เดือน", + y : "1 ปี", + yy : "%d ปี" + } + }); +})); +// moment.js language configuration +// language : turkish (tr) +// authors : Erhan Gundogan : https://github.com/erhangundogan, +// Burak YiÄŸit Kaya: https://github.com/BYK + +(function (factory) { + factory(moment); +}(function (moment) { + + var suffixes = { + 1: "'inci", + 5: "'inci", + 8: "'inci", + 70: "'inci", + 80: "'inci", + + 2: "'nci", + 7: "'nci", + 20: "'nci", + 50: "'nci", + + 3: "'üncü", + 4: "'üncü", + 100: "'üncü", + + 6: "'ncı", + + 9: "'uncu", + 10: "'uncu", + 30: "'uncu", + + 60: "'ıncı", + 90: "'ıncı" + }; + + return moment.lang('tr', { + months : "Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"), + monthsShort : "Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"), + weekdays : "Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"), + weekdaysShort : "Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"), + weekdaysMin : "Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd, D MMMM YYYY LT" + }, + calendar : { + sameDay : '[bugün saat] LT', + nextDay : '[yarın saat] LT', + nextWeek : '[haftaya] dddd [saat] LT', + lastDay : '[dün] LT', + lastWeek : '[geçen hafta] dddd [saat] LT', + sameElse : 'L' + }, + relativeTime : { + future : "%s sonra", + past : "%s önce", + s : "birkaç saniye", + m : "bir dakika", + mm : "%d dakika", + h : "bir saat", + hh : "%d saat", + d : "bir gün", + dd : "%d gün", + M : "bir ay", + MM : "%d ay", + y : "bir yıl", + yy : "%d yıl" + }, + ordinal : function (number) { + if (number === 0) { // special case for zero + return number + "'ıncı"; + } + var a = number % 10, + b = number % 100 - a, + c = number >= 100 ? 100 : null; + + return number + (suffixes[a] || suffixes[b] || suffixes[c]); + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : Morocco Central Atlas TamaziÉ£t in Latin (tzm-la) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('tzm-la', { + months : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"), + monthsShort : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"), + weekdays : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"), + weekdaysShort : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"), + weekdaysMin : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[asdkh g] LT", + nextDay: '[aska g] LT', + nextWeek: 'dddd [g] LT', + lastDay: '[assant g] LT', + lastWeek: 'dddd [g] LT', + sameElse: 'L' + }, + relativeTime : { + future : "dadkh s yan %s", + past : "yan %s", + s : "imik", + m : "minuá¸", + mm : "%d minuá¸", + h : "saÉ›a", + hh : "%d tassaÉ›in", + d : "ass", + dd : "%d ossan", + M : "ayowr", + MM : "%d iyyirn", + y : "asgas", + yy : "%d isgasn" + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : Morocco Central Atlas TamaziÉ£t (tzm) +// author : Abdel Said : https://github.com/abdelsaid + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('tzm', { + months : "ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"), + monthsShort : "ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"), + weekdays : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"), + weekdaysShort : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"), + weekdaysMin : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "dddd D MMMM YYYY LT" + }, + calendar : { + sameDay: "[ⴰⵙⴷⵅ â´´] LT", + nextDay: '[ⴰⵙⴽⴰ â´´] LT', + nextWeek: 'dddd [â´´] LT', + lastDay: '[ⴰⵚⴰâµâµœ â´´] LT', + lastWeek: 'dddd [â´´] LT', + sameElse: 'L' + }, + relativeTime : { + future : "â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s", + past : "ⵢⴰⵠ%s", + s : "ⵉⵎⵉⴽ", + m : "ⵎⵉâµâµ“â´º", + mm : "%d ⵎⵉâµâµ“â´º", + h : "ⵙⴰⵄⴰ", + hh : "%d ⵜⴰⵙⵙⴰⵄⵉâµ", + d : "ⴰⵙⵙ", + dd : "%d oⵙⵙⴰâµ", + M : "â´°âµ¢oⵓⵔ", + MM : "%d ⵉⵢⵢⵉⵔâµ", + y : "ⴰⵙⴳⴰⵙ", + yy : "%d ⵉⵙⴳⴰⵙâµ" + }, + week : { + dow : 6, // Saturday is the first day of the week. + doy : 12 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : ukrainian (uk) +// author : zemlanin : https://github.com/zemlanin +// Author : Menelion Elensúle : https://github.com/Oire + +(function (factory) { + factory(moment); +}(function (moment) { + function plural(word, num) { + var forms = word.split('_'); + return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]); + } + + function relativeTimeWithPlural(number, withoutSuffix, key) { + var format = { + 'mm': 'хвилина_хвилини_хвилин', + 'hh': 'година_години_годин', + 'dd': 'день_дні_днів', + 'MM': 'міÑÑць_міÑÑці_міÑÑців', + 'yy': 'рік_роки_років' + }; + if (key === 'm') { + return withoutSuffix ? 'хвилина' : 'хвилину'; + } + else if (key === 'h') { + return withoutSuffix ? 'година' : 'годину'; + } + else { + return number + ' ' + plural(format[key], +number); + } + } + + function monthsCaseReplace(m, format) { + var months = { + 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'), + 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_') + }, + + nounCase = (/D[oD]? *MMMM?/).test(format) ? + 'accusative' : + 'nominative'; + + return months[nounCase][m.month()]; + } + + function weekdaysCaseReplace(m, format) { + var weekdays = { + 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'), + 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'), + 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_') + }, + + nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ? + 'accusative' : + ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ? + 'genitive' : + 'nominative'); + + return weekdays[nounCase][m.day()]; + } + + function processHoursFunction(str) { + return function () { + return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT'; + }; + } + + return moment.lang('uk', { + months : monthsCaseReplace, + monthsShort : "Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"), + weekdays : weekdaysCaseReplace, + weekdaysShort : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + weekdaysMin : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD.MM.YYYY", + LL : "D MMMM YYYY Ñ€.", + LLL : "D MMMM YYYY Ñ€., LT", + LLLL : "dddd, D MMMM YYYY Ñ€., LT" + }, + calendar : { + sameDay: processHoursFunction('[Сьогодні '), + nextDay: processHoursFunction('[Завтра '), + lastDay: processHoursFunction('[Вчора '), + nextWeek: processHoursFunction('[У] dddd ['), + lastWeek: function () { + switch (this.day()) { + case 0: + case 3: + case 5: + case 6: + return processHoursFunction('[Минулої] dddd [').call(this); + case 1: + case 2: + case 4: + return processHoursFunction('[Минулого] dddd [').call(this); + } + }, + sameElse: 'L' + }, + relativeTime : { + future : "за %s", + past : "%s тому", + s : "декілька Ñекунд", + m : relativeTimeWithPlural, + mm : relativeTimeWithPlural, + h : "годину", + hh : relativeTimeWithPlural, + d : "день", + dd : relativeTimeWithPlural, + M : "міÑÑць", + MM : relativeTimeWithPlural, + y : "рік", + yy : relativeTimeWithPlural + }, + + // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason + + meridiem : function (hour, minute, isLower) { + if (hour < 4) { + return "ночі"; + } else if (hour < 12) { + return "ранку"; + } else if (hour < 17) { + return "днÑ"; + } else { + return "вечора"; + } + }, + + ordinal: function (number, period) { + switch (period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return number + '-й'; + case 'D': + return number + '-го'; + default: + return number; + } + }, + + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 1st is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : uzbek +// author : Sardor Muminov : https://github.com/muminoff + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('uz', { + months : "Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"), + monthsShort : "Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"), + weekdays : "Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"), + weekdaysShort : "Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"), + weekdaysMin : "Як_Ду_Се_Чо_Па_Жу_Ша".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM YYYY", + LLL : "D MMMM YYYY LT", + LLLL : "D MMMM YYYY, dddd LT" + }, + calendar : { + sameDay : '[Бугун Ñоат] LT [да]', + nextDay : '[Эртага] LT [да]', + nextWeek : 'dddd [куни Ñоат] LT [да]', + lastDay : '[Кеча Ñоат] LT [да]', + lastWeek : '[Утган] dddd [куни Ñоат] LT [да]', + sameElse : 'L' + }, + relativeTime : { + future : "Якин %s ичида", + past : "Бир неча %s олдин", + s : "фурÑат", + m : "бир дакика", + mm : "%d дакика", + h : "бир Ñоат", + hh : "%d Ñоат", + d : "бир кун", + dd : "%d кун", + M : "бир ой", + MM : "%d ой", + y : "бир йил", + yy : "%d йил" + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 7 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : vietnamese (vn) +// author : Bang Nguyen : https://github.com/bangnk + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('vn', { + months : "tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"), + monthsShort : "Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"), + weekdays : "chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"), + weekdaysShort : "CN_T2_T3_T4_T5_T6_T7".split("_"), + weekdaysMin : "CN_T2_T3_T4_T5_T6_T7".split("_"), + longDateFormat : { + LT : "HH:mm", + L : "DD/MM/YYYY", + LL : "D MMMM [năm] YYYY", + LLL : "D MMMM [năm] YYYY LT", + LLLL : "dddd, D MMMM [năm] YYYY LT", + l : "DD/M/YYYY", + ll : "D MMM YYYY", + lll : "D MMM YYYY LT", + llll : "ddd, D MMM YYYY LT" + }, + calendar : { + sameDay: "[Hôm nay lúc] LT", + nextDay: '[Ngày mai lúc] LT', + nextWeek: 'dddd [tuần tá»›i lúc] LT', + lastDay: '[Hôm qua lúc] LT', + lastWeek: 'dddd [tuần rồi lúc] LT', + sameElse: 'L' + }, + relativeTime : { + future : "%s tá»›i", + past : "%s trÆ°á»›c", + s : "vài giây", + m : "má»™t phút", + mm : "%d phút", + h : "má»™t giá»", + hh : "%d giá»", + d : "má»™t ngày", + dd : "%d ngày", + M : "má»™t tháng", + MM : "%d tháng", + y : "má»™t năm", + yy : "%d năm" + }, + ordinal : function (number) { + return number; + }, + week : { + dow : 1, // Monday is the first day of the week. + doy : 4 // The week that contains Jan 4th is the first week of the year. + } + }); +})); +// moment.js language configuration +// language : chinese +// author : suupic : https://github.com/suupic + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('zh-cn', { + months : "一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"), + monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), + weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"), + weekdaysShort : "周日_周一_周二_周三_周四_周五_周六".split("_"), + weekdaysMin : "æ—¥_一_二_三_å››_五_å…­".split("_"), + longDateFormat : { + LT : "Ah点mm", + L : "YYYYå¹´MMMDæ—¥", + LL : "YYYYå¹´MMMDæ—¥", + LLL : "YYYYå¹´MMMDæ—¥LT", + LLLL : "YYYYå¹´MMMDæ—¥ddddLT", + l : "YYYYå¹´MMMDæ—¥", + ll : "YYYYå¹´MMMDæ—¥", + lll : "YYYYå¹´MMMDæ—¥LT", + llll : "YYYYå¹´MMMDæ—¥ddddLT" + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return "早上"; + } else if (hm < 1130) { + return "上åˆ"; + } else if (hm < 1230) { + return "中åˆ"; + } else if (hm < 1800) { + return "下åˆ"; + } else { + return "晚上"; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinal : function (number, period) { + switch (period) { + case "d" : + case "D" : + case "DDD" : + return number + "æ—¥"; + case "M" : + return number + "月"; + case "w" : + case "W" : + return number + "周"; + default : + return number; + } + }, + relativeTime : { + future : "%s内", + past : "%så‰", + s : "几秒", + m : "1分钟", + mm : "%d分钟", + h : "1å°æ—¶", + hh : "%då°æ—¶", + d : "1天", + dd : "%d天", + M : "1个月", + MM : "%d个月", + y : "1å¹´", + yy : "%då¹´" + } + }); +})); +// moment.js language configuration +// language : traditional chinese (zh-tw) +// author : Ben : https://github.com/ben-lin + +(function (factory) { + factory(moment); +}(function (moment) { + return moment.lang('zh-tw', { + months : "一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"), + monthsShort : "1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"), + weekdays : "星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"), + weekdaysShort : "週日_週一_週二_週三_週四_週五_週六".split("_"), + weekdaysMin : "æ—¥_一_二_三_å››_五_å…­".split("_"), + longDateFormat : { + LT : "Ah點mm", + L : "YYYYå¹´MMMDæ—¥", + LL : "YYYYå¹´MMMDæ—¥", + LLL : "YYYYå¹´MMMDæ—¥LT", + LLLL : "YYYYå¹´MMMDæ—¥ddddLT", + l : "YYYYå¹´MMMDæ—¥", + ll : "YYYYå¹´MMMDæ—¥", + lll : "YYYYå¹´MMMDæ—¥LT", + llll : "YYYYå¹´MMMDæ—¥ddddLT" + }, + meridiem : function (hour, minute, isLower) { + var hm = hour * 100 + minute; + if (hm < 900) { + return "早上"; + } else if (hm < 1130) { + return "上åˆ"; + } else if (hm < 1230) { + return "中åˆ"; + } else if (hm < 1800) { + return "下åˆ"; + } else { + return "晚上"; + } + }, + calendar : { + sameDay : '[今天]LT', + nextDay : '[明天]LT', + nextWeek : '[下]ddddLT', + lastDay : '[昨天]LT', + lastWeek : '[上]ddddLT', + sameElse : 'L' + }, + ordinal : function (number, period) { + switch (period) { + case "d" : + case "D" : + case "DDD" : + return number + "æ—¥"; + case "M" : + return number + "月"; + case "w" : + case "W" : + return number + "週"; + default : + return number; + } + }, + relativeTime : { + future : "%så…§", + past : "%så‰", + s : "幾秒", + m : "一分é˜", + mm : "%d分é˜", + h : "一å°æ™‚", + hh : "%då°æ™‚", + d : "一天", + dd : "%d天", + M : "一個月", + MM : "%d個月", + y : "一年", + yy : "%då¹´" + } + }); +})); + + moment.lang('en'); + + + /************************************ + Exposing Moment + ************************************/ + + function makeGlobal() { + /*global ender:false */ + if (typeof ender === 'undefined') { + // here, `this` means `window` in the browser, or `global` on the server + // add `moment` as a global object via a string identifier, + // for Closure Compiler "advanced" mode + this['moment'] = moment; + } + } + + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + makeGlobal(); + } else if (typeof define === "function" && define.amd) { + define("moment", function (require, exports, module) { + if (module.config().noGlobal !== true) { + makeGlobal(); + } + + return moment; + }); + } else { + makeGlobal(); + } +}).call(this); diff --git a/vendors/moment/min/moment-with-langs.min.js b/vendors/moment/min/moment-with-langs.min.js new file mode 100644 index 000000000..51438e722 --- /dev/null +++ b/vendors/moment/min/moment-with-langs.min.js @@ -0,0 +1,9 @@ +//! moment.js +//! version : 2.3.1 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +(function(a){function b(a,b){return function(c){return i(a.call(this,c),b)}}function c(a,b){return function(c){return this.lang().ordinal(a.call(this,c),b)}}function d(){}function e(a){u(a),g(this,a)}function f(a){var b=o(a),c=b.year||0,d=b.month||0,e=b.week||0,f=b.day||0,g=b.hour||0,h=b.minute||0,i=b.second||0,j=b.millisecond||0;this._input=a,this._milliseconds=+j+1e3*i+6e4*h+36e5*g,this._days=+f+7*e,this._months=+d+12*c,this._data={},this._bubble()}function g(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return b.hasOwnProperty("toString")&&(a.toString=b.toString),b.hasOwnProperty("valueOf")&&(a.valueOf=b.valueOf),a}function h(a){return 0>a?Math.ceil(a):Math.floor(a)}function i(a,b){for(var c=a+"";c.lengthd;d++)(c&&a[d]!==b[d]||!c&&q(a[d])!==q(b[d]))&&g++;return g+f}function n(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=Jb[a]||Kb[b]||b}return a}function o(a){var b,c,d={};for(c in a)a.hasOwnProperty(c)&&(b=n(c),b&&(d[b]=a[c]));return d}function p(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}bb[b]=function(e,f){var g,h,i=bb.fn._lang[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=bb().utc().set(d,a);return i.call(bb.fn._lang,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function q(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function r(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function s(a){return t(a)?366:365}function t(a){return 0===a%4&&0!==a%100||0===a%400}function u(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[gb]<0||a._a[gb]>11?gb:a._a[hb]<1||a._a[hb]>r(a._a[fb],a._a[gb])?hb:a._a[ib]<0||a._a[ib]>23?ib:a._a[jb]<0||a._a[jb]>59?jb:a._a[kb]<0||a._a[kb]>59?kb:a._a[lb]<0||a._a[lb]>999?lb:-1,a._pf._overflowDayOfYear&&(fb>b||b>hb)&&(b=hb),a._pf.overflow=b)}function v(a){a._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1}}function w(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length)),a._isValid}function x(a){return a?a.toLowerCase().replace("_","-"):a}function y(a,b){return b.abbr=a,mb[a]||(mb[a]=new d),mb[a].set(b),mb[a]}function z(a){delete mb[a]}function A(a){var b,c,d,e,f=0,g=function(a){if(!mb[a]&&nb)try{require("./lang/"+a)}catch(b){}return mb[a]};if(!a)return bb.fn._lang;if(!k(a)){if(c=g(a))return c;a=[a]}for(;f0;){if(c=g(e.slice(0,b).join("-")))return c;if(d&&d.length>=b&&m(e,d,!0)>=b-1)break;b--}f++}return bb.fn._lang}function B(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function C(a){var b,c,d=a.match(rb);for(b=0,c=d.length;c>b;b++)d[b]=Ob[d[b]]?Ob[d[b]]:B(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function D(a,b){return a.isValid()?(b=E(b,a.lang()),Lb[b]||(Lb[b]=C(b)),Lb[b](a)):a.lang().invalidDate()}function E(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(sb.lastIndex=0;d>=0&&sb.test(a);)a=a.replace(sb,c),sb.lastIndex=0,d-=1;return a}function F(a,b){var c;switch(a){case"DDDD":return vb;case"YYYY":case"GGGG":case"gggg":return wb;case"YYYYY":case"GGGGG":case"ggggg":return xb;case"S":case"SS":case"SSS":case"DDD":return ub;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return yb;case"a":case"A":return A(b._l)._meridiemParse;case"X":return Bb;case"Z":case"ZZ":return zb;case"T":return Ab;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"ww":case"W":case"WW":case"e":case"E":return tb;default:return c=new RegExp(N(M(a.replace("\\","")),"i"))}}function G(a){var b=(zb.exec(a)||[])[0],c=(b+"").match(Gb)||["-",0,0],d=+(60*c[1])+q(c[2]);return"+"===c[0]?-d:d}function H(a,b,c){var d,e=c._a;switch(a){case"M":case"MM":null!=b&&(e[gb]=q(b)-1);break;case"MMM":case"MMMM":d=A(c._l).monthsParse(b),null!=d?e[gb]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[hb]=q(b));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=q(b));break;case"YY":e[fb]=q(b)+(q(b)>68?1900:2e3);break;case"YYYY":case"YYYYY":e[fb]=q(b);break;case"a":case"A":c._isPm=A(c._l).isPM(b);break;case"H":case"HH":case"h":case"hh":e[ib]=q(b);break;case"m":case"mm":e[jb]=q(b);break;case"s":case"ss":e[kb]=q(b);break;case"S":case"SS":case"SSS":e[lb]=q(1e3*("0."+b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=G(b);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":a=a.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=b)}}function I(a){var b,c,d,e,f,g,h,i,j,k,l=[];if(!a._d){for(d=K(a),a._w&&null==a._a[hb]&&null==a._a[gb]&&(f=function(b){return b?b.length<3?parseInt(b,10)>68?"19"+b:"20"+b:b:null==a._a[fb]?bb().weekYear():a._a[fb]},g=a._w,null!=g.GG||null!=g.W||null!=g.E?h=X(f(g.GG),g.W||1,g.E,4,1):(i=A(a._l),j=null!=g.d?T(g.d,i):null!=g.e?parseInt(g.e,10)+i._week.dow:0,k=parseInt(g.w,10)||1,null!=g.d&&js(e)&&(a._pf._overflowDayOfYear=!0),c=S(e,0,a._dayOfYear),a._a[gb]=c.getUTCMonth(),a._a[hb]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=l[b]=d[b];for(;7>b;b++)a._a[b]=l[b]=null==a._a[b]?2===b?1:0:a._a[b];l[ib]+=q((a._tzm||0)/60),l[jb]+=q((a._tzm||0)%60),a._d=(a._useUTC?S:R).apply(null,l)}}function J(a){var b;a._d||(b=o(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],I(a))}function K(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function L(a){a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=A(a._l),h=""+a._i,i=h.length,j=0;for(d=E(a._f,g).match(rb)||[],b=0;b0&&a._pf.unusedInput.push(f),h=h.slice(h.indexOf(c)+c.length),j+=c.length),Ob[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),H(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=i-j,h.length>0&&a._pf.unusedInput.push(h),a._isPm&&a._a[ib]<12&&(a._a[ib]+=12),a._isPm===!1&&12===a._a[ib]&&(a._a[ib]=0),I(a),u(a)}function M(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function N(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function O(a){var b,c,d,e,f;if(0===a._f.length)return a._pf.invalidFormat=!0,a._d=new Date(0/0),void 0;for(e=0;ef)&&(d=f,c=b));g(a,c||b)}function P(a){var b,c=a._i,d=Cb.exec(c);if(d){for(b=4;b>0;b--)if(d[b]){a._f=Eb[b-1]+(d[6]||" ");break}for(b=0;4>b;b++)if(Fb[b][1].exec(c)){a._f+=Fb[b][0];break}zb.exec(c)&&(a._f+=" Z"),L(a)}else a._d=new Date(c)}function Q(b){var c=b._i,d=ob.exec(c);c===a?b._d=new Date:d?b._d=new Date(+d[1]):"string"==typeof c?P(b):k(c)?(b._a=c.slice(0),I(b)):l(c)?b._d=new Date(+c):"object"==typeof c?J(b):b._d=new Date(c)}function R(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function S(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function T(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function U(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function V(a,b,c){var d=eb(Math.abs(a)/1e3),e=eb(d/60),f=eb(e/60),g=eb(f/24),h=eb(g/365),i=45>d&&["s",d]||1===e&&["m"]||45>e&&["mm",e]||1===f&&["h"]||22>f&&["hh",f]||1===g&&["d"]||25>=g&&["dd",g]||45>=g&&["M"]||345>g&&["MM",eb(g/30)]||1===h&&["y"]||["yy",h];return i[2]=b,i[3]=a>0,i[4]=c,U.apply({},i)}function W(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=bb(a).add("d",f),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function X(a,b,c,d,e){var f,g,h=new Date(Date.UTC(a,0)).getUTCDay();return c=null!=c?c:e,f=e-h+(h>d?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:s(a-1)+g}}function Y(a){var b=a._i,c=a._f;return"undefined"==typeof a._pf&&v(a),null===b?bb.invalid({nullInput:!0}):("string"==typeof b&&(a._i=b=A().preparse(b)),bb.isMoment(b)?(a=g({},b),a._d=new Date(+b._d)):c?k(c)?O(a):L(a):Q(a),new e(a))}function Z(a,b){bb.fn[a]=bb.fn[a+"s"]=function(a){var c=this._isUTC?"UTC":"";return null!=a?(this._d["set"+c+b](a),bb.updateOffset(this),this):this._d["get"+c+b]()}}function $(a){bb.duration.fn[a]=function(){return this._data[a]}}function _(a,b){bb.duration.fn["as"+a]=function(){return+this/b}}function ab(){"undefined"==typeof ender&&(this.moment=bb)}for(var bb,cb,db="2.3.1",eb=Math.round,fb=0,gb=1,hb=2,ib=3,jb=4,kb=5,lb=6,mb={},nb="undefined"!=typeof module&&module.exports,ob=/^\/?Date\((\-?\d+)/i,pb=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,qb=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,rb=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|SS?S?|X|zz?|ZZ?|.)/g,sb=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,tb=/\d\d?/,ub=/\d{1,3}/,vb=/\d{3}/,wb=/\d{1,4}/,xb=/[+\-]?\d{1,6}/,yb=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,zb=/Z|[\+\-]\d\d:?\d\d/i,Ab=/T/i,Bb=/[\+\-]?\d+(\.\d{1,3})?/,Cb=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d\d?\d?)?)?)?)?([\+\-]\d\d:?\d\d)?)?$/,Db="YYYY-MM-DDTHH:mm:ssZ",Eb=["YYYY-MM-DD","GGGG-[W]WW","GGGG-[W]WW-E","YYYY-DDD"],Fb=[["HH:mm:ss.S",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Gb=/([\+\-]|\d\d)/gi,Hb="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),Ib={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},Jb={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},Kb={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},Lb={},Mb="DDD w W M D d".split(" "),Nb="M D H h m s w W".split(" "),Ob={M:function(){return this.month()+1},MMM:function(a){return this.lang().monthsShort(this,a)},MMMM:function(a){return this.lang().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.lang().weekdaysMin(this,a)},ddd:function(a){return this.lang().weekdaysShort(this,a)},dddd:function(a){return this.lang().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return i(this.year()%100,2)},YYYY:function(){return i(this.year(),4)},YYYYY:function(){return i(this.year(),5)},gg:function(){return i(this.weekYear()%100,2)},gggg:function(){return this.weekYear()},ggggg:function(){return i(this.weekYear(),5)},GG:function(){return i(this.isoWeekYear()%100,2)},GGGG:function(){return this.isoWeekYear()},GGGGG:function(){return i(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return q(this.milliseconds()/100)},SS:function(){return i(q(this.milliseconds()/10),2)},SSS:function(){return i(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+i(q(a/60),2)+":"+i(q(a)%60,2)},ZZ:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+i(q(10*a/6),4)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()}},Pb=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];Mb.length;)cb=Mb.pop(),Ob[cb+"o"]=c(Ob[cb],cb);for(;Nb.length;)cb=Nb.pop(),Ob[cb+cb]=b(Ob[cb],2);for(Ob.DDDD=b(Ob.DDD,3),g(d.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=bb.utc([2e3,b]),d="^"+this.months(c,"")+"|^"+this.monthsShort(c,""),this._monthsParse[b]=new RegExp(d.replace(".",""),"i")),this._monthsParse[b].test(a))return b},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=bb([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendar[a];return"function"==typeof c?c.apply(b):c},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return W(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),bb=function(b,c,d,e){return"boolean"==typeof d&&(e=d,d=a),Y({_i:b,_f:c,_l:d,_strict:e,_isUTC:!1})},bb.utc=function(b,c,d,e){var f;return"boolean"==typeof d&&(e=d,d=a),f=Y({_useUTC:!0,_isUTC:!0,_l:d,_i:b,_f:c,_strict:e}).utc()},bb.unix=function(a){return bb(1e3*a)},bb.duration=function(a,b){var c,d,e,g=bb.isDuration(a),h="number"==typeof a,i=g?a._input:h?{}:a,j=null;return h?b?i[b]=a:i.milliseconds=a:(j=pb.exec(a))?(c="-"===j[1]?-1:1,i={y:0,d:q(j[hb])*c,h:q(j[ib])*c,m:q(j[jb])*c,s:q(j[kb])*c,ms:q(j[lb])*c}):(j=qb.exec(a))&&(c="-"===j[1]?-1:1,e=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*c},i={y:e(j[2]),M:e(j[3]),d:e(j[4]),h:e(j[5]),m:e(j[6]),s:e(j[7]),w:e(j[8])}),d=new f(i),g&&a.hasOwnProperty("_lang")&&(d._lang=a._lang),d},bb.version=db,bb.defaultFormat=Db,bb.updateOffset=function(){},bb.lang=function(a,b){var c;return a?(b?y(x(a),b):null===b?(z(a),a="en"):mb[a]||A(a),c=bb.duration.fn._lang=bb.fn._lang=A(a),c._abbr):bb.fn._lang._abbr},bb.langData=function(a){return a&&a._lang&&a._lang._abbr&&(a=a._lang._abbr),A(a)},bb.isMoment=function(a){return a instanceof e},bb.isDuration=function(a){return a instanceof f},cb=Pb.length-1;cb>=0;--cb)p(Pb[cb]);for(bb.normalizeUnits=function(a){return n(a)},bb.invalid=function(a){var b=bb.utc(0/0);return null!=a?g(b._pf,a):b._pf.userInvalidated=!0,b},bb.parseZone=function(a){return bb(a).parseZone()},g(bb.fn=e.prototype,{clone:function(){return bb(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){return D(bb(this).utc(),"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},toArray:function(){var a=this;return[a.year(),a.month(),a.date(),a.hours(),a.minutes(),a.seconds(),a.milliseconds()]},isValid:function(){return w(this)},isDSTShifted:function(){return this._a?this.isValid()&&m(this._a,(this._isUTC?bb.utc(this._a):bb(this._a)).toArray())>0:!1},parsingFlags:function(){return g({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(a){var b=D(this,a||bb.defaultFormat);return this.lang().postformat(b)},add:function(a,b){var c;return c="string"==typeof a?bb.duration(+b,a):bb.duration(a,b),j(this,c,1),this},subtract:function(a,b){var c;return c="string"==typeof a?bb.duration(+b,a):bb.duration(a,b),j(this,c,-1),this},diff:function(a,b,c){var d,e,f=this._isUTC?bb(a).zone(this._offset||0):bb(a).local(),g=6e4*(this.zone()-f.zone());return b=n(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+f.daysInMonth()),e=12*(this.year()-f.year())+(this.month()-f.month()),e+=(this-bb(this).startOf("month")-(f-bb(f).startOf("month")))/d,e-=6e4*(this.zone()-bb(this).startOf("month").zone()-(f.zone()-bb(f).startOf("month").zone()))/d,"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:h(e)},from:function(a,b){return bb.duration(this.diff(a)).lang(this.lang()._abbr).humanize(!b)},fromNow:function(a){return this.from(bb(),a)},calendar:function(){var a=this.diff(bb().zone(this.zone()).startOf("day"),"days",!0),b=-6>a?"sameElse":-1>a?"lastWeek":0>a?"lastDay":1>a?"sameDay":2>a?"nextDay":7>a?"nextWeek":"sameElse";return this.format(this.lang().calendar(b,this))},isLeapYear:function(){return t(this.year())},isDST:function(){return this.zone()+bb(a).startOf(b)},isBefore:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)<+bb(a).startOf(b)},isSame:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)===+bb(a).startOf(b)},min:function(a){return a=bb.apply(null,arguments),this>a?this:a},max:function(a){return a=bb.apply(null,arguments),a>this?this:a},zone:function(a){var b=this._offset||0;return null==a?this._isUTC?b:this._d.getTimezoneOffset():("string"==typeof a&&(a=G(a)),Math.abs(a)<16&&(a=60*a),this._offset=a,this._isUTC=!0,b!==a&&j(this,bb.duration(b-a,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?bb(a).zone():0,0===(this.zone()-a)%60},daysInMonth:function(){return r(this.year(),this.month())},dayOfYear:function(a){var b=eb((bb(this).startOf("day")-bb(this).startOf("year"))/864e5)+1;return null==a?b:this.add("d",a-b)},weekYear:function(a){var b=W(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==a?b:this.add("y",a-b)},isoWeekYear:function(a){var b=W(this,1,4).year;return null==a?b:this.add("y",a-b)},week:function(a){var b=this.lang().week(this);return null==a?b:this.add("d",7*(a-b))},isoWeek:function(a){var b=W(this,1,4).week;return null==a?b:this.add("d",7*(a-b))},weekday:function(a){var b=(this.day()+7-this.lang()._week.dow)%7;return null==a?b:this.add("d",a-b)},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},get:function(a){return a=n(a),this[a]()},set:function(a,b){return a=n(a),"function"==typeof this[a]&&this[a](b),this},lang:function(b){return b===a?this._lang:(this._lang=A(b),this)}}),cb=0;cb10&&20>c?a+"-ти":1===b?a+"-ви":2===b?a+"-ри":7===b||8===b?a+"-ми":a+"-ти"},week:{dow:1,doy:7}})}),function(a){a(bb)}(function(b){function c(a,b,c){var d={mm:"munutenn",MM:"miz",dd:"devezh"};return a+" "+f(d[c],a)}function d(a){switch(e(a)){case 1:case 3:case 4:case 5:case 9:return a+" bloaz";default:return a+" vloaz"}}function e(a){return a>9?e(a%10):a}function f(a,b){return 2===b?g(a):a}function g(b){var c={m:"v",b:"v",d:"z"};return c[b.charAt(0)]===a?b:c[b.charAt(0)]+b.substring(1)}return b.lang("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),longDateFormat:{LT:"h[e]mm A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY LT",LLLL:"dddd, D [a viz] MMMM YYYY LT"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondennoù",m:"ur vunutenn",mm:c,h:"un eur",hh:"%d eur",d:"un devezh",dd:c,M:"ur miz",MM:c,y:"ur bloaz",yy:d},ordinal:function(a){var b=1===a?"añ":"vet";return a+b},week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.lang("bs",{months:"januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){return a.lang("ca",{months:"Gener_Febrer_Març_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre".split("_"),monthsShort:"Gen._Febr._Mar._Abr._Mai._Jun._Jul._Ag._Set._Oct._Nov._Des.".split("_"),weekdays:"Diumenge_Dilluns_Dimarts_Dimecres_Dijous_Divendres_Dissabte".split("_"),weekdaysShort:"Dg._Dl._Dt._Dc._Dj._Dv._Ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){function b(a){return a>1&&5>a&&1!==~~(a/10)}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár vteÅ™in":"pár vteÅ™inami";case"m":return c?"minuta":e?"minutu":"minutou";case"mm":return c||e?f+(b(a)?"minuty":"minut"):f+"minutami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodin"):f+"hodinami";break;case"d":return c||e?"den":"dnem";case"dd":return c||e?f+(b(a)?"dny":"dní"):f+"dny";break;case"M":return c||e?"mÄ›síc":"mÄ›sícem";case"MM":return c||e?f+(b(a)?"mÄ›síce":"mÄ›síců"):f+"mÄ›síci"; +break;case"y":return c||e?"rok":"rokem";case"yy":return c||e?f+(b(a)?"roky":"let"):f+"lety"}}var d="leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),e="led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_");return a.lang("cs",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_Ät_pá_so".split("_"),weekdaysMin:"ne_po_út_st_Ät_pá_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedÄ›li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve stÅ™edu v] LT";case 4:return"[ve Ätvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[vÄera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou nedÄ›li v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou stÅ™edu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pÅ™ed %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("cv",{months:"кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),monthsShort:"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),weekdays:"вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"),weekdaysShort:"выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"),weekdaysMin:"вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",LLL:"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",LLLL:"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"},calendar:{sameDay:"[ПаÑн] LT [Ñехетре]",nextDay:"[Ыран] LT [Ñехетре]",lastDay:"[Ĕнер] LT [Ñехетре]",nextWeek:"[ÇитеÑ] dddd LT [Ñехетре]",lastWeek:"[Иртнĕ] dddd LT [Ñехетре]",sameElse:"L"},relativeTime:{future:function(a){var b=/Ñехет$/i.exec(a)?"рен":/çул$/i.exec(a)?"тан":"ран";return a+b},past:"%s каÑлла",s:"пĕр-ик çеккунт",m:"пĕр минут",mm:"%d минут",h:"пĕр Ñехет",hh:"%d Ñехет",d:"пĕр кун",dd:"%d кун",M:"пĕр уйăх",MM:"%d уйăх",y:"пĕр çул",yy:"%d çул"},ordinal:"%d-мĕш",week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){return a.lang("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D. MMMM, YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I gÃ¥r kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"fÃ¥ sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"et Ã¥r",yy:"%d Ã¥r"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){function b(a,b,c){var d={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[a+" Tage",a+" Tagen"],M:["ein Monat","einem Monat"],MM:[a+" Monate",a+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[a+" Jahre",a+" Jahren"]};return b?d[c][0]:d[c][1]}return a.lang("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"H:mm [Uhr]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT",sameElse:"L",nextDay:"[Morgen um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gestern um] LT",lastWeek:"[letzten] dddd [um] LT"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:b,mm:"%d Minuten",h:b,hh:"%d Stunden",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("el",{monthsNominativeEl:"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),monthsGenitiveEl:"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf("MMMM")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),weekdays:"ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),weekdaysShort:"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(a,b,c){return a>11?c?"μμ":"ΜΜ":c?"πμ":"ΠΜ"},longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendarEl:{sameDay:"[ΣήμεÏα {}] LT",nextDay:"[ΑÏÏιο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:"[την Ï€ÏοηγοÏμενη] dddd [{}] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return c.replace("{}",1===d%12?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s Ï€Ïιν",s:"δευτεÏόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ÏŽÏα",hh:"%d ÏŽÏες",d:"μία μέÏα",dd:"%d μέÏες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χÏόνος",yy:"%d χÏόνια"},ordinal:function(a){return a+"η"},week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",L:"YYYY-MM-DD",LL:"D MMMM, YYYY",LLL:"D MMMM, YYYY LT",LLLL:"dddd, D MMMM, YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}})}),function(a){a(bb)}(function(a){return a.lang("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c},week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"),weekdays:"Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅ­do_Vendredo_Sabato".split("_"),weekdaysShort:"Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D[-an de] MMMM, YYYY",LLL:"D[-an de] MMMM, YYYY LT",LLLL:"dddd, [la] D[-an de] MMMM, YYYY LT"},meridiem:function(a,b,c){return a>11?c?"p.t.m.":"P.T.M.":c?"a.t.m.":"A.T.M."},calendar:{sameDay:"[HodiaÅ­ je] LT",nextDay:"[MorgaÅ­ je] LT",nextWeek:"dddd [je] LT",lastDay:"[HieraÅ­ je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"je %s",past:"antaÅ­ %s",s:"sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},ordinal:"%da",week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){return a.lang("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:"ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){function b(a,b,c,d){return d||b?"paari sekundi":"paar sekundit"}return a.lang("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:b,m:"minut",mm:"%d minutit",h:"tund",hh:"%d tundi",d:"päev",dd:"%d päeva",M:"kuu",MM:"%d kuud",y:"aasta",yy:"%d aastat"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] LT",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] LT",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] LT",llll:"ddd, YYYY[ko] MMM D[a] LT"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){var b={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},c={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"};return a.lang("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},meridiem:function(a){return 12>a?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]}).replace(/,/g,"ØŒ")},ordinal:"%dÙ…",week:{dow:6,doy:12}})}),function(a){a(bb)}(function(a){function b(a,b,d,e){var f="";switch(d){case"s":return e?"muutaman sekunnin":"muutama sekunti";case"m":return e?"minuutin":"minuutti";case"mm":f=e?"minuutin":"minuuttia";break;case"h":return e?"tunnin":"tunti";case"hh":f=e?"tunnin":"tuntia";break;case"d":return e?"päivän":"päivä";case"dd":f=e?"päivän":"päivää";break;case"M":return e?"kuukauden":"kuukausi";case"MM":f=e?"kuukauden":"kuukautta";break;case"y":return e?"vuoden":"vuosi";case"yy":f=e?"vuoden":"vuotta"}return f=c(a,e)+" "+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),e=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",d[7],d[8],d[9]];return a.lang("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(a){return a+(1===a?"er":"")}})}),function(a){a(bb)}(function(a){return a.lang("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinal:function(a){return a+(1===a?"er":"")},week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("gl",{months:"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro".split("_"),monthsShort:"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.".split("_"),weekdays:"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado".split("_"),weekdaysShort:"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mé_Xo_Ve_Sá".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(a){return"uns segundos"===a?"nuns segundos":"en "+a},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){return a.lang("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY LT",LLLL:"dddd, D [ב]MMMM YYYY LT",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(a){return 2===a?"שעתיי×":a+" שעות"},d:"יו×",dd:function(a){return 2===a?"יומיי×":a+" ימי×"},M:"חודש",MM:function(a){return 2===a?"חודשיי×":a+" חודשי×"},y:"שנה",yy:function(a){return 2===a?"שנתיי×":a+" שני×"}}})}),function(a){a(bb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.lang("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiem:function(a){return 4>a?"रात":10>a?"सà¥à¤¬à¤¹":17>a?"दोपहर":20>a?"शाम":"रात"},week:{dow:0,doy:6}})}),function(a){a(bb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"jedna minuta":"jedne minute";case"mm":return d+=1===a?"minuta":2===a||3===a||4===a?"minute":"minuta";case"h":return b?"jedan sat":"jednog sata";case"hh":return d+=1===a?"sat":2===a||3===a||4===a?"sata":"sati";case"dd":return d+=1===a?"dan":"dana";case"MM":return d+=1===a?"mjesec":2===a||3===a||4===a?"mjeseca":"mjeseci";case"yy":return d+=1===a?"godina":2===a||3===a||4===a?"godine":"godina"}}return a.lang("hr",{months:"sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),monthsShort:"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:b,mm:b,h:b,hh:b,d:"dan",dd:b,M:"mjesec",MM:b,y:"godinu",yy:b},ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){function b(a,b,c,d){var e=a;switch(c){case"s":return d||b?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(d||b?" perc":" perce");case"mm":return e+(d||b?" perc":" perce");case"h":return"egy"+(d||b?" óra":" órája");case"hh":return e+(d||b?" óra":" órája");case"d":return"egy"+(d||b?" nap":" napja");case"dd":return e+(d||b?" nap":" napja");case"M":return"egy"+(d||b?" hónap":" hónapja");case"MM":return e+(d||b?" hónap":" hónapja");case"y":return"egy"+(d||b?" év":" éve");case"yy":return e+(d||b?" év":" éve")}return""}function c(a){return(a?"":"[múlt] ")+"["+d[this.day()]+"] LT[-kor]"}var d="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" ");return a.lang("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return c.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return c.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){return a.lang("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(a){return 11>a?"pagi":15>a?"siang":19>a?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){function b(a){return 11===a%100?!0:1===a%10?!1:!0}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return c?"mínúta":"mínútu";case"mm":return b(a)?f+(c||e?"mínútur":"mínútum"):c?f+"mínúta":f+"mínútu";case"hh":return b(a)?f+(c||e?"klukkustundir":"klukkustundum"):f+"klukkustund";case"d":return c?"dagur":e?"dag":"degi";case"dd":return b(a)?c?f+"dagar":f+(e?"daga":"dögum"):c?f+"dagur":f+(e?"dag":"degi");case"M":return c?"mánuður":e?"mánuð":"mánuði";case"MM":return b(a)?c?f+"mánuðir":f+(e?"mánuði":"mánuðum"):c?f+"mánuður":f+(e?"mánuð":"mánuði");case"y":return c||e?"ár":"ári";case"yy":return b(a)?f+(c||e?"ár":"árum"):f+(c||e?"ár":"ári")}}return a.lang("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd, D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:c,m:c,mm:c,h:"klukkustund",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("it",{months:"Gennaio_Febbraio_Marzo_Aprile_Maggio_Giugno_Luglio_Agosto_Settembre_Ottobre_Novembre_Dicembre".split("_"),monthsShort:"Gen_Feb_Mar_Apr_Mag_Giu_Lug_Ago_Set_Ott_Nov_Dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:"[lo scorso] dddd [alle] LT",sameElse:"L"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?"tra":"in")+" "+a},past:"%s fa",s:"secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥LT",LLLL:"YYYYå¹´M月Dæ—¥LT dddd"},meridiem:function(a){return 12>a?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}})}),function(a){a(bb)}(function(a){function b(a,b){var c={nominative:"იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი".split("_"),accusative:"იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს".split("_")},d=/D[oD] *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function c(a,b){var c={nominative:"კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი".split("_"),accusative:"კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს".split("_")},d=/(წინáƒ|შემდეგ)/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.lang("ka",{months:b,monthsShort:"იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"),weekdays:c,weekdaysShort:"კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"),weekdaysMin:"კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"),longDateFormat:{LT:"h:mm A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვáƒáƒš] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინáƒ] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/.test(a)?a.replace(/ი$/,"ში"):a+"ში"},past:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,"ის წინ"):/წელი/.test(a)?a.replace(/წელი$/,"წლის წინ"):void 0},s:"რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜",m:"წუთი",mm:"%d წუთი",h:"სáƒáƒáƒ—ი",hh:"%d სáƒáƒáƒ—ი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},ordinal:function(a){return 0===a?a:1===a?a+"-ლი":20>a||100>=a&&0===a%20||0===a%100?"მე-"+a:a+"-ე"},week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){return a.lang("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ mm분",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ LT",LLLL:"YYYYë…„ MMMM Dì¼ dddd LT"},meridiem:function(a){return 12>a?"오전":"오후"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇초",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"한시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"한달",MM:"%d달",y:"ì¼ë…„",yy:"%dë…„"},ordinal:"%dì¼"})}),function(a){a(bb)}(function(a){function b(a,b,c,d){return b?"kelios sekundÄ—s":d?"kelių sekundžių":"kelias sekundes"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2]}function d(a){return 0===a%10||a>10&&20>a}function e(a){return h[a].split("_")}function f(a,b,f,g){var h=a+" ";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}function g(a,b){var c=-1===b.indexOf("dddd LT"),d=i[a.weekday()];return c?d:d.substring(0,d.length-2)+"į"}var h={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i="pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis_sekmadienis".split("_"); +return a.lang("lt",{months:"sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:g,weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], LT [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, LT [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], LT [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, LT [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:b,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinal:function(a){return a+"-oji"},week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){function b(a,b,c){var d=a.split("_");return c?1===b%10&&11!==b?d[2]:d[3]:1===b%10&&11!==b?d[0]:d[1]}function c(a,c,e){return a+" "+b(d[e],a,c)}var d={mm:"minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes",hh:"stundu_stundas_stunda_stundas",dd:"dienu_dienas_diena_dienas",MM:"mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i",yy:"gadu_gadus_gads_gadi"};return a.lang("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, LT",LLLL:"YYYY. [gada] D. MMMM, dddd, LT"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"%s vÄ“lÄk",past:"%s agrÄk",s:"dažas sekundes",m:"minÅ«ti",mm:c,h:"stundu",hh:c,d:"dienu",dd:c,M:"mÄ“nesi",MM:c,y:"gadu",yy:c},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("ml",{months:"ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ".split("_"),monthsShort:"ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.".split("_"),weekdays:"ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š".split("_"),weekdaysShort:"ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി".split("_"),weekdaysMin:"à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶".split("_"),longDateFormat:{LT:"A h:mm -à´¨àµ",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[ഇനàµà´¨àµ] LT",nextDay:"[നാളെ] LT",nextWeek:"dddd, LT",lastDay:"[ഇനàµà´¨à´²àµ†] LT",lastWeek:"[à´•à´´à´¿à´žàµà´ž] dddd, LT",sameElse:"L"},relativeTime:{future:"%s à´•à´´à´¿à´žàµà´žàµ",past:"%s à´®àµàµ»à´ªàµ",s:"അൽപ നിമിഷങàµà´™àµ¾",m:"ഒരൠമിനിറàµà´±àµ",mm:"%d മിനിറàµà´±àµ",h:"ഒരൠമണികàµà´•àµ‚ർ",hh:"%d മണികàµà´•àµ‚ർ",d:"ഒരൠദിവസം",dd:"%d ദിവസം",M:"ഒരൠമാസം",MM:"%d മാസം",y:"ഒരൠവർഷം",yy:"%d വർഷം"},meridiem:function(a){return 4>a?"രാതàµà´°à´¿":12>a?"രാവിലെ":17>a?"ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ":20>a?"വൈകàµà´¨àµà´¨àµ‡à´°à´‚":"രാതàµà´°à´¿"}})}),function(a){a(bb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.lang("mr",{months:"जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर".split("_"),monthsShort:"जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.".split("_"),weekdays:"रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm वाजता",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},calendar:{sameDay:"[आज] LT",nextDay:"[उदà¥à¤¯à¤¾] LT",nextWeek:"dddd, LT",lastDay:"[काल] LT",lastWeek:"[मागील] dddd, LT",sameElse:"L"},relativeTime:{future:"%s नंतर",past:"%s पूरà¥à¤µà¥€",s:"सेकंद",m:"à¤à¤• मिनिट",mm:"%d मिनिटे",h:"à¤à¤• तास",hh:"%d तास",d:"à¤à¤• दिवस",dd:"%d दिवस",M:"à¤à¤• महिना",MM:"%d महिने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·à¥‡"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiem:function(a){return 4>a?"रातà¥à¤°à¥€":10>a?"सकाळी":17>a?"दà¥à¤ªà¤¾à¤°à¥€":20>a?"सायंकाळी":"रातà¥à¤°à¥€"},week:{dow:0,doy:6}})}),function(a){a(bb)}(function(a){return a.lang("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] LT",LLLL:"dddd, D MMMM YYYY [pukul] LT"},meridiem:function(a){return 11>a?"pagi":15>a?"tengahari":19>a?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){return a.lang("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"H.mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] LT",LLLL:"dddd D. MMMM YYYY [kl.] LT"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){var b={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},c={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return a.lang("ne",{months:"जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.".split("_"),weekdays:"आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार".split("_"),weekdaysShort:"आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.".split("_"),weekdaysMin:"आइ._सो._मङà¥_बà¥._बि._शà¥._श.".split("_"),longDateFormat:{LT:"Aको h:mm बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, LT",LLLL:"dddd, D MMMM YYYY, LT"},preparse:function(a){return a.replace(/[१२३४५६७८९०]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\d/g,function(a){return b[a]})},meridiem:function(a){return 3>a?"राती":10>a?"बिहान":15>a?"दिउà¤à¤¸à¥‹":18>a?"बेलà¥à¤•à¤¾":20>a?"साà¤à¤":"राती"},calendar:{sameDay:"[आज] LT",nextDay:"[भोली] LT",nextWeek:"[आउà¤à¤¦à¥‹] dddd[,] LT",lastDay:"[हिजो] LT",lastWeek:"[गà¤à¤•à¥‹] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%sमा",past:"%s अगाडी",s:"केही समय",m:"à¤à¤• मिनेट",mm:"%d मिनेट",h:"à¤à¤• घणà¥à¤Ÿà¤¾",hh:"%d घणà¥à¤Ÿà¤¾",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महिना",MM:"%d महिना",y:"à¤à¤• बरà¥à¤·",yy:"%d बरà¥à¤·"},week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){var b="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),c="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");return a.lang("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinal:function(a){return a+(1===a||8===a||a>=20?"ste":"de")},week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ende] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"for %s siden",s:"noen sekund",m:"ett minutt",mm:"%d minutt",h:"en time",hh:"%d timar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){function b(a){return 5>a%10&&a%10>1&&1!==~~(a/10)}function c(a,c,d){var e=a+" ";switch(d){case"m":return c?"minuta":"minutÄ™";case"mm":return e+(b(a)?"minuty":"minut");case"h":return c?"godzina":"godzinÄ™";case"hh":return e+(b(a)?"godziny":"godzin");case"MM":return e+(b(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return e+(b(a)?"lata":"lat")}}var d="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),e="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_");return a.lang("pl",{months:function(a,b){return/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"nie_pon_wt_Å›r_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:c,mm:c,h:c,hh:c,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:c,y:"rok",yy:c},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº"})}),function(a){a(bb)}(function(a){return a.lang("pt",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinal:"%dº",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("ro",{months:"Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie".split("_"),monthsShort:"Ian_Feb_Mar_Apr_Mai_Iun_Iul_Aug_Sep_Oct_Noi_Dec".split("_"),weekdays:"Duminică_Luni_MarÅ£i_Miercuri_Joi_Vineri_Sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:"%d minute",h:"o oră",hh:"%d ore",d:"o zi",dd:"%d zile",M:"o lună",MM:"%d luni",y:"un an",yy:"%d ani"},week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){function b(a,b){var c=a.split("_");return 1===b%10&&11!==b%100?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:"минута_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===d?c?"минута":"минуту":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),accusative:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"Ñнв_фев_мар_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек".split("_"),accusative:"Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function f(a,b){var c={nominative:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),accusative:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_")},d=/\[ ?[Вв] ?(?:прошлую|Ñледующую)? ?\] ?dddd/.test(b)?"accusative":"nominative";return c[d][a.day()]}return a.lang("ru",{months:d,monthsShort:e,weekdays:f,weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|Ñ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT"},lastWeek:function(){switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:c,mm:c,h:"чаÑ",hh:c,d:"день",dd:c,M:"меÑÑц",MM:c,y:"год",yy:c},meridiem:function(a){return 4>a?"ночи":12>a?"утра":17>a?"днÑ":"вечера"},ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":return a+"-й";case"D":return a+"-го";case"w":case"W":return a+"-Ñ";default:return a}},week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){function b(a){return a>1&&5>a}function c(a,c,d,e){var f=a+" ";switch(d){case"s":return c||e?"pár sekúnd":"pár sekundami";case"m":return c?"minúta":e?"minútu":"minútou";case"mm":return c||e?f+(b(a)?"minúty":"minút"):f+"minútami";break;case"h":return c?"hodina":e?"hodinu":"hodinou";case"hh":return c||e?f+(b(a)?"hodiny":"hodín"):f+"hodinami";break;case"d":return c||e?"deň":"dňom";case"dd":return c||e?f+(b(a)?"dni":"dní"):f+"dňami";break;case"M":return c||e?"mesiac":"mesiacom";case"MM":return c||e?f+(b(a)?"mesiace":"mesiacov"):f+"mesiacmi";break;case"y":return c||e?"rok":"rokom";case"yy":return c||e?f+(b(a)?"roky":"rokov"):f+"rokmi"}}var d="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),e="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return a.lang("sk",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp("^"+a[c]+"$|^"+b[c]+"$","i");return d}(d,e),weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd D. MMMM YYYY LT"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){function b(a,b,c){var d=a+" ";switch(c){case"m":return b?"ena minuta":"eno minuto";case"mm":return d+=1===a?"minuta":2===a?"minuti":3===a||4===a?"minute":"minut";case"h":return b?"ena ura":"eno uro";case"hh":return d+=1===a?"ura":2===a?"uri":3===a||4===a?"ure":"ur";case"dd":return d+=1===a?"dan":"dni";case"MM":return d+=1===a?"mesec":2===a?"meseca":3===a||4===a?"mesece":"mesecev";case"yy":return d+=1===a?"leto":2===a?"leti":3===a||4===a?"leta":"let"}}return a.lang("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),longDateFormat:{LT:"H:mm",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[prejÅ¡nja] dddd [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"%s nazaj",s:"nekaj sekund",m:b,mm:b,h:b,hh:b,d:"en dan",dd:b,M:"en mesec",MM:b,y:"eno leto",yy:b},ordinal:"%d.",week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){return a.lang("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Marte_E Mërkure_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Neser në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s me parë",s:"disa seconda",m:"një minut",mm:"%d minutea",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},ordinal:"%d.",week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?"e":1===b?"a":2===b?"a":3===b?"e":"e";return a+c},week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิà¸à¸² m นาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiem:function(a){return 12>a?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})}),function(a){a(bb)}(function(a){var b={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return a.lang("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(a){if(0===a)return a+"'ıncı";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){return a.lang("tzm-la",{months:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",m:"minuá¸",mm:"%d minuá¸",h:"saÉ›a",hh:"%d tassaÉ›in",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}),function(a){a(bb)}(function(a){return a.lang("tzm",{months:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),monthsShort:"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),weekdays:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysShort:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),weekdaysMin:"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[ⴰⵙⴷⵅ â´´] LT",nextDay:"[ⴰⵙⴽⴰ â´´] LT",nextWeek:"dddd [â´´] LT",lastDay:"[ⴰⵚⴰâµâµœ â´´] LT",lastWeek:"dddd [â´´] LT",sameElse:"L"},relativeTime:{future:"â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s",past:"ⵢⴰⵠ%s",s:"ⵉⵎⵉⴽ",m:"ⵎⵉâµâµ“â´º",mm:"%d ⵎⵉâµâµ“â´º",h:"ⵙⴰⵄⴰ",hh:"%d ⵜⴰⵙⵙⴰⵄⵉâµ",d:"ⴰⵙⵙ",dd:"%d oⵙⵙⴰâµ",M:"â´°âµ¢oⵓⵔ",MM:"%d ⵉⵢⵢⵉⵔâµ",y:"ⴰⵙⴳⴰⵙ",yy:"%d ⵉⵙⴳⴰⵙâµ"},week:{dow:6,doy:12}})}),function(a){a(bb)}(function(a){function b(a,b){var c=a.split("_");return 1===b%10&&11!==b%100?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:"хвилина_хвилини_хвилин",hh:"година_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===d?c?"хвилина":"хвилину":"h"===d?c?"година":"годину":a+" "+b(e[d],+a)}function d(a,b){var c={nominative:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_"),accusative:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_")},d=/D[oD]? *MMMM?/.test(b)?"accusative":"nominative";return c[d][a.month()]}function e(a,b){var c={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},d=/(\[[ВвУу]\]) ?dddd/.test(b)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(b)?"genitive":"nominative";return c[d][a.day()]}function f(a){return function(){return a+"о"+(11===this.hours()?"б":"")+"] LT"}}return a.lang("uk",{months:d,monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:e,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., LT",LLLL:"dddd, D MMMM YYYY Ñ€., LT"},calendar:{sameDay:f("[Сьогодні "),nextDay:f("[Завтра "),lastDay:f("[Вчора "),nextWeek:f("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return f("[Минулої] dddd [").call(this);case 1:case 2:case 4:return f("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:c,mm:c,h:"годину",hh:c,d:"день",dd:c,M:"міÑÑць",MM:c,y:"рік",yy:c},meridiem:function(a){return 4>a?"ночі":12>a?"ранку":17>a?"днÑ":"вечора"},ordinal:function(a,b){switch(b){case"M":case"d":case"DDD":case"w":case"W":return a+"-й";case"D":return a+"-го";default:return a}},week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){return a.lang("uz",{months:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),monthsShort:"Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"),weekdays:"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),weekdaysShort:"Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),weekdaysMin:"Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"D MMMM YYYY, dddd LT"},calendar:{sameDay:"[Бугун Ñоат] LT [да]",nextDay:"[Эртага] LT [да]",nextWeek:"dddd [куни Ñоат] LT [да]",lastDay:"[Кеча Ñоат] LT [да]",lastWeek:"[Утган] dddd [куни Ñоат] LT [да]",sameElse:"L"},relativeTime:{future:"Якин %s ичида",past:"Бир неча %s олдин",s:"фурÑат",m:"бир дакика",mm:"%d дакика",h:"бир Ñоат",hh:"%d Ñоат",d:"бир кун",dd:"%d кун",M:"бир ой",MM:"%d ой",y:"бир йил",yy:"%d йил"},week:{dow:1,doy:7}})}),function(a){a(bb)}(function(a){return a.lang("vn",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY LT",LLLL:"dddd, D MMMM [năm] YYYY LT",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY LT",llll:"ddd, D MMM YYYY LT"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){a(bb)}(function(a){return a.lang("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm",L:"YYYYå¹´MMMDæ—¥",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥LT",LLLL:"YYYYå¹´MMMDæ—¥ddddLT",l:"YYYYå¹´MMMDæ—¥",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥LT",llll:"YYYYå¹´MMMDæ—¥ddddLT"},meridiem:function(a,b){var c=100*a+b;return 900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"æ—¥";case"M":return a+"月";case"w":case"W":return a+"周";default:return a}},relativeTime:{future:"%s内",past:"%så‰",s:"几秒",m:"1分钟",mm:"%d分钟",h:"1å°æ—¶",hh:"%då°æ—¶",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1å¹´",yy:"%då¹´"}})}),function(a){a(bb)}(function(a){return a.lang("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah點mm",L:"YYYYå¹´MMMDæ—¥",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥LT",LLLL:"YYYYå¹´MMMDæ—¥ddddLT",l:"YYYYå¹´MMMDæ—¥",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥LT",llll:"YYYYå¹´MMMDæ—¥ddddLT"},meridiem:function(a,b){var c=100*a+b;return 900>c?"早上":1130>c?"上åˆ":1230>c?"中åˆ":1800>c?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinal:function(a,b){switch(b){case"d":case"D":case"DDD":return a+"æ—¥";case"M":return a+"月";case"w":case"W":return a+"週";default:return a +}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"一分é˜",mm:"%d分é˜",h:"一å°æ™‚",hh:"%då°æ™‚",d:"一天",dd:"%d天",M:"一個月",MM:"%d個月",y:"一年",yy:"%då¹´"}})}),bb.lang("en"),nb?(module.exports=bb,ab()):"function"==typeof define&&define.amd?define("moment",function(a,b,c){return c.config().noGlobal!==!0&&ab(),bb}):ab()}).call(this); \ No newline at end of file diff --git a/vendors/moment/min/moment.min.js b/vendors/moment/min/moment.min.js new file mode 100644 index 000000000..8896ee750 --- /dev/null +++ b/vendors/moment/min/moment.min.js @@ -0,0 +1,6 @@ +//! moment.js +//! version : 2.3.1 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +(function(a){function b(a,b){return function(c){return i(a.call(this,c),b)}}function c(a,b){return function(c){return this.lang().ordinal(a.call(this,c),b)}}function d(){}function e(a){u(a),g(this,a)}function f(a){var b=o(a),c=b.year||0,d=b.month||0,e=b.week||0,f=b.day||0,g=b.hour||0,h=b.minute||0,i=b.second||0,j=b.millisecond||0;this._input=a,this._milliseconds=+j+1e3*i+6e4*h+36e5*g,this._days=+f+7*e,this._months=+d+12*c,this._data={},this._bubble()}function g(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return b.hasOwnProperty("toString")&&(a.toString=b.toString),b.hasOwnProperty("valueOf")&&(a.valueOf=b.valueOf),a}function h(a){return 0>a?Math.ceil(a):Math.floor(a)}function i(a,b){for(var c=a+"";c.lengthd;d++)(c&&a[d]!==b[d]||!c&&q(a[d])!==q(b[d]))&&g++;return g+f}function n(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=Jb[a]||Kb[b]||b}return a}function o(a){var b,c,d={};for(c in a)a.hasOwnProperty(c)&&(b=n(c),b&&(d[b]=a[c]));return d}function p(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}bb[b]=function(e,f){var g,h,i=bb.fn._lang[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=bb().utc().set(d,a);return i.call(bb.fn._lang,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function q(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function r(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function s(a){return t(a)?366:365}function t(a){return 0===a%4&&0!==a%100||0===a%400}function u(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[gb]<0||a._a[gb]>11?gb:a._a[hb]<1||a._a[hb]>r(a._a[fb],a._a[gb])?hb:a._a[ib]<0||a._a[ib]>23?ib:a._a[jb]<0||a._a[jb]>59?jb:a._a[kb]<0||a._a[kb]>59?kb:a._a[lb]<0||a._a[lb]>999?lb:-1,a._pf._overflowDayOfYear&&(fb>b||b>hb)&&(b=hb),a._pf.overflow=b)}function v(a){a._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1}}function w(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length)),a._isValid}function x(a){return a?a.toLowerCase().replace("_","-"):a}function y(a,b){return b.abbr=a,mb[a]||(mb[a]=new d),mb[a].set(b),mb[a]}function z(a){delete mb[a]}function A(a){var b,c,d,e,f=0,g=function(a){if(!mb[a]&&nb)try{require("./lang/"+a)}catch(b){}return mb[a]};if(!a)return bb.fn._lang;if(!k(a)){if(c=g(a))return c;a=[a]}for(;f0;){if(c=g(e.slice(0,b).join("-")))return c;if(d&&d.length>=b&&m(e,d,!0)>=b-1)break;b--}f++}return bb.fn._lang}function B(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function C(a){var b,c,d=a.match(rb);for(b=0,c=d.length;c>b;b++)d[b]=Ob[d[b]]?Ob[d[b]]:B(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function D(a,b){return a.isValid()?(b=E(b,a.lang()),Lb[b]||(Lb[b]=C(b)),Lb[b](a)):a.lang().invalidDate()}function E(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(sb.lastIndex=0;d>=0&&sb.test(a);)a=a.replace(sb,c),sb.lastIndex=0,d-=1;return a}function F(a,b){var c;switch(a){case"DDDD":return vb;case"YYYY":case"GGGG":case"gggg":return wb;case"YYYYY":case"GGGGG":case"ggggg":return xb;case"S":case"SS":case"SSS":case"DDD":return ub;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return yb;case"a":case"A":return A(b._l)._meridiemParse;case"X":return Bb;case"Z":case"ZZ":return zb;case"T":return Ab;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"ww":case"W":case"WW":case"e":case"E":return tb;default:return c=new RegExp(N(M(a.replace("\\","")),"i"))}}function G(a){var b=(zb.exec(a)||[])[0],c=(b+"").match(Gb)||["-",0,0],d=+(60*c[1])+q(c[2]);return"+"===c[0]?-d:d}function H(a,b,c){var d,e=c._a;switch(a){case"M":case"MM":null!=b&&(e[gb]=q(b)-1);break;case"MMM":case"MMMM":d=A(c._l).monthsParse(b),null!=d?e[gb]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[hb]=q(b));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=q(b));break;case"YY":e[fb]=q(b)+(q(b)>68?1900:2e3);break;case"YYYY":case"YYYYY":e[fb]=q(b);break;case"a":case"A":c._isPm=A(c._l).isPM(b);break;case"H":case"HH":case"h":case"hh":e[ib]=q(b);break;case"m":case"mm":e[jb]=q(b);break;case"s":case"ss":e[kb]=q(b);break;case"S":case"SS":case"SSS":e[lb]=q(1e3*("0."+b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=G(b);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":a=a.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=b)}}function I(a){var b,c,d,e,f,g,h,i,j,k,l=[];if(!a._d){for(d=K(a),a._w&&null==a._a[hb]&&null==a._a[gb]&&(f=function(b){return b?b.length<3?parseInt(b,10)>68?"19"+b:"20"+b:b:null==a._a[fb]?bb().weekYear():a._a[fb]},g=a._w,null!=g.GG||null!=g.W||null!=g.E?h=X(f(g.GG),g.W||1,g.E,4,1):(i=A(a._l),j=null!=g.d?T(g.d,i):null!=g.e?parseInt(g.e,10)+i._week.dow:0,k=parseInt(g.w,10)||1,null!=g.d&&js(e)&&(a._pf._overflowDayOfYear=!0),c=S(e,0,a._dayOfYear),a._a[gb]=c.getUTCMonth(),a._a[hb]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=l[b]=d[b];for(;7>b;b++)a._a[b]=l[b]=null==a._a[b]?2===b?1:0:a._a[b];l[ib]+=q((a._tzm||0)/60),l[jb]+=q((a._tzm||0)%60),a._d=(a._useUTC?S:R).apply(null,l)}}function J(a){var b;a._d||(b=o(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],I(a))}function K(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function L(a){a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=A(a._l),h=""+a._i,i=h.length,j=0;for(d=E(a._f,g).match(rb)||[],b=0;b0&&a._pf.unusedInput.push(f),h=h.slice(h.indexOf(c)+c.length),j+=c.length),Ob[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),H(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=i-j,h.length>0&&a._pf.unusedInput.push(h),a._isPm&&a._a[ib]<12&&(a._a[ib]+=12),a._isPm===!1&&12===a._a[ib]&&(a._a[ib]=0),I(a),u(a)}function M(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function N(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function O(a){var b,c,d,e,f;if(0===a._f.length)return a._pf.invalidFormat=!0,a._d=new Date(0/0),void 0;for(e=0;ef)&&(d=f,c=b));g(a,c||b)}function P(a){var b,c=a._i,d=Cb.exec(c);if(d){for(b=4;b>0;b--)if(d[b]){a._f=Eb[b-1]+(d[6]||" ");break}for(b=0;4>b;b++)if(Fb[b][1].exec(c)){a._f+=Fb[b][0];break}zb.exec(c)&&(a._f+=" Z"),L(a)}else a._d=new Date(c)}function Q(b){var c=b._i,d=ob.exec(c);c===a?b._d=new Date:d?b._d=new Date(+d[1]):"string"==typeof c?P(b):k(c)?(b._a=c.slice(0),I(b)):l(c)?b._d=new Date(+c):"object"==typeof c?J(b):b._d=new Date(c)}function R(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function S(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function T(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function U(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function V(a,b,c){var d=eb(Math.abs(a)/1e3),e=eb(d/60),f=eb(e/60),g=eb(f/24),h=eb(g/365),i=45>d&&["s",d]||1===e&&["m"]||45>e&&["mm",e]||1===f&&["h"]||22>f&&["hh",f]||1===g&&["d"]||25>=g&&["dd",g]||45>=g&&["M"]||345>g&&["MM",eb(g/30)]||1===h&&["y"]||["yy",h];return i[2]=b,i[3]=a>0,i[4]=c,U.apply({},i)}function W(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=bb(a).add("d",f),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function X(a,b,c,d,e){var f,g,h=new Date(Date.UTC(a,0)).getUTCDay();return c=null!=c?c:e,f=e-h+(h>d?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:s(a-1)+g}}function Y(a){var b=a._i,c=a._f;return"undefined"==typeof a._pf&&v(a),null===b?bb.invalid({nullInput:!0}):("string"==typeof b&&(a._i=b=A().preparse(b)),bb.isMoment(b)?(a=g({},b),a._d=new Date(+b._d)):c?k(c)?O(a):L(a):Q(a),new e(a))}function Z(a,b){bb.fn[a]=bb.fn[a+"s"]=function(a){var c=this._isUTC?"UTC":"";return null!=a?(this._d["set"+c+b](a),bb.updateOffset(this),this):this._d["get"+c+b]()}}function $(a){bb.duration.fn[a]=function(){return this._data[a]}}function _(a,b){bb.duration.fn["as"+a]=function(){return+this/b}}function ab(){"undefined"==typeof ender&&(this.moment=bb)}for(var bb,cb,db="2.3.1",eb=Math.round,fb=0,gb=1,hb=2,ib=3,jb=4,kb=5,lb=6,mb={},nb="undefined"!=typeof module&&module.exports,ob=/^\/?Date\((\-?\d+)/i,pb=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,qb=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,rb=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|SS?S?|X|zz?|ZZ?|.)/g,sb=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,tb=/\d\d?/,ub=/\d{1,3}/,vb=/\d{3}/,wb=/\d{1,4}/,xb=/[+\-]?\d{1,6}/,yb=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,zb=/Z|[\+\-]\d\d:?\d\d/i,Ab=/T/i,Bb=/[\+\-]?\d+(\.\d{1,3})?/,Cb=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d\d?\d?)?)?)?)?([\+\-]\d\d:?\d\d)?)?$/,Db="YYYY-MM-DDTHH:mm:ssZ",Eb=["YYYY-MM-DD","GGGG-[W]WW","GGGG-[W]WW-E","YYYY-DDD"],Fb=[["HH:mm:ss.S",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Gb=/([\+\-]|\d\d)/gi,Hb="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),Ib={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},Jb={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},Kb={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},Lb={},Mb="DDD w W M D d".split(" "),Nb="M D H h m s w W".split(" "),Ob={M:function(){return this.month()+1},MMM:function(a){return this.lang().monthsShort(this,a)},MMMM:function(a){return this.lang().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.lang().weekdaysMin(this,a)},ddd:function(a){return this.lang().weekdaysShort(this,a)},dddd:function(a){return this.lang().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return i(this.year()%100,2)},YYYY:function(){return i(this.year(),4)},YYYYY:function(){return i(this.year(),5)},gg:function(){return i(this.weekYear()%100,2)},gggg:function(){return this.weekYear()},ggggg:function(){return i(this.weekYear(),5)},GG:function(){return i(this.isoWeekYear()%100,2)},GGGG:function(){return this.isoWeekYear()},GGGGG:function(){return i(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return q(this.milliseconds()/100)},SS:function(){return i(q(this.milliseconds()/10),2)},SSS:function(){return i(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+i(q(a/60),2)+":"+i(q(a)%60,2)},ZZ:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+i(q(10*a/6),4)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()}},Pb=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];Mb.length;)cb=Mb.pop(),Ob[cb+"o"]=c(Ob[cb],cb);for(;Nb.length;)cb=Nb.pop(),Ob[cb+cb]=b(Ob[cb],2);for(Ob.DDDD=b(Ob.DDD,3),g(d.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=bb.utc([2e3,b]),d="^"+this.months(c,"")+"|^"+this.monthsShort(c,""),this._monthsParse[b]=new RegExp(d.replace(".",""),"i")),this._monthsParse[b].test(a))return b},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=bb([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendar[a];return"function"==typeof c?c.apply(b):c},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return W(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),bb=function(b,c,d,e){return"boolean"==typeof d&&(e=d,d=a),Y({_i:b,_f:c,_l:d,_strict:e,_isUTC:!1})},bb.utc=function(b,c,d,e){var f;return"boolean"==typeof d&&(e=d,d=a),f=Y({_useUTC:!0,_isUTC:!0,_l:d,_i:b,_f:c,_strict:e}).utc()},bb.unix=function(a){return bb(1e3*a)},bb.duration=function(a,b){var c,d,e,g=bb.isDuration(a),h="number"==typeof a,i=g?a._input:h?{}:a,j=null;return h?b?i[b]=a:i.milliseconds=a:(j=pb.exec(a))?(c="-"===j[1]?-1:1,i={y:0,d:q(j[hb])*c,h:q(j[ib])*c,m:q(j[jb])*c,s:q(j[kb])*c,ms:q(j[lb])*c}):(j=qb.exec(a))&&(c="-"===j[1]?-1:1,e=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*c},i={y:e(j[2]),M:e(j[3]),d:e(j[4]),h:e(j[5]),m:e(j[6]),s:e(j[7]),w:e(j[8])}),d=new f(i),g&&a.hasOwnProperty("_lang")&&(d._lang=a._lang),d},bb.version=db,bb.defaultFormat=Db,bb.updateOffset=function(){},bb.lang=function(a,b){var c;return a?(b?y(x(a),b):null===b?(z(a),a="en"):mb[a]||A(a),c=bb.duration.fn._lang=bb.fn._lang=A(a),c._abbr):bb.fn._lang._abbr},bb.langData=function(a){return a&&a._lang&&a._lang._abbr&&(a=a._lang._abbr),A(a)},bb.isMoment=function(a){return a instanceof e},bb.isDuration=function(a){return a instanceof f},cb=Pb.length-1;cb>=0;--cb)p(Pb[cb]);for(bb.normalizeUnits=function(a){return n(a)},bb.invalid=function(a){var b=bb.utc(0/0);return null!=a?g(b._pf,a):b._pf.userInvalidated=!0,b},bb.parseZone=function(a){return bb(a).parseZone()},g(bb.fn=e.prototype,{clone:function(){return bb(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){return D(bb(this).utc(),"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},toArray:function(){var a=this;return[a.year(),a.month(),a.date(),a.hours(),a.minutes(),a.seconds(),a.milliseconds()]},isValid:function(){return w(this)},isDSTShifted:function(){return this._a?this.isValid()&&m(this._a,(this._isUTC?bb.utc(this._a):bb(this._a)).toArray())>0:!1},parsingFlags:function(){return g({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(a){var b=D(this,a||bb.defaultFormat);return this.lang().postformat(b)},add:function(a,b){var c;return c="string"==typeof a?bb.duration(+b,a):bb.duration(a,b),j(this,c,1),this},subtract:function(a,b){var c;return c="string"==typeof a?bb.duration(+b,a):bb.duration(a,b),j(this,c,-1),this},diff:function(a,b,c){var d,e,f=this._isUTC?bb(a).zone(this._offset||0):bb(a).local(),g=6e4*(this.zone()-f.zone());return b=n(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+f.daysInMonth()),e=12*(this.year()-f.year())+(this.month()-f.month()),e+=(this-bb(this).startOf("month")-(f-bb(f).startOf("month")))/d,e-=6e4*(this.zone()-bb(this).startOf("month").zone()-(f.zone()-bb(f).startOf("month").zone()))/d,"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:h(e)},from:function(a,b){return bb.duration(this.diff(a)).lang(this.lang()._abbr).humanize(!b)},fromNow:function(a){return this.from(bb(),a)},calendar:function(){var a=this.diff(bb().zone(this.zone()).startOf("day"),"days",!0),b=-6>a?"sameElse":-1>a?"lastWeek":0>a?"lastDay":1>a?"sameDay":2>a?"nextDay":7>a?"nextWeek":"sameElse";return this.format(this.lang().calendar(b,this))},isLeapYear:function(){return t(this.year())},isDST:function(){return this.zone()+bb(a).startOf(b)},isBefore:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)<+bb(a).startOf(b)},isSame:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)===+bb(a).startOf(b)},min:function(a){return a=bb.apply(null,arguments),this>a?this:a},max:function(a){return a=bb.apply(null,arguments),a>this?this:a},zone:function(a){var b=this._offset||0;return null==a?this._isUTC?b:this._d.getTimezoneOffset():("string"==typeof a&&(a=G(a)),Math.abs(a)<16&&(a=60*a),this._offset=a,this._isUTC=!0,b!==a&&j(this,bb.duration(b-a,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?bb(a).zone():0,0===(this.zone()-a)%60},daysInMonth:function(){return r(this.year(),this.month())},dayOfYear:function(a){var b=eb((bb(this).startOf("day")-bb(this).startOf("year"))/864e5)+1;return null==a?b:this.add("d",a-b)},weekYear:function(a){var b=W(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==a?b:this.add("y",a-b)},isoWeekYear:function(a){var b=W(this,1,4).year;return null==a?b:this.add("y",a-b)},week:function(a){var b=this.lang().week(this);return null==a?b:this.add("d",7*(a-b))},isoWeek:function(a){var b=W(this,1,4).week;return null==a?b:this.add("d",7*(a-b))},weekday:function(a){var b=(this.day()+7-this.lang()._week.dow)%7;return null==a?b:this.add("d",a-b)},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},get:function(a){return a=n(a),this[a]()},set:function(a,b){return a=n(a),"function"==typeof this[a]&&this[a](b),this},lang:function(b){return b===a?this._lang:(this._lang=A(b),this)}}),cb=0;cb ["10", "00"] or "-1530" > ["-15", "30"] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, + + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, + + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, + + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, + + // format function strings + formatFunctions = {}, + + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), + + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.lang().monthsShort(this, format); + }, + MMMM : function (format) { + return this.lang().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.lang().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.lang().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.lang().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return this.weekYear(); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return this.isoWeekYear(); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.lang().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.lang().meridiem(this.hours(), this.minutes(), false); + }, + H : function () { + return this.hours(); + }, + h : function () { + return this.hours() % 12 || 12; + }, + m : function () { + return this.minutes(); + }, + s : function () { + return this.seconds(); + }, + S : function () { + return toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = -this.zone(), + b = "+"; + if (a < 0) { + a = -a; + b = "-"; + } + return b + leftZeroFill(toInt(a / 60), 2) + ":" + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = -this.zone(), + b = "+"; + if (a < 0) { + a = -a; + b = "-"; + } + return b + leftZeroFill(toInt(10 * a / 6), 4); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + X : function () { + return this.unix(); + } + }, + + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin']; + + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.lang().ordinal(func.call(this, a), period); + }; + } + + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + + + /************************************ + Constructors + ************************************/ + + function Language() { + + } + + // Moment prototype object + function Moment(config) { + checkOverflow(config); + extend(this, config); + } + + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // store reference to input for deterministic cloning + this._input = duration; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + years * 12; + + this._data = {}; + + this._bubble(); + } + + /************************************ + Helpers + ************************************/ + + + function extend(a, b) { + for (var i in b) { + if (b.hasOwnProperty(i)) { + a[i] = b[i]; + } + } + + if (b.hasOwnProperty("toString")) { + a.toString = b.toString; + } + + if (b.hasOwnProperty("valueOf")) { + a.valueOf = b.valueOf; + } + + return a; + } + + function absRound(number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength) { + var output = number + ''; + while (output.length < targetLength) { + output = '0' + output; + } + return output; + } + + // helper function for _.addTime and _.subtractTime + function addOrSubtractDurationFromMoment(mom, duration, isAdding, ignoreUpdateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months, + minutes, + hours; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + // store the minutes and hours so we can restore them + if (days || months) { + minutes = mom.minute(); + hours = mom.hour(); + } + if (days) { + mom.date(mom.date() + days * isAdding); + } + if (months) { + mom.month(mom.month() + months * isAdding); + } + if (milliseconds && !ignoreUpdateOffset) { + moment.updateOffset(mom); + } + // restore the minutes and hours after possibly changing dst + if (days || months) { + mom.minute(minutes); + mom.hour(hours); + } + } + + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } + + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]'; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; + } + return units; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop, + index; + + for (prop in inputObject) { + if (inputObject.hasOwnProperty(prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + function makeList(field) { + var count, setter; + + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } + + moment[field] = function (format, index) { + var i, getter, + method = moment.fn._lang[field], + results = []; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment.fn._lang, m, format || ''); + }; + + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } + + return value; + } + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + + m._pf.overflow = overflow; + } + } + + function initializeParsingFlags(config) { + config._pf = { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; + } + + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0; + } + } + return m._isValid; + } + + function normalizeLanguage(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + /************************************ + Languages + ************************************/ + + + extend(Language.prototype, { + + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + }, + + _months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + months : function (m) { + return this._months[m.month()]; + }, + + _monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, + + monthsParse : function (monthName) { + var i, mom, regex; + + if (!this._monthsParse) { + this._monthsParse = []; + } + + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + if (!this._monthsParse[i]) { + mom = moment.utc([2000, i]); + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._monthsParse[i].test(monthName)) { + return i; + } + } + }, + + _weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, + + _weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, + + _weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, + + weekdaysParse : function (weekdayName) { + var i, mom, regex; + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, + + _longDateFormat : { + LT : "h:mm A", + L : "MM/DD/YYYY", + LL : "MMMM D YYYY", + LLL : "MMMM D YYYY LT", + LLLL : "dddd, MMMM D YYYY LT" + }, + longDateFormat : function (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + }, + + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, + + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + }, + + _calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + calendar : function (key, mom) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom) : output; + }, + + _relativeTime : { + future : "in %s", + past : "%s ago", + s : "a few seconds", + m : "a minute", + mm : "%d minutes", + h : "an hour", + hh : "%d hours", + d : "a day", + dd : "%d days", + M : "a month", + MM : "%d months", + y : "a year", + yy : "%d years" + }, + relativeTime : function (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, + + ordinal : function (number) { + return this._ordinal.replace("%d", number); + }, + _ordinal : "%d", + + preparse : function (string) { + return string; + }, + + postformat : function (string) { + return string; + }, + + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, + + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, + + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; + } + }); + + // Loads a language definition into the `languages` cache. The function + // takes a key and optionally values. If not in the browser and no values + // are provided, it will load the language file module. As a convenience, + // this function also returns the language values. + function loadLang(key, values) { + values.abbr = key; + if (!languages[key]) { + languages[key] = new Language(); + } + languages[key].set(values); + return languages[key]; + } + + // Remove a language from the `languages` cache. Mostly useful in tests. + function unloadLang(key) { + delete languages[key]; + } + + // Determines which language definition to use and returns it. + // + // With no parameters, it will return the global language. If you + // pass in a language key, such as 'en', it will return the + // definition for 'en', so long as 'en' has already been loaded using + // moment.lang. + function getLangDefinition(key) { + var i = 0, j, lang, next, split, + get = function (k) { + if (!languages[k] && hasModule) { + try { + require('./lang/' + k); + } catch (e) { } + } + return languages[k]; + }; + + if (!key) { + return moment.fn._lang; + } + + if (!isArray(key)) { + //short-circuit everything else + lang = get(key); + if (lang) { + return lang; + } + key = [key]; + } + + //pick the language from the array + //try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + //substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + while (i < key.length) { + split = normalizeLanguage(key[i]).split('-'); + j = split.length; + next = normalizeLanguage(key[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + lang = get(split.slice(0, j).join('-')); + if (lang) { + return lang; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return moment.fn._lang; + } + + /************************************ + Formatting + ************************************/ + + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ""); + } + return input.replace(/\\/g, ""); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ""; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + + if (!m.isValid()) { + return m.lang().invalidDate(); + } + + format = expandFormat(format, m.lang()); + + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } + + return formatFunctions[format](m); + } + + function expandFormat(format, lang) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return lang.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + + /************************************ + Parsing + ************************************/ + + + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a; + switch (token) { + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return parseTokenFourDigits; + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return parseTokenSixDigits; + case 'S': + case 'SS': + case 'SSS': + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return getLangDefinition(config._l)._meridiemParse; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i")); + return a; + } + } + + function timezoneMinutesFromString(string) { + var tzchunk = (parseTokenTimezone.exec(string) || [])[0], + parts = (tzchunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? -minutes : minutes; + } + + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; + + switch (token) { + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; + } + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = getLangDefinition(config._l).monthsParse(input); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; + } + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); + } + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); + } + + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + break; + case 'YYYY' : + case 'YYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._isPm = getLangDefinition(config._l).isPM(input); + break; + // 24 HOUR + case 'H' : // fall through to hh + case 'HH' : // fall through to hh + case 'h' : // fall through to hh + case 'hh' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = timezoneMinutesFromString(input); + break; + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'dd': + case 'ddd': + case 'dddd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gg': + case 'gggg': + case 'GG': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = input; + } + break; + } + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, + yearToUse, fixYear, w, temp, lang, weekday, week; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + fixYear = function (val) { + return val ? + (val.length < 3 ? (parseInt(val, 10) > 68 ? '19' + val : '20' + val) : val) : + (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]); + }; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + temp = dayOfYearFromWeeks(fixYear(w.GG), w.W || 1, w.E, 4, 1); + } + else { + lang = getLangDefinition(config._l); + weekday = w.d != null ? parseWeekday(w.d, lang) : + (w.e != null ? parseInt(w.e, 10) + lang._week.dow : 0); + + week = parseInt(w.w, 10) || 1; + + //if we're parsing 'd', then the low day numbers may be next week + if (w.d != null && weekday < lang._week.dow) { + week++; + } + + temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow); + } + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = config._a[YEAR] == null ? currentDate[YEAR] : config._a[YEAR]; + + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } + + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // add the offsets to the time to be parsed so that we can have a clean array for checking isValid + input[HOUR] += toInt((config._tzm || 0) / 60); + input[MINUTE] += toInt((config._tzm || 0) % 60); + + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + } + + function dateFromObject(config) { + var normalizedInput; + + if (config._d) { + return; + } + + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; + + dateFromConfig(config); + } + + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } + + // date from string and format string + function makeDateFromStringAndFormat(config) { + + config._a = []; + config._pf.empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var lang = getLangDefinition(config._l), + string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, lang).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (getParseRegexForToken(token, config).exec(string) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } + + // handle am pm + if (config._isPm && config._a[HOUR] < 12) { + config._a[HOUR] += 12; + } + // if is 12 am, change hours to 0 + if (config._isPm === false && config._a[HOUR] === 12) { + config._a[HOUR] = 0; + } + + dateFromConfig(config); + checkOverflow(config); + } + + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = extend({}, config); + initializeParsingFlags(tempConfig); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; + + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; + + tempConfig._pf.score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + // date from iso format + function makeDateFromString(config) { + var i, + string = config._i, + match = isoRegex.exec(string); + + if (match) { + config._pf.iso = true; + for (i = 4; i > 0; i--) { + if (match[i]) { + // match[5] should be "T" or undefined + config._f = isoDates[i - 1] + (match[6] || " "); + break; + } + } + for (i = 0; i < 4; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (parseTokenTimezone.exec(string)) { + config._f += "Z"; + } + makeDateFromStringAndFormat(config); + } + else { + config._d = new Date(string); + } + } + + function makeDateFromInput(config) { + var input = config._i, + matched = aspNetJsonRegex.exec(input); + + if (input === undefined) { + config._d = new Date(); + } else if (matched) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = input.slice(0); + dateFromConfig(config); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else { + config._d = new Date(input); + } + } + + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } + + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } + + function parseWeekday(input, language) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = language.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } + + /************************************ + Relative Time + ************************************/ + + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) { + return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime(milliseconds, withoutSuffix, lang) { + var seconds = round(Math.abs(milliseconds) / 1000), + minutes = round(seconds / 60), + hours = round(minutes / 60), + days = round(hours / 24), + years = round(days / 365), + args = seconds < 45 && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < 45 && ['mm', minutes] || + hours === 1 && ['h'] || + hours < 22 && ['hh', hours] || + days === 1 && ['d'] || + days <= 25 && ['dd', days] || + days <= 45 && ['M'] || + days < 345 && ['MM', round(days / 30)] || + years === 1 && ['y'] || ['yy', years]; + args[2] = withoutSuffix; + args[3] = milliseconds > 0; + args[4] = lang; + return substituteTimeAgo.apply({}, args); + } + + + /************************************ + Week of Year + ************************************/ + + + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; + + + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } + + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } + + adjustedMoment = moment(mom).add('d', daysToDayOfWeek); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = new Date(Date.UTC(year, 0)).getUTCDay(), + daysToAdd, dayOfYear; + + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } + + /************************************ + Top Level Functions + ************************************/ + + function makeMoment(config) { + var input = config._i, + format = config._f; + + if (typeof config._pf === 'undefined') { + initializeParsingFlags(config); + } + + if (input === null) { + return moment.invalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = getLangDefinition().preparse(input); + } + + if (moment.isMoment(input)) { + config = extend({}, input); + + config._d = new Date(+input._d); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } + + return new Moment(config); + } + + moment = function (input, format, lang, strict) { + if (typeof(lang) === "boolean") { + strict = lang; + lang = undefined; + } + return makeMoment({ + _i : input, + _f : format, + _l : lang, + _strict : strict, + _isUTC : false + }); + }; + + // creating with utc + moment.utc = function (input, format, lang, strict) { + var m; + + if (typeof(lang) === "boolean") { + strict = lang; + lang = undefined; + } + m = makeMoment({ + _useUTC : true, + _isUTC : true, + _l : lang, + _i : input, + _f : format, + _strict : strict + }).utc(); + + return m; + }; + + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; + + // duration + moment.duration = function (input, key) { + var isDuration = moment.isDuration(input), + isNumber = (typeof input === 'number'), + duration = (isDuration ? input._input : (isNumber ? {} : input)), + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso, + timeEmpty, + dateTimeEmpty; + + if (isNumber) { + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === "-") ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === "-") ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } + + ret = new Duration(duration); + + if (isDuration && input.hasOwnProperty('_lang')) { + ret._lang = input._lang; + } + + return ret; + }; + + // version number + moment.version = VERSION; + + // default format + moment.defaultFormat = isoFormat; + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; + + // This function will load languages and then set the global language. If + // no arguments are passed in, it will simply return the current global + // language key. + moment.lang = function (key, values) { + var r; + if (!key) { + return moment.fn._lang._abbr; + } + if (values) { + loadLang(normalizeLanguage(key), values); + } else if (values === null) { + unloadLang(key); + key = 'en'; + } else if (!languages[key]) { + getLangDefinition(key); + } + r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key); + return r._abbr; + }; + + // returns language data + moment.langData = function (key) { + if (key && key._lang && key._lang._abbr) { + key = key._lang._abbr; + } + return getLangDefinition(key); + }; + + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment; + }; + + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; + + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } + + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; + + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; + } + + return m; + }; + + moment.parseZone = function (input) { + return moment(input).parseZone(); + }; + + /************************************ + Moment Prototype + ************************************/ + + + extend(moment.fn = Moment.prototype, { + + clone : function () { + return moment(this); + }, + + valueOf : function () { + return +this._d + ((this._offset || 0) * 60000); + }, + + unix : function () { + return Math.floor(+this / 1000); + }, + + toString : function () { + return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ"); + }, + + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, + + toISOString : function () { + return formatMoment(moment(this).utc(), 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + }, + + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, + + isValid : function () { + return isValid(this); + }, + + isDSTShifted : function () { + + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } + + return false; + }, + + parsingFlags : function () { + return extend({}, this._pf); + }, + + invalidAt: function () { + return this._pf.overflow; + }, + + utc : function () { + return this.zone(0); + }, + + local : function () { + this.zone(0); + this._isUTC = false; + return this; + }, + + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.lang().postformat(output); + }, + + add : function (input, val) { + var dur; + // switch args to support add('s', 1) and add(1, 's') + if (typeof input === 'string') { + dur = moment.duration(+val, input); + } else { + dur = moment.duration(input, val); + } + addOrSubtractDurationFromMoment(this, dur, 1); + return this; + }, + + subtract : function (input, val) { + var dur; + // switch args to support subtract('s', 1) and subtract(1, 's') + if (typeof input === 'string') { + dur = moment.duration(+val, input); + } else { + dur = moment.duration(input, val); + } + addOrSubtractDurationFromMoment(this, dur, -1); + return this; + }, + + diff : function (input, units, asFloat) { + var that = this._isUTC ? moment(input).zone(this._offset || 0) : moment(input).local(), + zoneDiff = (this.zone() - that.zone()) * 6e4, + diff, output; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month') { + // average number of days in the months in the given dates + diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2 + // difference in months + output = ((this.year() - that.year()) * 12) + (this.month() - that.month()); + // adjust by taking difference in days, average number of days + // and dst in the given months. + output += ((this - moment(this).startOf('month')) - + (that - moment(that).startOf('month'))) / diff; + // same as above but with zones, to negate all dst + output -= ((this.zone() - moment(this).startOf('month').zone()) - + (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff; + if (units === 'year') { + output = output / 12; + } + } else { + diff = (this - that); + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, + + from : function (time, withoutSuffix) { + return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix); + }, + + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, + + calendar : function () { + var diff = this.diff(moment().zone(this.zone()).startOf('day'), 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.lang().calendar(format, this)); + }, + + isLeapYear : function () { + return isLeapYear(this.year()); + }, + + isDST : function () { + return (this.zone() < this.clone().month(0).zone() || + this.zone() < this.clone().month(5).zone()); + }, + + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.lang()); + return this.add({ d : input - day }); + } else { + return day; + } + }, + + month : function (input) { + var utc = this._isUTC ? 'UTC' : '', + dayOfMonth; + + if (input != null) { + if (typeof input === 'string') { + input = this.lang().monthsParse(input); + if (typeof input !== 'number') { + return this; + } + } + + dayOfMonth = this.date(); + this.date(1); + this._d['set' + utc + 'Month'](input); + this.date(Math.min(dayOfMonth, this.daysInMonth())); + + moment.updateOffset(this); + return this; + } else { + return this._d['get' + utc + 'Month'](); + } + }, + + startOf: function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } + + return this; + }, + + endOf: function (units) { + units = normalizeUnits(units); + return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1); + }, + + isAfter: function (input, units) { + units = typeof units !== 'undefined' ? units : 'millisecond'; + return +this.clone().startOf(units) > +moment(input).startOf(units); + }, + + isBefore: function (input, units) { + units = typeof units !== 'undefined' ? units : 'millisecond'; + return +this.clone().startOf(units) < +moment(input).startOf(units); + }, + + isSame: function (input, units) { + units = typeof units !== 'undefined' ? units : 'millisecond'; + return +this.clone().startOf(units) === +moment(input).startOf(units); + }, + + min: function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + }, + + max: function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + }, + + zone : function (input) { + var offset = this._offset || 0; + if (input != null) { + if (typeof input === "string") { + input = timezoneMinutesFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + this._offset = input; + this._isUTC = true; + if (offset !== input) { + addOrSubtractDurationFromMoment(this, moment.duration(offset - input, 'm'), 1, true); + } + } else { + return this._isUTC ? offset : this._d.getTimezoneOffset(); + } + return this; + }, + + zoneAbbr : function () { + return this._isUTC ? "UTC" : ""; + }, + + zoneName : function () { + return this._isUTC ? "Coordinated Universal Time" : ""; + }, + + parseZone : function () { + if (typeof this._i === 'string') { + this.zone(this._i); + } + return this; + }, + + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).zone(); + } + + return (this.zone() - input) % 60 === 0; + }, + + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, + + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add("d", (input - dayOfYear)); + }, + + weekYear : function (input) { + var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year; + return input == null ? year : this.add("y", (input - year)); + }, + + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add("y", (input - year)); + }, + + week : function (input) { + var week = this.lang().week(this); + return input == null ? week : this.add("d", (input - week) * 7); + }, + + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add("d", (input - week) * 7); + }, + + weekday : function (input) { + var weekday = (this.day() + 7 - this.lang()._week.dow) % 7; + return input == null ? weekday : this.add("d", input - weekday); + }, + + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, + + set : function (units, value) { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + return this; + }, + + // If passed a language key, it will set the language for this + // instance. Otherwise, it will return the language configuration + // variables for this instance. + lang : function (key) { + if (key === undefined) { + return this._lang; + } else { + this._lang = getLangDefinition(key); + return this; + } + } + }); + + // helper for adding shortcuts + function makeGetterAndSetter(name, key) { + moment.fn[name] = moment.fn[name + 's'] = function (input) { + var utc = this._isUTC ? 'UTC' : ''; + if (input != null) { + this._d['set' + utc + key](input); + moment.updateOffset(this); + return this; + } else { + return this._d['get' + utc + key](); + } + }; + } + + // loop through and add shortcuts (Month, Date, Hours, Minutes, Seconds, Milliseconds) + for (i = 0; i < proxyGettersAndSetters.length; i ++) { + makeGetterAndSetter(proxyGettersAndSetters[i].toLowerCase().replace(/s$/, ''), proxyGettersAndSetters[i]); + } + + // add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear') + makeGetterAndSetter('year', 'FullYear'); + + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; + + /************************************ + Duration Prototype + ************************************/ + + + extend(moment.duration.fn = Duration.prototype, { + + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years; + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; + + hours = absRound(minutes / 60); + data.hours = hours % 24; + + days += absRound(hours / 24); + data.days = days % 30; + + months += absRound(days / 30); + data.months = months % 12; + + years = absRound(months / 12); + data.years = years; + }, + + weeks : function () { + return absRound(this.days() / 7); + }, + + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, + + humanize : function (withSuffix) { + var difference = +this, + output = relativeTime(difference, !withSuffix, this.lang()); + + if (withSuffix) { + output = this.lang().pastFuture(difference, output); + } + + return this.lang().postformat(output); + }, + + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); + + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; + + this._bubble(); + + return this; + }, + + subtract : function (input, val) { + var dur = moment.duration(input, val); + + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; + + this._bubble(); + + return this; + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, + + as : function (units) { + units = normalizeUnits(units); + return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's'](); + }, + + lang : moment.fn.lang, + + toIsoString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + } + }); + + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } + + function makeDurationAsGetter(name, factor) { + moment.duration.fn['as' + name] = function () { + return +this / factor; + }; + } + + for (i in unitMillisecondFactors) { + if (unitMillisecondFactors.hasOwnProperty(i)) { + makeDurationAsGetter(i, unitMillisecondFactors[i]); + makeDurationGetter(i.toLowerCase()); + } + } + + makeDurationAsGetter('Weeks', 6048e5); + moment.duration.fn.asMonths = function () { + return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12; + }; + + + /************************************ + Default Lang + ************************************/ + + + // Set default language, other languages will inherit from English. + moment.lang('en', { + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + /* EMBED_LANGUAGES */ + + /************************************ + Exposing Moment + ************************************/ + + function makeGlobal() { + /*global ender:false */ + if (typeof ender === 'undefined') { + // here, `this` means `window` in the browser, or `global` on the server + // add `moment` as a global object via a string identifier, + // for Closure Compiler "advanced" mode + this['moment'] = moment; + } + } + + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + makeGlobal(); + } else if (typeof define === "function" && define.amd) { + define("moment", function (require, exports, module) { + if (module.config().noGlobal !== true) { + makeGlobal(); + } + + return moment; + }); + } else { + makeGlobal(); + } +}).call(this); diff --git a/vendors/moment/package.js b/vendors/moment/package.js new file mode 100644 index 000000000..aba8d502e --- /dev/null +++ b/vendors/moment/package.js @@ -0,0 +1,11 @@ +var profile = { + resourceTags: { + ignore: function(filename, mid){ + // only include moment/moment + return mid != "moment/moment"; + }, + amd: function(filename, mid){ + return /\.js$/.test(filename); + } + } +}; diff --git a/vendors/moment/package.json b/vendors/moment/package.json new file mode 100644 index 000000000..46ec5cf3c --- /dev/null +++ b/vendors/moment/package.json @@ -0,0 +1,56 @@ +{ + "name": "moment", + "version": "2.3.1", + "description": "Parse, manipulate, and display dates.", + "homepage": "http://momentjs.com", + "author": "Iskren Ivov Chernev (https://github.com/ichernev)", + "contributors": [ + "Tim Wood (http://timwoodcreates.com/)", + "Rocky Meza (http://rockymeza.com)", + "Matt Johnson (http://codeofmatt.com)", + "Isaac Cambron (http://drunkencoder.net/)" + ], + "keywords": [ + "moment", + "date", + "time", + "parse", + "format", + "validate", + "i18n", + "l10n", + "ender" + ], + "main": "./moment.js", + "engines": { + "node": "*" + }, + "repository": { + "type": "git", + "url": "https://github.com/moment/moment.git" + }, + "bugs": { + "url": "https://github.com/moment/moment/issues" + }, + "licenses" : [ + { + "type" : "MIT" + } + ], + "devDependencies" : { + "uglify-js" : "latest", + "grunt" : "latest", + "nodeunit" : "latest", + "grunt-contrib-jshint" : "latest", + "grunt-contrib-nodeunit" : "latest", + "grunt-contrib-concat" : "latest", + "grunt-contrib-uglify" : "latest", + "grunt-contrib-watch" : "latest", + "grunt-lib-legacyhelpers" : "latest" + }, + "scripts": { + "test": "grunt" + }, + "ender": "./ender.js", + "dojoBuild": "package.js" +} diff --git a/vendors/moment/readme.md b/vendors/moment/readme.md new file mode 100644 index 000000000..afd38007d --- /dev/null +++ b/vendors/moment/readme.md @@ -0,0 +1,283 @@ +A lightweight javascript date library for parsing, validating, manipulating, and formatting dates. + +# [Documentation](http://momentjs.com/docs/) + +Upgrading to 2.0.0 +================== + +There are a number of small backwards incompatible changes with version 2.0.0. + +[See them and their descriptions here](https://gist.github.com/timrwood/e72f2eef320ed9e37c51#backwards-incompatible-changes) + +Changed language ordinal method to return the number + ordinal instead of just the ordinal. + +Changed two digit year parsing cutoff to match strptime. + +Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`. + +Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`. + +Removed the lang data objects from the top level namespace. + +Duplicate `Date` passed to `moment()` instead of referencing it. + +Travis Build Status +=================== + +Develop [![Build Status](https://travis-ci.org/moment/moment.png?branch=develop)](https://travis-ci.org/moment/moment) + +Master [![Build Status](https://travis-ci.org/moment/moment.png?branch=master)](https://travis-ci.org/moment/moment) + +Changelog +========= + +### 2.3.1 + +Removed a trailing comma [1169] and fixed a bug with `months`, `weekdays` getters [1171]. + +### 2.3.0 [See changelog](https://gist.github.com/ichernev/6864354) + +Changed isValid, added strict parsing. +Week tokens parsing. + +### 2.2.1 + +Fixed bug in string prototype test. +Updated authors and contributors. + +### 2.2.0 [See changelog](https://gist.github.com/ichernev/00f837a9baf46a3565e4) + +Added bower support. + +Language files now use UMD. + +Creating moment defaults to current date/month/year. + +Added a bundle of moment and all language files. + +### 2.1.0 [See changelog](https://gist.github.com/timrwood/b8c2d90d528eddb53ab5) + +Added better week support. + +Added ability to set offset with `moment#zone`. + +Added ability to set month or weekday from a string. + +Added `moment#min` and `moment#max` + +### 2.0.0 [See changelog](https://gist.github.com/timrwood/e72f2eef320ed9e37c51) + +Added short form localized tokens. + +Added ability to define language a string should be parsed in. + +Added support for reversed add/subtract arguments. + +Added support for `endOf('week')` and `startOf('week')`. + +Fixed the logic for `moment#diff(Moment, 'months')` and `moment#diff(Moment, 'years')` + +`moment#diff` now floors instead of rounds. + +Normalized `moment#toString`. + +Added `isSame`, `isAfter`, and `isBefore` methods. + +Added better week support. + +Added `moment#toJSON` + +Bugfix: Fixed parsing of first century dates + +Bugfix: Parsing 10Sep2001 should work as expected + +Bugfix: Fixed wierdness with `moment.utc()` parsing. + +Changed language ordinal method to return the number + ordinal instead of just the ordinal. + +Changed two digit year parsing cutoff to match strptime. + +Removed `moment#sod` and `moment#eod` in favor of `moment#startOf` and `moment#endOf`. + +Removed `moment.humanizeDuration()` in favor of `moment.duration().humanize()`. + +Removed the lang data objects from the top level namespace. + +Duplicate `Date` passed to `moment()` instead of referencing it. + +### 1.7.2 [See discussion](https://github.com/timrwood/moment/issues/456) + +Bugfixes + +### 1.7.1 [See discussion](https://github.com/timrwood/moment/issues/384) + +Bugfixes + +### 1.7.0 [See discussion](https://github.com/timrwood/moment/issues/288) + +Added `moment.fn.endOf()` and `moment.fn.startOf()`. + +Added validation via `moment.fn.isValid()`. + +Made formatting method 3x faster. http://jsperf.com/momentjs-cached-format-functions + +Add support for month/weekday callbacks in `moment.fn.format()` + +Added instance specific languages. + +Added two letter weekday abbreviations with the formatting token `dd`. + +Various language updates. + +Various bugfixes. + +### 1.6.0 [See discussion](https://github.com/timrwood/moment/pull/268) + +Added Durations. + +Revamped parser to support parsing non-separated strings (YYYYMMDD vs YYYY-MM-DD). + +Added support for millisecond parsing and formatting tokens (S SS SSS) + +Added a getter for `moment.lang()` + +Various bugfixes. + +There are a few things deprecated in the 1.6.0 release. + +1. The format tokens `z` and `zz` (timezone abbreviations like EST CST MST etc) will no longer be supported. Due to inconsistent browser support, we are unable to consistently produce this value. See [this issue](https://github.com/timrwood/moment/issues/162) for more background. + +2. The method `moment.fn.native` is deprecated in favor of `moment.fn.toDate`. There continue to be issues with Google Closure Compiler throwing errors when using `native`, even in valid instances. + +3. The way to customize am/pm strings is being changed. This would only affect you if you created a custom language file. For more information, see [this issue](https://github.com/timrwood/moment/pull/222). + +### 1.5.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=10&page=1&state=closed) + +Added UTC mode. + +Added automatic ISO8601 parsing. + +Various bugfixes. + +### 1.4.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=8&state=closed) + +Added `moment.fn.toDate` as a replacement for `moment.fn.native`. + +Added `moment.fn.sod` and `moment.fn.eod` to get the start and end of day. + +Various bugfixes. + +### 1.3.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=7&state=closed) + +Added support for parsing month names in the current language. + +Added escape blocks for parsing tokens. + +Added `moment.fn.calendar` to format strings like 'Today 2:30 PM', 'Tomorrow 1:25 AM', and 'Last Sunday 4:30 AM'. + +Added `moment.fn.day` as a setter. + +Various bugfixes + +### 1.2.0 [See milestone](https://github.com/timrwood/moment/issues?milestone=4&state=closed) + +Added timezones to parser and formatter. + +Added `moment.fn.isDST`. + +Added `moment.fn.zone` to get the timezone offset in minutes. + +### 1.1.2 [See milestone](https://github.com/timrwood/moment/issues?milestone=6&state=closed) + +Various bugfixes + +### 1.1.1 [See milestone](https://github.com/timrwood/moment/issues?milestone=5&state=closed) + +Added time specific diffs (months, days, hours, etc) + +### 1.1.0 + +Added `moment.fn.format` localized masks. 'L LL LLL LLLL' [issue 29](https://github.com/timrwood/moment/pull/29) + +Fixed [issue 31](https://github.com/timrwood/moment/pull/31). + +### 1.0.1 + +Added `moment.version` to get the current version. + +Removed `window !== undefined` when checking if module exists to support browserify. [issue 25](https://github.com/timrwood/moment/pull/25) + +### 1.0.0 + +Added convenience methods for getting and setting date parts. + +Added better support for `moment.add()`. + +Added better lang support in NodeJS. + +Renamed library from underscore.date to Moment.js + +### 0.6.1 + +Added Portuguese, Italian, and French language support + +### 0.6.0 + +Added _date.lang() support. +Added support for passing multiple formats to try to parse a date. _date("07-10-1986", ["MM-DD-YYYY", "YYYY-MM-DD"]); +Made parse from string and single format 25% faster. + +### 0.5.2 + +Bugfix for [issue 8](https://github.com/timrwood/underscore.date/pull/8) and [issue 9](https://github.com/timrwood/underscore.date/pull/9). + +### 0.5.1 + +Bugfix for [issue 5](https://github.com/timrwood/underscore.date/pull/5). + +### 0.5.0 + +Dropped the redundant `_date.date()` in favor of `_date()`. +Removed `_date.now()`, as it is a duplicate of `_date()` with no parameters. +Removed `_date.isLeapYear(yearNumber)`. Use `_date([yearNumber]).isLeapYear()` instead. +Exposed customization options through the `_date.relativeTime`, `_date.weekdays`, `_date.weekdaysShort`, `_date.months`, `_date.monthsShort`, and `_date.ordinal` variables instead of the `_date.customize()` function. + +### 0.4.1 + +Added date input formats for input strings. + +### 0.4.0 + +Added underscore.date to npm. Removed dependencies on underscore. + +### 0.3.2 + +Added `'z'` and `'zz'` to `_.date().format()`. Cleaned up some redundant code to trim off some bytes. + +### 0.3.1 + +Cleaned up the namespace. Moved all date manipulation and display functions to the _.date() object. + +### 0.3.0 + +Switched to the Underscore methodology of not mucking with the native objects' prototypes. +Made chaining possible. + +### 0.2.1 + +Changed date names to be a more pseudo standardized 'dddd, MMMM Do YYYY, h:mm:ss a'. +Added `Date.prototype` functions `add`, `subtract`, `isdst`, and `isleapyear`. + +### 0.2.0 + +Changed function names to be more concise. +Changed date format from php date format to custom format. + +### 0.1.0 + +Initial release + +License +======= + +Moment.js is freely distributable under the terms of the MIT license. diff --git a/vendors/normalize/normalize.css b/vendors/normalize/normalize.css new file mode 100644 index 000000000..4474dee25 --- /dev/null +++ b/vendors/normalize/normalize.css @@ -0,0 +1,504 @@ +/*! normalize.css 2012-03-11T12:53 UTC - http://github.com/necolas/normalize.css */ + +/* ============================================================================= + HTML5 display definitions + ========================================================================== */ + +/* + * Corrects block display not defined in IE6/7/8/9 & FF3 + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section, +summary { + display: block; +} + +/* + * Corrects inline-block display not defined in IE6/7/8/9 & FF3 + */ + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +/* + * Prevents modern browsers from displaying 'audio' without controls + * Remove excess height in iOS5 devices + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/* + * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4 + * Known issue: no IE6 support + */ + +[hidden] { + display: none; +} + + +/* ============================================================================= + Base + ========================================================================== */ + +/* + * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units + * http://clagnut.com/blog/348/#c790 + * 2. Prevents iOS text size adjust after orientation change, without disabling user zoom + * www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/ + */ + +html { + font-size: 100%; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +/* + * Addresses font-family inconsistency between 'textarea' and other form elements. + */ + +html, +button, +input, +select, +textarea { + font-family: sans-serif; +} + +/* + * Addresses margins handled incorrectly in IE6/7 + */ + +body { + margin: 0; +} + + +/* ============================================================================= + Links + ========================================================================== */ + +/* + * Addresses outline displayed oddly in Chrome + */ + +a:focus { + outline: thin dotted; +} + +/* + * Improves readability when focused and also mouse hovered in all browsers + * people.opera.com/patrickl/experiments/keyboard/test + */ + +a:hover, +a:active { + outline: 0; +} + + +/* ============================================================================= + Typography + ========================================================================== */ + +/* + * Addresses font sizes and margins set differently in IE6/7 + * Addresses font sizes within 'section' and 'article' in FF4+, Chrome, S5 + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.75em; + margin: 2.33em 0; +} + +/* + * Addresses styling not present in IE7/8/9, S5, Chrome + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/* + * Addresses style set to 'bolder' in FF3+, S4/5, Chrome +*/ + +b, +strong { + font-weight: bold; +} + +blockquote { + margin: 1em 40px; +} + +/* + * Addresses styling not present in S5, Chrome + */ + +dfn { + font-style: italic; +} + +/* + * Addresses styling not present in IE6/7/8/9 + */ + +mark { + background: #ff0; + color: #000; +} + +/* + * Addresses margins set differently in IE6/7 + */ + +p, +pre { + margin: 1em 0; +} + +/* + * Corrects font family set oddly in IE6, S4/5, Chrome + * en.wikipedia.org/wiki/User:Davidgothberg/Test59 + */ + +pre, +code, +kbd, +samp { + font-family: monospace, serif; + _font-family: 'courier new', monospace; + font-size: 1em; +} + +/* + * Improves readability of pre-formatted text in all browsers + */ + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +/* + * 1. Addresses CSS quotes not supported in IE6/7 + * 2. Addresses quote property not supported in S4 + */ + +/* 1 */ + +q { + quotes: none; +} + +/* 2 */ + +q:before, +q:after { + content: ''; + content: none; +} + +small { + font-size: 75%; +} + +/* + * Prevents sub and sup affecting line-height in all browsers + * gist.github.com/413930 + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + + +/* ============================================================================= + Lists + ========================================================================== */ + +/* + * Addresses margins set differently in IE6/7 + */ + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +/* + * Addresses paddings set differently in IE6/7 + */ + +menu, +ol, +ul { + padding: 0 0 0 40px; +} + +/* + * Corrects list images handled incorrectly in IE7 + */ + +nav ul, +nav ol { + list-style: none; + list-style-image: none; +} + + +/* ============================================================================= + Embedded content + ========================================================================== */ + +/* + * 1. Removes border when inside 'a' element in IE6/7/8/9, FF3 + * 2. Improves image quality when scaled in IE7 + * code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ + */ + +img { + border: 0; /* 1 */ + -ms-interpolation-mode: bicubic; /* 2 */ +} + +/* + * Corrects overflow displayed oddly in IE9 + */ + +svg:not(:root) { + overflow: hidden; +} + + +/* ============================================================================= + Figures + ========================================================================== */ + +/* + * Addresses margin not present in IE6/7/8/9, S5, O11 + */ + +figure { + margin: 0; +} + + +/* ============================================================================= + Forms + ========================================================================== */ + +/* + * Corrects margin displayed oddly in IE6/7 + */ + +form { + margin: 0; +} + +/* + * Define consistent border, margin, and padding + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/* + * 1. Corrects color not being inherited in IE6/7/8/9 + * 2. Corrects text not wrapping in FF3 + * 3. Corrects alignment displayed oddly in IE6/7 + */ + +legend { + border: 0; /* 1 */ + padding: 0; + white-space: normal; /* 2 */ + *margin-left: -7px; /* 3 */ +} + +/* + * 1. Corrects font size not being inherited in all browsers + * 2. Addresses margins set differently in IE6/7, FF3+, S5, Chrome + * 3. Improves appearance and consistency in all browsers + */ + +button, +input, +select, +textarea { + font-size: 100%; /* 1 */ + margin: 0; /* 2 */ + vertical-align: baseline; /* 3 */ + *vertical-align: middle; /* 3 */ +} + +/* + * Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet + */ + +button, +input { + line-height: normal; /* 1 */ +} + +/* + * 1. Improves usability and consistency of cursor style between image-type 'input' and others + * 2. Corrects inability to style clickable 'input' types in iOS + * 3. Removes inner spacing in IE7 without affecting normal text inputs + * Known issue: inner spacing remains in IE6 + */ + +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; /* 1 */ + -webkit-appearance: button; /* 2 */ + *overflow: visible; /* 3 */ +} + +/* + * Re-set default cursor for disabled elements + */ + +button[disabled], +input[disabled] { + cursor: default; +} + +/* + * 1. Addresses box sizing set to content-box in IE8/9 + * 2. Removes excess padding in IE8/9 + * 3. Removes excess padding in IE7 + Known issue: excess padding remains in IE6 + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + *height: 13px; /* 3 */ + *width: 13px; /* 3 */ +} + +/* + * 1. Addresses appearance set to searchfield in S5, Chrome + * 2. Addresses box-sizing set to border-box in S5, Chrome (include -moz to future-proof) + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/* + * Removes inner padding and search cancel button in S5, Chrome on OS X + */ + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +/* + * Removes inner padding and border in FF3+ + * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/ + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/* + * 1. Removes default vertical scrollbar in IE6/7/8/9 + * 2. Improves readability and alignment in all browsers + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + + +/* ============================================================================= + Tables + ========================================================================== */ + +/* + * Remove most spacing between table cells + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/vendors/rl/LICENSE b/vendors/rl/LICENSE new file mode 100644 index 000000000..ba350e5db --- /dev/null +++ b/vendors/rl/LICENSE @@ -0,0 +1,20 @@ +Copyright 2013 RainLoop Team + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendors/rl/rl-1.0.min.js b/vendors/rl/rl-1.0.min.js new file mode 100644 index 000000000..133ea0b96 --- /dev/null +++ b/vendors/rl/rl-1.0.min.js @@ -0,0 +1,2 @@ +/*! RainLoop Top Driver v1.0 (c) 2013 RainLoop Team; Licensed under MIT */ +!function(a,b){function c(){}c.prototype.s=a.sessionStorage,c.prototype.t=a.top||a,c.prototype.getHash=function(){var a=null;if(this.s)a=this.s.getItem("__rlA")||null;else if(this.t){var c=this.t.name&&b&&"{"===this.t.name.toString().substr(0,1)?b.parse(this.t.name.toString()):null;a=c?c.__rlA||null:null}return a},c.prototype.setHash=function(){var c=a.rainloopAppData,d=null;this.s?this.s.setItem("__rlA",c&&c.AuthAccountHash?c.AuthAccountHash:""):this.t&&b&&(d={},d.__rlA=c&&c.AuthAccountHash?c.AuthAccountHash:"",this.t.name=b.stringify(d))},c.prototype.clearHash=function(){this.s?this.s.setItem("__rlA",""):this.t&&(this.t.name="")},a._rlhh=new c,a.__rlah=function(){return a._rlhh?a._rlhh.getHash():null},a.__rlah_set=function(){a._rlhh&&a._rlhh.setHash()},a.__rlah_clear=function(){a._rlhh&&a._rlhh.clearHash()}}(window,window.JSON); \ No newline at end of file diff --git a/vendors/rl/rl.js b/vendors/rl/rl.js new file mode 100644 index 000000000..11e819cc8 --- /dev/null +++ b/vendors/rl/rl.js @@ -0,0 +1,64 @@ +/*! RainLoop Top Driver v1.0 (c) 2013 RainLoop Team; Licensed under MIT */ +(function (window, JSON) { + + /** + * @constructor + */ + function CRLTopDriver() {} + + CRLTopDriver.prototype.s = window['sessionStorage']; + + CRLTopDriver.prototype.t = window['top'] || window; + + /** + * @return {(string|null)} + */ + CRLTopDriver.prototype['getHash'] = function() { + var mR = null; + if (this.s) { + mR = this.s['getItem']('__rlA') || null; + } else if (this.t) { + var mData = this.t['name'] && JSON && '{' === this.t['name']['toString']()['substr'](0, 1) ? JSON['parse'](this.t['name']['toString']()) : null; + mR = mData ? (mData['__rlA'] || null) : null; + } + return mR; + }; + + CRLTopDriver.prototype['setHash'] = function() { + var mData = window['rainloopAppData'], mRes = null; + if (this.s) { + this.s['setItem']('__rlA', mData && mData['AuthAccountHash'] ? mData['AuthAccountHash'] : ''); + } else if (this.t && JSON) { + mRes = {}; + mRes['__rlA'] = mData && mData['AuthAccountHash'] ? mData['AuthAccountHash'] : ''; + this.t['name'] = JSON['stringify'](mRes); + } + }; + + CRLTopDriver.prototype['clearHash'] = function() { + if (this.s) { + this.s['setItem']('__rlA', ''); + } else if (this.t) { + this.t['name'] = ''; + } + }; + + window['_rlhh'] = new CRLTopDriver(); + + /** + * @returns {(string|null)} + */ + window['__rlah'] = function () { + return window['_rlhh'] ? window['_rlhh']['getHash']() : null; + }; + window['__rlah_set'] = function () { + if (window['_rlhh']) { + window['_rlhh']['setHash'](); + } + }; + window['__rlah_clear'] = function () { + if (window['_rlhh']) { + window['_rlhh']['clearHash'](); + } + }; +}(window, window.JSON)); diff --git a/vendors/routes/crossroads.min.js b/vendors/routes/crossroads.min.js new file mode 100644 index 000000000..759f3f1a2 --- /dev/null +++ b/vendors/routes/crossroads.min.js @@ -0,0 +1,14 @@ +/* + Crossroads.js + Released under the MIT license + Author: Miller Medeiros + Version: 0.7.1 - Build: 93 (2012/02/02 09:29 AM) +*/ +(function(f){f(["signals"],function(g){function f(a,b){if(a.indexOf)return a.indexOf(b);else{for(var c=a.length;c--;)if(a[c]===b)return c;return-1}}function i(a,b){return"[object "+b+"]"===Object.prototype.toString.call(a)}function n(a){return a===null||a==="null"?null:a==="true"?!0:a==="false"?!1:a===m||a==="undefined"?m:a===""||isNaN(a)?a:parseFloat(a)}function k(){this._routes=[];this.bypassed=new g.Signal;this.routed=new g.Signal}function o(a,b,c,e){var d=i(a,"RegExp");this._router=e;this._pattern= +a;this._paramsIds=d?null:h.getParamIds(this._pattern);this._optionalParamsIds=d?null:h.getOptionalParamsIds(this._pattern);this._matchRegexp=d?a:h.compilePattern(a);this.matched=new g.Signal;b&&this.matched.add(b);this._priority=c||0}var j,h,m;k.prototype={normalizeFn:null,create:function(){return new k},shouldTypecast:!1,addRoute:function(a,b,c){a=new o(a,b,c,this);this._sortedInsert(a);return a},removeRoute:function(a){var b=f(this._routes,a);b!==-1&&this._routes.splice(b,1);a._destroy()},removeAllRoutes:function(){for(var a= +this.getNumRoutes();a--;)this._routes[a]._destroy();this._routes.length=0},parse:function(a){var a=a||"",b=this._getMatchedRoutes(a),c=0,e=b.length,d;if(e)for(;c + * @author Miller Medeiros + * @version 1.1.2 (2012/10/31 03:19 PM) + * Released under the MIT License + */ +(function(a){a("hasher",["signals"],function(b){var c=(function(k){var o=25,q=k.document,n=k.history,w=b.Signal,f,u,m,E,d,C,s=/#(.*)$/,j=/(\?.*)|(\#.*)/,g=/^\#/,i=(!+"\v1"),A=("onhashchange" in k)&&q.documentMode!==7,e=i&&!A,r=(location.protocol==="file:");function t(G){if(!G){return""}var F=new RegExp("^\\"+f.prependHash+"|\\"+f.appendHash+"$","g");return G.replace(F,"")}function D(){var F=s.exec(f.getURL());return(F&&F[1])?decodeURIComponent(F[1]):""}function z(){return(d)?d.contentWindow.frameHash:null}function y(){d=q.createElement("iframe");d.src="about:blank";d.style.display="none";q.body.appendChild(d)}function h(){if(d&&u!==z()){var F=d.contentWindow.document;F.open();F.write(""+q.title+'