summaryrefslogtreecommitdiff
path: root/frontend/gamma
Unidiff
Diffstat (limited to 'frontend/gamma') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/gamma/css/mobile.css8240
-rw-r--r--frontend/gamma/css/static.css22
-rw-r--r--frontend/gamma/css/web.css33
-rw-r--r--frontend/gamma/html/mobile_template.html5
-rw-r--r--frontend/gamma/js/Bookmarklet.js22
-rw-r--r--frontend/gamma/js/BookmarkletHash.js22
-rw-r--r--frontend/gamma/js/Bookmarklet_1.js22
-rw-r--r--frontend/gamma/js/Bookmarklet_2.js22
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-affix.js140
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-alert.js122
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-button.js128
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-carousel.js208
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-collapse.js190
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-dropdown.js184
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-modal.js268
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-popover.js137
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-scrollspy.js185
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-tab.js167
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-tooltip.js310
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-transition.js83
-rw-r--r--frontend/gamma/js/Bootstrap/bootstrap-typeahead.js346
-rw-r--r--frontend/gamma/js/Clipperz/Async.js50
-rw-r--r--frontend/gamma/js/Clipperz/Base.js41
-rw-r--r--frontend/gamma/js/Clipperz/ByteArray.js71
-rw-r--r--frontend/gamma/js/Clipperz/CSVProcessor.js78
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/AES.js29
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/Base.js22
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/BigInt.js23
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js22
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js83
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js26
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js22
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js24
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js31
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/PRNG.js33
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/RSA.js22
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/SHA.js22
-rw-r--r--frontend/gamma/js/Clipperz/Crypto/SRP.js36
-rw-r--r--frontend/gamma/js/Clipperz/DOM.js24
-rw-r--r--frontend/gamma/js/Clipperz/Date.js25
-rw-r--r--frontend/gamma/js/Clipperz/KeePassExportProcessor.js22
-rw-r--r--frontend/gamma/js/Clipperz/KeyValueObjectStore.js27
-rw-r--r--frontend/gamma/js/Clipperz/Logging.js41
-rw-r--r--frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/Connection.js33
-rw-r--r--frontend/gamma/js/Clipperz/PM/Crypto.js48
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js34
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js30
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js26
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js66
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js25
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/Record.js44
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js28
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js39
-rw-r--r--frontend/gamma/js/Clipperz/PM/DataModel/User.js24
-rw-r--r--frontend/gamma/js/Clipperz/PM/Date.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/PIN.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy.js30
-rwxr-xr-xfrontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js48
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy/Proxy.OfflineCache.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js28
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings.js27
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/Toll.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js26
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js24
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js26
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js35
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js30
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js29
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js28
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js24
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardDetail.js26
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardList.js26
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/LoginForm.js29
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Mobile/Controllers/MainController.js54
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js26
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js26
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js24
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js27
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js24
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js28
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js26
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js23
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js25
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js22
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js28
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js28
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js28
-rw-r--r--frontend/gamma/js/Clipperz/Set.js22
-rw-r--r--frontend/gamma/js/Clipperz/Signal.js22
-rw-r--r--frontend/gamma/js/Clipperz/Style.js22
-rw-r--r--frontend/gamma/js/Clipperz/Visual.js22
-rw-r--r--frontend/gamma/js/Clipperz/YUI/DomHelper.js29
-rw-r--r--frontend/gamma/js/Clipperz/YUI/DomQuery.js22
-rw-r--r--frontend/gamma/js/Clipperz/YUI/Utils.js22
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/AES.js864
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/Base.js1847
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/BigInt.js1755
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/BigInt_scoped.js1644
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/ByteArray.js1496
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Curve.js545
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/FiniteField.js521
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Point.js62
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Value.js381
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/ECC/StandardCurves.js234
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/PRNG.js850
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/RSA.js146
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/SHA.js296
-rw-r--r--frontend/gamma/js/ClipperzCryptoLibrary/SRP.js326
-rw-r--r--frontend/gamma/js/main.js22
-rw-r--r--frontend/gamma/js/main.mobile.js22
-rw-r--r--frontend/gamma/properties/gamma.properties.json4
-rw-r--r--frontend/gamma/properties/mobile.properties.json46
-rw-r--r--frontend/gamma/tests/SimpleTest/SimpleTest.Async.js22
-rwxr-xr-xfrontend/gamma/tests/index.html22
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css22
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/Fail.html22
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/Twitter.html22
-rw-r--r--frontend/gamma/tests/tests/Bookmarklet/index.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Async.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Async.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Base.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Base.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/ByteArray.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/ByteArray.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/AES.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/Base.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/index.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/DOM.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/DOM.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Date.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Date.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Connection.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Crypto.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Date.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Date.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/PIN.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/PIN.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Proxy.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Toll.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/UI/index.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/PM/index.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Set.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/Set.test.js22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/index.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/index_googleCode.html22
-rw-r--r--frontend/gamma/tests/tests/Clipperz/index_testECC.html22
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js22
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js22
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js22
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogEditing/index.html22
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js22
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js22
-rw-r--r--frontend/gamma/tests/tests/Components/CardDialogNew/index.html22
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/User.data.js22
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/index.html22
-rw-r--r--frontend/gamma/tests/tests/Components/FullApp/mobile.index.html22
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js22
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js22
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/User.data.js22
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/index.html22
-rw-r--r--frontend/gamma/tests/tests/Components/GridLayout/test.css22
-rw-r--r--frontend/gamma/tests/tests/Components/ProgressBar/index.html22
-rw-r--r--frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js22
-rw-r--r--frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html22
-rw-r--r--frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js22
-rw-r--r--frontend/gamma/tests/tests/Components/Tooltips/index.html22
-rw-r--r--frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js22
-rw-r--r--frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js22
-rw-r--r--frontend/gamma/tests/tests/Components/UnlockPassword/index.html22
-rw-r--r--frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js22
-rw-r--r--frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js22
-rw-r--r--frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html22
-rw-r--r--frontend/gamma/tests/tests/index.html22
286 files changed, 22093 insertions, 5903 deletions
diff --git a/frontend/gamma/css/mobile.css b/frontend/gamma/css/mobile.css
index 8c4c1bf..36b2b21 100644
--- a/frontend/gamma/css/mobile.css
+++ b/frontend/gamma/css/mobile.css
@@ -1,2571 +1,6191 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26/* 24article,
27 25aside,
28Color list: 26details,
29- login box: 27figcaption,
30 light#ff9955 28figure,
31 dark#ff6622 29footer,
32- login button: 30header,
33 regular#dd5500 31hgroup,
34 hover#773311 32nav,
35- login translations: 33section {
36 box: #cc6622; 34 display: block;
37 not-selected: 35}
38 color: #ddaa99 36audio,
39 background:#994422 37canvas,
40 selected: #772211; 38video {
41*/ 39 display: inline-block;
40 *display: inline;
41 *zoom: 1;
42}
43audio:not([controls]) {
44 display: none;
45}
42html { 46html {
43 height: 100%; 47 font-size: 100%;
44 -webkit-text-size-adjust: none; 48 -webkit-text-size-adjust: 100%;
45 -ms-text-size-adjust: none; 49 -ms-text-size-adjust: 100%;
46} 50}
47body { 51a:focus {
48 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 52 outline: thin dotted #333;
49 margin: 0px; 53 outline: 5px auto -webkit-focus-ring-color;
54 outline-offset: -2px;
50} 55}
51.ellipsis { 56a:hover,
52 text-overflow: ellipsis; 57a:active {
53 overflow: hidden; 58 outline: 0;
54 white-space: nowrap;
55} 59}
56/** 60sub,
57 * Background noise recipe 61sup {
58 * 62 position: relative;
59 * This recipe use a sass function to generate a .png file 63 font-size: 75%;
60 * 64 line-height: 0;
61 * Inspired by a jQuery plugin "Noisy" by Daniel Rapp @DanielRapp 65 vertical-align: baseline;
62 * @link https://github.com/DanielRapp/Noisy 66}
63 * 67sup {
64 * Converted using Sass by Aaron Russell @aaronrussell & Philipp Bosch @philippbosch 68 top: -0.5em;
65 * @link https://gist.github.com/1021332 69}
66 * 70sub {
67 * Ported to a sass gem by Antti Salonen @antsa 71 bottom: -0.25em;
68 * @link https://github.com/antsa/sassy_noise 72}
69 * 73img {
70 * Mixin: background-noise 74 /* Responsive images (ensure images don't scale beyond their parents) */
71 * Function: background_noise
72 *
73 * @author Daniel Rapp @DanielRapp
74 * @author Aaron Russell @aaronrussell
75 * @author Philipp Bosch @philippbosch
76 * @author Antti Salonen @antsa
77 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
78 */
79/**
80 *
81 * @class Gradients
82 * @author David Kaneda http://www.davidkaneda.com/
83 *
84 */
85/**
86 * Adds a background gradient into a specified selector.
87 *
88 * @include background-gradient(#444, 'glossy');
89 *
90 * You can also use color-stops if you want full control of the gradient:
91 *
92 * @include background-gradient(#444, color-stops(#333, #222, #111));
93 *
94 * @param {color} $bg-color
95 * The base color of the gradient.
96 *
97 * @param {string/list} $type
98 * The style of the gradient, one of five pre-defined options: matte, bevel, glossy, recessed, or linear:
99 *
100 * @include background-gradient(red, 'glossy');
101 *
102 * It can also accept a list of color-stop values:;
103 *
104 * @include background-gradient(black, color-stops(#333, #111, #000));
105 *
106 * @param {string} $direction
107 * The direction of the gradient.
108 */
109/**
110 * Blueprint grid background pattern
111 *
112 * @link http://lea.verou.me/css3patterns/#blueprint-grid
113 *
114 * @author Lea Verou http://lea.verou.me/ for the original pattern
115 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx for the sass mixin
116 */
117/**
118 * Background overlay inspired by Google Chrome modal overlay
119 *
120 * @author Maxime Thirouin @MoOx maxime.thirouin@gmail.com
121 */
122/**
123 * Striped background pattern
124 *
125 * @link http://lea.verou.me/css3patterns/
126 *
127 * @author Lea Verou http://lea.verou.me/ for the original pattern
128 * @author David Kaneda http://www.davidkaneda.com @davidkaneda for the sass mixin
129 */
130/**
131 *
132 * Before compass 0.11.5, you need to add
133 * Compass::BrowserSupport.add_support("repeating-linear-gradient", "webkit", "moz", "o", "ms")
134 * To your configuration (config.rb)
135 * @see https://github.com/chriseppstein/compass/issues/401
136 *
137 * @link http://lea.verou.me/css3patterns/#tartan
138 *
139 * @author Marta Armada http://swwweet.com/ for the original pattern
140 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx for the sass mixin
141 */
142/**
143 * Carbon Fiber background pattern
144 *
145 * @author Lea Verou http://lea.verou.me/ for the original pattern
146 * @author David Kaneda http://www.davidkaneda.com/ for the Sass mixin
147 *
148 * @link http://lea.verou.me/css3patterns/
149 *
150 */
151/**
152 * Normalize.css
153 * Opposite approche from CSS reset
154 *
155 * Based on normalize.css commit 9576d48fc234c5224b1fc4dccba2f5965243843d
156 *
157 * @link http://github.com/necolas/normalize.css
158 */
159/* normalize.css 2011-07-12T10:51 UTC · http://github.com/necolas/normalize.css */
160/* =============================================================================
161 HTML5 element display
162 ========================================================================== */
163/* =============================================================================
164 Base
165 ========================================================================== */
166/* =============================================================================
167 Links
168 ========================================================================== */
169/* =============================================================================
170 Typography
171 ========================================================================== */
172/* =============================================================================
173 Lists
174 ========================================================================== */
175/* =============================================================================
176 Embedded content
177 ========================================================================== */
178/* =============================================================================
179 Figures
180 ========================================================================== */
181/* =============================================================================
182 Forms
183 ========================================================================== */
184/* =============================================================================
185 Tables
186 ========================================================================== */
187/**
188 *
189 * @author David Kaneda - http://www.davidkaneda.com
190 *
191 */
192/**
193 * @class Color
194 */
195/**
196 * Returns the brightness (out of 100) of a specified color.
197 * @todo explain why this is useful
198 * @param {color} $color The color you want the brightness value of
199 * @return {measurement}
200 */
201/**
202 * Returns the luminosity for a specified color
203 * @todo explain why this is useful
204 * @param {color} The color to check
205 * @return {measurement}
206 */
207/**
208 * Glass effect
209 * Use this on image for better effect render
210 *
211 * Inspired from Simurai's IMDB redisign
212 *
213 * @link http://lab.simurai.com/redesign/imdb
214 * @thanks Simurai @simurai
215 */
216/**
217 * Note IE7/6 doesn't understand pseudo element as ::before and ::after
218 * IE8 need to have :before and not ::before
219 * So use only : and not :: if you want to support IE8
220 * IE9 Webkit Firefox Opera understand ::
221 */
222/**
223 * Scotch tape effect with pure CSS
224 *
225 * @thanks Nick La @nickla for original concept
226 * @link http://webdesignerwall.com/tutorials/css3-image-styles
227 *
228 * @author David Kaneda http://www.davidkaneda.com
229 *
230 */
231/**
232 * Note IE7/6 doesn't understand pseudo element as ::before and ::after
233 * IE8 need to have :before and not ::before
234 * So use only : and not :: if you want to support IE8
235 * IE9 Webkit Firefox Opera understand ::
236 */
237/**
238 * Corner folded with pure CSS
239 *
240 * Known support: Firefox 3.5+, Chrome 4+, Safari 4+, Opera 10+, IE 9+.
241 * IE8 is not supported because it not render properly box-shadow and
242 * pseudo element should be selected with ::element and not :element
243 *
244 * @thanks Nicolas Gallagher @necolas
245 * @link http://nicolasgallagher.com/pure-css-folded-corner-effect/demo/
246 * @todo Nix in .4
247 */
248/**
249 * Note IE7/6 doesn't understand pseudo element as ::before and ::after
250 * IE8 need to have :before and not ::before
251 * So use only : and not :: if you want to support IE8
252 * IE9 Webkit Firefox Opera understand ::
253 */
254/**
255 * Corner folded with pure CSS
256 *
257 * Known support: Firefox 3.5+, Chrome 4+, Safari 4+, Opera 10+, IE 9+.
258 * IE8 is not supported because it not render properly box-shadow and
259 * pseudo element should be selected with ::element and not :element
260 *
261 * @thanks Nicolas Gallagher @necolas
262 * @link http://nicolasgallagher.com/pure-css-folded-corner-effect/demo/
263 */
264/**
265 * Note IE7/6 doesn't understand pseudo element as ::before and ::after
266 * IE8 need to have :before and not ::before
267 * So use only : and not :: if you want to support IE8
268 * IE9 Webkit Firefox Opera understand ::
269 */
270/**
271 * Form element inline mixin
272 * This mixin allow you to have a label inline with your input
273 * It's simply based on inline-block behavior
274 *
275 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
276 */
277/**
278 * Vertical alignement for page
279 * Inspired by http://css-tricks.com/snippets/css/center-div-with-dynamic-height/
280 *
281 * Usage:
282 *
283 * SCSS
284 * @include vertical-align-requirement;
285 * .v-align-container { @include vertical-align-container }
286 * .v-align-content-container { @include vertical-align-content-container }
287 * .v-align-content { @include vertical-align-content }
288 *
289 * HTML
290 * <body>
291 * <div class="v-align-container">
292 * <div class="v-align-content-container">
293 * <div class="v-align-content">
294 * Your content !
295 * </div>
296 * </div>
297 * </div>
298 * </body>
299 *
300 * @thanks Chris Coyier @chriscoyier
301 * @autor Maxime Thirouin maxime.thirouin@gmail.com @MoOx
302 */
303/**
304 * Media Queries Mixins
305 *
306 * @todo Do we have to take care of print ?
307 *
308 * @require sass-3.2 (you need eventually to do "sudo gem install sass --pre")
309 * @author Maxime Thirouin <maxime.thirouin@gmail.com>
310 */
311/*
312$media-query-width-big: 1280px;
313$media-query-width-medium: 960px;
314$media-query-width-small: 480px;
315*/
316/**
317 * Drop shadow mixins from Nicolas Gallagher demo
318 *
319 * @thanks Nicolas Gallagher @necolas, @simurai, @cameronmoll, @matthamm
320 *
321 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
322 */
323/**
324 * Drop shadow curled
325 *
326 * @thanks Nicolas Gallagher @necolas
327 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
328 */
329/**
330 * Drop shadow curved
331 *
332 * @thanks Nicolas Gallagher @necolas
333 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
334 */
335/**
336 * Drop shadow flying
337 *
338 * @thanks Geoffrey Crofte @geoffrey_crofte
339 * @link http://www.creativejuiz.fr/trytotry/css3-box-shadow-after-before/
340 */
341/**
342 * Drop shadow w/ lifted corners
343 *
344 * @thanks Nicolas Gallagher @necolas
345 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
346 */
347/**
348 * Drop shadow w/ perspective
349 *
350 * @thanks Nicolas Gallagher @necolas
351 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
352 */
353/**
354 * Drop shadow raised
355 *
356 * @thanks Nicolas Gallagher @necolas
357 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
358 */
359/**
360 * Drop shadow rules required for transform on drop shadow
361 *
362 * /!\ This is required if you want to apply some transform on the element using drop shadow
363 *
364 * @thanks Nicolas Gallagher @necolas
365 * @link http://nicolasgallagher.com/css-drop-shadows-without-images/demo/
366 */
367/**
368 * Shadow along the top edge of the browser viewport
369 *
370 * @link http://playground.genelocklin.com/depth/
371 */
372/**
373* Shapes !
374* Polygons, ellipses and symbols
375*
376* @thanks Chris Coyier @chriscoyier
377* @link http://css-tricks.com/examples/ShapesOfCSS/
378* @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
379*/
380/**
381 * Shape/Ellipse
382 *
383 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
384 */
385/**
386 * Shape/Polygon
387 *
388 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
389 */
390/**
391 * Shape/Polygon/Hexagon
392 *
393 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
394 */
395/**
396 * Shape/Polygon/Octagon
397 *
398 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
399 */
400/**
401 * Shape/Polygon/Parallelogram
402 *
403 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
404 */
405/**
406 * Shape/Polygon/Pentagon
407 *
408 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
409 */
410/**
411 * Shape/Polygon/Rectangle
412 *
413 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
414 */
415/**
416 * Shape/Polygon/Rhombus
417 *
418 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
419 */
420/**
421 * Shape/Polygon/Square
422 *
423 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
424 */
425/**
426 * Shape/Polygon/Star
427 *
428 * @todo check if setting a z-index by default is a good thing
429 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
430 */
431/**
432 * Shape/Polygon/Trapezoid
433 *
434 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
435 */
436/**
437 * Shape/Polygon/Triangle
438 *
439 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
440 */
441/**
442 * Shape/Symbol
443 *
444 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
445 */
446/**
447 * Shape/Symbol/Diamond
448 *
449 * @todo add height support
450 *
451 * @author Alexander Futekov
452 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
453 */
454/**
455 * Shape/Symbol/Egg
456 *
457 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
458 */
459/**
460 * Shape/Symbol/Heart
461 *
462 * @author Nicolas Gallagher @necolas
463 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
464 */
465/**
466 * Shape/Symbol/Infinity
467 *
468 * @author Nicolas Gallagher @necolas
469 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
470 */
471/**
472 * Shape/Symbol/Pacman
473 *
474 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
475 */
476/**
477 * Shape/Symbol/Yin-yang
478 *
479 * @author Alexander Futekov
480 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
481 */
482/**
483 * Micro clearfix hack
484 *
485 * The clearfix hack is a popular way to clear floats without resorting to using presentational markup. This article presents an update to the clearfix method that further reduces the amount of CSS required.
486 * Known support: Firefox 2+, Safari 2+, Chrome, Opera 9.27+, IE 6+, IE Mac.
487 *
488 * @thanks Nicolas Gallagher @necolas
489 * @link http://nicolasgallagher.com/micro-clearfix-hack/
490 */
491/**
492 * Note IE7/6 doesn't understand pseudo element as ::before and ::after
493 * IE8 need to have :before and not ::before
494 * So use only : and not :: if you want to support IE8
495 * IE9 Webkit Firefox Opera understand ::
496 */
497/**
498 * UI convex effect from one color
499 *
500 * @todo merge with ui-button ?
501 *
502 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
503 */
504/**
505 * UI Glossy helper
506 *
507 * @deprecated
508 * @todo Remove in 0.4
509 * @see background/gradients
510 *
511 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
512 */
513/**
514 * UI simple gradient from one color
515 *
516 * @todo merge with ui-button ?
517 *
518 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
519 */
520/**
521 * Shape/Polygon/Triangle
522 *
523 * @author Maxime Thirouin maxime.thirouin@gmail.com @MoOx
524 */
525/**
526 * Keyboard key touch
527 * A simple stylesheet for rendering beautiful keyboard-style elements.
528 75
529 * @author Michael Hüneburg http://michaelhue.com/keyscss 76 max-width: 100%;
530 * @link https://github.com/michaelhue/keyscss (commit 76bb603e921d0145362e0f60eabb79d4f69cbda0) 77 /* Part 1: Set a maxium relative to the parent */
531 * 78
532 * @author Maxime Thirouin @MoOx maxime.thirouin@gmail.com 79 width: auto\9;
533*/ 80 /* IE7-8 need help adjusting responsive images */
534/** 81
535 * Menu dropdown helper 82 height: auto;
536 * 83 /* Part 2: Scale the height according to the width, otherwise you get stretching */
537 * @author Maxime Thirouin @MoOx maxime.thirouin@gmail.com 84
538*/ 85 vertical-align: middle;
539/** 86 border: 0;
540 * Ui background overlay inspired by Google Chrome modal overlay 87 -ms-interpolation-mode: bicubic;
541 * 88}
542 * @author Maxime Thirouin @MoOx maxime.thirouin@gmail.com 89#map_canvas img,
543 */ 90.google-maps img {
544/** 91 max-width: none;
545 * Background overlay inspired by Google Chrome modal overlay 92}
546 * 93button,
547 * @author Maxime Thirouin @MoOx maxime.thirouin@gmail.com 94input,
548 */ 95select,
549/** 96textarea {
550 * <hr /> separator style
551 *
552 * @author Chris Coyier @chriscoyier
553 * @link http://jsfiddle.net/chriscoyier/GaEzp/35/
554 *
555 * @author Maxime Thirouin @MoOx maxime.thirouin@gmail.com
556 */
557/**
558 * Micro clearfix hack
559 *
560 * The clearfix hack is a popular way to clear floats without resorting to using presentational markup. This article presents an update to the clearfix method that further reduces the amount of CSS required.
561 * Known support: Firefox 2+, Safari 2+, Chrome, Opera 9.27+, IE 6+, IE Mac.
562 *
563 * @thanks Nicolas Gallagher @necolas
564 * @link http://nicolasgallagher.com/micro-clearfix-hack/
565 */
566/**
567 * Note IE7/6 doesn't understand pseudo element as ::before and ::after
568 * IE8 need to have :before and not ::before
569 * So use only : and not :: if you want to support IE8
570 * IE9 Webkit Firefox Opera understand ::
571 */
572/**
573 *
574 * @class Gradients
575 * @author David Kaneda http://www.davidkaneda.com/
576 *
577 */
578/**
579 * Adds a background gradient into a specified selector.
580 *
581 * @include background-gradient(#444, 'glossy');
582 *
583 * You can also use color-stops if you want full control of the gradient:
584 *
585 * @include background-gradient(#444, color-stops(#333, #222, #111));
586 *
587 * @param {color} $bg-color
588 * The base color of the gradient.
589 *
590 * @param {string/list} $type
591 * The style of the gradient, one of five pre-defined options: matte, bevel, glossy, recessed, or linear:
592 *
593 * @include background-gradient(red, 'glossy');
594 *
595 * It can also accept a list of color-stop values:;
596 *
597 * @include background-gradient(black, color-stops(#333, #111, #000));
598 *
599 * @param {string} $direction
600 * The direction of the gradient.
601 */
602/**
603 * @class Webfont Icon
604 * Great to use with the [Pictos font](http://pictos.drewwilson.com/)
605 *
606 */
607/**
608 * @cfg {color} $webfont-icon-base-color
609 * The default color of icons when using the {@link #webfont-icon} mixin.
610 *
611 * Defaults to `white`.
612 */
613/**
614 * @cfg {color} $webfont-icon-default-stroke
615 * The default color to use on the border of icons, when using the {@link #webfont-icon} mixin.
616 *
617 * Defaults to `null`.
618 */
619/**
620 * @cfg {string} $webfont-icon-default-gradient
621 * The default gradient to use when using the {@link #webfont-icon} mixin.
622 *
623 * Defaults to `matte`.
624 */
625/* line 41, ../compass-recipes/stylesheets/recipes/_webfont-icon.scss */
626.webfont-icon-base {
627 color: transparent;
628 -webkit-background-clip: text;
629 background-clip: text;
630 position: absolute;
631 top: 0;
632 left: 0;
633 text-indent: 0;
634 text-shadow: none;
635 -webkit-user-select: none;
636 user-select: none;
637}
638/**
639 * Includes a character into the specified selector, styled as an icon.
640 *
641 * @include webfont-icon('a');
642 *
643 * @param {color} $color
644 * The color of the icon. Defaults to {@link #$webfont-icon-default-background $webfont-icon-default-background}.
645 *
646 * @param {measurement} $size
647 * The size of the icon
648 *
649 * @param {color} $stroke
650 * The color of the border. Defautls to {@link #$webfont-icon-default-border $webfont-icon-default-border}.
651 *
652 * @param {boolean} $include-staes
653 * True to include states for hover and active. Defaults to `true`.
654 */
655/* line 1, ../scss/include/_base.scss */
656* {
657 margin: 0; 97 margin: 0;
98 font-size: 100%;
99 vertical-align: middle;
100}
101button,
102input {
103 *overflow: visible;
104 line-height: normal;
105}
106button::-moz-focus-inner,
107input::-moz-focus-inner {
658 padding: 0; 108 padding: 0;
109 border: 0;
659} 110}
660/* line 6, ../scss/include/_base.scss */ 111button,
661body { 112html input[type="button"],
662 -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 113input[type="reset"],
663 -webkit-touch-callout: none; 114input[type="submit"] {
664} 115 -webkit-appearance: button;
665/* line 11, ../scss/include/_base.scss */ 116 cursor: pointer;
666#jqt { 117}
667 -webkit-text-size-adjust: none; 118label,
668 -webkit-user-select: none; 119select,
669 user-select: none; 120button,
670 font-family: "Helvetica Neue", Helvetica; 121input[type="button"],
671 position: absolute; 122input[type="reset"],
672 right: 0; 123input[type="submit"],
673 top: 0; 124input[type="radio"],
674 left: 0; 125input[type="checkbox"] {
675 bottom: 0; 126 cursor: pointer;
127}
128input[type="search"] {
129 -webkit-box-sizing: content-box;
130 -moz-box-sizing: content-box;
131 box-sizing: content-box;
132 -webkit-appearance: textfield;
133}
134input[type="search"]::-webkit-search-decoration,
135input[type="search"]::-webkit-search-cancel-button {
136 -webkit-appearance: none;
137}
138textarea {
139 overflow: auto;
140 vertical-align: top;
141}
142@media print {
143 * {
144 text-shadow: none !important;
145 color: #000 !important;
146 background: transparent !important;
147 box-shadow: none !important;
148 }
149 a,
150 a:visited {
151 text-decoration: underline;
152 }
153 a[href]:after {
154 content: " (" attr(href) ")";
155 }
156 abbr[title]:after {
157 content: " (" attr(title) ")";
158 }
159 .ir a:after,
160 a[href^="javascript:"]:after,
161 a[href^="#"]:after {
162 content: "";
163 }
164 pre,
165 blockquote {
166 border: 1px solid #999;
167 page-break-inside: avoid;
168 }
169 thead {
170 display: table-header-group;
171 }
172 tr,
173 img {
174 page-break-inside: avoid;
175 }
176 img {
177 max-width: 100% !important;
178 }
179 @page {
180 margin: 0.5cm;
181 }
182 p,
183 h2,
184 h3 {
185 orphans: 3;
186 widows: 3;
187 }
188 h2,
189 h3 {
190 page-break-after: avoid;
191 }
676} 192}
677/* line 21, ../scss/include/_base.scss */ 193.clearfix {
678#jqt a { 194 *zoom: 1;
679 -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 195}
680 -webkit-user-drag: none; 196.clearfix:before,
197.clearfix:after {
198 display: table;
199 content: "";
200 line-height: 0;
681} 201}
682/* line 26, ../scss/include/_base.scss */ 202.clearfix:after {
683#jqt .selectable, 203 clear: both;
684#jqt input,
685#jqt textarea {
686 -webkit-user-select: auto;
687} 204}
688/* line 30, ../scss/include/_base.scss */ 205.hide-text {
689#jqt.notransform { 206 font: 0/0 a;
690 -webkit-transform: none !important; 207 color: transparent;
208 text-shadow: none;
209 background-color: transparent;
210 border: 0;
691} 211}
692/* line 35, ../scss/include/_base.scss */ 212.input-block-level {
693#jqt > * {
694 display: block; 213 display: block;
695 left: 0;
696 top: 0;
697 min-height: 100%;
698 width: 100%; 214 width: 100%;
699 overflow-x: hidden; 215 min-height: 30px;
700 position: absolute; 216 -webkit-box-sizing: border-box;
701 z-index: 0; 217 -moz-box-sizing: border-box;
702 display: -webkit-box; 218 box-sizing: border-box;
703 display: box;
704 -webkit-box-orient: vertical;
705 box-orient: vertical;
706 -webkit-box-flex: 1;
707 box-flex: 1;
708}
709/* line 49, ../scss/include/_base.scss */
710#jqt > .current {
711 z-index: 10;
712}
713/* line 53, ../scss/include/_base.scss */
714#jqt > :not(.current) {
715 display: none;
716} 219}
717/* line 57, ../scss/include/_base.scss */ 220body {
718#jqt.touchscroll:not(.animating3d) { 221 margin: 0;
719 overflow-y: auto; 222 font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
720 -webkit-overflow-scrolling: touch; 223 font-size: 14px;
224 line-height: 20px;
225 color: #333333;
226 background-color: #ffffff;
721} 227}
722/* line 61, ../scss/include/_base.scss */ 228a {
723#jqt.touchscroll:not(.animating3d) > * { 229 color: #0088cc;
724 height: 100%; 230 text-decoration: none;
725} 231}
726/* line 64, ../scss/include/_base.scss */ 232a:hover {
727#jqt.touchscroll:not(.animating3d) .scroll { 233 color: #005580;
728 position: relative; 234 text-decoration: underline;
729 -webkit-box-flex: 1; 235}
730 box-flex: 1; 236.img-rounded {
731 overflow-y: auto; 237 -webkit-border-radius: 6px;
732 -webkit-overflow-scrolling: touch; 238 -moz-border-radius: 6px;
239 border-radius: 6px;
240}
241.img-polaroid {
242 padding: 4px;
243 background-color: #fff;
244 border: 1px solid #ccc;
245 border: 1px solid rgba(0, 0, 0, 0.2);
246 -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
247 -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
248 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
249}
250.img-circle {
251 -webkit-border-radius: 500px;
252 -moz-border-radius: 500px;
253 border-radius: 500px;
254}
255.row {
256 margin-left: -20px;
257 *zoom: 1;
258}
259.row:before,
260.row:after {
261 display: table;
262 content: "";
263 line-height: 0;
264}
265.row:after {
266 clear: both;
267}
268[class*="span"] {
269 float: left;
270 min-height: 1px;
271 margin-left: 20px;
272}
273.container,
274.navbar-static-top .container,
275.navbar-fixed-top .container,
276.navbar-fixed-bottom .container {
277 width: 940px;
278}
279.span12 {
280 width: 940px;
281}
282.span11 {
283 width: 860px;
284}
285.span10 {
286 width: 780px;
287}
288.span9 {
289 width: 700px;
290}
291.span8 {
292 width: 620px;
293}
294.span7 {
295 width: 540px;
296}
297.span6 {
298 width: 460px;
299}
300.span5 {
301 width: 380px;
302}
303.span4 {
304 width: 300px;
305}
306.span3 {
307 width: 220px;
308}
309.span2 {
310 width: 140px;
311}
312.span1 {
313 width: 60px;
314}
315.offset12 {
316 margin-left: 980px;
317}
318.offset11 {
319 margin-left: 900px;
320}
321.offset10 {
322 margin-left: 820px;
323}
324.offset9 {
325 margin-left: 740px;
326}
327.offset8 {
328 margin-left: 660px;
329}
330.offset7 {
331 margin-left: 580px;
332}
333.offset6 {
334 margin-left: 500px;
335}
336.offset5 {
337 margin-left: 420px;
338}
339.offset4 {
340 margin-left: 340px;
733} 341}
734/* line 72, ../scss/include/_base.scss */ 342.offset3 {
735#jqt .scroll { 343 margin-left: 260px;
736 -webkit-margin-collapse: separate;
737} 344}
738/* line 76, ../scss/include/_base.scss */ 345.offset2 {
739#jqt .in, 346 margin-left: 180px;
740#jqt .out {
741 -webkit-animation-duration: 250ms;
742 -webkit-animation-fill-mode: both;
743 -webkit-animation-timing-function: ease-in-out;
744} 347}
745/* line 82, ../scss/include/_base.scss */ 348.offset1 {
746#jqt .in { 349 margin-left: 100px;
747 z-index: 10;
748} 350}
749/* line 85, ../scss/include/_base.scss */ 351.row-fluid {
750#jqt .in:after { 352 width: 100%;
353 *zoom: 1;
354}
355.row-fluid:before,
356.row-fluid:after {
357 display: table;
751 content: ""; 358 content: "";
752 position: absolute; 359 line-height: 0;
360}
361.row-fluid:after {
362 clear: both;
363}
364.row-fluid [class*="span"] {
753 display: block; 365 display: block;
754 top: 0; 366 width: 100%;
755 left: 0; 367 min-height: 30px;
756 bottom: 0; 368 -webkit-box-sizing: border-box;
757 right: 0; 369 -moz-box-sizing: border-box;
370 box-sizing: border-box;
371 float: left;
372 margin-left: 2.127659574468085%;
373 *margin-left: 2.074468085106383%;
758} 374}
759/* line 94, ../scss/include/_base.scss */ 375.row-fluid [class*="span"]:first-child {
760#jqt .out { 376 margin-left: 0;
761 z-index: 0 !important;
762} 377}
763/* line 98, ../scss/include/_base.scss */ 378.row-fluid .controls-row [class*="span"] + [class*="span"] {
764#jqt.supports3d { 379 margin-left: 2.127659574468085%;
765 -webkit-perspective: 1000;
766} 380}
767/* line 101, ../scss/include/_base.scss */ 381.row-fluid .span12 {
768#jqt.supports3d > * { 382 width: 100%;
769 -webkit-transform: translate3d(0, 0, 0) rotate(0) scale(1); 383 *width: 99.94680851063829%;
770} 384}
771/* Fade */ 385.row-fluid .span11 {
772/* line 3, ../scss/include/_animations.scss */ 386 width: 91.48936170212765%;
773#jqt .fade.in { 387 *width: 91.43617021276594%;
774 -webkit-animation-name: fadeIn;
775} 388}
776/* line 7, ../scss/include/_animations.scss */ 389.row-fluid .span10 {
777#jqt .fade.out { 390 width: 82.97872340425532%;
778 z-index: 10; 391 *width: 82.92553191489361%;
779 -webkit-animation-name: fadeOut;
780} 392}
781@-webkit-keyframes fadeIn { 393.row-fluid .span9 {
782 /* line 13, ../scss/include/_animations.scss */ 394 width: 74.46808510638297%;
783 0% { 395 *width: 74.41489361702126%;
784 opacity: 0;
785 }
786 /* line 16, ../scss/include/_animations.scss */
787 100% {
788 opacity: 1;
789 }
790} 396}
791@-webkit-keyframes fadeOut { 397.row-fluid .span8 {
792 /* line 22, ../scss/include/_animations.scss */ 398 width: 65.95744680851064%;
793 0% { 399 *width: 65.90425531914893%;
794 opacity: 1;
795 }
796 /* line 25, ../scss/include/_animations.scss */
797 100% {
798 opacity: 1;
799 }
800} 400}
801/* Disolve */ 401.row-fluid .span7 {
802/* line 34, ../scss/include/_animations.scss */ 402 width: 57.44680851063829%;
803#jqt .dissolve.in { 403 *width: 57.39361702127659%;
804 -webkit-animation-name: dissolveIn;
805} 404}
806/* line 38, ../scss/include/_animations.scss */ 405.row-fluid .span6 {
807#jqt .dissolve.out { 406 width: 48.93617021276595%;
808 -webkit-animation-name: dissolveOut; 407 *width: 48.88297872340425%;
809} 408}
810@-webkit-keyframes dissolveIn { 409.row-fluid .span5 {
811 /* line 43, ../scss/include/_animations.scss */ 410 width: 40.42553191489362%;
812 0% { 411 *width: 40.37234042553192%;
813 opacity: 0;
814 }
815 /* line 46, ../scss/include/_animations.scss */
816 100% {
817 opacity: 1;
818 }
819} 412}
820@-webkit-keyframes dissolveOut { 413.row-fluid .span4 {
821 /* line 52, ../scss/include/_animations.scss */ 414 width: 31.914893617021278%;
822 0% { 415 *width: 31.861702127659576%;
823 opacity: 1;
824 }
825 /* line 55, ../scss/include/_animations.scss */
826 100% {
827 opacity: 0;
828 }
829} 416}
830/* #Popin' */ 417.row-fluid .span3 {
831/* line 64, ../scss/include/_animations.scss */ 418 width: 23.404255319148934%;
832#jqt .pop.in { 419 *width: 23.351063829787233%;
833 -webkit-animation-name: popIn;
834} 420}
835/* line 68, ../scss/include/_animations.scss */ 421.row-fluid .span2 {
836#jqt .pop.out { 422 width: 14.893617021276595%;
837 -webkit-animation-name: popOut; 423 *width: 14.840425531914894%;
838} 424}
839@-webkit-keyframes popIn { 425.row-fluid .span1 {
840 /* line 73, ../scss/include/_animations.scss */ 426 width: 6.382978723404255%;
841 0% { 427 *width: 6.329787234042553%;
842 -webkit-transform: scale(0.2);
843 opacity: 0;
844 }
845 /* line 77, ../scss/include/_animations.scss */
846 100% {
847 -webkit-transform: scale(1);
848 opacity: 1;
849 }
850} 428}
851@-webkit-keyframes popOut { 429.row-fluid .offset12 {
852 /* line 84, ../scss/include/_animations.scss */ 430 margin-left: 104.25531914893617%;
853 0% { 431 *margin-left: 104.14893617021275%;
854 -webkit-transform: scale(1);
855 opacity: 1;
856 }
857 /* line 88, ../scss/include/_animations.scss */
858 100% {
859 -webkit-transform: scale(0.2);
860 opacity: 0;
861 }
862} 432}
863/* Slide Left */ 433.row-fluid .offset12:first-child {
864/* line 98, ../scss/include/_animations.scss */ 434 margin-left: 102.12765957446808%;
865#jqt .slideleft.in { 435 *margin-left: 102.02127659574467%;
866 -webkit-animation-name: slideLeftIn;
867} 436}
868/* line 102, ../scss/include/_animations.scss */ 437.row-fluid .offset11 {
869#jqt .slideleft.out { 438 margin-left: 95.74468085106382%;
870 -webkit-animation-name: slideLeftOut; 439 *margin-left: 95.6382978723404%;
871} 440}
872@-webkit-keyframes slideLeftIn { 441.row-fluid .offset11:first-child {
873 /* line 107, ../scss/include/_animations.scss */ 442 margin-left: 93.61702127659574%;
874 0% { 443 *margin-left: 93.51063829787232%;
875 -webkit-transform: translateX(100%);
876 }
877 /* line 110, ../scss/include/_animations.scss */
878 100% {
879 -webkit-transform: translateX(0);
880 }
881} 444}
882@-webkit-keyframes slideLeftOut { 445.row-fluid .offset10 {
883 /* line 116, ../scss/include/_animations.scss */ 446 margin-left: 87.23404255319149%;
884 0% { 447 *margin-left: 87.12765957446807%;
885 -webkit-transform: translateX(0px);
886 }
887 /* line 119, ../scss/include/_animations.scss */
888 100% {
889 -webkit-transform: translateX(-100%);
890 }
891} 448}
892/* Slide Right */ 449.row-fluid .offset10:first-child {
893/* line 128, ../scss/include/_animations.scss */ 450 margin-left: 85.1063829787234%;
894#jqt .slideright.in { 451 *margin-left: 84.99999999999999%;
895 -webkit-animation-name: slideRightIn;
896} 452}
897/* line 132, ../scss/include/_animations.scss */ 453.row-fluid .offset9 {
898#jqt .slideright.out { 454 margin-left: 78.72340425531914%;
899 -webkit-animation-name: slideRightOut; 455 *margin-left: 78.61702127659572%;
900} 456}
901@-webkit-keyframes slideRightIn { 457.row-fluid .offset9:first-child {
902 /* line 137, ../scss/include/_animations.scss */ 458 margin-left: 76.59574468085106%;
903 0% { 459 *margin-left: 76.48936170212764%;
904 -webkit-transform: translateX(-100%);
905 }
906 /* line 140, ../scss/include/_animations.scss */
907 100% {
908 -webkit-transform: translateX(0);
909 }
910} 460}
911@-webkit-keyframes slideRightOut { 461.row-fluid .offset8 {
912 /* line 146, ../scss/include/_animations.scss */ 462 margin-left: 70.2127659574468%;
913 0% { 463 *margin-left: 70.10638297872339%;
914 -webkit-transform: translateX(0);
915 }
916 /* line 149, ../scss/include/_animations.scss */
917 100% {
918 -webkit-transform: translateX(100%);
919 }
920} 464}
921/* Slide Up */ 465.row-fluid .offset8:first-child {
922/* line 158, ../scss/include/_animations.scss */ 466 margin-left: 68.08510638297872%;
923#jqt .slideup.in { 467 *margin-left: 67.9787234042553%;
924 z-index: 10;
925 -webkit-animation-name: slideUpIn;
926} 468}
927/* line 162, ../scss/include/_animations.scss */ 469.row-fluid .offset7 {
928#jqt .slideup.out { 470 margin-left: 61.70212765957446%;
929 z-index: 0; 471 *margin-left: 61.59574468085106%;
930 -webkit-animation-name: slideUpOut;
931} 472}
932@-webkit-keyframes slideUpIn { 473.row-fluid .offset7:first-child {
933 /* line 168, ../scss/include/_animations.scss */ 474 margin-left: 59.574468085106375%;
934 0% { 475 *margin-left: 59.46808510638297%;
935 -webkit-transform: translateY(100%);
936 }
937 /* line 171, ../scss/include/_animations.scss */
938 100% {
939 -webkit-transform: translateY(0);
940 }
941} 476}
942@-webkit-keyframes slideUpOut { 477.row-fluid .offset6 {
943 /* line 177, ../scss/include/_animations.scss */ 478 margin-left: 53.191489361702125%;
944 0% { 479 *margin-left: 53.085106382978715%;
945 -webkit-transform: translateY(0);
946 }
947 /* line 180, ../scss/include/_animations.scss */
948 100% {
949 -webkit-transform: translateY(0);
950 }
951} 480}
952/* Slide Down */ 481.row-fluid .offset6:first-child {
953/* line 189, ../scss/include/_animations.scss */ 482 margin-left: 51.063829787234035%;
954#jqt .slidedown.in { 483 *margin-left: 50.95744680851063%;
955 z-index: 0;
956 -webkit-animation-name: slideDownIn;
957} 484}
958/* line 193, ../scss/include/_animations.scss */ 485.row-fluid .offset5 {
959#jqt .slidedown.out { 486 margin-left: 44.68085106382979%;
960 z-index: 10; 487 *margin-left: 44.57446808510638%;
961 -webkit-animation-name: slideDownOut;
962} 488}
963@-webkit-keyframes slideDownIn { 489.row-fluid .offset5:first-child {
964 /* line 199, ../scss/include/_animations.scss */ 490 margin-left: 42.5531914893617%;
965 0% { 491 *margin-left: 42.4468085106383%;
966 -webkit-transform: translateY(0);
967 }
968 /* line 202, ../scss/include/_animations.scss */
969 100% {
970 -webkit-transform: translateY(0);
971 }
972} 492}
973@-webkit-keyframes slideDownOut { 493.row-fluid .offset4 {
974 /* line 208, ../scss/include/_animations.scss */ 494 margin-left: 36.170212765957444%;
975 0% { 495 *margin-left: 36.06382978723405%;
976 -webkit-transform: translateY(0);
977 }
978 /* line 211, ../scss/include/_animations.scss */
979 100% {
980 -webkit-transform: translateY(100%);
981 }
982} 496}
983/* Flip Left */ 497.row-fluid .offset4:first-child {
984/* line 220, ../scss/include/_animations.scss */ 498 margin-left: 34.04255319148936%;
985#jqt .flipleft { 499 *margin-left: 33.93617021276596%;
986 -webkit-backface-visibility: hidden;
987} 500}
988/* line 224, ../scss/include/_animations.scss */ 501.row-fluid .offset3 {
989#jqt .flipleft.in { 502 margin-left: 27.659574468085104%;
990 -webkit-animation-name: flipLeftIn; 503 *margin-left: 27.5531914893617%;
991} 504}
992/* line 228, ../scss/include/_animations.scss */ 505.row-fluid .offset3:first-child {
993#jqt .flipleft.out { 506 margin-left: 25.53191489361702%;
994 -webkit-animation-name: flipLeftOut; 507 *margin-left: 25.425531914893618%;
995} 508}
996@-webkit-keyframes flipLeftIn { 509.row-fluid .offset2 {
997 /* line 233, ../scss/include/_animations.scss */ 510 margin-left: 19.148936170212764%;
998 0% { 511 *margin-left: 19.04255319148936%;
999 -webkit-transform: rotateY(180deg) scale(0.8);
1000 }
1001 /* line 236, ../scss/include/_animations.scss */
1002 100% {
1003 -webkit-transform: rotateY(0deg) scale(1);
1004 }
1005} 512}
1006@-webkit-keyframes flipLeftOut { 513.row-fluid .offset2:first-child {
1007 /* line 242, ../scss/include/_animations.scss */ 514 margin-left: 17.02127659574468%;
1008 0% { 515 *margin-left: 16.914893617021278%;
1009 -webkit-transform: rotateY(0deg) scale(1);
1010 }
1011 /* line 245, ../scss/include/_animations.scss */
1012 100% {
1013 -webkit-transform: rotateY(-180deg) scale(0.8);
1014 }
1015} 516}
1016/* Flip Right */ 517.row-fluid .offset1 {
1017/* line 254, ../scss/include/_animations.scss */ 518 margin-left: 10.638297872340425%;
1018#jqt .flipright { 519 *margin-left: 10.53191489361702%;
1019 -webkit-backface-visibility: hidden;
1020} 520}
1021/* line 258, ../scss/include/_animations.scss */ 521.row-fluid .offset1:first-child {
1022#jqt .flipright.in { 522 margin-left: 8.51063829787234%;
1023 -webkit-animation-name: flipRightIn; 523 *margin-left: 8.404255319148938%;
1024} 524}
1025/* line 262, ../scss/include/_animations.scss */ 525[class*="span"].hide,
1026#jqt .flipright.out { 526.row-fluid [class*="span"].hide {
1027 -webkit-animation-name: flipRightOut; 527 display: none;
1028} 528}
1029@-webkit-keyframes flipRightIn { 529[class*="span"].pull-right,
1030 /* line 267, ../scss/include/_animations.scss */ 530.row-fluid [class*="span"].pull-right {
1031 0% { 531 float: right;
1032 -webkit-transform: rotateY(-180deg) scale(0.8);
1033 }
1034 /* line 270, ../scss/include/_animations.scss */
1035 100% {
1036 -webkit-transform: rotateY(0deg) scale(1);
1037 }
1038} 532}
1039@-webkit-keyframes flipRightOut { 533.container {
1040 /* line 276, ../scss/include/_animations.scss */ 534 margin-right: auto;
1041 0% { 535 margin-left: auto;
1042 -webkit-transform: rotateY(0deg) scale(1); 536 *zoom: 1;
1043 }
1044 /* line 279, ../scss/include/_animations.scss */
1045 100% {
1046 -webkit-transform: rotateY(180deg) scale(0.8);
1047 }
1048} 537}
1049/* Swap Right */ 538.container:before,
1050/* line 288, ../scss/include/_animations.scss */ 539.container:after {
1051#jqt .swapright { 540 display: table;
1052 -webkit-animation-duration: .7s; 541 content: "";
1053 -webkit-transform: perspective(800); 542 line-height: 0;
1054 -webkit-animation-timing-function: ease-out;
1055} 543}
1056/* line 293, ../scss/include/_animations.scss */ 544.container:after {
1057#jqt .swapright.in { 545 clear: both;
1058 -webkit-animation-name: swapRightIn;
1059} 546}
1060/* line 296, ../scss/include/_animations.scss */ 547.container-fluid {
1061#jqt .swapright.out { 548 padding-right: 20px;
1062 -webkit-animation-name: swapRightOut; 549 padding-left: 20px;
550 *zoom: 1;
1063} 551}
1064@-webkit-keyframes swapRightIn { 552.container-fluid:before,
1065 /* line 301, ../scss/include/_animations.scss */ 553.container-fluid:after {
1066 0% { 554 display: table;
1067 -webkit-transform: translate3d(0px, 0px, -800px) rotateY(70deg); 555 content: "";
1068 opacity: 0; 556 line-height: 0;
1069 }
1070 /* line 305, ../scss/include/_animations.scss */
1071 35% {
1072 -webkit-transform: translate3d(-180px, 0px, -400px) rotateY(20deg);
1073 opacity: 1;
1074 }
1075 /* line 309, ../scss/include/_animations.scss */
1076 100% {
1077 -webkit-transform: translate3d(0px, 0px, 0px) rotateY(0deg);
1078 opacity: 1;
1079 }
1080} 557}
1081@-webkit-keyframes swapRightOut { 558.container-fluid:after {
1082 /* line 316, ../scss/include/_animations.scss */ 559 clear: both;
1083 0% {
1084 -webkit-transform: translate3d(0px, 0px, 0px) rotateY(0deg);
1085 opacity: 1;
1086 }
1087 /* line 320, ../scss/include/_animations.scss */
1088 35% {
1089 -webkit-transform: translate3d(180px, 0px, -400px) rotateY(-20deg);
1090 opacity: .5;
1091 }
1092 /* line 324, ../scss/include/_animations.scss */
1093 100% {
1094 -webkit-transform: translate3d(0px, 0px, -800px) rotateY(-70deg);
1095 opacity: 0;
1096 }
1097}
1098/* Swap Left */
1099/* line 332, ../scss/include/_animations.scss */
1100#jqt .swapleft {
1101 -webkit-animation-duration: .7s;
1102 -webkit-transform: perspective(800);
1103 -webkit-animation-timing-function: ease-out;
1104}
1105/* line 337, ../scss/include/_animations.scss */
1106#jqt .swapleft.in {
1107 -webkit-animation-name: swapLeftIn;
1108}
1109/* line 340, ../scss/include/_animations.scss */
1110#jqt .swapleft.out {
1111 -webkit-animation-name: swapLeftOut;
1112}
1113@-webkit-keyframes swapLeftIn {
1114 /* line 345, ../scss/include/_animations.scss */
1115 0% {
1116 -webkit-transform: translate3d(0px, 0px, -800px) rotateY(-70deg);
1117 opacity: 0;
1118 }
1119 /* line 349, ../scss/include/_animations.scss */
1120 35% {
1121 -webkit-transform: translate3d(180px, 0px, -400px) rotateY(-20deg);
1122 opacity: 1;
1123 }
1124 /* line 353, ../scss/include/_animations.scss */
1125 100% {
1126 opacity: 1;
1127 -webkit-transform: translate3d(0px, 0px, 0px) rotateY(0deg);
1128 }
1129} 560}
1130@-webkit-keyframes swapLeftOut { 561p {
1131 /* line 360, ../scss/include/_animations.scss */ 562 margin: 0 0 10px;
1132 0% {
1133 -webkit-transform: translate3d(0px, 0px, 0px) rotateY(0deg);
1134 opacity: 1;
1135 }
1136 /* line 364, ../scss/include/_animations.scss */
1137 35% {
1138 -webkit-transform: translate3d(-180px, 0px, -400px) rotateY(20deg);
1139 opacity: .5;
1140 }
1141 /* line 368, ../scss/include/_animations.scss */
1142 100% {
1143 -webkit-transform: translate3d(0px, 0px, -800px) rotateY(70deg);
1144 opacity: 0;
1145 }
1146}
1147/* Cube Left */
1148/* line 382, ../scss/include/_animations.scss */
1149#jqt .cubeleft.in,
1150#jqt .cubeleft.out,
1151#jqt .cuberight.in,
1152#jqt .cuberight.out {
1153 -webkit-animation-duration: .6s;
1154 -webkit-transform: perspective(800);
1155}
1156/* line 389, ../scss/include/_animations.scss */
1157#jqt .cubeleft.in {
1158 -webkit-transform-origin: 0% 50%;
1159 -webkit-animation-name: cubeLeftIn;
1160}
1161/* line 394, ../scss/include/_animations.scss */
1162#jqt .cubeleft.out {
1163 -webkit-transform-origin: 100% 50%;
1164 -webkit-animation-name: cubeLeftOut;
1165}
1166@-webkit-keyframes cubeLeftIn {
1167 /* line 400, ../scss/include/_animations.scss */
1168 0% {
1169 -webkit-transform: rotateY(90deg) translateZ(320px);
1170 opacity: .5;
1171 }
1172 /* line 404, ../scss/include/_animations.scss */
1173 100% {
1174 -webkit-transform: rotateY(0deg) translateZ(0) translateX(0);
1175 opacity: 1;
1176 }
1177} 563}
1178@-webkit-keyframes cubeLeftOut { 564.lead {
1179 /* line 411, ../scss/include/_animations.scss */ 565 margin-bottom: 20px;
1180 0% { 566 font-size: 21px;
1181 -webkit-transform: rotateY(0deg) translateZ(0) translateX(0); 567 font-weight: 200;
1182 opacity: 1; 568 line-height: 30px;
1183 }
1184 /* line 415, ../scss/include/_animations.scss */
1185 100% {
1186 -webkit-transform: rotateY(-90deg) translateZ(320px);
1187 opacity: .5;
1188 }
1189} 569}
1190/* Cube Right */ 570small {
1191/* line 423, ../scss/include/_animations.scss */ 571 font-size: 85%;
1192#jqt .cuberight.in {
1193 -webkit-transform-origin: 100% 50%;
1194 -webkit-animation-name: cubeRightIn;
1195} 572}
1196/* line 428, ../scss/include/_animations.scss */ 573strong {
1197#jqt .cuberight.out { 574 font-weight: bold;
1198 -webkit-transform-origin: 0% 50%;
1199 -webkit-animation-name: cubeRightOut;
1200} 575}
1201@-webkit-keyframes cubeRightIn { 576em {
1202 /* line 434, ../scss/include/_animations.scss */ 577 font-style: italic;
1203 0% {
1204 -webkit-transform: rotateY(-90deg) translateZ(320px);
1205 opacity: .5;
1206 }
1207 /* line 438, ../scss/include/_animations.scss */
1208 100% {
1209 -webkit-transform: rotateY(0deg) translateZ(0) translateX(0);
1210 opacity: 1;
1211 }
1212} 578}
1213@-webkit-keyframes cubeRightOut { 579cite {
1214 /* line 445, ../scss/include/_animations.scss */ 580 font-style: normal;
1215 0% {
1216 -webkit-transform: rotateY(0deg) translateZ(0) translateX(0);
1217 opacity: 1;
1218 }
1219 /* line 449, ../scss/include/_animations.scss */
1220 100% {
1221 -webkit-transform: rotateY(90deg) translateZ(320px);
1222 opacity: .5;
1223 }
1224} 581}
1225/* line 5, ../scss/include/_skeleton.scss */ 582.muted {
1226body { 583 color: #999999;
1227 background: black;
1228}
1229/* line 9, ../scss/include/_skeleton.scss */
1230.base-chevron,
1231#jqt ul li.arrow:after,
1232#jqt ul li.forward:after {
1233 content: '›';
1234 width: 22px;
1235 height: 100%;
1236 vertical-align: middle;
1237 font-size: 30px;
1238 line-height: 38px;
1239 font-family: Futura, "Futura Condensed", Helvetica, Arial, sans-serif;
1240 font-weight: bold;
1241 filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=60);
1242 opacity: 0.6;
1243 position: absolute;
1244 right: 0;
1245 top: 0;
1246 pointer-events: none;
1247 z-index: 10;
1248}
1249/* line 26, ../scss/include/_skeleton.scss */
1250.base-flatlists,
1251#jqt ul.metal,
1252#jqt ul.edgetoedge,
1253#jqt ul.plastic {
1254 margin: 0;
1255 padding: 0;
1256 border-width: 0 0 0 1px;
1257 -webkit-border-radius: 0;
1258 border-radius: 0;
1259} 584}
1260/* line 35, ../scss/include/_skeleton.scss */ 585a.muted:hover {
1261#jqt h1, 586 color: #808080;
1262#jqt h2 {
1263 font: bold 18px "Helvetica Neue", Helvetica;
1264 margin: 10px 20px 6px;
1265 color: #bbbcbe;
1266 text-shadow: #3c3d3e 0 -1px 0;
1267} 587}
1268/* line 41, ../scss/include/_skeleton.scss */ 588.text-warning {
1269#jqt .toolbar { 589 color: #c09853;
1270 -webkit-box-sizing: border-box;
1271 box-sizing: border-box;
1272 -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 6px;
1273 box-shadow: rgba(0, 0, 0, 0.4) 0 1px 6px;
1274 border-bottom: 1px solid black;
1275 z-index: 10;
1276 position: relative;
1277 padding: 10px;
1278 height: 44px;
1279} 590}
1280/* line 52, ../scss/include/_skeleton.scss */ 591a.text-warning:hover {
1281#jqt .toolbar > h1 { 592 color: #a47e3c;
1282 position: absolute; 593}
1283 overflow: hidden; 594.text-error {
1284 left: 50%; 595 color: #b94a48;
1285 bottom: 9px; 596}
1286 margin: 1px 0 0 -75px; 597a.text-error:hover {
1287 width: 150px; 598 color: #953b39;
1288 font-size: 20px; 599}
1289 font-weight: bold; 600.text-info {
1290 line-height: 1.3em; 601 color: #3a87ad;
1291 text-align: center; 602}
1292 text-overflow: ellipsis; 603a.text-info:hover {
1293 white-space: nowrap; 604 color: #2d6987;
1294 color: white; 605}
1295 text-shadow: #161717 0 -1px 0; 606.text-success {
1296} 607 color: #468847;
1297/* line 71, ../scss/include/_skeleton.scss */ 608}
1298#jqt.black-translucent .toolbar { 609a.text-success:hover {
1299 padding-top: 30px; 610 color: #356635;
1300 height: 64px; 611}
1301} 612h1,
1302/* line 75, ../scss/include/_skeleton.scss */ 613h2,
1303#jqt.landscape .toolbar > h1 { 614h3,
1304 margin-left: -125px; 615h4,
1305 width: 250px; 616h5,
1306} 617h6 {
1307/* line 80, ../scss/include/_skeleton.scss */ 618 margin: 10px 0;
1308#jqt .button,
1309#jqt .back,
1310#jqt .cancel,
1311#jqt .add {
1312 position: absolute;
1313 overflow: hidden;
1314 width: auto;
1315 height: 30px;
1316 font-family: inherit; 619 font-family: inherit;
1317 font-size: 12px;
1318 font-weight: bold; 620 font-weight: bold;
1319 line-height: 30px; 621 line-height: 20px;
1320 text-overflow: ellipsis; 622 color: inherit;
1321 text-decoration: none; 623 text-rendering: optimizelegibility;
1322 white-space: nowrap; 624}
1323 background: none; 625h1 small,
1324 bottom: 6px; 626h2 small,
1325 right: 10px; 627h3 small,
1326 margin: 0; 628h4 small,
1327 padding: 0 10px; 629h5 small,
1328 color: #e2e3e3; 630h6 small {
1329 text-shadow: #000000 0 -1px 0; 631 font-weight: normal;
1330 -webkit-box-shadow: rgba(255, 255, 255, 0.2) 0 1px 0, rgba(0, 0, 0, 0.2) 0 1px 2px inset; 632 line-height: 1;
1331 box-shadow: rgba(255, 255, 255, 0.2) 0 1px 0, rgba(0, 0, 0, 0.2) 0 1px 2px inset; 633 color: #999999;
1332 border: 1px solid black; 634}
1333 -webkit-border-radius: 5px; 635h1,
1334 border-radius: 5px; 636h2,
1335 background-image: none; 637h3 {
1336 background-color: #0a0a0a; 638 line-height: 40px;
1337 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2f3031), color-stop(50%, #161717), color-stop(51%, #0a0a0a), color-stop(100%, #000000)); 639}
1338 background-image: -webkit-linear-gradient(top, #2f3031, #161717 50%, #0a0a0a 51%, #000000); 640h1 {
1339 background-image: linear-gradient(top, #2f3031, #161717 50%, #0a0a0a 51%, #000000); 641 font-size: 38.5px;
1340} 642}
1341/* line 107, ../scss/include/_skeleton.scss */ 643h2 {
1342#jqt .button.active, 644 font-size: 31.5px;
1343#jqt .back.active, 645}
1344#jqt .cancel.active, 646h3 {
1345#jqt .add.active { 647 font-size: 24.5px;
1346 border-color: black; 648}
1347 background-image: none; 649h4 {
1348 background-color: black; 650 font-size: 17.5px;
1349 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #262627), color-stop(50%, #0d0d0d), color-stop(51%, #000000), color-stop(100%, #000000)); 651}
1350 background-image: -webkit-linear-gradient(top, #262627, #0d0d0d 50%, #000000 51%, #000000); 652h5 {
1351 background-image: linear-gradient(top, #262627, #0d0d0d 50%, #000000 51%, #000000); 653 font-size: 14px;
1352 color: #d8d9d9; 654}
1353 text-shadow: #000000 0 -1px 0; 655h6 {
1354} 656 font-size: 11.9px;
1355/* line 114, ../scss/include/_skeleton.scss */ 657}
1356#jqt .back { 658h1 small {
1357 max-width: 60px; 659 font-size: 24.5px;
1358 margin-left: 15px; 660}
1359 overflow: visible; 661h2 small {
662 font-size: 17.5px;
663}
664h3 small {
665 font-size: 14px;
666}
667h4 small {
668 font-size: 14px;
669}
670.page-header {
671 padding-bottom: 9px;
672 margin: 20px 0 30px;
673 border-bottom: 1px solid #eeeeee;
674}
675ul,
676ol {
677 padding: 0;
678 margin: 0 0 10px 25px;
679}
680ul ul,
681ul ol,
682ol ol,
683ol ul {
684 margin-bottom: 0;
685}
686li {
687 line-height: 20px;
688}
689ul.unstyled,
690ol.unstyled {
691 margin-left: 0;
692 list-style: none;
693}
694ul.inline,
695ol.inline {
696 margin-left: 0;
697 list-style: none;
698}
699ul.inline > li,
700ol.inline > li {
701 display: inline-block;
1360 padding-left: 5px; 702 padding-left: 5px;
703 padding-right: 5px;
1361} 704}
1362/* line 121, ../scss/include/_skeleton.scss */ 705dl {
1363#jqt .back:after, 706 margin-bottom: 20px;
1364#jqt .back:before {
1365 content: '';
1366 position: absolute;
1367 width: 20px;
1368 height: 20px;
1369 top: 1px;
1370 left: 1px;
1371 -webkit-transform: rotate(45deg) translate3d(0.2px, 0, 0);
1372 transform: rotate(45deg) translate3d(0.2px, 0, 0);
1373 -webkit-transform-origin: 0 0;
1374 transform-origin: 0 0;
1375 background-image: none;
1376 background-color: #0a0a0a;
1377 background-image: -webkit-gradient(linear, 0% 0%, 100% 100%, color-stop(0%, #2f3031), color-stop(50%, #161717), color-stop(51%, #0a0a0a), color-stop(100%, #000000));
1378 background-image: -webkit-linear-gradient(top left, #2f3031, #161717 50%, #0a0a0a 51%, #000000);
1379 background-image: linear-gradient(top left, #2f3031, #161717 50%, #0a0a0a 51%, #000000);
1380 background-size: 100% 98%;
1381 -webkit-border-radius: 0 0 0 2px;
1382 border-radius: 0 0 0 2px;
1383 -webkit-mask-image: -webkit-linear-gradient(45deg, #000000, #000000 15px, rgba(0, 0, 0, 0) 15px);
1384 -webkit-mask-image: -webkit-gradient(linear, left bottom, right top, from(#000000), color-stop(50%, #000000), color-stop(50%, rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0)));
1385 -webkit-mask-clip: border-box;
1386 -webkit-background-clip: content-box;
1387}
1388/* line 149, ../scss/include/_skeleton.scss */
1389#jqt .back:after {
1390 -webkit-box-shadow: rgba(0, 0, 0, 0.2) 1px 0 0 inset, rgba(0, 0, 0, 0.2) 0 -1px 0 inset;
1391 box-shadow: rgba(0, 0, 0, 0.2) 1px 0 0 inset, rgba(0, 0, 0, 0.2) 0 -1px 0 inset;
1392}
1393/* line 152, ../scss/include/_skeleton.scss */
1394#jqt .back:before {
1395 margin-left: -1px;
1396 background: black none;
1397} 707}
1398/* line 157, ../scss/include/_skeleton.scss */ 708dt,
1399#jqt .back.active:after { 709dd {
1400 background-image: none; 710 line-height: 20px;
1401 background-color: black; 711}
1402 background-image: -webkit-gradient(linear, 0% 0%, 100% 100%, color-stop(0%, #262627), color-stop(50%, #0d0d0d), color-stop(51%, #000000), color-stop(100%, #000000)); 712dt {
1403 background-image: -webkit-linear-gradient(left top, #262627, #0d0d0d 50%, #000000 51%, #000000);
1404 background-image: linear-gradient(left top, #262627, #0d0d0d 50%, #000000 51%, #000000);
1405}
1406/* line 160, ../scss/include/_skeleton.scss */
1407#jqt .back.active:before {
1408 background-color: black;
1409}
1410/* line 166, ../scss/include/_skeleton.scss */
1411#jqt .blueButton {
1412 background-image: #2f7ce3, glossy;
1413 color: white;
1414 text-shadow: #1a63c5 0 -1px 0;
1415}
1416/* line 170, ../scss/include/_skeleton.scss */
1417#jqt .whiteButton,
1418#jqt .grayButton,
1419#jqt .redButton,
1420#jqt .blueButton,
1421#jqt .greenButton {
1422 display: block;
1423 font-size: 20px;
1424 font-weight: bold;
1425 margin: 10px 20px;
1426 padding: 10px;
1427 text-align: center;
1428 text-decoration: inherit;
1429 -webkit-border-radius: 8px;
1430 border-radius: 8px;
1431 -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 3px, rgba(0, 0, 0, 0.4) 0 0 0 5px, rgba(255, 255, 255, 0.3) 0 1px 0 5px;
1432 box-shadow: rgba(0, 0, 0, 0.4) 0 1px 3px, rgba(0, 0, 0, 0.4) 0 0 0 5px, rgba(255, 255, 255, 0.3) 0 1px 0 5px;
1433}
1434/* line 185, ../scss/include/_skeleton.scss */
1435#jqt .whiteButton.active,
1436#jqt .whiteButton:active,
1437#jqt .grayButton.active,
1438#jqt .grayButton:active,
1439#jqt .redButton.active,
1440#jqt .redButton:active,
1441#jqt .blueButton.active,
1442#jqt .blueButton:active,
1443#jqt .greenButton.active,
1444#jqt .greenButton:active {
1445 background-image: none;
1446 background-color: #3c8101;
1447 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5fcd01), color-stop(50%, #479b01), color-stop(51%, #3c8101), color-stop(100%, #306801));
1448 background-image: -webkit-linear-gradient(top, #5fcd01, #479b01 50%, #3c8101 51%, #306801);
1449 background-image: linear-gradient(top, #5fcd01, #479b01 50%, #3c8101 51%, #306801);
1450 color: white;
1451 text-shadow: #244f00 0 -1px 0;
1452}
1453/* line 191, ../scss/include/_skeleton.scss */
1454#jqt .whiteButton {
1455 background-image: none;
1456 background-color: #eeeeee;
1457 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(50%, #fbfbfb), color-stop(51%, #eeeeee), color-stop(100%, #e1e1e1));
1458 background-image: -webkit-linear-gradient(top, #ffffff, #fbfbfb 50%, #eeeeee 51%, #e1e1e1);
1459 background-image: linear-gradient(top, #ffffff, #fbfbfb 50%, #eeeeee 51%, #e1e1e1);
1460 color: #151515;
1461 text-shadow: white 0 1px 0;
1462}
1463/* line 195, ../scss/include/_skeleton.scss */
1464#jqt .grayButton {
1465 background-image: none;
1466 background-color: #444444;
1467 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #6a6a6a), color-stop(50%, #515151), color-stop(51%, #444444), color-stop(100%, #373737));
1468 background-image: -webkit-linear-gradient(top, #6a6a6a, #515151 50%, #444444 51%, #373737);
1469 background-image: linear-gradient(top, #6a6a6a, #515151 50%, #444444 51%, #373737);
1470 color: white;
1471 text-shadow: #2b2b2b 0 -1px 0;
1472}
1473/* line 200, ../scss/include/_skeleton.scss */
1474#jqt .redButton {
1475 background-image: none;
1476 background-color: #d83b38;
1477 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e57a78), color-stop(50%, #dc504d), color-stop(51%, #d83b38), color-stop(100%, #ce2c28));
1478 background-image: -webkit-linear-gradient(top, #e57a78, #dc504d 50%, #d83b38 51%, #ce2c28);
1479 background-image: linear-gradient(top, #e57a78, #dc504d 50%, #d83b38 51%, #ce2c28);
1480 color: white;
1481 text-shadow: #b92724 0 -1px 0;
1482}
1483/* line 204, ../scss/include/_skeleton.scss */
1484#jqt .redButton.active,
1485#jqt .redButton:active {
1486 background-image: none;
1487 background-color: #c12926;
1488 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #de5856), color-stop(50%, #d52e2b), color-stop(51%, #c12926), color-stop(100%, #ac2422));
1489 background-image: -webkit-linear-gradient(top, #de5856, #d52e2b 50%, #c12926 51%, #ac2422);
1490 background-image: linear-gradient(top, #de5856, #d52e2b 50%, #c12926 51%, #ac2422);
1491 color: white;
1492 text-shadow: #97201e 0 -1px 0;
1493}
1494/* line 211, ../scss/include/_skeleton.scss */
1495#jqt .greenButton {
1496 background-image: none;
1497 background-color: #53b401;
1498 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #76fe04), color-stop(50%, #5fcd01), color-stop(51%, #53b401), color-stop(100%, #479b01));
1499 background-image: -webkit-linear-gradient(top, #76fe04, #5fcd01 50%, #53b401 51%, #479b01);
1500 background-image: linear-gradient(top, #76fe04, #5fcd01 50%, #53b401 51%, #479b01);
1501 color: white;
1502 text-shadow: #3c8101 0 -1px 0;
1503}
1504/* line 216, ../scss/include/_skeleton.scss */
1505#jqt .leftButton,
1506#jqt .cancel,
1507#jqt .back {
1508 left: 6px;
1509 right: auto;
1510}
1511/* line 221, ../scss/include/_skeleton.scss */
1512#jqt .add {
1513 font-size: 24px;
1514 line-height: 24px;
1515 font-weight: bold; 713 font-weight: bold;
1516} 714}
1517/* line 229, ../scss/include/_skeleton.scss */ 715dd {
1518#jqt ul { 716 margin-left: 10px;
1519 padding: 0;
1520 margin: 5px 10px 10px 10px;
1521 -webkit-margin-collapse: separate;
1522}
1523/* line 231, ../scss/include/_skeleton.scss */
1524#jqt ul,
1525#jqt ul.individual li {
1526 background-color: #555658;
1527 color: #d5d6d7;
1528 text-shadow: #3c3d3e 0 -1px 0;
1529 border: 1px solid #2f3031;
1530 font: bold 18px "Helvetica Neue", Helvetica;
1531}
1532/* line 240, ../scss/include/_skeleton.scss */
1533#jqt ul:first-child {
1534 margin-top: 15px;
1535} 717}
1536/* line 246, ../scss/include/_skeleton.scss */ 718.dl-horizontal {
1537#jqt ul li { 719 *zoom: 1;
1538 border-top: 1px solid #48494b;
1539 list-style-type: none;
1540 overflow: hidden;
1541 padding: 10px;
1542 -webkit-transform: translate3d(0, 0, 0);
1543 /* expensive way to avoid flickr */
1544
1545} 720}
1546/* line 253, ../scss/include/_skeleton.scss */ 721.dl-horizontal:before,
1547#jqt ul li a { 722.dl-horizontal:after {
1548 text-decoration: none; 723 display: table;
1549 text-overflow: ellipsis; 724 content: "";
1550 white-space: nowrap; 725 line-height: 0;
1551 overflow: hidden; 726}
1552 display: block; 727.dl-horizontal:after {
1553 padding: 10px; 728 clear: both;
1554 margin: -10px; 729}
1555 -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 730.dl-horizontal dt {
1556 -webkit-transform: translateZ(0); 731 float: left;
1557 color: white; 732 width: 160px;
1558 text-shadow: #3c3d3e 0 -1px 0; 733 clear: left;
1559}
1560/* line 265, ../scss/include/_skeleton.scss */
1561#jqt ul li a.active {
1562 background-image: none;
1563 background-color: #53b401;
1564 -webkit-box-shadow: #5cc801 0 1px 0px inset;
1565 box-shadow: #5cc801 0 1px 0px inset;
1566 color: white;
1567 text-shadow: #3c8101 0 -1px 0;
1568}
1569/* line 270, ../scss/include/_skeleton.scss */
1570#jqt ul li a.active small {
1571 color: #a0fe50;
1572 text-shadow: #000000 0 -1px 0;
1573}
1574/* line 271, ../scss/include/_skeleton.scss */
1575#jqt ul li a.active small.counter {
1576 background-color: #306801;
1577}
1578/* line 280, ../scss/include/_skeleton.scss */
1579#jqt ul li small {
1580 color: #53b401;
1581 font: 16px "Helvetica Neue", Helvetica;
1582 text-align: right; 734 text-align: right;
735 overflow: hidden;
1583 text-overflow: ellipsis; 736 text-overflow: ellipsis;
1584 white-space: nowrap; 737 white-space: nowrap;
1585 overflow: hidden; 738}
739.dl-horizontal dd {
740 margin-left: 180px;
741}
742hr {
743 margin: 20px 0;
744 border: 0;
745 border-top: 1px solid #eeeeee;
746 border-bottom: 1px solid #ffffff;
747}
748abbr[title],
749abbr[data-original-title] {
750 cursor: help;
751 border-bottom: 1px dotted #999999;
752}
753abbr.initialism {
754 font-size: 90%;
755 text-transform: uppercase;
756}
757blockquote {
758 padding: 0 0 0 15px;
759 margin: 0 0 20px;
760 border-left: 5px solid #eeeeee;
761}
762blockquote p {
763 margin-bottom: 0;
764 font-size: 16px;
765 font-weight: 300;
766 line-height: 25px;
767}
768blockquote small {
1586 display: block; 769 display: block;
1587 width: 23%; 770 line-height: 20px;
1588 position: relative; 771 color: #999999;
1589 z-index: 20; 772}
773blockquote small:before {
774 content: '\2014 \00A0';
775}
776blockquote.pull-right {
1590 float: right; 777 float: right;
1591 line-height: 16px; 778 padding-right: 15px;
1592 padding: 2px 8px 4px 8px; 779 padding-left: 0;
1593} 780 border-right: 5px solid #eeeeee;
1594/* line 295, ../scss/include/_skeleton.scss */ 781 border-left: 0;
1595#jqt ul li small.counter { 782}
1596 background: #2f3031; 783blockquote.pull-right p,
1597 color: #949698; 784blockquote.pull-right small {
1598 text-shadow: #0a0a0a 0 -1px 0; 785 text-align: right;
1599 z-index: 10; 786}
1600 font-size: 16px; 787blockquote.pull-right small:before {
1601 font-weight: bold; 788 content: '';
789}
790blockquote.pull-right small:after {
791 content: '\00A0 \2014';
792}
793q:before,
794q:after,
795blockquote:before,
796blockquote:after {
797 content: "";
798}
799address {
800 display: block;
801 margin-bottom: 20px;
802 font-style: normal;
803 line-height: 20px;
804}
805code,
806pre {
807 padding: 0 3px 2px;
808 font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
809 font-size: 12px;
810 color: #333333;
1602 -webkit-border-radius: 3px; 811 -webkit-border-radius: 3px;
812 -moz-border-radius: 3px;
1603 border-radius: 3px; 813 border-radius: 3px;
814}
815code {
816 padding: 2px 4px;
817 color: #d14;
818 background-color: #f7f7f9;
819 border: 1px solid #e1e1e8;
820 white-space: nowrap;
821}
822pre {
1604 display: block; 823 display: block;
1605 width: auto; 824 padding: 9.5px;
825 margin: 0 0 10px;
826 font-size: 13px;
827 line-height: 20px;
828 word-break: break-all;
829 word-wrap: break-word;
830 white-space: pre;
831 white-space: pre-wrap;
832 background-color: #f5f5f5;
833 border: 1px solid #ccc;
834 border: 1px solid rgba(0, 0, 0, 0.15);
835 -webkit-border-radius: 4px;
836 -moz-border-radius: 4px;
837 border-radius: 4px;
838}
839pre.prettyprint {
840 margin-bottom: 20px;
1606} 841}
1607/* line 311, ../scss/include/_skeleton.scss */ 842pre code {
1608#jqt ul li ::-webkit-input-placeholder { 843 padding: 0;
1609 color: #949698; 844 color: inherit;
1610 text-shadow: #3c3d3e 0 -1px 0; 845 white-space: pre;
1611} 846 white-space: pre-wrap;
1612/* line 322, ../scss/include/_skeleton.scss */ 847 background-color: transparent;
1613#jqt ul li input[type="text"],
1614#jqt ul li input[type="password"],
1615#jqt ul li input[type="tel"],
1616#jqt ul li input[type="number"],
1617#jqt ul li input[type="search"],
1618#jqt ul li input[type="email"],
1619#jqt ul li input[type="url"],
1620#jqt ul li textarea,
1621#jqt ul li select {
1622 color: white;
1623 text-shadow: #3c3d3e 0 -1px 0;
1624 background: transparent url("data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==");
1625 border: 0; 848 border: 0;
1626 font: normal 17px "Helvetica Neue", Helvetica; 849}
850.pre-scrollable {
851 max-height: 340px;
852 overflow-y: scroll;
853}
854form {
855 margin: 0 0 20px;
856}
857fieldset {
1627 padding: 0; 858 padding: 0;
1628 display: inline-block; 859 margin: 0;
1629 margin-left: 0px; 860 border: 0;
1630 width: 100%;
1631 -webkit-appearance: textarea;
1632} 861}
1633/* line 333, ../scss/include/_skeleton.scss */ 862legend {
1634#jqt ul li textarea { 863 display: block;
1635 height: 120px; 864 width: 100%;
1636 padding: 0; 865 padding: 0;
1637 text-indent: -2px; 866 margin-bottom: 20px;
867 font-size: 21px;
868 line-height: 40px;
869 color: #333333;
870 border: 0;
871 border-bottom: 1px solid #e5e5e5;
1638} 872}
1639/* line 338, ../scss/include/_skeleton.scss */ 873legend small {
1640#jqt ul li input[type="checkbox"], 874 font-size: 15px;
1641#jqt ul li input[type="radio"] { 875 color: #999999;
1642 margin: 0;
1643 padding: 10px;
1644} 876}
1645/* line 342, ../scss/include/_skeleton.scss */ 877label,
1646#jqt ul li input[type="checkbox"]:after, 878input,
1647#jqt ul li input[type="radio"]:after { 879button,
1648 content: attr(title); 880select,
1649 position: absolute; 881textarea {
882 font-size: 14px;
883 font-weight: normal;
884 line-height: 20px;
885}
886input,
887button,
888select,
889textarea {
890 font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
891}
892label {
1650 display: block; 893 display: block;
1651 width: 0; 894 margin-bottom: 5px;
1652 left: 21px; 895}
1653 top: 12px; 896select,
1654 font-family: "Helvetica Neue", Helvetica; 897textarea,
1655 font-size: 17px; 898input[type="text"],
1656 line-height: 21px; 899input[type="password"],
1657 width: 246px; 900input[type="datetime"],
1658 margin: 0 0 0 17px; 901input[type="datetime-local"],
1659 color: white; 902input[type="date"],
1660 text-shadow: #3c3d3e 0 -1px 0; 903input[type="month"],
1661} 904input[type="time"],
1662/* line 355, ../scss/include/_skeleton.scss */ 905input[type="week"],
1663#jqt ul li input[type='submit'] { 906input[type="number"],
907input[type="email"],
908input[type="url"],
909input[type="search"],
910input[type="tel"],
911input[type="color"],
912.uneditable-input {
913 display: inline-block;
914 height: 20px;
915 padding: 4px 6px;
916 margin-bottom: 10px;
917 font-size: 14px;
918 line-height: 20px;
919 color: #555555;
1664 -webkit-border-radius: 4px; 920 -webkit-border-radius: 4px;
921 -moz-border-radius: 4px;
1665 border-radius: 4px; 922 border-radius: 4px;
1666 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eeeeee), to(#9c9ea0)); 923 vertical-align: middle;
1667 border: 1px outset #aaa; 924}
1668 display: block; 925input,
1669 font-size: inherit; 926textarea,
1670 font-weight: inherit; 927.uneditable-input {
1671 padding: 10px; 928 width: 206px;
929}
930textarea {
931 height: auto;
932}
933textarea,
934input[type="text"],
935input[type="password"],
936input[type="datetime"],
937input[type="datetime-local"],
938input[type="date"],
939input[type="month"],
940input[type="time"],
941input[type="week"],
942input[type="number"],
943input[type="email"],
944input[type="url"],
945input[type="search"],
946input[type="tel"],
947input[type="color"],
948.uneditable-input {
949 background-color: #ffffff;
950 border: 1px solid #cccccc;
951 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
952 -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
953 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
954 -webkit-transition: border linear .2s, box-shadow linear .2s;
955 -moz-transition: border linear .2s, box-shadow linear .2s;
956 -o-transition: border linear .2s, box-shadow linear .2s;
957 transition: border linear .2s, box-shadow linear .2s;
958}
959textarea:focus,
960input[type="text"]:focus,
961input[type="password"]:focus,
962input[type="datetime"]:focus,
963input[type="datetime-local"]:focus,
964input[type="date"]:focus,
965input[type="month"]:focus,
966input[type="time"]:focus,
967input[type="week"]:focus,
968input[type="number"]:focus,
969input[type="email"]:focus,
970input[type="url"]:focus,
971input[type="search"]:focus,
972input[type="tel"]:focus,
973input[type="color"]:focus,
974.uneditable-input:focus {
975 border-color: rgba(82, 168, 236, 0.8);
976 outline: 0;
977 outline: thin dotted \9;
978 /* IE6-9 */
979
980 -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
981 -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
982 box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
983}
984input[type="radio"],
985input[type="checkbox"] {
986 margin: 4px 0 0;
987 *margin-top: 0;
988 /* IE7 */
989
990 margin-top: 1px \9;
991 /* IE8-9 */
992
993 line-height: normal;
994}
995input[type="file"],
996input[type="image"],
997input[type="submit"],
998input[type="reset"],
999input[type="button"],
1000input[type="radio"],
1001input[type="checkbox"] {
1002 width: auto;
1003}
1004select,
1005input[type="file"] {
1006 height: 30px;
1007 /* In IE7, the height of the select element cannot be changed by height, only font-size */
1008
1009 *margin-top: 4px;
1010 /* For IE7, add top margin to align select with labels */
1011
1012 line-height: 30px;
1013}
1014select {
1015 width: 220px;
1016 border: 1px solid #cccccc;
1017 background-color: #ffffff;
1018}
1019select[multiple],
1020select[size] {
1021 height: auto;
1022}
1023select:focus,
1024input[type="file"]:focus,
1025input[type="radio"]:focus,
1026input[type="checkbox"]:focus {
1027 outline: thin dotted #333;
1028 outline: 5px auto -webkit-focus-ring-color;
1029 outline-offset: -2px;
1030}
1031.uneditable-input,
1032.uneditable-textarea {
1033 color: #999999;
1034 background-color: #fcfcfc;
1035 border-color: #cccccc;
1036 -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
1037 -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
1038 box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
1039 cursor: not-allowed;
1040}
1041.uneditable-input {
1042 overflow: hidden;
1043 white-space: nowrap;
1044}
1045.uneditable-textarea {
1046 width: auto;
1047 height: auto;
1048}
1049input:-moz-placeholder,
1050textarea:-moz-placeholder {
1051 color: #999999;
1052}
1053input:-ms-input-placeholder,
1054textarea:-ms-input-placeholder {
1055 color: #999999;
1672} 1056}
1673/* line 368, ../scss/include/_skeleton.scss */ 1057input::-webkit-input-placeholder,
1674#jqt ul li.arrow small, 1058textarea::-webkit-input-placeholder {
1675#jqt ul li.forward small { 1059 color: #999999;
1676 margin-right: 24px;
1677} 1060}
1678/* line 380, ../scss/include/_skeleton.scss */ 1061.radio,
1679#jqt ul li.forward:before { 1062.checkbox {
1063 min-height: 20px;
1064 padding-left: 20px;
1065}
1066.radio input[type="radio"],
1067.checkbox input[type="checkbox"] {
1068 float: left;
1069 margin-left: -20px;
1070}
1071.controls > .radio:first-child,
1072.controls > .checkbox:first-child {
1073 padding-top: 5px;
1074}
1075.radio.inline,
1076.checkbox.inline {
1077 display: inline-block;
1078 padding-top: 5px;
1079 margin-bottom: 0;
1080 vertical-align: middle;
1081}
1082.radio.inline + .radio.inline,
1083.checkbox.inline + .checkbox.inline {
1084 margin-left: 10px;
1085}
1086.input-mini {
1087 width: 60px;
1088}
1089.input-small {
1090 width: 90px;
1091}
1092.input-medium {
1093 width: 150px;
1094}
1095.input-large {
1096 width: 210px;
1097}
1098.input-xlarge {
1099 width: 270px;
1100}
1101.input-xxlarge {
1102 width: 530px;
1103}
1104input[class*="span"],
1105select[class*="span"],
1106textarea[class*="span"],
1107.uneditable-input[class*="span"],
1108.row-fluid input[class*="span"],
1109.row-fluid select[class*="span"],
1110.row-fluid textarea[class*="span"],
1111.row-fluid .uneditable-input[class*="span"] {
1112 float: none;
1113 margin-left: 0;
1114}
1115.input-append input[class*="span"],
1116.input-append .uneditable-input[class*="span"],
1117.input-prepend input[class*="span"],
1118.input-prepend .uneditable-input[class*="span"],
1119.row-fluid input[class*="span"],
1120.row-fluid select[class*="span"],
1121.row-fluid textarea[class*="span"],
1122.row-fluid .uneditable-input[class*="span"],
1123.row-fluid .input-prepend [class*="span"],
1124.row-fluid .input-append [class*="span"] {
1125 display: inline-block;
1126}
1127input,
1128textarea,
1129.uneditable-input {
1130 margin-left: 0;
1131}
1132.controls-row [class*="span"] + [class*="span"] {
1133 margin-left: 20px;
1134}
1135input.span12, textarea.span12, .uneditable-input.span12 {
1136 width: 926px;
1137}
1138input.span11, textarea.span11, .uneditable-input.span11 {
1139 width: 846px;
1140}
1141input.span10, textarea.span10, .uneditable-input.span10 {
1142 width: 766px;
1143}
1144input.span9, textarea.span9, .uneditable-input.span9 {
1145 width: 686px;
1146}
1147input.span8, textarea.span8, .uneditable-input.span8 {
1148 width: 606px;
1149}
1150input.span7, textarea.span7, .uneditable-input.span7 {
1151 width: 526px;
1152}
1153input.span6, textarea.span6, .uneditable-input.span6 {
1154 width: 446px;
1155}
1156input.span5, textarea.span5, .uneditable-input.span5 {
1157 width: 366px;
1158}
1159input.span4, textarea.span4, .uneditable-input.span4 {
1160 width: 286px;
1161}
1162input.span3, textarea.span3, .uneditable-input.span3 {
1163 width: 206px;
1164}
1165input.span2, textarea.span2, .uneditable-input.span2 {
1166 width: 126px;
1167}
1168input.span1, textarea.span1, .uneditable-input.span1 {
1169 width: 46px;
1170}
1171.controls-row {
1172 *zoom: 1;
1173}
1174.controls-row:before,
1175.controls-row:after {
1176 display: table;
1680 content: ""; 1177 content: "";
1681 position: absolute;
1682 display: block;
1683 top: 50%;
1684 right: 6px;
1685 margin-top: -12px;
1686 width: 24px;
1687 height: 24px;
1688 -webkit-border-radius: 12px;
1689 border-radius: 12px;
1690 background-image: none;
1691 background-color: #53b401;
1692 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #76fe04), color-stop(50%, #5fcd01), color-stop(51%, #53b401), color-stop(100%, #479b01));
1693 background-image: -webkit-linear-gradient(top, #76fe04, #5fcd01 50%, #53b401 51%, #479b01);
1694 background-image: linear-gradient(top, #76fe04, #5fcd01 50%, #53b401 51%, #479b01);
1695 border: 2px solid #fff;
1696 -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
1697 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
1698 -webkit-box-sizing: border-box;
1699 padding: 0;
1700 z-index: 10;
1701 line-height: 0; 1178 line-height: 0;
1702 pointer-events: none;
1703} 1179}
1704/* line 395, ../scss/include/_skeleton.scss */ 1180.controls-row:after {
1705#jqt ul li.forward:after { 1181 clear: both;
1706 color: white;
1707 text-shadow: #3c8101 0 -1px 0;
1708 filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);
1709 opacity: 1;
1710 font-size: 24px;
1711}
1712/* line 404, ../scss/include/_skeleton.scss */
1713#jqt ul.rounded,
1714#jqt ul.individual li {
1715 -webkit-box-shadow: rgba(255, 255, 255, 0.15) 0 1px 0;
1716 box-shadow: rgba(255, 255, 255, 0.15) 0 1px 0;
1717 border: 1px solid #2f3031;
1718}
1719/* line 409, ../scss/include/_skeleton.scss */
1720#jqt ul.rounded {
1721 -webkit-border-radius: 8px;
1722 border-radius: 8px;
1723}
1724/* line 412, ../scss/include/_skeleton.scss */
1725#jqt ul.rounded li:first-child,
1726#jqt ul.rounded li:first-child a {
1727 border-top: 0;
1728 -webkit-border-top-left-radius: 8px;
1729 border-top-left-radius: 8px;
1730 -webkit-border-top-right-radius: 8px;
1731 border-top-right-radius: 8px;
1732}
1733/* line 416, ../scss/include/_skeleton.scss */
1734#jqt ul.rounded li:last-child,
1735#jqt ul.rounded li:last-child a {
1736 -webkit-border-bottom-left-radius: 8px;
1737 border-bottom-left-radius: 8px;
1738 -webkit-border-bottom-right-radius: 8px;
1739 border-bottom-right-radius: 8px;
1740}
1741/* line 422, ../scss/include/_skeleton.scss */
1742#jqt ul.form li {
1743 padding: 7px 10px;
1744} 1182}
1745/* line 425, ../scss/include/_skeleton.scss */ 1183.controls-row [class*="span"],
1746#jqt ul.form li.error { 1184.row-fluid .controls-row [class*="span"] {
1747 border: 2px solid red; 1185 float: left;
1748} 1186}
1749/* line 428, ../scss/include/_skeleton.scss */ 1187.controls-row .checkbox[class*="span"],
1750#jqt ul.form li.error + #jqt ul.form li.error { 1188.controls-row .radio[class*="span"] {
1751 border-top: 0; 1189 padding-top: 5px;
1190}
1191input[disabled],
1192select[disabled],
1193textarea[disabled],
1194input[readonly],
1195select[readonly],
1196textarea[readonly] {
1197 cursor: not-allowed;
1198 background-color: #eeeeee;
1752} 1199}
1753/* line 438, ../scss/include/_skeleton.scss */ 1200input[type="radio"][disabled],
1754#jqt ul.metal li { 1201input[type="checkbox"][disabled],
1755 background-image: none; 1202input[type="radio"][readonly],
1756 border-top: 1px solid #fff; 1203input[type="checkbox"][readonly] {
1757 border-bottom: 1px solid #666; 1204 background-color: transparent;
1758 font-size: 26px; 1205}
1206.control-group.warning .control-label,
1207.control-group.warning .help-block,
1208.control-group.warning .help-inline {
1209 color: #c09853;
1210}
1211.control-group.warning .checkbox,
1212.control-group.warning .radio,
1213.control-group.warning input,
1214.control-group.warning select,
1215.control-group.warning textarea {
1216 color: #c09853;
1217}
1218.control-group.warning input,
1219.control-group.warning select,
1220.control-group.warning textarea {
1221 border-color: #c09853;
1222 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1223 -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1224 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1225}
1226.control-group.warning input:focus,
1227.control-group.warning select:focus,
1228.control-group.warning textarea:focus {
1229 border-color: #a47e3c;
1230 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
1231 -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
1232 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
1233}
1234.control-group.warning .input-prepend .add-on,
1235.control-group.warning .input-append .add-on {
1236 color: #c09853;
1237 background-color: #fcf8e3;
1238 border-color: #c09853;
1239}
1240.control-group.error .control-label,
1241.control-group.error .help-block,
1242.control-group.error .help-inline {
1243 color: #b94a48;
1244}
1245.control-group.error .checkbox,
1246.control-group.error .radio,
1247.control-group.error input,
1248.control-group.error select,
1249.control-group.error textarea {
1250 color: #b94a48;
1251}
1252.control-group.error input,
1253.control-group.error select,
1254.control-group.error textarea {
1255 border-color: #b94a48;
1256 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1257 -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1258 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1259}
1260.control-group.error input:focus,
1261.control-group.error select:focus,
1262.control-group.error textarea:focus {
1263 border-color: #953b39;
1264 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
1265 -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
1266 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
1267}
1268.control-group.error .input-prepend .add-on,
1269.control-group.error .input-append .add-on {
1270 color: #b94a48;
1271 background-color: #f2dede;
1272 border-color: #b94a48;
1273}
1274.control-group.success .control-label,
1275.control-group.success .help-block,
1276.control-group.success .help-inline {
1277 color: #468847;
1278}
1279.control-group.success .checkbox,
1280.control-group.success .radio,
1281.control-group.success input,
1282.control-group.success select,
1283.control-group.success textarea {
1284 color: #468847;
1285}
1286.control-group.success input,
1287.control-group.success select,
1288.control-group.success textarea {
1289 border-color: #468847;
1290 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1291 -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1292 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1293}
1294.control-group.success input:focus,
1295.control-group.success select:focus,
1296.control-group.success textarea:focus {
1297 border-color: #356635;
1298 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
1299 -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
1300 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
1301}
1302.control-group.success .input-prepend .add-on,
1303.control-group.success .input-append .add-on {
1304 color: #468847;
1305 background-color: #dff0d8;
1306 border-color: #468847;
1307}
1308.control-group.info .control-label,
1309.control-group.info .help-block,
1310.control-group.info .help-inline {
1311 color: #3a87ad;
1312}
1313.control-group.info .checkbox,
1314.control-group.info .radio,
1315.control-group.info input,
1316.control-group.info select,
1317.control-group.info textarea {
1318 color: #3a87ad;
1319}
1320.control-group.info input,
1321.control-group.info select,
1322.control-group.info textarea {
1323 border-color: #3a87ad;
1324 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1325 -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1326 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
1327}
1328.control-group.info input:focus,
1329.control-group.info select:focus,
1330.control-group.info textarea:focus {
1331 border-color: #2d6987;
1332 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
1333 -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
1334 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
1335}
1336.control-group.info .input-prepend .add-on,
1337.control-group.info .input-append .add-on {
1338 color: #3a87ad;
1339 background-color: #d9edf7;
1340 border-color: #3a87ad;
1341}
1342input:focus:invalid,
1343textarea:focus:invalid,
1344select:focus:invalid {
1345 color: #b94a48;
1346 border-color: #ee5f5b;
1347}
1348input:focus:invalid:focus,
1349textarea:focus:invalid:focus,
1350select:focus:invalid:focus {
1351 border-color: #e9322d;
1352 -webkit-box-shadow: 0 0 6px #f8b9b7;
1353 -moz-box-shadow: 0 0 6px #f8b9b7;
1354 box-shadow: 0 0 6px #f8b9b7;
1355}
1356.form-actions {
1357 padding: 19px 20px 20px;
1358 margin-top: 20px;
1359 margin-bottom: 20px;
1360 background-color: #f5f5f5;
1361 border-top: 1px solid #e5e5e5;
1362 *zoom: 1;
1363}
1364.form-actions:before,
1365.form-actions:after {
1366 display: table;
1367 content: "";
1368 line-height: 0;
1759} 1369}
1760/* line 445, ../scss/include/_skeleton.scss */ 1370.form-actions:after {
1761#jqt ul.metal li a { 1371 clear: both;
1762 line-height: 26px; 1372}
1763 margin: 0; 1373.help-block,
1764 padding: 13px 0; 1374.help-inline {
1375 color: #595959;
1765} 1376}
1766/* line 451, ../scss/include/_skeleton.scss */ 1377.help-block {
1767#jqt ul.metal li em {
1768 display: block; 1378 display: block;
1379 margin-bottom: 10px;
1380}
1381.help-inline {
1382 display: inline-block;
1383 *display: inline;
1384 /* IE7 inline-block hack */
1385
1386 *zoom: 1;
1387 vertical-align: middle;
1388 padding-left: 5px;
1389}
1390.input-append,
1391.input-prepend {
1392 margin-bottom: 5px;
1393 font-size: 0;
1394 white-space: nowrap;
1395}
1396.input-append input,
1397.input-prepend input,
1398.input-append select,
1399.input-prepend select,
1400.input-append .uneditable-input,
1401.input-prepend .uneditable-input,
1402.input-append .dropdown-menu,
1403.input-prepend .dropdown-menu {
1769 font-size: 14px; 1404 font-size: 14px;
1770 font-style: normal;
1771 width: 50%;
1772 line-height: 14px;
1773} 1405}
1774/* line 459, ../scss/include/_skeleton.scss */ 1406.input-append input,
1775#jqt ul.metal li small { 1407.input-prepend input,
1776 float: right; 1408.input-append select,
1409.input-prepend select,
1410.input-append .uneditable-input,
1411.input-prepend .uneditable-input {
1777 position: relative; 1412 position: relative;
1413 margin-bottom: 0;
1414 *margin-left: 0;
1415 vertical-align: top;
1416 -webkit-border-radius: 0 4px 4px 0;
1417 -moz-border-radius: 0 4px 4px 0;
1418 border-radius: 0 4px 4px 0;
1419}
1420.input-append input:focus,
1421.input-prepend input:focus,
1422.input-append select:focus,
1423.input-prepend select:focus,
1424.input-append .uneditable-input:focus,
1425.input-prepend .uneditable-input:focus {
1426 z-index: 2;
1427}
1428.input-append .add-on,
1429.input-prepend .add-on {
1430 display: inline-block;
1431 width: auto;
1432 height: 20px;
1433 min-width: 16px;
1434 padding: 4px 5px;
1435 font-size: 14px;
1436 font-weight: normal;
1437 line-height: 20px;
1438 text-align: center;
1439 text-shadow: 0 1px 0 #ffffff;
1440 background-color: #eeeeee;
1441 border: 1px solid #ccc;
1442}
1443.input-append .add-on,
1444.input-prepend .add-on,
1445.input-append .btn,
1446.input-prepend .btn,
1447.input-append .btn-group > .dropdown-toggle,
1448.input-prepend .btn-group > .dropdown-toggle {
1449 vertical-align: top;
1450 -webkit-border-radius: 0;
1451 -moz-border-radius: 0;
1452 border-radius: 0;
1453}
1454.input-append .active,
1455.input-prepend .active {
1456 background-color: #a9dba9;
1457 border-color: #46a546;
1458}
1459.input-prepend .add-on,
1460.input-prepend .btn {
1461 margin-right: -1px;
1462}
1463.input-prepend .add-on:first-child,
1464.input-prepend .btn:first-child {
1465 -webkit-border-radius: 4px 0 0 4px;
1466 -moz-border-radius: 4px 0 0 4px;
1467 border-radius: 4px 0 0 4px;
1468}
1469.input-append input,
1470.input-append select,
1471.input-append .uneditable-input {
1472 -webkit-border-radius: 4px 0 0 4px;
1473 -moz-border-radius: 4px 0 0 4px;
1474 border-radius: 4px 0 0 4px;
1475}
1476.input-append input + .btn-group .btn:last-child,
1477.input-append select + .btn-group .btn:last-child,
1478.input-append .uneditable-input + .btn-group .btn:last-child {
1479 -webkit-border-radius: 0 4px 4px 0;
1480 -moz-border-radius: 0 4px 4px 0;
1481 border-radius: 0 4px 4px 0;
1482}
1483.input-append .add-on,
1484.input-append .btn,
1485.input-append .btn-group {
1486 margin-left: -1px;
1487}
1488.input-append .add-on:last-child,
1489.input-append .btn:last-child,
1490.input-append .btn-group:last-child > .dropdown-toggle {
1491 -webkit-border-radius: 0 4px 4px 0;
1492 -moz-border-radius: 0 4px 4px 0;
1493 border-radius: 0 4px 4px 0;
1494}
1495.input-prepend.input-append input,
1496.input-prepend.input-append select,
1497.input-prepend.input-append .uneditable-input {
1498 -webkit-border-radius: 0;
1499 -moz-border-radius: 0;
1500 border-radius: 0;
1501}
1502.input-prepend.input-append input + .btn-group .btn,
1503.input-prepend.input-append select + .btn-group .btn,
1504.input-prepend.input-append .uneditable-input + .btn-group .btn {
1505 -webkit-border-radius: 0 4px 4px 0;
1506 -moz-border-radius: 0 4px 4px 0;
1507 border-radius: 0 4px 4px 0;
1508}
1509.input-prepend.input-append .add-on:first-child,
1510.input-prepend.input-append .btn:first-child {
1511 margin-right: -1px;
1512 -webkit-border-radius: 4px 0 0 4px;
1513 -moz-border-radius: 4px 0 0 4px;
1514 border-radius: 4px 0 0 4px;
1515}
1516.input-prepend.input-append .add-on:last-child,
1517.input-prepend.input-append .btn:last-child {
1518 margin-left: -1px;
1519 -webkit-border-radius: 0 4px 4px 0;
1520 -moz-border-radius: 0 4px 4px 0;
1521 border-radius: 0 4px 4px 0;
1522}
1523.input-prepend.input-append .btn-group:first-child {
1524 margin-left: 0;
1525}
1526input.search-query {
1527 padding-right: 14px;
1528 padding-right: 4px \9;
1529 padding-left: 14px;
1530 padding-left: 4px \9;
1531 /* IE7-8 doesn't have border-radius, so don't indent the padding */
1532
1533 margin-bottom: 0;
1534 -webkit-border-radius: 15px;
1535 -moz-border-radius: 15px;
1536 border-radius: 15px;
1537}
1538/* Allow for input prepend/append in search forms */
1539.form-search .input-append .search-query,
1540.form-search .input-prepend .search-query {
1541 -webkit-border-radius: 0;
1542 -moz-border-radius: 0;
1543 border-radius: 0;
1544}
1545.form-search .input-append .search-query {
1546 -webkit-border-radius: 14px 0 0 14px;
1547 -moz-border-radius: 14px 0 0 14px;
1548 border-radius: 14px 0 0 14px;
1549}
1550.form-search .input-append .btn {
1551 -webkit-border-radius: 0 14px 14px 0;
1552 -moz-border-radius: 0 14px 14px 0;
1553 border-radius: 0 14px 14px 0;
1554}
1555.form-search .input-prepend .search-query {
1556 -webkit-border-radius: 0 14px 14px 0;
1557 -moz-border-radius: 0 14px 14px 0;
1558 border-radius: 0 14px 14px 0;
1559}
1560.form-search .input-prepend .btn {
1561 -webkit-border-radius: 14px 0 0 14px;
1562 -moz-border-radius: 14px 0 0 14px;
1563 border-radius: 14px 0 0 14px;
1564}
1565.form-search input,
1566.form-inline input,
1567.form-horizontal input,
1568.form-search textarea,
1569.form-inline textarea,
1570.form-horizontal textarea,
1571.form-search select,
1572.form-inline select,
1573.form-horizontal select,
1574.form-search .help-inline,
1575.form-inline .help-inline,
1576.form-horizontal .help-inline,
1577.form-search .uneditable-input,
1578.form-inline .uneditable-input,
1579.form-horizontal .uneditable-input,
1580.form-search .input-prepend,
1581.form-inline .input-prepend,
1582.form-horizontal .input-prepend,
1583.form-search .input-append,
1584.form-inline .input-append,
1585.form-horizontal .input-append {
1586 display: inline-block;
1587 *display: inline;
1588 /* IE7 inline-block hack */
1589
1590 *zoom: 1;
1591 margin-bottom: 0;
1592 vertical-align: middle;
1593}
1594.form-search .hide,
1595.form-inline .hide,
1596.form-horizontal .hide {
1597 display: none;
1598}
1599.form-search label,
1600.form-inline label,
1601.form-search .btn-group,
1602.form-inline .btn-group {
1603 display: inline-block;
1604}
1605.form-search .input-append,
1606.form-inline .input-append,
1607.form-search .input-prepend,
1608.form-inline .input-prepend {
1609 margin-bottom: 0;
1610}
1611.form-search .radio,
1612.form-search .checkbox,
1613.form-inline .radio,
1614.form-inline .checkbox {
1615 padding-left: 0;
1616 margin-bottom: 0;
1617 vertical-align: middle;
1618}
1619.form-search .radio input[type="radio"],
1620.form-search .checkbox input[type="checkbox"],
1621.form-inline .radio input[type="radio"],
1622.form-inline .checkbox input[type="checkbox"] {
1623 float: left;
1624 margin-right: 3px;
1625 margin-left: 0;
1626}
1627.control-group {
1628 margin-bottom: 10px;
1629}
1630legend + .control-group {
1631 margin-top: 20px;
1632 -webkit-margin-top-collapse: separate;
1633}
1634.form-horizontal .control-group {
1635 margin-bottom: 20px;
1636 *zoom: 1;
1637}
1638.form-horizontal .control-group:before,
1639.form-horizontal .control-group:after {
1640 display: table;
1641 content: "";
1642 line-height: 0;
1643}
1644.form-horizontal .control-group:after {
1645 clear: both;
1646}
1647.form-horizontal .control-label {
1648 float: left;
1649 width: 160px;
1650 padding-top: 5px;
1651 text-align: right;
1652}
1653.form-horizontal .controls {
1654 *display: inline-block;
1655 *padding-left: 20px;
1656 margin-left: 180px;
1657 *margin-left: 0;
1658}
1659.form-horizontal .controls:first-child {
1660 *padding-left: 180px;
1661}
1662.form-horizontal .help-block {
1663 margin-bottom: 0;
1664}
1665.form-horizontal input + .help-block,
1666.form-horizontal select + .help-block,
1667.form-horizontal textarea + .help-block,
1668.form-horizontal .uneditable-input + .help-block,
1669.form-horizontal .input-prepend + .help-block,
1670.form-horizontal .input-append + .help-block {
1778 margin-top: 10px; 1671 margin-top: 10px;
1672}
1673.form-horizontal .form-actions {
1674 padding-left: 180px;
1675}
1676table {
1677 max-width: 100%;
1678 background-color: transparent;
1679 border-collapse: collapse;
1680 border-spacing: 0;
1681}
1682.table {
1683 width: 100%;
1684 margin-bottom: 20px;
1685}
1686.table th,
1687.table td {
1688 padding: 8px;
1689 line-height: 20px;
1690 text-align: left;
1691 vertical-align: top;
1692 border-top: 1px solid #dddddd;
1693}
1694.table th {
1779 font-weight: bold; 1695 font-weight: bold;
1780} 1696}
1781/* line 473, ../scss/include/_skeleton.scss */ 1697.table thead th {
1782#jqt ul.edgetoedge li { 1698 vertical-align: bottom;
1783 font-size: 20px;
1784} 1699}
1785/* line 476, ../scss/include/_skeleton.scss */ 1700.table caption + thead tr:first-child th,
1786#jqt ul.edgetoedge li:first-child { 1701.table caption + thead tr:first-child td,
1702.table colgroup + thead tr:first-child th,
1703.table colgroup + thead tr:first-child td,
1704.table thead:first-child tr:first-child th,
1705.table thead:first-child tr:first-child td {
1787 border-top: 0; 1706 border-top: 0;
1788} 1707}
1789/* line 480, ../scss/include/_skeleton.scss */ 1708.table tbody + tbody {
1790#jqt ul.edgetoedge li.sep { 1709 border-top: 2px solid #dddddd;
1791 font-size: 16px; 1710}
1792 padding: 2px 10px; 1711.table .table {
1712 background-color: #ffffff;
1713}
1714.table-condensed th,
1715.table-condensed td {
1716 padding: 4px 5px;
1717}
1718.table-bordered {
1719 border: 1px solid #dddddd;
1720 border-collapse: separate;
1721 *border-collapse: collapse;
1722 border-left: 0;
1723 -webkit-border-radius: 4px;
1724 -moz-border-radius: 4px;
1725 border-radius: 4px;
1726}
1727.table-bordered th,
1728.table-bordered td {
1729 border-left: 1px solid #dddddd;
1730}
1731.table-bordered caption + thead tr:first-child th,
1732.table-bordered caption + tbody tr:first-child th,
1733.table-bordered caption + tbody tr:first-child td,
1734.table-bordered colgroup + thead tr:first-child th,
1735.table-bordered colgroup + tbody tr:first-child th,
1736.table-bordered colgroup + tbody tr:first-child td,
1737.table-bordered thead:first-child tr:first-child th,
1738.table-bordered tbody:first-child tr:first-child th,
1739.table-bordered tbody:first-child tr:first-child td {
1740 border-top: 0;
1741}
1742.table-bordered thead:first-child tr:first-child > th:first-child,
1743.table-bordered tbody:first-child tr:first-child > td:first-child {
1744 -webkit-border-top-left-radius: 4px;
1745 -moz-border-radius-topleft: 4px;
1746 border-top-left-radius: 4px;
1747}
1748.table-bordered thead:first-child tr:first-child > th:last-child,
1749.table-bordered tbody:first-child tr:first-child > td:last-child {
1750 -webkit-border-top-right-radius: 4px;
1751 -moz-border-radius-topright: 4px;
1752 border-top-right-radius: 4px;
1753}
1754.table-bordered thead:last-child tr:last-child > th:first-child,
1755.table-bordered tbody:last-child tr:last-child > td:first-child,
1756.table-bordered tfoot:last-child tr:last-child > td:first-child {
1757 -webkit-border-bottom-left-radius: 4px;
1758 -moz-border-radius-bottomleft: 4px;
1759 border-bottom-left-radius: 4px;
1760}
1761.table-bordered thead:last-child tr:last-child > th:last-child,
1762.table-bordered tbody:last-child tr:last-child > td:last-child,
1763.table-bordered tfoot:last-child tr:last-child > td:last-child {
1764 -webkit-border-bottom-right-radius: 4px;
1765 -moz-border-radius-bottomright: 4px;
1766 border-bottom-right-radius: 4px;
1767}
1768.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
1769 -webkit-border-bottom-left-radius: 0;
1770 -moz-border-radius-bottomleft: 0;
1771 border-bottom-left-radius: 0;
1772}
1773.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
1774 -webkit-border-bottom-right-radius: 0;
1775 -moz-border-radius-bottomright: 0;
1776 border-bottom-right-radius: 0;
1777}
1778.table-bordered caption + thead tr:first-child th:first-child,
1779.table-bordered caption + tbody tr:first-child td:first-child,
1780.table-bordered colgroup + thead tr:first-child th:first-child,
1781.table-bordered colgroup + tbody tr:first-child td:first-child {
1782 -webkit-border-top-left-radius: 4px;
1783 -moz-border-radius-topleft: 4px;
1784 border-top-left-radius: 4px;
1785}
1786.table-bordered caption + thead tr:first-child th:last-child,
1787.table-bordered caption + tbody tr:first-child td:last-child,
1788.table-bordered colgroup + thead tr:first-child th:last-child,
1789.table-bordered colgroup + tbody tr:first-child td:last-child {
1790 -webkit-border-top-right-radius: 4px;
1791 -moz-border-radius-topright: 4px;
1792 border-top-right-radius: 4px;
1793}
1794.table-striped tbody > tr:nth-child(odd) > td,
1795.table-striped tbody > tr:nth-child(odd) > th {
1796 background-color: #f9f9f9;
1797}
1798.table-hover tbody tr:hover td,
1799.table-hover tbody tr:hover th {
1800 background-color: #f5f5f5;
1801}
1802table td[class*="span"],
1803table th[class*="span"],
1804.row-fluid table td[class*="span"],
1805.row-fluid table th[class*="span"] {
1806 display: table-cell;
1807 float: none;
1808 margin-left: 0;
1809}
1810.table td.span1,
1811.table th.span1 {
1812 float: none;
1813 width: 44px;
1814 margin-left: 0;
1815}
1816.table td.span2,
1817.table th.span2 {
1818 float: none;
1819 width: 124px;
1820 margin-left: 0;
1821}
1822.table td.span3,
1823.table th.span3 {
1824 float: none;
1825 width: 204px;
1826 margin-left: 0;
1827}
1828.table td.span4,
1829.table th.span4 {
1830 float: none;
1831 width: 284px;
1832 margin-left: 0;
1833}
1834.table td.span5,
1835.table th.span5 {
1836 float: none;
1837 width: 364px;
1838 margin-left: 0;
1839}
1840.table td.span6,
1841.table th.span6 {
1842 float: none;
1843 width: 444px;
1844 margin-left: 0;
1845}
1846.table td.span7,
1847.table th.span7 {
1848 float: none;
1849 width: 524px;
1850 margin-left: 0;
1851}
1852.table td.span8,
1853.table th.span8 {
1854 float: none;
1855 width: 604px;
1856 margin-left: 0;
1857}
1858.table td.span9,
1859.table th.span9 {
1860 float: none;
1861 width: 684px;
1862 margin-left: 0;
1863}
1864.table td.span10,
1865.table th.span10 {
1866 float: none;
1867 width: 764px;
1868 margin-left: 0;
1869}
1870.table td.span11,
1871.table th.span11 {
1872 float: none;
1873 width: 844px;
1874 margin-left: 0;
1875}
1876.table td.span12,
1877.table th.span12 {
1878 float: none;
1879 width: 924px;
1880 margin-left: 0;
1881}
1882.table tbody tr.success td {
1883 background-color: #dff0d8;
1884}
1885.table tbody tr.error td {
1886 background-color: #f2dede;
1887}
1888.table tbody tr.warning td {
1889 background-color: #fcf8e3;
1890}
1891.table tbody tr.info td {
1892 background-color: #d9edf7;
1893}
1894.table-hover tbody tr.success:hover td {
1895 background-color: #d0e9c6;
1896}
1897.table-hover tbody tr.error:hover td {
1898 background-color: #ebcccc;
1899}
1900.table-hover tbody tr.warning:hover td {
1901 background-color: #faf2cc;
1902}
1903.table-hover tbody tr.info:hover td {
1904 background-color: #c4e3f3;
1905}
1906[class^="icon-"],
1907[class*=" icon-"] {
1908 display: inline-block;
1909 width: 14px;
1910 height: 14px;
1911 *margin-right: .3em;
1912 line-height: 14px;
1913 vertical-align: text-top;
1914 background-image: url("../img/glyphicons-halflings.png");
1915 background-position: 14px 14px;
1916 background-repeat: no-repeat;
1917 margin-top: 1px;
1918}
1919/* White icons with optional class, or on hover/active states of certain elements */
1920.icon-white,
1921.nav-pills > .active > a > [class^="icon-"],
1922.nav-pills > .active > a > [class*=" icon-"],
1923.nav-list > .active > a > [class^="icon-"],
1924.nav-list > .active > a > [class*=" icon-"],
1925.navbar-inverse .nav > .active > a > [class^="icon-"],
1926.navbar-inverse .nav > .active > a > [class*=" icon-"],
1927.dropdown-menu > li > a:hover > [class^="icon-"],
1928.dropdown-menu > li > a:hover > [class*=" icon-"],
1929.dropdown-menu > .active > a > [class^="icon-"],
1930.dropdown-menu > .active > a > [class*=" icon-"],
1931.dropdown-submenu:hover > a > [class^="icon-"],
1932.dropdown-submenu:hover > a > [class*=" icon-"] {
1933 background-image: url("../img/glyphicons-halflings-white.png");
1934}
1935.icon-glass {
1936 background-position: 0 0;
1937}
1938.icon-music {
1939 background-position: -24px 0;
1940}
1941.icon-search {
1942 background-position: -48px 0;
1943}
1944.icon-envelope {
1945 background-position: -72px 0;
1946}
1947.icon-heart {
1948 background-position: -96px 0;
1949}
1950.icon-star {
1951 background-position: -120px 0;
1952}
1953.icon-star-empty {
1954 background-position: -144px 0;
1955}
1956.icon-user {
1957 background-position: -168px 0;
1958}
1959.icon-film {
1960 background-position: -192px 0;
1961}
1962.icon-th-large {
1963 background-position: -216px 0;
1964}
1965.icon-th {
1966 background-position: -240px 0;
1967}
1968.icon-th-list {
1969 background-position: -264px 0;
1970}
1971.icon-ok {
1972 background-position: -288px 0;
1973}
1974.icon-remove {
1975 background-position: -312px 0;
1976}
1977.icon-zoom-in {
1978 background-position: -336px 0;
1979}
1980.icon-zoom-out {
1981 background-position: -360px 0;
1982}
1983.icon-off {
1984 background-position: -384px 0;
1985}
1986.icon-signal {
1987 background-position: -408px 0;
1988}
1989.icon-cog {
1990 background-position: -432px 0;
1991}
1992.icon-trash {
1993 background-position: -456px 0;
1994}
1995.icon-home {
1996 background-position: 0 -24px;
1997}
1998.icon-file {
1999 background-position: -24px -24px;
2000}
2001.icon-time {
2002 background-position: -48px -24px;
2003}
2004.icon-road {
2005 background-position: -72px -24px;
2006}
2007.icon-download-alt {
2008 background-position: -96px -24px;
2009}
2010.icon-download {
2011 background-position: -120px -24px;
2012}
2013.icon-upload {
2014 background-position: -144px -24px;
2015}
2016.icon-inbox {
2017 background-position: -168px -24px;
2018}
2019.icon-play-circle {
2020 background-position: -192px -24px;
2021}
2022.icon-repeat {
2023 background-position: -216px -24px;
2024}
2025.icon-refresh {
2026 background-position: -240px -24px;
2027}
2028.icon-list-alt {
2029 background-position: -264px -24px;
2030}
2031.icon-lock {
2032 background-position: -287px -24px;
2033}
2034.icon-flag {
2035 background-position: -312px -24px;
2036}
2037.icon-headphones {
2038 background-position: -336px -24px;
2039}
2040.icon-volume-off {
2041 background-position: -360px -24px;
2042}
2043.icon-volume-down {
2044 background-position: -384px -24px;
2045}
2046.icon-volume-up {
2047 background-position: -408px -24px;
2048}
2049.icon-qrcode {
2050 background-position: -432px -24px;
2051}
2052.icon-barcode {
2053 background-position: -456px -24px;
2054}
2055.icon-tag {
2056 background-position: 0 -48px;
2057}
2058.icon-tags {
2059 background-position: -25px -48px;
2060}
2061.icon-book {
2062 background-position: -48px -48px;
2063}
2064.icon-bookmark {
2065 background-position: -72px -48px;
2066}
2067.icon-print {
2068 background-position: -96px -48px;
2069}
2070.icon-camera {
2071 background-position: -120px -48px;
2072}
2073.icon-font {
2074 background-position: -144px -48px;
2075}
2076.icon-bold {
2077 background-position: -167px -48px;
2078}
2079.icon-italic {
2080 background-position: -192px -48px;
2081}
2082.icon-text-height {
2083 background-position: -216px -48px;
2084}
2085.icon-text-width {
2086 background-position: -240px -48px;
2087}
2088.icon-align-left {
2089 background-position: -264px -48px;
2090}
2091.icon-align-center {
2092 background-position: -288px -48px;
2093}
2094.icon-align-right {
2095 background-position: -312px -48px;
2096}
2097.icon-align-justify {
2098 background-position: -336px -48px;
2099}
2100.icon-list {
2101 background-position: -360px -48px;
2102}
2103.icon-indent-left {
2104 background-position: -384px -48px;
2105}
2106.icon-indent-right {
2107 background-position: -408px -48px;
2108}
2109.icon-facetime-video {
2110 background-position: -432px -48px;
2111}
2112.icon-picture {
2113 background-position: -456px -48px;
2114}
2115.icon-pencil {
2116 background-position: 0 -72px;
2117}
2118.icon-map-marker {
2119 background-position: -24px -72px;
2120}
2121.icon-adjust {
2122 background-position: -48px -72px;
2123}
2124.icon-tint {
2125 background-position: -72px -72px;
2126}
2127.icon-edit {
2128 background-position: -96px -72px;
2129}
2130.icon-share {
2131 background-position: -120px -72px;
2132}
2133.icon-check {
2134 background-position: -144px -72px;
2135}
2136.icon-move {
2137 background-position: -168px -72px;
2138}
2139.icon-step-backward {
2140 background-position: -192px -72px;
2141}
2142.icon-fast-backward {
2143 background-position: -216px -72px;
2144}
2145.icon-backward {
2146 background-position: -240px -72px;
2147}
2148.icon-play {
2149 background-position: -264px -72px;
2150}
2151.icon-pause {
2152 background-position: -288px -72px;
2153}
2154.icon-stop {
2155 background-position: -312px -72px;
2156}
2157.icon-forward {
2158 background-position: -336px -72px;
2159}
2160.icon-fast-forward {
2161 background-position: -360px -72px;
2162}
2163.icon-step-forward {
2164 background-position: -384px -72px;
2165}
2166.icon-eject {
2167 background-position: -408px -72px;
2168}
2169.icon-chevron-left {
2170 background-position: -432px -72px;
2171}
2172.icon-chevron-right {
2173 background-position: -456px -72px;
2174}
2175.icon-plus-sign {
2176 background-position: 0 -96px;
2177}
2178.icon-minus-sign {
2179 background-position: -24px -96px;
2180}
2181.icon-remove-sign {
2182 background-position: -48px -96px;
2183}
2184.icon-ok-sign {
2185 background-position: -72px -96px;
2186}
2187.icon-question-sign {
2188 background-position: -96px -96px;
2189}
2190.icon-info-sign {
2191 background-position: -120px -96px;
2192}
2193.icon-screenshot {
2194 background-position: -144px -96px;
2195}
2196.icon-remove-circle {
2197 background-position: -168px -96px;
2198}
2199.icon-ok-circle {
2200 background-position: -192px -96px;
2201}
2202.icon-ban-circle {
2203 background-position: -216px -96px;
2204}
2205.icon-arrow-left {
2206 background-position: -240px -96px;
2207}
2208.icon-arrow-right {
2209 background-position: -264px -96px;
2210}
2211.icon-arrow-up {
2212 background-position: -289px -96px;
2213}
2214.icon-arrow-down {
2215 background-position: -312px -96px;
2216}
2217.icon-share-alt {
2218 background-position: -336px -96px;
2219}
2220.icon-resize-full {
2221 background-position: -360px -96px;
2222}
2223.icon-resize-small {
2224 background-position: -384px -96px;
2225}
2226.icon-plus {
2227 background-position: -408px -96px;
2228}
2229.icon-minus {
2230 background-position: -433px -96px;
2231}
2232.icon-asterisk {
2233 background-position: -456px -96px;
2234}
2235.icon-exclamation-sign {
2236 background-position: 0 -120px;
2237}
2238.icon-gift {
2239 background-position: -24px -120px;
2240}
2241.icon-leaf {
2242 background-position: -48px -120px;
2243}
2244.icon-fire {
2245 background-position: -72px -120px;
2246}
2247.icon-eye-open {
2248 background-position: -96px -120px;
2249}
2250.icon-eye-close {
2251 background-position: -120px -120px;
2252}
2253.icon-warning-sign {
2254 background-position: -144px -120px;
2255}
2256.icon-plane {
2257 background-position: -168px -120px;
2258}
2259.icon-calendar {
2260 background-position: -192px -120px;
2261}
2262.icon-random {
2263 background-position: -216px -120px;
2264 width: 16px;
2265}
2266.icon-comment {
2267 background-position: -240px -120px;
2268}
2269.icon-magnet {
2270 background-position: -264px -120px;
2271}
2272.icon-chevron-up {
2273 background-position: -288px -120px;
2274}
2275.icon-chevron-down {
2276 background-position: -313px -119px;
2277}
2278.icon-retweet {
2279 background-position: -336px -120px;
2280}
2281.icon-shopping-cart {
2282 background-position: -360px -120px;
2283}
2284.icon-folder-close {
2285 background-position: -384px -120px;
2286}
2287.icon-folder-open {
2288 background-position: -408px -120px;
2289 width: 16px;
2290}
2291.icon-resize-vertical {
2292 background-position: -432px -119px;
2293}
2294.icon-resize-horizontal {
2295 background-position: -456px -118px;
2296}
2297.icon-hdd {
2298 background-position: 0 -144px;
2299}
2300.icon-bullhorn {
2301 background-position: -24px -144px;
2302}
2303.icon-bell {
2304 background-position: -48px -144px;
1793} 2305}
1794/* line 485, ../scss/include/_skeleton.scss */ 2306.icon-certificate {
1795#jqt ul.edgetoedge li em { 2307 background-position: -72px -144px;
2308}
2309.icon-thumbs-up {
2310 background-position: -96px -144px;
2311}
2312.icon-thumbs-down {
2313 background-position: -120px -144px;
2314}
2315.icon-hand-right {
2316 background-position: -144px -144px;
2317}
2318.icon-hand-left {
2319 background-position: -168px -144px;
2320}
2321.icon-hand-up {
2322 background-position: -192px -144px;
2323}
2324.icon-hand-down {
2325 background-position: -216px -144px;
2326}
2327.icon-circle-arrow-right {
2328 background-position: -240px -144px;
2329}
2330.icon-circle-arrow-left {
2331 background-position: -264px -144px;
2332}
2333.icon-circle-arrow-up {
2334 background-position: -288px -144px;
2335}
2336.icon-circle-arrow-down {
2337 background-position: -312px -144px;
2338}
2339.icon-globe {
2340 background-position: -336px -144px;
2341}
2342.icon-wrench {
2343 background-position: -360px -144px;
2344}
2345.icon-tasks {
2346 background-position: -384px -144px;
2347}
2348.icon-filter {
2349 background-position: -408px -144px;
2350}
2351.icon-briefcase {
2352 background-position: -432px -144px;
2353}
2354.icon-fullscreen {
2355 background-position: -456px -144px;
2356}
2357.dropup,
2358.dropdown {
2359 position: relative;
2360}
2361.dropdown-toggle {
2362 *margin-bottom: -3px;
2363}
2364.dropdown-toggle:active,
2365.open .dropdown-toggle {
2366 outline: 0;
2367}
2368.caret {
2369 display: inline-block;
2370 width: 0;
2371 height: 0;
2372 vertical-align: top;
2373 border-top: 4px solid #000000;
2374 border-right: 4px solid transparent;
2375 border-left: 4px solid transparent;
2376 content: "";
2377}
2378.dropdown .caret {
2379 margin-top: 8px;
2380 margin-left: 2px;
2381}
2382.dropdown-menu {
2383 position: absolute;
2384 top: 100%;
2385 left: 0;
2386 z-index: 1000;
2387 display: none;
2388 float: left;
2389 min-width: 160px;
2390 padding: 5px 0;
2391 margin: 2px 0 0;
2392 list-style: none;
2393 background-color: #ffffff;
2394 border: 1px solid #ccc;
2395 border: 1px solid rgba(0, 0, 0, 0.2);
2396 *border-right-width: 2px;
2397 *border-bottom-width: 2px;
2398 -webkit-border-radius: 6px;
2399 -moz-border-radius: 6px;
2400 border-radius: 6px;
2401 -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
2402 -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
2403 box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
2404 -webkit-background-clip: padding-box;
2405 -moz-background-clip: padding;
2406 background-clip: padding-box;
2407}
2408.dropdown-menu.pull-right {
2409 right: 0;
2410 left: auto;
2411}
2412.dropdown-menu .divider {
2413 *width: 100%;
2414 height: 1px;
2415 margin: 9px 1px;
2416 *margin: -5px 0 5px;
2417 overflow: hidden;
2418 background-color: #e5e5e5;
2419 border-bottom: 1px solid #ffffff;
2420}
2421.dropdown-menu li > a {
2422 display: block;
2423 padding: 3px 20px;
2424 clear: both;
1796 font-weight: normal; 2425 font-weight: normal;
1797 font-style: normal; 2426 line-height: 20px;
2427 color: #333333;
2428 white-space: nowrap;
1798} 2429}
1799/* line 494, ../scss/include/_skeleton.scss */ 2430.dropdown-menu li > a:hover,
1800#jqt ul.plastic { 2431.dropdown-menu li > a:focus,
1801 font-size: 18px; 2432.dropdown-submenu:hover > a {
2433 text-decoration: none;
2434 color: #ffffff;
2435 background-color: #0081c2;
2436 background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
2437 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
2438 background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
2439 background-image: -o-linear-gradient(top, #0088cc, #0077b3);
2440 background-image: linear-gradient(to bottom, #0088cc, #0077b3);
2441 background-repeat: repeat-x;
2442 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
2443}
2444.dropdown-menu .active > a,
2445.dropdown-menu .active > a:hover {
2446 color: #ffffff;
2447 text-decoration: none;
2448 outline: 0;
2449 background-color: #0081c2;
2450 background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
2451 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
2452 background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
2453 background-image: -o-linear-gradient(top, #0088cc, #0077b3);
2454 background-image: linear-gradient(to bottom, #0088cc, #0077b3);
2455 background-repeat: repeat-x;
2456 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
2457}
2458.dropdown-menu .disabled > a,
2459.dropdown-menu .disabled > a:hover {
2460 color: #999999;
2461}
2462.dropdown-menu .disabled > a:hover {
2463 text-decoration: none;
2464 background-color: transparent;
2465 background-image: none;
2466 filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
2467 cursor: default;
2468}
2469.open {
2470 *z-index: 1000;
2471}
2472.open > .dropdown-menu {
2473 display: block;
2474}
2475.pull-right > .dropdown-menu {
2476 right: 0;
2477 left: auto;
2478}
2479.dropup .caret,
2480.navbar-fixed-bottom .dropdown .caret {
2481 border-top: 0;
2482 border-bottom: 4px solid #000000;
2483 content: "";
2484}
2485.dropup .dropdown-menu,
2486.navbar-fixed-bottom .dropdown .dropdown-menu {
2487 top: auto;
2488 bottom: 100%;
2489 margin-bottom: 1px;
2490}
2491.dropdown-submenu {
2492 position: relative;
2493}
2494.dropdown-submenu > .dropdown-menu {
2495 top: 0;
2496 left: 100%;
2497 margin-top: -6px;
2498 margin-left: -1px;
2499 -webkit-border-radius: 0 6px 6px 6px;
2500 -moz-border-radius: 0 6px 6px 6px;
2501 border-radius: 0 6px 6px 6px;
2502}
2503.dropdown-submenu:hover > .dropdown-menu {
2504 display: block;
2505}
2506.dropup .dropdown-submenu > .dropdown-menu {
2507 top: auto;
2508 bottom: 0;
2509 margin-top: 0;
2510 margin-bottom: -2px;
2511 -webkit-border-radius: 5px 5px 5px 0;
2512 -moz-border-radius: 5px 5px 5px 0;
2513 border-radius: 5px 5px 5px 0;
1802} 2514}
1803/* line 498, ../scss/include/_skeleton.scss */ 2515.dropdown-submenu > a:after {
1804#jqt ul.plastic li { 2516 display: block;
1805 border-width: 1px 0; 2517 content: " ";
2518 float: right;
2519 width: 0;
2520 height: 0;
2521 border-color: transparent;
1806 border-style: solid; 2522 border-style: solid;
1807 background-image: none; 2523 border-width: 5px 0 5px 5px;
1808 background-color: #2a2b2c; 2524 border-left-color: #cccccc;
1809 border-top-color: #2f3031; 2525 margin-top: 5px;
1810 border-bottom-color: #232324; 2526 margin-right: -10px;
2527}
2528.dropdown-submenu:hover > a:after {
2529 border-left-color: #ffffff;
2530}
2531.dropdown-submenu.pull-left {
2532 float: none;
2533}
2534.dropdown-submenu.pull-left > .dropdown-menu {
2535 left: -100%;
2536 margin-left: 10px;
2537 -webkit-border-radius: 6px 0 6px 6px;
2538 -moz-border-radius: 6px 0 6px 6px;
2539 border-radius: 6px 0 6px 6px;
2540}
2541.dropdown .dropdown-menu .nav-header {
2542 padding-left: 20px;
2543 padding-right: 20px;
2544}
2545.typeahead {
2546 z-index: 1051;
2547 margin-top: 2px;
2548 -webkit-border-radius: 4px;
2549 -moz-border-radius: 4px;
2550 border-radius: 4px;
1811} 2551}
1812/* line 506, ../scss/include/_skeleton.scss */ 2552.well {
1813#jqt ul.plastic li:nth-child(odd) { 2553 min-height: 20px;
1814 background-image: none; 2554 padding: 19px;
1815 background-color: #2f3031; 2555 margin-bottom: 20px;
2556 background-color: #f5f5f5;
2557 border: 1px solid #e3e3e3;
2558 -webkit-border-radius: 4px;
2559 -moz-border-radius: 4px;
2560 border-radius: 4px;
2561 -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
2562 -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
2563 box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
2564}
2565.well blockquote {
2566 border-color: #ddd;
2567 border-color: rgba(0, 0, 0, 0.15);
2568}
2569.well-large {
2570 padding: 24px;
2571 -webkit-border-radius: 6px;
2572 -moz-border-radius: 6px;
2573 border-radius: 6px;
2574}
2575.well-small {
2576 padding: 9px;
2577 -webkit-border-radius: 3px;
2578 -moz-border-radius: 3px;
2579 border-radius: 3px;
1816} 2580}
1817/* line 510, ../scss/include/_skeleton.scss */ 2581.fade {
1818#jqt ul.plastic li a.active.loading { 2582 opacity: 0;
1819 background-image: url(img/loading.gif); 2583 -webkit-transition: opacity 0.15s linear;
1820 background-position: 95% center; 2584 -moz-transition: opacity 0.15s linear;
1821 background-repeat: no-repeat; 2585 -o-transition: opacity 0.15s linear;
2586 transition: opacity 0.15s linear;
1822} 2587}
1823/* line 515, ../scss/include/_skeleton.scss */ 2588.fade.in {
1824#jqt ul.plastic li small { 2589 opacity: 1;
1825 color: #949698; 2590}
1826 font-size: 13px; 2591.collapse {
2592 position: relative;
2593 height: 0;
2594 overflow: hidden;
2595 -webkit-transition: height 0.35s ease;
2596 -moz-transition: height 0.35s ease;
2597 -o-transition: height 0.35s ease;
2598 transition: height 0.35s ease;
2599}
2600.collapse.in {
2601 height: auto;
2602}
2603.close {
2604 float: right;
2605 font-size: 20px;
1827 font-weight: bold; 2606 font-weight: bold;
1828 text-transform: uppercase; 2607 line-height: 20px;
2608 color: #000000;
2609 text-shadow: 0 1px 0 #ffffff;
2610 opacity: 0.2;
2611 filter: alpha(opacity=20);
2612}
2613.close:hover {
2614 color: #000000;
2615 text-decoration: none;
2616 cursor: pointer;
2617 opacity: 0.4;
2618 filter: alpha(opacity=40);
1829} 2619}
1830/* line 525, ../scss/include/_skeleton.scss */ 2620button.close {
1831#jqt ul.individual { 2621 padding: 0;
2622 cursor: pointer;
2623 background: transparent;
1832 border: 0; 2624 border: 0;
1833 background: none; 2625 -webkit-appearance: none;
1834 clear: both;
1835 overflow: hidden;
1836} 2626}
1837/* line 531, ../scss/include/_skeleton.scss */ 2627.btn {
1838#jqt ul.individual li { 2628 display: inline-block;
2629 *display: inline;
2630 /* IE7 inline-block hack */
2631
2632 *zoom: 1;
2633 padding: 4px 12px;
2634 margin-bottom: 0;
1839 font-size: 14px; 2635 font-size: 14px;
2636 line-height: 20px;
1840 text-align: center; 2637 text-align: center;
1841 -webkit-border-radius: 8px; 2638 vertical-align: middle;
1842 border-radius: 8px; 2639 cursor: pointer;
2640 color: #333333;
2641 text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
2642 background-color: #f5f5f5;
2643 background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
2644 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
2645 background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
2646 background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
2647 background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
2648 background-repeat: repeat-x;
2649 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
2650 border-color: #e6e6e6 #e6e6e6 #bfbfbf;
2651 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2652 *background-color: #e6e6e6;
2653 /* Darken IE7 buttons by default so they stand out more given they won't have borders */
2654
2655 filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
2656 border: 1px solid #bbbbbb;
2657 *border: 0;
2658 border-bottom-color: #a2a2a2;
2659 -webkit-border-radius: 4px;
2660 -moz-border-radius: 4px;
2661 border-radius: 4px;
2662 *margin-left: .3em;
2663 -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
2664 -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
2665 box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
2666}
2667.btn:hover,
2668.btn:active,
2669.btn.active,
2670.btn.disabled,
2671.btn[disabled] {
2672 color: #333333;
2673 background-color: #e6e6e6;
2674 *background-color: #d9d9d9;
2675}
2676.btn:active,
2677.btn.active {
2678 background-color: #cccccc \9;
2679}
2680.btn:first-child {
2681 *margin-left: 0;
2682}
2683.btn:hover {
2684 color: #333333;
2685 text-decoration: none;
2686 background-position: 0 -15px;
2687 -webkit-transition: background-position 0.1s linear;
2688 -moz-transition: background-position 0.1s linear;
2689 -o-transition: background-position 0.1s linear;
2690 transition: background-position 0.1s linear;
2691}
2692.btn:focus {
2693 outline: thin dotted #333;
2694 outline: 5px auto -webkit-focus-ring-color;
2695 outline-offset: -2px;
2696}
2697.btn.active,
2698.btn:active {
2699 background-image: none;
2700 outline: 0;
2701 -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
2702 -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
2703 box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
2704}
2705.btn.disabled,
2706.btn[disabled] {
2707 cursor: default;
2708 background-image: none;
2709 opacity: 0.65;
2710 filter: alpha(opacity=65);
2711 -webkit-box-shadow: none;
2712 -moz-box-shadow: none;
2713 box-shadow: none;
2714}
2715.btn-large {
2716 padding: 11px 19px;
2717 font-size: 17.5px;
2718 -webkit-border-radius: 6px;
2719 -moz-border-radius: 6px;
2720 border-radius: 6px;
2721}
2722.btn-large [class^="icon-"],
2723.btn-large [class*=" icon-"] {
2724 margin-top: 4px;
2725}
2726.btn-small {
2727 padding: 2px 10px;
2728 font-size: 11.9px;
2729 -webkit-border-radius: 3px;
2730 -moz-border-radius: 3px;
2731 border-radius: 3px;
2732}
2733.btn-small [class^="icon-"],
2734.btn-small [class*=" icon-"] {
2735 margin-top: 0;
2736}
2737.btn-mini [class^="icon-"],
2738.btn-mini [class*=" icon-"] {
2739 margin-top: -1px;
2740}
2741.btn-mini {
2742 padding: 0 6px;
2743 font-size: 10.5px;
2744 -webkit-border-radius: 3px;
2745 -moz-border-radius: 3px;
2746 border-radius: 3px;
2747}
2748.btn-block {
2749 display: block;
2750 width: 100%;
2751 padding-left: 0;
2752 padding-right: 0;
1843 -webkit-box-sizing: border-box; 2753 -webkit-box-sizing: border-box;
2754 -moz-box-sizing: border-box;
1844 box-sizing: border-box; 2755 box-sizing: border-box;
1845 width: 48%; 2756}
1846 float: left; 2757.btn-block + .btn-block {
2758 margin-top: 5px;
2759}
2760input[type="submit"].btn-block,
2761input[type="reset"].btn-block,
2762input[type="button"].btn-block {
2763 width: 100%;
2764}
2765.btn-primary.active,
2766.btn-warning.active,
2767.btn-danger.active,
2768.btn-success.active,
2769.btn-info.active,
2770.btn-inverse.active {
2771 color: rgba(255, 255, 255, 0.75);
2772}
2773.btn {
2774 border-color: #c5c5c5;
2775 border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
2776}
2777.btn-primary {
2778 color: #ffffff;
2779 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
2780 background-color: #006dcc;
2781 background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
2782 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
2783 background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
2784 background-image: -o-linear-gradient(top, #0088cc, #0044cc);
2785 background-image: linear-gradient(to bottom, #0088cc, #0044cc);
2786 background-repeat: repeat-x;
2787 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
2788 border-color: #0044cc #0044cc #002a80;
2789 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2790 *background-color: #0044cc;
2791 /* Darken IE7 buttons by default so they stand out more given they won't have borders */
2792
2793 filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
2794}
2795.btn-primary:hover,
2796.btn-primary:active,
2797.btn-primary.active,
2798.btn-primary.disabled,
2799.btn-primary[disabled] {
2800 color: #ffffff;
2801 background-color: #0044cc;
2802 *background-color: #003bb3;
2803}
2804.btn-primary:active,
2805.btn-primary.active {
2806 background-color: #003399 \9;
2807}
2808.btn-warning {
2809 color: #ffffff;
2810 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
2811 background-color: #faa732;
2812 background-image: -moz-linear-gradient(top, #fbb450, #f89406);
2813 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
2814 background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
2815 background-image: -o-linear-gradient(top, #fbb450, #f89406);
2816 background-image: linear-gradient(to bottom, #fbb450, #f89406);
2817 background-repeat: repeat-x;
2818 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
2819 border-color: #f89406 #f89406 #ad6704;
2820 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2821 *background-color: #f89406;
2822 /* Darken IE7 buttons by default so they stand out more given they won't have borders */
2823
2824 filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
2825}
2826.btn-warning:hover,
2827.btn-warning:active,
2828.btn-warning.active,
2829.btn-warning.disabled,
2830.btn-warning[disabled] {
2831 color: #ffffff;
2832 background-color: #f89406;
2833 *background-color: #df8505;
2834}
2835.btn-warning:active,
2836.btn-warning.active {
2837 background-color: #c67605 \9;
2838}
2839.btn-danger {
2840 color: #ffffff;
2841 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
2842 background-color: #da4f49;
2843 background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
2844 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
2845 background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
2846 background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
2847 background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
2848 background-repeat: repeat-x;
2849 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
2850 border-color: #bd362f #bd362f #802420;
2851 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2852 *background-color: #bd362f;
2853 /* Darken IE7 buttons by default so they stand out more given they won't have borders */
2854
2855 filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
2856}
2857.btn-danger:hover,
2858.btn-danger:active,
2859.btn-danger.active,
2860.btn-danger.disabled,
2861.btn-danger[disabled] {
2862 color: #ffffff;
2863 background-color: #bd362f;
2864 *background-color: #a9302a;
2865}
2866.btn-danger:active,
2867.btn-danger.active {
2868 background-color: #942a25 \9;
2869}
2870.btn-success {
2871 color: #ffffff;
2872 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
2873 background-color: #5bb75b;
2874 background-image: -moz-linear-gradient(top, #62c462, #51a351);
2875 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
2876 background-image: -webkit-linear-gradient(top, #62c462, #51a351);
2877 background-image: -o-linear-gradient(top, #62c462, #51a351);
2878 background-image: linear-gradient(to bottom, #62c462, #51a351);
2879 background-repeat: repeat-x;
2880 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
2881 border-color: #51a351 #51a351 #387038;
2882 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2883 *background-color: #51a351;
2884 /* Darken IE7 buttons by default so they stand out more given they won't have borders */
2885
2886 filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
2887}
2888.btn-success:hover,
2889.btn-success:active,
2890.btn-success.active,
2891.btn-success.disabled,
2892.btn-success[disabled] {
2893 color: #ffffff;
2894 background-color: #51a351;
2895 *background-color: #499249;
2896}
2897.btn-success:active,
2898.btn-success.active {
2899 background-color: #408140 \9;
2900}
2901.btn-info {
2902 color: #ffffff;
2903 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
2904 background-color: #49afcd;
2905 background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
2906 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
2907 background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
2908 background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
2909 background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
2910 background-repeat: repeat-x;
2911 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
2912 border-color: #2f96b4 #2f96b4 #1f6377;
2913 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2914 *background-color: #2f96b4;
2915 /* Darken IE7 buttons by default so they stand out more given they won't have borders */
2916
2917 filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
2918}
2919.btn-info:hover,
2920.btn-info:active,
2921.btn-info.active,
2922.btn-info.disabled,
2923.btn-info[disabled] {
2924 color: #ffffff;
2925 background-color: #2f96b4;
2926 *background-color: #2a85a0;
2927}
2928.btn-info:active,
2929.btn-info.active {
2930 background-color: #24748c \9;
2931}
2932.btn-inverse {
2933 color: #ffffff;
2934 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
2935 background-color: #363636;
2936 background-image: -moz-linear-gradient(top, #444444, #222222);
2937 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
2938 background-image: -webkit-linear-gradient(top, #444444, #222222);
2939 background-image: -o-linear-gradient(top, #444444, #222222);
2940 background-image: linear-gradient(to bottom, #444444, #222222);
2941 background-repeat: repeat-x;
2942 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
2943 border-color: #222222 #222222 #000000;
2944 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
2945 *background-color: #222222;
2946 /* Darken IE7 buttons by default so they stand out more given they won't have borders */
2947
2948 filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
2949}
2950.btn-inverse:hover,
2951.btn-inverse:active,
2952.btn-inverse.active,
2953.btn-inverse.disabled,
2954.btn-inverse[disabled] {
2955 color: #ffffff;
2956 background-color: #222222;
2957 *background-color: #151515;
2958}
2959.btn-inverse:active,
2960.btn-inverse.active {
2961 background-color: #080808 \9;
2962}
2963button.btn,
2964input[type="submit"].btn {
2965 *padding-top: 3px;
2966 *padding-bottom: 3px;
2967}
2968button.btn::-moz-focus-inner,
2969input[type="submit"].btn::-moz-focus-inner {
2970 padding: 0;
2971 border: 0;
2972}
2973button.btn.btn-large,
2974input[type="submit"].btn.btn-large {
2975 *padding-top: 7px;
2976 *padding-bottom: 7px;
2977}
2978button.btn.btn-small,
2979input[type="submit"].btn.btn-small {
2980 *padding-top: 3px;
2981 *padding-bottom: 3px;
2982}
2983button.btn.btn-mini,
2984input[type="submit"].btn.btn-mini {
2985 *padding-top: 1px;
2986 *padding-bottom: 1px;
2987}
2988.btn-link,
2989.btn-link:active,
2990.btn-link[disabled] {
2991 background-color: transparent;
2992 background-image: none;
2993 -webkit-box-shadow: none;
2994 -moz-box-shadow: none;
2995 box-shadow: none;
2996}
2997.btn-link {
2998 border-color: transparent;
2999 cursor: pointer;
3000 color: #0088cc;
3001 -webkit-border-radius: 0;
3002 -moz-border-radius: 0;
3003 border-radius: 0;
3004}
3005.btn-link:hover {
3006 color: #005580;
3007 text-decoration: underline;
3008 background-color: transparent;
3009}
3010.btn-link[disabled]:hover {
3011 color: #333333;
3012 text-decoration: none;
3013}
3014.btn-group {
3015 position: relative;
3016 display: inline-block;
3017 *display: inline;
3018 /* IE7 inline-block hack */
3019
3020 *zoom: 1;
3021 font-size: 0;
3022 vertical-align: middle;
3023 white-space: nowrap;
3024 *margin-left: .3em;
3025}
3026.btn-group:first-child {
3027 *margin-left: 0;
3028}
3029.btn-group + .btn-group {
3030 margin-left: 5px;
3031}
3032.btn-toolbar {
3033 font-size: 0;
3034 margin-top: 10px;
3035 margin-bottom: 10px;
3036}
3037.btn-toolbar > .btn + .btn,
3038.btn-toolbar > .btn-group + .btn,
3039.btn-toolbar > .btn + .btn-group {
3040 margin-left: 5px;
3041}
3042.btn-group > .btn {
3043 position: relative;
3044 -webkit-border-radius: 0;
3045 -moz-border-radius: 0;
3046 border-radius: 0;
3047}
3048.btn-group > .btn + .btn {
3049 margin-left: -1px;
3050}
3051.btn-group > .btn,
3052.btn-group > .dropdown-menu,
3053.btn-group > .popover {
3054 font-size: 14px;
3055}
3056.btn-group > .btn-mini {
3057 font-size: 10.5px;
3058}
3059.btn-group > .btn-small {
3060 font-size: 11.9px;
3061}
3062.btn-group > .btn-large {
3063 font-size: 17.5px;
3064}
3065.btn-group > .btn:first-child {
3066 margin-left: 0;
3067 -webkit-border-top-left-radius: 4px;
3068 -moz-border-radius-topleft: 4px;
3069 border-top-left-radius: 4px;
3070 -webkit-border-bottom-left-radius: 4px;
3071 -moz-border-radius-bottomleft: 4px;
3072 border-bottom-left-radius: 4px;
3073}
3074.btn-group > .btn:last-child,
3075.btn-group > .dropdown-toggle {
3076 -webkit-border-top-right-radius: 4px;
3077 -moz-border-radius-topright: 4px;
3078 border-top-right-radius: 4px;
3079 -webkit-border-bottom-right-radius: 4px;
3080 -moz-border-radius-bottomright: 4px;
3081 border-bottom-right-radius: 4px;
3082}
3083.btn-group > .btn.large:first-child {
3084 margin-left: 0;
3085 -webkit-border-top-left-radius: 6px;
3086 -moz-border-radius-topleft: 6px;
3087 border-top-left-radius: 6px;
3088 -webkit-border-bottom-left-radius: 6px;
3089 -moz-border-radius-bottomleft: 6px;
3090 border-bottom-left-radius: 6px;
3091}
3092.btn-group > .btn.large:last-child,
3093.btn-group > .large.dropdown-toggle {
3094 -webkit-border-top-right-radius: 6px;
3095 -moz-border-radius-topright: 6px;
3096 border-top-right-radius: 6px;
3097 -webkit-border-bottom-right-radius: 6px;
3098 -moz-border-radius-bottomright: 6px;
3099 border-bottom-right-radius: 6px;
3100}
3101.btn-group > .btn:hover,
3102.btn-group > .btn:focus,
3103.btn-group > .btn:active,
3104.btn-group > .btn.active {
3105 z-index: 2;
3106}
3107.btn-group .dropdown-toggle:active,
3108.btn-group.open .dropdown-toggle {
3109 outline: 0;
3110}
3111.btn-group > .btn + .dropdown-toggle {
3112 padding-left: 8px;
3113 padding-right: 8px;
3114 -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);
3115 -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);
3116 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);
3117 *padding-top: 5px;
3118 *padding-bottom: 5px;
3119}
3120.btn-group > .btn-mini + .dropdown-toggle {
3121 padding-left: 5px;
3122 padding-right: 5px;
3123 *padding-top: 2px;
3124 *padding-bottom: 2px;
3125}
3126.btn-group > .btn-small + .dropdown-toggle {
3127 *padding-top: 5px;
3128 *padding-bottom: 4px;
3129}
3130.btn-group > .btn-large + .dropdown-toggle {
3131 padding-left: 12px;
3132 padding-right: 12px;
3133 *padding-top: 7px;
3134 *padding-bottom: 7px;
3135}
3136.btn-group.open .dropdown-toggle {
3137 background-image: none;
3138 -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
3139 -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
3140 box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
3141}
3142.btn-group.open .btn.dropdown-toggle {
3143 background-color: #e6e6e6;
3144}
3145.btn-group.open .btn-primary.dropdown-toggle {
3146 background-color: #0044cc;
3147}
3148.btn-group.open .btn-warning.dropdown-toggle {
3149 background-color: #f89406;
3150}
3151.btn-group.open .btn-danger.dropdown-toggle {
3152 background-color: #bd362f;
3153}
3154.btn-group.open .btn-success.dropdown-toggle {
3155 background-color: #51a351;
3156}
3157.btn-group.open .btn-info.dropdown-toggle {
3158 background-color: #2f96b4;
3159}
3160.btn-group.open .btn-inverse.dropdown-toggle {
3161 background-color: #222222;
3162}
3163.btn .caret {
3164 margin-top: 8px;
3165 margin-left: 0;
3166}
3167.btn-mini .caret,
3168.btn-small .caret,
3169.btn-large .caret {
3170 margin-top: 6px;
3171}
3172.btn-large .caret {
3173 border-left-width: 5px;
3174 border-right-width: 5px;
3175 border-top-width: 5px;
3176}
3177.dropup .btn-large .caret {
3178 border-bottom-width: 5px;
3179}
3180.btn-primary .caret,
3181.btn-warning .caret,
3182.btn-danger .caret,
3183.btn-info .caret,
3184.btn-success .caret,
3185.btn-inverse .caret {
3186 border-top-color: #ffffff;
3187 border-bottom-color: #ffffff;
3188}
3189.btn-group-vertical {
3190 display: inline-block;
3191 *display: inline;
3192 /* IE7 inline-block hack */
3193
3194 *zoom: 1;
3195}
3196.btn-group-vertical > .btn {
1847 display: block; 3197 display: block;
1848 padding: 11px 10px 14px 10px; 3198 float: none;
3199 max-width: 100%;
3200 -webkit-border-radius: 0;
3201 -moz-border-radius: 0;
3202 border-radius: 0;
1849} 3203}
1850/* line 541, ../scss/include/_skeleton.scss */ 3204.btn-group-vertical > .btn + .btn {
1851#jqt ul.individual li + li { 3205 margin-left: 0;
1852 float: right; 3206 margin-top: -1px;
3207}
3208.btn-group-vertical > .btn:first-child {
3209 -webkit-border-radius: 4px 4px 0 0;
3210 -moz-border-radius: 4px 4px 0 0;
3211 border-radius: 4px 4px 0 0;
3212}
3213.btn-group-vertical > .btn:last-child {
3214 -webkit-border-radius: 0 0 4px 4px;
3215 -moz-border-radius: 0 0 4px 4px;
3216 border-radius: 0 0 4px 4px;
3217}
3218.btn-group-vertical > .btn-large:first-child {
3219 -webkit-border-radius: 6px 6px 0 0;
3220 -moz-border-radius: 6px 6px 0 0;
3221 border-radius: 6px 6px 0 0;
3222}
3223.btn-group-vertical > .btn-large:last-child {
3224 -webkit-border-radius: 0 0 6px 6px;
3225 -moz-border-radius: 0 0 6px 6px;
3226 border-radius: 0 0 6px 6px;
3227}
3228.alert {
3229 padding: 8px 35px 8px 14px;
3230 margin-bottom: 20px;
3231 text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
3232 background-color: #fcf8e3;
3233 border: 1px solid #fbeed5;
3234 -webkit-border-radius: 4px;
3235 -moz-border-radius: 4px;
3236 border-radius: 4px;
3237}
3238.alert,
3239.alert h4 {
3240 color: #c09853;
3241}
3242.alert h4 {
3243 margin: 0;
1853} 3244}
1854/* line 546, ../scss/include/_skeleton.scss */ 3245.alert .close {
1855#jqt ul.individual a {
1856 line-height: 16px;
1857 margin: -11px -10px -14px -10px;
1858 padding: 11px 10px 14px 10px;
1859 -webkit-border-radius: 8px;
1860 border-radius: 8px;
1861}
1862/* line 555, ../scss/include/_skeleton.scss */
1863#jqt .toggle {
1864 width: 94px;
1865 position: relative; 3246 position: relative;
1866 height: 27px; 3247 top: -2px;
3248 right: -21px;
3249 line-height: 20px;
3250}
3251.alert-success {
3252 background-color: #dff0d8;
3253 border-color: #d6e9c6;
3254 color: #468847;
3255}
3256.alert-success h4 {
3257 color: #468847;
3258}
3259.alert-danger,
3260.alert-error {
3261 background-color: #f2dede;
3262 border-color: #eed3d7;
3263 color: #b94a48;
3264}
3265.alert-danger h4,
3266.alert-error h4 {
3267 color: #b94a48;
3268}
3269.alert-info {
3270 background-color: #d9edf7;
3271 border-color: #bce8f1;
3272 color: #3a87ad;
3273}
3274.alert-info h4 {
3275 color: #3a87ad;
3276}
3277.alert-block {
3278 padding-top: 14px;
3279 padding-bottom: 14px;
3280}
3281.alert-block > p,
3282.alert-block > ul {
3283 margin-bottom: 0;
3284}
3285.alert-block p + p {
3286 margin-top: 5px;
3287}
3288.nav {
3289 margin-left: 0;
3290 margin-bottom: 20px;
3291 list-style: none;
3292}
3293.nav > li > a {
1867 display: block; 3294 display: block;
1868 overflow: hidden; 3295}
3296.nav > li > a:hover {
3297 text-decoration: none;
3298 background-color: #eeeeee;
3299}
3300.nav > li > a > img {
3301 max-width: none;
3302}
3303.nav > .pull-right {
1869 float: right; 3304 float: right;
1870} 3305}
1871/* line 563, ../scss/include/_skeleton.scss */ 3306.nav-header {
1872#jqt .toggle input[type="checkbox"] { 3307 display: block;
1873 margin: 0; 3308 padding: 3px 15px;
1874 -webkit-border-radius: 5px; 3309 font-size: 11px;
1875 border-radius: 5px; 3310 font-weight: bold;
1876 height: 27px; 3311 line-height: 20px;
3312 color: #999999;
3313 text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
3314 text-transform: uppercase;
3315}
3316.nav li + .nav-header {
3317 margin-top: 9px;
3318}
3319.nav-list {
3320 padding-left: 15px;
3321 padding-right: 15px;
3322 margin-bottom: 0;
3323}
3324.nav-list > li > a,
3325.nav-list .nav-header {
3326 margin-left: -15px;
3327 margin-right: -15px;
3328 text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
3329}
3330.nav-list > li > a {
3331 padding: 3px 15px;
3332}
3333.nav-list > .active > a,
3334.nav-list > .active > a:hover {
3335 color: #ffffff;
3336 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
3337 background-color: #0088cc;
3338}
3339.nav-list [class^="icon-"],
3340.nav-list [class*=" icon-"] {
3341 margin-right: 2px;
3342}
3343.nav-list .divider {
3344 *width: 100%;
3345 height: 1px;
3346 margin: 9px 1px;
3347 *margin: -5px 0 5px;
1877 overflow: hidden; 3348 overflow: hidden;
1878 width: 149px; 3349 background-color: #e5e5e5;
1879 border: 0; 3350 border-bottom: 1px solid #ffffff;
1880 -webkit-transition: left 0.15s ease-in-out; 3351}
1881 transition: left 0.15s ease-in-out; 3352.nav-tabs,
1882 position: absolute; 3353.nav-pills {
1883 top: 0; 3354 *zoom: 1;
1884 left: -55px; 3355}
1885 -webkit-appearance: textarea; 3356.nav-tabs:before,
1886 -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 3357.nav-pills:before,
3358.nav-tabs:after,
3359.nav-pills:after {
3360 display: table;
3361 content: "";
3362 line-height: 0;
1887} 3363}
1888/* line 577, ../scss/include/_skeleton.scss */ 3364.nav-tabs:after,
1889#jqt .toggle input[type="checkbox"]:checked { 3365.nav-pills:after {
1890 left: 0px; 3366 clear: both;
1891} 3367}
1892/* line 583, ../scss/include/_skeleton.scss */ 3368.nav-tabs > li,
1893#jqt .info { 3369.nav-pills > li {
1894 font-size: 12px; 3370 float: left;
1895 line-height: 16px;
1896 text-align: center;
1897 color: #444;
1898 padding: 15px;
1899 font-weight: bold;
1900} 3371}
1901/* line 12, ../scss/jqtouch.scss */ 3372.nav-tabs > li > a,
1902#jqt { 3373.nav-pills > li > a {
1903 /* Lists */ 3374 padding-right: 12px;
1904 3375 padding-left: 12px;
3376 margin-right: 2px;
3377 line-height: 14px;
1905} 3378}
1906/* line 13, ../scss/jqtouch.scss */ 3379.nav-tabs {
1907#jqt > * { 3380 border-bottom: 1px solid #ddd;
1908 background-image: url('data:image/png;base64,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'), -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #7b7c7f), color-stop(30%, #696a6d), color-stop(65%, #555658), color-stop(100%, #464748)); 3381}
1909 background-image: url('data:image/png;base64,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'), -webkit-linear-gradient(top, #7b7c7f, #696a6d 30%, #555658 65%, #464748); 3382.nav-tabs > li {
1910 background-image: url('data:image/png;base64,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'), linear-gradient(top, #7b7c7f, #696a6d 30%, #555658 65%, #464748); 3383 margin-bottom: -1px;
1911} 3384}
1912/* line 20, ../scss/jqtouch.scss */ 3385.nav-tabs > li > a {
1913#jqt .toolbar { 3386 padding-top: 8px;
1914 background-image: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 12.5, color-stop(12.5%, #181819), color-stop(12.5%, rgba(11, 11, 12, 0))), -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 12.5, color-stop(12.5%, #181819), color-stop(12.5%, rgba(11, 11, 12, 0))), -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 12.5, color-stop(12.5%, rgba(255, 255, 255, 0.1)), color-stop(12.5%, rgba(255, 255, 255, 0))), -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 12.5, color-stop(12.5%, rgba(255, 255, 255, 0.1)), color-stop(12.5%, rgba(255, 255, 255, 0))); 3387 padding-bottom: 8px;
1915 background-image: -webkit-radial-gradient(#181819 12.5%, rgba(11, 11, 12, 0) 12.5%), -webkit-radial-gradient(#181819 12.5%, rgba(11, 11, 12, 0) 12.5%), -webkit-radial-gradient(rgba(255, 255, 255, 0.1) 12.5%, rgba(255, 255, 255, 0) 12.5%), -webkit-radial-gradient(rgba(255, 255, 255, 0.1) 12.5%, rgba(255, 255, 255, 0) 12.5%); 3388 line-height: 20px;
1916 background-image: radial-gradient(#181819 12.5%, rgba(11, 11, 12, 0) 12.5%), radial-gradient(#181819 12.5%, rgba(11, 11, 12, 0) 12.5%), radial-gradient(rgba(255, 255, 255, 0.1) 12.5%, rgba(255, 255, 255, 0) 12.5%), radial-gradient(rgba(255, 255, 255, 0.1) 12.5%, rgba(255, 255, 255, 0) 12.5%); 3389 border: 1px solid transparent;
1917 background-repeat: repeat; 3390 -webkit-border-radius: 4px 4px 0 0;
1918 background-position: 0 0, 8px 8px, 0 1px, 8px 9px; 3391 -moz-border-radius: 4px 4px 0 0;
1919 background-color: #2f3031; 3392 border-radius: 4px 4px 0 0;
1920 background-size: 16px 16px; 3393}
1921} 3394.nav-tabs > li > a:hover {
1922/* line 29, ../scss/jqtouch.scss */ 3395 border-color: #eeeeee #eeeeee #dddddd;
1923#jqt ul li { 3396}
1924 border-top: 1px solid #48494b; 3397.nav-tabs > .active > a,
1925 background-image: none; 3398.nav-tabs > .active > a:hover {
1926 background-color: rgba(85, 86, 88, 0.2); 3399 color: #555555;
1927 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(123, 124, 127, 0.2)), color-stop(3%, rgba(98, 99, 101, 0.2)), color-stop(100%, rgba(72, 73, 75, 0.2))); 3400 background-color: #ffffff;
1928 background-image: -webkit-linear-gradient(top, rgba(123, 124, 127, 0.2), rgba(98, 99, 101, 0.2) 3%, rgba(72, 73, 75, 0.2)); 3401 border: 1px solid #ddd;
1929 background-image: linear-gradient(top, rgba(123, 124, 127, 0.2), rgba(98, 99, 101, 0.2) 3%, rgba(72, 73, 75, 0.2)); 3402 border-bottom-color: transparent;
1930} 3403 cursor: default;
1931/* line 33, ../scss/jqtouch.scss */ 3404}
1932#jqt ul li a { 3405.nav-pills > li > a {
1933 color: white; 3406 padding-top: 8px;
1934 text-shadow: #3c3d3e 0 -1px 0; 3407 padding-bottom: 8px;
1935} 3408 margin-top: 2px;
1936/* line 37, ../scss/jqtouch.scss */ 3409 margin-bottom: 2px;
1937#jqt ul li .toggle input[type="checkbox"] {
1938 -webkit-border-radius: 5px; 3410 -webkit-border-radius: 5px;
3411 -moz-border-radius: 5px;
1939 border-radius: 5px; 3412 border-radius: 5px;
1940 background: #ffffff url(../img/jqt/on_off.png) 0 0 no-repeat;
1941} 3413}
1942/* line 42, ../scss/jqtouch.scss */ 3414.nav-pills > .active > a,
1943#jqt ul li input[type='submit'] { 3415.nav-pills > .active > a:hover {
1944 background-image: none; 3416 color: #ffffff;
1945 background-color: white; 3417 background-color: #0088cc;
1946 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(50%, #ffffff), color-stop(51%, #ffffff), color-stop(100%, #f2f2f2));
1947 background-image: -webkit-linear-gradient(top, #ffffff, #ffffff 50%, #ffffff 51%, #f2f2f2);
1948 background-image: linear-gradient(top, #ffffff, #ffffff 50%, #ffffff 51%, #f2f2f2);
1949 border: 1px outset black;
1950}
1951/* line 47, ../scss/jqtouch.scss */
1952#jqt ul li small.counter {
1953 -webkit-box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0;
1954 box-shadow: rgba(255, 255, 255, 0.1) 0 1px 0;
1955}
1956/* line 54, ../scss/jqtouch.scss */
1957#jqt ul.metal li {
1958 background-image: none;
1959 border-top: 1px solid #fff;
1960 border-bottom: 1px solid #666;
1961 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eeeeee), to(#9c9ea0));
1962} 3418}
1963/* line 60, ../scss/jqtouch.scss */ 3419.nav-stacked > li {
1964#jqt ul.metal li a { 3420 float: none;
1965 text-shadow: #fff 0 1px 0;
1966} 3421}
1967/* line 62, ../scss/jqtouch.scss */ 3422.nav-stacked > li > a {
1968#jqt ul.metal li a.active { 3423 margin-right: 0;
1969 color: #000;
1970} 3424}
1971/* line 65, ../scss/jqtouch.scss */ 3425.nav-tabs.nav-stacked {
1972#jqt ul.metal li em { 3426 border-bottom: 0;
1973 color: #444;
1974} 3427}
1975/* line 71, ../scss/jqtouch.scss */ 3428.nav-tabs.nav-stacked > li > a {
1976#jqt ul.edgetoedge li { 3429 border: 1px solid #ddd;
1977 background-image: none; 3430 -webkit-border-radius: 0;
1978 background-color: #3c3d3e; 3431 -moz-border-radius: 0;
1979 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #282829), color-stop(100%, #2f3031)); 3432 border-radius: 0;
1980 background-image: -webkit-linear-gradient(top, #282829, #2f3031);
1981 background-image: linear-gradient(top, #282829, #2f3031);
1982 border-bottom: 1px solid #1e1e1f;
1983 border-top: 1px solid #343536;
1984}
1985/* line 76, ../scss/jqtouch.scss */
1986#jqt ul.edgetoedge li.sep {
1987 background-image: none;
1988 background-color: rgba(0, 0, 0, 0.3);
1989 background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(38, 38, 38, 0.3)), color-stop(30%, rgba(20, 20, 20, 0.3)), color-stop(65%, rgba(0, 0, 0, 0.3)), color-stop(100%, rgba(0, 0, 0, 0.3)));
1990 background-image: -webkit-linear-gradient(top, rgba(38, 38, 38, 0.3), rgba(20, 20, 20, 0.3) 30%, rgba(0, 0, 0, 0.3) 65%, rgba(0, 0, 0, 0.3));
1991 background-image: linear-gradient(top, rgba(38, 38, 38, 0.3), rgba(20, 20, 20, 0.3) 30%, rgba(0, 0, 0, 0.3) 65%, rgba(0, 0, 0, 0.3));
1992 color: #949698;
1993 text-shadow: #000000 0 -1px 0;
1994}
1995/* line 83, ../scss/jqtouch.scss */
1996#jqt .info {
1997 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#cccccc), to(#aaaaaa), color-stop(0.6, #cccccc));
1998 text-shadow: rgba(255, 255, 255, 0.8) 0 1px 0;
1999 color: #444;
2000 border-top: 1px solid rgba(255, 255, 255, 0.2);
2001} 3433}
2002div.spinner { 3434.nav-tabs.nav-stacked > li:first-child > a {
3435 -webkit-border-top-right-radius: 4px;
3436 -moz-border-radius-topright: 4px;
3437 border-top-right-radius: 4px;
3438 -webkit-border-top-left-radius: 4px;
3439 -moz-border-radius-topleft: 4px;
3440 border-top-left-radius: 4px;
3441}
3442.nav-tabs.nav-stacked > li:last-child > a {
3443 -webkit-border-bottom-right-radius: 4px;
3444 -moz-border-radius-bottomright: 4px;
3445 border-bottom-right-radius: 4px;
3446 -webkit-border-bottom-left-radius: 4px;
3447 -moz-border-radius-bottomleft: 4px;
3448 border-bottom-left-radius: 4px;
3449}
3450.nav-tabs.nav-stacked > li > a:hover {
3451 border-color: #ddd;
3452 z-index: 2;
3453}
3454.nav-pills.nav-stacked > li > a {
3455 margin-bottom: 3px;
3456}
3457.nav-pills.nav-stacked > li:last-child > a {
3458 margin-bottom: 1px;
3459}
3460.nav-tabs .dropdown-menu {
3461 -webkit-border-radius: 0 0 6px 6px;
3462 -moz-border-radius: 0 0 6px 6px;
3463 border-radius: 0 0 6px 6px;
3464}
3465.nav-pills .dropdown-menu {
3466 -webkit-border-radius: 6px;
3467 -moz-border-radius: 6px;
3468 border-radius: 6px;
3469}
3470.nav .dropdown-toggle .caret {
3471 border-top-color: #0088cc;
3472 border-bottom-color: #0088cc;
3473 margin-top: 6px;
3474}
3475.nav .dropdown-toggle:hover .caret {
3476 border-top-color: #005580;
3477 border-bottom-color: #005580;
3478}
3479/* move down carets for tabs */
3480.nav-tabs .dropdown-toggle .caret {
3481 margin-top: 8px;
3482}
3483.nav .active .dropdown-toggle .caret {
3484 border-top-color: #fff;
3485 border-bottom-color: #fff;
3486}
3487.nav-tabs .active .dropdown-toggle .caret {
3488 border-top-color: #555555;
3489 border-bottom-color: #555555;
3490}
3491.nav > .dropdown.active > a:hover {
3492 cursor: pointer;
3493}
3494.nav-tabs .open .dropdown-toggle,
3495.nav-pills .open .dropdown-toggle,
3496.nav > li.dropdown.open.active > a:hover {
3497 color: #ffffff;
3498 background-color: #999999;
3499 border-color: #999999;
3500}
3501.nav li.dropdown.open .caret,
3502.nav li.dropdown.open.active .caret,
3503.nav li.dropdown.open a:hover .caret {
3504 border-top-color: #ffffff;
3505 border-bottom-color: #ffffff;
3506 opacity: 1;
3507 filter: alpha(opacity=100);
3508}
3509.tabs-stacked .open > a:hover {
3510 border-color: #999999;
3511}
3512.tabbable {
3513 *zoom: 1;
3514}
3515.tabbable:before,
3516.tabbable:after {
3517 display: table;
3518 content: "";
3519 line-height: 0;
3520}
3521.tabbable:after {
3522 clear: both;
3523}
3524.tab-content {
3525 overflow: auto;
3526}
3527.tabs-below > .nav-tabs,
3528.tabs-right > .nav-tabs,
3529.tabs-left > .nav-tabs {
3530 border-bottom: 0;
3531}
3532.tab-content > .tab-pane,
3533.pill-content > .pill-pane {
3534 display: none;
3535}
3536.tab-content > .active,
3537.pill-content > .active {
3538 display: block;
3539}
3540.tabs-below > .nav-tabs {
3541 border-top: 1px solid #ddd;
3542}
3543.tabs-below > .nav-tabs > li {
3544 margin-top: -1px;
3545 margin-bottom: 0;
3546}
3547.tabs-below > .nav-tabs > li > a {
3548 -webkit-border-radius: 0 0 4px 4px;
3549 -moz-border-radius: 0 0 4px 4px;
3550 border-radius: 0 0 4px 4px;
3551}
3552.tabs-below > .nav-tabs > li > a:hover {
3553 border-bottom-color: transparent;
3554 border-top-color: #ddd;
3555}
3556.tabs-below > .nav-tabs > .active > a,
3557.tabs-below > .nav-tabs > .active > a:hover {
3558 border-color: transparent #ddd #ddd #ddd;
3559}
3560.tabs-left > .nav-tabs > li,
3561.tabs-right > .nav-tabs > li {
3562 float: none;
3563}
3564.tabs-left > .nav-tabs > li > a,
3565.tabs-right > .nav-tabs > li > a {
3566 min-width: 74px;
3567 margin-right: 0;
3568 margin-bottom: 3px;
3569}
3570.tabs-left > .nav-tabs {
3571 float: left;
3572 margin-right: 19px;
3573 border-right: 1px solid #ddd;
3574}
3575.tabs-left > .nav-tabs > li > a {
3576 margin-right: -1px;
3577 -webkit-border-radius: 4px 0 0 4px;
3578 -moz-border-radius: 4px 0 0 4px;
3579 border-radius: 4px 0 0 4px;
3580}
3581.tabs-left > .nav-tabs > li > a:hover {
3582 border-color: #eeeeee #dddddd #eeeeee #eeeeee;
3583}
3584.tabs-left > .nav-tabs .active > a,
3585.tabs-left > .nav-tabs .active > a:hover {
3586 border-color: #ddd transparent #ddd #ddd;
3587 *border-right-color: #ffffff;
3588}
3589.tabs-right > .nav-tabs {
3590 float: right;
3591 margin-left: 19px;
3592 border-left: 1px solid #ddd;
3593}
3594.tabs-right > .nav-tabs > li > a {
3595 margin-left: -1px;
3596 -webkit-border-radius: 0 4px 4px 0;
3597 -moz-border-radius: 0 4px 4px 0;
3598 border-radius: 0 4px 4px 0;
3599}
3600.tabs-right > .nav-tabs > li > a:hover {
3601 border-color: #eeeeee #eeeeee #eeeeee #dddddd;
3602}
3603.tabs-right > .nav-tabs .active > a,
3604.tabs-right > .nav-tabs .active > a:hover {
3605 border-color: #ddd #ddd #ddd transparent;
3606 *border-left-color: #ffffff;
3607}
3608.nav > .disabled > a {
3609 color: #999999;
3610}
3611.nav > .disabled > a:hover {
3612 text-decoration: none;
3613 background-color: transparent;
3614 cursor: default;
3615}
3616.navbar {
3617 overflow: visible;
3618 margin-bottom: 20px;
3619 *position: relative;
3620 *z-index: 2;
3621}
3622.navbar-inner {
3623 min-height: 40px;
3624 padding-left: 20px;
3625 padding-right: 20px;
3626 background-color: #fafafa;
3627 background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
3628 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
3629 background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
3630 background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
3631 background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
3632 background-repeat: repeat-x;
3633 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
3634 border: 1px solid #d4d4d4;
3635 -webkit-border-radius: 4px;
3636 -moz-border-radius: 4px;
3637 border-radius: 4px;
3638 -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
3639 -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
3640 box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
3641 *zoom: 1;
3642}
3643.navbar-inner:before,
3644.navbar-inner:after {
3645 display: table;
3646 content: "";
3647 line-height: 0;
3648}
3649.navbar-inner:after {
3650 clear: both;
3651}
3652.navbar .container {
3653 width: auto;
3654}
3655.nav-collapse.collapse {
3656 height: auto;
3657 overflow: visible;
3658}
3659.navbar .brand {
3660 float: left;
3661 display: block;
3662 padding: 10px 20px 10px;
3663 margin-left: -20px;
3664 font-size: 20px;
3665 font-weight: 200;
3666 color: #777777;
3667 text-shadow: 0 1px 0 #ffffff;
3668}
3669.navbar .brand:hover {
3670 text-decoration: none;
3671}
3672.navbar-text {
3673 margin-bottom: 0;
3674 line-height: 40px;
3675 color: #777777;
3676}
3677.navbar-link {
3678 color: #777777;
3679}
3680.navbar-link:hover {
3681 color: #333333;
3682}
3683.navbar .divider-vertical {
3684 height: 40px;
3685 margin: 0 9px;
3686 border-left: 1px solid #f2f2f2;
3687 border-right: 1px solid #ffffff;
3688}
3689.navbar .btn,
3690.navbar .btn-group {
3691 margin-top: 5px;
3692}
3693.navbar .btn-group .btn,
3694.navbar .input-prepend .btn,
3695.navbar .input-append .btn {
3696 margin-top: 0;
3697}
3698.navbar-form {
3699 margin-bottom: 0;
3700 *zoom: 1;
3701}
3702.navbar-form:before,
3703.navbar-form:after {
3704 display: table;
3705 content: "";
3706 line-height: 0;
3707}
3708.navbar-form:after {
3709 clear: both;
3710}
3711.navbar-form input,
3712.navbar-form select,
3713.navbar-form .radio,
3714.navbar-form .checkbox {
3715 margin-top: 5px;
3716}
3717.navbar-form input,
3718.navbar-form select,
3719.navbar-form .btn {
3720 display: inline-block;
3721 margin-bottom: 0;
3722}
3723.navbar-form input[type="image"],
3724.navbar-form input[type="checkbox"],
3725.navbar-form input[type="radio"] {
3726 margin-top: 3px;
3727}
3728.navbar-form .input-append,
3729.navbar-form .input-prepend {
3730 margin-top: 5px;
3731 white-space: nowrap;
3732}
3733.navbar-form .input-append input,
3734.navbar-form .input-prepend input {
3735 margin-top: 0;
3736}
3737.navbar-search {
2003 position: relative; 3738 position: relative;
2004 width: 100px; 3739 float: left;
2005 height: 100px; 3740 margin-top: 5px;
3741 margin-bottom: 0;
3742}
3743.navbar-search .search-query {
3744 margin-bottom: 0;
3745 padding: 4px 14px;
3746 font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
3747 font-size: 13px;
3748 font-weight: normal;
3749 line-height: 1;
3750 -webkit-border-radius: 15px;
3751 -moz-border-radius: 15px;
3752 border-radius: 15px;
3753}
3754.navbar-static-top {
3755 position: static;
3756 margin-bottom: 0;
3757}
3758.navbar-static-top .navbar-inner {
3759 -webkit-border-radius: 0;
3760 -moz-border-radius: 0;
3761 border-radius: 0;
3762}
3763.navbar-fixed-top,
3764.navbar-fixed-bottom {
3765 position: fixed;
3766 right: 0;
3767 left: 0;
3768 z-index: 1030;
3769 margin-bottom: 0;
3770}
3771.navbar-fixed-top .navbar-inner,
3772.navbar-static-top .navbar-inner {
3773 border-width: 0 0 1px;
3774}
3775.navbar-fixed-bottom .navbar-inner {
3776 border-width: 1px 0 0;
3777}
3778.navbar-fixed-top .navbar-inner,
3779.navbar-fixed-bottom .navbar-inner {
3780 padding-left: 0;
3781 padding-right: 0;
3782 -webkit-border-radius: 0;
3783 -moz-border-radius: 0;
3784 border-radius: 0;
3785}
3786.navbar-static-top .container,
3787.navbar-fixed-top .container,
3788.navbar-fixed-bottom .container {
3789 width: 940px;
3790}
3791.navbar-fixed-top {
3792 top: 0;
3793}
3794.navbar-fixed-top .navbar-inner,
3795.navbar-static-top .navbar-inner {
3796 -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1);
3797 -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1);
3798 box-shadow: 0 1px 10px rgba(0,0,0,.1);
3799}
3800.navbar-fixed-bottom {
3801 bottom: 0;
3802}
3803.navbar-fixed-bottom .navbar-inner {
3804 -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1);
3805 -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1);
3806 box-shadow: 0 -1px 10px rgba(0,0,0,.1);
3807}
3808.navbar .nav {
3809 position: relative;
3810 left: 0;
3811 display: block;
3812 float: left;
3813 margin: 0 10px 0 0;
3814}
3815.navbar .nav.pull-right {
3816 float: right;
3817 margin-right: 0;
3818}
3819.navbar .nav > li {
3820 float: left;
3821}
3822.navbar .nav > li > a {
3823 float: none;
3824 padding: 10px 15px 10px;
3825 color: #777777;
3826 text-decoration: none;
3827 text-shadow: 0 1px 0 #ffffff;
3828}
3829.navbar .nav .dropdown-toggle .caret {
3830 margin-top: 8px;
3831}
3832.navbar .nav > li > a:focus,
3833.navbar .nav > li > a:hover {
3834 background-color: transparent;
3835 color: #333333;
3836 text-decoration: none;
3837}
3838.navbar .nav > .active > a,
3839.navbar .nav > .active > a:hover,
3840.navbar .nav > .active > a:focus {
3841 color: #555555;
3842 text-decoration: none;
3843 background-color: #e5e5e5;
3844 -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
3845 -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
3846 box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
3847}
3848.navbar .btn-navbar {
3849 display: none;
3850 float: right;
3851 padding: 7px 10px;
3852 margin-left: 5px;
3853 margin-right: 5px;
3854 color: #ffffff;
3855 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
3856 background-color: #ededed;
3857 background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
3858 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
3859 background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
3860 background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
3861 background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
3862 background-repeat: repeat-x;
3863 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
3864 border-color: #e5e5e5 #e5e5e5 #bfbfbf;
3865 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
3866 *background-color: #e5e5e5;
3867 /* Darken IE7 buttons by default so they stand out more given they won't have borders */
3868
3869 filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
3870 -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
3871 -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
3872 box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
3873}
3874.navbar .btn-navbar:hover,
3875.navbar .btn-navbar:active,
3876.navbar .btn-navbar.active,
3877.navbar .btn-navbar.disabled,
3878.navbar .btn-navbar[disabled] {
3879 color: #ffffff;
3880 background-color: #e5e5e5;
3881 *background-color: #d9d9d9;
3882}
3883.navbar .btn-navbar:active,
3884.navbar .btn-navbar.active {
3885 background-color: #cccccc \9;
3886}
3887.navbar .btn-navbar .icon-bar {
3888 display: block;
3889 width: 18px;
3890 height: 2px;
3891 background-color: #f5f5f5;
3892 -webkit-border-radius: 1px;
3893 -moz-border-radius: 1px;
3894 border-radius: 1px;
3895 -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
3896 -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
3897 box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
3898}
3899.btn-navbar .icon-bar + .icon-bar {
3900 margin-top: 3px;
3901}
3902.navbar .nav > li > .dropdown-menu:before {
3903 content: '';
2006 display: inline-block; 3904 display: inline-block;
3905 border-left: 7px solid transparent;
3906 border-right: 7px solid transparent;
3907 border-bottom: 7px solid #ccc;
3908 border-bottom-color: rgba(0, 0, 0, 0.2);
3909 position: absolute;
3910 top: -7px;
3911 left: 9px;
2007} 3912}
2008div.spinner div { 3913.navbar .nav > li > .dropdown-menu:after {
2009 width: 12%; 3914 content: '';
2010 height: 26%; 3915 display: inline-block;
2011 background: #000; 3916 border-left: 6px solid transparent;
3917 border-right: 6px solid transparent;
3918 border-bottom: 6px solid #ffffff;
2012 position: absolute; 3919 position: absolute;
2013 left: 44.5%; 3920 top: -6px;
2014 top: 37%; 3921 left: 10px;
2015 opacity: 0; 3922}
2016 -webkit-animation: fade 1s linear infinite; 3923.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
2017 -webkit-border-radius: 50px; 3924 border-top: 7px solid #ccc;
2018 -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); 3925 border-top-color: rgba(0, 0, 0, 0.2);
3926 border-bottom: 0;
3927 bottom: -7px;
3928 top: auto;
3929}
3930.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
3931 border-top: 6px solid #ffffff;
3932 border-bottom: 0;
3933 bottom: -6px;
3934 top: auto;
3935}
3936.navbar .nav li.dropdown > a:hover .caret {
3937 border-top-color: #555555;
3938 border-bottom-color: #555555;
3939}
3940.navbar .nav li.dropdown.open > .dropdown-toggle,
3941.navbar .nav li.dropdown.active > .dropdown-toggle,
3942.navbar .nav li.dropdown.open.active > .dropdown-toggle {
3943 background-color: #e5e5e5;
3944 color: #555555;
3945}
3946.navbar .nav li.dropdown > .dropdown-toggle .caret {
3947 border-top-color: #777777;
3948 border-bottom-color: #777777;
3949}
3950.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
3951.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
3952.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
3953 border-top-color: #555555;
3954 border-bottom-color: #555555;
3955}
3956.navbar .pull-right > li > .dropdown-menu,
3957.navbar .nav > li > .dropdown-menu.pull-right {
3958 left: auto;
3959 right: 0;
2019} 3960}
2020div.spinner div.bar01 { 3961.navbar .pull-right > li > .dropdown-menu:before,
2021 -webkit-transform: rotate(0deg) translate(0, -142%); 3962.navbar .nav > li > .dropdown-menu.pull-right:before {
2022 -webkit-animation-delay: 0s; 3963 left: auto;
3964 right: 12px;
3965}
3966.navbar .pull-right > li > .dropdown-menu:after,
3967.navbar .nav > li > .dropdown-menu.pull-right:after {
3968 left: auto;
3969 right: 13px;
3970}
3971.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
3972.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
3973 left: auto;
3974 right: 100%;
3975 margin-left: 0;
3976 margin-right: -1px;
3977 -webkit-border-radius: 6px 0 6px 6px;
3978 -moz-border-radius: 6px 0 6px 6px;
3979 border-radius: 6px 0 6px 6px;
3980}
3981.navbar-inverse .navbar-inner {
3982 background-color: #1b1b1b;
3983 background-image: -moz-linear-gradient(top, #222222, #111111);
3984 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
3985 background-image: -webkit-linear-gradient(top, #222222, #111111);
3986 background-image: -o-linear-gradient(top, #222222, #111111);
3987 background-image: linear-gradient(to bottom, #222222, #111111);
3988 background-repeat: repeat-x;
3989 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
3990 border-color: #252525;
3991}
3992.navbar-inverse .brand,
3993.navbar-inverse .nav > li > a {
3994 color: #999999;
3995 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
3996}
3997.navbar-inverse .brand:hover,
3998.navbar-inverse .nav > li > a:hover {
3999 color: #ffffff;
4000}
4001.navbar-inverse .brand {
4002 color: #999999;
4003}
4004.navbar-inverse .navbar-text {
4005 color: #999999;
4006}
4007.navbar-inverse .nav > li > a:focus,
4008.navbar-inverse .nav > li > a:hover {
4009 background-color: transparent;
4010 color: #ffffff;
4011}
4012.navbar-inverse .nav .active > a,
4013.navbar-inverse .nav .active > a:hover,
4014.navbar-inverse .nav .active > a:focus {
4015 color: #ffffff;
4016 background-color: #111111;
4017}
4018.navbar-inverse .navbar-link {
4019 color: #999999;
4020}
4021.navbar-inverse .navbar-link:hover {
4022 color: #ffffff;
4023}
4024.navbar-inverse .divider-vertical {
4025 border-left-color: #111111;
4026 border-right-color: #222222;
4027}
4028.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
4029.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
4030.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
4031 background-color: #111111;
4032 color: #ffffff;
4033}
4034.navbar-inverse .nav li.dropdown > a:hover .caret {
4035 border-top-color: #ffffff;
4036 border-bottom-color: #ffffff;
4037}
4038.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
4039 border-top-color: #999999;
4040 border-bottom-color: #999999;
4041}
4042.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
4043.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
4044.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
4045 border-top-color: #ffffff;
4046 border-bottom-color: #ffffff;
4047}
4048.navbar-inverse .navbar-search .search-query {
4049 color: #ffffff;
4050 background-color: #515151;
4051 border-color: #111111;
4052 -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
4053 -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
4054 box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
4055 -webkit-transition: none;
4056 -moz-transition: none;
4057 -o-transition: none;
4058 transition: none;
4059}
4060.navbar-inverse .navbar-search .search-query:-moz-placeholder {
4061 color: #cccccc;
4062}
4063.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
4064 color: #cccccc;
4065}
4066.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
4067 color: #cccccc;
4068}
4069.navbar-inverse .navbar-search .search-query:focus,
4070.navbar-inverse .navbar-search .search-query.focused {
4071 padding: 5px 15px;
4072 color: #333333;
4073 text-shadow: 0 1px 0 #ffffff;
4074 background-color: #ffffff;
4075 border: 0;
4076 -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
4077 -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
4078 box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
4079 outline: 0;
4080}
4081.navbar-inverse .btn-navbar {
4082 color: #ffffff;
4083 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
4084 background-color: #0e0e0e;
4085 background-image: -moz-linear-gradient(top, #151515, #040404);
4086 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
4087 background-image: -webkit-linear-gradient(top, #151515, #040404);
4088 background-image: -o-linear-gradient(top, #151515, #040404);
4089 background-image: linear-gradient(to bottom, #151515, #040404);
4090 background-repeat: repeat-x;
4091 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
4092 border-color: #040404 #040404 #000000;
4093 border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
4094 *background-color: #040404;
4095 /* Darken IE7 buttons by default so they stand out more given they won't have borders */
4096
4097 filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
4098}
4099.navbar-inverse .btn-navbar:hover,
4100.navbar-inverse .btn-navbar:active,
4101.navbar-inverse .btn-navbar.active,
4102.navbar-inverse .btn-navbar.disabled,
4103.navbar-inverse .btn-navbar[disabled] {
4104 color: #ffffff;
4105 background-color: #040404;
4106 *background-color: #000000;
4107}
4108.navbar-inverse .btn-navbar:active,
4109.navbar-inverse .btn-navbar.active {
4110 background-color: #000000 \9;
4111}
4112.breadcrumb {
4113 padding: 8px 15px;
4114 margin: 0 0 20px;
4115 list-style: none;
4116 background-color: #f5f5f5;
4117 -webkit-border-radius: 4px;
4118 -moz-border-radius: 4px;
4119 border-radius: 4px;
2023} 4120}
2024div.spinner div.bar02 { 4121.breadcrumb > li {
2025 -webkit-transform: rotate(30deg) translate(0, -142%); 4122 display: inline-block;
2026 -webkit-animation-delay: -0.9167s; 4123 *display: inline;
4124 /* IE7 inline-block hack */
4125
4126 *zoom: 1;
4127 text-shadow: 0 1px 0 #ffffff;
2027} 4128}
2028div.spinner div.bar03 { 4129.breadcrumb > li > .divider {
2029 -webkit-transform: rotate(60deg) translate(0, -142%); 4130 padding: 0 5px;
2030 -webkit-animation-delay: -0.833s; 4131 color: #ccc;
2031} 4132}
2032div.spinner div.bar04 { 4133.breadcrumb > .active {
2033 -webkit-transform: rotate(90deg) translate(0, -142%); 4134 color: #999999;
2034 -webkit-animation-delay: -0.75s;
2035} 4135}
2036div.spinner div.bar05 { 4136.pagination {
2037 -webkit-transform: rotate(120deg) translate(0, -142%); 4137 margin: 20px 0;
2038 -webkit-animation-delay: -0.667s;
2039} 4138}
2040div.spinner div.bar06 { 4139.pagination ul {
2041 -webkit-transform: rotate(150deg) translate(0, -142%); 4140 display: inline-block;
2042 -webkit-animation-delay: -0.5833s; 4141 *display: inline;
4142 /* IE7 inline-block hack */
4143
4144 *zoom: 1;
4145 margin-left: 0;
4146 margin-bottom: 0;
4147 -webkit-border-radius: 4px;
4148 -moz-border-radius: 4px;
4149 border-radius: 4px;
4150 -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
4151 -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
4152 box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
2043} 4153}
2044div.spinner div.bar07 { 4154.pagination ul > li {
2045 -webkit-transform: rotate(180deg) translate(0, -142%); 4155 display: inline;
2046 -webkit-animation-delay: -0.5s;
2047} 4156}
2048div.spinner div.bar08 { 4157.pagination ul > li > a,
2049 -webkit-transform: rotate(210deg) translate(0, -142%); 4158.pagination ul > li > span {
2050 -webkit-animation-delay: -0.41667s; 4159 float: left;
4160 padding: 4px 12px;
4161 line-height: 20px;
4162 text-decoration: none;
4163 background-color: #ffffff;
4164 border: 1px solid #dddddd;
4165 border-left-width: 0;
4166}
4167.pagination ul > li > a:hover,
4168.pagination ul > .active > a,
4169.pagination ul > .active > span {
4170 background-color: #f5f5f5;
4171}
4172.pagination ul > .active > a,
4173.pagination ul > .active > span {
4174 color: #999999;
4175 cursor: default;
4176}
4177.pagination ul > .disabled > span,
4178.pagination ul > .disabled > a,
4179.pagination ul > .disabled > a:hover {
4180 color: #999999;
4181 background-color: transparent;
4182 cursor: default;
4183}
4184.pagination ul > li:first-child > a,
4185.pagination ul > li:first-child > span {
4186 border-left-width: 1px;
4187 -webkit-border-top-left-radius: 4px;
4188 -moz-border-radius-topleft: 4px;
4189 border-top-left-radius: 4px;
4190 -webkit-border-bottom-left-radius: 4px;
4191 -moz-border-radius-bottomleft: 4px;
4192 border-bottom-left-radius: 4px;
4193}
4194.pagination ul > li:last-child > a,
4195.pagination ul > li:last-child > span {
4196 -webkit-border-top-right-radius: 4px;
4197 -moz-border-radius-topright: 4px;
4198 border-top-right-radius: 4px;
4199 -webkit-border-bottom-right-radius: 4px;
4200 -moz-border-radius-bottomright: 4px;
4201 border-bottom-right-radius: 4px;
4202}
4203.pagination-centered {
4204 text-align: center;
2051} 4205}
2052div.spinner div.bar09 { 4206.pagination-right {
2053 -webkit-transform: rotate(240deg) translate(0, -142%); 4207 text-align: right;
2054 -webkit-animation-delay: -0.333s;
2055} 4208}
2056div.spinner div.bar10 { 4209.pagination-large ul > li > a,
2057 -webkit-transform: rotate(270deg) translate(0, -142%); 4210.pagination-large ul > li > span {
2058 -webkit-animation-delay: -0.25s; 4211 padding: 11px 19px;
4212 font-size: 17.5px;
4213}
4214.pagination-large ul > li:first-child > a,
4215.pagination-large ul > li:first-child > span {
4216 -webkit-border-top-left-radius: 6px;
4217 -moz-border-radius-topleft: 6px;
4218 border-top-left-radius: 6px;
4219 -webkit-border-bottom-left-radius: 6px;
4220 -moz-border-radius-bottomleft: 6px;
4221 border-bottom-left-radius: 6px;
4222}
4223.pagination-large ul > li:last-child > a,
4224.pagination-large ul > li:last-child > span {
4225 -webkit-border-top-right-radius: 6px;
4226 -moz-border-radius-topright: 6px;
4227 border-top-right-radius: 6px;
4228 -webkit-border-bottom-right-radius: 6px;
4229 -moz-border-radius-bottomright: 6px;
4230 border-bottom-right-radius: 6px;
4231}
4232.pagination-mini ul > li:first-child > a,
4233.pagination-small ul > li:first-child > a,
4234.pagination-mini ul > li:first-child > span,
4235.pagination-small ul > li:first-child > span {
4236 -webkit-border-top-left-radius: 3px;
4237 -moz-border-radius-topleft: 3px;
4238 border-top-left-radius: 3px;
4239 -webkit-border-bottom-left-radius: 3px;
4240 -moz-border-radius-bottomleft: 3px;
4241 border-bottom-left-radius: 3px;
4242}
4243.pagination-mini ul > li:last-child > a,
4244.pagination-small ul > li:last-child > a,
4245.pagination-mini ul > li:last-child > span,
4246.pagination-small ul > li:last-child > span {
4247 -webkit-border-top-right-radius: 3px;
4248 -moz-border-radius-topright: 3px;
4249 border-top-right-radius: 3px;
4250 -webkit-border-bottom-right-radius: 3px;
4251 -moz-border-radius-bottomright: 3px;
4252 border-bottom-right-radius: 3px;
4253}
4254.pagination-small ul > li > a,
4255.pagination-small ul > li > span {
4256 padding: 2px 10px;
4257 font-size: 11.9px;
2059} 4258}
2060div.spinner div.bar11 { 4259.pagination-mini ul > li > a,
2061 -webkit-transform: rotate(300deg) translate(0, -142%); 4260.pagination-mini ul > li > span {
2062 -webkit-animation-delay: -0.1667s; 4261 padding: 0 6px;
4262 font-size: 10.5px;
2063} 4263}
2064div.spinner div.bar12 { 4264.pager {
2065 -webkit-transform: rotate(330deg) translate(0, -142%); 4265 margin: 20px 0;
2066 -webkit-animation-delay: -0.0833s; 4266 list-style: none;
4267 text-align: center;
4268 *zoom: 1;
2067} 4269}
2068@-webkit-keyframes fade { 4270.pager:before,
2069 from { 4271.pager:after {
2070 opacity: 1; 4272 display: table;
2071 } 4273 content: "";
2072 to { 4274 line-height: 0;
2073 opacity: 0.25;
2074 }
2075} 4275}
2076/* 4276.pager:after {
4277 clear: both;
4278}
4279.pager li {
4280 display: inline;
4281}
4282.pager li > a,
4283.pager li > span {
4284 display: inline-block;
4285 padding: 5px 14px;
4286 background-color: #fff;
4287 border: 1px solid #ddd;
4288 -webkit-border-radius: 15px;
4289 -moz-border-radius: 15px;
4290 border-radius: 15px;
4291}
4292.pager li > a:hover {
4293 text-decoration: none;
4294 background-color: #f5f5f5;
4295}
4296.pager .next > a,
4297.pager .next > span {
4298 float: right;
4299}
4300.pager .previous > a,
4301.pager .previous > span {
4302 float: left;
4303}
4304.pager .disabled > a,
4305.pager .disabled > a:hover,
4306.pager .disabled > span {
4307 color: #999999;
4308 background-color: #fff;
4309 cursor: default;
4310}
4311.modal-backdrop {
4312 position: fixed;
4313 top: 0;
4314 right: 0;
4315 bottom: 0;
4316 left: 0;
4317 z-index: 1040;
4318 background-color: #000000;
4319}
4320.modal-backdrop.fade {
4321 opacity: 0;
4322}
4323.modal-backdrop,
4324.modal-backdrop.fade.in {
4325 opacity: 0.8;
4326 filter: alpha(opacity=80);
4327}
4328.modal {
4329 position: fixed;
4330 top: 10%;
4331 left: 50%;
4332 z-index: 1050;
4333 width: 560px;
4334 margin-left: -280px;
4335 background-color: #ffffff;
4336 border: 1px solid #999;
4337 border: 1px solid rgba(0, 0, 0, 0.3);
4338 *border: 1px solid #999;
4339 /* IE6-7 */
2077 4340
2078Color list: 4341 -webkit-border-radius: 6px;
2079- login box: 4342 -moz-border-radius: 6px;
2080 light#ff9955 4343 border-radius: 6px;
2081 dark#ff6622 4344 -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
2082- login button: 4345 -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
2083 regular#dd5500 4346 box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
2084 hover#773311 4347 -webkit-background-clip: padding-box;
2085- login translations: 4348 -moz-background-clip: padding-box;
2086 box: #cc6622; 4349 background-clip: padding-box;
2087 not-selected: 4350 outline: none;
2088 color: #ddaa99 4351}
2089 background:#994422 4352.modal.fade {
2090 selected: #772211; 4353 -webkit-transition: opacity .3s linear, top .3s ease-out;
2091*/ 4354 -moz-transition: opacity .3s linear, top .3s ease-out;
2092html { 4355 -o-transition: opacity .3s linear, top .3s ease-out;
2093 height: 100%; 4356 transition: opacity .3s linear, top .3s ease-out;
2094 -webkit-text-size-adjust: none; 4357 top: -25%;
2095 -ms-text-size-adjust: none; 4358}
4359.modal.fade.in {
4360 top: 10%;
4361}
4362.modal-header {
4363 padding: 9px 15px;
4364 border-bottom: 1px solid #eee;
4365}
4366.modal-header .close {
4367 margin-top: 2px;
4368}
4369.modal-header h3 {
4370 margin: 0;
4371 line-height: 30px;
2096} 4372}
2097body { 4373.modal-body {
2098 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 4374 position: relative;
2099 margin: 0px; 4375 overflow-y: auto;
4376 max-height: 400px;
4377 padding: 15px;
2100} 4378}
2101.ellipsis { 4379.modal-form {
2102 text-overflow: ellipsis; 4380 margin-bottom: 0;
2103 overflow: hidden; 4381}
2104 white-space: nowrap; 4382.modal-footer {
4383 padding: 14px 15px 15px;
4384 margin-bottom: 0;
4385 text-align: right;
4386 background-color: #f5f5f5;
4387 border-top: 1px solid #ddd;
4388 -webkit-border-radius: 0 0 6px 6px;
4389 -moz-border-radius: 0 0 6px 6px;
4390 border-radius: 0 0 6px 6px;
4391 -webkit-box-shadow: inset 0 1px 0 #ffffff;
4392 -moz-box-shadow: inset 0 1px 0 #ffffff;
4393 box-shadow: inset 0 1px 0 #ffffff;
4394 *zoom: 1;
4395}
4396.modal-footer:before,
4397.modal-footer:after {
4398 display: table;
4399 content: "";
4400 line-height: 0;
4401}
4402.modal-footer:after {
4403 clear: both;
4404}
4405.modal-footer .btn + .btn {
4406 margin-left: 5px;
4407 margin-bottom: 0;
4408}
4409.modal-footer .btn-group .btn + .btn {
4410 margin-left: -1px;
4411}
4412.modal-footer .btn-block + .btn-block {
4413 margin-left: 0;
4414}
4415.tooltip {
4416 position: absolute;
4417 z-index: 1030;
4418 display: block;
4419 visibility: visible;
4420 padding: 5px;
4421 font-size: 11px;
4422 opacity: 0;
4423 filter: alpha(opacity=0);
4424}
4425.tooltip.in {
4426 opacity: 0.8;
4427 filter: alpha(opacity=80);
4428}
4429.tooltip.top {
4430 margin-top: -3px;
4431}
4432.tooltip.right {
4433 margin-left: 3px;
4434}
4435.tooltip.bottom {
4436 margin-top: 3px;
4437}
4438.tooltip.left {
4439 margin-left: -3px;
4440}
4441.tooltip-inner {
4442 max-width: 200px;
4443 padding: 3px 8px;
4444 color: #ffffff;
4445 text-align: center;
4446 text-decoration: none;
4447 background-color: #000000;
4448 -webkit-border-radius: 4px;
4449 -moz-border-radius: 4px;
4450 border-radius: 4px;
4451}
4452.tooltip-arrow {
4453 position: absolute;
4454 width: 0;
4455 height: 0;
4456 border-color: transparent;
4457 border-style: solid;
4458}
4459.tooltip.top .tooltip-arrow {
4460 bottom: 0;
4461 left: 50%;
4462 margin-left: -5px;
4463 border-width: 5px 5px 0;
4464 border-top-color: #000000;
2105} 4465}
2106div#loginForm div.credentialsMessage.error h1 { 4466.tooltip.right .tooltip-arrow {
2107 color: red; 4467 top: 50%;
4468 left: 0;
4469 margin-top: -5px;
4470 border-width: 5px 5px 5px 0;
4471 border-right-color: #000000;
2108} 4472}
2109div#loginForm div.validating div.loading { 4473.tooltip.left .tooltip-arrow {
2110 margin-top: 50px; 4474 top: 50%;
2111 margin-bottom: 50px; 4475 right: 0;
4476 margin-top: -5px;
4477 border-width: 5px 0 5px 5px;
4478 border-left-color: #000000;
4479}
4480.tooltip.bottom .tooltip-arrow {
4481 top: 0;
4482 left: 50%;
4483 margin-left: -5px;
4484 border-width: 0 5px 5px;
4485 border-bottom-color: #000000;
4486}
4487.popover {
4488 position: absolute;
4489 top: 0;
4490 left: 0;
4491 z-index: 1010;
4492 display: none;
4493 width: 236px;
4494 padding: 1px;
4495 text-align: left;
4496 background-color: #ffffff;
4497 -webkit-background-clip: padding-box;
4498 -moz-background-clip: padding;
4499 background-clip: padding-box;
4500 border: 1px solid #ccc;
4501 border: 1px solid rgba(0, 0, 0, 0.2);
4502 -webkit-border-radius: 6px;
4503 -moz-border-radius: 6px;
4504 border-radius: 6px;
4505 -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
4506 -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
4507 box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
4508 white-space: normal;
4509}
4510.popover.top {
4511 margin-top: -10px;
4512}
4513.popover.right {
4514 margin-left: 10px;
4515}
4516.popover.bottom {
4517 margin-top: 10px;
4518}
4519.popover.left {
4520 margin-left: -10px;
4521}
4522.popover-title {
4523 margin: 0;
4524 padding: 8px 14px;
4525 font-size: 14px;
4526 font-weight: normal;
4527 line-height: 18px;
4528 background-color: #f7f7f7;
4529 border-bottom: 1px solid #ebebeb;
4530 -webkit-border-radius: 5px 5px 0 0;
4531 -moz-border-radius: 5px 5px 0 0;
4532 border-radius: 5px 5px 0 0;
4533}
4534.popover-content {
4535 padding: 9px 14px;
4536}
4537.popover .arrow,
4538.popover .arrow:after {
4539 position: absolute;
4540 display: block;
4541 width: 0;
4542 height: 0;
4543 border-color: transparent;
4544 border-style: solid;
4545}
4546.popover .arrow {
4547 border-width: 11px;
4548}
4549.popover .arrow:after {
4550 border-width: 10px;
4551 content: "";
4552}
4553.popover.top .arrow {
4554 left: 50%;
4555 margin-left: -11px;
4556 border-bottom-width: 0;
4557 border-top-color: #999;
4558 border-top-color: rgba(0, 0, 0, 0.25);
4559 bottom: -11px;
4560}
4561.popover.top .arrow:after {
4562 bottom: 1px;
4563 margin-left: -10px;
4564 border-bottom-width: 0;
4565 border-top-color: #ffffff;
4566}
4567.popover.right .arrow {
4568 top: 50%;
4569 left: -11px;
4570 margin-top: -11px;
4571 border-left-width: 0;
4572 border-right-color: #999;
4573 border-right-color: rgba(0, 0, 0, 0.25);
4574}
4575.popover.right .arrow:after {
4576 left: 1px;
4577 bottom: -10px;
4578 border-left-width: 0;
4579 border-right-color: #ffffff;
4580}
4581.popover.bottom .arrow {
4582 left: 50%;
4583 margin-left: -11px;
4584 border-top-width: 0;
4585 border-bottom-color: #999;
4586 border-bottom-color: rgba(0, 0, 0, 0.25);
4587 top: -11px;
4588}
4589.popover.bottom .arrow:after {
4590 top: 1px;
4591 margin-left: -10px;
4592 border-top-width: 0;
4593 border-bottom-color: #ffffff;
4594}
4595.popover.left .arrow {
4596 top: 50%;
4597 right: -11px;
4598 margin-top: -11px;
4599 border-right-width: 0;
4600 border-left-color: #999;
4601 border-left-color: rgba(0, 0, 0, 0.25);
4602}
4603.popover.left .arrow:after {
4604 right: 1px;
4605 border-right-width: 0;
4606 border-left-color: #ffffff;
4607 bottom: -10px;
4608}
4609.thumbnails {
4610 margin-left: -20px;
4611 list-style: none;
4612 *zoom: 1;
4613}
4614.thumbnails:before,
4615.thumbnails:after {
4616 display: table;
4617 content: "";
4618 line-height: 0;
4619}
4620.thumbnails:after {
4621 clear: both;
4622}
4623.row-fluid .thumbnails {
4624 margin-left: 0;
4625}
4626.thumbnails > li {
4627 float: left;
4628 margin-bottom: 20px;
4629 margin-left: 20px;
4630}
4631.thumbnail {
4632 display: block;
4633 padding: 4px;
4634 line-height: 20px;
4635 border: 1px solid #ddd;
4636 -webkit-border-radius: 4px;
4637 -moz-border-radius: 4px;
4638 border-radius: 4px;
4639 -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
4640 -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
4641 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
4642 -webkit-transition: all 0.2s ease-in-out;
4643 -moz-transition: all 0.2s ease-in-out;
4644 -o-transition: all 0.2s ease-in-out;
4645 transition: all 0.2s ease-in-out;
4646}
4647a.thumbnail:hover {
4648 border-color: #0088cc;
4649 -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
4650 -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
4651 box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
4652}
4653.thumbnail > img {
4654 display: block;
4655 max-width: 100%;
2112 margin-left: auto; 4656 margin-left: auto;
2113 margin-right: auto; 4657 margin-right: auto;
2114 width: 100px;
2115}
2116/*
2117
2118Color list:
2119- login box:
2120 light#ff9955
2121 dark#ff6622
2122- login button:
2123 regular#dd5500
2124 hover#773311
2125- login translations:
2126 box: #cc6622;
2127 not-selected:
2128 color: #ddaa99
2129 background:#994422
2130 selected: #772211;
2131*/
2132html {
2133 height: 100%;
2134 -webkit-text-size-adjust: none;
2135 -ms-text-size-adjust: none;
2136} 4658}
2137body { 4659.thumbnail .caption {
2138 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 4660 padding: 9px;
2139 margin: 0px; 4661 color: #555555;
2140} 4662}
2141.ellipsis { 4663.media,
2142 text-overflow: ellipsis; 4664.media-body {
2143 overflow: hidden; 4665 overflow: hidden;
4666 *overflow: visible;
4667 zoom: 1;
4668}
4669.media,
4670.media .media {
4671 margin-top: 15px;
4672}
4673.media:first-child {
4674 margin-top: 0;
4675}
4676.media-object {
4677 display: block;
4678}
4679.media-heading {
4680 margin: 0 0 5px;
4681}
4682.media .pull-left {
4683 margin-right: 10px;
4684}
4685.media .pull-right {
4686 margin-left: 10px;
4687}
4688.media-list {
4689 margin-left: 0;
4690 list-style: none;
4691}
4692.label,
4693.badge {
4694 display: inline-block;
4695 padding: 2px 4px;
4696 font-size: 11.844px;
4697 font-weight: bold;
4698 line-height: 14px;
4699 color: #ffffff;
4700 vertical-align: baseline;
2144 white-space: nowrap; 4701 white-space: nowrap;
4702 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
4703 background-color: #999999;
2145} 4704}
2146#jqt div.cardList ul li.cardListItem a small.favicon { 4705.label {
2147 background: white;
2148 -webkit-border-radius: 3px; 4706 -webkit-border-radius: 3px;
4707 -moz-border-radius: 3px;
2149 border-radius: 3px; 4708 border-radius: 3px;
2150 display: block;
2151 width: 26px;
2152 height: 26px;
2153 padding: 0px;
2154} 4709}
2155#jqt div.cardList ul li.cardListItem a small.favicon img.favicon { 4710.badge {
2156 margin-right: 3px; 4711 padding-left: 9px;
2157 margin-top: 3px; 4712 padding-right: 9px;
2158 width: 20px; 4713 -webkit-border-radius: 9px;
2159 height: 20px; 4714 -moz-border-radius: 9px;
4715 border-radius: 9px;
2160} 4716}
2161#jqt div.cardDetail ul li a.password { 4717.label:empty,
2162 color: gray; 4718.badge:empty {
4719 display: none;
2163} 4720}
2164/* ---------------------------------------- */ 4721a.label:hover,
2165/* 4722a.badge:hover {
2166body { 4723 color: #ffffff;
2167 margin: 0; 4724 text-decoration: none;
2168 font-family: Helvetica; 4725 cursor: pointer;
2169 background: #FFFFFF;
2170 color: #000000;
2171 overflow-x: hidden;
2172 -webkit-user-select: none;
2173 -webkit-text-size-adjust: none;
2174} 4726}
2175 4727.label-important,
2176 4728.badge-important {
2177div.toolbar { 4729 background-color: #b94a48;
2178 box-sizing: border-box;
2179 -moz-box-sizing: border-box;
2180 -webkit-box-sizing: border-box;
2181 border-bottom: 1px solid #2d3642;
2182 border-top: 1px solid #6d84a2;
2183 padding: 10px;
2184 height: 45px;
2185 //background: url(./images/old/iPhone/toolbar.png) #6d84a2 repeat-x;
2186 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUCNddjDEOgEAQAgn//5qltYWFnb1GB4vdSy4WBAYStKyb9+O0FJMYyjMyMWCC35lJM71r6vF1P07/lFSfPx6ZxNLcy1HtihzpA/RWcOj0zlDhAAAAAElFTkSuQmCCCg==) #6d84a2 repeat-x;
2187} 4730}
2188 4731.label-important[href],
2189div.toolbar h1#pageTitle { 4732.badge-important[href] {
2190 overflow: hidden; 4733 background-color: #953b39;
2191 margin-top: 1px;
2192 margin-bottom: 0px;
2193 margin-left: auto;
2194 margin-right: auto;
2195 width: 150px;
2196 height: 25px;
2197 font-size: 20px;
2198 width: 150px;
2199 font-weight: bold;
2200 text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
2201 text-align: center;
2202 text-overflow: ellipsis;
2203 white-space: nowrap;
2204 color: #FFFFFF;
2205} 4734}
2206 4735.label-warning,
2207div.toolbar a.button { 4736.badge-warning {
2208 position: absolute; 4737 background-color: #f89406;
2209 overflow: hidden;
2210 top: 8px;
2211 right: 6px;
2212 margin: 0;
2213 border-width: 0 5px;
2214 padding: 0 3px;
2215 width: auto;
2216 height: 30px;
2217 line-height: 30px;
2218 font-family: inherit;
2219 font-size: 12px;
2220 font-weight: bold;
2221 color: #FFFFFF;
2222 text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0;
2223 text-overflow: ellipsis;
2224 text-decoration: none;
2225 white-space: nowrap;
2226 background: none;
2227 //-webkit-border-image: url(./images/old/iPhone/toolButton.png) 0 5 0 5;
2228} 4738}
2229 4739.label-warning[href],
2230div.toolbar a#backButton { 4740.badge-warning[href] {
2231 left: 6px; 4741 background-color: #c67605;
2232 right: auto;
2233 padding: 0px;
2234 max-width: 55px;
2235 border-width: 0 8px 0 14px;
2236 //-webkit-border-image: url(./images/old/iPhone/backButton.png) 0 8 0 14;
2237 -webkit-border-image: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAeCAIAAAA6iHCJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtJJREFUeNrEV21P01AYbbtubNExBnXDbYjjZYI4BMdgEANDQoTElw/+Rw0mBs0UiSGaoJFEQEPwjRhFCW/JxrZ2Xdu1fe71bpAhCHzqupPnS5ObPOeec+5zb+lHLxao05HPiwvzr3/++J7N7FFGgaaDLe034+O+wCXyxSKET1u5+Wc98XTK39zeOzjudLmNIoAR2tlaf/Zkqm9gKNI/RBigE9dtb23MJKZj8fvuC16b3WGxsJRxOFfHeQOtH+ZnOI+XRfgEBoLAzz6fjo7ebfD4GYYhMiEdDGRAW6xOt6d7YGzl4xIL/7mgyPL044edkVt19T4EFAJEVQYud+MvOCkHc7MJ3+VrXGOzXrHeZS1s9trjOVj7tiqpONTWBRgD6BVmQFls9iMaSHnx/bu3ffEHgC2gVVqAIojKR3Iw9zLRcjVmtTnA0NydxQDg0IWvq59kYIOeZtWs9gQkagcMcgK/vLjYNXQHcEkas0AcYPdNIPr7Q/0M69B089ofavB5ZVm3OJ2cTwegzAUgxGbSe8tLS52xewjRZGabzAABZt+8mvGHBsiYNF+AAw1cXEBGNUiQqWpAlArM5MSYBXgEOl0NkLcCkxak28MRKbuDMa6KDAwAUnU8HO2Q+N0SJ3OLMCA7V1S9vt7d3tSg5LNV0ACXwOekcGfreVbVVYUqMjOvyPsH71cqkxsZ7NHFJIXBTCMONMAlEryoxAfDucyOmaOpmINyaTowrK23IyDxKbNzUIYoKU3+i37OXpCESvfGCOw11uMMcCkQke4rDlrS1coOSk2VOXftERfKtZsURmLXQUqBVqiUABgrQirc0Xp4Fv4t8kxN8dLkaJQupOVcGnTN0PuQHHlRSG1Eu9tUTLOnxZ5clclsfmK078va7/WN7axomCN2e42Xc/VEIoiiM0KePeM20DTY3M22BZtuhENW1rC/NrI3WVGTmZxSKEr7V4ABAJ+53J1I3nPjAAAAAElFTkSuQmCCCg==) 0 8 0 14;
2238} 4742}
2239 4743.label-success,
2240// ------------------------------------------- 4744.badge-success {
2241 4745 background-color: #468847;
2242body.iPhone form.loginForm {
2243 min-height: 372px;
2244
2245 box-sizing: border-box;
2246 -moz-box-sizing: border-box;
2247 -webkit-box-sizing: border-box;
2248 padding: 10px;
2249 //background: #c8c8c8 url(./images/old/iPhone/pinstripes.png);
2250 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
2251} 4746}
2252 4747.label-success[href],
2253fieldset { 4748.badge-success[href] {
2254 position: relative; 4749 background-color: #356635;
2255 margin: 0 0 20px 0;
2256 padding: 0;
2257 background: #FFFFFF;
2258 -webkit-border-radius: 10px;
2259 -moz-border-radius: 10px;
2260 border: 1px solid #999999;
2261 text-align: right;
2262 font-size: 16px;
2263} 4750}
2264 4751.label-info,
2265.row { 4752.badge-info {
2266 position: relative; 4753 background-color: #3a87ad;
2267 min-height: 42px;
2268 border-bottom: 1px solid #999999;
2269 -webkit-border-radius: 0;
2270 text-align: right;
2271} 4754}
2272 4755.label-info[href],
2273fieldset > .row:last-child { 4756.badge-info[href] {
2274 border-bottom: none !important; 4757 background-color: #2d6987;
2275} 4758}
2276 4759.label-inverse,
2277 4760.badge-inverse {
2278.row > input:not(input[type|=radio]):not(input[type|=checkbox]), 4761 background-color: #333333;
2279.row > div.fieldValue {
2280 width: 100%;
2281 box-sizing: border-box;
2282 -moz-box-sizing: border-box;
2283 -webkit-box-sizing: border-box;
2284 margin: 0;
2285 border: none;
2286 padding: 0px 10px 0 112px;
2287 height: 42px;
2288 background: none;
2289 font-size: 16px;
2290 font-weight: normal;
2291
2292 color: #666a60;
2293 -webkit-user-select: text;
2294} 4762}
2295 4763.label-inverse[href],
2296.row > div.fieldValue p { 4764.badge-inverse[href] {
2297 margin: 0px; 4765 background-color: #1a1a1a;
2298 text-align: left;
2299 height: 40px;
2300 vertical-align: middle;
2301 line-height: 40px;
2302} 4766}
2303 4767.btn .label,
2304body[orientation="landscape"] .row > div.fieldValue.password { 4768.btn .badge {
2305 padding-right: 120px; 4769 position: relative;
2306 //background: url(./images/old/iPhone/password_background.png) no-repeat 105px; 4770 top: -1px;
2307 background: url(data:image/png;charset=utf-8;base64,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) no-repeat 105px;
2308} 4771}
2309 4772.btn-mini .label,
2310.row > div.fieldValue.password { 4773.btn-mini .badge {
2311 color: rgba(255,255,255,0.5); 4774 top: 0;
2312 //background: url(./images/old/iPhone/password_background.png) no-repeat 106px;
2313 background: url(data:image/png;charset=utf-8;base64,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) no-repeat 106px;
2314} 4775}
2315 4776@-webkit-keyframes progress-bar-stripes {
2316.row > div.fieldValue.password.clear { 4777 from {
2317 color: #666a60; 4778 background-position: 40px 0;
2318 background: none; 4779 }
4780 to {
4781 background-position: 0 0;
4782 }
2319} 4783}
2320 4784@-moz-keyframes progress-bar-stripes {
2321.row > input[type|=radio], .row > input[type|=checkbox] { 4785 from {
2322 margin: 7px 7px 0 0; 4786 background-position: 40px 0;
2323 height: 25px; 4787 }
2324 width: 25px; 4788 to {
4789 background-position: 0 0;
4790 }
2325} 4791}
2326 4792@-ms-keyframes progress-bar-stripes {
2327 4793 from {
2328.row > label { 4794 background-position: 40px 0;
2329 position: absolute; 4795 }
2330 margin: 0 0 0 14px; 4796 to {
2331 line-height: 42px; 4797 background-position: 0 0;
2332 font-weight: bold; 4798 }
2333 max-width: 92px;
2334 overflow: hidden;
2335 white-space: nowrap;
2336} 4799}
2337 4800@-o-keyframes progress-bar-stripes {
2338body[orientation="landscape"] .row > label { 4801 from {
2339 max-width: 150px; 4802 background-position: 0 0;
4803 }
4804 to {
4805 background-position: 40px 0;
4806 }
2340} 4807}
2341 4808@keyframes progress-bar-stripes {
2342body[orientation="landscape"] .row > input:not(input[type|=radio]):not(input[type|=checkbox]) { 4809 from {
2343 padding-left: 140px; 4810 background-position: 40px 0;
4811 }
4812 to {
4813 background-position: 0 0;
4814 }
2344} 4815}
2345 4816.progress {
2346.row > img.favicon { 4817 overflow: hidden;
2347 position: absolute; 4818 height: 20px;
2348 width: 20px; 4819 margin-bottom: 20px;
2349 height: 20px; 4820 background-color: #f7f7f7;
2350 top: 12px; 4821 background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
2351 left: 11px; 4822 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
4823 background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
4824 background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
4825 background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
4826 background-repeat: repeat-x;
4827 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
4828 -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
4829 -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
4830 box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
4831 -webkit-border-radius: 4px;
4832 -moz-border-radius: 4px;
4833 border-radius: 4px;
2352} 4834}
2353 4835.progress .bar {
2354.row > span { 4836 width: 0%;
2355 padding: 8px 13px; 4837 height: 100%;
2356 text-align: left; 4838 color: #ffffff;
2357 display: block; 4839 float: left;
2358 color: #666a60; 4840 font-size: 12px;
2359 font-size: 10pt; 4841 text-align: center;
4842 text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
4843 background-color: #0e90d2;
4844 background-image: -moz-linear-gradient(top, #149bdf, #0480be);
4845 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
4846 background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
4847 background-image: -o-linear-gradient(top, #149bdf, #0480be);
4848 background-image: linear-gradient(to bottom, #149bdf, #0480be);
4849 background-repeat: repeat-x;
4850 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
4851 -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
4852 -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
4853 box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
4854 -webkit-box-sizing: border-box;
4855 -moz-box-sizing: border-box;
4856 box-sizing: border-box;
4857 -webkit-transition: width 0.6s ease;
4858 -moz-transition: width 0.6s ease;
4859 -o-transition: width 0.6s ease;
4860 transition: width 0.6s ease;
4861}
4862.progress .bar + .bar {
4863 -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
4864 -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
4865 box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
4866}
4867.progress-striped .bar {
4868 background-color: #149bdf;
4869 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));
4870 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);
4871 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);
4872 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);
4873 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);
4874 -webkit-background-size: 40px 40px;
4875 -moz-background-size: 40px 40px;
4876 -o-background-size: 40px 40px;
4877 background-size: 40px 40px;
4878}
4879.progress.active .bar {
4880 -webkit-animation: progress-bar-stripes 2s linear infinite;
4881 -moz-animation: progress-bar-stripes 2s linear infinite;
4882 -ms-animation: progress-bar-stripes 2s linear infinite;
4883 -o-animation: progress-bar-stripes 2s linear infinite;
4884 animation: progress-bar-stripes 2s linear infinite;
4885}
4886.progress-danger .bar,
4887.progress .bar-danger {
4888 background-color: #dd514c;
4889 background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
4890 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
4891 background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
4892 background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
4893 background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
4894 background-repeat: repeat-x;
4895 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
4896}
4897.progress-danger.progress-striped .bar,
4898.progress-striped .bar-danger {
4899 background-color: #ee5f5b;
4900 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));
4901 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);
4902 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);
4903 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);
4904 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);
4905}
4906.progress-success .bar,
4907.progress .bar-success {
4908 background-color: #5eb95e;
4909 background-image: -moz-linear-gradient(top, #62c462, #57a957);
4910 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
4911 background-image: -webkit-linear-gradient(top, #62c462, #57a957);
4912 background-image: -o-linear-gradient(top, #62c462, #57a957);
4913 background-image: linear-gradient(to bottom, #62c462, #57a957);
4914 background-repeat: repeat-x;
4915 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
4916}
4917.progress-success.progress-striped .bar,
4918.progress-striped .bar-success {
4919 background-color: #62c462;
4920 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));
4921 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);
4922 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);
4923 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);
4924 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);
4925}
4926.progress-info .bar,
4927.progress .bar-info {
4928 background-color: #4bb1cf;
4929 background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
4930 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
4931 background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
4932 background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
4933 background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
4934 background-repeat: repeat-x;
4935 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
4936}
4937.progress-info.progress-striped .bar,
4938.progress-striped .bar-info {
4939 background-color: #5bc0de;
4940 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));
4941 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);
4942 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);
4943 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);
4944 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);
4945}
4946.progress-warning .bar,
4947.progress .bar-warning {
4948 background-color: #faa732;
4949 background-image: -moz-linear-gradient(top, #fbb450, #f89406);
4950 background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
4951 background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
4952 background-image: -o-linear-gradient(top, #fbb450, #f89406);
4953 background-image: linear-gradient(to bottom, #fbb450, #f89406);
4954 background-repeat: repeat-x;
4955 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
4956}
4957.progress-warning.progress-striped .bar,
4958.progress-striped .bar-warning {
4959 background-color: #fbb450;
4960 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));
4961 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);
4962 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);
4963 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);
4964 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);
4965}
4966.accordion {
4967 margin-bottom: 20px;
4968}
4969.accordion-group {
4970 margin-bottom: 2px;
4971 border: 1px solid #e5e5e5;
4972 -webkit-border-radius: 4px;
4973 -moz-border-radius: 4px;
4974 border-radius: 4px;
2360} 4975}
2361 4976.accordion-heading {
2362.row.notes { 4977 border-bottom: 0;
2363 -webkit-user-select: text;
2364} 4978}
2365 4979.accordion-heading .accordion-toggle {
2366// ------------------------------------------- 4980 display: block;
2367 4981 padding: 8px 15px;
2368.whiteButton {
2369 margin-left: auto;
2370 margin-right: auto;
2371 width: 150px;
2372 display: block;
2373 border-width: 0 12px;
2374 padding: 10px;
2375 text-align: center;
2376 font-size: 20px;
2377 font-weight: bold;
2378 text-decoration: inherit;
2379 color: inherit;
2380
2381 //-webkit-border-image: url(./images/old/iPhone/whiteButton.png) 0 12 0 12;
2382 -webkit-border-image: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAuCAQAAAB+dNqHAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAdAAAALgChnaVgAAAAAmJLR0QA/4ePzL8AAANhSURBVEjHnZZNaFxVFMd/5747mclMkpmxzYdJtFaJglgFpYSiBAVX7l0UUZGuSkEEu3PtSulCUXFdxYXL7kQQIWD9CsRIqdomGGOaSdJmZjKTeW/eu/e4mKRmrE3n5X83j/ve7/3POfe+d67QrTxP8QLDnMTenkv4kQ2+YZ6d/Y/Kvut+XuZVKtygzVbXC8v0cT+jXORLWneix/mAZZZwKIrSbSAIAcd5kDdZ6kaf4zzfEeLPnHrr+UeOWpMJ9rjYxe7a5ntff/YThhyneJ/Zf9Ep3uEXkhNjX50bHoiStoPE76HWiPQFfcGN+kufLKxheZJ3+aOD5vmIBaLXpz89HSVhzF2Uy2TtGxe/+JksJzjHjgCvMEHz6cnZt7dD5zlAgSlkZy7MrVDgbz43FJimhV46W2vFzutBI3aN8NJZlBbTFAKepZ/o/IszU1Gs95Tz2Uw1nFuiiTE8Rhs9fbIROt/LaISvTaO0mbIM0kTKeefoUSMDCI6SxRCT9d77XlFrCYgQi0PH72vH9CyNMSjO4tGM9do76hXB4y2KU+c8aaR41KJ4SIn6DgqgPq2rggWc+kMEjBUBVDUNKQBiOx+218Pl6tVr+jJhUZx4PYSr4XBSsAKaJH9tpirT7uIoTj3pAna43TJJWtSjYDpxp5bv5OpTb4mOq3IIX0W14ypeUq+rYBH5T9fqbRerWMClrbB4PBgUjZPUuXrUGBW51Yhc71y9LSJi1NgQxVWj3a7aw2gmONSGJtNAxC9v9+56vaoe6aubXEWy4meXe/+VXl42TvqzG4ZFCkRzv/+w3lu436/PX6NNnsUgCctjUUJwnWdGC/ZenpXw47loTRrldu3XwLkSrQmiHbkSP3FkwB4MXpjfWDE3JTfw29ZGAGHjgWJdcDW9XC/0PVS4W47fVj5cuLUmFWlOVlevei8ApVLp8bWclnWU4khpZvTRwaw5VggEINHlZuSv1mcr6zW2ZF22xqLqlWr19uYdGSkeWyn4IY5okX61GBHMrp1HJaYldW4G9Ylm7c/19a4jV6k0+fBmtjbkCwxoDovdQ0lIpEXTNIrbR6OVxWr1joNeJjM+Xhyu2+0+Z6Ocmt17Kj4bBvFgPJTUNlZX4/j/zohAJlMuF4vW5vP7Z3d2kqRW29qKuxr4P1RbNFwZtqq8AAAAAElFTkSuQmCCCg==) 0 12 0 12;
2383 text-shadow: rgba(255, 255, 255, 0.7) 0 1px 0;
2384} 4982}
2385 4983.accordion-toggle {
2386// ------------------------------------------- 4984 cursor: pointer;
2387
2388body.iPhone .loginProgressPanel {
2389 min-height: 372px;
2390
2391 box-sizing: border-box;
2392 -moz-box-sizing: border-box;
2393 -webkit-box-sizing: border-box;
2394 padding: 10px;
2395 //background: #c8c8c8 url(./images/old/iPhone/pinstripes.png);
2396 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
2397} 4985}
2398 4986.accordion-inner {
2399body.iPhone .loadingBar { 4987 padding: 9px 15px;
2400 margin-left: auto; 4988 border-top: 1px solid #e5e5e5;
2401 margin-right: auto;
2402 margin-top: 60px;
2403} 4989}
2404 4990.carousel {
2405div.loadingBar { 4991 position: relative;
2406 height: 22px; 4992 margin-bottom: 20px;
2407 width: 214px; 4993 line-height: 1;
2408 //background: url(./images/old/loading/loadingBar.gif) no-repeat center;
2409 background: url(data:image/gif;charset=utf-8;base64,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) no-repeat center;
2410} 4994}
2411 4995.carousel-inner {
2412div.loadingBar div.loadingBarProgress { 4996 overflow: hidden;
2413 height: 100%; 4997 width: 100%;
2414 width: 0%; 4998 position: relative;
2415} 4999}
2416 5000.carousel-inner > .item {
2417div.loadingBar div.loadingBarProgress div.loadingBarProgress_left { 5001 display: none;
2418 height: 100%; 5002 position: relative;
2419 max-width: 8px; 5003 -webkit-transition: 0.6s ease-in-out left;
2420 //background: url(./images/old/loading/loadingBarProgress.png) no-repeat 0; 5004 -moz-transition: 0.6s ease-in-out left;
2421 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAANYAAAAWCAYAAAC8C2KaAAAACXBIWXMAAAsSAAALEgHS3X78AAACIklEQVR4Ae3brU7DUBQH8HO6PQAazx4BRUKDwfChQTGFQ4wRFGEERdgQONRQoGEzGFISFI8w/DQSWHsP565r0xY2BiWY/ivW+530l52cdr0jwgEBCPy5AE9aUc7XV0kcl4jniGR20lj0QaAYAtzXWHgmNh7v3HTGXfOXgSWnKy6VqEZMCKZxcmiHgFCfAjrjva6XxfgUWNJc3tVBG9mBqEMAAmMFrrl+10r2pgJLTpYO9dZvNTkAZQhAYAoBNh3evz+KRsaBJccLevtXakYdOEMAAj8UCII6Hzx6dlY5nipBjXwTV1GAAAR+KiA1neHZWcOMJY35FS03bAMOCEAgl0CDG0/dMGP5by6xk2s1TIYABFRAjKufo8AyfoUkftyCDwQg8FsBloqdGmaswMf7qt9CYh4E0gLDWBrdCg7SXahBAAK5BEYZa9AnZmStXJSYDAEVENEtT/GtYNAjxl5AfDEgkFtAuGfXCDPW4N0jh9zci2IBCBRdwCTeY1kL2Z65RdYq+rcC159LQLjPFy9rdo0wY9nS+2uLSk5qI6FtxgEBCEwpEJg4flIvr2SrfEgOYxPulI4YBoFYwEiHL/2jqJ4KLNuowVXT4NqMBuAMAQh8I2DkSoPqLDnqU2DZTqmWF4mcXTxzJalQhkBGQJ+piEyL2/5DpifchJttjOpSLenmXMfVvboVBFmkgnOhBYbBJPqTuv41vx10C22Bi4fAfwt8AJe2flCLvH1PAAAAAElFTkSuQmCCCg==) no-repeat 0; 5005 -o-transition: 0.6s ease-in-out left;
5006 transition: 0.6s ease-in-out left;
2422} 5007}
2423 5008.carousel-inner > .item > img {
2424div.loadingBar div.loadingBarProgress div.loadingBarProgress_right { 5009 display: block;
2425 position: relative; 5010 line-height: 1;
2426 height: 100%;
2427 margin-left: 8px;
2428 //background: url(./images/old/loading/loadingBarProgress.png) no-repeat right;
2429 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAANYAAAAWCAYAAAC8C2KaAAAACXBIWXMAAAsSAAALEgHS3X78AAACIklEQVR4Ae3brU7DUBQH8HO6PQAazx4BRUKDwfChQTGFQ4wRFGEERdgQONRQoGEzGFISFI8w/DQSWHsP565r0xY2BiWY/ivW+530l52cdr0jwgEBCPy5AE9aUc7XV0kcl4jniGR20lj0QaAYAtzXWHgmNh7v3HTGXfOXgSWnKy6VqEZMCKZxcmiHgFCfAjrjva6XxfgUWNJc3tVBG9mBqEMAAmMFrrl+10r2pgJLTpYO9dZvNTkAZQhAYAoBNh3evz+KRsaBJccLevtXakYdOEMAAj8UCII6Hzx6dlY5nipBjXwTV1GAAAR+KiA1neHZWcOMJY35FS03bAMOCEAgl0CDG0/dMGP5by6xk2s1TIYABFRAjKufo8AyfoUkftyCDwQg8FsBloqdGmaswMf7qt9CYh4E0gLDWBrdCg7SXahBAAK5BEYZa9AnZmStXJSYDAEVENEtT/GtYNAjxl5AfDEgkFtAuGfXCDPW4N0jh9zci2IBCBRdwCTeY1kL2Z65RdYq+rcC159LQLjPFy9rdo0wY9nS+2uLSk5qI6FtxgEBCEwpEJg4flIvr2SrfEgOYxPulI4YBoFYwEiHL/2jqJ4KLNuowVXT4NqMBuAMAQh8I2DkSoPqLDnqU2DZTqmWF4mcXTxzJalQhkBGQJ+piEyL2/5DpifchJttjOpSLenmXMfVvboVBFmkgnOhBYbBJPqTuv41vx10C22Bi4fAfwt8AJe2flCLvH1PAAAAAElFTkSuQmCCCg==) no-repeat right;
2430 top: -22px;
2431} 5011}
2432 5012.carousel-inner > .active,
2433// ------------------------------------------- 5013.carousel-inner > .next,
2434 5014.carousel-inner > .prev {
2435body.iPhone .loginErrorPanel { 5015 display: block;
2436 position: absolute;
2437 min-height: 372px;
2438 box-sizing: border-box;
2439 -moz-box-sizing: border-box;
2440 -webkit-box-sizing: border-box;
2441 padding: 10px;
2442 //background: #c8c8c8 url(./images/old/iPhone/pinstripes.png);
2443 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
2444} 5016}
2445 5017.carousel-inner > .active {
2446body.iPhone .loginErrorPanel h2 { 5018 left: 0;
2447 text-align: center;
2448 color: red;
2449 margin-top: 40px;
2450} 5019}
2451 5020.carousel-inner > .next,
2452// ------------------------------------------- 5021.carousel-inner > .prev {
2453 5022 position: absolute;
2454form.cardListSearchForm { 5023 top: 0;
2455 box-sizing: border-box; 5024 width: 100%;
2456 -moz-box-sizing: border-box;
2457 -webkit-box-sizing: border-box;
2458 border-bottom: 1px solid #2d3642;
2459 border-top: 1px solid #6d84a2;
2460 padding: 6px;
2461 height: 45px;
2462 // background: url(./images/old/iPhone/toolbar.png) #6d84a2 repeat-x;
2463 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUCNddjDEOgEAQAgn//5qltYWFnb1GB4vdSy4WBAYStKyb9+O0FJMYyjMyMWCC35lJM71r6vF1P07/lFSfPx6ZxNLcy1HtihzpA/RWcOj0zlDhAAAAAElFTkSuQmCCCg==) #6d84a2 repeat-x;
2464 margin: 0px;
2465} 5025}
2466 5026.carousel-inner > .next {
2467form.cardListSearchForm input { 5027 left: 100%;
2468 margin: 7px;
2469 -webkit-appearance: searchfield;
2470 width: 200px;
2471} 5028}
2472 5029.carousel-inner > .prev {
2473ul.cardListPanel { 5030 left: -100%;
2474 margin: 0px;
2475 padding: 0px;
2476 list-style-type: none;
2477 min-height: 372px;
2478} 5031}
2479 5032.carousel-inner > .next.left,
2480li.cardListItem { 5033.carousel-inner > .prev.right {
2481 height: 43px; 5034 left: 0;
2482 border-bottom: 1px solid #cccccc;
2483 //background: url(./images/old/iPhone/listArrow.png) no-repeat right center;
2484 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKVJREFUeNpi/P//PwOtARMDHcDwsYQFRJSXl8P4dVC6CZvizs5O8i1BsqARid9Ei+BiQ2KDLKumhSU1QNyKxG+hlkXoEQ+yqAPNogpapK5KNIvaKbUIVxKeAsTvkPg5QCxETUukgfgAkqFPgdgBzVKKLIFZoIJmwR1qBRdNLEC2BJQpV9LCAmRL/gBxAtRwqlqAXqzcgRrOQE0LQIBxtNIiBQAEGAA7xCa2yF9zEgAAAABJRU5ErkJgggo=) no-repeat right center;
2485
2486} 5035}
2487 5036.carousel-inner > .active.left {
2488li.cardListItem a { 5037 left: -100%;
2489 position: relative;
2490 top: -22px;
2491 left: 40px;
2492 display: block;
2493 white-space: nowrap;
2494 overflow: hidden;
2495} 5038}
2496 5039.carousel-inner > .active.right {
2497body[orientation="portrait"] li.cardListItem a { 5040 left: 100%;
2498 max-width: 250px;
2499} 5041}
2500 5042.carousel-control {
2501body[orientation="landscape"] li.cardListItem a { 5043 position: absolute;
2502 max-width: 400px; 5044 top: 40%;
5045 left: 15px;
5046 width: 40px;
5047 height: 40px;
5048 margin-top: -20px;
5049 font-size: 60px;
5050 font-weight: 100;
5051 line-height: 30px;
5052 color: #ffffff;
5053 text-align: center;
5054 background: #222222;
5055 border: 3px solid #ffffff;
5056 -webkit-border-radius: 23px;
5057 -moz-border-radius: 23px;
5058 border-radius: 23px;
5059 opacity: 0.5;
5060 filter: alpha(opacity=50);
5061}
5062.carousel-control.right {
5063 left: auto;
5064 right: 15px;
5065}
5066.carousel-control:hover {
5067 color: #ffffff;
5068 text-decoration: none;
5069 opacity: 0.9;
5070 filter: alpha(opacity=90);
2503} 5071}
2504 5072.carousel-caption {
2505li.cardListItem img { 5073 position: absolute;
2506 height: 20px; 5074 left: 0;
2507 width: 20px; 5075 right: 0;
2508 padding: 12px 10px 0px 10px; 5076 bottom: 0;
5077 padding: 15px;
5078 background: #333333;
5079 background: rgba(0, 0, 0, 0.75);
2509} 5080}
2510 5081.carousel-caption h4,
2511li.cardListItem a { 5082.carousel-caption p {
2512 text-decoration: none; 5083 color: #ffffff;
2513 color: black; 5084 line-height: 20px;
2514 font-weight: bold;
2515 font-size: 14pt;
2516 vertical-align: 3px;
2517} 5085}
2518 5086.carousel-caption h4 {
2519 5087 margin: 0 0 5px;
2520div.cardDetailPanel {
2521 position: absolute;
2522 top: 45px;
2523 min-height: 372px;
2524
2525 box-sizing: border-box;
2526 -moz-box-sizing: border-box;
2527 -webkit-box-sizing: border-box;
2528 padding: 10px;
2529 //background: #c8c8c8 url(./images/old/iPhone/pinstripes.png);
2530 background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==);
2531} 5088}
2532 5089.carousel-caption p {
2533div.cardDetailPanel > fieldset > div.row > span.directLogin { 5090 margin-bottom: 0;
5091}
5092.hero-unit {
5093 padding: 60px;
5094 margin-bottom: 30px;
5095 font-size: 18px;
5096 font-weight: 200;
5097 line-height: 30px;
5098 color: inherit;
5099 background-color: #eeeeee;
5100 -webkit-border-radius: 6px;
5101 -moz-border-radius: 6px;
5102 border-radius: 6px;
5103}
5104.hero-unit h1 {
5105 margin-bottom: 0;
5106 font-size: 60px;
5107 line-height: 1;
5108 color: inherit;
5109 letter-spacing: -1px;
5110}
5111.hero-unit li {
5112 line-height: 30px;
5113}
5114.pull-right {
5115 float: right;
5116}
5117.pull-left {
5118 float: left;
5119}
5120.hide {
5121 display: none;
5122}
5123.show {
5124 display: block;
5125}
5126.invisible {
5127 visibility: hidden;
5128}
5129.affix {
5130 position: fixed;
5131}
5132.hidden {
5133 display: none;
5134 visibility: hidden;
5135}
5136.visible-phone {
5137 display: none !important;
5138}
5139.visible-tablet {
5140 display: none !important;
5141}
5142.hidden-desktop {
5143 display: none !important;
5144}
5145.visible-desktop {
5146 display: inherit !important;
5147}
5148@media (min-width: 768px) and (max-width: 979px) {
5149 .hidden-desktop {
5150 display: inherit !important;
5151 }
5152 .visible-desktop {
5153 display: none !important ;
5154 }
5155 .visible-tablet {
5156 display: inherit !important;
5157 }
5158 .hidden-tablet {
5159 display: none !important;
5160 }
5161}
5162@media (max-width: 767px) {
5163 .hidden-desktop {
5164 display: inherit !important;
5165 }
5166 .visible-desktop {
5167 display: none !important;
5168 }
5169 .visible-phone {
5170 display: inherit !important;
5171 }
5172 .hidden-phone {
5173 display: none !important;
5174 }
5175}
5176@media (min-width: 1200px) {
5177 .row {
5178 margin-left: -30px;
5179 *zoom: 1;
5180 }
5181 .row:before,
5182 .row:after {
5183 display: table;
5184 content: "";
5185 line-height: 0;
5186 }
5187 .row:after {
5188 clear: both;
5189 }
5190 [class*="span"] {
5191 float: left;
5192 min-height: 1px;
5193 margin-left: 30px;
5194 }
5195 .container,
5196 .navbar-static-top .container,
5197 .navbar-fixed-top .container,
5198 .navbar-fixed-bottom .container {
5199 width: 1170px;
5200 }
5201 .span12 {
5202 width: 1170px;
5203 }
5204 .span11 {
5205 width: 1070px;
5206 }
5207 .span10 {
5208 width: 970px;
5209 }
5210 .span9 {
5211 width: 870px;
5212 }
5213 .span8 {
5214 width: 770px;
5215 }
5216 .span7 {
5217 width: 670px;
5218 }
5219 .span6 {
5220 width: 570px;
5221 }
5222 .span5 {
5223 width: 470px;
5224 }
5225 .span4 {
5226 width: 370px;
5227 }
5228 .span3 {
5229 width: 270px;
5230 }
5231 .span2 {
5232 width: 170px;
5233 }
5234 .span1 {
5235 width: 70px;
5236 }
5237 .offset12 {
5238 margin-left: 1230px;
5239 }
5240 .offset11 {
5241 margin-left: 1130px;
5242 }
5243 .offset10 {
5244 margin-left: 1030px;
5245 }
5246 .offset9 {
5247 margin-left: 930px;
5248 }
5249 .offset8 {
5250 margin-left: 830px;
5251 }
5252 .offset7 {
5253 margin-left: 730px;
5254 }
5255 .offset6 {
5256 margin-left: 630px;
5257 }
5258 .offset5 {
5259 margin-left: 530px;
5260 }
5261 .offset4 {
5262 margin-left: 430px;
5263 }
5264 .offset3 {
5265 margin-left: 330px;
5266 }
5267 .offset2 {
5268 margin-left: 230px;
5269 }
5270 .offset1 {
5271 margin-left: 130px;
5272 }
5273 .row-fluid {
5274 width: 100%;
5275 *zoom: 1;
5276 }
5277 .row-fluid:before,
5278 .row-fluid:after {
5279 display: table;
5280 content: "";
5281 line-height: 0;
5282 }
5283 .row-fluid:after {
5284 clear: both;
5285 }
5286 .row-fluid [class*="span"] {
5287 display: block;
5288 width: 100%;
5289 min-height: 30px;
5290 -webkit-box-sizing: border-box;
5291 -moz-box-sizing: border-box;
5292 box-sizing: border-box;
5293 float: left;
5294 margin-left: 2.564102564102564%;
5295 *margin-left: 2.5109110747408616%;
5296 }
5297 .row-fluid [class*="span"]:first-child {
5298 margin-left: 0;
5299 }
5300 .row-fluid .controls-row [class*="span"] + [class*="span"] {
5301 margin-left: 2.564102564102564%;
5302 }
5303 .row-fluid .span12 {
5304 width: 100%;
5305 *width: 99.94680851063829%;
5306 }
5307 .row-fluid .span11 {
5308 width: 91.45299145299145%;
5309 *width: 91.39979996362975%;
5310 }
5311 .row-fluid .span10 {
5312 width: 82.90598290598291%;
5313 *width: 82.8527914166212%;
5314 }
5315 .row-fluid .span9 {
5316 width: 74.35897435897436%;
5317 *width: 74.30578286961266%;
5318 }
5319 .row-fluid .span8 {
5320 width: 65.81196581196582%;
5321 *width: 65.75877432260411%;
5322 }
5323 .row-fluid .span7 {
5324 width: 57.26495726495726%;
5325 *width: 57.21176577559556%;
5326 }
5327 .row-fluid .span6 {
5328 width: 48.717948717948715%;
5329 *width: 48.664757228587014%;
5330 }
5331 .row-fluid .span5 {
5332 width: 40.17094017094017%;
5333 *width: 40.11774868157847%;
5334 }
5335 .row-fluid .span4 {
5336 width: 31.623931623931625%;
5337 *width: 31.570740134569924%;
5338 }
5339 .row-fluid .span3 {
5340 width: 23.076923076923077%;
5341 *width: 23.023731587561375%;
5342 }
5343 .row-fluid .span2 {
5344 width: 14.52991452991453%;
5345 *width: 14.476723040552828%;
5346 }
5347 .row-fluid .span1 {
5348 width: 5.982905982905983%;
5349 *width: 5.929714493544281%;
5350 }
5351 .row-fluid .offset12 {
5352 margin-left: 105.12820512820512%;
5353 *margin-left: 105.02182214948171%;
5354 }
5355 .row-fluid .offset12:first-child {
5356 margin-left: 102.56410256410257%;
5357 *margin-left: 102.45771958537915%;
5358 }
5359 .row-fluid .offset11 {
5360 margin-left: 96.58119658119658%;
5361 *margin-left: 96.47481360247316%;
5362 }
5363 .row-fluid .offset11:first-child {
5364 margin-left: 94.01709401709402%;
5365 *margin-left: 93.91071103837061%;
5366 }
5367 .row-fluid .offset10 {
5368 margin-left: 88.03418803418803%;
5369 *margin-left: 87.92780505546462%;
5370 }
5371 .row-fluid .offset10:first-child {
5372 margin-left: 85.47008547008548%;
5373 *margin-left: 85.36370249136206%;
5374 }
5375 .row-fluid .offset9 {
5376 margin-left: 79.48717948717949%;
5377 *margin-left: 79.38079650845607%;
5378 }
5379 .row-fluid .offset9:first-child {
5380 margin-left: 76.92307692307693%;
5381 *margin-left: 76.81669394435352%;
5382 }
5383 .row-fluid .offset8 {
5384 margin-left: 70.94017094017094%;
5385 *margin-left: 70.83378796144753%;
5386 }
5387 .row-fluid .offset8:first-child {
5388 margin-left: 68.37606837606839%;
5389 *margin-left: 68.26968539734497%;
5390 }
5391 .row-fluid .offset7 {
5392 margin-left: 62.393162393162385%;
5393 *margin-left: 62.28677941443899%;
5394 }
5395 .row-fluid .offset7:first-child {
5396 margin-left: 59.82905982905982%;
5397 *margin-left: 59.72267685033642%;
5398 }
5399 .row-fluid .offset6 {
5400 margin-left: 53.84615384615384%;
5401 *margin-left: 53.739770867430444%;
5402 }
5403 .row-fluid .offset6:first-child {
5404 margin-left: 51.28205128205128%;
5405 *margin-left: 51.175668303327875%;
5406 }
5407 .row-fluid .offset5 {
5408 margin-left: 45.299145299145295%;
5409 *margin-left: 45.1927623204219%;
5410 }
5411 .row-fluid .offset5:first-child {
5412 margin-left: 42.73504273504273%;
5413 *margin-left: 42.62865975631933%;
5414 }
5415 .row-fluid .offset4 {
5416 margin-left: 36.75213675213675%;
5417 *margin-left: 36.645753773413354%;
5418 }
5419 .row-fluid .offset4:first-child {
5420 margin-left: 34.18803418803419%;
5421 *margin-left: 34.081651209310785%;
5422 }
5423 .row-fluid .offset3 {
5424 margin-left: 28.205128205128204%;
5425 *margin-left: 28.0987452264048%;
5426 }
5427 .row-fluid .offset3:first-child {
5428 margin-left: 25.641025641025642%;
5429 *margin-left: 25.53464266230224%;
5430 }
5431 .row-fluid .offset2 {
5432 margin-left: 19.65811965811966%;
5433 *margin-left: 19.551736679396257%;
5434 }
5435 .row-fluid .offset2:first-child {
5436 margin-left: 17.094017094017094%;
5437 *margin-left: 16.98763411529369%;
5438 }
5439 .row-fluid .offset1 {
5440 margin-left: 11.11111111111111%;
5441 *margin-left: 11.004728132387708%;
5442 }
5443 .row-fluid .offset1:first-child {
5444 margin-left: 8.547008547008547%;
5445 *margin-left: 8.440625568285142%;
5446 }
5447 input,
5448 textarea,
5449 .uneditable-input {
5450 margin-left: 0;
5451 }
5452 .controls-row [class*="span"] + [class*="span"] {
5453 margin-left: 30px;
5454 }
5455 input.span12, textarea.span12, .uneditable-input.span12 {
5456 width: 1156px;
5457 }
5458 input.span11, textarea.span11, .uneditable-input.span11 {
5459 width: 1056px;
5460 }
5461 input.span10, textarea.span10, .uneditable-input.span10 {
5462 width: 956px;
5463 }
5464 input.span9, textarea.span9, .uneditable-input.span9 {
5465 width: 856px;
5466 }
5467 input.span8, textarea.span8, .uneditable-input.span8 {
5468 width: 756px;
5469 }
5470 input.span7, textarea.span7, .uneditable-input.span7 {
5471 width: 656px;
5472 }
5473 input.span6, textarea.span6, .uneditable-input.span6 {
5474 width: 556px;
5475 }
5476 input.span5, textarea.span5, .uneditable-input.span5 {
5477 width: 456px;
5478 }
5479 input.span4, textarea.span4, .uneditable-input.span4 {
5480 width: 356px;
5481 }
5482 input.span3, textarea.span3, .uneditable-input.span3 {
5483 width: 256px;
5484 }
5485 input.span2, textarea.span2, .uneditable-input.span2 {
5486 width: 156px;
5487 }
5488 input.span1, textarea.span1, .uneditable-input.span1 {
5489 width: 56px;
5490 }
5491 .thumbnails {
5492 margin-left: -30px;
5493 }
5494 .thumbnails > li {
5495 margin-left: 30px;
5496 }
5497 .row-fluid .thumbnails {
5498 margin-left: 0;
5499 }
5500}
5501@media (min-width: 768px) and (max-width: 979px) {
5502 .row {
5503 margin-left: -20px;
5504 *zoom: 1;
5505 }
5506 .row:before,
5507 .row:after {
5508 display: table;
5509 content: "";
5510 line-height: 0;
5511 }
5512 .row:after {
5513 clear: both;
5514 }
5515 [class*="span"] {
5516 float: left;
5517 min-height: 1px;
5518 margin-left: 20px;
5519 }
5520 .container,
5521 .navbar-static-top .container,
5522 .navbar-fixed-top .container,
5523 .navbar-fixed-bottom .container {
5524 width: 724px;
5525 }
5526 .span12 {
5527 width: 724px;
5528 }
5529 .span11 {
5530 width: 662px;
5531 }
5532 .span10 {
5533 width: 600px;
5534 }
5535 .span9 {
5536 width: 538px;
5537 }
5538 .span8 {
5539 width: 476px;
5540 }
5541 .span7 {
5542 width: 414px;
5543 }
5544 .span6 {
5545 width: 352px;
5546 }
5547 .span5 {
5548 width: 290px;
5549 }
5550 .span4 {
5551 width: 228px;
5552 }
5553 .span3 {
5554 width: 166px;
5555 }
5556 .span2 {
5557 width: 104px;
5558 }
5559 .span1 {
5560 width: 42px;
5561 }
5562 .offset12 {
5563 margin-left: 764px;
5564 }
5565 .offset11 {
5566 margin-left: 702px;
5567 }
5568 .offset10 {
5569 margin-left: 640px;
5570 }
5571 .offset9 {
5572 margin-left: 578px;
5573 }
5574 .offset8 {
5575 margin-left: 516px;
5576 }
5577 .offset7 {
5578 margin-left: 454px;
5579 }
5580 .offset6 {
5581 margin-left: 392px;
5582 }
5583 .offset5 {
5584 margin-left: 330px;
5585 }
5586 .offset4 {
5587 margin-left: 268px;
5588 }
5589 .offset3 {
5590 margin-left: 206px;
5591 }
5592 .offset2 {
5593 margin-left: 144px;
5594 }
5595 .offset1 {
5596 margin-left: 82px;
5597 }
5598 .row-fluid {
5599 width: 100%;
5600 *zoom: 1;
5601 }
5602 .row-fluid:before,
5603 .row-fluid:after {
5604 display: table;
5605 content: "";
5606 line-height: 0;
5607 }
5608 .row-fluid:after {
5609 clear: both;
5610 }
5611 .row-fluid [class*="span"] {
5612 display: block;
5613 width: 100%;
5614 min-height: 30px;
5615 -webkit-box-sizing: border-box;
5616 -moz-box-sizing: border-box;
5617 box-sizing: border-box;
5618 float: left;
5619 margin-left: 2.7624309392265194%;
5620 *margin-left: 2.709239449864817%;
5621 }
5622 .row-fluid [class*="span"]:first-child {
5623 margin-left: 0;
5624 }
5625 .row-fluid .controls-row [class*="span"] + [class*="span"] {
5626 margin-left: 2.7624309392265194%;
5627 }
5628 .row-fluid .span12 {
5629 width: 100%;
5630 *width: 99.94680851063829%;
5631 }
5632 .row-fluid .span11 {
5633 width: 91.43646408839778%;
5634 *width: 91.38327259903608%;
5635 }
5636 .row-fluid .span10 {
5637 width: 82.87292817679558%;
5638 *width: 82.81973668743387%;
5639 }
5640 .row-fluid .span9 {
5641 width: 74.30939226519337%;
5642 *width: 74.25620077583166%;
5643 }
5644 .row-fluid .span8 {
5645 width: 65.74585635359117%;
5646 *width: 65.69266486422946%;
5647 }
5648 .row-fluid .span7 {
5649 width: 57.18232044198895%;
5650 *width: 57.12912895262725%;
5651 }
5652 .row-fluid .span6 {
5653 width: 48.61878453038674%;
5654 *width: 48.56559304102504%;
5655 }
5656 .row-fluid .span5 {
5657 width: 40.05524861878453%;
5658 *width: 40.00205712942283%;
5659 }
5660 .row-fluid .span4 {
5661 width: 31.491712707182323%;
5662 *width: 31.43852121782062%;
5663 }
5664 .row-fluid .span3 {
5665 width: 22.92817679558011%;
5666 *width: 22.87498530621841%;
5667 }
5668 .row-fluid .span2 {
5669 width: 14.3646408839779%;
5670 *width: 14.311449394616199%;
5671 }
5672 .row-fluid .span1 {
5673 width: 5.801104972375691%;
5674 *width: 5.747913483013988%;
5675 }
5676 .row-fluid .offset12 {
5677 margin-left: 105.52486187845304%;
5678 *margin-left: 105.41847889972962%;
5679 }
5680 .row-fluid .offset12:first-child {
5681 margin-left: 102.76243093922652%;
5682 *margin-left: 102.6560479605031%;
5683 }
5684 .row-fluid .offset11 {
5685 margin-left: 96.96132596685082%;
5686 *margin-left: 96.8549429881274%;
5687 }
5688 .row-fluid .offset11:first-child {
5689 margin-left: 94.1988950276243%;
5690 *margin-left: 94.09251204890089%;
5691 }
5692 .row-fluid .offset10 {
5693 margin-left: 88.39779005524862%;
5694 *margin-left: 88.2914070765252%;
5695 }
5696 .row-fluid .offset10:first-child {
5697 margin-left: 85.6353591160221%;
5698 *margin-left: 85.52897613729868%;
5699 }
5700 .row-fluid .offset9 {
5701 margin-left: 79.8342541436464%;
5702 *margin-left: 79.72787116492299%;
5703 }
5704 .row-fluid .offset9:first-child {
5705 margin-left: 77.07182320441989%;
5706 *margin-left: 76.96544022569647%;
5707 }
5708 .row-fluid .offset8 {
5709 margin-left: 71.2707182320442%;
5710 *margin-left: 71.16433525332079%;
5711 }
5712 .row-fluid .offset8:first-child {
5713 margin-left: 68.50828729281768%;
5714 *margin-left: 68.40190431409427%;
5715 }
5716 .row-fluid .offset7 {
5717 margin-left: 62.70718232044199%;
5718 *margin-left: 62.600799341718584%;
5719 }
5720 .row-fluid .offset7:first-child {
5721 margin-left: 59.94475138121547%;
5722 *margin-left: 59.838368402492065%;
5723 }
5724 .row-fluid .offset6 {
5725 margin-left: 54.14364640883978%;
5726 *margin-left: 54.037263430116376%;
5727 }
5728 .row-fluid .offset6:first-child {
5729 margin-left: 51.38121546961326%;
5730 *margin-left: 51.27483249088986%;
5731 }
5732 .row-fluid .offset5 {
5733 margin-left: 45.58011049723757%;
5734 *margin-left: 45.47372751851417%;
5735 }
5736 .row-fluid .offset5:first-child {
5737 margin-left: 42.81767955801105%;
5738 *margin-left: 42.71129657928765%;
5739 }
5740 .row-fluid .offset4 {
5741 margin-left: 37.01657458563536%;
5742 *margin-left: 36.91019160691196%;
5743 }
5744 .row-fluid .offset4:first-child {
5745 margin-left: 34.25414364640884%;
5746 *margin-left: 34.14776066768544%;
5747 }
5748 .row-fluid .offset3 {
5749 margin-left: 28.45303867403315%;
5750 *margin-left: 28.346655695309746%;
5751 }
5752 .row-fluid .offset3:first-child {
5753 margin-left: 25.69060773480663%;
5754 *margin-left: 25.584224756083227%;
5755 }
5756 .row-fluid .offset2 {
5757 margin-left: 19.88950276243094%;
5758 *margin-left: 19.783119783707537%;
5759 }
5760 .row-fluid .offset2:first-child {
5761 margin-left: 17.12707182320442%;
5762 *margin-left: 17.02068884448102%;
5763 }
5764 .row-fluid .offset1 {
5765 margin-left: 11.32596685082873%;
5766 *margin-left: 11.219583872105325%;
5767 }
5768 .row-fluid .offset1:first-child {
5769 margin-left: 8.56353591160221%;
5770 *margin-left: 8.457152932878806%;
5771 }
5772 input,
5773 textarea,
5774 .uneditable-input {
5775 margin-left: 0;
5776 }
5777 .controls-row [class*="span"] + [class*="span"] {
5778 margin-left: 20px;
5779 }
5780 input.span12, textarea.span12, .uneditable-input.span12 {
5781 width: 710px;
5782 }
5783 input.span11, textarea.span11, .uneditable-input.span11 {
5784 width: 648px;
5785 }
5786 input.span10, textarea.span10, .uneditable-input.span10 {
5787 width: 586px;
5788 }
5789 input.span9, textarea.span9, .uneditable-input.span9 {
5790 width: 524px;
5791 }
5792 input.span8, textarea.span8, .uneditable-input.span8 {
5793 width: 462px;
5794 }
5795 input.span7, textarea.span7, .uneditable-input.span7 {
5796 width: 400px;
5797 }
5798 input.span6, textarea.span6, .uneditable-input.span6 {
5799 width: 338px;
5800 }
5801 input.span5, textarea.span5, .uneditable-input.span5 {
5802 width: 276px;
5803 }
5804 input.span4, textarea.span4, .uneditable-input.span4 {
5805 width: 214px;
5806 }
5807 input.span3, textarea.span3, .uneditable-input.span3 {
5808 width: 152px;
5809 }
5810 input.span2, textarea.span2, .uneditable-input.span2 {
5811 width: 90px;
5812 }
5813 input.span1, textarea.span1, .uneditable-input.span1 {
5814 width: 28px;
5815 }
5816}
5817@media (max-width: 767px) {
5818 body {
5819 padding-left: 20px;
5820 padding-right: 20px;
5821 }
5822 .navbar-fixed-top,
5823 .navbar-fixed-bottom,
5824 .navbar-static-top {
5825 margin-left: -20px;
5826 margin-right: -20px;
5827 }
5828 .container-fluid {
5829 padding: 0;
5830 }
5831 .dl-horizontal dt {
5832 float: none;
5833 clear: none;
5834 width: auto;
5835 text-align: left;
5836 }
5837 .dl-horizontal dd {
5838 margin-left: 0;
5839 }
5840 .container {
5841 width: auto;
5842 }
5843 .row-fluid {
2534 width: 100%; 5844 width: 100%;
5845 }
5846 .row,
5847 .thumbnails {
5848 margin-left: 0;
5849 }
5850 .thumbnails > li {
5851 float: none;
5852 margin-left: 0;
5853 }
5854 [class*="span"],
5855 .uneditable-input[class*="span"],
5856 .row-fluid [class*="span"] {
5857 float: none;
5858 display: block;
5859 width: 100%;
5860 margin-left: 0;
5861 -webkit-box-sizing: border-box;
5862 -moz-box-sizing: border-box;
2535 box-sizing: border-box; 5863 box-sizing: border-box;
5864 }
5865 .span12,
5866 .row-fluid .span12 {
5867 width: 100%;
5868 -webkit-box-sizing: border-box;
2536 -moz-box-sizing: border-box; 5869 -moz-box-sizing: border-box;
5870 box-sizing: border-box;
5871 }
5872 .row-fluid [class*="offset"]:first-child {
5873 margin-left: 0;
5874 }
5875 .input-large,
5876 .input-xlarge,
5877 .input-xxlarge,
5878 input[class*="span"],
5879 select[class*="span"],
5880 textarea[class*="span"],
5881 .uneditable-input {
5882 display: block;
5883 width: 100%;
5884 min-height: 30px;
2537 -webkit-box-sizing: border-box; 5885 -webkit-box-sizing: border-box;
5886 -moz-box-sizing: border-box;
5887 box-sizing: border-box;
5888 }
5889 .input-prepend input,
5890 .input-append input,
5891 .input-prepend input[class*="span"],
5892 .input-append input[class*="span"] {
5893 display: inline-block;
5894 width: auto;
5895 }
5896 .controls-row [class*="span"] + [class*="span"] {
5897 margin-left: 0;
5898 }
5899 .modal {
5900 position: fixed;
5901 top: 20px;
5902 left: 20px;
5903 right: 20px;
5904 width: auto;
2538 margin: 0; 5905 margin: 0;
2539 border: none; 5906 }
2540 padding: 12px 10px 0 110px; 5907 .modal.fade {
2541 height: 42px; 5908 top: -100px;
2542 background: none; 5909 }
2543 font-size: 16px; 5910 .modal.fade.in {
2544 font-weight: normal; 5911 top: 20px;
2545 5912 }
2546 padding-left: 40px;
2547 color: black;
2548 //background: url(./images/old/iPhone/listArrow.png) no-repeat right center;
2549 background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKVJREFUeNpi/P//PwOtARMDHcDwsYQFRJSXl8P4dVC6CZvizs5O8i1BsqARid9Ei+BiQ2KDLKumhSU1QNyKxG+hlkXoEQ+yqAPNogpapK5KNIvaKbUIVxKeAsTvkPg5QCxETUukgfgAkqFPgdgBzVKKLIFZoIJmwR1qBRdNLEC2BJQpV9LCAmRL/gBxAtRwqlqAXqzcgRrOQE0LQIBxtNIiBQAEGAA7xCa2yF9zEgAAAABJRU5ErkJgggo=) no-repeat right center;
2550} 5913}
2551 5914@media (max-width: 480px) {
2552body[orientation="landscape"] div.cardDetailPanel > fieldset > div.row > span.directLogin { 5915 .nav-collapse {
2553 padding-left: 50px; 5916 -webkit-transform: translate3d(0, 0, 0);
5917 }
5918 .page-header h1 small {
5919 display: block;
5920 line-height: 20px;
5921 }
5922 input[type="checkbox"],
5923 input[type="radio"] {
5924 border: 1px solid #ccc;
5925 }
5926 .form-horizontal .control-label {
5927 float: none;
5928 width: auto;
5929 padding-top: 0;
5930 text-align: left;
5931 }
5932 .form-horizontal .controls {
5933 margin-left: 0;
5934 }
5935 .form-horizontal .control-list {
5936 padding-top: 0;
5937 }
5938 .form-horizontal .form-actions {
5939 padding-left: 10px;
5940 padding-right: 10px;
5941 }
5942 .media .pull-left,
5943 .media .pull-right {
5944 float: none;
5945 display: block;
5946 margin-bottom: 10px;
5947 }
5948 .media-object {
5949 margin-right: 0;
5950 margin-left: 0;
5951 }
5952 .modal {
5953 top: 10px;
5954 left: 10px;
5955 right: 10px;
5956 }
5957 .modal-header .close {
5958 padding: 10px;
5959 margin: -10px;
5960 }
5961 .carousel-caption {
5962 position: static;
5963 }
2554} 5964}
2555 5965@media (max-width: 979px) {
2556div.cardDetailPanel h2 { 5966 body {
2557 margin: 0 0 8px 14px; 5967 padding-top: 0;
2558 font-size: inherit; 5968 }
5969 .navbar-fixed-top,
5970 .navbar-fixed-bottom {
5971 position: static;
5972 }
5973 .navbar-fixed-top {
5974 margin-bottom: 20px;
5975 }
5976 .navbar-fixed-bottom {
5977 margin-top: 20px;
5978 }
5979 .navbar-fixed-top .navbar-inner,
5980 .navbar-fixed-bottom .navbar-inner {
5981 padding: 5px;
5982 }
5983 .navbar .container {
5984 width: auto;
5985 padding: 0;
5986 }
5987 .navbar .brand {
5988 padding-left: 10px;
5989 padding-right: 10px;
5990 margin: 0 0 0 -5px;
5991 }
5992 .nav-collapse {
5993 clear: both;
5994 }
5995 .nav-collapse .nav {
5996 float: none;
5997 margin: 0 0 10px;
5998 }
5999 .nav-collapse .nav > li {
6000 float: none;
6001 }
6002 .nav-collapse .nav > li > a {
6003 margin-bottom: 2px;
6004 }
6005 .nav-collapse .nav > .divider-vertical {
6006 display: none;
6007 }
6008 .nav-collapse .nav .nav-header {
6009 color: #777777;
6010 text-shadow: none;
6011 }
6012 .nav-collapse .nav > li > a,
6013 .nav-collapse .dropdown-menu a {
6014 padding: 9px 15px;
2559 font-weight: bold; 6015 font-weight: bold;
2560 color: #4d4d70; 6016 color: #777777;
2561 text-shadow: rgba(255, 255, 255, 0.75) 1px 1px 0; 6017 -webkit-border-radius: 3px;
6018 -moz-border-radius: 3px;
6019 border-radius: 3px;
6020 }
6021 .nav-collapse .btn {
6022 padding: 4px 10px 4px;
6023 font-weight: normal;
6024 -webkit-border-radius: 4px;
6025 -moz-border-radius: 4px;
6026 border-radius: 4px;
6027 }
6028 .nav-collapse .dropdown-menu li + li a {
6029 margin-bottom: 2px;
6030 }
6031 .nav-collapse .nav > li > a:hover,
6032 .nav-collapse .dropdown-menu a:hover {
6033 background-color: #f2f2f2;
6034 }
6035 .navbar-inverse .nav-collapse .nav > li > a,
6036 .navbar-inverse .nav-collapse .dropdown-menu a {
6037 color: #999999;
6038 }
6039 .navbar-inverse .nav-collapse .nav > li > a:hover,
6040 .navbar-inverse .nav-collapse .dropdown-menu a:hover {
6041 background-color: #111111;
6042 }
6043 .nav-collapse.in .btn-group {
6044 margin-top: 5px;
6045 padding: 0;
6046 }
6047 .nav-collapse .dropdown-menu {
6048 position: static;
6049 top: auto;
6050 left: auto;
6051 float: none;
6052 display: none;
6053 max-width: none;
6054 margin: 0 15px;
6055 padding: 0;
6056 background-color: transparent;
6057 border: none;
6058 -webkit-border-radius: 0;
6059 -moz-border-radius: 0;
6060 border-radius: 0;
6061 -webkit-box-shadow: none;
6062 -moz-box-shadow: none;
6063 box-shadow: none;
6064 }
6065 .nav-collapse .open > .dropdown-menu {
6066 display: block;
6067 }
6068 .nav-collapse .dropdown-menu:before,
6069 .nav-collapse .dropdown-menu:after {
6070 display: none;
6071 }
6072 .nav-collapse .dropdown-menu .divider {
6073 display: none;
6074 }
6075 .nav-collapse .nav > li > .dropdown-menu:before,
6076 .nav-collapse .nav > li > .dropdown-menu:after {
6077 display: none;
6078 }
6079 .nav-collapse .navbar-form,
6080 .nav-collapse .navbar-search {
6081 float: none;
6082 padding: 10px 15px;
6083 margin: 10px 0;
6084 border-top: 1px solid #f2f2f2;
6085 border-bottom: 1px solid #f2f2f2;
6086 -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
6087 -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
6088 box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
6089 }
6090 .navbar-inverse .nav-collapse .navbar-form,
6091 .navbar-inverse .nav-collapse .navbar-search {
6092 border-top-color: #111111;
6093 border-bottom-color: #111111;
6094 }
6095 .navbar .nav-collapse .nav.pull-right {
6096 float: none;
6097 margin-left: 0;
6098 }
6099 .nav-collapse,
6100 .nav-collapse.collapse {
6101 overflow: hidden;
6102 height: 0;
6103 }
6104 .navbar .btn-navbar {
6105 display: block;
6106 }
6107 .navbar-static .navbar-inner {
6108 padding-left: 10px;
6109 padding-right: 10px;
6110 }
2562} 6111}
2563 6112@media (min-width: 980px) {
2564body[orientation="portrait"] > * { 6113 .nav-collapse.collapse {
2565 width: 320px; 6114 height: auto !important;
6115 overflow: visible !important;
6116 }
2566} 6117}
2567 6118div.spinner {
2568body[orientation="landscape"] > * { 6119 position: relative;
2569 width: 480px; 6120 width: 100px;
6121 height: 100px;
6122 display: inline-block;
6123}
6124div.spinner div {
6125 width: 12%;
6126 height: 26%;
6127 background: #000;
6128 position: absolute;
6129 left: 44.5%;
6130 top: 37%;
6131 opacity: 0;
6132 -webkit-animation: fade 1s linear infinite;
6133 -webkit-border-radius: 50px;
6134 -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
6135}
6136div.spinner div.bar01 {
6137 -webkit-transform: rotate(0deg) translate(0, -142%);
6138 -webkit-animation-delay: 0s;
6139}
6140div.spinner div.bar02 {
6141 -webkit-transform: rotate(30deg) translate(0, -142%);
6142 -webkit-animation-delay: -0.9167s;
6143}
6144div.spinner div.bar03 {
6145 -webkit-transform: rotate(60deg) translate(0, -142%);
6146 -webkit-animation-delay: -0.833s;
6147}
6148div.spinner div.bar04 {
6149 -webkit-transform: rotate(90deg) translate(0, -142%);
6150 -webkit-animation-delay: -0.75s;
6151}
6152div.spinner div.bar05 {
6153 -webkit-transform: rotate(120deg) translate(0, -142%);
6154 -webkit-animation-delay: -0.667s;
6155}
6156div.spinner div.bar06 {
6157 -webkit-transform: rotate(150deg) translate(0, -142%);
6158 -webkit-animation-delay: -0.5833s;
6159}
6160div.spinner div.bar07 {
6161 -webkit-transform: rotate(180deg) translate(0, -142%);
6162 -webkit-animation-delay: -0.5s;
6163}
6164div.spinner div.bar08 {
6165 -webkit-transform: rotate(210deg) translate(0, -142%);
6166 -webkit-animation-delay: -0.41667s;
6167}
6168div.spinner div.bar09 {
6169 -webkit-transform: rotate(240deg) translate(0, -142%);
6170 -webkit-animation-delay: -0.333s;
6171}
6172div.spinner div.bar10 {
6173 -webkit-transform: rotate(270deg) translate(0, -142%);
6174 -webkit-animation-delay: -0.25s;
6175}
6176div.spinner div.bar11 {
6177 -webkit-transform: rotate(300deg) translate(0, -142%);
6178 -webkit-animation-delay: -0.1667s;
6179}
6180div.spinner div.bar12 {
6181 -webkit-transform: rotate(330deg) translate(0, -142%);
6182 -webkit-animation-delay: -0.0833s;
6183}
6184@-webkit-keyframes fade {
6185 from {
6186 opacity: 1;
6187 }
6188 to {
6189 opacity: 0.25;
6190 }
2570} 6191}
2571*/ \ No newline at end of file
diff --git a/frontend/gamma/css/static.css b/frontend/gamma/css/static.css
index 9953a8d..81725c5 100644
--- a/frontend/gamma/css/static.css
+++ b/frontend/gamma/css/static.css
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26body { 24body {
27 padding: 0px; 25 padding: 0px;
28 margin: 0px; 26 margin: 0px;
29 font-family: Helvetica, Arial, Geneva, sans-serif; 27 font-family: Helvetica, Arial, Geneva, sans-serif;
30 color: #666666; 28 color: #666666;
31} 29}
32div.header { 30div.header {
33 padding: 20px 25px; 31 padding: 20px 25px;
34 background-color: #1f2148; 32 background-color: #1f2148;
35} 33}
36div#logo { 34div#logo {
37 background: url(./images/old/logo.png); 35 background: url(./images/old/logo.png);
38 width: 150px; 36 width: 150px;
39 height: 39px; 37 height: 39px;
40 display: block; 38 display: block;
41} 39}
42h5.clipperzPayoff { 40h5.clipperzPayoff {
43 color: white; 41 color: white;
44 font-size: 13pt; 42 font-size: 13pt;
45 font-weight: normal; 43 font-weight: normal;
46 padding-left: 20px; 44 padding-left: 20px;
47 white-space: nowrap; 45 white-space: nowrap;
48 margin: 0px; 46 margin: 0px;
49 padding-left: 4px; 47 padding-left: 4px;
50} 48}
51/* 49/*
52h1 { 50h1 {
53 font-size: 40pt; 51 font-size: 40pt;
54 color: #333366; 52 color: #333366;
55} 53}
56 54
57h1 span.logo_z { 55h1 span.logo_z {
58 color: #ff9400; 56 color: #ff9400;
59} 57}
60*/ 58*/
61div.contentWrapper { 59div.contentWrapper {
62 padding: 20px; 60 padding: 20px;
63} 61}
64div.block1 { 62div.block1 {
65 float: left; 63 float: left;
66 margin-right: 40px; 64 margin-right: 40px;
67} 65}
68div.block2 { 66div.block2 {
69 float: left; 67 float: left;
70} 68}
71div.languageBlock { 69div.languageBlock {
72 clear: both; 70 clear: both;
73 padding-top: 20px; 71 padding-top: 20px;
74} 72}
75div.flags { 73div.flags {
76 float: left; 74 float: left;
77} 75}
78div.content { 76div.content {
79 float: left; 77 float: left;
80 margin-left: 20px; 78 margin-left: 20px;
81 width: 300px; 79 width: 300px;
82} 80}
83h3 { 81h3 {
84 margin: 0px; 82 margin: 0px;
85 padding-top: 10px; 83 padding-top: 10px;
86} 84}
87p { 85p {
88 font-size: 10pt; 86 font-size: 10pt;
89 line-height: 20px; 87 line-height: 20px;
90} 88}
91/* @group RSS feed */ 89/* @group RSS feed */
92body.iFrame { 90body.iFrame {
93 margin: 0px; 91 margin: 0px;
94 padding: 0px; 92 padding: 0px;
95 border: 0px; 93 border: 0px;
96 font-family: Helvetica, Arial, Geneva, sans-serif; 94 font-family: Helvetica, Arial, Geneva, sans-serif;
97} 95}
98div#feedContent ul { 96div#feedContent ul {
99 list-style-type: none; 97 list-style-type: none;
100 padding: 0px; 98 padding: 0px;
101 margin: 0px; 99 margin: 0px;
102} 100}
103div#feedContent ul li { 101div#feedContent ul li {
104 display: none; 102 display: none;
105} 103}
106div#feedContent ul li.selected { 104div#feedContent ul li.selected {
107 display: block; 105 display: block;
108 padding-top: 6px; 106 padding-top: 6px;
109} 107}
110div#feedContent ul li.selected em.date { 108div#feedContent ul li.selected em.date {
111 display: none; 109 display: none;
112} 110}
113div#feedContent ul li.selected a { 111div#feedContent ul li.selected a {
114 display: none; 112 display: none;
115} 113}
116div#feedContent ul li.selected h2 { 114div#feedContent ul li.selected h2 {
117 font-size: 8pt; 115 font-size: 8pt;
118 color: #c3c4cf; 116 color: #c3c4cf;
diff --git a/frontend/gamma/css/web.css b/frontend/gamma/css/web.css
index 5d8bc20..011831a 100644
--- a/frontend/gamma/css/web.css
+++ b/frontend/gamma/css/web.css
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26/* 24/*
27 25
28Color list: 26Color list:
29- login box: 27- login box:
30 light#ff9955 28 light#ff9955
31 dark#ff6622 29 dark#ff6622
32- login button: 30- login button:
33 regular#dd5500 31 regular#dd5500
34 hover#773311 32 hover#773311
35- login translations: 33- login translations:
36 box: #cc6622; 34 box: #cc6622;
37 not-selected: 35 not-selected:
38 color: #ddaa99 36 color: #ddaa99
39 background:#994422 37 background:#994422
40 selected: #772211; 38 selected: #772211;
41*/ 39*/
42html { 40html {
43 height: 100%; 41 height: 100%;
44} 42}
45body { 43body {
46 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 44 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
47 margin: 0px; 45 margin: 0px;
48} 46}
49div.modalDialogMask.userInfoBoxMask { 47div.modalDialogMask.userInfoBoxMask {
50 -moz-opacity: 0.0; 48 -moz-opacity: 0.0;
51 opacity: .0; 49 opacity: .0;
52 filter: alpha(opacity=0); 50 filter: alpha(opacity=0);
53 z-index: 19000; 51 z-index: 19000;
54} 52}
55.reset-margin { 53.reset-margin {
56 margin: 0px; 54 margin: 0px;
57 padding: 0px; 55 padding: 0px;
58 border: 0px; 56 border: 0px;
59} 57}
60.clear { 58.clear {
61 clear: both; 59 clear: both;
62} 60}
63.hidden_none { 61.hidden_none {
64 display: none; 62 display: none;
65 visibility: hidden; 63 visibility: hidden;
66} 64}
67.keepTogether { 65.keepTogether {
68 display: inline-block; 66 display: inline-block;
69 white-space: nowrap; 67 white-space: nowrap;
70} 68}
71#mainDiv { 69#mainDiv {
72 margin: 0 auto; 70 margin: 0 auto;
73} 71}
74/* 72/*
75 73
76Color list: 74Color list:
77- login box: 75- login box:
78 light#ff9955 76 light#ff9955
79 dark#ff6622 77 dark#ff6622
80- login button: 78- login button:
81 regular#dd5500 79 regular#dd5500
82 hover#773311 80 hover#773311
83- login translations: 81- login translations:
84 box: #cc6622; 82 box: #cc6622;
85 not-selected: 83 not-selected:
86 color: #ddaa99 84 color: #ddaa99
87 background:#994422 85 background:#994422
88 selected: #772211; 86 selected: #772211;
89*/ 87*/
90html { 88html {
91 height: 100%; 89 height: 100%;
92} 90}
93body { 91body {
94 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 92 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
95 margin: 0px; 93 margin: 0px;
96} 94}
97div.modalDialogMask.userInfoBoxMask { 95div.modalDialogMask.userInfoBoxMask {
98 -moz-opacity: 0.0; 96 -moz-opacity: 0.0;
99 opacity: .0; 97 opacity: .0;
100 filter: alpha(opacity=0); 98 filter: alpha(opacity=0);
101 z-index: 19000; 99 z-index: 19000;
102} 100}
103.reset-margin { 101.reset-margin {
104 margin: 0px; 102 margin: 0px;
105 padding: 0px; 103 padding: 0px;
106 border: 0px; 104 border: 0px;
107} 105}
108.clear { 106.clear {
109 clear: both; 107 clear: both;
110} 108}
111.hidden_none { 109.hidden_none {
112 display: none; 110 display: none;
113 visibility: hidden; 111 visibility: hidden;
114} 112}
115.keepTogether { 113.keepTogether {
116 display: inline-block; 114 display: inline-block;
117 white-space: nowrap; 115 white-space: nowrap;
118} 116}
@@ -121,593 +119,600 @@ div.modalDialogMask.userInfoBoxMask {
121} 119}
122div#loading { 120div#loading {
123 width: 100%; 121 width: 100%;
124 height: 100%; 122 height: 100%;
125 display: table; 123 display: table;
126 background-image: -ms-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%); 124 background-image: -ms-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%);
127 /* IE10 */ 125 /* IE10 */
128 background-image: -moz-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%); 126 background-image: -moz-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%);
129 /* Mozilla Firefox */ 127 /* Mozilla Firefox */
130 background-image: -o-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%); 128 background-image: -o-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%);
131 /* Opera */ 129 /* Opera */
132 background-image: -webkit-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%); 130 background-image: -webkit-radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%);
133 /* Webkit (Chrome 11+) */ 131 /* Webkit (Chrome 11+) */
134 background-image: radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%); 132 background-image: radial-gradient(center, circle farthest-corner, #4d52b3 0%, #1f2148 100%);
135 /* Proposed W3C Markup */ 133 /* Proposed W3C Markup */
136 background-image: -webkit-gradient(radial, center center, 0, center center, 495, color-stop(0, #4d52b3), color-stop(1, #1f2148)); 134 background-image: -webkit-gradient(radial, center center, 0, center center, 495, color-stop(0, #4d52b3), color-stop(1, #1f2148));
137 /* Webkit (Safari/Chrome 10) */ 135 /* Webkit (Safari/Chrome 10) */
138} 136}
139div#loading div { 137div#loading div {
140 display: table-cell; 138 display: table-cell;
141 vertical-align: middle; 139 vertical-align: middle;
142 width: 100%; 140 width: 100%;
143 text-align: center; 141 text-align: center;
144} 142}
145div#loading div h1 { 143div#loading div h1 {
146 font-size: 40pt; 144 font-size: 40pt;
147 color: #ffffff; 145 color: #ffffff;
148 text-shadow: -1px -1px 2px #2e316c, 1px 1px 1px #454aa1; 146 text-shadow: -1px -1px 2px #2e316c, 1px 1px 1px #454aa1;
149} 147}
150div#loading div h3 { 148div#loading div h3 {
151 font-size: 18pt; 149 font-size: 18pt;
152 text-shadow: -1px -1px 1px #2e316c, 1px 1px 1px #454aa1; 150 text-shadow: -1px -1px 1px #2e316c, 1px 1px 1px #454aa1;
153 color: #1f2148; 151 color: #1f2148;
154} 152}
155div#loading div h5 { 153div#loading div h5 {
156 padding-left: 20px; 154 padding-left: 20px;
157 color: #ff9200; 155 color: #ff9200;
158} 156}
159/* 157/*
160 158
161Color list: 159Color list:
162- login box: 160- login box:
163 light#ff9955 161 light#ff9955
164 dark#ff6622 162 dark#ff6622
165- login button: 163- login button:
166 regular#dd5500 164 regular#dd5500
167 hover#773311 165 hover#773311
168- login translations: 166- login translations:
169 box: #cc6622; 167 box: #cc6622;
170 not-selected: 168 not-selected:
171 color: #ddaa99 169 color: #ddaa99
172 background:#994422 170 background:#994422
173 selected: #772211; 171 selected: #772211;
174*/ 172*/
175html { 173html {
176 height: 100%; 174 height: 100%;
177} 175}
178body { 176body {
179 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 177 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
180 margin: 0px; 178 margin: 0px;
181} 179}
182div.modalDialogMask.userInfoBoxMask { 180div.modalDialogMask.userInfoBoxMask {
183 -moz-opacity: 0.0; 181 -moz-opacity: 0.0;
184 opacity: .0; 182 opacity: .0;
185 filter: alpha(opacity=0); 183 filter: alpha(opacity=0);
186 z-index: 19000; 184 z-index: 19000;
187} 185}
188.reset-margin { 186.reset-margin {
189 margin: 0px; 187 margin: 0px;
190 padding: 0px; 188 padding: 0px;
191 border: 0px; 189 border: 0px;
192} 190}
193.clear { 191.clear {
194 clear: both; 192 clear: both;
195} 193}
196.hidden_none { 194.hidden_none {
197 display: none; 195 display: none;
198 visibility: hidden; 196 visibility: hidden;
199} 197}
200.keepTogether { 198.keepTogether {
201 display: inline-block; 199 display: inline-block;
202 white-space: nowrap; 200 white-space: nowrap;
203} 201}
204#mainDiv { 202#mainDiv {
205 margin: 0 auto; 203 margin: 0 auto;
206} 204}
207div.tooltip { 205div.tooltip {
208 position: absolute; 206 position: absolute;
209 z-index: 30001; 207 z-index: 30001;
210} 208}
211div.tooltip div.tooltip_body { 209div.tooltip div.tooltip_body {
212 border-radius: 8px; 210 border-radius: 8px;
213 -moz-border-radius: 8px; 211 -moz-border-radius: 8px;
214 -webkit-border-radius: 8px; 212 -webkit-border-radius: 8px;
215 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555)); 213 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbbbbb), to(#555555));
216 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb); 214 background: -moz-linear-gradient(0% 100% 90deg, #555555, #bbbbbb);
215 background: linear-gradient(0deg, #555555, #bbbbbb);
217 -webkit-box-shadow: 4px 4px 10px #333333; 216 -webkit-box-shadow: 4px 4px 10px #333333;
218 -moz-box-shadow: 4px 4px 10px #333333; 217 -moz-box-shadow: 4px 4px 10px #333333;
219 box-shadow: 4px 4px 10px #333333; 218 box-shadow: 4px 4px 10px #333333;
220 border-top: 1px solid #d4d4d4; 219 border-top: 1px solid #d4d4d4;
221 border-left: 1px solid #a2a2a2; 220 border-left: 1px solid #a2a2a2;
222 border-right: 1px solid #6f6f6f; 221 border-right: 1px solid #6f6f6f;
223 border-bottom: 1px solid #3c3c3c; 222 border-bottom: 1px solid #3c3c3c;
224} 223}
225div.tooltip div.tooltip_body span { 224div.tooltip div.tooltip_body span {
226 display: block; 225 display: block;
227 padding: 10px; 226 padding: 10px;
228 font-size: 10pt; 227 font-size: 10pt;
229 color: white; 228 color: white;
230} 229}
231div.tooltip div.tooltip_body div.tooltip_text { 230div.tooltip div.tooltip_body div.tooltip_text {
232 width: 200px; 231 width: 200px;
233} 232}
234div.tooltip div.tooltip_arrow { 233div.tooltip div.tooltip_arrow {
235 position: absolute; 234 position: absolute;
236 width: 0; 235 width: 0;
237 height: 0; 236 height: 0;
238 border: 6px solid transparent; 237 border: 6px solid transparent;
239} 238}
240div.tooltip.BELOW div.tooltip_arrow { 239div.tooltip.BELOW div.tooltip_arrow {
241 top: -12px; 240 top: -12px;
242 left: 97px; 241 left: 97px;
243 border-bottom: 6px solid #bbbbbb; 242 border-bottom: 6px solid #bbbbbb;
244} 243}
245div.tooltip.ABOVE div.tooltip_arrow { 244div.tooltip.ABOVE div.tooltip_arrow {
246 position: static; 245 position: static;
247 margin-left: 97px; 246 margin-left: 97px;
248 border-top: 6px solid #555555; 247 border-top: 6px solid #555555;
249} 248}
250div.tooltip.LEFT div.tooltip_arrow { 249div.tooltip.LEFT div.tooltip_arrow {
251 left: 203px; 250 left: 203px;
252 top: 10px; 251 top: 10px;
253 border-left: 6px solid #747474; 252 border-left: 6px solid #747474;
254} 253}
255div.tooltip.LEFT div.tooltip_body div.tooltip_text { 254div.tooltip.LEFT div.tooltip_body div.tooltip_text {
256 min-height: 45px; 255 min-height: 45px;
257} 256}
258div.tooltip.RIGHT div.tooltip_arrow { 257div.tooltip.RIGHT div.tooltip_arrow {
259 left: -12px; 258 left: -12px;
260 top: 10px; 259 top: 10px;
261 border-right: 6px solid #9c9c9c; 260 border-right: 6px solid #9c9c9c;
262} 261}
263div.tooltip.RIGHT div.tooltip_body div.tooltip_text { 262div.tooltip.RIGHT div.tooltip_body div.tooltip_text {
264 min-height: 45px; 263 min-height: 45px;
265} 264}
266.button.default { 265.button.default {
267 display: inline-block; 266 display: inline-block;
268 height: 20px; 267 height: 20px;
269 cursor: pointer; 268 cursor: pointer;
270 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffa76f), to(#ff6622)); 269 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffa76f), to(#ff6622));
271 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffa76f); 270 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffa76f);
271 background: linear-gradient(0deg, #ff6622, #ffa76f);
272 border-radius: 5; 272 border-radius: 5;
273 -moz-border-radius: 5; 273 -moz-border-radius: 5;
274 -webkit-border-radius: 5; 274 -webkit-border-radius: 5;
275 border: 1px solid #ff7f46; 275 border: 1px solid #ff7f46;
276 padding-top: 4px; 276 padding-top: 4px;
277 padding-left: 15px; 277 padding-left: 15px;
278 padding-right: 15px; 278 padding-right: 15px;
279 padding-bottom: 2px; 279 padding-bottom: 2px;
280 color: white; 280 color: white;
281 font-weight: lighter; 281 font-weight: lighter;
282 text-shadow: -1px -1px 1px #ff6622, 1px 1px 1px #ffa76f; 282 text-shadow: -1px -1px 1px #ff6622, 1px 1px 1px #ffa76f;
283 text-decoration: none; 283 text-decoration: none;
284 font-weight: normal; 284 font-weight: normal;
285} 285}
286.button.default:hover { 286.button.default:hover {
287 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff8e46), to(#ff6622)); 287 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff8e46), to(#ff6622));
288 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff8e46); 288 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff8e46);
289 background: linear-gradient(0deg, #ff6622, #ff8e46);
289} 290}
290.button { 291.button {
291 display: inline-block; 292 display: inline-block;
292 height: 20px; 293 height: 20px;
293 cursor: pointer; 294 cursor: pointer;
294 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bfbfbf), to(#999999)); 295 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bfbfbf), to(#999999));
295 background: -moz-linear-gradient(0% 100% 90deg, #999999, #bfbfbf); 296 background: -moz-linear-gradient(0% 100% 90deg, #999999, #bfbfbf);
297 background: linear-gradient(0deg, #999999, #bfbfbf);
296 border-radius: 5; 298 border-radius: 5;
297 -moz-border-radius: 5; 299 -moz-border-radius: 5;
298 -webkit-border-radius: 5; 300 -webkit-border-radius: 5;
299 border: 1px solid #ababab; 301 border: 1px solid #ababab;
300 padding-top: 4px; 302 padding-top: 4px;
301 padding-left: 15px; 303 padding-left: 15px;
302 padding-right: 15px; 304 padding-right: 15px;
303 padding-bottom: 2px; 305 padding-bottom: 2px;
304 color: white; 306 color: white;
305 font-weight: lighter; 307 font-weight: lighter;
306 text-shadow: -1px -1px 1px #999999, 1px 1px 1px #bfbfbf; 308 text-shadow: -1px -1px 1px #999999, 1px 1px 1px #bfbfbf;
307 text-decoration: none; 309 text-decoration: none;
308} 310}
309.button:hover { 311.button:hover {
310 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ababab), to(#999999)); 312 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ababab), to(#999999));
311 background: -moz-linear-gradient(0% 100% 90deg, #999999, #ababab); 313 background: -moz-linear-gradient(0% 100% 90deg, #999999, #ababab);
314 background: linear-gradient(0deg, #999999, #ababab);
312} 315}
313/* 316/*
314 317
315Color list: 318Color list:
316- login box: 319- login box:
317 light#ff9955 320 light#ff9955
318 dark#ff6622 321 dark#ff6622
319- login button: 322- login button:
320 regular#dd5500 323 regular#dd5500
321 hover#773311 324 hover#773311
322- login translations: 325- login translations:
323 box: #cc6622; 326 box: #cc6622;
324 not-selected: 327 not-selected:
325 color: #ddaa99 328 color: #ddaa99
326 background:#994422 329 background:#994422
327 selected: #772211; 330 selected: #772211;
328*/ 331*/
329html { 332html {
330 height: 100%; 333 height: 100%;
331} 334}
332body { 335body {
333 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 336 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
334 margin: 0px; 337 margin: 0px;
335} 338}
336div.modalDialogMask.userInfoBoxMask { 339div.modalDialogMask.userInfoBoxMask {
337 -moz-opacity: 0.0; 340 -moz-opacity: 0.0;
338 opacity: .0; 341 opacity: .0;
339 filter: alpha(opacity=0); 342 filter: alpha(opacity=0);
340 z-index: 19000; 343 z-index: 19000;
341} 344}
342.reset-margin { 345.reset-margin {
343 margin: 0px; 346 margin: 0px;
344 padding: 0px; 347 padding: 0px;
345 border: 0px; 348 border: 0px;
346} 349}
347.clear { 350.clear {
348 clear: both; 351 clear: both;
349} 352}
350.hidden_none { 353.hidden_none {
351 display: none; 354 display: none;
352 visibility: hidden; 355 visibility: hidden;
353} 356}
354.keepTogether { 357.keepTogether {
355 display: inline-block; 358 display: inline-block;
356 white-space: nowrap; 359 white-space: nowrap;
357} 360}
358#mainDiv { 361#mainDiv {
359 margin: 0 auto; 362 margin: 0 auto;
360} 363}
361div.pageHeaderAndBody { 364div.pageHeaderAndBody {
362 height: 100%; 365 height: 100%;
363} 366}
364div.pageHeaderAndBody div#pageBody { 367div.pageHeaderAndBody div#pageBody {
365 min-width: 1013px; 368 min-width: 1013px;
366 padding-bottom: 90px; 369 padding-bottom: 90px;
367} 370}
368div.pageHeaderAndBody div.pageHeader { 371div.pageHeaderAndBody div.pageHeader {
369 background-color: #1f2148; 372 background-color: #1f2148;
370 min-width: 1013px; 373 min-width: 1013px;
371} 374}
372div.pageHeaderAndBody div.pageHeader div#miscLinks { 375div.pageHeaderAndBody div.pageHeader div#miscLinks {
373 float: right; 376 float: right;
374} 377}
375div.pageHeaderAndBody div.pageHeader div#miscLinks ul { 378div.pageHeaderAndBody div.pageHeader div#miscLinks ul {
376 margin: 12px 0px 0px; 379 margin: 12px 0px 0px;
377 padding: 15px; 380 padding: 15px;
378} 381}
379div.pageHeaderAndBody div.pageHeader div#miscLinks ul li { 382div.pageHeaderAndBody div.pageHeader div#miscLinks ul li {
380 display: inline; 383 display: inline;
381 margin: 0px; 384 margin: 0px;
382 padding: 0px; 385 padding: 0px;
383 border: 0px; 386 border: 0px;
384} 387}
385div.pageHeaderAndBody div.pageHeader div#miscLinks ul li a { 388div.pageHeaderAndBody div.pageHeader div#miscLinks ul li a {
386 color: #ffffff; 389 color: #ffffff;
387 margin: 0px; 390 margin: 0px;
388 padding: 0px; 391 padding: 0px;
389 border: 0px; 392 border: 0px;
390 padding: 15px; 393 padding: 15px;
391 border-left: 1px solid #3e428f; 394 border-left: 1px solid #3e428f;
392 font-weight: normal; 395 font-weight: normal;
393 text-decoration: none; 396 text-decoration: none;
394 font-size: 12pt; 397 font-size: 12pt;
395 min-width: 70px; 398 min-width: 70px;
396} 399}
397div.pageHeaderAndBody div.pageHeader div#miscLinks ul li a:hover { 400div.pageHeaderAndBody div.pageHeader div#miscLinks ul li a:hover {
398 color: #b8bae1; 401 color: #b8bae1;
399} 402}
400div.pageHeaderAndBody div.pageHeader div#miscLinks ul li a#donateHeaderLink { 403div.pageHeaderAndBody div.pageHeader div#miscLinks ul li a#donateHeaderLink {
401 border-left: 0px; 404 border-left: 0px;
402} 405}
403div.pageHeaderAndBody div.pageHeader div#logoFrame { 406div.pageHeaderAndBody div.pageHeader div#logoFrame {
404 padding: 16px 16px 60px 16px; 407 padding: 16px 16px 60px 16px;
405 min-height: 44px; 408 min-height: 44px;
406} 409}
407div.pageHeaderAndBody div.pageHeader div#logoFrame a { 410div.pageHeaderAndBody div.pageHeader div#logoFrame a {
408 color: white; 411 color: white;
409 text-decoration: none; 412 text-decoration: none;
410} 413}
411div.pageHeaderAndBody div.pageHeader div#logoFrame a canvas { 414div.pageHeaderAndBody div.pageHeader div#logoFrame a canvas {
412 margin: 0px; 415 margin: 0px;
413 padding: 0px; 416 padding: 0px;
414 border: 0px; 417 border: 0px;
415 width: 150px; 418 width: 150px;
416 height: 39px; 419 height: 39px;
417} 420}
418div.pageHeaderAndBody div.pageHeader div#logoFrame a h5.clipperzPayoff { 421div.pageHeaderAndBody div.pageHeader div#logoFrame a h5.clipperzPayoff {
419 font-size: 13pt; 422 font-size: 13pt;
420 font-weight: normal; 423 font-weight: normal;
421 white-space: nowrap; 424 white-space: nowrap;
422 margin: 0px; 425 margin: 0px;
423 padding-left: 4px; 426 padding-left: 4px;
424} 427}
425div.pageHeaderAndBody div.pageHeader div#featureTabs table { 428div.pageHeaderAndBody div.pageHeader div#featureTabs table {
426 width: 100%; 429 width: 100%;
427 padding: 6px; 430 padding: 6px;
428 padding-left: 15px; 431 padding-left: 15px;
429 padding-right: 15px; 432 padding-right: 15px;
430 padding-bottom: 46px; 433 padding-bottom: 46px;
431} 434}
432div.pageHeaderAndBody div.pageHeader div#featureTabs table tr td { 435div.pageHeaderAndBody div.pageHeader div#featureTabs table tr td {
433 width: 25%; 436 width: 25%;
434 vertical-align: top; 437 vertical-align: top;
435 font-size: 11pt; 438 font-size: 11pt;
436 color: white; 439 color: white;
437} 440}
438div.pageHeaderAndBody div.pageHeader div#featureTabs table tr td img { 441div.pageHeaderAndBody div.pageHeader div#featureTabs table tr td img {
439 float: left; 442 float: left;
440} 443}
441div.pageHeaderAndBody div.pageHeader div#featureTabs table tr td span { 444div.pageHeaderAndBody div.pageHeader div#featureTabs table tr td span {
442 display: block; 445 display: block;
443 padding: 5 10 5 85; 446 padding: 5 10 5 85;
444} 447}
445div.pageHeaderAndBody div.pageHeader div#featureTabs canvas.featureIcon { 448div.pageHeaderAndBody div.pageHeader div#featureTabs canvas.featureIcon {
446 width: 76px; 449 width: 76px;
447 height: 76px; 450 height: 76px;
448 display: block; 451 display: block;
449 float: left; 452 float: left;
450 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622)); 453 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ffad79), to(#ff6622));
451 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79); 454 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ffad79);
455 background: linear-gradient(0deg, #ff6622, #ffad79);
452 border-radius: 38px; 456 border-radius: 38px;
453 -moz-border-radius: 38px; 457 -moz-border-radius: 38px;
454 -webkit-border-radius: 38px; 458 -webkit-border-radius: 38px;
455} 459}
456div.pageHeaderAndBody div.pageHeader div#news { 460div.pageHeaderAndBody div.pageHeader div#news {
457 top: -82px; 461 top: -82px;
458 left: 240px; 462 left: 240px;
459 width: 310px; 463 width: 310px;
460 height: 90px; 464 height: 90px;
461 position: absolute; 465 position: absolute;
462 background-color: #616475; 466 background-color: #616475;
463 -webkit-border-bottom-left-radius: 8px; 467 -webkit-border-bottom-left-radius: 8px;
464 -moz-border-radius-bottomleft: 8px; 468 -moz-border-radius-bottomleft: 8px;
465 border-bottom-left-radius: 8px; 469 border-bottom-left-radius: 8px;
466 -webkit-border-bottom-right-radius: 8px; 470 -webkit-border-bottom-right-radius: 8px;
467 -moz-border-radius-bottomright: 8px; 471 -moz-border-radius-bottomright: 8px;
468 border-bottom-right-radius: 8px; 472 border-bottom-right-radius: 8px;
469 -webkit-box-shadow: 2px 2px 9px #333333; 473 -webkit-box-shadow: 2px 2px 9px #333333;
470 -moz-box-shadow: 2px 2px 9px #333333; 474 -moz-box-shadow: 2px 2px 9px #333333;
471 box-shadow: 2px 2px 9px #333333; 475 box-shadow: 2px 2px 9px #333333;
472} 476}
473div.pageHeaderAndBody div.pageHeader div#news div#newsframe { 477div.pageHeaderAndBody div.pageHeader div#news div#newsframe {
474 margin-left: 10px; 478 margin-left: 10px;
475 margin-right: 10px; 479 margin-right: 10px;
476 height: 75px; 480 height: 75px;
477 overflow: hidden; 481 overflow: hidden;
478} 482}
479div.pageHeaderAndBody div.pageHeader div#news div#newsframe iframe { 483div.pageHeaderAndBody div.pageHeader div#news div#newsframe iframe {
480 width: 290px; 484 width: 290px;
481 border: 0px; 485 border: 0px;
482 color: #616475; 486 color: #616475;
483 background-color: #616475; 487 background-color: #616475;
484} 488}
485div.pageHeaderAndBody div.pageHeader div#news div.grip { 489div.pageHeaderAndBody div.pageHeader div#news div.grip {
486 width: 310px; 490 width: 310px;
487 height: 6px; 491 height: 6px;
488 margin-top: 2px; 492 margin-top: 2px;
489 cursor: pointer; 493 cursor: pointer;
490} 494}
491div.pageHeaderAndBody div.pageHeader div#news div.grip div.gripHandler { 495div.pageHeaderAndBody div.pageHeader div#news div.grip div.gripHandler {
492 margin-left: auto; 496 margin-left: auto;
493 margin-right: auto; 497 margin-right: auto;
494 margin-top: 8px; 498 margin-top: 8px;
495 width: 0; 499 width: 0;
496 height: 0; 500 height: 0;
497 border-left: 5px solid transparent; 501 border-left: 5px solid transparent;
498 border-right: 5px solid transparent; 502 border-right: 5px solid transparent;
499} 503}
500div.pageHeaderAndBody div.pageHeader div#news.open div.grip div.gripHandler { 504div.pageHeaderAndBody div.pageHeader div#news.open div.grip div.gripHandler {
501 border-bottom: 5px solid #e9e9ec; 505 border-bottom: 5px solid #e9e9ec;
502} 506}
503div.pageHeaderAndBody div.pageHeader div#news.hidden div.grip div.gripHandler { 507div.pageHeaderAndBody div.pageHeader div#news.hidden div.grip div.gripHandler {
504 border-top: 5px solid #e9e9ec; 508 border-top: 5px solid #e9e9ec;
505} 509}
506div.pageFooter { 510div.pageFooter {
507 margin-top: -90px; 511 margin-top: -90px;
508 height: 90px; 512 height: 90px;
509 clear: both; 513 clear: both;
510} 514}
511div.pageFooter div.footerWrapper { 515div.pageFooter div.footerWrapper {
512 clear: both; 516 clear: both;
513 padding-top: 10px; 517 padding-top: 10px;
514} 518}
515div.pageFooter div.footerWrapper div.footerContent { 519div.pageFooter div.footerWrapper div.footerContent {
516 background-color: #eaebe6; 520 background-color: #eaebe6;
517 padding: 20px; 521 padding: 20px;
518 font-size: 8pt; 522 font-size: 8pt;
519} 523}
520div.pageFooter div.footerWrapper div.footerContent canvas.footerStarIcon { 524div.pageFooter div.footerWrapper div.footerContent canvas.footerStarIcon {
521 width: 40px; 525 width: 40px;
522 height: 40px; 526 height: 40px;
523 float: left; 527 float: left;
524} 528}
525div.pageFooter div.footerWrapper div.footerContent span.copyright { 529div.pageFooter div.footerWrapper div.footerContent span.copyright {
526 padding-left: 10px; 530 padding-left: 10px;
527 color: #a0a0a0; 531 color: #a0a0a0;
528} 532}
529div.pageFooter div.footerWrapper div.footerContent a { 533div.pageFooter div.footerWrapper div.footerContent a {
530 padding-left: 50px; 534 padding-left: 50px;
531 display: block; 535 display: block;
532 color: #888888; 536 color: #888888;
533 font-weight: bold; 537 font-weight: bold;
534 text-decoration: none; 538 text-decoration: none;
535} 539}
536div.pageFooter div.footerWrapper div.footerContent div.applicationVersion { 540div.pageFooter div.footerWrapper div.footerContent div.applicationVersion {
537 padding: 8px; 541 padding: 8px;
538 color: #888888; 542 color: #888888;
539 background-color: #d2d2d2; 543 background-color: #d2d2d2;
540 position: relative; 544 position: relative;
541 top: -40px; 545 top: -40px;
542 float: right; 546 float: right;
543} 547}
544div.pageFooter div.footerWrapper div.footerContent div.applicationVersion a { 548div.pageFooter div.footerWrapper div.footerContent div.applicationVersion a {
545 padding-left: 0px; 549 padding-left: 0px;
546 display: inline; 550 display: inline;
547} 551}
548/* 552/*
549 553
550Color list: 554Color list:
551- login box: 555- login box:
552 light#ff9955 556 light#ff9955
553 dark#ff6622 557 dark#ff6622
554- login button: 558- login button:
555 regular#dd5500 559 regular#dd5500
556 hover#773311 560 hover#773311
557- login translations: 561- login translations:
558 box: #cc6622; 562 box: #cc6622;
559 not-selected: 563 not-selected:
560 color: #ddaa99 564 color: #ddaa99
561 background:#994422 565 background:#994422
562 selected: #772211; 566 selected: #772211;
563*/ 567*/
564html { 568html {
565 height: 100%; 569 height: 100%;
566} 570}
567body { 571body {
568 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 572 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
569 margin: 0px; 573 margin: 0px;
570} 574}
571div.modalDialogMask.userInfoBoxMask { 575div.modalDialogMask.userInfoBoxMask {
572 -moz-opacity: 0.0; 576 -moz-opacity: 0.0;
573 opacity: .0; 577 opacity: .0;
574 filter: alpha(opacity=0); 578 filter: alpha(opacity=0);
575 z-index: 19000; 579 z-index: 19000;
576} 580}
577.reset-margin { 581.reset-margin {
578 margin: 0px; 582 margin: 0px;
579 padding: 0px; 583 padding: 0px;
580 border: 0px; 584 border: 0px;
581} 585}
582.clear { 586.clear {
583 clear: both; 587 clear: both;
584} 588}
585.hidden_none { 589.hidden_none {
586 display: none; 590 display: none;
587 visibility: hidden; 591 visibility: hidden;
588} 592}
589.keepTogether { 593.keepTogether {
590 display: inline-block; 594 display: inline-block;
591 white-space: nowrap; 595 white-space: nowrap;
592} 596}
593#mainDiv { 597#mainDiv {
594 margin: 0 auto; 598 margin: 0 auto;
595} 599}
596div#loginBox { 600div#loginBox {
597 width: 273px; 601 width: 273px;
598 z-index: 19000; 602 z-index: 19000;
599 top: -30px; 603 top: -30px;
600 right: 30px; 604 right: 30px;
601 position: relative; 605 position: relative;
602 float: right; 606 float: right;
603} 607}
604div#loginBox div.header { 608div#loginBox div.header {
605 height: 25px; 609 height: 25px;
606 width: 273px; 610 width: 273px;
607 background-color: #ff9b5a; 611 background-color: #ff9b5a;
608 -webkit-border-top-left-radius: 20px; 612 -webkit-border-top-left-radius: 20px;
609 -moz-border-radius-topleft: 20px; 613 -moz-border-radius-topleft: 20px;
610 border-top-left-radius: 20px; 614 border-top-left-radius: 20px;
611 -webkit-border-top-right-radius: 20px; 615 -webkit-border-top-right-radius: 20px;
612 -moz-border-radius-topright: 20px; 616 -moz-border-radius-topright: 20px;
613 border-top-right-radius: 20px; 617 border-top-right-radius: 20px;
614} 618}
615div#loginBox div.body { 619div#loginBox div.body {
616 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622)); 620 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
617 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a); 621 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a);
622 background: linear-gradient(0deg, #ff6622, #ff9b5a);
618} 623}
619div#loginBox div.body h4 { 624div#loginBox div.body h4 {
620 color: #ffffff; 625 color: #ffffff;
621 font-size: 16pt; 626 font-size: 16pt;
622 font-weight: normal; 627 font-weight: normal;
623 padding-left: 20px; 628 padding-left: 20px;
624 margin: 0px; 629 margin: 0px;
625} 630}
626div#loginBox div.body form.loginForm { 631div#loginBox div.body form.loginForm {
627 padding: 5px 20px 0px; 632 padding: 5px 20px 0px;
628 margin-bottom: 0px; 633 margin-bottom: 0px;
629} 634}
630div#loginBox div.body form.loginForm label { 635div#loginBox div.body form.loginForm label {
631 color: #ffffff; 636 color: #ffffff;
632 font-size: 10pt; 637 font-size: 10pt;
633 display: block; 638 display: block;
634 padding-top: 5px; 639 padding-top: 5px;
635} 640}
636div#loginBox div.body form.loginForm label.checkbox { 641div#loginBox div.body form.loginForm label.checkbox {
637 display: inline; 642 display: inline;
638} 643}
639div#loginBox div.body form.loginForm input { 644div#loginBox div.body form.loginForm input {
640 width: 230px; 645 width: 230px;
641 font-size: 14pt; 646 font-size: 14pt;
642 color: #333366; 647 color: #333366;
643 background-color: #ffffff; 648 background-color: #ffffff;
644 border: 1px solid #bb4924; 649 border: 1px solid #bb4924;
645 padding: 2px 5px; 650 padding: 2px 5px;
646 height: 28px; 651 height: 28px;
647} 652}
648div#loginBox div.body form.loginForm input.checkbox { 653div#loginBox div.body form.loginForm input.checkbox {
649 margin: 10px 8px 0px 0px; 654 margin: 10px 8px 0px 0px;
650 height: auto; 655 height: auto;
651 width: auto; 656 width: auto;
652 border: 0px; 657 border: 0px;
653} 658}
654div#loginBox div.body form.loginForm input.checkbox:hover { 659div#loginBox div.body form.loginForm input.checkbox:hover {
655 cursor: pointer; 660 cursor: pointer;
656} 661}
657div#loginBox div.body form.loginForm input.otp { 662div#loginBox div.body form.loginForm input.otp {
658 width: 57px; 663 width: 57px;
659 display: inline; 664 display: inline;
660 padding-left: 0px; 665 padding-left: 0px;
661 padding-right: 0px; 666 padding-right: 0px;
662 height: 28px; 667 height: 28px;
663 font: 8pt monospace; 668 font: 8pt monospace;
664} 669}
665div#loginBox div.body form.loginForm input.submit { 670div#loginBox div.body form.loginForm input.submit {
666 margin: 0px 45px; 671 margin: 0px 45px;
667 width: 140px; 672 width: 140px;
668 color: #ffffff; 673 color: #ffffff;
669 background-color: #d44100; 674 background-color: #d44100;
670 border: 1px solid #bb4924; 675 border: 1px solid #bb4924;
671 padding: 6px; 676 padding: 6px;
672 font-size: 12pt; 677 font-size: 12pt;
673 height: auto; 678 height: auto;
674} 679}
675div#loginBox div.body form.loginForm input.submit:hover { 680div#loginBox div.body form.loginForm input.submit:hover {
676 color: #ffffff; 681 color: #ffffff;
677 background-color: #7e2700; 682 background-color: #7e2700;
678 cursor: pointer; 683 cursor: pointer;
679} 684}
680div#loginBox div.body form.loginForm ul { 685div#loginBox div.body form.loginForm ul {
681 list-style-type: none; 686 list-style-type: none;
682 padding: 0px; 687 padding: 0px;
683 margin: 0px; 688 margin: 0px;
684} 689}
685div#loginBox div.body form.loginForm ul li { 690div#loginBox div.body form.loginForm ul li {
686 display: block; 691 display: block;
687} 692}
688div#loginBox div.body form.loginForm div.translations { 693div#loginBox div.body form.loginForm div.translations {
689 margin: 15px -20px; 694 margin: 15px -20px;
690 background-color: #c87b59; 695 background-color: #c87b59;
691} 696}
692div#loginBox div.body form.loginForm div.translations h4 { 697div#loginBox div.body form.loginForm div.translations h4 {
693 font-size: 9pt; 698 font-size: 9pt;
694 padding: 6px 20px 0px; 699 padding: 6px 20px 0px;
695} 700}
696div#loginBox div.body form.loginForm div.translations ul { 701div#loginBox div.body form.loginForm div.translations ul {
697 margin: 0px; 702 margin: 0px;
698 padding: 5px 10px 10px; 703 padding: 5px 10px 10px;
699 margin-bottom: 15px; 704 margin-bottom: 15px;
700} 705}
701div#loginBox div.body form.loginForm div.translations ul li { 706div#loginBox div.body form.loginForm div.translations ul li {
702 font-size: 8pt; 707 font-size: 8pt;
703 color: #ddaa99; 708 color: #ddaa99;
704 background-color: #994422; 709 background-color: #994422;
705 display: inline-block; 710 display: inline-block;
706 padding: 2px 4px; 711 padding: 2px 4px;
707 margin: 1px; 712 margin: 1px;
708} 713}
709div#loginBox div.body form.loginForm div.translations ul li.selected { 714div#loginBox div.body form.loginForm div.translations ul li.selected {
710 color: #ffffff; 715 color: #ffffff;
711 background-color: #772211; 716 background-color: #772211;
712} 717}
713div#loginBox div.body form.loginForm div.translations ul li.selected:hover { 718div#loginBox div.body form.loginForm div.translations ul li.selected:hover {
@@ -799,192 +804,193 @@ div.activeFeatures div.keepTogether canvas {
799} 804}
800div.activeFeatures div.createAccountLink { 805div.activeFeatures div.createAccountLink {
801 display: inline-block; 806 display: inline-block;
802 width: 282; 807 width: 282;
803 height: 65px; 808 height: 65px;
804 background-image: url(./images/old/home/register.png); 809 background-image: url(./images/old/home/register.png);
805 margin-right: 20px; 810 margin-right: 20px;
806} 811}
807div.activeFeatures div.createAccountLink a.createAccountLink { 812div.activeFeatures div.createAccountLink a.createAccountLink {
808 position: relative; 813 position: relative;
809 top: -92px; 814 top: -92px;
810 left: 5px; 815 left: 5px;
811} 816}
812div.activeFeatures div.createAccountLink a.createAccountLink span.payoff { 817div.activeFeatures div.createAccountLink a.createAccountLink span.payoff {
813 margin-top: 23px; 818 margin-top: 23px;
814 margin-left: 40px; 819 margin-left: 40px;
815 font-size: 17pt; 820 font-size: 17pt;
816 color: #64626c; 821 color: #64626c;
817} 822}
818div.activeFeatures div.createAccountLink a.createAccountLink span.link { 823div.activeFeatures div.createAccountLink a.createAccountLink span.link {
819 padding-left: 40px; 824 padding-left: 40px;
820 padding-right: 50px; 825 padding-right: 50px;
821 padding-bottom: 10px; 826 padding-bottom: 10px;
822 font-size: 12pt; 827 font-size: 12pt;
823} 828}
824div.activeFeatures div.createAccountLink:hover { 829div.activeFeatures div.createAccountLink:hover {
825 background-image: url(./images/old/home/register_selected.png); 830 background-image: url(./images/old/home/register_selected.png);
826} 831}
827div.activeFeatures div.createAccountLink:hover a.createAccountLink span.payoff { 832div.activeFeatures div.createAccountLink:hover a.createAccountLink span.payoff {
828 color: #54535a; 833 color: #54535a;
829} 834}
830div.activeFeatures div.createAccountLink:hover a.createAccountLink span.link { 835div.activeFeatures div.createAccountLink:hover a.createAccountLink span.link {
831 color: white; 836 color: white;
832} 837}
833div.activeFeatures div.createAccountLink canvas { 838div.activeFeatures div.createAccountLink canvas {
834 width: 282px; 839 width: 282px;
835 height: 93px; 840 height: 93px;
836} 841}
837/* 842/*
838 843
839Color list: 844Color list:
840- login box: 845- login box:
841 light#ff9955 846 light#ff9955
842 dark#ff6622 847 dark#ff6622
843- login button: 848- login button:
844 regular#dd5500 849 regular#dd5500
845 hover#773311 850 hover#773311
846- login translations: 851- login translations:
847 box: #cc6622; 852 box: #cc6622;
848 not-selected: 853 not-selected:
849 color: #ddaa99 854 color: #ddaa99
850 background:#994422 855 background:#994422
851 selected: #772211; 856 selected: #772211;
852*/ 857*/
853html { 858html {
854 height: 100%; 859 height: 100%;
855} 860}
856body { 861body {
857 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif; 862 font-family: Helvetica-Neue, Helvetica, Arial, Geneva, sans-serif;
858 margin: 0px; 863 margin: 0px;
859} 864}
860div.modalDialogMask.userInfoBoxMask { 865div.modalDialogMask.userInfoBoxMask {
861 -moz-opacity: 0.0; 866 -moz-opacity: 0.0;
862 opacity: .0; 867 opacity: .0;
863 filter: alpha(opacity=0); 868 filter: alpha(opacity=0);
864 z-index: 19000; 869 z-index: 19000;
865} 870}
866.reset-margin { 871.reset-margin {
867 margin: 0px; 872 margin: 0px;
868 padding: 0px; 873 padding: 0px;
869 border: 0px; 874 border: 0px;
870} 875}
871.clear { 876.clear {
872 clear: both; 877 clear: both;
873} 878}
874.hidden_none { 879.hidden_none {
875 display: none; 880 display: none;
876 visibility: hidden; 881 visibility: hidden;
877} 882}
878.keepTogether { 883.keepTogether {
879 display: inline-block; 884 display: inline-block;
880 white-space: nowrap; 885 white-space: nowrap;
881} 886}
882#mainDiv { 887#mainDiv {
883 margin: 0 auto; 888 margin: 0 auto;
884} 889}
885div.userInfoBox { 890div.userInfoBox {
886 position: absolute; 891 position: absolute;
887 width: 160px; 892 width: 160px;
888 height: 120px; 893 height: 120px;
889 top: 100px; 894 top: 100px;
890 left: 15px; 895 left: 15px;
891 color: white; 896 color: white;
892 background-color: #ff9955; 897 background-color: #ff9955;
893 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723)); 898 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723));
894 background: -moz-linear-gradient(0% 100% 90deg, #ff6723, #ff9a56); 899 background: -moz-linear-gradient(0% 100% 90deg, #ff6723, #ff9a56);
900 background: linear-gradient(0deg, #ff6723, #ff9a56);
895 border-radius: 10px; 901 border-radius: 10px;
896 -moz-border-radius: 10px; 902 -moz-border-radius: 10px;
897 -webkit-border-radius: 10px; 903 -webkit-border-radius: 10px;
898 -webkit-box-shadow: 2px 2px 9px #333333; 904 -webkit-box-shadow: 2px 2px 9px #333333;
899 -moz-box-shadow: 2px 2px 9px #333333; 905 -moz-box-shadow: 2px 2px 9px #333333;
900 box-shadow: 2px 2px 9px #333333; 906 box-shadow: 2px 2px 9px #333333;
901} 907}
902div.userInfoBox.locked { 908div.userInfoBox.locked {
903 z-index: 19001; 909 z-index: 19001;
904} 910}
905div.userInfoBox.locked div.header a.lockButton { 911div.userInfoBox.locked div.header a.lockButton {
906 background: url(./images/old/lock/locked.png) no-repeat -5px -2px; 912 background: url(./images/old/lock/locked.png) no-repeat -5px -2px;
907} 913}
908div.userInfoBox.locked div.header a.lockButton:hover { 914div.userInfoBox.locked div.header a.lockButton:hover {
909 background: url(./images/old/lock/locked_hover.png) no-repeat -5px -2px; 915 background: url(./images/old/lock/locked_hover.png) no-repeat -5px -2px;
910} 916}
911div.userInfoBox.locked div.body a { 917div.userInfoBox.locked div.body a {
912 display: none; 918 display: none;
913} 919}
914div.userInfoBox div.header { 920div.userInfoBox div.header {
915 height: 30px; 921 height: 30px;
916} 922}
917div.userInfoBox div.header h1 { 923div.userInfoBox div.header h1 {
918 font-size: 8pt; 924 font-size: 8pt;
919 font-weight: normal; 925 font-weight: normal;
920 margin: 0px; 926 margin: 0px;
921 padding-top: 12px; 927 padding-top: 12px;
922 padding-left: 12px; 928 padding-left: 12px;
923} 929}
924div.userInfoBox div.header a.lockButton { 930div.userInfoBox div.header a.lockButton {
925 position: absolute; 931 position: absolute;
926 top: 8px; 932 top: 8px;
927 right: 12px; 933 right: 12px;
928 display: block; 934 display: block;
929 width: 15px; 935 width: 15px;
930 height: 20px; 936 height: 20px;
931 text-decoration: none; 937 text-decoration: none;
932 background: url(./images/old/lock/unlocked.png) no-repeat -5px -2px; 938 background: url(./images/old/lock/unlocked.png) no-repeat -5px -2px;
933} 939}
934div.userInfoBox div.header a.lockButton:hover { 940div.userInfoBox div.header a.lockButton:hover {
935 background: url(./images/old/lock/unlocked_hover.png) no-repeat -5px -2px; 941 background: url(./images/old/lock/unlocked_hover.png) no-repeat -5px -2px;
936} 942}
937div.userInfoBox div.body { 943div.userInfoBox div.body {
938 padding: 0px 12px; 944 padding: 0px 12px;
939} 945}
940div.userInfoBox div.body h3 { 946div.userInfoBox div.body h3 {
941 font-size: 11pt; 947 font-size: 11pt;
942 font-weight: bold; 948 font-weight: bold;
943 margin: 0px; 949 margin: 0px;
944} 950}
945div.userInfoBox div.body ul { 951div.userInfoBox div.body ul {
946 font-size: 8pt; 952 font-size: 8pt;
947 padding: 0px; 953 padding: 0px;
948 margin: 4px 0px; 954 margin: 4px 0px;
949 list-style-position: inside; 955 list-style-position: inside;
950} 956}
951div.userInfoBox div.body ul li span.number { 957div.userInfoBox div.body ul li span.number {
952 font-weight: bold; 958 font-weight: bold;
953 padding-right: 3px; 959 padding-right: 3px;
954} 960}
955div.userInfoBox div.body a { 961div.userInfoBox div.body a {
956 display: block; 962 display: block;
957 margin-top: 8px; 963 margin-top: 8px;
958 border-top: 1px solid white; 964 border-top: 1px solid white;
959 padding-top: 6px; 965 padding-top: 6px;
960 font-size: 10pt; 966 font-size: 10pt;
961 font-weight: bold; 967 font-weight: bold;
962 color: #d15a22; 968 color: #d15a22;
963 border-color: #fe9a5f; 969 border-color: #fe9a5f;
964 text-decoration: none; 970 text-decoration: none;
965} 971}
966div.userInfoBox div.body a:hover { 972div.userInfoBox div.body a:hover {
967 color: #8c3b15; 973 color: #8c3b15;
968} 974}
969div.sidePanels { 975div.sidePanels {
970 float: left; 976 float: left;
971 margin-top: 106px; 977 margin-top: 106px;
972 margin-left: 20px; 978 margin-left: 20px;
973 width: 160px; 979 width: 160px;
974} 980}
975div.sidePanels div.tabSidePanel { 981div.sidePanels div.tabSidePanel {
976 margin-right: -10px; 982 margin-right: -10px;
977} 983}
978div.sidePanels div.tabSidePanel ul { 984div.sidePanels div.tabSidePanel ul {
979 margin: 0px; 985 margin: 0px;
980 padding-left: 0px; 986 padding-left: 0px;
981 list-style-type: none; 987 list-style-type: none;
982 color: #f78b46; 988 color: #f78b46;
983} 989}
984div.sidePanels div.tabSidePanel ul.mainTabs { 990div.sidePanels div.tabSidePanel ul.mainTabs {
985 margin: 0px; 991 margin: 0px;
986} 992}
987div.sidePanels div.tabSidePanel ul.mainTabs li a { 993div.sidePanels div.tabSidePanel ul.mainTabs li a {
988 display: block; 994 display: block;
989 line-height: 30px; 995 line-height: 30px;
990 height: 43px; 996 height: 43px;
@@ -1180,241 +1186,244 @@ div.groupSidePanel {
1180 padding: 0px 4px 0px 15px; 1186 padding: 0px 4px 0px 15px;
1181 line-height: 20px; 1187 line-height: 20px;
1182 } 1188 }
1183 div.groupSidePanel ul.groups li a:hover { 1189 div.groupSidePanel ul.groups li a:hover {
1184 background-color: #aaaaaa; 1190 background-color: #aaaaaa;
1185 } 1191 }
1186 div.groupSidePanel ul.groups li span.groupCardinality { 1192 div.groupSidePanel ul.groups li span.groupCardinality {
1187 float: right; 1193 float: right;
1188 font-size: 8pt; 1194 font-size: 8pt;
1189 color: #dddddd; 1195 color: #dddddd;
1190 margin-right: 15px; 1196 margin-right: 15px;
1191 margin-top: -17px; 1197 margin-top: -17px;
1192 } 1198 }
1193 div.groupSidePanel ul.groups li.selected a { 1199 div.groupSidePanel ul.groups li.selected a {
1194 background-color: #bbbbbb; 1200 background-color: #bbbbbb;
1195 } 1201 }
1196 div.groupSidePanel ul.groups li.selected a:hover { 1202 div.groupSidePanel ul.groups li.selected a:hover {
1197 background-color: #bbbbbb; 1203 background-color: #bbbbbb;
1198 } 1204 }
1199 div.groupSidePanel ul.groups li.selected a { 1205 div.groupSidePanel ul.groups li.selected a {
1200 font-weight: bold; 1206 font-weight: bold;
1201 } 1207 }
1202*/ 1208*/
1203} 1209}
1204div.subPanelTabs ul { 1210div.subPanelTabs ul {
1205 margin: 0px; 1211 margin: 0px;
1206 margin-right: 7px; 1212 margin-right: 7px;
1207 padding: 0px; 1213 padding: 0px;
1208} 1214}
1209div.subPanelTabs ul li { 1215div.subPanelTabs ul li {
1210 display: inline-block; 1216 display: inline-block;
1211 vertical-align: middle; 1217 vertical-align: middle;
1212 height: 50px; 1218 height: 50px;
1213 border-right: 1px solid #eef0e3; 1219 border-right: 1px solid #eef0e3;
1214 border-bottom: 1px solid #d5d5bc; 1220 border-bottom: 1px solid #d5d5bc;
1215} 1221}
1216div.subPanelTabs ul li.first { 1222div.subPanelTabs ul li.first {
1217 -webkit-border-top-left-radius: 20px; 1223 -webkit-border-top-left-radius: 20px;
1218 -moz-border-radius-topleft: 20px; 1224 -moz-border-radius-topleft: 20px;
1219 border-top-left-radius: 20px; 1225 border-top-left-radius: 20px;
1220} 1226}
1221div.subPanelTabs ul li.selected { 1227div.subPanelTabs ul li.selected {
1222 background-color: #eef0e3; 1228 background-color: #eef0e3;
1223 border-bottom: 1px solid #eef0e3; 1229 border-bottom: 1px solid #eef0e3;
1224 border-right: 1px solid #d5d5bc; 1230 border-right: 1px solid #d5d5bc;
1225} 1231}
1226div.subPanelTabs ul li.selected:hover { 1232div.subPanelTabs ul li.selected:hover {
1227 border-right: 1px solid #d5d5bc; 1233 border-right: 1px solid #d5d5bc;
1228} 1234}
1229div.subPanelTabs ul li.selected a { 1235div.subPanelTabs ul li.selected a {
1230 color: #444440; 1236 color: #444440;
1231} 1237}
1232div.subPanelTabs ul li:hover { 1238div.subPanelTabs ul li:hover {
1233 border-right: 1px solid #d5d5bc; 1239 border-right: 1px solid #d5d5bc;
1234 background-color: #eef0e3; 1240 background-color: #eef0e3;
1235} 1241}
1236div.subPanelTabs ul li a { 1242div.subPanelTabs ul li a {
1237 color: #787872; 1243 color: #787872;
1238 text-decoration: none; 1244 text-decoration: none;
1239 display: block; 1245 display: block;
1240 text-align: center; 1246 text-align: center;
1241 padding-top: 15px; 1247 padding-top: 15px;
1242 padding-left: 20px; 1248 padding-left: 20px;
1243 padding-right: 20px; 1249 padding-right: 20px;
1244 font-size: 13pt; 1250 font-size: 13pt;
1245} 1251}
1246div.subPanelContent { 1252div.subPanelContent {
1247 padding-top: 20px; 1253 padding-top: 20px;
1248 padding-left: 30px; 1254 padding-left: 30px;
1249 padding-right: 30px; 1255 padding-right: 30px;
1250 min-height: 280px; 1256 min-height: 280px;
1251 color: #787872; 1257 color: #787872;
1252 margin: 0px 6px 0 9px; 1258 margin: 0px 6px 0 9px;
1253} 1259}
1254div.subPanelContent h3 { 1260div.subPanelContent h3 {
1255 margin: 0px; 1261 margin: 0px;
1256 border: 0px; 1262 border: 0px;
1257 padding: 0px; 1263 padding: 0px;
1258} 1264}
1259div.subPanelContent ul { 1265div.subPanelContent ul {
1260 margin: 0px; 1266 margin: 0px;
1261 padding: 0px; 1267 padding: 0px;
1262 list-style-type: none; 1268 list-style-type: none;
1263} 1269}
1264div.subPanelContent ul li { 1270div.subPanelContent ul li {
1265 display: none; 1271 display: none;
1266} 1272}
1267div.subPanelContent ul li.selected { 1273div.subPanelContent ul li.selected {
1268 display: block; 1274 display: block;
1269} 1275}
1270.downloadOfflineCopy { 1276.downloadOfflineCopy {
1271 display: inline-block; 1277 display: inline-block;
1272 height: 20px; 1278 height: 20px;
1273 cursor: pointer; 1279 cursor: pointer;
1274 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#59bc4c), to(#448833)); 1280 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#59bc4c), to(#448833));
1275 background: -moz-linear-gradient(0% 100% 90deg, #448833, #59bc4c); 1281 background: -moz-linear-gradient(0% 100% 90deg, #448833, #59bc4c);
1282 background: linear-gradient(0deg, #448833, #59bc4c);
1276 border-radius: 5; 1283 border-radius: 5;
1277 -moz-border-radius: 5; 1284 -moz-border-radius: 5;
1278 -webkit-border-radius: 5; 1285 -webkit-border-radius: 5;
1279 border: 1px solid #51a23d; 1286 border: 1px solid #51a23d;
1280 padding-top: 4px; 1287 padding-top: 4px;
1281 padding-left: 15px; 1288 padding-left: 15px;
1282 padding-right: 15px; 1289 padding-right: 15px;
1283 padding-bottom: 2px; 1290 padding-bottom: 2px;
1284 color: white; 1291 color: white;
1285 font-weight: lighter; 1292 font-weight: lighter;
1286 text-shadow: -1px -1px 1px #448833, 1px 1px 1px #59bc4c; 1293 text-shadow: -1px -1px 1px #448833, 1px 1px 1px #59bc4c;
1287 text-decoration: none; 1294 text-decoration: none;
1288} 1295}
1289.downloadOfflineCopy:hover { 1296.downloadOfflineCopy:hover {
1290 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#49a23d), to(#448833)); 1297 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#49a23d), to(#448833));
1291 background: -moz-linear-gradient(0% 100% 90deg, #448833, #49a23d); 1298 background: -moz-linear-gradient(0% 100% 90deg, #448833, #49a23d);
1299 background: linear-gradient(0deg, #448833, #49a23d);
1292} 1300}
1293div.SimpleMessagePanel { 1301div.SimpleMessagePanel {
1294 position: relative; 1302 position: relative;
1295 left: -225px; 1303 left: -225px;
1296 top: -70px; 1304 top: -70px;
1297 width: 450px; 1305 width: 450px;
1298 height: 140px; 1306 height: 140px;
1299} 1307}
1300div.SimpleMessagePanel div.body { 1308div.SimpleMessagePanel div.body {
1301 padding: 20px; 1309 padding: 20px;
1302 padding-bottom: 15px; 1310 padding-bottom: 15px;
1303 background-color: #f1f1ef; 1311 background-color: #f1f1ef;
1304 -webkit-box-shadow: 2px 2px 9px #333333; 1312 -webkit-box-shadow: 2px 2px 9px #333333;
1305 -moz-box-shadow: 2px 2px 9px #333333; 1313 -moz-box-shadow: 2px 2px 9px #333333;
1306 box-shadow: 2px 2px 9px #333333; 1314 box-shadow: 2px 2px 9px #333333;
1307 border-radius: 10; 1315 border-radius: 10;
1308 -moz-border-radius: 10; 1316 -moz-border-radius: 10;
1309 -webkit-border-radius: 10; 1317 -webkit-border-radius: 10;
1310} 1318}
1311div.SimpleMessagePanel div.body h3 { 1319div.SimpleMessagePanel div.body h3 {
1312 font-size: 14pt; 1320 font-size: 14pt;
1313 font-weight: normal; 1321 font-weight: normal;
1314 margin: 0px; 1322 margin: 0px;
1315 padding-top: 4px; 1323 padding-top: 4px;
1316 color: #787872; 1324 color: #787872;
1317} 1325}
1318div.SimpleMessagePanel div.body div.img { 1326div.SimpleMessagePanel div.body div.img {
1319 width: 50px; 1327 width: 50px;
1320 height: 50px; 1328 height: 50px;
1321 float: left; 1329 float: left;
1322 margin-right: 15px; 1330 margin-right: 15px;
1323 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622)); 1331 background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9b5a), to(#ff6622));
1324 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a); 1332 background: -moz-linear-gradient(0% 100% 90deg, #ff6622, #ff9b5a);
1333 background: linear-gradient(0deg, #ff6622, #ff9b5a);
1325 border-radius: 25px; 1334 border-radius: 25px;
1326 -moz-border-radius: 25px; 1335 -moz-border-radius: 25px;
1327 -webkit-border-radius: 25px; 1336 -webkit-border-radius: 25px;
1328} 1337}
1329div.SimpleMessagePanel div.body div.img canvas { 1338div.SimpleMessagePanel div.body div.img canvas {
1330 width: 50px; 1339 width: 50px;
1331 height: 50px; 1340 height: 50px;
1332} 1341}
1333div.SimpleMessagePanel div.body p { 1342div.SimpleMessagePanel div.body p {
1334 margin: 0; 1343 margin: 0;
1335 font-size: 10pt; 1344 font-size: 10pt;
1336 font-weight: normal; 1345 font-weight: normal;
1337 color: #787872; 1346 color: #787872;
1338 padding-top: 10px; 1347 padding-top: 10px;
1339 padding-bottom: 5px; 1348 padding-bottom: 5px;
1340 line-height: 1.3; 1349 line-height: 1.3;
1341} 1350}
1342div.SimpleMessagePanel div.body div.buttonArea { 1351div.SimpleMessagePanel div.body div.buttonArea {
1343 height: 40px; 1352 height: 40px;
1344 clear: both; 1353 clear: both;
1345} 1354}
1346div.SimpleMessagePanel div.body div.buttonArea > div { 1355div.SimpleMessagePanel div.body div.buttonArea > div {
1347 float: right; 1356 float: right;
1348 margin-left: 15px; 1357 margin-left: 15px;
1349 margin-top: 10px; 1358 margin-top: 10px;
1350} 1359}
1351div.SimpleMessagePanel div.passphrase { 1360div.SimpleMessagePanel div.passphrase {
1352 padding-left: 65px; 1361 padding-left: 65px;
1353} 1362}
1354div.SimpleMessagePanel div.passphrase input { 1363div.SimpleMessagePanel div.passphrase input {
1355 width: 250px; 1364 width: 250px;
1356 font-size: 14pt; 1365 font-size: 14pt;
1357 border: 1px solid #bb4924; 1366 border: 1px solid #bb4924;
1358 color: #333366; 1367 color: #333366;
1359 background-color: white; 1368 background-color: white;
1360 padding: 2px 5px; 1369 padding: 2px 5px;
1361 height: 28px; 1370 height: 28px;
1362} 1371}
1363div.SimpleMessagePanel div.progressBarWrapper { 1372div.SimpleMessagePanel div.progressBarWrapper {
1364 margin-left: 80px; 1373 margin-left: 80px;
1365} 1374}
1366/* @end */ 1375/* @end */
1367/* @group Javascript Alert */ 1376/* @group Javascript Alert */
1368div#javaScriptAlert div.mask { 1377div#javaScriptAlert div.mask {
1369 position: fixed; 1378 position: fixed;
1370 top: 0px; 1379 top: 0px;
1371 left: 0px; 1380 left: 0px;
1372 right: 0px; 1381 right: 0px;
1373 bottom: 0px; 1382 bottom: 0px;
1374 background-color: black; 1383 background-color: black;
1375 z-index: 1001; 1384 z-index: 1001;
1376 -moz-opacity: 0.7; 1385 -moz-opacity: 0.7;
1377 opacity: .70; 1386 opacity: .70;
1378 filter: alpha(opacity=70); 1387 filter: alpha(opacity=70);
1379} 1388}
1380div#javaScriptAlert div.header { 1389div#javaScriptAlert div.header {
1381 height: 34px; 1390 height: 34px;
1382 width: 468; 1391 width: 468;
1383 background-image: url(./images/old/alert/header.png); 1392 background-image: url(./images/old/alert/header.png);
1384} 1393}
1385div#javaScriptAlert div.body { 1394div#javaScriptAlert div.body {
1386 background-image: url(./images/old/alert/body.png); 1395 background-image: url(./images/old/alert/body.png);
1387 padding: 0px 20px 10px 20px; 1396 padding: 0px 20px 10px 20px;
1388} 1397}
1389/* 1398/*
1390div#javaScriptAlert div.body div.alert { 1399div#javaScriptAlert div.body div.alert {
1391 padding-left: 100px; 1400 padding-left: 100px;
1392 background: url(./images/old/alert/alert.png) no-repeat; 1401 background: url(./images/old/alert/alert.png) no-repeat;
1393} 1402}
1394*/ 1403*/
1395/*div#javaScriptAlert div.body img.alert {*/ 1404/*div#javaScriptAlert div.body img.alert {*/
1396div#javaScriptAlert div.body div.alertLogo { 1405div#javaScriptAlert div.body div.alertLogo {
1397 float: left; 1406 float: left;
1398 background-image: url(./images/old/alert/alert.png); 1407 background-image: url(./images/old/alert/alert.png);
1399 width: 88px; 1408 width: 88px;
1400 height: 88px; 1409 height: 88px;
1401} 1410}
1402div#javaScriptAlert div.body div.alert { 1411div#javaScriptAlert div.body div.alert {
1403 padding-left: 100px; 1412 padding-left: 100px;
1404} 1413}
1405div#javaScriptAlert div.footer { 1414div#javaScriptAlert div.footer {
1406 height: 34px; 1415 height: 34px;
1407 width: 468; 1416 width: 468;
1408 background-image: url(./images/old/alert/footer.png); 1417 background-image: url(./images/old/alert/footer.png);
1409} 1418}
1410div#javaScriptAlert div.message { 1419div#javaScriptAlert div.message {
1411 position: relative; 1420 position: relative;
1412 top: -150px; 1421 top: -150px;
1413 z-index: 1002; 1422 z-index: 1002;
1414 /* 1423 /*
1415 left: 100px; 1424 left: 100px;
1416 right: 100px; 1425 right: 100px;
1417*/ 1426*/
1418 1427
1419 margin-left: auto; 1428 margin-left: auto;
1420 margin-right: auto; 1429 margin-right: auto;
diff --git a/frontend/gamma/html/mobile_template.html b/frontend/gamma/html/mobile_template.html
index 184fbd9..935fbe5 100644
--- a/frontend/gamma/html/mobile_template.html
+++ b/frontend/gamma/html/mobile_template.html
@@ -1,66 +1,67 @@
1<!doctype html> 1<!DOCTYPE html>
2<!-- Conditional comment for mobile ie7 blogs.msdn.com/b/iemobile/ --> 2<!-- Conditional comment for mobile ie7 blogs.msdn.com/b/iemobile/ -->
3<!--[if IEMobile 7 ]> <html class="no-js iem7" lang="en"> <![endif]--> 3<!--[if IEMobile 7 ]> <html class="no-js iem7" lang="en"> <![endif]-->
4<!--[if (gt IEMobile 7)|!(IEMobile)]><!--> <html class="no-js" lang="en" manifest="mobile.appcache"> <!--<![endif]--> 4<!--[if (gt IEMobile 7)|!(IEMobile)]><!--> <html class="no-js" lang="en" manifest="mobile.appcache"> <!--<![endif]-->
5<head> 5<head>
6 <title>@page.title@</title> 6 <title>@page.title@</title>
7 <meta charset="utf-8"> 7 <meta charset="utf-8">
8 8
9 <meta name="HandheldFriendly" content="True"> 9 <meta name="HandheldFriendly" content="True">
10 <meta name="MobileOptimized" content="320"> 10 <meta name="MobileOptimized" content="320">
11 <meta name="viewport" content="width=device-width"> 11 <!-- meta name="viewport" content="width=device-width" -->
12 <meta name="viewport" content="width=device-width, initial-scale=1.0">
12 13
13<!-- link rel="apple-touch-icon-precomposed" ... --> 14<!-- link rel="apple-touch-icon-precomposed" ... -->
14 <link rel="apple-touch-icon" sizes="114x114" href="data:image/png;charset=utf-8;base64,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"> 15 <link rel="apple-touch-icon" sizes="114x114" href="data:image/png;charset=utf-8;base64,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">
15 <link rel="apple-touch-icon" sizes="72x72" href="data:image/png;charset=utf-8;base64,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"> 16 <link rel="apple-touch-icon" sizes="72x72" href="data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAIAAADajyQQAAAD8GlDQ1BJQ0MgUHJvZmlsZQAAKJGNVd1v21QUP4lvXKQWP6Cxjg4Vi69VU1u5GxqtxgZJk6XpQhq5zdgqpMl1bhpT1za2021Vn/YCbwz4A4CyBx6QeEIaDMT2su0BtElTQRXVJKQ9dNpAaJP2gqpwrq9Tu13GuJGvfznndz7v0TVAx1ea45hJGWDe8l01n5GPn5iWO1YhCc9BJ/RAp6Z7TrpcLgIuxoVH1sNfIcHeNwfa6/9zdVappwMknkJsVz19HvFpgJSpO64PIN5G+fAp30Hc8TziHS4miFhheJbjLMMzHB8POFPqKGKWi6TXtSriJcT9MzH5bAzzHIK1I08t6hq6zHpRdu2aYdJYuk9Q/881bzZa8Xrx6fLmJo/iu4/VXnfH1BB/rmu5ScQvI77m+BkmfxXxvcZcJY14L0DymZp7pML5yTcW61PvIN6JuGr4halQvmjNlCa4bXJ5zj6qhpxrujeKPYMXEd+q00KR5yNAlWZzrF+Ie+uNsdC/MO4tTOZafhbroyXuR3Df08bLiHsQf+ja6gTPWVimZl7l/oUrjl8OcxDWLbNU5D6JRL2gxkDu16fGuC054OMhclsyXTOOFEL+kmMGs4i5kfNuQ62EnBuam8tzP+Q+tSqhz9SuqpZlvR1EfBiOJTSgYMMM7jpYsAEyqJCHDL4dcFFTAwNMlFDUUpQYiadhDmXteeWAw3HEmA2s15k1RmnP4RHuhBybdBOF7MfnICmSQ2SYjIBM3iRvkcMki9IRcnDTthyLz2Ld2fTzPjTQK+Mdg8y5nkZfFO+se9LQr3/09xZr+5GcaSufeAfAww60mAPx+q8u/bAr8rFCLrx7s+vqEkw8qb+p26n11Aruq6m1iJH6PbWGv1VIY25mkNE8PkaQhxfLIF7DZXx80HD/A3l2jLclYs061xNpWCfoB6WHJTjbH0mV35Q/lRXlC+W8cndbl9t2SfhU+Fb4UfhO+F74GWThknBZ+Em4InwjXIyd1ePnY/Psg3pb1TJNu15TMKWMtFt6ScpKL0ivSMXIn9QtDUlj0h7U7N48t3i8eC0GnMC91dX2sTivgloDTgUVeEGHLTizbf5Da9JLhkhh29QOs1luMcScmBXTIIt7xRFxSBxnuJWfuAd1I7jntkyd/pgKaIwVr3MgmDo2q8x6IdB5QH162mcX7ajtnHGN2bov71OU1+U0fqqoXLD0wX5ZM005UHmySz3qLtDqILDvIL+iH6jB9y2x83ok898GOPQX3lk3Itl0A+BrD6D7tUjWh3fis58BXDigN9yF8M5PJH4B8Gr79/F/XRm8m241mw/wvur4BGDj42bzn+Vmc+NL9L8GcMn8F1kAcXjEKMJAAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrlPw1BAAAPZklEQVRoge2aeXAcVX7Hv+9199ySRhrdl3XYGNvY2LLB2OCLw0ZlYwfIbrFU7QJbSyoklWQJqV0I2QuySW2ygTLU7lKV3SQUBSHcXm5zLGCDMb5k2eBLsmTJts7RaEaa6enpfu+XP+bQSNYxM8h/UOVfdbVaM/3e/D79O/r3ft3AJbkkl+SS5CBs1mdUVdVmsxFRRj/PmBDCMIzZV2PWZ7z//vvvvffezLjAGNuz57O77rpr1tWYfbDKysp58+aBDCAdjpLeQWluQmCOnp7zs64DLgaYEBIAwn4wIGW4+AFL52IgCU++FT9/tmX2wZJCIAIoaTZK7ZKfMEAiQ5fNXi4aGIkEGJBGRUmjMQCgbypY3MfSqDDBaDQ+DmdTLj4YpRstGWnxPyS/gWBSgGQyfyTZxpkLgIS8WN54EcASWV2AZMIDJwRbSohAFkkx+zpcFLAEggSJiVSp0GIAMUBCfIPA4kIiLTGmAix1W4vvJaRF9E0BIwnIiWDpVGN4EvKbYzEiCVjjwMbyPo2PsosIxqf6QlGUhx9+eNOmm202W1YzkpSJlCAFyALFIS2QlfZJ/F8LUuQAVlZa/Bd3f+e3j/2zw26f6pwpLbbg8ssfffRRxmj//oPPPvvsyy+/3N3dnREYScgkzFhhlRZsSN3cJKSZOZiiKCtXLL3jti3NN62vrS4XQj793Et797dkB7Zt2zbGGHT/imXzV6z494d+/A9vvPn2M888s/vTzyzLmpZMQiRdMY40eaQBJDK0WGVF2ZZN13/71s0rli50OzUSMTL8XM3bevOG7MA0Tdu27RYIHWAwdMhQaR77/t3f+t6dt3+xv+XZ555/bcfr53t6JudKWMxKxpgcD4a02krQtOle09RVVzXdcfuWjddfV1Pu42RARhTBmaKBqRE9tHH96l8+9lQkomcKtvTKJUsWL6RYJFn9cEgLo36VxOqmuatX/stDP/rh62++++xzz+/Zu0/K8esOmXLF8WATUz8ASdIiOYn9a6oqtjbf8Ofbbl62eL7bRmSFFXOAKxxcBQBpgXHI6Ny6ypVNV/xp975MwW7dttXu0Eg3wBhIJoo6xkAMsTD0QHWBct89t979nT/7fP/h555/+fW33unrH4iPpbgrSgkIECULQprEbheke5tNu3bl8jtu23zT+lVVpflcjDLRp5gAUwAOSWAA42AErthUkLBu2bg2UzCn07G5+SYyIozxhFpx/RI3KALjkCbC/Q6SG66q33DNzzoe+Ksdb73/vy+88sWBQ7GYQXGLQY5dlNQ84ywmSFqWGQNQV1O1tfmG27duXLqwwaXFEAsqeoBxDsZBPPGj4CAC5/EiU1XViD66YXVTQb4nGBqdQDFJM2fdmmt3vvmKyiRXtXhGTgTMuIPUZkGaYArs+SMRfLj7gMvlWrNysV0/zSAmBxvDE4ZSfLhDP3Tkq03rr6kqdnJrmFmjnMkEBmMATx6nNiVxwNVwaNgQ9u/+7SNvfbBnAoVyIdj9f3PftauWA5whXkak9EsaIX4wziAWYiEbhS5vKKuuKDWMmJ1CbJzR5JgNEXdOCRK6pfp8JdcsKilQ/KrZz6XOkPKR1FWQk+QeEABOlmkK05JvXgA20RXz8zwbb1grYoZic4EIXAWpYAJkQjAQgRGgAhxQoAhIC5JAIrEqjoXsckiVBCYTqxJMMFpqkUYAOWmImwFuCYADDAQwCWIAS5gLDOCgpLkgAQWQIAUgVdXIGr52+cISn3fAPzwd2LWrrm6sq4HqBlMQ7cFoB0InED6DyFkYfogoIMFUKE5o+bAXw1EGZyXsxVA94BokgQmFiXEWnjzSCIDKkqk/DhzPT4wB8QOeIGQKiCWdkBJ7KcFVmyLLfZ51Kxe/9Nau6cBuvaVZFSF27LcY/Byh44gOIL2LlNY4G/uEc9gK4apBwSIULIKnDooT0oSUicVLeuIZh5c+Ufw/lsADA+MJNmKIRx1JMAUsbQ/YHZoejW5ev3w6MF9R4YZ1a62uN2yHfwWedIRJwnCCSBh+RP3wt0ABnNUoaoJvJVy1AAeZyTaBHJ/9k5UxJS9QojPHxlyRsYQTTnBFkuAKQJCkqiqT+lWLG6vLfWd7/Smdxmm9eeOGu++8lZ/4tRLtgpJN/5slYgEAzBCCJzDwCUZOQdFgLwZTIM1kHkpPIakDMeariWwhJyaPSZbhBBA4JyuqcKWtq6/1+JnJwf7xgb++otahtW1nViyhaw6SGCih98G/F6ETUD2wlySSJyXTYzoV5LiNkjyUyp+pe3qKjRLmBRSIcDiiqeqr7+9LNVDGwCoryv71p3/vdLp1T5O0FTER4WYAMr2vlBNhdAhDX0DvgaMcqgeUMl2a0cZtNA57YgEd14fAQMKKRfVQMDgyEuFczS/w/vGDA6HRyEQwAuvu9RPXiioXuao3WKWb9LyrheblIsytYO6EcbxIL4YPgqtwVgISUqTdHi+w21iymZhFAUlSGFEjFIoEQ0bEwGhMPXEu8uIHRx9/+t22zm6RTHWTaFpbW7N+zaotN629aukin9dDxrAc/lIL7LGH9qrRM8mCLXvCuGLeJahshuKGjE2+lkFaYoznRsbBGBEME+EoMyyFuMMQakfv6CcH2nbubmn58mQ0Er7wek4pc+bM2bBm5eYbr1u+eH5RgVtGhyh4zBbcax/ZrxndORJKwFmG6m1wlCXYJrSx4t3vRFYESUQtHjFUQ9iIOw2hdfSN7jrYvnNXS8uXJ/ULeDICS0l9Xd31a1c2X79q2cK5hXkOGR2i0HF7aJ8jfEiLnR3L1xkKAaoHVVvgrhtvt/g8BMR5lHDMZggHKa6YtHX2hXcdat+5q6Xl6KlIZGLJmyNYShoa6m9Ys/Lm9VdfuaDO67JJYwihE/bRA85Iq2b2Ahk/ECJAsaOiGZ6GJBtARCSjljoasxvSCcVjSNuZ/vDuQ6d37j586OjJSHhmnhzBUqMaG+tvXHv1xjXLl1xWY1ekjI24w3t9g08zZNyZIUCxoeJmuGpBJkBGTPaES2LSAdV1zq/vaul479PWg60nsuIZUzGHMWmj+dyG+id+8v3FjcVFvb9xRVqzm48AxYHKZthLQCaR7B0pCFq+R/7w8WvvfaFn4G/TyJTtt8w0kw0V7sYqb57/1aypADBARNH3AcwASDCIUteghwc2LPFJc5I2RlYycyE4jTTWlj31i78s58cKAy8yltNDEwYIA+YwXNUgwbmwIVxWUq1ptt0tnV9Ht9zBnA7bkz+5Z3EN9w38XpHR3J2aAeYIGOAohrRUxYSINM6p7+4Lnujyzzx8Cskd7MEfbL5twxXegf+2W71f93URBhh+2IvA7SDh0KLCkovm1u850j04nKNP5gi2Zd2SB3+wOT/4Rn60ZXZegiGCNQJnaXyN49TCgOOy2vKd+zqNWC7N/VzA5taWbH/ozlJ85Qu/k3loCdj4NDcDBlg6VBtUF8jiTNh52OUsLMxzfnToXA7hmzWY22nb/uNvL6qSpaEXFGT6qpAJdydvdlG/imldS4ThKIz3eTTVZEKvKC0LRWKtpwPZ6pk12IP33LB1zVxf6EWHHMx81DmsHuX1unR7WSebqkBhgLCgKFDt8XW30x6NGWJ+bXnr6aHz/uyCLTuwW9YueOC7673h9wvE8cxHBajunFx2rEcW5nmkMPN4/5SnMkAasLsBCzBBwmMPGzF1YW3xR4f7R6NZBFsWYJfVFv/HD28p5SdKzV2Z54sYuXuVNe8cCv3oiZ0rFjd487x28jv4lFU5pAWFQwEoBjI5M12qDririx0fHh4SMtNwyxTM7bQ9fn/zwgqzwnhbgZnhKICdFU0doeIHf/fxoD9w9Exw0zVzTWEvVHsUNsXlJwAmNAHoIB1kaFqEU7TAXcgg953KtM7KFOzB761uXllVFn3HgeGZz07KoFUziEX/9sKxfUc6AQwFgkHTft0V5dEYFWlThCgDpIBmADHABGKgmMsxahiyrtR7pt/o6Itl8tMZgW1dM/fvvrW82PzMi84MkQBEpeucWPbeEf3J/9tPiWYbjnX0V1dX1Zc6mYx4tKkdMt78S+sJ5Dkjo2G2oMr2+cloIDyzQ84MNr+28Ff3rS3XTpfjYIZIAAisS1/QNVL00H/uD46kAZBsOeW/rqleZZSvhWzKFA9H4/3MtEYb5/DYo4ZhNpbKD4+SOVMemQGsKN/x6/tWNZbyGuxS2LRPaMer1R+tGBR1j+3o3nuka8KX0Wi0rZ9ubCrRddPnHOFT3eLjqqWMJqHZSVjCwajIjc/bMH0emWHZUlNVXl9fZwrZaVxhkCtDKt109hmVHx+L7Pj45KSnHDza/oePwjq5u4Y9k1dk8bZVshMXN93AALp6wKDNn9focjmm12IGi/UNDu/+Knj5ZY3F+a6BSL6dR51qZPohBNYeqj4fKXj4f04GQlNG0dH2wOXzqnyOIYdiumyTXfzUNWeQEm1nWVs3FK1gZ0f9L57vHw7OkB5njrFBf+CdzzudhVULawuGIg5T8nxtZMoSkeH8aKE/VvzE26E9rWenmVZK68gZa/0yr9ADPjfUCxVJNuDCOo62YzCAmK36N7t9v/tje1SfOutkDgbANGOfHmzrDLmaFlSQwJDuyNMi2oVxzzBq2LpCRZ+etm1/pZ3kDL2dkdFIb9h33XyuR/SS/AtckgMcvYM40gZL2E4bc3/2qvnJgdPI7N2rLCqP9jM9H3852tDQUFFAvUFF5ZbHNu6WIsFODrr6Iu5/es4fCM58UQF0ng8VlNQ1FoQYiQJPWhrksAROdqOtG4rN+/aZukdeOH+uZyBzbbOrFYOh0M5958hVs7jOMRzS9RgrcJg8HgwMXQHmjypP/Un7tHXqanCiUGuH3rRwjt30e12w2xJUoTAOn4J/GIa95snPvP/1VnvMmCG2J0jW1b0U5v4vu44P5l85v1QVff1By20nhw0hHZ1+tre7ePsOv8zm9SjLjB3vt61b6I0EQxU+cAVn+3GkHZLsp2Lzfr7D2HO4M4uOZVJyXEF3nx/88IhZOWderVfvHdQJOB/AQNT78xeFfzgjJ0yXoeGRsFK+vMqK6sbAMNrPQXEWvdE555cvnevtz2JxlC659zwikfAHB/xh27wr69wjgYAg7fefeT85nKMeJ7tDNXPqy9WhkTBF7HO278575t02M5Z7E+5rtd9A4uip3pbeoqUL6joGlcd3DMjJ3h/KbCrZ2m2uaarrMXw/fS2y7+iZHNxv9sVbWFhWUvT156muLPN48r7+PJfkklySiy7/D8RU38I8pVv5AAAAAElFTkSuQmCCCg==">
16 <link rel="apple-touch-icon" href="data:image/png;charset=utf-8;base64,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"> 17 <link rel="apple-touch-icon" href="data:image/png;charset=utf-8;base64,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">
17 <link rel="shortcut icon" href="data:image/png;charset=utf-8;base64,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"> 18 <link rel="shortcut icon" href="data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAIAAAADehTSAAAD8GlDQ1BJQ0MgUHJvZmlsZQAAKJGNVd1v21QUP4lvXKQWP6Cxjg4Vi69VU1u5GxqtxgZJk6XpQhq5zdgqpMl1bhpT1za2021Vn/YCbwz4A4CyBx6QeEIaDMT2su0BtElTQRXVJKQ9dNpAaJP2gqpwrq9Tu13GuJGvfznndz7v0TVAx1ea45hJGWDe8l01n5GPn5iWO1YhCc9BJ/RAp6Z7TrpcLgIuxoVH1sNfIcHeNwfa6/9zdVappwMknkJsVz19HvFpgJSpO64PIN5G+fAp30Hc8TziHS4miFhheJbjLMMzHB8POFPqKGKWi6TXtSriJcT9MzH5bAzzHIK1I08t6hq6zHpRdu2aYdJYuk9Q/881bzZa8Xrx6fLmJo/iu4/VXnfH1BB/rmu5ScQvI77m+BkmfxXxvcZcJY14L0DymZp7pML5yTcW61PvIN6JuGr4halQvmjNlCa4bXJ5zj6qhpxrujeKPYMXEd+q00KR5yNAlWZzrF+Ie+uNsdC/MO4tTOZafhbroyXuR3Df08bLiHsQf+ja6gTPWVimZl7l/oUrjl8OcxDWLbNU5D6JRL2gxkDu16fGuC054OMhclsyXTOOFEL+kmMGs4i5kfNuQ62EnBuam8tzP+Q+tSqhz9SuqpZlvR1EfBiOJTSgYMMM7jpYsAEyqJCHDL4dcFFTAwNMlFDUUpQYiadhDmXteeWAw3HEmA2s15k1RmnP4RHuhBybdBOF7MfnICmSQ2SYjIBM3iRvkcMki9IRcnDTthyLz2Ld2fTzPjTQK+Mdg8y5nkZfFO+se9LQr3/09xZr+5GcaSufeAfAww60mAPx+q8u/bAr8rFCLrx7s+vqEkw8qb+p26n11Aruq6m1iJH6PbWGv1VIY25mkNE8PkaQhxfLIF7DZXx80HD/A3l2jLclYs061xNpWCfoB6WHJTjbH0mV35Q/lRXlC+W8cndbl9t2SfhU+Fb4UfhO+F74GWThknBZ+Em4InwjXIyd1ePnY/Psg3pb1TJNu15TMKWMtFt6ScpKL0ivSMXIn9QtDUlj0h7U7N48t3i8eC0GnMC91dX2sTivgloDTgUVeEGHLTizbf5Da9JLhkhh29QOs1luMcScmBXTIIt7xRFxSBxnuJWfuAd1I7jntkyd/pgKaIwVr3MgmDo2q8x6IdB5QH162mcX7ajtnHGN2bov71OU1+U0fqqoXLD0wX5ZM005UHmySz3qLtDqILDvIL+iH6jB9y2x83ok898GOPQX3lk3Itl0A+BrD6D7tUjWh3fis58BXDigN9yF8M5PJH4B8Gr79/F/XRm8m241mw/wvur4BGDj42bzn+Vmc+NL9L8GcMn8F1kAcXjEKMJAAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrlPw1BAAALFElEQVRoge2aeWxcxR3Hv/OOvbKHvWuv7V0fcQK5E+wEm1w1OZ0Ek1BCARUhWpUCalGl0pMeIKBIFBVVolWJkGhpGiBAoCE0FaQBnEKUg6QkzmUbO7bjIz7iY+9950z/2F1718eujd1KVflp9GTtzux83m9+v+/7zRsDX9qX9r9jZJrjTSaT1+vNOEsg4L927do055quVVVVhcPhUDAYCgYmauFwaNeuXdOfS5jmeFEULRYLpH6AgbHxO5mtRqNxmhNh+qyMMYBBk5NYk4kJwAAjm+g2pmLTZQUAMDAdjMYpR2MxMDr9xMAMsQJMA02wgoEBYAABAViMdQZshlipDqYjFg/ASBiwGKueGhhf0GYqBjTQGNCYqGUMVKN0Blw7U37VRvw64t2YMegqo9r0J5kJVqaD6aBaEmhykjFQFVSf/jwzoVm6CqrFWTGcScN5xqCrdCZYuXE/feihh3bsuM1kMk0GFroKpsUbVeNXmrgyFVRlk2N15+Y8+M17fvGjh8f9dhy/ulyup3/1VE6u6+yZs6/tfX3fvrfa2tomRAWjusrRGCtLqGxyhsXiNR0rx3GVK8ru3llza/W6OSUFPX1DL7+y72pPX2bWDRvW5+Q6ER0qW1Ja9uwTP/3B9/5+6IM9e179+JOjiqKMgWUs5leqgTGAxq/xkAVA07AW5Llrtqy/+/ZbKssX2mcZQDWq+l0O48abV+1540Bm1q/t/CqYChCoKqSwy8ru+/q2e+/YdvrspVffeHv/O3/r6OxMYqVUV/kUv9KRDIux0tE6wPP8qoryu3fWbNu4erYnm4cCGoEqgxM4jnBadEd1VWZWT0HBzWtXQY6OZAmliAQ5qlYu81aW/+TR7z9w8NCRV/a+fezESU3TNE1jusqoRtiwX2mKIDAKqlI9zur15G/fsuHO2zZXLJtrM1GoESjXQHgQHoSCUfACdLmibF5psbe1vSsda/WmDXl5LmgqGE1pABQZNFhgZw/cs/G+OzadPNO4e+9fg6GwpspiTLbiPUfhUqYpIs+trlx+713bt66rKMmzcHoQeg+iZIRyuIHxPHLsxuqbK1/csz+ZbXRJcWDfKzt2bIWOlIyOhePwH0wF1SAIIMY+n2YymWx6J2FanJKNZo0y24DssBlVh1mFEgDTQXiAAziQWOMTVx6EBydIkfCho5d2fvvnyQ+8FL+Wzi5ZXVkOHeBEEB5UBQOggepx1xIeHAElIIAqgwbcRqppANTRfk3CFamvwBDkmYoIAALCARSEgHBgMUQ91bvgiF62sGj+nML65vbxWbdVr8/JcUENINAI3wUEGhHpgNwPXQYA3gDBBmMOzB5YimD2QnSAiAKRErVLDFcfFbgCGGjSMhISJyYx1+pJuEIsDESBy57Fb6laMT4rx3E7ampY80ukcRekLgyLzKgwiekmBxjsmFWKrDJk3wBzAQgHqiTUIFHOji1qCQGLsZIEK5catTxACSfwUDevXfaHv7yravpo1gXz5t64uIjVPUrCXeABHhlMCUCuw0AdRAPsi+CugmMxiAAqJ1iTtDZlr5BgTYnX4SYAFIAosEWl7iXzis9cah3Nun1bdRa5SiId8X1HxkKeJPpQBYNnMXQW1jnI34ysJfEqMVkTRlaEgCERtSQBqiclFgUTQJnAw2bCrevKRrMSQsqXLdDMs0nFbtZ7hO//WIg0QddGgNJbrKwItaD5RWQtRcE2mPLBYsKX9BhLvtEUVi6W/oDONFVWqKIyVSNBmbjdbsIRRmP3lzCn07myYnnN1o1VK28sdpvFSBPp+yc/dEyMXAbVJwsNgAKiBflb4FwBpoMl14rDoCS+LnFKwigna1A0XtFFXwT1bYO1pxo/PHauvqlNVeThhRxtTqdz9U0rajavW1t5Q2GOUYw0kf6jou+kKLWC0klBx6icK5C/GYSPJ9xIJJD4VowQRoms87JmUJjZH+Xqr/hqT33+0fFzFxtbNHV07ZFuWpfLteam5bds+srqFUu8Tl6MNHEDxw3B06LckZDbtMQUsM2Bpwa8MYELEAYwSomsCbJuUmD1S2Jju6/29OcfHTt/obFVU+WJfm9S65qbm7OmsnzrhtUry+Z7sogQbuJ8n5ojdQalI8NICszywFMD3gSqM0ajqhDRTDpnD8jGxk7/kVNNHx4/f7GxdXih09jUtu3u3NzVlWV3bFvzleXzs/p2O/zvTyoeLF4UbAHHM13rCrp6Qta9hy/Unrx4oaFlMojDllFFUywciTQ0tawtv26l56pj4E1CJrGTJoAahOaHuZBAt/DhoMS/sLf21Lkmqk9tYzM1VgD337npkbuWZve8yLHoZMcQQB4CITDmcES2isqS+QtqT7f4gtJ/kLVy2dznfrgz37dbVLunFj4EkK7BmA3eJHIRu5n35hceOtGsalN4bzAF1lyn7YXHvrHI+LEl/NkXeT3FGFQ/THkANfIhd3YWL5g/qevMPHCqrDzHPfPIndULAnbfQZIBlFAIBGMcRgBNAsfDYCVMNZJQSYGnqz/a0D40w6z3377mO9tnu3yv8xizPUy1QbKwnyxxoG2c7wighWDMAnSel41cdG6R99OG/j7fpAJ3Uqw3LS155uENXukdA+1P31OB7QpZH0a+yHwWMjhOD6qDA0QDdMUgSiaBFeflfnimV1Iya0JmVrfT+rsf37bY8ukstSF9TwbSx6/5U23kRMPA0uvnWGinSMbIJwF0GQYDoIIpZjFkM5ntFsuRcwMZXydnYBV47unvVlfP92dLn2RMJx+bc6p3zs92HTle17ps0fW5DquDdI2jwUwHr4GLgoYJiZqFQK49Oxhlda3habF+a3v5g1vz3dL7PDK86JOo9YpW8fjuiw2tPZTq51t9VSvmmTjZJo5JHQYQBYISc63AR418qMjlvNQhdQ6kmyUd68rFnqfuX17Mao3wpwdl4K7qS187pv75YF3sE58/NBAVKhZ6zBg0CamREKvlhQQ3g8moCpBLXMLRejXN82FC1mK39TcPr1lkr7eztvSgIOhXPf/qKfzlHz+LSCNYTe39ue682bkGh+DjuVQJYwAHkEQVzmCzqERXPQ52tBHKBM4d/z0hgLmlhXm52QNyTlDPTqf8BBHV3Bkpev6dy/1DwVQg+vu3Lp7pntURsLGxP6EDNMFK0dWDQBAlhZ4cp3WiqSb0a1tX/6nmyLzrrjOYnLqqWIXguMAUXHu4eN9p8vJ7TWMPBWRFaerFqoUGMwI28+ibjDVVRWMbugeMJ7qLHnsj0t49Ybyli9eevsHDp686crwed25YglUMC1yqChL0hBxnel2P72mNRMev7voGgirvWlQg2Q2aUUxl5eHz41IL+iPZr551P7e/x+cPpOHJoAOSJB05feWabJtfmi/JTCSyWVSHJwtKwmW/49l3o+cvjyf7Catvj5QUed1Gv8vGOBIfy4D2bjR3kCsR77OHDQeOdlBdTfMjmVkBAKyhpedEs1Y622vkNUWR7CadcNApWgbJgXPmlw9dS38kxKh+oRMV1zstCDodAIGk4FILuodMx3qLntwfqm/tncyh0mTrgYGhwAdnhgyOAq9TDYQiVhN6/TjXY3/yTSkUyVzbhyNSV9ixvJDYBFlWceEy+mXnnnO5zx/sDgaDGYdPjRWAqionzve3h/PmFWVJIb8vKv72H5a6yxmkd9g6+0Imh6fYEuobRFvU++vDwnsnO6Z0ljTVfQFr7Rw62mwsLSmqv8q/dHhgKueX7GKHtHhe0WW//Yn9gab2/9a/ExiMZqt11hcYaLfbBHEGzue/tP9P+zclUOrCr+J20QAAAABJRU5ErkJgggo=">
18 19
19 <meta http-equiv="cleartype" content="on"> 20 <meta http-equiv="cleartype" content="on">
20 <meta name="apple-mobile-web-app-capable" content="yes"> 21 <meta name="apple-mobile-web-app-capable" content="yes">
21 22
22 23
23 <!-- link rel="apple-touch-startup-image" href="data:image/png;charset=utf-8;base64,iVBORw0K...ggo=" --> 24 <!-- link rel="apple-touch-startup-image" href="data:image/png;charset=utf-8;base64,iVBORw0K...ggo=" -->
24 25
25<!-- 26<!--
26@copyright@ 27@copyright@
27--> 28-->
28 29
29@css@ 30@css@
30 31
31 <link rel="shortcut icon" href="./clipperz.ico" /> 32 <link rel="shortcut icon" href="./clipperz.ico" />
32 33
33 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." /> 34 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." />
34 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" /> 35 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" />
35<script> 36<script>
36 Clipperz_IEisBroken = false; 37 Clipperz_IEisBroken = false;
37 Clipperz_normalizedNewLine = '\n'; 38 Clipperz_normalizedNewLine = '\n';
38 Clipperz_dumpUrl = "/dump/"; 39 Clipperz_dumpUrl = "/dump/";
39</script> 40</script>
40 41
41@js_LINKED@ 42@js_LINKED@
42 43
43</head> 44</head>
44<body> 45<body>
45<div id="mainDiv"> 46<div id="mainDiv">
46 <div id="loading"> 47 <div id="loading">
47 <div> 48 <div>
48 <!-- a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a --> 49 <!-- a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a -->
49 <h1>clipperz</h1> 50 <h1>clipperz</h1>
50 <h3 class="clipperzPayoff">keep it to yourself!</h3> 51 <h3 class="clipperzPayoff">keep it to yourself!</h3>
51 <!-- h5>loading ...</h5 --> 52 <!-- h5>loading ...</h5 -->
52 </div> 53 </div>
53 </div> 54 </div>
54 55
55@js_EMBEDDED@ 56@js_EMBEDDED@
56 57
57</div> 58</div>
58<!-- div id="applicationVersionType" class="@application.version.type@"></div --> 59<!-- div id="applicationVersionType" class="@application.version.type@"></div -->
59 60
60<script> 61<script>
61 Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@}); 62 Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@});
62 /*offline_data_placeholder*/ 63 /*offline_data_placeholder*/
63</script> 64</script>
64 65
65</body> 66</body>
66</html> 67</html>
diff --git a/frontend/gamma/js/Bookmarklet.js b/frontend/gamma/js/Bookmarklet.js
index bcdcc46..9e74ae9 100644
--- a/frontend/gamma/js/Bookmarklet.js
+++ b/frontend/gamma/js/Bookmarklet.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26clipperz_copiedContentToClipboard = false; 24clipperz_copiedContentToClipboard = false;
27 25
28//############################################################################# 26//#############################################################################
29 27
30// Simple Set Clipboard System 28// Simple Set Clipboard System
31// Author: Joseph Huckaby 29// Author: Joseph Huckaby
32 30
33var ZeroClipboard = { 31var ZeroClipboard = {
34 32
35 version: "1.0.4", 33 version: "1.0.4",
36 clients: {}, // registered upload clients on page, indexed by id 34 clients: {}, // registered upload clients on page, indexed by id
37 //moviePath: 'ZeroClipboard.swf', // URL to movie 35 //moviePath: 'ZeroClipboard.swf', // URL to movie
38 //moviePath: 'data:application/octet-stream;charset=utf-8;base64,Q1dTCYgGAAB4nH1V61LbRhTeXV2OJNsYczFgIEC4JCGABSRpSy+B2JDQQtWJocl0BqK1tUZqhOSRZAj/8ih9hz5AXsGZTl+ndHUhxU2nO56z3/l05uye7+wc6xr6DeUxqpcUhFCNXF9ffxjNcYhRo8U8NruO0IeRLTkm+BpEa4i8/+t3GRGUrRf5tktDe41dMC8Kpd14Q/DM911GPfHCd6zCLyzwa67Tafo0sAppuOWEHZdeyY1O4ERMbnajyPcKIYteUM+qdYPQD/It12m9jX2XBcSx5EYUON6ZwunOEXsXAY+O94HsAu8iFnjULe1mYN/je5u2WLnvAsnRNGrZ6rnfDZlxwQKxRV1XSd1ulPJ1/9KDBB13pDCiZ2ygEdsGj2WHvsXU3dc7taM3e/tHanjDZVqEV2HEzpUGa3V5dVd4Ocfz+5d1/5w6nnbgU4sF+17bFwPfjzT3k691aEDPGb92KBvNX1krmrOjqLNVrVLLb7K1ln9e3WlsVjd0/Um12XXcyPFy6ZHdyHHDkT5tt1JtF/rJerqn6Wu+F/ErsWCmPyiRjrYi54KlgZP/k2Tq9gPYSh5APZOYBVra2VicAtfyn+4qZwHt2E4rVJvszPH2HNcVD2lkS5eOxW3b9f1AtplzZkeKFdDLl/wkibodmyrUsmq241raYdye5ECpdrBf+2GQf0ncA4c3gJelHRrHjd03xs+7L9UMHh9lZN149aOSwuOfcnFO3qQmbb0V44aoSVEXlHeikXQzz1/bpzek8E50XN6o4r/KLfQpU/pMx/J/yz9cxmWhDOOyhMqD5SkJjQnKYnmpIlfuVe5XHlSWKw8rC6QoEayoWk7MFwaKg6Whx4AJEBGIBEQGQQFJBaKBlAMpD6QA0gCQIsglICNAxkGYAFIBMgkwDWQGhFkgc0DuApkHsqDmMZAVIKtA1oBUgejqOmc21E1uHwF5DOQJ4C+AfAnkKyBbQL4G8g2Qb4F8B+o2wA6QZ4DrIOyCsAfCcw0lUwR/ZvgiOP3IhwgWcDZIsCipIpJkPmskBBiBgpGiIqQJOJdYPqbiOaRiUcRIQ5hrIfT055ySiKYVzMLKkKmuDM8aAyInyW1yNCOF22Q5I8Xb5FhGSjLR8n/gnv5q+U+9t4/MojnYLtEhc3jljjGCGT4Z7bXL7bG9Udwefz9xjk9Vhl3crtjqqXwifS8hWzblJToZmylTbk+vYuMOjsECWjZnkuDZvTmcwbscGvOiKVcxXThZNGVjkQebS+17pmLcJwl8sI1v4PI2uYEPt4UbuLItxrCwoplgrMagaOZTENf2NK0NryE8gWRCVE3p6ae5j3aOFwyZb8of6RT3FYn7Y9yvmjlDx1mKGncSfVTC9Z/v6QyZE7q5rpsburmpm490U+K/12g6WXYc+nR4CKX/H31zGG1z5m9Pt5okCg==', 36 //moviePath: 'data:application/octet-stream;charset=utf-8;base64,Q1dTCYgGAAB4nH1V61LbRhTeXV2OJNsYczFgIEC4JCGABSRpSy+B2JDQQtWJocl0BqK1tUZqhOSRZAj/8ih9hz5AXsGZTl+ndHUhxU2nO56z3/l05uye7+wc6xr6DeUxqpcUhFCNXF9ffxjNcYhRo8U8NruO0IeRLTkm+BpEa4i8/+t3GRGUrRf5tktDe41dMC8Kpd14Q/DM911GPfHCd6zCLyzwa67Tafo0sAppuOWEHZdeyY1O4ERMbnajyPcKIYteUM+qdYPQD/It12m9jX2XBcSx5EYUON6ZwunOEXsXAY+O94HsAu8iFnjULe1mYN/je5u2WLnvAsnRNGrZ6rnfDZlxwQKxRV1XSd1ulPJ1/9KDBB13pDCiZ2ygEdsGj2WHvsXU3dc7taM3e/tHanjDZVqEV2HEzpUGa3V5dVd4Ocfz+5d1/5w6nnbgU4sF+17bFwPfjzT3k691aEDPGb92KBvNX1krmrOjqLNVrVLLb7K1ln9e3WlsVjd0/Um12XXcyPFy6ZHdyHHDkT5tt1JtF/rJerqn6Wu+F/ErsWCmPyiRjrYi54KlgZP/k2Tq9gPYSh5APZOYBVra2VicAtfyn+4qZwHt2E4rVJvszPH2HNcVD2lkS5eOxW3b9f1AtplzZkeKFdDLl/wkibodmyrUsmq241raYdye5ECpdrBf+2GQf0ncA4c3gJelHRrHjd03xs+7L9UMHh9lZN149aOSwuOfcnFO3qQmbb0V44aoSVEXlHeikXQzz1/bpzek8E50XN6o4r/KLfQpU/pMx/J/yz9cxmWhDOOyhMqD5SkJjQnKYnmpIlfuVe5XHlSWKw8rC6QoEayoWk7MFwaKg6Whx4AJEBGIBEQGQQFJBaKBlAMpD6QA0gCQIsglICNAxkGYAFIBMgkwDWQGhFkgc0DuApkHsqDmMZAVIKtA1oBUgejqOmc21E1uHwF5DOQJ4C+AfAnkKyBbQL4G8g2Qb4F8B+o2wA6QZ4DrIOyCsAfCcw0lUwR/ZvgiOP3IhwgWcDZIsCipIpJkPmskBBiBgpGiIqQJOJdYPqbiOaRiUcRIQ5hrIfT055ySiKYVzMLKkKmuDM8aAyInyW1yNCOF22Q5I8Xb5FhGSjLR8n/gnv5q+U+9t4/MojnYLtEhc3jljjGCGT4Z7bXL7bG9Udwefz9xjk9Vhl3crtjqqXwifS8hWzblJToZmylTbk+vYuMOjsECWjZnkuDZvTmcwbscGvOiKVcxXThZNGVjkQebS+17pmLcJwl8sI1v4PI2uYEPt4UbuLItxrCwoplgrMagaOZTENf2NK0NryE8gWRCVE3p6ae5j3aOFwyZb8of6RT3FYn7Y9yvmjlDx1mKGncSfVTC9Z/v6QyZE7q5rpsburmpm490U+K/12g6WXYc+nR4CKX/H31zGG1z5m9Pt5okCg==',
39 //moviePath: 'http://localhost:8000/tests/js/tests/Bookmarklet/ZeroClipboard.swf', 37 //moviePath: 'http://localhost:8000/tests/js/tests/Bookmarklet/ZeroClipboard.swf',
40 moviePath: 'http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/ZeroClipboard_1.0.4.swf', 38 moviePath: 'http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/ZeroClipboard_1.0.4.swf',
41 //moviePath: './ZeroClipboard.swf', 39 //moviePath: './ZeroClipboard.swf',
42 nextId: 1, // ID of next movie 40 nextId: 1, // ID of next movie
43 41
44 $: function(thingy) { 42 $: function(thingy) {
45 // simple DOM lookup utility function 43 // simple DOM lookup utility function
46 if (typeof(thingy) == 'string') thingy = document.getElementById(thingy); 44 if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
47 if (!thingy.addClass) { 45 if (!thingy.addClass) {
48 // extend element with a few useful methods 46 // extend element with a few useful methods
49 thingy.hide = function() { this.style.display = 'none'; }; 47 thingy.hide = function() { this.style.display = 'none'; };
50 thingy.show = function() { this.style.display = ''; }; 48 thingy.show = function() { this.style.display = ''; };
51 thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; }; 49 thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
52 thingy.removeClass = function(name) { 50 thingy.removeClass = function(name) {
53 this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, ''); 51 this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, '');
54 }; 52 };
55 thingy.hasClass = function(name) { 53 thingy.hasClass = function(name) {
56 return !!this.className.match( new RegExp("\\s*" + name + "\\s*") ); 54 return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
57 } 55 }
58 } 56 }
59 return thingy; 57 return thingy;
60 }, 58 },
61 59
62 setMoviePath: function(path) { 60 setMoviePath: function(path) {
63 // set path to ZeroClipboard.swf 61 // set path to ZeroClipboard.swf
64 this.moviePath = path; 62 this.moviePath = path;
65 }, 63 },
66 64
67 dispatch: function(id, eventName, args) { 65 dispatch: function(id, eventName, args) {
68 // receive event from flash movie, send to client 66 // receive event from flash movie, send to client
69 var client = this.clients[id]; 67 var client = this.clients[id];
70 if (client) { 68 if (client) {
71 client.receiveEvent(eventName, args); 69 client.receiveEvent(eventName, args);
72 } 70 }
73 }, 71 },
74 72
75 register: function(id, client) { 73 register: function(id, client) {
76 // register new client to receive events 74 // register new client to receive events
77 this.clients[id] = client; 75 this.clients[id] = client;
78 }, 76 },
79 77
80 getDOMObjectPosition: function(obj) { 78 getDOMObjectPosition: function(obj) {
81 // get absolute coordinates for dom element 79 // get absolute coordinates for dom element
82 var info = { 80 var info = {
83 left: 0, 81 left: 0,
84 top: 0, 82 top: 0,
85 width: obj.width ? obj.width : obj.offsetWidth, 83 width: obj.width ? obj.width : obj.offsetWidth,
86 height: obj.height ? obj.height : obj.offsetHeight 84 height: obj.height ? obj.height : obj.offsetHeight
87 }; 85 };
88 86
89 while (obj) { 87 while (obj) {
90 info.left += obj.offsetLeft; 88 info.left += obj.offsetLeft;
91 info.top += obj.offsetTop; 89 info.top += obj.offsetTop;
92 obj = obj.offsetParent; 90 obj = obj.offsetParent;
93 } 91 }
94 92
95 return info; 93 return info;
96 }, 94 },
97 95
98 Client: function(elem) { 96 Client: function(elem) {
99 // constructor for new simple upload client 97 // constructor for new simple upload client
100 this.handlers = {}; 98 this.handlers = {};
101 99
102 // unique ID 100 // unique ID
103 this.id = ZeroClipboard.nextId++; 101 this.id = ZeroClipboard.nextId++;
104 this.movieId = 'ZeroClipboardMovie_' + this.id; 102 this.movieId = 'ZeroClipboardMovie_' + this.id;
105 103
106 // register client with singleton to receive flash events 104 // register client with singleton to receive flash events
107 ZeroClipboard.register(this.id, this); 105 ZeroClipboard.register(this.id, this);
108 106
109 // create movie 107 // create movie
110 if (elem) this.glue(elem); 108 if (elem) this.glue(elem);
111 } 109 }
112}; 110};
113 111
114ZeroClipboard.Client.prototype = { 112ZeroClipboard.Client.prototype = {
115 113
116 id: 0, // unique ID for us 114 id: 0, // unique ID for us
117 ready: false, // whether movie is ready to receive events or not 115 ready: false, // whether movie is ready to receive events or not
118 movie: null, // reference to movie object 116 movie: null, // reference to movie object
diff --git a/frontend/gamma/js/BookmarkletHash.js b/frontend/gamma/js/BookmarkletHash.js
index c3039f5..11b472f 100644
--- a/frontend/gamma/js/BookmarkletHash.js
+++ b/frontend/gamma/js/BookmarkletHash.js
@@ -1,44 +1,42 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26 //18f820faffcdb5e847d4c5d5c4a1de6743baa1a0 24 //18f820faffcdb5e847d4c5d5c4a1de6743baa1a0
27 //9b30434c73fb009b15fecaa904b44f9ced807577 25 //9b30434c73fb009b15fecaa904b44f9ced807577
28 //9b30434c73fb009b15fecaa904b44f9ced807577 26 //9b30434c73fb009b15fecaa904b44f9ced807577
29 varxh; 27 varxh;
30 vardocumentText; 28 vardocumentText;
31 29
32try { 30try {
33 xh=new XMLHttpRequest(); 31 xh=new XMLHttpRequest();
34} catch(e) { 32} catch(e) {
35 xh=new ActiveXObject("Msxml2.XMLHTTP"); 33 xh=new ActiveXObject("Msxml2.XMLHTTP");
36} 34}
37 35
38xh.open("GET", window.location, false); 36xh.open("GET", window.location, false);
39xh.send(null); 37xh.send(null);
40 38
41documentText = "#####" + xh.responseText + "####"; 39documentText = "#####" + xh.responseText + "####";
42//documentText = document.body.innerHTML; 40//documentText = document.body.innerHTML;
43 41
44//console.log(documentText); \ No newline at end of file 42//console.log(documentText); \ No newline at end of file
diff --git a/frontend/gamma/js/Bookmarklet_1.js b/frontend/gamma/js/Bookmarklet_1.js
index c7c7ae6..89b83b1 100644
--- a/frontend/gamma/js/Bookmarklet_1.js
+++ b/frontend/gamma/js/Bookmarklet_1.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26_cble = null; 24_cble = null;
27 25
28//----------------------------------------------------------------------------- 26//-----------------------------------------------------------------------------
29 27
30isLoginForm = function(aForm) { 28isLoginForm = function(aForm) {
31 var inputFields; 29 var inputFields;
32 var passwordFieldsFound; 30 var passwordFieldsFound;
33 var i,c; 31 var i,c;
34 32
35//console.log("is login form: " + aForm.name + " (" + aForm.id + ")"); 33//console.log("is login form: " + aForm.name + " (" + aForm.id + ")");
36 passwordFieldsFound = 0; 34 passwordFieldsFound = 0;
37 inputFields = aForm.elements; 35 inputFields = aForm.elements;
38 c = inputFields.length; 36 c = inputFields.length;
39 for (i=0; i<c; i++) { 37 for (i=0; i<c; i++) {
40 if (inputFields[i].type == "password") { 38 if (inputFields[i].type == "password") {
41 passwordFieldsFound ++; 39 passwordFieldsFound ++;
42 } 40 }
43 } 41 }
44//console.log("number of password fields found: " + passwordFieldsFound); 42//console.log("number of password fields found: " + passwordFieldsFound);
45 return (passwordFieldsFound == 1); 43 return (passwordFieldsFound == 1);
46}; 44};
47 45
48//----------------------------------------------------------------------------- 46//-----------------------------------------------------------------------------
49 47
50findLoginForm = function(aDocument, aLevel) { 48findLoginForm = function(aDocument, aLevel) {
51 varresult; 49 varresult;
52 vardocumentForms; 50 vardocumentForms;
53 var i,c; 51 var i,c;
54 52
55 result = null; 53 result = null;
56 54
57 try { 55 try {
58 documentForms = aDocument.getElementsByTagName('form'); 56 documentForms = aDocument.getElementsByTagName('form');
59 57
60 c = documentForms.length; 58 c = documentForms.length;
61 for (i=0; (i<c) && (result == null); i++) { 59 for (i=0; (i<c) && (result == null); i++) {
62 if (isLoginForm(documentForms[i])) { 60 if (isLoginForm(documentForms[i])) {
63 result = documentForms[i]; 61 result = documentForms[i];
64 } 62 }
65 } 63 }
66 64
67 if ((result == null) && (aLevel == 0)) { 65 if ((result == null) && (aLevel == 0)) {
68 var iFrames; 66 var iFrames;
69 67
70 iFrames = aDocument.getElementsByTagName('iframe'); 68 iFrames = aDocument.getElementsByTagName('iframe');
71 c = iFrames.length; 69 c = iFrames.length;
72 for (i=0; (i<c) && (result == null); i++) { 70 for (i=0; (i<c) && (result == null); i++) {
73 result = findLoginForm(iFrames[i].contentDocument, (aLevel + 1)); 71 result = findLoginForm(iFrames[i].contentDocument, (aLevel + 1));
74 } 72 }
75 } 73 }
76 } catch (e) { 74 } catch (e) {
77 _cble = e; 75 _cble = e;
78 } 76 }
79 77
80 return result; 78 return result;
81}; 79};
82 80
83//----------------------------------------------------------------------------- 81//-----------------------------------------------------------------------------
84 82
85inputElementValues = function(anInputElement) { 83inputElementValues = function(anInputElement) {
86 varresult; 84 varresult;
87 85
88 //if ((anInputElement instanceof HTMLInputElement) && (anInputElement.getAttribute('name') != null)) { 86 //if ((anInputElement instanceof HTMLInputElement) && (anInputElement.getAttribute('name') != null)) {
89 if ((anInputElement.tagName.toLowerCase() == "input") && (anInputElement.getAttribute('name') != null)) { 87 if ((anInputElement.tagName.toLowerCase() == "input") && (anInputElement.getAttribute('name') != null)) {
90 result = {}; 88 result = {};
91 result.type = anInputElement.getAttribute('type') || "text"; 89 result.type = anInputElement.getAttribute('type') || "text";
92 result.name = anInputElement.getAttribute('name'); 90 result.name = anInputElement.getAttribute('name');
93 // result.value = anInputElement.getAttribute('value'); 91 // result.value = anInputElement.getAttribute('value');
94 result.value = anInputElement.value; 92 result.value = anInputElement.value;
95 if (anInputElement.type.toLowerCase() == 'radio') { 93 if (anInputElement.type.toLowerCase() == 'radio') {
96 result.checked = anInputElement.checked; 94 result.checked = anInputElement.checked;
97 } 95 }
98 //} else if ((anInputElement instanceof HTMLSelectElement) && (anInputElement.getAttribute('name') != null)) { 96 //} else if ((anInputElement instanceof HTMLSelectElement) && (anInputElement.getAttribute('name') != null)) {
99 } else if ((anInputElement.tagName.toLowerCase() == 'select') && (anInputElement.getAttribute('name') != null)) { 97 } else if ((anInputElement.tagName.toLowerCase() == 'select') && (anInputElement.getAttribute('name') != null)) {
100 varoptions; 98 varoptions;
101 var c,i; 99 var c,i;
102 100
103//console.log("input element values: %o", anInputElement); 101//console.log("input element values: %o", anInputElement);
104 result = {}; 102 result = {};
105 result.type = "select"; 103 result.type = "select";
106 result.name = anInputElement.getAttribute('name'); 104 result.name = anInputElement.getAttribute('name');
107 105
108 result.options = []; 106 result.options = [];
109 options = anInputElement.options; 107 options = anInputElement.options;
110 c = options.length; 108 c = options.length;
111 for (i=0; i<c; i++) { 109 for (i=0; i<c; i++) {
112 varoption; 110 varoption;
113 111
114 option = {}; 112 option = {};
115 option.selected = options[i].selected; 113 option.selected = options[i].selected;
116 option.label = options[i].label || options[i].innerHTML; 114 option.label = options[i].label || options[i].innerHTML;
117 option.value = options[i].value; 115 option.value = options[i].value;
118 result.options.push(option); 116 result.options.push(option);
diff --git a/frontend/gamma/js/Bookmarklet_2.js b/frontend/gamma/js/Bookmarklet_2.js
index 02f7de8..de1bbfa 100644
--- a/frontend/gamma/js/Bookmarklet_2.js
+++ b/frontend/gamma/js/Bookmarklet_2.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26clipperz_copiedContentToClipboard = false; 24clipperz_copiedContentToClipboard = false;
27 25
28//############################################################################# 26//#############################################################################
29 27
30// Simple Set Clipboard System 28// Simple Set Clipboard System
31// Author: Joseph Huckaby 29// Author: Joseph Huckaby
32 30
33var ZeroClipboard = { 31var ZeroClipboard = {
34 32
35 version: "1.0.4", 33 version: "1.0.4",
36 clients: {}, // registered upload clients on page, indexed by id 34 clients: {}, // registered upload clients on page, indexed by id
37 //moviePath: 'ZeroClipboard.swf', // URL to movie 35 //moviePath: 'ZeroClipboard.swf', // URL to movie
38 //moviePath: 'data:application/octet-stream;charset=utf-8;base64,Q1dTCYgGAAB4nH1V61LbRhTeXV2OJNsYczFgIEC4JCGABSRpSy+B2JDQQtWJocl0BqK1tUZqhOSRZAj/8ih9hz5AXsGZTl+ndHUhxU2nO56z3/l05uye7+wc6xr6DeUxqpcUhFCNXF9ffxjNcYhRo8U8NruO0IeRLTkm+BpEa4i8/+t3GRGUrRf5tktDe41dMC8Kpd14Q/DM911GPfHCd6zCLyzwa67Tafo0sAppuOWEHZdeyY1O4ERMbnajyPcKIYteUM+qdYPQD/It12m9jX2XBcSx5EYUON6ZwunOEXsXAY+O94HsAu8iFnjULe1mYN/je5u2WLnvAsnRNGrZ6rnfDZlxwQKxRV1XSd1ulPJ1/9KDBB13pDCiZ2ygEdsGj2WHvsXU3dc7taM3e/tHanjDZVqEV2HEzpUGa3V5dVd4Ocfz+5d1/5w6nnbgU4sF+17bFwPfjzT3k691aEDPGb92KBvNX1krmrOjqLNVrVLLb7K1ln9e3WlsVjd0/Um12XXcyPFy6ZHdyHHDkT5tt1JtF/rJerqn6Wu+F/ErsWCmPyiRjrYi54KlgZP/k2Tq9gPYSh5APZOYBVra2VicAtfyn+4qZwHt2E4rVJvszPH2HNcVD2lkS5eOxW3b9f1AtplzZkeKFdDLl/wkibodmyrUsmq241raYdye5ECpdrBf+2GQf0ncA4c3gJelHRrHjd03xs+7L9UMHh9lZN149aOSwuOfcnFO3qQmbb0V44aoSVEXlHeikXQzz1/bpzek8E50XN6o4r/KLfQpU/pMx/J/yz9cxmWhDOOyhMqD5SkJjQnKYnmpIlfuVe5XHlSWKw8rC6QoEayoWk7MFwaKg6Whx4AJEBGIBEQGQQFJBaKBlAMpD6QA0gCQIsglICNAxkGYAFIBMgkwDWQGhFkgc0DuApkHsqDmMZAVIKtA1oBUgejqOmc21E1uHwF5DOQJ4C+AfAnkKyBbQL4G8g2Qb4F8B+o2wA6QZ4DrIOyCsAfCcw0lUwR/ZvgiOP3IhwgWcDZIsCipIpJkPmskBBiBgpGiIqQJOJdYPqbiOaRiUcRIQ5hrIfT055ySiKYVzMLKkKmuDM8aAyInyW1yNCOF22Q5I8Xb5FhGSjLR8n/gnv5q+U+9t4/MojnYLtEhc3jljjGCGT4Z7bXL7bG9Udwefz9xjk9Vhl3crtjqqXwifS8hWzblJToZmylTbk+vYuMOjsECWjZnkuDZvTmcwbscGvOiKVcxXThZNGVjkQebS+17pmLcJwl8sI1v4PI2uYEPt4UbuLItxrCwoplgrMagaOZTENf2NK0NryE8gWRCVE3p6ae5j3aOFwyZb8of6RT3FYn7Y9yvmjlDx1mKGncSfVTC9Z/v6QyZE7q5rpsburmpm490U+K/12g6WXYc+nR4CKX/H31zGG1z5m9Pt5okCg==', 36 //moviePath: 'data:application/octet-stream;charset=utf-8;base64,Q1dTCYgGAAB4nH1V61LbRhTeXV2OJNsYczFgIEC4JCGABSRpSy+B2JDQQtWJocl0BqK1tUZqhOSRZAj/8ih9hz5AXsGZTl+ndHUhxU2nO56z3/l05uye7+wc6xr6DeUxqpcUhFCNXF9ffxjNcYhRo8U8NruO0IeRLTkm+BpEa4i8/+t3GRGUrRf5tktDe41dMC8Kpd14Q/DM911GPfHCd6zCLyzwa67Tafo0sAppuOWEHZdeyY1O4ERMbnajyPcKIYteUM+qdYPQD/It12m9jX2XBcSx5EYUON6ZwunOEXsXAY+O94HsAu8iFnjULe1mYN/je5u2WLnvAsnRNGrZ6rnfDZlxwQKxRV1XSd1ulPJ1/9KDBB13pDCiZ2ygEdsGj2WHvsXU3dc7taM3e/tHanjDZVqEV2HEzpUGa3V5dVd4Ocfz+5d1/5w6nnbgU4sF+17bFwPfjzT3k691aEDPGb92KBvNX1krmrOjqLNVrVLLb7K1ln9e3WlsVjd0/Um12XXcyPFy6ZHdyHHDkT5tt1JtF/rJerqn6Wu+F/ErsWCmPyiRjrYi54KlgZP/k2Tq9gPYSh5APZOYBVra2VicAtfyn+4qZwHt2E4rVJvszPH2HNcVD2lkS5eOxW3b9f1AtplzZkeKFdDLl/wkibodmyrUsmq241raYdye5ECpdrBf+2GQf0ncA4c3gJelHRrHjd03xs+7L9UMHh9lZN149aOSwuOfcnFO3qQmbb0V44aoSVEXlHeikXQzz1/bpzek8E50XN6o4r/KLfQpU/pMx/J/yz9cxmWhDOOyhMqD5SkJjQnKYnmpIlfuVe5XHlSWKw8rC6QoEayoWk7MFwaKg6Whx4AJEBGIBEQGQQFJBaKBlAMpD6QA0gCQIsglICNAxkGYAFIBMgkwDWQGhFkgc0DuApkHsqDmMZAVIKtA1oBUgejqOmc21E1uHwF5DOQJ4C+AfAnkKyBbQL4G8g2Qb4F8B+o2wA6QZ4DrIOyCsAfCcw0lUwR/ZvgiOP3IhwgWcDZIsCipIpJkPmskBBiBgpGiIqQJOJdYPqbiOaRiUcRIQ5hrIfT055ySiKYVzMLKkKmuDM8aAyInyW1yNCOF22Q5I8Xb5FhGSjLR8n/gnv5q+U+9t4/MojnYLtEhc3jljjGCGT4Z7bXL7bG9Udwefz9xjk9Vhl3crtjqqXwifS8hWzblJToZmylTbk+vYuMOjsECWjZnkuDZvTmcwbscGvOiKVcxXThZNGVjkQebS+17pmLcJwl8sI1v4PI2uYEPt4UbuLItxrCwoplgrMagaOZTENf2NK0NryE8gWRCVE3p6ae5j3aOFwyZb8of6RT3FYn7Y9yvmjlDx1mKGncSfVTC9Z/v6QyZE7q5rpsburmpm490U+K/12g6WXYc+nR4CKX/H31zGG1z5m9Pt5okCg==',
39 //moviePath: 'http://localhost:8000/tests/js/tests/Bookmarklet/ZeroClipboard.swf', 37 //moviePath: 'http://localhost:8000/tests/js/tests/Bookmarklet/ZeroClipboard.swf',
40 moviePath: 'http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/ZeroClipboard_1.0.4.swf', 38 moviePath: 'http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/ZeroClipboard_1.0.4.swf',
41 nextId: 1, // ID of next movie 39 nextId: 1, // ID of next movie
42 40
43 $: function(thingy) { 41 $: function(thingy) {
44 // simple DOM lookup utility function 42 // simple DOM lookup utility function
45 if (typeof(thingy) == 'string') thingy = document.getElementById(thingy); 43 if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
46 if (!thingy.addClass) { 44 if (!thingy.addClass) {
47 // extend element with a few useful methods 45 // extend element with a few useful methods
48 thingy.hide = function() { this.style.display = 'none'; }; 46 thingy.hide = function() { this.style.display = 'none'; };
49 thingy.show = function() { this.style.display = ''; }; 47 thingy.show = function() { this.style.display = ''; };
50 thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; }; 48 thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
51 thingy.removeClass = function(name) { 49 thingy.removeClass = function(name) {
52 this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, ''); 50 this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, '');
53 }; 51 };
54 thingy.hasClass = function(name) { 52 thingy.hasClass = function(name) {
55 return !!this.className.match( new RegExp("\\s*" + name + "\\s*") ); 53 return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
56 } 54 }
57 } 55 }
58 return thingy; 56 return thingy;
59 }, 57 },
60 58
61 setMoviePath: function(path) { 59 setMoviePath: function(path) {
62 // set path to ZeroClipboard.swf 60 // set path to ZeroClipboard.swf
63 this.moviePath = path; 61 this.moviePath = path;
64 }, 62 },
65 63
66 dispatch: function(id, eventName, args) { 64 dispatch: function(id, eventName, args) {
67 // receive event from flash movie, send to client 65 // receive event from flash movie, send to client
68 var client = this.clients[id]; 66 var client = this.clients[id];
69 if (client) { 67 if (client) {
70 client.receiveEvent(eventName, args); 68 client.receiveEvent(eventName, args);
71 } 69 }
72 }, 70 },
73 71
74 register: function(id, client) { 72 register: function(id, client) {
75 // register new client to receive events 73 // register new client to receive events
76 this.clients[id] = client; 74 this.clients[id] = client;
77 }, 75 },
78 76
79 getDOMObjectPosition: function(obj) { 77 getDOMObjectPosition: function(obj) {
80 // get absolute coordinates for dom element 78 // get absolute coordinates for dom element
81 var info = { 79 var info = {
82 left: 0, 80 left: 0,
83 top: 0, 81 top: 0,
84 width: obj.width ? obj.width : obj.offsetWidth, 82 width: obj.width ? obj.width : obj.offsetWidth,
85 height: obj.height ? obj.height : obj.offsetHeight 83 height: obj.height ? obj.height : obj.offsetHeight
86 }; 84 };
87 85
88 while (obj) { 86 while (obj) {
89 info.left += obj.offsetLeft; 87 info.left += obj.offsetLeft;
90 info.top += obj.offsetTop; 88 info.top += obj.offsetTop;
91 obj = obj.offsetParent; 89 obj = obj.offsetParent;
92 } 90 }
93 91
94 return info; 92 return info;
95 }, 93 },
96 94
97 Client: function(elem) { 95 Client: function(elem) {
98 // constructor for new simple upload client 96 // constructor for new simple upload client
99 this.handlers = {}; 97 this.handlers = {};
100 98
101 // unique ID 99 // unique ID
102 this.id = ZeroClipboard.nextId++; 100 this.id = ZeroClipboard.nextId++;
103 this.movieId = 'ZeroClipboardMovie_' + this.id; 101 this.movieId = 'ZeroClipboardMovie_' + this.id;
104 102
105 // register client with singleton to receive flash events 103 // register client with singleton to receive flash events
106 ZeroClipboard.register(this.id, this); 104 ZeroClipboard.register(this.id, this);
107 105
108 // create movie 106 // create movie
109 if (elem) this.glue(elem); 107 if (elem) this.glue(elem);
110 } 108 }
111}; 109};
112 110
113ZeroClipboard.Client.prototype = { 111ZeroClipboard.Client.prototype = {
114 112
115 id: 0, // unique ID for us 113 id: 0, // unique ID for us
116 ready: false, // whether movie is ready to receive events or not 114 ready: false, // whether movie is ready to receive events or not
117 movie: null, // reference to movie object 115 movie: null, // reference to movie object
118 clipText: '', // text to copy to clipboard 116 clipText: '', // text to copy to clipboard
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-affix.js b/frontend/gamma/js/Bootstrap/bootstrap-affix.js
new file mode 100644
index 0000000..052ecad
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-affix.js
@@ -0,0 +1,140 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* ==========================================================
25 * bootstrap-affix.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#affix
27 * ==========================================================
28 * Copyright 2012 Twitter, Inc.
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 * ========================================================== */
42
43
44!function ($) {
45
46 "use strict"; // jshint ;_;
47
48
49 /* AFFIX CLASS DEFINITION
50 * ====================== */
51
52 var Affix = function (element, options) {
53 this.options = $.extend({}, $.fn.affix.defaults, options)
54 this.$window = $(window)
55 .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
56 .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
57 this.$element = $(element)
58 this.checkPosition()
59 }
60
61 Affix.prototype.checkPosition = function () {
62 if (!this.$element.is(':visible')) return
63
64 var scrollHeight = $(document).height()
65 , scrollTop = this.$window.scrollTop()
66 , position = this.$element.offset()
67 , offset = this.options.offset
68 , offsetBottom = offset.bottom
69 , offsetTop = offset.top
70 , reset = 'affix affix-top affix-bottom'
71 , affix
72
73 if (typeof offset != 'object') offsetBottom = offsetTop = offset
74 if (typeof offsetTop == 'function') offsetTop = offset.top()
75 if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
76
77 affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
78 false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
79 'bottom' : offsetTop != null && scrollTop <= offsetTop ?
80 'top' : false
81
82 if (this.affixed === affix) return
83
84 this.affixed = affix
85 this.unpin = affix == 'bottom' ? position.top - scrollTop : null
86
87 this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
88 }
89
90
91 /* AFFIX PLUGIN DEFINITION
92 * ======================= */
93
94 var old = $.fn.affix
95
96 $.fn.affix = function (option) {
97 return this.each(function () {
98 var $this = $(this)
99 , data = $this.data('affix')
100 , options = typeof option == 'object' && option
101 if (!data) $this.data('affix', (data = new Affix(this, options)))
102 if (typeof option == 'string') data[option]()
103 })
104 }
105
106 $.fn.affix.Constructor = Affix
107
108 $.fn.affix.defaults = {
109 offset: 0
110 }
111
112
113 /* AFFIX NO CONFLICT
114 * ================= */
115
116 $.fn.affix.noConflict = function () {
117 $.fn.affix = old
118 return this
119 }
120
121
122 /* AFFIX DATA-API
123 * ============== */
124
125 $(window).on('load', function () {
126 $('[data-spy="affix"]').each(function () {
127 var $spy = $(this)
128 , data = $spy.data()
129
130 data.offset = data.offset || {}
131
132 data.offsetBottom && (data.offset.bottom = data.offsetBottom)
133 data.offsetTop && (data.offset.top = data.offsetTop)
134
135 $spy.affix(data)
136 })
137 })
138
139
140}(window.jQuery); \ No newline at end of file
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-alert.js b/frontend/gamma/js/Bootstrap/bootstrap-alert.js
new file mode 100644
index 0000000..63028f2
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-alert.js
@@ -0,0 +1,122 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* ==========================================================
25 * bootstrap-alert.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#alerts
27 * ==========================================================
28 * Copyright 2012 Twitter, Inc.
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 * ========================================================== */
42
43
44!function ($) {
45
46 "use strict"; // jshint ;_;
47
48
49 /* ALERT CLASS DEFINITION
50 * ====================== */
51
52 var dismiss = '[data-dismiss="alert"]'
53 , Alert = function (el) {
54 $(el).on('click', dismiss, this.close)
55 }
56
57 Alert.prototype.close = function (e) {
58 var $this = $(this)
59 , selector = $this.attr('data-target')
60 , $parent
61
62 if (!selector) {
63 selector = $this.attr('href')
64 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
65 }
66
67 $parent = $(selector)
68
69 e && e.preventDefault()
70
71 $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
72
73 $parent.trigger(e = $.Event('close'))
74
75 if (e.isDefaultPrevented()) return
76
77 $parent.removeClass('in')
78
79 function removeElement() {
80 $parent
81 .trigger('closed')
82 .remove()
83 }
84
85 $.support.transition && $parent.hasClass('fade') ?
86 $parent.on($.support.transition.end, removeElement) :
87 removeElement()
88 }
89
90
91 /* ALERT PLUGIN DEFINITION
92 * ======================= */
93
94 var old = $.fn.alert
95
96 $.fn.alert = function (option) {
97 return this.each(function () {
98 var $this = $(this)
99 , data = $this.data('alert')
100 if (!data) $this.data('alert', (data = new Alert(this)))
101 if (typeof option == 'string') data[option].call($this)
102 })
103 }
104
105 $.fn.alert.Constructor = Alert
106
107
108 /* ALERT NO CONFLICT
109 * ================= */
110
111 $.fn.alert.noConflict = function () {
112 $.fn.alert = old
113 return this
114 }
115
116
117 /* ALERT DATA-API
118 * ============== */
119
120 $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
121
122}(window.jQuery); \ No newline at end of file
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-button.js b/frontend/gamma/js/Bootstrap/bootstrap-button.js
new file mode 100644
index 0000000..2c1226e
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-button.js
@@ -0,0 +1,128 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* ============================================================
25 * bootstrap-button.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#buttons
27 * ============================================================
28 * Copyright 2012 Twitter, Inc.
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 * ============================================================ */
42
43
44!function ($) {
45
46 "use strict"; // jshint ;_;
47
48
49 /* BUTTON PUBLIC CLASS DEFINITION
50 * ============================== */
51
52 var Button = function (element, options) {
53 this.$element = $(element)
54 this.options = $.extend({}, $.fn.button.defaults, options)
55 }
56
57 Button.prototype.setState = function (state) {
58 var d = 'disabled'
59 , $el = this.$element
60 , data = $el.data()
61 , val = $el.is('input') ? 'val' : 'html'
62
63 state = state + 'Text'
64 data.resetText || $el.data('resetText', $el[val]())
65
66 $el[val](data[state] || this.options[state])
67
68 // push to event loop to allow forms to submit
69 setTimeout(function () {
70 state == 'loadingText' ?
71 $el.addClass(d).attr(d, d) :
72 $el.removeClass(d).removeAttr(d)
73 }, 0)
74 }
75
76 Button.prototype.toggle = function () {
77 var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
78
79 $parent && $parent
80 .find('.active')
81 .removeClass('active')
82
83 this.$element.toggleClass('active')
84 }
85
86
87 /* BUTTON PLUGIN DEFINITION
88 * ======================== */
89
90 var old = $.fn.button
91
92 $.fn.button = function (option) {
93 return this.each(function () {
94 var $this = $(this)
95 , data = $this.data('button')
96 , options = typeof option == 'object' && option
97 if (!data) $this.data('button', (data = new Button(this, options)))
98 if (option == 'toggle') data.toggle()
99 else if (option) data.setState(option)
100 })
101 }
102
103 $.fn.button.defaults = {
104 loadingText: 'loading...'
105 }
106
107 $.fn.button.Constructor = Button
108
109
110 /* BUTTON NO CONFLICT
111 * ================== */
112
113 $.fn.button.noConflict = function () {
114 $.fn.button = old
115 return this
116 }
117
118
119 /* BUTTON DATA-API
120 * =============== */
121
122 $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
123 var $btn = $(e.target)
124 if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
125 $btn.button('toggle')
126 })
127
128}(window.jQuery); \ No newline at end of file
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-carousel.js b/frontend/gamma/js/Bootstrap/bootstrap-carousel.js
new file mode 100644
index 0000000..e127bc7
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-carousel.js
@@ -0,0 +1,208 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* ==========================================================
25 * bootstrap-carousel.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#carousel
27 * ==========================================================
28 * Copyright 2012 Twitter, Inc.
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 * ========================================================== */
42
43
44!function ($) {
45
46 "use strict"; // jshint ;_;
47
48
49 /* CAROUSEL CLASS DEFINITION
50 * ========================= */
51
52 var Carousel = function (element, options) {
53 this.$element = $(element)
54 this.options = options
55 this.options.pause == 'hover' && this.$element
56 .on('mouseenter', $.proxy(this.pause, this))
57 .on('mouseleave', $.proxy(this.cycle, this))
58 }
59
60 Carousel.prototype = {
61
62 cycle: function (e) {
63 if (!e) this.paused = false
64 this.options.interval
65 && !this.paused
66 && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
67 return this
68 }
69
70 , to: function (pos) {
71 var $active = this.$element.find('.item.active')
72 , children = $active.parent().children()
73 , activePos = children.index($active)
74 , that = this
75
76 if (pos > (children.length - 1) || pos < 0) return
77
78 if (this.sliding) {
79 return this.$element.one('slid', function () {
80 that.to(pos)
81 })
82 }
83
84 if (activePos == pos) {
85 return this.pause().cycle()
86 }
87
88 return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
89 }
90
91 , pause: function (e) {
92 if (!e) this.paused = true
93 if (this.$element.find('.next, .prev').length && $.support.transition.end) {
94 this.$element.trigger($.support.transition.end)
95 this.cycle()
96 }
97 clearInterval(this.interval)
98 this.interval = null
99 return this
100 }
101
102 , next: function () {
103 if (this.sliding) return
104 return this.slide('next')
105 }
106
107 , prev: function () {
108 if (this.sliding) return
109 return this.slide('prev')
110 }
111
112 , slide: function (type, next) {
113 var $active = this.$element.find('.item.active')
114 , $next = next || $active[type]()
115 , isCycling = this.interval
116 , direction = type == 'next' ? 'left' : 'right'
117 , fallback = type == 'next' ? 'first' : 'last'
118 , that = this
119 , e
120
121 this.sliding = true
122
123 isCycling && this.pause()
124
125 $next = $next.length ? $next : this.$element.find('.item')[fallback]()
126
127 e = $.Event('slide', {
128 relatedTarget: $next[0]
129 })
130
131 if ($next.hasClass('active')) return
132
133 if ($.support.transition && this.$element.hasClass('slide')) {
134 this.$element.trigger(e)
135 if (e.isDefaultPrevented()) return
136 $next.addClass(type)
137 $next[0].offsetWidth // force reflow
138 $active.addClass(direction)
139 $next.addClass(direction)
140 this.$element.one($.support.transition.end, function () {
141 $next.removeClass([type, direction].join(' ')).addClass('active')
142 $active.removeClass(['active', direction].join(' '))
143 that.sliding = false
144 setTimeout(function () { that.$element.trigger('slid') }, 0)
145 })
146 } else {
147 this.$element.trigger(e)
148 if (e.isDefaultPrevented()) return
149 $active.removeClass('active')
150 $next.addClass('active')
151 this.sliding = false
152 this.$element.trigger('slid')
153 }
154
155 isCycling && this.cycle()
156
157 return this
158 }
159
160 }
161
162
163 /* CAROUSEL PLUGIN DEFINITION
164 * ========================== */
165
166 var old = $.fn.carousel
167
168 $.fn.carousel = function (option) {
169 return this.each(function () {
170 var $this = $(this)
171 , data = $this.data('carousel')
172 , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
173 , action = typeof option == 'string' ? option : options.slide
174 if (!data) $this.data('carousel', (data = new Carousel(this, options)))
175 if (typeof option == 'number') data.to(option)
176 else if (action) data[action]()
177 else if (options.interval) data.cycle()
178 })
179 }
180
181 $.fn.carousel.defaults = {
182 interval: 5000
183 , pause: 'hover'
184 }
185
186 $.fn.carousel.Constructor = Carousel
187
188
189 /* CAROUSEL NO CONFLICT
190 * ==================== */
191
192 $.fn.carousel.noConflict = function () {
193 $.fn.carousel = old
194 return this
195 }
196
197 /* CAROUSEL DATA-API
198 * ================= */
199
200 $(document).on('click.carousel.data-api', '[data-slide]', function (e) {
201 var $this = $(this), href
202 , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
203 , options = $.extend({}, $target.data(), $this.data())
204 $target.carousel(options)
205 e.preventDefault()
206 })
207
208}(window.jQuery); \ No newline at end of file
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-collapse.js b/frontend/gamma/js/Bootstrap/bootstrap-collapse.js
new file mode 100644
index 0000000..31b7168
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-collapse.js
@@ -0,0 +1,190 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* =============================================================
25 * bootstrap-collapse.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#collapse
27 * =============================================================
28 * Copyright 2012 Twitter, Inc.
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 * ============================================================ */
42
43
44!function ($) {
45
46 "use strict"; // jshint ;_;
47
48
49 /* COLLAPSE PUBLIC CLASS DEFINITION
50 * ================================ */
51
52 var Collapse = function (element, options) {
53 this.$element = $(element)
54 this.options = $.extend({}, $.fn.collapse.defaults, options)
55
56 if (this.options.parent) {
57 this.$parent = $(this.options.parent)
58 }
59
60 this.options.toggle && this.toggle()
61 }
62
63 Collapse.prototype = {
64
65 constructor: Collapse
66
67 , dimension: function () {
68 var hasWidth = this.$element.hasClass('width')
69 return hasWidth ? 'width' : 'height'
70 }
71
72 , show: function () {
73 var dimension
74 , scroll
75 , actives
76 , hasData
77
78 if (this.transitioning) return
79
80 dimension = this.dimension()
81 scroll = $.camelCase(['scroll', dimension].join('-'))
82 actives = this.$parent && this.$parent.find('> .accordion-group > .in')
83
84 if (actives && actives.length) {
85 hasData = actives.data('collapse')
86 if (hasData && hasData.transitioning) return
87 actives.collapse('hide')
88 hasData || actives.data('collapse', null)
89 }
90
91 this.$element[dimension](0)
92 this.transition('addClass', $.Event('show'), 'shown')
93 $.support.transition && this.$element[dimension](this.$element[0][scroll])
94 }
95
96 , hide: function () {
97 var dimension
98 if (this.transitioning) return
99 dimension = this.dimension()
100 this.reset(this.$element[dimension]())
101 this.transition('removeClass', $.Event('hide'), 'hidden')
102 this.$element[dimension](0)
103 }
104
105 , reset: function (size) {
106 var dimension = this.dimension()
107
108 this.$element
109 .removeClass('collapse')
110 [dimension](size || 'auto')
111 [0].offsetWidth
112
113 this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
114
115 return this
116 }
117
118 , transition: function (method, startEvent, completeEvent) {
119 var that = this
120 , complete = function () {
121 if (startEvent.type == 'show') that.reset()
122 that.transitioning = 0
123 that.$element.trigger(completeEvent)
124 }
125
126 this.$element.trigger(startEvent)
127
128 if (startEvent.isDefaultPrevented()) return
129
130 this.transitioning = 1
131
132 this.$element[method]('in')
133
134 $.support.transition && this.$element.hasClass('collapse') ?
135 this.$element.one($.support.transition.end, complete) :
136 complete()
137 }
138
139 , toggle: function () {
140 this[this.$element.hasClass('in') ? 'hide' : 'show']()
141 }
142
143 }
144
145
146 /* COLLAPSE PLUGIN DEFINITION
147 * ========================== */
148
149 var old = $.fn.collapse
150
151 $.fn.collapse = function (option) {
152 return this.each(function () {
153 var $this = $(this)
154 , data = $this.data('collapse')
155 , options = typeof option == 'object' && option
156 if (!data) $this.data('collapse', (data = new Collapse(this, options)))
157 if (typeof option == 'string') data[option]()
158 })
159 }
160
161 $.fn.collapse.defaults = {
162 toggle: true
163 }
164
165 $.fn.collapse.Constructor = Collapse
166
167
168 /* COLLAPSE NO CONFLICT
169 * ==================== */
170
171 $.fn.collapse.noConflict = function () {
172 $.fn.collapse = old
173 return this
174 }
175
176
177 /* COLLAPSE DATA-API
178 * ================= */
179
180 $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
181 var $this = $(this), href
182 , target = $this.attr('data-target')
183 || e.preventDefault()
184 || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
185 , option = $(target).data('collapse') ? 'toggle' : $this.data()
186 $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
187 $(target).collapse(option)
188 })
189
190}(window.jQuery); \ No newline at end of file
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-dropdown.js b/frontend/gamma/js/Bootstrap/bootstrap-dropdown.js
new file mode 100644
index 0000000..3b77bb3
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-dropdown.js
@@ -0,0 +1,184 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* ============================================================
25 * bootstrap-dropdown.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#dropdowns
27 * ============================================================
28 * Copyright 2012 Twitter, Inc.
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 * ============================================================ */
42
43
44!function ($) {
45
46 "use strict"; // jshint ;_;
47
48
49 /* DROPDOWN CLASS DEFINITION
50 * ========================= */
51
52 var toggle = '[data-toggle=dropdown]'
53 , Dropdown = function (element) {
54 var $el = $(element).on('click.dropdown.data-api', this.toggle)
55 $('html').on('click.dropdown.data-api', function () {
56 $el.parent().removeClass('open')
57 })
58 }
59
60 Dropdown.prototype = {
61
62 constructor: Dropdown
63
64 , toggle: function (e) {
65 var $this = $(this)
66 , $parent
67 , isActive
68
69 if ($this.is('.disabled, :disabled')) return
70
71 $parent = getParent($this)
72
73 isActive = $parent.hasClass('open')
74
75 clearMenus()
76
77 if (!isActive) {
78 $parent.toggleClass('open')
79 }
80
81 $this.focus()
82
83 return false
84 }
85
86 , keydown: function (e) {
87 var $this
88 , $items
89 , $active
90 , $parent
91 , isActive
92 , index
93
94 if (!/(38|40|27)/.test(e.keyCode)) return
95
96 $this = $(this)
97
98 e.preventDefault()
99 e.stopPropagation()
100
101 if ($this.is('.disabled, :disabled')) return
102
103 $parent = getParent($this)
104
105 isActive = $parent.hasClass('open')
106
107 if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
108
109 $items = $('[role=menu] li:not(.divider):visible a', $parent)
110
111 if (!$items.length) return
112
113 index = $items.index($items.filter(':focus'))
114
115 if (e.keyCode == 38 && index > 0) index-- // up
116 if (e.keyCode == 40 && index < $items.length - 1) index++ // down
117 if (!~index) index = 0
118
119 $items
120 .eq(index)
121 .focus()
122 }
123
124 }
125
126 function clearMenus() {
127 $(toggle).each(function () {
128 getParent($(this)).removeClass('open')
129 })
130 }
131
132 function getParent($this) {
133 var selector = $this.attr('data-target')
134 , $parent
135
136 if (!selector) {
137 selector = $this.attr('href')
138 selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
139 }
140
141 $parent = $(selector)
142 $parent.length || ($parent = $this.parent())
143
144 return $parent
145 }
146
147
148 /* DROPDOWN PLUGIN DEFINITION
149 * ========================== */
150
151 var old = $.fn.dropdown
152
153 $.fn.dropdown = function (option) {
154 return this.each(function () {
155 var $this = $(this)
156 , data = $this.data('dropdown')
157 if (!data) $this.data('dropdown', (data = new Dropdown(this)))
158 if (typeof option == 'string') data[option].call($this)
159 })
160 }
161
162 $.fn.dropdown.Constructor = Dropdown
163
164
165 /* DROPDOWN NO CONFLICT
166 * ==================== */
167
168 $.fn.dropdown.noConflict = function () {
169 $.fn.dropdown = old
170 return this
171 }
172
173
174 /* APPLY TO STANDARD DROPDOWN ELEMENTS
175 * =================================== */
176
177 $(document)
178 .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
179 .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
180 .on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() })
181 .on('click.dropdown.data-api touchstart.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
182 .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
183
184}(window.jQuery); \ No newline at end of file
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-modal.js b/frontend/gamma/js/Bootstrap/bootstrap-modal.js
new file mode 100644
index 0000000..fd7e337
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-modal.js
@@ -0,0 +1,268 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* =========================================================
25 * bootstrap-modal.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#modals
27 * =========================================================
28 * Copyright 2012 Twitter, Inc.
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 * ========================================================= */
42
43
44!function ($) {
45
46 "use strict"; // jshint ;_;
47
48
49 /* MODAL CLASS DEFINITION
50 * ====================== */
51
52 var Modal = function (element, options) {
53 this.options = options
54 this.$element = $(element)
55 .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
56 this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
57 }
58
59 Modal.prototype = {
60
61 constructor: Modal
62
63 , toggle: function () {
64 return this[!this.isShown ? 'show' : 'hide']()
65 }
66
67 , show: function () {
68 var that = this
69 , e = $.Event('show')
70
71 this.$element.trigger(e)
72
73 if (this.isShown || e.isDefaultPrevented()) return
74
75 this.isShown = true
76
77 this.escape()
78
79 this.backdrop(function () {
80 var transition = $.support.transition && that.$element.hasClass('fade')
81
82 if (!that.$element.parent().length) {
83 that.$element.appendTo(document.body) //don't move modals dom position
84 }
85
86 that.$element
87 .show()
88
89 if (transition) {
90 that.$element[0].offsetWidth // force reflow
91 }
92
93 that.$element
94 .addClass('in')
95 .attr('aria-hidden', false)
96
97 that.enforceFocus()
98
99 transition ?
100 that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
101 that.$element.focus().trigger('shown')
102
103 })
104 }
105
106 , hide: function (e) {
107 e && e.preventDefault()
108
109 var that = this
110
111 e = $.Event('hide')
112
113 this.$element.trigger(e)
114
115 if (!this.isShown || e.isDefaultPrevented()) return
116
117 this.isShown = false
118
119 this.escape()
120
121 $(document).off('focusin.modal')
122
123 this.$element
124 .removeClass('in')
125 .attr('aria-hidden', true)
126
127 $.support.transition && this.$element.hasClass('fade') ?
128 this.hideWithTransition() :
129 this.hideModal()
130 }
131
132 , enforceFocus: function () {
133 var that = this
134 $(document).on('focusin.modal', function (e) {
135 if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
136 that.$element.focus()
137 }
138 })
139 }
140
141 , escape: function () {
142 var that = this
143 if (this.isShown && this.options.keyboard) {
144 this.$element.on('keyup.dismiss.modal', function ( e ) {
145 e.which == 27 && that.hide()
146 })
147 } else if (!this.isShown) {
148 this.$element.off('keyup.dismiss.modal')
149 }
150 }
151
152 , hideWithTransition: function () {
153 var that = this
154 , timeout = setTimeout(function () {
155 that.$element.off($.support.transition.end)
156 that.hideModal()
157 }, 500)
158
159 this.$element.one($.support.transition.end, function () {
160 clearTimeout(timeout)
161 that.hideModal()
162 })
163 }
164
165 , hideModal: function (that) {
166 this.$element
167 .hide()
168 .trigger('hidden')
169
170 this.backdrop()
171 }
172
173 , removeBackdrop: function () {
174 this.$backdrop.remove()
175 this.$backdrop = null
176 }
177
178 , backdrop: function (callback) {
179 var that = this
180 , animate = this.$element.hasClass('fade') ? 'fade' : ''
181
182 if (this.isShown && this.options.backdrop) {
183 var doAnimate = $.support.transition && animate
184
185 this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
186 .appendTo(document.body)
187
188 this.$backdrop.click(
189 this.options.backdrop == 'static' ?
190 $.proxy(this.$element[0].focus, this.$element[0])
191 : $.proxy(this.hide, this)
192 )
193
194 if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
195
196 this.$backdrop.addClass('in')
197
198 doAnimate ?
199 this.$backdrop.one($.support.transition.end, callback) :
200 callback()
201
202 } else if (!this.isShown && this.$backdrop) {
203 this.$backdrop.removeClass('in')
204
205 $.support.transition && this.$element.hasClass('fade')?
206 this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
207 this.removeBackdrop()
208
209 } else if (callback) {
210 callback()
211 }
212 }
213 }
214
215
216 /* MODAL PLUGIN DEFINITION
217 * ======================= */
218
219 var old = $.fn.modal
220
221 $.fn.modal = function (option) {
222 return this.each(function () {
223 var $this = $(this)
224 , data = $this.data('modal')
225 , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
226 if (!data) $this.data('modal', (data = new Modal(this, options)))
227 if (typeof option == 'string') data[option]()
228 else if (options.show) data.show()
229 })
230 }
231
232 $.fn.modal.defaults = {
233 backdrop: true
234 , keyboard: true
235 , show: true
236 }
237
238 $.fn.modal.Constructor = Modal
239
240
241 /* MODAL NO CONFLICT
242 * ================= */
243
244 $.fn.modal.noConflict = function () {
245 $.fn.modal = old
246 return this
247 }
248
249
250 /* MODAL DATA-API
251 * ============== */
252
253 $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
254 var $this = $(this)
255 , href = $this.attr('href')
256 , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
257 , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
258
259 e.preventDefault()
260
261 $target
262 .modal(option)
263 .one('hide', function () {
264 $this.focus()
265 })
266 })
267
268}(window.jQuery);
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-popover.js b/frontend/gamma/js/Bootstrap/bootstrap-popover.js
new file mode 100644
index 0000000..89e1edb
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-popover.js
@@ -0,0 +1,137 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* ===========================================================
25 * bootstrap-popover.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#popovers
27 * ===========================================================
28 * Copyright 2012 Twitter, Inc.
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 * =========================================================== */
42
43
44!function ($) {
45
46 "use strict"; // jshint ;_;
47
48
49 /* POPOVER PUBLIC CLASS DEFINITION
50 * =============================== */
51
52 var Popover = function (element, options) {
53 this.init('popover', element, options)
54 }
55
56
57 /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
58 ========================================== */
59
60 Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
61
62 constructor: Popover
63
64 , setContent: function () {
65 var $tip = this.tip()
66 , title = this.getTitle()
67 , content = this.getContent()
68
69 $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
70 $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
71
72 $tip.removeClass('fade top bottom left right in')
73 }
74
75 , hasContent: function () {
76 return this.getTitle() || this.getContent()
77 }
78
79 , getContent: function () {
80 var content
81 , $e = this.$element
82 , o = this.options
83
84 content = $e.attr('data-content')
85 || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
86
87 return content
88 }
89
90 , tip: function () {
91 if (!this.$tip) {
92 this.$tip = $(this.options.template)
93 }
94 return this.$tip
95 }
96
97 , destroy: function () {
98 this.hide().$element.off('.' + this.type).removeData(this.type)
99 }
100
101 })
102
103
104 /* POPOVER PLUGIN DEFINITION
105 * ======================= */
106
107 var old = $.fn.popover
108
109 $.fn.popover = function (option) {
110 return this.each(function () {
111 var $this = $(this)
112 , data = $this.data('popover')
113 , options = typeof option == 'object' && option
114 if (!data) $this.data('popover', (data = new Popover(this, options)))
115 if (typeof option == 'string') data[option]()
116 })
117 }
118
119 $.fn.popover.Constructor = Popover
120
121 $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
122 placement: 'right'
123 , trigger: 'click'
124 , content: ''
125 , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"></div></div></div>'
126 })
127
128
129 /* POPOVER NO CONFLICT
130 * =================== */
131
132 $.fn.popover.noConflict = function () {
133 $.fn.popover = old
134 return this
135 }
136
137}(window.jQuery); \ No newline at end of file
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-scrollspy.js b/frontend/gamma/js/Bootstrap/bootstrap-scrollspy.js
new file mode 100644
index 0000000..4366f26
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-scrollspy.js
@@ -0,0 +1,185 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* =============================================================
25 * bootstrap-scrollspy.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#scrollspy
27 * =============================================================
28 * Copyright 2012 Twitter, Inc.
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 * ============================================================== */
42
43
44!function ($) {
45
46 "use strict"; // jshint ;_;
47
48
49 /* SCROLLSPY CLASS DEFINITION
50 * ========================== */
51
52 function ScrollSpy(element, options) {
53 var process = $.proxy(this.process, this)
54 , $element = $(element).is('body') ? $(window) : $(element)
55 , href
56 this.options = $.extend({}, $.fn.scrollspy.defaults, options)
57 this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
58 this.selector = (this.options.target
59 || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
60 || '') + ' .nav li > a'
61 this.$body = $('body')
62 this.refresh()
63 this.process()
64 }
65
66 ScrollSpy.prototype = {
67
68 constructor: ScrollSpy
69
70 , refresh: function () {
71 var self = this
72 , $targets
73
74 this.offsets = $([])
75 this.targets = $([])
76
77 $targets = this.$body
78 .find(this.selector)
79 .map(function () {
80 var $el = $(this)
81 , href = $el.data('target') || $el.attr('href')
82 , $href = /^#\w/.test(href) && $(href)
83 return ( $href
84 && $href.length
85 && [[ $href.position().top + self.$scrollElement.scrollTop(), href ]] ) || null
86 })
87 .sort(function (a, b) { return a[0] - b[0] })
88 .each(function () {
89 self.offsets.push(this[0])
90 self.targets.push(this[1])
91 })
92 }
93
94 , process: function () {
95 var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
96 , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
97 , maxScroll = scrollHeight - this.$scrollElement.height()
98 , offsets = this.offsets
99 , targets = this.targets
100 , activeTarget = this.activeTarget
101 , i
102
103 if (scrollTop >= maxScroll) {
104 return activeTarget != (i = targets.last()[0])
105 && this.activate ( i )
106 }
107
108 for (i = offsets.length; i--;) {
109 activeTarget != targets[i]
110 && scrollTop >= offsets[i]
111 && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
112 && this.activate( targets[i] )
113 }
114 }
115
116 , activate: function (target) {
117 var active
118 , selector
119
120 this.activeTarget = target
121
122 $(this.selector)
123 .parent('.active')
124 .removeClass('active')
125
126 selector = this.selector
127 + '[data-target="' + target + '"],'
128 + this.selector + '[href="' + target + '"]'
129
130 active = $(selector)
131 .parent('li')
132 .addClass('active')
133
134 if (active.parent('.dropdown-menu').length) {
135 active = active.closest('li.dropdown').addClass('active')
136 }
137
138 active.trigger('activate')
139 }
140
141 }
142
143
144 /* SCROLLSPY PLUGIN DEFINITION
145 * =========================== */
146
147 var old = $.fn.scrollspy
148
149 $.fn.scrollspy = function (option) {
150 return this.each(function () {
151 var $this = $(this)
152 , data = $this.data('scrollspy')
153 , options = typeof option == 'object' && option
154 if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
155 if (typeof option == 'string') data[option]()
156 })
157 }
158
159 $.fn.scrollspy.Constructor = ScrollSpy
160
161 $.fn.scrollspy.defaults = {
162 offset: 10
163 }
164
165
166 /* SCROLLSPY NO CONFLICT
167 * ===================== */
168
169 $.fn.scrollspy.noConflict = function () {
170 $.fn.scrollspy = old
171 return this
172 }
173
174
175 /* SCROLLSPY DATA-API
176 * ================== */
177
178 $(window).on('load', function () {
179 $('[data-spy="scroll"]').each(function () {
180 var $spy = $(this)
181 $spy.scrollspy($spy.data())
182 })
183 })
184
185}(window.jQuery); \ No newline at end of file
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-tab.js b/frontend/gamma/js/Bootstrap/bootstrap-tab.js
new file mode 100644
index 0000000..d7c7fc7
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-tab.js
@@ -0,0 +1,167 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* ========================================================
25 * bootstrap-tab.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#tabs
27 * ========================================================
28 * Copyright 2012 Twitter, Inc.
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 * ======================================================== */
42
43
44!function ($) {
45
46 "use strict"; // jshint ;_;
47
48
49 /* TAB CLASS DEFINITION
50 * ==================== */
51
52 var Tab = function (element) {
53 this.element = $(element)
54 }
55
56 Tab.prototype = {
57
58 constructor: Tab
59
60 , show: function () {
61 var $this = this.element
62 , $ul = $this.closest('ul:not(.dropdown-menu)')
63 , selector = $this.attr('data-target')
64 , previous
65 , $target
66 , e
67
68 if (!selector) {
69 selector = $this.attr('href')
70 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
71 }
72
73 if ( $this.parent('li').hasClass('active') ) return
74
75 previous = $ul.find('.active:last a')[0]
76
77 e = $.Event('show', {
78 relatedTarget: previous
79 })
80
81 $this.trigger(e)
82
83 if (e.isDefaultPrevented()) return
84
85 $target = $(selector)
86
87 this.activate($this.parent('li'), $ul)
88 this.activate($target, $target.parent(), function () {
89 $this.trigger({
90 type: 'shown'
91 , relatedTarget: previous
92 })
93 })
94 }
95
96 , activate: function ( element, container, callback) {
97 var $active = container.find('> .active')
98 , transition = callback
99 && $.support.transition
100 && $active.hasClass('fade')
101
102 function next() {
103 $active
104 .removeClass('active')
105 .find('> .dropdown-menu > .active')
106 .removeClass('active')
107
108 element.addClass('active')
109
110 if (transition) {
111 element[0].offsetWidth // reflow for transition
112 element.addClass('in')
113 } else {
114 element.removeClass('fade')
115 }
116
117 if ( element.parent('.dropdown-menu') ) {
118 element.closest('li.dropdown').addClass('active')
119 }
120
121 callback && callback()
122 }
123
124 transition ?
125 $active.one($.support.transition.end, next) :
126 next()
127
128 $active.removeClass('in')
129 }
130 }
131
132
133 /* TAB PLUGIN DEFINITION
134 * ===================== */
135
136 var old = $.fn.tab
137
138 $.fn.tab = function ( option ) {
139 return this.each(function () {
140 var $this = $(this)
141 , data = $this.data('tab')
142 if (!data) $this.data('tab', (data = new Tab(this)))
143 if (typeof option == 'string') data[option]()
144 })
145 }
146
147 $.fn.tab.Constructor = Tab
148
149
150 /* TAB NO CONFLICT
151 * =============== */
152
153 $.fn.tab.noConflict = function () {
154 $.fn.tab = old
155 return this
156 }
157
158
159 /* TAB DATA-API
160 * ============ */
161
162 $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
163 e.preventDefault()
164 $(this).tab('show')
165 })
166
167}(window.jQuery); \ No newline at end of file
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-tooltip.js b/frontend/gamma/js/Bootstrap/bootstrap-tooltip.js
new file mode 100644
index 0000000..bdcff7d
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-tooltip.js
@@ -0,0 +1,310 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* ===========================================================
25 * bootstrap-tooltip.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#tooltips
27 * Inspired by the original jQuery.tipsy by Jason Frame
28 * ===========================================================
29 * Copyright 2012 Twitter, Inc.
30 *
31 * Licensed under the Apache License, Version 2.0 (the "License");
32 * you may not use this file except in compliance with the License.
33 * You may obtain a copy of the License at
34 *
35 * http://www.apache.org/licenses/LICENSE-2.0
36 *
37 * Unless required by applicable law or agreed to in writing, software
38 * distributed under the License is distributed on an "AS IS" BASIS,
39 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
40 * See the License for the specific language governing permissions and
41 * limitations under the License.
42 * ========================================================== */
43
44
45!function ($) {
46
47 "use strict"; // jshint ;_;
48
49
50 /* TOOLTIP PUBLIC CLASS DEFINITION
51 * =============================== */
52
53 var Tooltip = function (element, options) {
54 this.init('tooltip', element, options)
55 }
56
57 Tooltip.prototype = {
58
59 constructor: Tooltip
60
61 , init: function (type, element, options) {
62 var eventIn
63 , eventOut
64
65 this.type = type
66 this.$element = $(element)
67 this.options = this.getOptions(options)
68 this.enabled = true
69
70 if (this.options.trigger == 'click') {
71 this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
72 } else if (this.options.trigger != 'manual') {
73 eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
74 eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
75 this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
76 this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
77 }
78
79 this.options.selector ?
80 (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
81 this.fixTitle()
82 }
83
84 , getOptions: function (options) {
85 options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
86
87 if (options.delay && typeof options.delay == 'number') {
88 options.delay = {
89 show: options.delay
90 , hide: options.delay
91 }
92 }
93
94 return options
95 }
96
97 , enter: function (e) {
98 var self = $(e.currentTarget)[this.type](this._options).data(this.type)
99
100 if (!self.options.delay || !self.options.delay.show) return self.show()
101
102 clearTimeout(this.timeout)
103 self.hoverState = 'in'
104 this.timeout = setTimeout(function() {
105 if (self.hoverState == 'in') self.show()
106 }, self.options.delay.show)
107 }
108
109 , leave: function (e) {
110 var self = $(e.currentTarget)[this.type](this._options).data(this.type)
111
112 if (this.timeout) clearTimeout(this.timeout)
113 if (!self.options.delay || !self.options.delay.hide) return self.hide()
114
115 self.hoverState = 'out'
116 this.timeout = setTimeout(function() {
117 if (self.hoverState == 'out') self.hide()
118 }, self.options.delay.hide)
119 }
120
121 , show: function () {
122 var $tip
123 , inside
124 , pos
125 , actualWidth
126 , actualHeight
127 , placement
128 , tp
129
130 if (this.hasContent() && this.enabled) {
131 $tip = this.tip()
132 this.setContent()
133
134 if (this.options.animation) {
135 $tip.addClass('fade')
136 }
137
138 placement = typeof this.options.placement == 'function' ?
139 this.options.placement.call(this, $tip[0], this.$element[0]) :
140 this.options.placement
141
142 inside = /in/.test(placement)
143
144 $tip
145 .detach()
146 .css({ top: 0, left: 0, display: 'block' })
147 .insertAfter(this.$element)
148
149 pos = this.getPosition(inside)
150
151 actualWidth = $tip[0].offsetWidth
152 actualHeight = $tip[0].offsetHeight
153
154 switch (inside ? placement.split(' ')[1] : placement) {
155 case 'bottom':
156 tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
157 break
158 case 'top':
159 tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
160 break
161 case 'left':
162 tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
163 break
164 case 'right':
165 tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
166 break
167 }
168
169 $tip
170 .offset(tp)
171 .addClass(placement)
172 .addClass('in')
173 }
174 }
175
176 , setContent: function () {
177 var $tip = this.tip()
178 , title = this.getTitle()
179
180 $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
181 $tip.removeClass('fade in top bottom left right')
182 }
183
184 , hide: function () {
185 var that = this
186 , $tip = this.tip()
187
188 $tip.removeClass('in')
189
190 function removeWithAnimation() {
191 var timeout = setTimeout(function () {
192 $tip.off($.support.transition.end).detach()
193 }, 500)
194
195 $tip.one($.support.transition.end, function () {
196 clearTimeout(timeout)
197 $tip.detach()
198 })
199 }
200
201 $.support.transition && this.$tip.hasClass('fade') ?
202 removeWithAnimation() :
203 $tip.detach()
204
205 return this
206 }
207
208 , fixTitle: function () {
209 var $e = this.$element
210 if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
211 $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
212 }
213 }
214
215 , hasContent: function () {
216 return this.getTitle()
217 }
218
219 , getPosition: function (inside) {
220 return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
221 width: this.$element[0].offsetWidth
222 , height: this.$element[0].offsetHeight
223 })
224 }
225
226 , getTitle: function () {
227 var title
228 , $e = this.$element
229 , o = this.options
230
231 title = $e.attr('data-original-title')
232 || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
233
234 return title
235 }
236
237 , tip: function () {
238 return this.$tip = this.$tip || $(this.options.template)
239 }
240
241 , validate: function () {
242 if (!this.$element[0].parentNode) {
243 this.hide()
244 this.$element = null
245 this.options = null
246 }
247 }
248
249 , enable: function () {
250 this.enabled = true
251 }
252
253 , disable: function () {
254 this.enabled = false
255 }
256
257 , toggleEnabled: function () {
258 this.enabled = !this.enabled
259 }
260
261 , toggle: function (e) {
262 var self = $(e.currentTarget)[this.type](this._options).data(this.type)
263 self[self.tip().hasClass('in') ? 'hide' : 'show']()
264 }
265
266 , destroy: function () {
267 this.hide().$element.off('.' + this.type).removeData(this.type)
268 }
269
270 }
271
272
273 /* TOOLTIP PLUGIN DEFINITION
274 * ========================= */
275
276 var old = $.fn.tooltip
277
278 $.fn.tooltip = function ( option ) {
279 return this.each(function () {
280 var $this = $(this)
281 , data = $this.data('tooltip')
282 , options = typeof option == 'object' && option
283 if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
284 if (typeof option == 'string') data[option]()
285 })
286 }
287
288 $.fn.tooltip.Constructor = Tooltip
289
290 $.fn.tooltip.defaults = {
291 animation: true
292 , placement: 'top'
293 , selector: false
294 , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
295 , trigger: 'hover'
296 , title: ''
297 , delay: 0
298 , html: false
299 }
300
301
302 /* TOOLTIP NO CONFLICT
303 * =================== */
304
305 $.fn.tooltip.noConflict = function () {
306 $.fn.tooltip = old
307 return this
308 }
309
310}(window.jQuery); \ No newline at end of file
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-transition.js b/frontend/gamma/js/Bootstrap/bootstrap-transition.js
new file mode 100644
index 0000000..820d232
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-transition.js
@@ -0,0 +1,83 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* ===================================================
25 * bootstrap-transition.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#transitions
27 * ===================================================
28 * Copyright 2012 Twitter, Inc.
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 * ========================================================== */
42
43
44!function ($) {
45
46 "use strict"; // jshint ;_;
47
48
49 /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
50 * ======================================================= */
51
52 $(function () {
53
54 $.support.transition = (function () {
55
56 var transitionEnd = (function () {
57
58 var el = document.createElement('bootstrap')
59 , transEndEventNames = {
60 'WebkitTransition' : 'webkitTransitionEnd'
61 , 'MozTransition' : 'transitionend'
62 , 'OTransition' : 'oTransitionEnd otransitionend'
63 , 'transition' : 'transitionend'
64 }
65 , name
66
67 for (name in transEndEventNames){
68 if (el.style[name] !== undefined) {
69 return transEndEventNames[name]
70 }
71 }
72
73 }())
74
75 return transitionEnd && {
76 end: transitionEnd
77 }
78
79 })()
80
81 })
82
83}(window.jQuery); \ No newline at end of file
diff --git a/frontend/gamma/js/Bootstrap/bootstrap-typeahead.js b/frontend/gamma/js/Bootstrap/bootstrap-typeahead.js
new file mode 100644
index 0000000..d3d8d32
--- a/dev/null
+++ b/frontend/gamma/js/Bootstrap/bootstrap-typeahead.js
@@ -0,0 +1,346 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/* =============================================================
25 * bootstrap-typeahead.js v2.2.2
26 * http://twitter.github.com/bootstrap/javascript.html#typeahead
27 * =============================================================
28 * Copyright 2012 Twitter, Inc.
29 *
30 * Licensed under the Apache License, Version 2.0 (the "License");
31 * you may not use this file except in compliance with the License.
32 * You may obtain a copy of the License at
33 *
34 * http://www.apache.org/licenses/LICENSE-2.0
35 *
36 * Unless required by applicable law or agreed to in writing, software
37 * distributed under the License is distributed on an "AS IS" BASIS,
38 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 * See the License for the specific language governing permissions and
40 * limitations under the License.
41 * ============================================================ */
42
43
44!function($){
45
46 "use strict"; // jshint ;_;
47
48
49 /* TYPEAHEAD PUBLIC CLASS DEFINITION
50 * ================================= */
51
52 var Typeahead = function (element, options) {
53 this.$element = $(element)
54 this.options = $.extend({}, $.fn.typeahead.defaults, options)
55 this.matcher = this.options.matcher || this.matcher
56 this.sorter = this.options.sorter || this.sorter
57 this.highlighter = this.options.highlighter || this.highlighter
58 this.updater = this.options.updater || this.updater
59 this.source = this.options.source
60 this.$menu = $(this.options.menu)
61 this.shown = false
62 this.listen()
63 }
64
65 Typeahead.prototype = {
66
67 constructor: Typeahead
68
69 , select: function () {
70 var val = this.$menu.find('.active').attr('data-value')
71 this.$element
72 .val(this.updater(val))
73 .change()
74 return this.hide()
75 }
76
77 , updater: function (item) {
78 return item
79 }
80
81 , show: function () {
82 var pos = $.extend({}, this.$element.position(), {
83 height: this.$element[0].offsetHeight
84 })
85
86 this.$menu
87 .insertAfter(this.$element)
88 .css({
89 top: pos.top + pos.height
90 , left: pos.left
91 })
92 .show()
93
94 this.shown = true
95 return this
96 }
97
98 , hide: function () {
99 this.$menu.hide()
100 this.shown = false
101 return this
102 }
103
104 , lookup: function (event) {
105 var items
106
107 this.query = this.$element.val()
108
109 if (!this.query || this.query.length < this.options.minLength) {
110 return this.shown ? this.hide() : this
111 }
112
113 items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
114
115 return items ? this.process(items) : this
116 }
117
118 , process: function (items) {
119 var that = this
120
121 items = $.grep(items, function (item) {
122 return that.matcher(item)
123 })
124
125 items = this.sorter(items)
126
127 if (!items.length) {
128 return this.shown ? this.hide() : this
129 }
130
131 return this.render(items.slice(0, this.options.items)).show()
132 }
133
134 , matcher: function (item) {
135 return ~item.toLowerCase().indexOf(this.query.toLowerCase())
136 }
137
138 , sorter: function (items) {
139 var beginswith = []
140 , caseSensitive = []
141 , caseInsensitive = []
142 , item
143
144 while (item = items.shift()) {
145 if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
146 else if (~item.indexOf(this.query)) caseSensitive.push(item)
147 else caseInsensitive.push(item)
148 }
149
150 return beginswith.concat(caseSensitive, caseInsensitive)
151 }
152
153 , highlighter: function (item) {
154 var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
155 return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
156 return '<strong>' + match + '</strong>'
157 })
158 }
159
160 , render: function (items) {
161 var that = this
162
163 items = $(items).map(function (i, item) {
164 i = $(that.options.item).attr('data-value', item)
165 i.find('a').html(that.highlighter(item))
166 return i[0]
167 })
168
169 items.first().addClass('active')
170 this.$menu.html(items)
171 return this
172 }
173
174 , next: function (event) {
175 var active = this.$menu.find('.active').removeClass('active')
176 , next = active.next()
177
178 if (!next.length) {
179 next = $(this.$menu.find('li')[0])
180 }
181
182 next.addClass('active')
183 }
184
185 , prev: function (event) {
186 var active = this.$menu.find('.active').removeClass('active')
187 , prev = active.prev()
188
189 if (!prev.length) {
190 prev = this.$menu.find('li').last()
191 }
192
193 prev.addClass('active')
194 }
195
196 , listen: function () {
197 this.$element
198 .on('blur', $.proxy(this.blur, this))
199 .on('keypress', $.proxy(this.keypress, this))
200 .on('keyup', $.proxy(this.keyup, this))
201
202 if (this.eventSupported('keydown')) {
203 this.$element.on('keydown', $.proxy(this.keydown, this))
204 }
205
206 this.$menu
207 .on('click', $.proxy(this.click, this))
208 .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
209 }
210
211 , eventSupported: function(eventName) {
212 var isSupported = eventName in this.$element
213 if (!isSupported) {
214 this.$element.setAttribute(eventName, 'return;')
215 isSupported = typeof this.$element[eventName] === 'function'
216 }
217 return isSupported
218 }
219
220 , move: function (e) {
221 if (!this.shown) return
222
223 switch(e.keyCode) {
224 case 9: // tab
225 case 13: // enter
226 case 27: // escape
227 e.preventDefault()
228 break
229
230 case 38: // up arrow
231 e.preventDefault()
232 this.prev()
233 break
234
235 case 40: // down arrow
236 e.preventDefault()
237 this.next()
238 break
239 }
240
241 e.stopPropagation()
242 }
243
244 , keydown: function (e) {
245 this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
246 this.move(e)
247 }
248
249 , keypress: function (e) {
250 if (this.suppressKeyPressRepeat) return
251 this.move(e)
252 }
253
254 , keyup: function (e) {
255 switch(e.keyCode) {
256 case 40: // down arrow
257 case 38: // up arrow
258 case 16: // shift
259 case 17: // ctrl
260 case 18: // alt
261 break
262
263 case 9: // tab
264 case 13: // enter
265 if (!this.shown) return
266 this.select()
267 break
268
269 case 27: // escape
270 if (!this.shown) return
271 this.hide()
272 break
273
274 default:
275 this.lookup()
276 }
277
278 e.stopPropagation()
279 e.preventDefault()
280 }
281
282 , blur: function (e) {
283 var that = this
284 setTimeout(function () { that.hide() }, 150)
285 }
286
287 , click: function (e) {
288 e.stopPropagation()
289 e.preventDefault()
290 this.select()
291 }
292
293 , mouseenter: function (e) {
294 this.$menu.find('.active').removeClass('active')
295 $(e.currentTarget).addClass('active')
296 }
297
298 }
299
300
301 /* TYPEAHEAD PLUGIN DEFINITION
302 * =========================== */
303
304 var old = $.fn.typeahead
305
306 $.fn.typeahead = function (option) {
307 return this.each(function () {
308 var $this = $(this)
309 , data = $this.data('typeahead')
310 , options = typeof option == 'object' && option
311 if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
312 if (typeof option == 'string') data[option]()
313 })
314 }
315
316 $.fn.typeahead.defaults = {
317 source: []
318 , items: 8
319 , menu: '<ul class="typeahead dropdown-menu"></ul>'
320 , item: '<li><a href="#"></a></li>'
321 , minLength: 1
322 }
323
324 $.fn.typeahead.Constructor = Typeahead
325
326
327 /* TYPEAHEAD NO CONFLICT
328 * =================== */
329
330 $.fn.typeahead.noConflict = function () {
331 $.fn.typeahead = old
332 return this
333 }
334
335
336 /* TYPEAHEAD DATA-API
337 * ================== */
338
339 $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
340 var $this = $(this)
341 if ($this.data('typeahead')) return
342 e.preventDefault()
343 $this.typeahead($this.data())
344 })
345
346}(window.jQuery);
diff --git a/frontend/gamma/js/Clipperz/Async.js b/frontend/gamma/js/Clipperz/Async.js
index f7a9517..d525453 100644
--- a/frontend/gamma/js/Clipperz/Async.js
+++ b/frontend/gamma/js/Clipperz/Async.js
@@ -1,476 +1,466 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26//Clipperz.Async = MochiKit.Async; 24//Clipperz.Async = MochiKit.Async;
27 25
28 26
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 27if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Async) == 'undefined') { Clipperz.Async = {}; } 28if (typeof(Clipperz.Async) == 'undefined') { Clipperz.Async = {}; }
31 29
32Clipperz.Async.VERSION = "0.1"; 30Clipperz.Async.VERSION = "0.1";
33Clipperz.Async.NAME = "Clipperz.Async"; 31Clipperz.Async.NAME = "Clipperz.Async";
34 32
35Clipperz.Async.Deferred = function(aName, args) { 33Clipperz.Async.Deferred = function(aName, args) {
36 args = args || {}; 34 args = args || {};
37 35
38 Clipperz.Async.Deferred.superclass.constructor.call(this, args.canceller); 36 Clipperz.Async.Deferred.superclass.constructor.call(this, args.canceller);
39 37
40 this._args = args; 38 this._args = args;
41 this._name = aName || "Anonymous deferred"; 39 this._name = aName || "Anonymous deferred";
42 this._count = 0; 40 this._count = 0;
43 this._shouldTrace = ((CLIPPERZ_DEFERRED_TRACING_ENABLED === true) || (args.trace === true)); 41 this._shouldTrace = ((CLIPPERZ_DEFERRED_TRACING_ENABLED === true) || (args.trace === true));
44 this._vars = null; 42 this._vars = null;
45 43
46 return this; 44 return this;
47} 45}
48 46
49//============================================================================= 47//=============================================================================
50 48
51Clipperz.Base.extend(Clipperz.Async.Deferred, MochiKit.Async.Deferred, { 49Clipperz.Base.extend(Clipperz.Async.Deferred, MochiKit.Async.Deferred, {
52 50
53 'name': function () { 51 'name': function () {
54 return this._name; 52 return this._name;
55 }, 53 },
56 54
57 'args': function () { 55 'args': function () {
58 return this._args; 56 return this._args;
59 }, 57 },
60 58
61 //----------------------------------------------------------------------------- 59 //-----------------------------------------------------------------------------
62 60
63 'callback': function (aValue) { 61 'callback': function (aValue) {
64 if (this._shouldTrace) { 62 if (this._shouldTrace) {
65 //Clipperz.log("CALLBACK " + this._name, aValue); 63 Clipperz.log("CALLBACK " + this._name, aValue);
66 console.log("CALLBACK " + this._name, aValue);
67 } 64 }
68 65
69 if (this.chained == false) { 66 if (this.chained == false) {
70 var message; 67 var message;
71 68
72 message = "ERROR [" + this._name + "]"; 69 message = "ERROR [" + this._name + "]";
73 this.addErrback(function(aResult) { 70 this.addErrback(function(aResult) {
74 if (! (aResult instanceof MochiKit.Async.CancelledError)) { 71 if (! (aResult instanceof MochiKit.Async.CancelledError)) {
75 Clipperz.log(message, aResult); 72 Clipperz.log(message, aResult);
76 } 73 }
77 return aResult; 74 return aResult;
78 }); 75 });
79 76
80 if (this._shouldTrace) { 77 if (this._shouldTrace) {
81 var resultMessage; 78 var resultMessage;
82 79
83 resultMessage = "RESULT " + this._name + " <=="; 80 resultMessage = "RESULT " + this._name + " <==";
84 // this.addCallback(function(aResult) { 81 // this.addCallback(function(aResult) {
85 Clipperz.Async.Deferred.superclass.addCallback.call(this, function(aResult) { 82 Clipperz.Async.Deferred.superclass.addCallback.call(this, function(aResult) {
86 //Clipperz.log(resultMessage, aResult); 83 Clipperz.log(resultMessage, aResult);
87 console.log(resultMessage, aResult);
88
89 return aResult; 84 return aResult;
90 }); 85 });
91 } 86 }
92 } 87 }
93 88
94 if (CLIPPERZ_DEFERRED_CALL_LOGGING_ENABLED === true) { 89 if (CLIPPERZ_DEFERRED_CALL_LOGGING_ENABLED === true) {
95 Clipperz.log("callback " + this._name, this); 90 Clipperz.log("callback " + this._name, this);
96 } 91 }
97 92
98 return Clipperz.Async.Deferred.superclass.callback.apply(this, arguments); 93 return Clipperz.Async.Deferred.superclass.callback.apply(this, arguments);
99 }, 94 },
100 95
101 //----------------------------------------------------------------------------- 96 //-----------------------------------------------------------------------------
102 97
103 'addCallback': function () { 98 'addCallback': function () {
104 var message; 99 var message;
105 100
106 if (this._shouldTrace) { 101 if (this._shouldTrace) {
107 this._count ++; 102 this._count ++;
108 message = "[" + this._count + "] " + this._name + " "; 103 message = "[" + this._count + "] " + this._name + " ";
109 // this.addBoth(function(aResult) {Clipperz.log(message + "-->", aResult); return aResult;}); 104 // this.addBoth(function(aResult) {Clipperz.log(message + "-->", aResult); return aResult;});
110 this.addCallbacks( 105 this.addCallbacks(
111 //function(aResult) {Clipperz.log("-OK- " + message + "-->"/*, aResult*/); return aResult;}, 106 function(aResult) {Clipperz.log("-OK- " + message + "-->"/*, aResult*/); return aResult;},
112 function(aResult) {console.log("-OK- " + message + "-->"/*, aResult*/); return aResult;}, 107 function(aResult) {Clipperz.log("FAIL " + message + "-->"/*, aResult*/); return aResult;}
113 //function(aResult) {Clipperz.log("FAIL " + message + "-->"/*, aResult*/); return aResult;}
114 function(aResult) {console.log("FAIL " + message + "-->"/*, aResult*/); return aResult;}
115 ); 108 );
116 } 109 }
117 110
118 Clipperz.Async.Deferred.superclass.addCallback.apply(this, arguments); 111 Clipperz.Async.Deferred.superclass.addCallback.apply(this, arguments);
119 112
120 if (this._shouldTrace) { 113 if (this._shouldTrace) {
121 // this.addBoth(function(aResult) {Clipperz.log(message + "<--", aResult); return aResult;}); 114 // this.addBoth(function(aResult) {Clipperz.log(message + "<--", aResult); return aResult;});
122 this.addCallbacks( 115 this.addCallbacks(
123 //function(aResult) {Clipperz.log("-OK- " + message + "<--", aResult); return aResult;}, 116 function(aResult) {Clipperz.log("-OK- " + message + "<--", aResult); return aResult;},
124 function(aResult) {console.log("-OK- " + message + "<--", aResult); return aResult;}, 117 function(aResult) {Clipperz.log("FAIL " + message + "<--", aResult); return aResult;}
125 //function(aResult) {Clipperz.log("FAIL " + message + "<--", aResult); return aResult;}
126 function(aResult) {console.log("FAIL " + message + "<--", aResult); return aResult;}
127 ); 118 );
128 } 119 }
129 }, 120 },
130 121
131 //============================================================================= 122 //=============================================================================
132 123
133 'addCallbackPass': function() { 124 'addCallbackPass': function() {
134 var passFunction; 125 var passFunction;
135 126
136 passFunction = MochiKit.Base.partial.apply(null, arguments); 127 passFunction = MochiKit.Base.partial.apply(null, arguments);
137 128
138 this.addCallback(function() { 129 this.addCallback(function() {
139 var result; 130 var result;
140 131
141 result = arguments[arguments.length -1]; 132 result = arguments[arguments.length -1];
142 passFunction(); 133 passFunction();
143 134
144 return result; 135 return result;
145 }); 136 });
146 }, 137 },
147 138
148 //----------------------------------------------------------------------------- 139 //-----------------------------------------------------------------------------
149 140
150 'addErrbackPass': function() { 141 'addErrbackPass': function() {
151 var passFunction; 142 var passFunction;
152 143
153 passFunction = MochiKit.Base.partial.apply(null, arguments); 144 passFunction = MochiKit.Base.partial.apply(null, arguments);
154 145
155 this.addErrback(function() { 146 this.addErrback(function() {
156 var result; 147 var result;
157 148
158 result = arguments[arguments.length -1]; 149 result = arguments[arguments.length -1];
159 passFunction(); 150 passFunction();
160 151
161 return result; 152 return result;
162 }); 153 });
163 }, 154 },
164 155
165 //----------------------------------------------------------------------------- 156 //-----------------------------------------------------------------------------
166 157
167 'addBothPass': function() { 158 'addBothPass': function() {
168 var passFunction; 159 var passFunction;
169 160
170 passFunction = MochiKit.Base.partial.apply(null, arguments); 161 passFunction = MochiKit.Base.partial.apply(null, arguments);
171 162
172 this.addBoth(function() { 163 this.addBoth(function() {
173 var result; 164 var result;
174 165
175 result = arguments[arguments.length -1]; 166 result = arguments[arguments.length -1];
176 passFunction(); 167 passFunction();
177 168
178 return result; 169 return result;
179 }); 170 });
180 }, 171 },
181 172
182 //----------------------------------------------------------------------------- 173 //-----------------------------------------------------------------------------
183 174
184 'addIf': function (aThenBlock, anElseBlock) { 175 'addIf': function (aThenBlock, anElseBlock) {
185 this.addCallback(MochiKit.Base.bind(function (aValue) { 176 this.addCallback(MochiKit.Base.bind(function (aValue) {
186 var deferredResult; 177 var deferredResult;
187 178
188 if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) { 179 if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) {
189 deferredResult = Clipperz.Async.callbacks(this._name + " <then>", aThenBlock, null, aValue); 180 deferredResult = Clipperz.Async.callbacks(this._name + " <then>", aThenBlock, null, aValue);
190 } else { 181 } else {
191 deferredResult = Clipperz.Async.callbacks(this._name + " <else>", anElseBlock, null, aValue); 182 deferredResult = Clipperz.Async.callbacks(this._name + " <else>", anElseBlock, null, aValue);
192 } 183 }
193 184
194 return deferredResult; 185 return deferredResult;
195 })) 186 }))
196 }, 187 },
197 188
198 //----------------------------------------------------------------------------- 189 //-----------------------------------------------------------------------------
199 190
200 'addMethod': function () { 191 'addMethod': function () {
201 this.addCallback(MochiKit.Base.method.apply(this, arguments)); 192 this.addCallback(MochiKit.Base.method.apply(this, arguments));
202 }, 193 },
203 194
204 //----------------------------------------------------------------------------- 195 //-----------------------------------------------------------------------------
205 196
206 'addMethodcaller': function () { 197 'addMethodcaller': function () {
207 this.addCallback(MochiKit.Base.methodcaller.apply(this, arguments)); 198 this.addCallback(MochiKit.Base.methodcaller.apply(this, arguments));
208 }, 199 },
209 200
210 //============================================================================= 201 //=============================================================================
211 202
212 'addLog': function (aLog) { 203 'addLog': function (aLog) {
213 if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) { 204 if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) {
214 this.addBothPass(function(res) {Clipperz.log(aLog + " ", res);}); 205 this.addBothPass(function(res) {Clipperz.log(aLog + " ", res);});
215 // this.addBothPass(function(res) {console.log(aLog + " ", res);});
216 } 206 }
217 }, 207 },
218 208
219 //============================================================================= 209 //=============================================================================
220 210
221 'acquireLock': function (aLock) { 211 'acquireLock': function (aLock) {
222 // this.addCallback(function (aResult) { 212 // this.addCallback(function (aResult) {
223 // return Clipperz.Async.callbacks("Clipperz.Async.acquireLock", [ 213 // return Clipperz.Async.callbacks("Clipperz.Async.acquireLock", [
224 // MochiKit.Base.method(aLock, 'acquire'), 214 // MochiKit.Base.method(aLock, 'acquire'),
225 // MochiKit.Base.partial(MochiKit.Async.succeed, aResult) 215 // MochiKit.Base.partial(MochiKit.Async.succeed, aResult)
226 // ], {trace:false}); 216 // ], {trace:false});
227 // }); 217 // });
228 218
229 this.addCallback(MochiKit.Base.method(aLock, 'acquire')); 219 this.addCallback(MochiKit.Base.method(aLock, 'acquire'));
230 }, 220 },
231 221
232 'releaseLock': function (aLock) { 222 'releaseLock': function (aLock) {
233 // this.addCallback(function (aResult) { 223 // this.addCallback(function (aResult) {
234 // return Clipperz.Async.callbacks("Clipperz.Async.release <ok>", [ 224 // return Clipperz.Async.callbacks("Clipperz.Async.release <ok>", [
235 // MochiKit.Base.method(aLock, 'release'), 225 // MochiKit.Base.method(aLock, 'release'),
236 // MochiKit.Base.partial(MochiKit.Async.succeed, aResult) 226 // MochiKit.Base.partial(MochiKit.Async.succeed, aResult)
237 // ], {trace:false}); 227 // ], {trace:false});
238 // }); 228 // });
239 // this.addErrback(function (aResult) { 229 // this.addErrback(function (aResult) {
240///console.log("releaseLock.addErrback:", aResult); 230///Clipperz.log("releaseLock.addErrback:", aResult);
241 // return Clipperz.Async.callbacks("Clipperz.Async.release <fail>", [ 231 // return Clipperz.Async.callbacks("Clipperz.Async.release <fail>", [
242 // MochiKit.Base.method(aLock, 'release'), 232 // MochiKit.Base.method(aLock, 'release'),
243 // MochiKit.Base.partial(MochiKit.Async.fail, aResult) 233 // MochiKit.Base.partial(MochiKit.Async.fail, aResult)
244 // ], {trace:false}); 234 // ], {trace:false});
245 // }); 235 // });
246 236
247 // this.addBothPass(MochiKit.Base.method(aLock, 'release')); 237 // this.addBothPass(MochiKit.Base.method(aLock, 'release'));
248 this.addCallbackPass(MochiKit.Base.method(aLock, 'release')); 238 this.addCallbackPass(MochiKit.Base.method(aLock, 'release'));
249 this.addErrback(function (anError) { 239 this.addErrback(function (anError) {
250 aLock.release(); 240 aLock.release();
251 241
252 return anError; 242 return anError;
253 }); 243 });
254 }, 244 },
255 245
256 //============================================================================= 246 //=============================================================================
257 247
258 'collectResults': function (someRequests) { 248 'collectResults': function (someRequests) {
259 this.addCallback(Clipperz.Async.collectResults(this._name + " <collect results>", someRequests, this._args)); 249 this.addCallback(Clipperz.Async.collectResults(this._name + " <collect results>", someRequests, this._args));
260 }, 250 },
261 251
262 'addCallbackList': function (aRequestList) { 252 'addCallbackList': function (aRequestList) {
263 this.addCallback(Clipperz.Async.callbacks, this._name + " <callback list>", aRequestList, this._args); 253 this.addCallback(Clipperz.Async.callbacks, this._name + " <callback list>", aRequestList, this._args);
264 }, 254 },
265 255
266 //============================================================================= 256 //=============================================================================
267 257
268 'vars': function () { 258 'vars': function () {
269 if (this._vars == null) { 259 if (this._vars == null) {
270 this._vars = {} 260 this._vars = {}
271 } 261 }
272 262
273 return this._vars; 263 return this._vars;
274 }, 264 },
275 265
276 'setValue': function (aKey) { 266 'setValue': function (aKey) {
277 this.addCallback(MochiKit.Base.bind(function (aValue) { 267 this.addCallback(MochiKit.Base.bind(function (aValue) {
278 this.vars()[aKey] = aValue; 268 this.vars()[aKey] = aValue;
279 return aValue; 269 return aValue;
280 }, this)); 270 }, this));
281 }, 271 },
282 272
283 'getValue': function (aKey) { 273 'getValue': function (aKey) {
284 this.addCallback(MochiKit.Base.bind(function () { 274 this.addCallback(MochiKit.Base.bind(function () {
285 return this.vars()[aKey]; 275 return this.vars()[aKey];
286 }, this)); 276 }, this));
287 }, 277 },
288 278
289 //============================================================================= 279 //=============================================================================
290 280
291 __syntaxFix__: "syntax fix" 281 __syntaxFix__: "syntax fix"
292}); 282});
293 283
294//############################################################################# 284//#############################################################################
295 285
296Clipperz.Async.DeferredSynchronizer = function(aName, someMethods) { 286Clipperz.Async.DeferredSynchronizer = function(aName, someMethods) {
297 this._name = aName || "Anonymous deferred Synchronizer"; 287 this._name = aName || "Anonymous deferred Synchronizer";
298 this._methods = someMethods; 288 this._methods = someMethods;
299 289
300 this._numberOfMethodsDone= 0; 290 this._numberOfMethodsDone= 0;
301 this._methodResults = []; 291 this._methodResults = [];
302 292
303 this._result = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer # " + this.name(), {trace:false}); 293 this._result = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer # " + this.name(), {trace:false});
304 this._result.addMethod(this, 'methodResults'); 294 this._result.addMethod(this, 'methodResults');
305 this._result.addCallback(function(someResults) { 295 this._result.addCallback(function(someResults) {
306 varcancels; 296 varcancels;
307 var errors; 297 var errors;
308 var result; 298 var result;
309 299
310 cancels = MochiKit.Base.filter(function(aResult) { return (aResult instanceof MochiKit.Async.CancelledError)}, someResults); 300 cancels = MochiKit.Base.filter(function(aResult) { return (aResult instanceof MochiKit.Async.CancelledError)}, someResults);
311 301
312 if (cancels.length == 0) { 302 if (cancels.length == 0) {
313 errors = MochiKit.Base.filter(function(aResult) { return (aResult instanceof Error)}, someResults); 303 errors = MochiKit.Base.filter(function(aResult) { return (aResult instanceof Error)}, someResults);
314 304
315 if (errors.length == 0) { 305 if (errors.length == 0) {
316 // result = MochiKit.Async.succeed(someResults); 306 // result = MochiKit.Async.succeed(someResults);
317 result = someResults; 307 result = someResults;
318 } else { 308 } else {
319 result = MochiKit.Async.fail(someResults); 309 result = MochiKit.Async.fail(someResults);
320 } 310 }
321 } else { 311 } else {
322 result = MochiKit.Async.fail(cancels[0]); 312 result = MochiKit.Async.fail(cancels[0]);
323 } 313 }
324 314
325 return result; 315 return result;
326 }/*, this._methodResults */); 316 }/*, this._methodResults */);
327 317
328 return this; 318 return this;
329} 319}
330 320
331MochiKit.Base.update(Clipperz.Async.DeferredSynchronizer.prototype, { 321MochiKit.Base.update(Clipperz.Async.DeferredSynchronizer.prototype, {
332 322
333 //----------------------------------------------------------------------------- 323 //-----------------------------------------------------------------------------
334 324
335 'name': function() { 325 'name': function() {
336 return this._name; 326 return this._name;
337 }, 327 },
338 328
339 //----------------------------------------------------------------------------- 329 //-----------------------------------------------------------------------------
340 330
341 'methods': function() { 331 'methods': function() {
342 return this._methods; 332 return this._methods;
343 }, 333 },
344 334
345 'methodResults': function() { 335 'methodResults': function() {
346 return this._methodResults; 336 return this._methodResults;
347 }, 337 },
348 338
349 //----------------------------------------------------------------------------- 339 //-----------------------------------------------------------------------------
350 340
351 'result': function() { 341 'result': function() {
352 return this._result; 342 return this._result;
353 }, 343 },
354 344
355 //----------------------------------------------------------------------------- 345 //-----------------------------------------------------------------------------
356 346
357 'numberOfMethodsDone':function() { 347 'numberOfMethodsDone':function() {
358 return this._numberOfMethodsDone; 348 return this._numberOfMethodsDone;
359 }, 349 },
360 350
361 'incrementNumberOfMethodsDone': function() { 351 'incrementNumberOfMethodsDone': function() {
362 this._numberOfMethodsDone ++; 352 this._numberOfMethodsDone ++;
363 }, 353 },
364 354
365 //----------------------------------------------------------------------------- 355 //-----------------------------------------------------------------------------
366 356
367 'run': function(args, aValue) { 357 'run': function(args, aValue) {
368 var deferredResults; 358 var deferredResults;
369 var i, c; 359 var i, c;
370 360
371 deferredResults = []; 361 deferredResults = [];
372 args = args || {}; 362 args = args || {};
373 363
374 c = this.methods().length; 364 c = this.methods().length;
375 for (i=0; i<c; i++) { 365 for (i=0; i<c; i++) {
376 var deferredResult; 366 var deferredResult;
377 varmethodCalls; 367 varmethodCalls;
378 var ii, cc; 368 var ii, cc;
379 369
380//console.log("TYPEOF", typeof(this.methods()[i])); 370//Clipperz.log("TYPEOF", typeof(this.methods()[i]));
381 if (typeof(this.methods()[i]) == 'function') { 371 if (typeof(this.methods()[i]) == 'function') {
382 methodCalls = [ this.methods()[i] ]; 372 methodCalls = [ this.methods()[i] ];
383 } else { 373 } else {
384 methodCalls = this.methods()[i]; 374 methodCalls = this.methods()[i];
385 } 375 }
386 376
387 cc = methodCalls.length; 377 cc = methodCalls.length;
388 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer.run => " + this.name() + "[" + i + "]", args); 378 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer.run => " + this.name() + "[" + i + "]", args);
389 for (ii=0; ii<cc; ii++) { 379 for (ii=0; ii<cc; ii++) {
390 deferredResult.addCallback(methodCalls[ii]); 380 deferredResult.addCallback(methodCalls[ii]);
391 } 381 }
392 deferredResult.addBoth(MochiKit.Base.method(this, 'handleMethodCallDone', i)); 382 deferredResult.addBoth(MochiKit.Base.method(this, 'handleMethodCallDone', i));
393 383
394 deferredResults.push(deferredResult); 384 deferredResults.push(deferredResult);
395 } 385 }
396 386
397 for (i=0; i<c; i++) { 387 for (i=0; i<c; i++) {
398 deferredResults[i].callback(aValue); 388 deferredResults[i].callback(aValue);
399 } 389 }
400 390
401 return this.result(); 391 return this.result();
402 }, 392 },
403 393
404 //----------------------------------------------------------------------------- 394 //-----------------------------------------------------------------------------
405 395
406 'handleMethodCallDone': function(anIndexValue, aResult) { 396 'handleMethodCallDone': function(anIndexValue, aResult) {
407 this.incrementNumberOfMethodsDone(); 397 this.incrementNumberOfMethodsDone();
408 this.methodResults()[anIndexValue] = aResult; 398 this.methodResults()[anIndexValue] = aResult;
409 399
410 if (this.numberOfMethodsDone() < this.methods().length) { 400 if (this.numberOfMethodsDone() < this.methods().length) {
411 //nothing to do here other than possibly log something 401 //nothing to do here other than possibly log something
412 } else if (this.numberOfMethodsDone() == this.methods().length) { 402 } else if (this.numberOfMethodsDone() == this.methods().length) {
413 this.result().callback(); 403 this.result().callback();
414 } else if (this.numberOfMethodsDone() > this.methods().length) { 404 } else if (this.numberOfMethodsDone() > this.methods().length) {
415 alert("Clipperz.Async.Deferred.handleMethodCallDone -> WTF!"); 405 alert("Clipperz.Async.Deferred.handleMethodCallDone -> WTF!");
416 //WTF!!! :( 406 //WTF!!! :(
417 } 407 }
418 408
419 }, 409 },
420 410
421 //----------------------------------------------------------------------------- 411 //-----------------------------------------------------------------------------
422 412
423 __syntaxFix__: "syntax fix" 413 __syntaxFix__: "syntax fix"
424}); 414});
425 415
426//############################################################################# 416//#############################################################################
427 417
428MochiKit.Base.update(Clipperz.Async, { 418MochiKit.Base.update(Clipperz.Async, {
429 419
430 'callbacks': function (aName, someFunctions, someArguments, aCallbackValue) { 420 'callbacks': function (aName, someFunctions, someArguments, aCallbackValue) {
431 var deferredResult; 421 var deferredResult;
432 var i, c; 422 var i, c;
433 423
434 deferredResult = new Clipperz.Async.Deferred(aName, someArguments); 424 deferredResult = new Clipperz.Async.Deferred(aName, someArguments);
435 c = someFunctions.length; 425 c = someFunctions.length;
436 for (i=0; i<c; i++) { 426 for (i=0; i<c; i++) {
437 deferredResult.addCallback(someFunctions[i]); 427 deferredResult.addCallback(someFunctions[i]);
438 } 428 }
439 deferredResult.callback(aCallbackValue); 429 deferredResult.callback(aCallbackValue);
440 430
441 return deferredResult; 431 return deferredResult;
442 }, 432 },
443 433
444 //------------------------------------------------------------------------- 434 //-------------------------------------------------------------------------
445 435
446 'forkAndJoin': function (aName, someMethods, args) { 436 'forkAndJoin': function (aName, someMethods, args) {
447 return MochiKit.Base.partial(function (aName, someMethods, args, aValue) { 437 return MochiKit.Base.partial(function (aName, someMethods, args, aValue) {
448 var synchronizer; 438 var synchronizer;
449 varresult; 439 varresult;
450 440
451 args = args || {}; 441 args = args || {};
452 synchronizer = new Clipperz.Async.DeferredSynchronizer(aName, someMethods); 442 synchronizer = new Clipperz.Async.DeferredSynchronizer(aName, someMethods);
453 result = synchronizer.run(args, aValue); 443 result = synchronizer.run(args, aValue);
454 444
455 return result; 445 return result;
456 }, aName, someMethods, args); 446 }, aName, someMethods, args);
457 }, 447 },
458 448
459 //------------------------------------------------------------------------- 449 //-------------------------------------------------------------------------
460 450
461 'collectResults': function(aName, someRequests, args) { 451 'collectResults': function(aName, someRequests, args) {
462 return MochiKit.Base.partial(function(aName, someRequests, args, aValue) { 452 return MochiKit.Base.partial(function(aName, someRequests, args, aValue) {
463 var deferredResult; 453 var deferredResult;
464 var requestKeys; 454 var requestKeys;
465 var methods; 455 var methods;
466 456
467 requestKeys = MochiKit.Base.keys(someRequests); 457 requestKeys = MochiKit.Base.keys(someRequests);
468 methods = MochiKit.Base.values(someRequests); 458 methods = MochiKit.Base.values(someRequests);
469 459
470 deferredResult = new Clipperz.Async.Deferred(aName, args); 460 deferredResult = new Clipperz.Async.Deferred(aName, args);
471 deferredResult.addCallback(Clipperz.Async.forkAndJoin(aName + " [inner forkAndJoin]", methods, args)); 461 deferredResult.addCallback(Clipperz.Async.forkAndJoin(aName + " [inner forkAndJoin]", methods, args));
472 deferredResult.addBoth(function(someResults) { 462 deferredResult.addBoth(function(someResults) {
473 var returnFunction; 463 var returnFunction;
474 var results; 464 var results;
475 var i,c; 465 var i,c;
476 var result; 466 var result;
@@ -544,168 +534,168 @@ MochiKit.Base.update(Clipperz.Async, {
544 }, 534 },
545 535
546 //------------------------------------------------------------------------- 536 //-------------------------------------------------------------------------
547 537
548 'deferredIf': function (aName, aThenBlock, anElseBlock) { 538 'deferredIf': function (aName, aThenBlock, anElseBlock) {
549 return function (aValue) { 539 return function (aValue) {
550 var deferredResult; 540 var deferredResult;
551 541
552 if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) { 542 if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) {
553 deferredResult = Clipperz.Async.callbacks(aName + " <then>", aThenBlock, null, aValue); 543 deferredResult = Clipperz.Async.callbacks(aName + " <then>", aThenBlock, null, aValue);
554 } else { 544 } else {
555 deferredResult = Clipperz.Async.callbacks(aName + " <else>", anElseBlock, null, aValue); 545 deferredResult = Clipperz.Async.callbacks(aName + " <else>", anElseBlock, null, aValue);
556 } 546 }
557 547
558 return deferredResult; 548 return deferredResult;
559 } 549 }
560 }, 550 },
561 551
562 //------------------------------------------------------------------------- 552 //-------------------------------------------------------------------------
563 553
564 'log': function(aMessage, aResult) { 554 'log': function(aMessage, aResult) {
565 if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) { 555 if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) {
566 Clipperz.log(aMessage + " ", aResult); 556 Clipperz.log(aMessage + " ", aResult);
567 } 557 }
568 558
569 return aResult; 559 return aResult;
570 }, 560 },
571 561
572 //========================================================================= 562 //=========================================================================
573 563
574 'deferredCompare': function (aComparator, aDeferred, bDeferred) { 564 'deferredCompare': function (aComparator, aDeferred, bDeferred) {
575 var deferredResult; 565 var deferredResult;
576 566
577 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredCompare", {trace:false}); 567 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredCompare", {trace:false});
578 deferredResult.addCallback(Clipperz.Async.collectAll, [aDeferred, bDeferred]); 568 deferredResult.addCallback(Clipperz.Async.collectAll, [aDeferred, bDeferred]);
579 deferredResult.addCallback(function (someResults) { 569 deferredResult.addCallback(function (someResults) {
580 var result; 570 var result;
581 571
582 if (aComparator(someResults[0], someResults[1]) > 0) { 572 if (aComparator(someResults[0], someResults[1]) > 0) {
583 result = MochiKit.Async.succeed(); 573 result = MochiKit.Async.succeed();
584 } else { 574 } else {
585 result = MochiKit.Async.fail(); 575 result = MochiKit.Async.fail();
586 }; 576 };
587 577
588 return result; 578 return result;
589 }); 579 });
590 deferredResult.callback(); 580 deferredResult.callback();
591 581
592 return deferredResult; 582 return deferredResult;
593 }, 583 },
594 584
595 //------------------------------------------------------------------------- 585 //-------------------------------------------------------------------------
596 586
597 'insertIntoSortedArray': function (anObject, aDeferredComparator, aSortedResult) { 587 'insertIntoSortedArray': function (anObject, aDeferredComparator, aSortedResult) {
598 var deferredResult; 588 var deferredResult;
599 var i, c; 589 var i, c;
600 590
601 if (aSortedResult.length == 0) { 591 if (aSortedResult.length == 0) {
602 deferredResult = MochiKit.Async.succeed([anObject]); 592 deferredResult = MochiKit.Async.succeed([anObject]);
603 } else { 593 } else {
604 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.insertIntoSortedArray", {trace:false}); 594 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.insertIntoSortedArray", {trace:false});
605 c = aSortedResult.length + 1; 595 c = aSortedResult.length + 1;
606 for (i=0; i<c; i++) { 596 for (i=0; i<c; i++) {
607 deferredResult.addCallback(function (aDeferredComparator, aObject, bObject, aContext) { 597 deferredResult.addCallback(function (aDeferredComparator, aObject, bObject, aContext) {
608 var innerDeferredResult; 598 var innerDeferredResult;
609 599
610 innerDeferredResult = new Clipperz.Async.Deferred("Clipperz.Async.insertIntoSortedArray <inner compare>", {trace:false}); 600 innerDeferredResult = new Clipperz.Async.Deferred("Clipperz.Async.insertIntoSortedArray <inner compare>", {trace:false});
611 innerDeferredResult.addCallback(aDeferredComparator, aObject, bObject); 601 innerDeferredResult.addCallback(aDeferredComparator, aObject, bObject);
612 innerDeferredResult.addErrback(MochiKit.Async.fail, aContext); 602 innerDeferredResult.addErrback(MochiKit.Async.fail, aContext);
613 innerDeferredResult.callback(); 603 innerDeferredResult.callback();
614 604
615 return innerDeferredResult; 605 return innerDeferredResult;
616 }, aDeferredComparator, anObject, aSortedResult[i], i); 606 }, aDeferredComparator, anObject, aSortedResult[i], i);
617 } 607 }
618 deferredResult.addMethod(aSortedResult, 'push', anObject); 608 deferredResult.addMethod(aSortedResult, 'push', anObject);
619 deferredResult.addErrback(function (anError) { 609 deferredResult.addErrback(function (anError) {
620 aSortedResult.splice(anError.message, 0, anObject); 610 aSortedResult.splice(anError.message, 0, anObject);
621 }) 611 })
622 deferredResult.addBoth(MochiKit.Async.succeed, aSortedResult); 612 deferredResult.addBoth(MochiKit.Async.succeed, aSortedResult);
623 deferredResult.callback(); 613 deferredResult.callback();
624 } 614 }
625 615
626 return deferredResult; 616 return deferredResult;
627 }, 617 },
628 618
629 //------------------------------------------------------------------------- 619 //-------------------------------------------------------------------------
630 620
631 'deferredSort': function (aDeferredComparator, someObjects) { 621 'deferredSort': function (aDeferredComparator, someObjects) {
632 var deferredResult; 622 var deferredResult;
633 var i, c; 623 var i, c;
634 624
635 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredSort", {trace:false}); 625 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredSort", {trace:false});
636 c = someObjects.length; 626 c = someObjects.length;
637 for (i=0; i<c; i++) { 627 for (i=0; i<c; i++) {
638 deferredResult.addCallback(Clipperz.Async.insertIntoSortedArray, someObjects[i], aDeferredComparator); 628 deferredResult.addCallback(Clipperz.Async.insertIntoSortedArray, someObjects[i], aDeferredComparator);
639 if ((i % 50) == 0) { 629 if ((i % 50) == 0) {
640 //console.log("######### sort wait ##########"); 630 //Clipperz.log("######### sort wait ##########");
641 deferredResult.addCallback(MochiKit.Async.wait, 0.5); 631 deferredResult.addCallback(MochiKit.Async.wait, 0.5);
642 } 632 }
643 } 633 }
644 deferredResult.callback([]); 634 deferredResult.callback([]);
645 635
646 return deferredResult; 636 return deferredResult;
647 }, 637 },
648 638
649 //========================================================================= 639 //=========================================================================
650 640
651 'deferredFilter': function (aFunction, someObjects) { 641 'deferredFilter': function (aFunction, someObjects) {
652 vardeferredResult; 642 vardeferredResult;
653 vari, c; 643 vari, c;
654 644
655 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredFilter", {trace:false}); 645 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredFilter", {trace:false});
656 c = someObjects.length; 646 c = someObjects.length;
657 for (i=0; i<c; i++) { 647 for (i=0; i<c; i++) {
658 deferredResult.addCallback(function (aFunction, anObject, anIndex, aResult) { 648 deferredResult.addCallback(function (aFunction, anObject, anIndex, aResult) {
659 var innerDeferredResult; 649 var innerDeferredResult;
660 650
661 innerDeferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredFilter <inner - " + anIndex + ">", {trace:false}); 651 innerDeferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredFilter <inner - " + anIndex + ">", {trace:false});
662 innerDeferredResult.addCallback(aFunction, anObject); 652 innerDeferredResult.addCallback(aFunction, anObject);
663 innerDeferredResult.addCallback(function (aFilterResult) { 653 innerDeferredResult.addCallback(function (aFilterResult) {
664 if (aFilterResult) { 654 if (aFilterResult) {
665 aResult.push(anObject); 655 aResult.push(anObject);
666 }; 656 };
667 }); 657 });
668 innerDeferredResult.addBoth(MochiKit.Async.succeed, aResult); 658 innerDeferredResult.addBoth(MochiKit.Async.succeed, aResult);
669 innerDeferredResult.callback(); 659 innerDeferredResult.callback();
670 660
671 return innerDeferredResult; 661 return innerDeferredResult;
672 }, aFunction, someObjects[i], i); 662 }, aFunction, someObjects[i], i);
673 } 663 }
674 deferredResult.callback([]); 664 deferredResult.callback([]);
675 665
676 return deferredResult; 666 return deferredResult;
677 }, 667 },
678 668
679 'forEach': function (aFunction) { 669 'forEach': function (aFunction) {
680 return MochiKit.Base.partial(function (aFunction, anIterable) { 670 return MochiKit.Base.partial(function (aFunction, anIterable) {
681 MochiKit.Iter.forEach(anIterable, aFunction); 671 MochiKit.Iter.forEach(anIterable, aFunction);
682 }, aFunction); 672 }, aFunction);
683 }, 673 },
684 674
685 //========================================================================= 675 //=========================================================================
686 676
687 'or': function (someValues) { 677 'or': function (someValues) {
688 return Clipperz.Async.callbacks("Clipperz.Async.or", [ 678 return Clipperz.Async.callbacks("Clipperz.Async.or", [
689 MochiKit.Base.values, 679 MochiKit.Base.values,
690 MochiKit.Base.flattenArguments, 680 MochiKit.Base.flattenArguments,
691//function (aValue) { console.log("Record.hasAnyCleanTextData - flatten", aValue); return aValue; }, 681//function (aValue) { Clipperz.log("Record.hasAnyCleanTextData - flatten", aValue); return aValue; },
692 function(someInnerValues) { 682 function(someInnerValues) {
693 return MochiKit.Iter.some(someInnerValues, MochiKit.Base.operator.identity); 683 return MochiKit.Iter.some(someInnerValues, MochiKit.Base.operator.identity);
694 } 684 }
695 ], {trace:false}, someValues); 685 ], {trace:false}, someValues);
696 }, 686 },
697 687
698 //========================================================================= 688 //=========================================================================
699 689
700 'clearResult': function () {}, 690 'clearResult': function () {},
701 691
702 //========================================================================= 692 //=========================================================================
703 __syntaxFix__: "syntax fix" 693 __syntaxFix__: "syntax fix"
704}); 694});
705 695
706 696
707//############################################################################# 697//#############################################################################
708 698
709CLIPPERZ_DEFERRED_LOGGING_ENABLED = true; 699CLIPPERZ_DEFERRED_LOGGING_ENABLED = true;
710CLIPPERZ_DEFERRED_TRACING_ENABLED = false; 700CLIPPERZ_DEFERRED_TRACING_ENABLED = false;
711CLIPPERZ_DEFERRED_CALL_LOGGING_ENABLED = false; 701CLIPPERZ_DEFERRED_CALL_LOGGING_ENABLED = false;
diff --git a/frontend/gamma/js/Clipperz/Base.js b/frontend/gamma/js/Clipperz/Base.js
index 9d399d9..84b2172 100644
--- a/frontend/gamma/js/Clipperz/Base.js
+++ b/frontend/gamma/js/Clipperz/Base.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.Base) == 'undefined') { Clipperz.Base = {}; } 25if (typeof(Clipperz.Base) == 'undefined') { Clipperz.Base = {}; }
28 26
29Clipperz.Base.VERSION = "0.2"; 27Clipperz.Base.VERSION = "0.2";
30Clipperz.Base.NAME = "Clipperz.Base"; 28Clipperz.Base.NAME = "Clipperz.Base";
31 29
32MochiKit.Base.update(Clipperz.Base, { 30MochiKit.Base.update(Clipperz.Base, {
33 31
34 //------------------------------------------------------------------------- 32 //-------------------------------------------------------------------------
35 33
36 '__repr__': function () { 34 '__repr__': function () {
37 return "[" + this.NAME + " " + this.VERSION + "]"; 35 return "[" + this.NAME + " " + this.VERSION + "]";
38 }, 36 },
39 37
40 //------------------------------------------------------------------------- 38 //-------------------------------------------------------------------------
41 39
42 'toString': function () { 40 'toString': function () {
43 return this.__repr__(); 41 return this.__repr__();
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'itemgetter': function (aKeyPath) { 46 'itemgetter': function (aKeyPath) {
49 // return MochiKit.Base.compose.apply(null, [MochiKit.Base.itemgetter('key3')]); 47 // return MochiKit.Base.compose.apply(null, [MochiKit.Base.itemgetter('key3')]);
50 return MochiKit.Base.compose.apply(null, 48 return MochiKit.Base.compose.apply(null,
51 MochiKit.Base.map( 49 MochiKit.Base.map(
52 MochiKit.Base.itemgetter, 50 MochiKit.Base.itemgetter,
53 MochiKit.Iter.reversed( 51 MochiKit.Iter.reversed(
54 aKeyPath.split('.') 52 aKeyPath.split('.')
55 ) 53 )
56 ) 54 )
57 ); 55 );
58 }, 56 },
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'isUrl': function (aValue) { 60 'isUrl': function (aValue) {
63 return (MochiKit.Base.urlRegExp.test(aValue)); 61 return (MochiKit.Base.urlRegExp.test(aValue));
64 }, 62 },
65 63
66 'isEmail': function (aValue) { 64 'isEmail': function (aValue) {
67 return (MochiKit.Base.emailRegExp.test(aValue)); 65 return (MochiKit.Base.emailRegExp.test(aValue));
68 }, 66 },
69 67
70 //------------------------------------------------------------------------- 68 //-------------------------------------------------------------------------
71 69
72 'caseInsensitiveCompare': function (a, b) { 70 'caseInsensitiveCompare': function (a, b) {
73 return MochiKit.Base.compare(a.toLowerCase(), b.toLowerCase()); 71 return MochiKit.Base.compare(a.toLowerCase(), b.toLowerCase());
74 }, 72 },
75 73
76 'reverseComparator': function (aComparator) { 74 'reverseComparator': function (aComparator) {
77 return MochiKit.Base.compose(function(aResult) { return -aResult; }, aComparator); 75 return MochiKit.Base.compose(function(aResult) { return -aResult; }, aComparator);
78 }, 76 },
79 77
80 'caseInsensitiveKeyComparator': function (aKey) { 78 'caseInsensitiveKeyComparator': function (aKey) {
81 return function (a, b) { 79 return function (a, b) {
82 return MochiKit.Base.compare(a[aKey].toLowerCase(), b[aKey].toLowerCase()); 80 return MochiKit.Base.compare(a[aKey].toLowerCase(), b[aKey].toLowerCase());
83 } 81 }
84 }, 82 },
85 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
86/* 84/*
87 'dependsOn': function(module, deps) { 85 'dependsOn': function(module, deps) {
88 if (!(module in Clipperz)) { 86 if (!(module in Clipperz)) {
89 MochiKit[module] = {}; 87 MochiKit[module] = {};
90 } 88 }
91 89
92 if (typeof(dojo) != 'undefined') { 90 if (typeof(dojo) != 'undefined') {
93 dojo.provide('Clipperz.' + module); 91 dojo.provide('Clipperz.' + module);
94 } 92 }
95 for (var i = 0; i < deps.length; i++) { 93 for (var i = 0; i < deps.length; i++) {
96 if (typeof(dojo) != 'undefined') { 94 if (typeof(dojo) != 'undefined') {
97 dojo.require('Clipperz.' + deps[i]); 95 dojo.require('Clipperz.' + deps[i]);
98 } 96 }
99 if (typeof(JSAN) != 'undefined') { 97 if (typeof(JSAN) != 'undefined') {
100 JSAN.use('Clipperz.' + deps[i], []); 98 JSAN.use('Clipperz.' + deps[i], []);
101 } 99 }
102 if (!(deps[i] in Clipperz)) { 100 if (!(deps[i] in Clipperz)) {
103 throw 'Clipperz.' + module + ' depends on Clipperz.' + deps[i] + '!' 101 throw 'Clipperz.' + module + ' depends on Clipperz.' + deps[i] + '!'
104 } 102 }
105 } 103 }
106 }, 104 },
107*/ 105*/
108 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
109 107
110 'trim': function (aValue) { 108 'trim': function (aValue) {
111 return aValue.replace(/^\s+|\s+$/g, ""); 109 return aValue.replace(/^\s+|\s+$/g, "");
112 }, 110 },
113 111
114 //------------------------------------------------------------------------- 112 //-------------------------------------------------------------------------
115 113
116 'stringToByteArray': function (aValue) { 114 'stringToByteArray': function (aValue) {
117 varresult; 115 varresult;
118 var i, c; 116 var i, c;
@@ -348,186 +346,169 @@ MochiKit.Base.update(Clipperz.Base, {
348 case "array": 346 case "array":
349 case "object": 347 case "object":
350 sHTML += Clipperz.Base.formatJSON(vValue, (sIndent + sIndentStyle)); 348 sHTML += Clipperz.Base.formatJSON(vValue, (sIndent + sIndentStyle));
351 break; 349 break;
352 case "boolean": 350 case "boolean":
353 case "number": 351 case "number":
354 sHTML += vValue.toString(); 352 sHTML += vValue.toString();
355 break; 353 break;
356 case "null": 354 case "null":
357 sHTML += "null"; 355 sHTML += "null";
358 break; 356 break;
359 case "string": 357 case "string":
360 sHTML += ("\"" + vValue + "\""); 358 sHTML += ("\"" + vValue + "\"");
361 break; 359 break;
362 default: 360 default:
363 sHTML += ("TYPEOF: " + typeof(vValue)); 361 sHTML += ("TYPEOF: " + typeof(vValue));
364 } 362 }
365 363
366 // loop 364 // loop
367 iCount++; 365 iCount++;
368 }); 366 });
369 367
370 // close object 368 // close object
371 if (sDataType == "array") { 369 if (sDataType == "array") {
372 sHTML += ("\n" + sIndent + "]"); 370 sHTML += ("\n" + sIndent + "]");
373 } else { 371 } else {
374 sHTML += ("\n" + sIndent + "}"); 372 sHTML += ("\n" + sIndent + "}");
375 } 373 }
376 374
377 // return 375 // return
378 return sHTML; 376 return sHTML;
379 }, 377 },
380 378
381 //------------------------------------------------------------------------- 379 //-------------------------------------------------------------------------
382 380
383 'mergeItems': function (anArrayOfValues) { 381 'mergeItems': function (anArrayOfValues) {
384 var result; 382 var result;
385 var i, c; 383 var i, c;
386 384
387 result = {}; 385 result = {};
388 386
389 c = anArrayOfValues.length; 387 c = anArrayOfValues.length;
390 for (i=0; i<c; i++) { 388 for (i=0; i<c; i++) {
391 result[anArrayOfValues[i][0]] = anArrayOfValues[i][1]; 389 result[anArrayOfValues[i][0]] = anArrayOfValues[i][1];
392 } 390 }
393 391
394 return result; 392 return result;
395 }, 393 },
396 394
397 //------------------------------------------------------------------------- 395 //-------------------------------------------------------------------------
398 396
399 'map': function (fn, lstObj/*, lst... */) { 397 'map': function (fn, lstObj/*, lst... */) {
400 var result; 398 var result;
401 399
402 if (MochiKit.Base.isArrayLike(lstObj)) { 400 if (MochiKit.Base.isArrayLike(lstObj)) {
403 result = MochiKit.Base.map.apply(this, arguments); 401 result = MochiKit.Base.map.apply(this, arguments);
404 } else { 402 } else {
405 varkeys; 403 varkeys;
406 var values; 404 var values;
407 var computedValues; 405 var computedValues;
408 406
409 keys = MochiKit.Base.keys(lstObj); 407 keys = MochiKit.Base.keys(lstObj);
410 values = MochiKit.Base.values(lstObj); 408 values = MochiKit.Base.values(lstObj);
411 computedValues = MochiKit.Base.map(fn, values); 409 computedValues = MochiKit.Base.map(fn, values);
412 410
413 result = Clipperz.Base.mergeItems(MochiKit.Base.zip(keys, computedValues)); 411 result = Clipperz.Base.mergeItems(MochiKit.Base.zip(keys, computedValues));
414 } 412 }
415 413
416 return result; 414 return result;
417 }, 415 },
418 416
419 //------------------------------------------------------------------------- 417 //-------------------------------------------------------------------------
420 418
421 'sanitizeString': function(aValue) { 419 'sanitizeString': function(aValue) {
422 var result; 420 var result;
423 421
424 if (Clipperz.Base.objectType(aValue) == 'string') { 422 if (Clipperz.Base.objectType(aValue) == 'string') {
425 result = aValue; 423 result = aValue;
426 result = result.replace(/</img,"&lt;"); 424 result = result.replace(/</img,"&lt;");
427 result = result.replace(/>/img,"&gt;"); 425 result = result.replace(/>/img,"&gt;");
428 } else { 426 } else {
429 result = aValue; 427 result = aValue;
430 } 428 }
431 429
432 return result; 430 return result;
433 }, 431 },
434 432
435 //------------------------------------------------------------------------- 433 //-------------------------------------------------------------------------
436 434
437 'module': function(aValue) { 435 'module': function(aValue) {
438 // aValue = 'Clipperz.PM.Compact' 436 // aValue = 'Clipperz.PM.Compact'
439// 437//
440 // if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 438 // if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
441 // if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 439 // if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
442 // if (typeof(Clipperz.PM.UI.Common.Components) == 'undefined') { Clipperz.PM.UI.Common.Components = {}; } 440 // if (typeof(Clipperz.PM.UI.Common.Components) == 'undefined') { Clipperz.PM.UI.Common.Components = {}; }
443 441
444//console.log(">>> module: " + aValue);
445 var currentScope; 442 var currentScope;
446 var pathElements; 443 var pathElements;
447 var i,c; 444 var i,c;
448 445
449 currentScope = window; 446 currentScope = window;
450 pathElements = aValue.split('.'); 447 pathElements = aValue.split('.');
451 c = pathElements.length; 448 c = pathElements.length;
452 for (i=0; i<c; i++) { 449 for (i=0; i<c; i++) {
453//console.log("--- current path element: " + pathElements[i]);
454//console.log("--- current scope", currentScope);
455 if (typeof(currentScope[pathElements[i]]) == 'undefined') { 450 if (typeof(currentScope[pathElements[i]]) == 'undefined') {
456 currentScope[pathElements[i]] = {}; 451 currentScope[pathElements[i]] = {};
457 } 452 }
458 453
459 currentScope = currentScope[pathElements[i]]; 454 currentScope = currentScope[pathElements[i]];
460 } 455 }
461 }, 456 },
462 457
463 //------------------------------------------------------------------------- 458 //-------------------------------------------------------------------------
464 459
465 'exception': { 460 'exception': {
466 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"), 461 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"),
467 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType"), 462 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType"),
468 'VulnerabilityIssue':new MochiKit.Base.NamedError("Clipperz.Base.exception.VulnerabilityIssue"), 463 'VulnerabilityIssue':new MochiKit.Base.NamedError("Clipperz.Base.exception.VulnerabilityIssue"),
469 'MandatoryParameter':new MochiKit.Base.NamedError("Clipperz.Base.exception.MandatoryParameter"), 464 'MandatoryParameter':new MochiKit.Base.NamedError("Clipperz.Base.exception.MandatoryParameter"),
470 'ObjectNotFound': new MochiKit.Base.NamedError("Clipperz.Base.exception.ObjectNotFound"), 465 'ObjectNotFound': new MochiKit.Base.NamedError("Clipperz.Base.exception.ObjectNotFound"),
471 'raise': function (aName) { 466 'raise': function (aName) {
472 throw Clipperz.Base.exception[aName]; 467 throw Clipperz.Base.exception[aName];
473 } 468 }
474 }, 469 },
475 470
476 //------------------------------------------------------------------------- 471 //-------------------------------------------------------------------------
477 472
478 'extend': YAHOO.extendX, 473 'extend': YAHOO.extendX,
479 474
480 //------------------------------------------------------------------------- 475 //-------------------------------------------------------------------------
481 __syntaxFix__: "syntax fix" 476 __syntaxFix__: "syntax fix"
482 477
483}); 478});
484 479
485 //Original regExp courtesy of John Gruber: http://daringfireball.net/2009/11/liberal_regex_for_matching_urls 480 //Original regExp courtesy of John Gruber: http://daringfireball.net/2009/11/liberal_regex_for_matching_urls
486 //Updated to match Clipperz usage pattern. 481 //Updated to match Clipperz usage pattern.
487//MochiKit.Base.urlRegExp = new RegExp(/\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))/); 482//MochiKit.Base.urlRegExp = new RegExp(/\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))/);
488MochiKit.Base.urlRegExp = new RegExp(/^((([\w-]+:\/\/?)|(www\.))[^\s()<>]+((?:\([\w\d]+\)|([^[:punct:]\s]|\/)))?)/); 483MochiKit.Base.urlRegExp = new RegExp(/^((([\w-]+:\/\/?)|(www\.))[^\s()<>]+((?:\([\w\d]+\)|([^[:punct:]\s]|\/)))?)/);
489 484
490 //RegExp found here: http://www.tipsntracks.com/117/validate-an-email-address-using-regular-expressions.html 485 //RegExp found here: http://www.tipsntracks.com/117/validate-an-email-address-using-regular-expressions.html
491MochiKit.Base.emailRegExp = new RegExp(/^([a-zA-Z0-9_\-\.]+)@(([a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3}))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d))$/); 486MochiKit.Base.emailRegExp = new RegExp(/^([a-zA-Z0-9_\-\.]+)@(([a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3}))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d))$/);
492 487
493 488
494MochiKit.Base.registerComparator('Object dummy comparator', 489MochiKit.Base.registerComparator('Object dummy comparator',
495 function(a, b) { 490 function(a, b) {
496 return ((a.constructor == Object) && (b.constructor == Object)); 491 return ((a.constructor == Object) && (b.constructor == Object));
497 }, 492 },
498 function(a, b) { 493 function(a, b) {
499 var result; 494 var result;
500 var aKeys; 495 var aKeys;
501 var bKeys; 496 var bKeys;
502 497
503//MochiKit.Logging.logDebug(">>> comparator");
504//MochiKit.Logging.logDebug("- a: " + Clipperz.Base.serializeJSON(a));
505//MochiKit.Logging.logDebug("- b: " + Clipperz.Base.serializeJSON(a));
506 aKeys = MochiKit.Base.keys(a).sort(); 498 aKeys = MochiKit.Base.keys(a).sort();
507 bKeys = MochiKit.Base.keys(b).sort(); 499 bKeys = MochiKit.Base.keys(b).sort();
508
509 result = MochiKit.Base.compare(aKeys, bKeys); 500 result = MochiKit.Base.compare(aKeys, bKeys);
510//if (result != 0) { 501
511 //MochiKit.Logging.logDebug("- comparator 'keys':");
512 //MochiKit.Logging.logDebug("- comparator aKeys: " + Clipperz.Base.serializeJSON(aKeys));
513 //MochiKit.Logging.logDebug("- comparator bKeys: " + Clipperz.Base.serializeJSON(bKeys));
514//}
515 if (result == 0) { 502 if (result == 0) {
516 vari, c; 503 vari, c;
517 504
518 c = aKeys.length; 505 c = aKeys.length;
519 for (i=0; (i<c) && (result == 0); i++) { 506 for (i=0; (i<c) && (result == 0); i++) {
520 result = MochiKit.Base.compare(a[aKeys[i]], b[bKeys[i]]); 507 result = MochiKit.Base.compare(a[aKeys[i]], b[bKeys[i]]);
521//if (result != 0) {
522 //MochiKit.Logging.logDebug("- comparator 'values':");
523 //MochiKit.Logging.logDebug("- comparator a[aKeys[i]]: " + Clipperz.Base.serializeJSON(a[aKeys[i]]));
524 //MochiKit.Logging.logDebug("- comparator b[bKeys[i]]: " + Clipperz.Base.serializeJSON(b[bKeys[i]]));
525//}
526 } 508 }
527 } 509 }
528 510
529//MochiKit.Logging.logDebug("<<< comparator - result: " + result);
530 return result; 511 return result;
531 }, 512 },
532 true 513 true
533); 514);
diff --git a/frontend/gamma/js/Clipperz/ByteArray.js b/frontend/gamma/js/Clipperz/ByteArray.js
index ae586e7..22c7c6e 100644
--- a/frontend/gamma/js/Clipperz/ByteArray.js
+++ b/frontend/gamma/js/Clipperz/ByteArray.js
@@ -1,619 +1,580 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27 25
28//============================================================================= 26//=============================================================================
29 27
30Clipperz.ByteArray_abstract = function(args) { 28Clipperz.ByteArray_abstract = function(args) {
31 return this; 29 return this;
32} 30}
33 31
34Clipperz.ByteArray_abstract.prototype = MochiKit.Base.update(null, { 32Clipperz.ByteArray_abstract.prototype = MochiKit.Base.update(null, {
35 33
36 //------------------------------------------------------------------------- 34 //-------------------------------------------------------------------------
37 35
38 'toString': function() { 36 'toString': function() {
39 return "Clipperz.ByteArray_abstract"; 37 return "Clipperz.ByteArray_abstract";
40 }, 38 },
41 39
42 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
43 41
44 'equals': function(aValue) { 42 'equals': function(aValue) {
45 return (this.compare(aValue) == 0); 43 return (this.compare(aValue) == 0);
46 }, 44 },
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'compare': function(aValue) { 48 'compare': function(aValue) {
51 var result; 49 var result;
52 var i; 50 var i;
53 51
54 result = MochiKit.Base.compare(this.length(), aValue.length()); 52 result = MochiKit.Base.compare(this.length(), aValue.length());
55 i = this.length(); 53 i = this.length();
56 54
57 while ((result == 0) && (i>0)) { 55 while ((result == 0) && (i>0)) {
58 i--; 56 i--;
59 result = MochiKit.Base.compare(this.byteAtIndex(i), aValue.byteAtIndex(i)); 57 result = MochiKit.Base.compare(this.byteAtIndex(i), aValue.byteAtIndex(i));
60 } 58 }
61 59
62 return result; 60 return result;
63 }, 61 },
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67 'clone': function() { 65 'clone': function() {
68 throw Clipperz.Base.exception.AbstractMethod; 66 throw Clipperz.Base.exception.AbstractMethod;
69 }, 67 },
70 68
71 //------------------------------------------------------------------------- 69 //-------------------------------------------------------------------------
72 70
73 'newInstance': function() { 71 'newInstance': function() {
74 throw Clipperz.Base.exception.AbstractMethod; 72 throw Clipperz.Base.exception.AbstractMethod;
75 }, 73 },
76 74
77 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
78 76
79 'reset': function() { 77 'reset': function() {
80 throw Clipperz.Base.exception.AbstractMethod; 78 throw Clipperz.Base.exception.AbstractMethod;
81 }, 79 },
82 80
83 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
84 82
85 'length': function() { 83 'length': function() {
86 throw Clipperz.Base.exception.AbstractMethod; 84 throw Clipperz.Base.exception.AbstractMethod;
87 }, 85 },
88 86
89 //------------------------------------------------------------------------- 87 //-------------------------------------------------------------------------
90 88
91 'checkByteValue': function(aValue) { 89 'checkByteValue': function(aValue) {
92//Clipperz.log("aValue", aValue.toString(16));
93//Clipperz.log("(aValue & 0xff)", (aValue & 0xff).toString(16));
94
95 if ((aValue & 0xff) != aValue) { 90 if ((aValue & 0xff) != aValue) {
96 MochiKit.Logging.logError("Clipperz.ByteArray.appendByte: the provided value (0x" + aValue.toString(16) + ") is not a byte value."); 91 Clipperz.logError("Clipperz.ByteArray.appendByte: the provided value (0x" + aValue.toString(16) + ") is not a byte value.");
97 throw Clipperz.ByteArray.exception.InvalidValue; 92 throw Clipperz.ByteArray.exception.InvalidValue;
98 } 93 }
99 }, 94 },
100 95
101 //------------------------------------------------------------------------- 96 //-------------------------------------------------------------------------
102 97
103 'xorMergeWithBlock': function(aBlock, anAllignment, paddingMode) { 98 'xorMergeWithBlock': function(aBlock, anAllignment, paddingMode) {
104 var result; 99 var result;
105 var a, b; 100 var a, b;
106 var aLength; 101 var aLength;
107 var bLength; 102 var bLength;
108 var i, c; 103 var i, c;
109 104
110 if (this.length() > aBlock.length()) { 105 if (this.length() > aBlock.length()) {
111 a = this; 106 a = this;
112 b = aBlock; 107 b = aBlock;
113 } else { 108 } else {
114 a = aBlock; 109 a = aBlock;
115 b = this; 110 b = this;
116 } 111 }
117 112
118 aLength = a.length(); 113 aLength = a.length();
119 bLength = b.length(); 114 bLength = b.length();
120 115
121 if (aLength != bLength) { 116 if (aLength != bLength) {
122 if (paddingMode == 'truncate') { 117 if (paddingMode == 'truncate') {
123 if (anAllignment == 'left') { 118 if (anAllignment == 'left') {
124 a = a.split(0, bLength); 119 a = a.split(0, bLength);
125 } else { 120 } else {
126 a = a.split(aLength - bLength); 121 a = a.split(aLength - bLength);
127 } 122 }
128 } else { 123 } else {
129 var ii, cc; 124 var ii, cc;
130 var padding; 125 var padding;
131 126
132 // padding = new Clipperz.ByteArray(); 127 // padding = new Clipperz.ByteArray();
133 padding = this.newInstance(); 128 padding = this.newInstance();
134 cc = aLength - bLength; 129 cc = aLength - bLength;
135 for (ii=0; ii<cc; ii++) { 130 for (ii=0; ii<cc; ii++) {
136 padding.appendByte(0); 131 padding.appendByte(0);
137 } 132 }
138 133
139 if (anAllignment == 'left') { 134 if (anAllignment == 'left') {
140 b = b.appendBlock(padding); 135 b = b.appendBlock(padding);
141 } else { 136 } else {
142 b = padding.appendBlock(b); 137 b = padding.appendBlock(b);
143 } 138 }
144 } 139 }
145 } 140 }
146 141
147
148 // result = new Clipperz.ByteArray();
149 result = this.newInstance(); 142 result = this.newInstance();
150 c = a.length(); 143 c = a.length();
151 for (i=0; i<c; i++) { 144 for (i=0; i<c; i++) {
152 result.appendByte(a.byteAtIndex(i) ^ b.byteAtIndex(i)); 145 result.appendByte(a.byteAtIndex(i) ^ b.byteAtIndex(i));
153 } 146 }
154 147
155 return result; 148 return result;
156 }, 149 },
157 150
158 //------------------------------------------------------------------------- 151 //-------------------------------------------------------------------------
159/*
160 'shiftLeft': function(aNumberOfBitsToShift) {
161 var result;
162
163 result = this.clone(); //???????????
164
165 return result;
166 },
167 */
168 //-------------------------------------------------------------------------
169 152
170 'appendBlock': function(aBlock) { 153 'appendBlock': function(aBlock) {
171 throw Clipperz.Base.exception.AbstractMethod; 154 throw Clipperz.Base.exception.AbstractMethod;
172 }, 155 },
173 156
174 //------------------------------------------------------------------------- 157 //-------------------------------------------------------------------------
175 158
176 'appendByte': function(aValue) { 159 'appendByte': function(aValue) {
177 throw Clipperz.Base.exception.AbstractMethod; 160 throw Clipperz.Base.exception.AbstractMethod;
178 }, 161 },
179 162
180 'appendBytes': function(args) { 163 'appendBytes': function(args) {
181 varvalues; 164 varvalues;
182 vari,c; 165 vari,c;
183 166
184 if (args.constructor == Array) { 167 if (args.constructor == Array) {
185 values = args; 168 values = args;
186 } else { 169 } else {
187 values = arguments; 170 values = arguments;
188 } 171 }
189 172
190 c = values.length; 173 c = values.length;
191 for (i=0; i<c; i++) { 174 for (i=0; i<c; i++) {
192 this.appendByte(values[i]); 175 this.appendByte(values[i]);
193 } 176 }
194 177
195 return this; 178 return this;
196 }, 179 },
197 180
198 //------------------------------------------------------------------------- 181 //-------------------------------------------------------------------------
199 182
200 'appendWord': function(aValue, isLittleEndian) { 183 'appendWord': function(aValue, isLittleEndian) {
201 var result; 184 var result;
202 var processAsLittleEndian; 185 var processAsLittleEndian;
203 186
204 processAsLittleEndian = isLittleEndian === true ? true : false; 187 processAsLittleEndian = isLittleEndian === true ? true : false;
205 188
206 if (processAsLittleEndian) { 189 if (processAsLittleEndian) {
207 result = this.appendBytes( (aValue) & 0xff, (aValue >> 8) & 0xff, (aValue >> 16) & 0xff, (aValue >> 24) & 0xff ); //little endian 190 result = this.appendBytes( (aValue) & 0xff, (aValue >> 8) & 0xff, (aValue >> 16) & 0xff, (aValue >> 24) & 0xff ); //little endian
208 } else { 191 } else {
209 result = this.appendBytes( (aValue >> 24) & 0xff, (aValue >> 16) & 0xff, (aValue >> 8) & 0xff, (aValue) & 0xff ); //big endian - DEFAULT 192 result = this.appendBytes( (aValue >> 24) & 0xff, (aValue >> 16) & 0xff, (aValue >> 8) & 0xff, (aValue) & 0xff ); //big endian - DEFAULT
210 } 193 }
211 194
212 return result; 195 return result;
213 }, 196 },
214 197
215 'appendWords': function(args) { 198 'appendWords': function(args) {
216 varvalues; 199 varvalues;
217 vari,c; 200 vari,c;
218 201
219 if (args.constructor == Array) { 202 if (args.constructor == Array) {
220 values = args; 203 values = args;
221 } else { 204 } else {
222 values = arguments; 205 values = arguments;
223 } 206 }
224 207
225 c = values.length; 208 c = values.length;
226 for (i=0; i<c; i++) { 209 for (i=0; i<c; i++) {
227 this.appendWord(values[i], false); 210 this.appendWord(values[i], false);
228 } 211 }
229 212
230 return this; 213 return this;
231 }, 214 },
232 215
233 //------------------------------------------------------------------------- 216 //-------------------------------------------------------------------------
234 217
235 'appendBigEndianWords': function(args) { 218 'appendBigEndianWords': function(args) {
236 varvalues; 219 varvalues;
237 vari,c; 220 vari,c;
238 221
239 if (args.constructor == Array) { 222 if (args.constructor == Array) {
240 values = args; 223 values = args;
241 } else { 224 } else {
242 values = arguments; 225 values = arguments;
243 } 226 }
244 227
245 c = values.length; 228 c = values.length;
246 for (i=0; i<c; i++) { 229 for (i=0; i<c; i++) {
247 this.appendWord(values[i], true); 230 this.appendWord(values[i], true);
248 } 231 }
249 232
250 return this; 233 return this;
251 }, 234 },
252 235
253 //------------------------------------------------------------------------- 236 //-------------------------------------------------------------------------
254 237
255 'appendBinaryString': function (aBinaryString) { 238 'appendBinaryString': function (aBinaryString) {
256 var i,c; 239 var i,c;
257 240
258 c = aBinaryString.length; 241 c = aBinaryString.length;
259 for (i=0; i<c; i++) { 242 for (i=0; i<c; i++) {
260 this.appendByte(aBinaryString.charCodeAt(i)); 243 this.appendByte(aBinaryString.charCodeAt(i));
261 }; 244 };
262 245
263 return this; 246 return this;
264 }, 247 },
265 248
266 //------------------------------------------------------------------------- 249 //-------------------------------------------------------------------------
267 250
268 'byteAtIndex': function(anIndex) { 251 'byteAtIndex': function(anIndex) {
269 throw Clipperz.Base.exception.AbstractMethod; 252 throw Clipperz.Base.exception.AbstractMethod;
270 }, 253 },
271 254
272 'setByteAtIndex': function(aValue, anIndex) { 255 'setByteAtIndex': function(aValue, anIndex) {
273 throw Clipperz.Base.exception.AbstractMethod; 256 throw Clipperz.Base.exception.AbstractMethod;
274 }, 257 },
275 258
276 //------------------------------------------------------------------------- 259 //-------------------------------------------------------------------------
277 260
278 'bitAtIndex': function(aBitPosition) { 261 'bitAtIndex': function(aBitPosition) {
279 var result; 262 var result;
280 varbytePosition; 263 varbytePosition;
281 var bitPositionInSelectedByte; 264 var bitPositionInSelectedByte;
282 var selectedByte; 265 var selectedByte;
283 var selectedByteMask; 266 var selectedByteMask;
284 267
285 bytePosition = this.length() - Math.ceil((aBitPosition + 1)/ 8); 268 bytePosition = this.length() - Math.ceil((aBitPosition + 1)/ 8);
286 bitPositionInSelectedByte = aBitPosition % 8; 269 bitPositionInSelectedByte = aBitPosition % 8;
287 selectedByte = this.byteAtIndex(bytePosition); 270 selectedByte = this.byteAtIndex(bytePosition);
288 271
289 if (bitPositionInSelectedByte > 0) { 272 if (bitPositionInSelectedByte > 0) {
290 selectedByteMask = (1 << bitPositionInSelectedByte); 273 selectedByteMask = (1 << bitPositionInSelectedByte);
291 } else { 274 } else {
292 selectedByteMask = 1; 275 selectedByteMask = 1;
293 } 276 }
294 result = selectedByte & selectedByteMask ? 1 : 0; 277 result = selectedByte & selectedByteMask ? 1 : 0;
295//console.log("aBitPosition: " + aBitPosition + ", length: " + this.length() + ", bytePosition: " + bytePosition + ", bitPositionInSelectedByte: " + bitPositionInSelectedByte + ", selectedByteMask: " + selectedByteMask);
296 278
297 return result; 279 return result;
298 }, 280 },
299 281
300 //------------------------------------------------------------------------- 282 //-------------------------------------------------------------------------
301 283
302 'bitBlockAtIndexWithSize': function(aBitPosition, aSize) { 284 'bitBlockAtIndexWithSize': function(aBitPosition, aSize) {
303 var result; 285 var result;
304 var bitValue; 286 var bitValue;
305 var i,c; 287 var i,c;
306 288
307 result = 0; 289 result = 0;
308 c = aSize; 290 c = aSize;
309 for (i=0; i<c; i++) { 291 for (i=0; i<c; i++) {
310 bitValue = this.bitAtIndex(aBitPosition + i); 292 bitValue = this.bitAtIndex(aBitPosition + i);
311 result = result | bitValue << i; 293 result = result | bitValue << i;
312 } 294 }
313 295
314 return result; 296 return result;
315 }, 297 },
316 298
317 //------------------------------------------------------------------------- 299 //-------------------------------------------------------------------------
318 300
319 'asString': function() { 301 'asString': function() {
320 varresult; 302 varresult;
321 varlength; 303 varlength;
322 vari; 304 vari;
323 305
324//var startTime = new Date();
325
326 //# result = "";
327 result = []; 306 result = [];
328 307
329 i = 0; 308 i = 0;
330 length = this.length(); 309 length = this.length();
331 310
332 while (i < length) { 311 while (i < length) {
333 varcurrentCharacter; 312 varcurrentCharacter;
334 varcurrentByte; 313 varcurrentByte;
335 varunicode; 314 varunicode;
336 315
337 currentByte = this.byteAtIndex(i); 316 currentByte = this.byteAtIndex(i);
338 317
339 if ((currentByte & 0x80) == 0x00 ) { //0xxxxxxx 318 if ((currentByte & 0x80) == 0x00 ) { //0xxxxxxx
340 unicode = currentByte; 319 unicode = currentByte;
341 currentCharacter = String.fromCharCode(unicode); 320 currentCharacter = String.fromCharCode(unicode);
342 } else if ((currentByte & 0xe0) == 0xc0 ) { //110xxxxx 10xxxxxx 321 } else if ((currentByte & 0xe0) == 0xc0 ) { //110xxxxx 10xxxxxx
343 unicode = (currentByte & 0x1f) << 6; 322 unicode = (currentByte & 0x1f) << 6;
344 i++; currentByte = this.byteAtIndex(i); 323 i++; currentByte = this.byteAtIndex(i);
345 unicode = unicode | (currentByte & 0x3f); 324 unicode = unicode | (currentByte & 0x3f);
346 325
347 currentCharacter = String.fromCharCode(unicode); 326 currentCharacter = String.fromCharCode(unicode);
348 } else if ((currentByte & 0xf0) == 0xe0 ) { //1110xxxx 10xxxxxx 10xxxxxx 327 } else if ((currentByte & 0xf0) == 0xe0 ) { //1110xxxx 10xxxxxx 10xxxxxx
349 unicode = (currentByte & 0x0f) << (6+6); 328 unicode = (currentByte & 0x0f) << (6+6);
350 i++; currentByte = this.byteAtIndex(i); 329 i++; currentByte = this.byteAtIndex(i);
351 unicode = unicode | ((currentByte & 0x3f) << 6); 330 unicode = unicode | ((currentByte & 0x3f) << 6);
352 i++; currentByte = this.byteAtIndex(i); 331 i++; currentByte = this.byteAtIndex(i);
353 unicode = unicode | (currentByte & 0x3f); 332 unicode = unicode | (currentByte & 0x3f);
354 333
355 currentCharacter = String.fromCharCode(unicode); 334 currentCharacter = String.fromCharCode(unicode);
356 } else { //11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 335 } else { //11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
357 unicode = (currentByte & 0x07) << (6+6+6); 336 unicode = (currentByte & 0x07) << (6+6+6);
358 i++; currentByte = this.byteAtIndex(i); 337 i++; currentByte = this.byteAtIndex(i);
359 unicode = unicode | ((currentByte & 0x3f) << (6+6)); 338 unicode = unicode | ((currentByte & 0x3f) << (6+6));
360 i++; currentByte = this.byteAtIndex(i); 339 i++; currentByte = this.byteAtIndex(i);
361 unicode = unicode | ((currentByte & 0x3f) << 6); 340 unicode = unicode | ((currentByte & 0x3f) << 6);
362 i++; currentByte = this.byteAtIndex(i); 341 i++; currentByte = this.byteAtIndex(i);
363 unicode = unicode | (currentByte & 0x3f); 342 unicode = unicode | (currentByte & 0x3f);
364 343
365 currentCharacter = String.fromCharCode(unicode); 344 currentCharacter = String.fromCharCode(unicode);
366 } 345 }
367 346
368 // result += currentCharacter;
369 result.push(currentCharacter); 347 result.push(currentCharacter);
370 i++; 348 i++;
371 } 349 }
372 350
373//MochiKit.Logging.logDebug("[" + (new Date() - startTime) + "] ByteArray.asString");
374
375 // return result;
376 return result.join(""); 351 return result.join("");
377 }, 352 },
378 353
379 //------------------------------------------------------------------------- 354 //-------------------------------------------------------------------------
380 355
381 'toHexString': function() { 356 'toHexString': function() {
382 throw Clipperz.Base.exception.AbstractMethod; 357 throw Clipperz.Base.exception.AbstractMethod;
383 }, 358 },
384 359
385 //------------------------------------------------------------------------- 360 //-------------------------------------------------------------------------
386 361
387 'base64map': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 362 'base64map': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
388 'base64mapIndex': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(''), 363 'base64mapIndex': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(''),
389 //'base64mapInvertedIndex': {
390 // 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9,
391 // 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16, 'R': 17, 'S': 18, 'T': 19,
392 // 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24, 'Z': 25, 'a': 26, 'b': 27, 'c': 28, 'd': 29,
393 // 'e': 30, 'f': 31, 'g': 32, 'h': 33, 'i': 34, 'j': 35, 'k': 36, 'l': 37, 'm': 38, 'n': 39,
394 // 'o': 40, 'p': 41, 'q': 42, 'r': 43, 's': 44, 't': 45, 'u': 46, 'v': 47, 'w': 48, 'x': 49,
395 // 'y': 50, 'z': 51, '0': 52, '1': 53, '2': 54, '3': 55, '4': 56, '5': 57, '6': 58, '7': 59,
396 // '8': 60, '9': 61, '+': 62, '/': 63,
397 // "=": -1},
398 364
399 //------------------------------------------------------------------------- 365 //-------------------------------------------------------------------------
400 366
401 'appendBase64String': function(aValue) { 367 'appendBase64String': function(aValue) {
402 var i; 368 var i;
403 var length; 369 var length;
404 370
405 length = aValue.length; 371 length = aValue.length;
406 372
407 if ((length % 4) != 0) { 373 if ((length % 4) != 0) {
408 MochiKit.Logging.logError("the value passed to the 'ByteArray.setBase64Value' is not correct"); 374 Clipperz.logError("the value passed to the 'ByteArray.setBase64Value' is not correct");
409 throw Clipperz.ByteArray.exception.InvalidValue; 375 throw Clipperz.ByteArray.exception.InvalidValue;
410 } 376 }
411 377
412 i = 0; 378 i = 0;
413 while (i<length) { 379 while (i<length) {
414 var value1, value2, value3, value4; 380 var value1, value2, value3, value4;
415 var byte1, byte2, byte3; 381 var byte1, byte2, byte3;
416 382
417 value1 = this.base64map.indexOf(aValue.charAt(i)); 383 value1 = this.base64map.indexOf(aValue.charAt(i));
418 value2 = this.base64map.indexOf(aValue.charAt(i+1)); 384 value2 = this.base64map.indexOf(aValue.charAt(i+1));
419 value3 = this.base64map.indexOf(aValue.charAt(i+2)); 385 value3 = this.base64map.indexOf(aValue.charAt(i+2));
420 value4 = this.base64map.indexOf(aValue.charAt(i+3)); 386 value4 = this.base64map.indexOf(aValue.charAt(i+3));
421 387
422 // value1 = this.base64mapInvertedIndex[aValue.charAt(i)];
423 // value2 = this.base64mapInvertedIndex[aValue.charAt(i+1)];
424 // value3 = this.base64mapInvertedIndex[aValue.charAt(i+2)];
425 // value4 = this.base64mapInvertedIndex[aValue.charAt(i+3)];
426
427 byte1 = (value1 << 2) | ((value2 & 0x30) >> 4); 388 byte1 = (value1 << 2) | ((value2 & 0x30) >> 4);
428 if (value3 != -1) { 389 if (value3 != -1) {
429 byte2 = ((value2 & 0x0f) << 4) | ((value3 & 0x3c) >> 2); 390 byte2 = ((value2 & 0x0f) << 4) | ((value3 & 0x3c) >> 2);
430 391
431 if (value4 != -1) { 392 if (value4 != -1) {
432 byte3 = ((value3 & 0x03) << 6) | (value4); 393 byte3 = ((value3 & 0x03) << 6) | (value4);
433 } else { 394 } else {
434 byte3 = null; 395 byte3 = null;
435 } 396 }
436 } else { 397 } else {
437 byte2 = null; 398 byte2 = null;
438 byte3 = null; 399 byte3 = null;
439 } 400 }
440 401
441 this.appendByte(byte1); 402 this.appendByte(byte1);
442 this.appendByte(byte2); 403 this.appendByte(byte2);
443 this.appendByte(byte3); 404 this.appendByte(byte3);
444 405
445 i += 4; 406 i += 4;
446 } 407 }
447 408
448 return this; 409 return this;
449 }, 410 },
450 411
451 //------------------------------------------------------------------------- 412 //-------------------------------------------------------------------------
452 413
453 'toBase64String': function() { 414 'toBase64String': function() {
454 var result; 415 var result;
455 var length; 416 var length;
456 var i; 417 var i;
457 var byte1, byte2, byte3; 418 var byte1, byte2, byte3;
458 var char1, char2, char3, char4; 419 var char1, char2, char3, char4;
459 420
460 i = 0; 421 i = 0;
461 length = this.length(); 422 length = this.length();
462 result = new Array(Math.ceil(length/3)); 423 result = new Array(Math.ceil(length/3));
463 424
464 while (i < length) { 425 while (i < length) {
465 byte1 = this.byteAtIndex(i); 426 byte1 = this.byteAtIndex(i);
466 if ((i+2) < length) { 427 if ((i+2) < length) {
467 byte2 = this.byteAtIndex(i+1); 428 byte2 = this.byteAtIndex(i+1);
468 byte3 = this.byteAtIndex(i+2); 429 byte3 = this.byteAtIndex(i+2);
469 } else if ((i+2) == length) { 430 } else if ((i+2) == length) {
470 byte2 = this.byteAtIndex(i+1); 431 byte2 = this.byteAtIndex(i+1);
471 byte3 = null; 432 byte3 = null;
472 } else { 433 } else {
473 byte2 = null; 434 byte2 = null;
474 byte3 = null; 435 byte3 = null;
475 } 436 }
476 437
477 char1 = this.base64mapIndex[byte1 >> 2]; 438 char1 = this.base64mapIndex[byte1 >> 2];
478 if (byte2 != null) { 439 if (byte2 != null) {
479 char2 = this.base64mapIndex[((byte1 & 0x03) << 4) | ((byte2 & 0xf0) >> 4)]; 440 char2 = this.base64mapIndex[((byte1 & 0x03) << 4) | ((byte2 & 0xf0) >> 4)];
480 if (byte3 != null) { 441 if (byte3 != null) {
481 char3 = this.base64mapIndex[((byte2 & 0x0f) << 2) | ((byte3 & 0xc0) >> 6)]; 442 char3 = this.base64mapIndex[((byte2 & 0x0f) << 2) | ((byte3 & 0xc0) >> 6)];
482 char4 = this.base64mapIndex[(byte3 & 0x3f)]; 443 char4 = this.base64mapIndex[(byte3 & 0x3f)];
483 } else { 444 } else {
484 char3 = this.base64mapIndex[(byte2 & 0x0f) << 2]; 445 char3 = this.base64mapIndex[(byte2 & 0x0f) << 2];
485 char4 = "="; 446 char4 = "=";
486 } 447 }
487 } else { 448 } else {
488 char2 = this.base64mapIndex[(byte1 & 0x03) << 4]; 449 char2 = this.base64mapIndex[(byte1 & 0x03) << 4];
489 char3 = "="; 450 char3 = "=";
490 char4 = "="; 451 char4 = "=";
491 } 452 }
492 453
493 result.push(char1 + char2 + char3 + char4); 454 result.push(char1 + char2 + char3 + char4);
494 455
495 i += 3; 456 i += 3;
496 } 457 }
497 458
498 return result.join(""); 459 return result.join("");
499 }, 460 },
500 461
501 //------------------------------------------------------------------------- 462 //-------------------------------------------------------------------------
502 463
503 'base32map': "0123456789abcdefghjkmnpqrstvwxyz", 464 'base32map': "0123456789abcdefghjkmnpqrstvwxyz",
504 'base32mapIndex': "0123456789abcdefghjkmnpqrstvwxyz".split(''), 465 'base32mapIndex': "0123456789abcdefghjkmnpqrstvwxyz".split(''),
505 466
506 //------------------------------------------------------------------------- 467 //-------------------------------------------------------------------------
507 468
508 'appendBase32String': function(aValue) { 469 'appendBase32String': function(aValue) {
509 var value; 470 var value;
510 var i; 471 var i;
511 var length; 472 var length;
512 var value1, value2, value3, value4, value5, value6, value7, value8; 473 var value1, value2, value3, value4, value5, value6, value7, value8;
513 var byte1, byte2, byte3, byte4, byte5; 474 var byte1, byte2, byte3, byte4, byte5;
514 475
515 value = aValue.toLowerCase(); 476 value = aValue.toLowerCase();
516 value = value.replace(/[\s\-]/g, ''); 477 value = value.replace(/[\s\-]/g, '');
517 value = value.replace(/[0o]/g, '0'); 478 value = value.replace(/[0o]/g, '0');
518 value = value.replace(/[1il]/g, '1'); 479 value = value.replace(/[1il]/g, '1');
519 480
520 length = value.length; 481 length = value.length;
521 482
522 if ((length % 8) != 0) { 483 if ((length % 8) != 0) {
523 MochiKit.Logging.logError("the value passed to the 'ByteArray.setBase32Value' is not correct"); 484 Clipperz.logError("the value passed to the 'ByteArray.setBase32Value' is not correct");
524 throw Clipperz.ByteArray.exception.InvalidValue; 485 throw Clipperz.ByteArray.exception.InvalidValue;
525 } 486 }
526 487
527 i = 0; 488 i = 0;
528 while (i<length) { 489 while (i<length) {
529 value1 = this.base32map.indexOf(value.charAt(i)); 490 value1 = this.base32map.indexOf(value.charAt(i));
530 value2 = this.base32map.indexOf(value.charAt(i+1)); 491 value2 = this.base32map.indexOf(value.charAt(i+1));
531 value3 = this.base32map.indexOf(value.charAt(i+2)); 492 value3 = this.base32map.indexOf(value.charAt(i+2));
532 value4 = this.base32map.indexOf(value.charAt(i+3)); 493 value4 = this.base32map.indexOf(value.charAt(i+3));
533 value5 = this.base32map.indexOf(value.charAt(i+4)); 494 value5 = this.base32map.indexOf(value.charAt(i+4));
534 value6 = this.base32map.indexOf(value.charAt(i+5)); 495 value6 = this.base32map.indexOf(value.charAt(i+5));
535 value7 = this.base32map.indexOf(value.charAt(i+6)); 496 value7 = this.base32map.indexOf(value.charAt(i+6));
536 value8 = this.base32map.indexOf(value.charAt(i+7)); 497 value8 = this.base32map.indexOf(value.charAt(i+7));
537 498
538 byte1 = byte2 = byte3 = byte4 = byte5 = null; 499 byte1 = byte2 = byte3 = byte4 = byte5 = null;
539 500
540 byte1 = (value1 << 3) | ((value2 & 0x1c) >> 2); 501 byte1 = (value1 << 3) | ((value2 & 0x1c) >> 2);
541 if (value3 != -1) { 502 if (value3 != -1) {
542 byte2 = ((value2 & 0x03) << 6) | (value3 << 1) | ((value4 & 0x10) >> 4); 503 byte2 = ((value2 & 0x03) << 6) | (value3 << 1) | ((value4 & 0x10) >> 4);
543 if (value5 != -1) { 504 if (value5 != -1) {
544 byte3 = ((value4 & 0x0f) << 4) | ((value5 & 0x1e) >> 1); 505 byte3 = ((value4 & 0x0f) << 4) | ((value5 & 0x1e) >> 1);
545 if (value6 != -1) { 506 if (value6 != -1) {
546 byte4 = ((value5 & 0x01) << 7) | (value6 << 2) | ((value7 & 0x18) >> 3); 507 byte4 = ((value5 & 0x01) << 7) | (value6 << 2) | ((value7 & 0x18) >> 3);
547 if (value8 != -1) { 508 if (value8 != -1) {
548 byte5 = ((value7 & 0x07) << 5) | (value8); 509 byte5 = ((value7 & 0x07) << 5) | (value8);
549 } 510 }
550 } 511 }
551 } 512 }
552 } 513 }
553 514
554 this.appendByte(byte1); 515 this.appendByte(byte1);
555 this.appendByte(byte2); 516 this.appendByte(byte2);
556 this.appendByte(byte3); 517 this.appendByte(byte3);
557 this.appendByte(byte4); 518 this.appendByte(byte4);
558 this.appendByte(byte5); 519 this.appendByte(byte5);
559 520
560 i += 8; 521 i += 8;
561 } 522 }
562 523
563 return this; 524 return this;
564 }, 525 },
565 526
566 //------------------------------------------------------------------------- 527 //-------------------------------------------------------------------------
567 528
568 'toBase32String': function() { 529 'toBase32String': function() {
569 var result; 530 var result;
570 var length; 531 var length;
571 var i; 532 var i;
572 var byte1, byte2, byte3, byte4, byte5; 533 var byte1, byte2, byte3, byte4, byte5;
573 var char1, char2, char3, char4, char5, char6, char7, char8; 534 var char1, char2, char3, char4, char5, char6, char7, char8;
574 535
575 i = 0; 536 i = 0;
576 length = this.length(); 537 length = this.length();
577 result = new Array(Math.ceil(length/5)); 538 result = new Array(Math.ceil(length/5));
578 539
579 while (i < length) { 540 while (i < length) {
580 byte1 = this.byteAtIndex(i); 541 byte1 = this.byteAtIndex(i);
581 542
582 if ((i+4) < length) { 543 if ((i+4) < length) {
583 byte2 = this.byteAtIndex(i+1); 544 byte2 = this.byteAtIndex(i+1);
584 byte3 = this.byteAtIndex(i+2); 545 byte3 = this.byteAtIndex(i+2);
585 byte4 = this.byteAtIndex(i+3); 546 byte4 = this.byteAtIndex(i+3);
586 byte5 = this.byteAtIndex(i+4); 547 byte5 = this.byteAtIndex(i+4);
587 } else if ((i+4) == length) { 548 } else if ((i+4) == length) {
588 byte2 = this.byteAtIndex(i+1); 549 byte2 = this.byteAtIndex(i+1);
589 byte3 = this.byteAtIndex(i+2); 550 byte3 = this.byteAtIndex(i+2);
590 byte4 = this.byteAtIndex(i+3); 551 byte4 = this.byteAtIndex(i+3);
591 byte5 = null; 552 byte5 = null;
592 } else if ((i+3) == length) { 553 } else if ((i+3) == length) {
593 byte2 = this.byteAtIndex(i+1); 554 byte2 = this.byteAtIndex(i+1);
594 byte3 = this.byteAtIndex(i+2); 555 byte3 = this.byteAtIndex(i+2);
595 byte4 = null; 556 byte4 = null;
596 byte5 = null; 557 byte5 = null;
597 } else if ((i+2) == length) { 558 } else if ((i+2) == length) {
598 byte2 = this.byteAtIndex(i+1); 559 byte2 = this.byteAtIndex(i+1);
599 byte3 = null; 560 byte3 = null;
600 byte4 = null; 561 byte4 = null;
601 byte5 = null; 562 byte5 = null;
602 } else { 563 } else {
603 byte2 = null; 564 byte2 = null;
604 byte3 = null; 565 byte3 = null;
605 byte4 = null; 566 byte4 = null;
606 byte5 = null; 567 byte5 = null;
607 } 568 }
608 569
609 570
610 char1 = this.base32mapIndex[byte1 >> 3]; 571 char1 = this.base32mapIndex[byte1 >> 3];
611 char2 = char3 = char4 = char5 = char6 = char7 = char8 = "="; 572 char2 = char3 = char4 = char5 = char6 = char7 = char8 = "=";
612 573
613 if (byte2 != null) { 574 if (byte2 != null) {
614 char2 = this.base32mapIndex[((byte1 & 0x07) << 2) | ((byte2 & 0xc0) >> 6)]; 575 char2 = this.base32mapIndex[((byte1 & 0x07) << 2) | ((byte2 & 0xc0) >> 6)];
615 char3 = this.base32mapIndex[((byte2 & 0x3e) >> 1)]; 576 char3 = this.base32mapIndex[((byte2 & 0x3e) >> 1)];
616 if (byte3 != null) { 577 if (byte3 != null) {
617 char4 = this.base32mapIndex[((byte2 & 0x01) << 4) | ((byte3 & 0xf0) >> 4)]; 578 char4 = this.base32mapIndex[((byte2 & 0x01) << 4) | ((byte3 & 0xf0) >> 4)];
618 if (byte4 != null) { 579 if (byte4 != null) {
619 char5 = this.base32mapIndex[((byte3 & 0x0f) << 1) | ((byte4 & 0x80) >> 7)]; 580 char5 = this.base32mapIndex[((byte3 & 0x0f) << 1) | ((byte4 & 0x80) >> 7)];
@@ -635,379 +596,379 @@ Clipperz.ByteArray_abstract.prototype = MochiKit.Base.update(null, {
635 char2 = this.base32mapIndex[(byte1 & 0x07) << 2]; 596 char2 = this.base32mapIndex[(byte1 & 0x07) << 2];
636 } 597 }
637 598
638 result.push(char1 + char2 + char3 + char4 + char5 + char6 + char7 + char8); 599 result.push(char1 + char2 + char3 + char4 + char5 + char6 + char7 + char8);
639 i += 5; 600 i += 5;
640 } 601 }
641 602
642 return result.join(""); 603 return result.join("");
643 }, 604 },
644 605
645 //------------------------------------------------------------------------- 606 //-------------------------------------------------------------------------
646 607
647 'toBinaryString': function () { 608 'toBinaryString': function () {
648 vari, c; 609 vari, c;
649 var result; 610 var result;
650 611
651 result = ''; 612 result = '';
652 613
653 c = this.length(); 614 c = this.length();
654 for (i=0; i<c; i++) { 615 for (i=0; i<c; i++) {
655 result += String.fromCharCode(this.byteAtIndex(i)); 616 result += String.fromCharCode(this.byteAtIndex(i));
656 } 617 }
657 618
658 return result; 619 return result;
659 }, 620 },
660 621
661 622
662 //------------------------------------------------------------------------- 623 //-------------------------------------------------------------------------
663 624
664 'split': function(aStartingIndex, anEndingIndex) { 625 'split': function(aStartingIndex, anEndingIndex) {
665 throw Clipperz.Base.exception.AbstractMethod; 626 throw Clipperz.Base.exception.AbstractMethod;
666 }, 627 },
667 628
668 //------------------------------------------------------------------------- 629 //-------------------------------------------------------------------------
669 630
670 'increment': function() { 631 'increment': function() {
671 var i; 632 var i;
672 var done; 633 var done;
673 634
674 done = false; 635 done = false;
675 i = this.length() - 1; 636 i = this.length() - 1;
676 637
677 while ((i>=0) && (done == false)) { 638 while ((i>=0) && (done == false)) {
678 var currentByteValue; 639 var currentByteValue;
679 640
680 currentByteValue = this.byteAtIndex(i); 641 currentByteValue = this.byteAtIndex(i);
681 642
682 if (currentByteValue == 0xff) { 643 if (currentByteValue == 0xff) {
683 this.setByteAtIndex(0, i); 644 this.setByteAtIndex(0, i);
684 if (i>= 0) { 645 if (i>= 0) {
685 i --; 646 i --;
686 } else { 647 } else {
687 done = true; 648 done = true;
688 } 649 }
689 } else { 650 } else {
690 this.setByteAtIndex(currentByteValue + 1, i); 651 this.setByteAtIndex(currentByteValue + 1, i);
691 done = true; 652 done = true;
692 } 653 }
693 } 654 }
694 }, 655 },
695 656
696 //------------------------------------------------------------------------- 657 //-------------------------------------------------------------------------
697 658
698 'arrayValues': function() { 659 'arrayValues': function() {
699 throw Clipperz.Base.exception.AbstractMethod; 660 throw Clipperz.Base.exception.AbstractMethod;
700 }, 661 },
701 662
702 //------------------------------------------------------------------------- 663 //-------------------------------------------------------------------------
703 __syntaxFix__: "syntax fix" 664 __syntaxFix__: "syntax fix"
704 665
705}); 666});
706 667
707//============================================================================= 668//=============================================================================
708// 669//
709 //Clipperz.ByteArray_hex 670 //Clipperz.ByteArray_hex
710// 671//
711//============================================================================= 672//=============================================================================
712/* 673/*
713Clipperz.ByteArray_hex = function (args) { 674Clipperz.ByteArray_hex = function (args) {
714 this._value = ""; 675 this._value = "";
715 676
716 if (typeof(args) != 'undefined') { 677 if (typeof(args) != 'undefined') {
717 if (args.constructor == Array) { 678 if (args.constructor == Array) {
718 this.appendBytes(args); 679 this.appendBytes(args);
719 } else if (args.constructor == String) { 680 } else if (args.constructor == String) {
720 if (args.indexOf("0x") == 0) { 681 if (args.indexOf("0x") == 0) {
721 varvalue; 682 varvalue;
722 683
723 value = args.substring(2).toLowerCase(); 684 value = args.substring(2).toLowerCase();
724 if (/[0123456789abcdef]* /.test(value)) { the space in the regexp shoud be removed if the code is activate 685 if (/[0123456789abcdef]* /.test(value)) { the space in the regexp shoud be removed if the code is activate
725 if ((value.length % 2) == 0) { 686 if ((value.length % 2) == 0) {
726 this._value = value; 687 this._value = value;
727 } else { 688 } else {
728 this._value = "0" + value; 689 this._value = "0" + value;
729 } 690 }
730 } else { 691 } else {
731MochiKit.Logging.logError("Clipperz.ByteArray should be inizialized with an hex string."); 692Clipperz.logError("Clipperz.ByteArray should be inizialized with an hex string.");
732 throw Clipperz.ByteArray.exception.InvalidValue; 693 throw Clipperz.ByteArray.exception.InvalidValue;
733 } 694 }
734 } else { 695 } else {
735 varvalue; 696 varvalue;
736 vari,c; 697 vari,c;
737 698
738 c = args.length; 699 c = args.length;
739 value = new Array(c); 700 value = new Array(c);
740 for (i=0; i<c; i++) { 701 for (i=0; i<c; i++) {
741 value.push(Clipperz.ByteArray.unicodeToUtf8HexString(args.charCodeAt(i))); 702 value.push(Clipperz.ByteArray.unicodeToUtf8HexString(args.charCodeAt(i)));
742 } 703 }
743 704
744 this._value = value.join(""); 705 this._value = value.join("");
745 } 706 }
746 } else { 707 } else {
747 this.appendBytes(MochiKit.Base.extend(null, arguments)); 708 this.appendBytes(MochiKit.Base.extend(null, arguments));
748 } 709 }
749 } 710 }
750 return this; 711 return this;
751} 712}
752 713
753Clipperz.ByteArray_hex.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), { 714Clipperz.ByteArray_hex.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), {
754 715
755 //------------------------------------------------------------------------- 716 //-------------------------------------------------------------------------
756 717
757 'toString': function() { 718 'toString': function() {
758 return "Clipperz.ByteArray_hex"; 719 return "Clipperz.ByteArray_hex";
759 }, 720 },
760 721
761 //------------------------------------------------------------------------- 722 //-------------------------------------------------------------------------
762 723
763 'clone': function() { 724 'clone': function() {
764 var result; 725 var result;
765 726
766 result = this.newInstance(); 727 result = this.newInstance();
767 result._value = this._value; 728 result._value = this._value;
768 729
769 return result; 730 return result;
770 }, 731 },
771 732
772 //------------------------------------------------------------------------- 733 //-------------------------------------------------------------------------
773 734
774 'newInstance': function() { 735 'newInstance': function() {
775 return new Clipperz.ByteArray_hex(); 736 return new Clipperz.ByteArray_hex();
776 }, 737 },
777 738
778 //------------------------------------------------------------------------- 739 //-------------------------------------------------------------------------
779 740
780 'reset': function() { 741 'reset': function() {
781 this._value = ""; 742 this._value = "";
782 }, 743 },
783 744
784 //------------------------------------------------------------------------- 745 //-------------------------------------------------------------------------
785 746
786 'length': function() { 747 'length': function() {
787 return (this._value.length / 2); 748 return (this._value.length / 2);
788 }, 749 },
789 750
790 //------------------------------------------------------------------------- 751 //-------------------------------------------------------------------------
791 752
792 'appendBlock': function(aBlock) { 753 'appendBlock': function(aBlock) {
793 this._value = this._value += aBlock.toHexString().substring(2); 754 this._value = this._value += aBlock.toHexString().substring(2);
794 755
795 return this; 756 return this;
796 }, 757 },
797 758
798 //------------------------------------------------------------------------- 759 //-------------------------------------------------------------------------
799 760
800 'appendByte': function(aValue) { 761 'appendByte': function(aValue) {
801 if (aValue != null) { 762 if (aValue != null) {
802 this.checkByteValue(aValue); 763 this.checkByteValue(aValue);
803 this._value += Clipperz.ByteArray.byteToHex(aValue); 764 this._value += Clipperz.ByteArray.byteToHex(aValue);
804 } 765 }
805 766
806 return this; 767 return this;
807 }, 768 },
808 769
809 //------------------------------------------------------------------------- 770 //-------------------------------------------------------------------------
810 771
811 'byteAtIndex': function(anIndex) { 772 'byteAtIndex': function(anIndex) {
812 return parseInt(this._value.substr(anIndex*2, 2), 16); 773 return parseInt(this._value.substr(anIndex*2, 2), 16);
813 }, 774 },
814 775
815 'setByteAtIndex': function(aValue, anIndex) { 776 'setByteAtIndex': function(aValue, anIndex) {
816 varmissingBytes; 777 varmissingBytes;
817 778
818 this.checkByteValue(aValue); 779 this.checkByteValue(aValue);
819 780
820 missingBytes = anIndex - this.length(); 781 missingBytes = anIndex - this.length();
821 782
822 if (missingBytes < 0) { 783 if (missingBytes < 0) {
823 varcurrentValue; 784 varcurrentValue;
824 varfirstCutIndex; 785 varfirstCutIndex;
825 var secondCutIndex; 786 var secondCutIndex;
826 787
827 firstCutIndex = anIndex * 2; 788 firstCutIndex = anIndex * 2;
828 secondCutIndex = firstCutIndex + 2; 789 secondCutIndex = firstCutIndex + 2;
829 currentValue = this._value; 790 currentValue = this._value;
830 this._value =currentValue.substring(0, firstCutIndex) + 791 this._value =currentValue.substring(0, firstCutIndex) +
831 Clipperz.ByteArray.byteToHex(aValue) + 792 Clipperz.ByteArray.byteToHex(aValue) +
832 currentValue.substring(secondCutIndex); 793 currentValue.substring(secondCutIndex);
833 } else if (missingBytes == 0) { 794 } else if (missingBytes == 0) {
834 this.appendByte(aValue); 795 this.appendByte(aValue);
835 } else { 796 } else {
836 var i,c; 797 var i,c;
837 798
838 c = missingBytes; 799 c = missingBytes;
839 for (i=0; i<c; i++) { 800 for (i=0; i<c; i++) {
840 this.appendByte(0); 801 this.appendByte(0);
841 } 802 }
842 803
843 this.appendByte(aValue); 804 this.appendByte(aValue);
844 } 805 }
845 }, 806 },
846 807
847 //------------------------------------------------------------------------- 808 //-------------------------------------------------------------------------
848 809
849 'toHexString': function() { 810 'toHexString': function() {
850 return "0x" + this._value; 811 return "0x" + this._value;
851 }, 812 },
852 813
853 //------------------------------------------------------------------------- 814 //-------------------------------------------------------------------------
854 815
855 'split': function(aStartingIndex, anEndingIndex) { 816 'split': function(aStartingIndex, anEndingIndex) {
856 var result; 817 var result;
857 varstartingIndex; 818 varstartingIndex;
858 var endingIndex; 819 var endingIndex;
859 820
860 result = this.newInstance(); 821 result = this.newInstance();
861 822
862 startingIndex = aStartingIndex * 2; 823 startingIndex = aStartingIndex * 2;
863 if (typeof(anEndingIndex) != 'undefined') { 824 if (typeof(anEndingIndex) != 'undefined') {
864 endingIndex = anEndingIndex * 2; 825 endingIndex = anEndingIndex * 2;
865 result._value = this._value.substring(startingIndex, endingIndex); 826 result._value = this._value.substring(startingIndex, endingIndex);
866 } else { 827 } else {
867 result._value = this._value.substring(startingIndex); 828 result._value = this._value.substring(startingIndex);
868 } 829 }
869 830
870 return result; 831 return result;
871 }, 832 },
872 833
873 //------------------------------------------------------------------------- 834 //-------------------------------------------------------------------------
874 835
875 'arrayValues': function() { 836 'arrayValues': function() {
876 var result; 837 var result;
877 var i,c; 838 var i,c;
878 839
879 c = this.length(); 840 c = this.length();
880 841
881 result = new Array(c); 842 result = new Array(c);
882 for (i=0; i<c; i++) { 843 for (i=0; i<c; i++) {
883 result[i] = this.byteAtIndex(i); 844 result[i] = this.byteAtIndex(i);
884 } 845 }
885 846
886 return result; 847 return result;
887 }, 848 },
888 849
889 //------------------------------------------------------------------------- 850 //-------------------------------------------------------------------------
890 __syntaxFix__: "syntax fix" 851 __syntaxFix__: "syntax fix"
891}); 852});
892*/ 853*/
893 854
894//============================================================================= 855//=============================================================================
895// 856//
896 //Clipperz.ByteArray_array 857 //Clipperz.ByteArray_array
897// 858//
898//============================================================================= 859//=============================================================================
899 860
900Clipperz.ByteArray_array = function (args) { 861Clipperz.ByteArray_array = function (args) {
901 if (typeof(args) != 'undefined') { 862 if (typeof(args) != 'undefined') {
902 if (args.constructor == Array) { 863 if (args.constructor == Array) {
903 this._value = args.slice(0); 864 this._value = args.slice(0);
904 } else if (args.constructor == String) { 865 } else if (args.constructor == String) {
905 var result; 866 var result;
906 varvalue; 867 varvalue;
907 var i, c; 868 var i, c;
908 869
909 if (args.indexOf("0x") == 0) { 870 if (args.indexOf("0x") == 0) {
910 871
911 value = args.substring(2).toLowerCase(); 872 value = args.substring(2).toLowerCase();
912 if (/[0123456789abcdef]*/.test(value)) { 873 if (/[0123456789abcdef]*/.test(value)) {
913 if ((value.length % 2) != 0) { 874 if ((value.length % 2) != 0) {
914 value = "0" + value; 875 value = "0" + value;
915 } 876 }
916 } else { 877 } else {
917MochiKit.Logging.logError("Clipperz.ByteArray should be inizialized with an hex string."); 878 Clipperz.logError("Clipperz.ByteArray should be inizialized with an hex string.");
918 throw Clipperz.ByteArray.exception.InvalidValue; 879 throw Clipperz.ByteArray.exception.InvalidValue;
919 } 880 }
920 881
921 c = value.length / 2 882 c = value.length / 2
922 result = new Array(c); 883 result = new Array(c);
923 for (i=0; i<c; i++) { 884 for (i=0; i<c; i++) {
924 result[i] = parseInt(value.substr(i*2, 2), 16); 885 result[i] = parseInt(value.substr(i*2, 2), 16);
925 } 886 }
926 887
927 } else { 888 } else {
928 var unicode; 889 var unicode;
929 result = []; 890 result = [];
930 c = args.length; 891 c = args.length;
931 for (i=0; i<c; i++) { 892 for (i=0; i<c; i++) {
932 // Clipperz.ByteArray.pushUtf8BytesOfUnicodeChar(result, args.charCodeAt(i)); 893 // Clipperz.ByteArray.pushUtf8BytesOfUnicodeChar(result, args.charCodeAt(i));
933 894
934 unicode = args.charCodeAt(i); 895 unicode = args.charCodeAt(i);
935 if (unicode <= 0x7f) { //0x00000000 - 0x0000007f -> 0xxxxxxx 896 if (unicode <= 0x7f) { //0x00000000 - 0x0000007f -> 0xxxxxxx
936 result.push(unicode); 897 result.push(unicode);
937 // } else if ((unicode >= 0x80) && (unicode <= 0x7ff)) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx 898 // } else if ((unicode >= 0x80) && (unicode <= 0x7ff)) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
938 } else if (unicode <= 0x7ff) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx 899 } else if (unicode <= 0x7ff) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
939 result.push((unicode >> 6) | 0xc0); 900 result.push((unicode >> 6) | 0xc0);
940 result.push((unicode & 0x3F) | 0x80); 901 result.push((unicode & 0x3F) | 0x80);
941 // } else if ((unicode >= 0x0800) && (unicode <= 0xffff)) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx 902 // } else if ((unicode >= 0x0800) && (unicode <= 0xffff)) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
942 } else if (unicode <= 0xffff) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx 903 } else if (unicode <= 0xffff) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
943 result.push((unicode >> 12) | 0xe0); 904 result.push((unicode >> 12) | 0xe0);
944 result.push(((unicode >> 6) & 0x3f) | 0x80); 905 result.push(((unicode >> 6) & 0x3f) | 0x80);
945 result.push((unicode & 0x3f) | 0x80); 906 result.push((unicode & 0x3f) | 0x80);
946 } else { //0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 907 } else { //0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
947 result.push((unicode >> 18) | 0xf0); 908 result.push((unicode >> 18) | 0xf0);
948 result.push(((unicode >> 12) & 0x3f) | 0x80); 909 result.push(((unicode >> 12) & 0x3f) | 0x80);
949 result.push(((unicode >> 6) & 0x3f) | 0x80); 910 result.push(((unicode >> 6) & 0x3f) | 0x80);
950 result.push((unicode & 0x3f) | 0x80); 911 result.push((unicode & 0x3f) | 0x80);
951 } 912 }
952 } 913 }
953 } 914 }
954 915
955 916
956 this._value = result; 917 this._value = result;
957 } else { 918 } else {
958 this._value = []; 919 this._value = [];
959 this.appendBytes(MochiKit.Base.extend(null, arguments)); 920 this.appendBytes(MochiKit.Base.extend(null, arguments));
960 } 921 }
961 } else { 922 } else {
962 this._value = []; 923 this._value = [];
963 } 924 }
964 925
965 return this; 926 return this;
966} 927}
967 928
968Clipperz.ByteArray_array.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), { 929Clipperz.ByteArray_array.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), {
969 930
970 //------------------------------------------------------------------------- 931 //-------------------------------------------------------------------------
971 932
972 'toString': function() { 933 'toString': function() {
973 return "Clipperz.ByteArray_array"; 934 return "Clipperz.ByteArray_array";
974 }, 935 },
975 936
976 //------------------------------------------------------------------------- 937 //-------------------------------------------------------------------------
977 938
978 'clone': function() { 939 'clone': function() {
979 var result; 940 var result;
980 941
981 result = this.newInstance(); 942 result = this.newInstance();
982 result.appendBytes(this._value); 943 result.appendBytes(this._value);
983 944
984 return result; 945 return result;
985 }, 946 },
986 947
987 //------------------------------------------------------------------------- 948 //-------------------------------------------------------------------------
988 949
989 'newInstance': function() { 950 'newInstance': function() {
990 return new Clipperz.ByteArray_array(); 951 return new Clipperz.ByteArray_array();
991 }, 952 },
992 953
993 //------------------------------------------------------------------------- 954 //-------------------------------------------------------------------------
994 955
995 'reset': function() { 956 'reset': function() {
996 this._value = []; 957 this._value = [];
997 }, 958 },
998 959
999 //------------------------------------------------------------------------- 960 //-------------------------------------------------------------------------
1000 961
1001 'length': function() { 962 'length': function() {
1002 return (this._value.length); 963 return (this._value.length);
1003 }, 964 },
1004 965
1005 //------------------------------------------------------------------------- 966 //-------------------------------------------------------------------------
1006 967
1007 'appendBlock': function(aBlock) { 968 'appendBlock': function(aBlock) {
1008 MochiKit.Base.extend(this._value, aBlock._value); 969 MochiKit.Base.extend(this._value, aBlock._value);
1009 970
1010 return this; 971 return this;
1011 }, 972 },
1012 973
1013 //------------------------------------------------------------------------- 974 //-------------------------------------------------------------------------
@@ -1022,193 +983,193 @@ Clipperz.ByteArray_array.prototype = MochiKit.Base.update(new Clipperz.ByteArray
1022 }, 983 },
1023 984
1024 //------------------------------------------------------------------------- 985 //-------------------------------------------------------------------------
1025 986
1026 'byteAtIndex': function(anIndex) { 987 'byteAtIndex': function(anIndex) {
1027 return this._value[anIndex]; 988 return this._value[anIndex];
1028 }, 989 },
1029 990
1030 'setByteAtIndex': function(aValue, anIndex) { 991 'setByteAtIndex': function(aValue, anIndex) {
1031 varmissingBytes; 992 varmissingBytes;
1032 993
1033 this.checkByteValue(aValue); 994 this.checkByteValue(aValue);
1034 995
1035 missingBytes = anIndex - this.length(); 996 missingBytes = anIndex - this.length();
1036 997
1037 if (missingBytes < 0) { 998 if (missingBytes < 0) {
1038 this._value[anIndex] = aValue; 999 this._value[anIndex] = aValue;
1039 } else if (missingBytes == 0) { 1000 } else if (missingBytes == 0) {
1040 this._value.push(aValue); 1001 this._value.push(aValue);
1041 } else { 1002 } else {
1042 var i,c; 1003 var i,c;
1043 1004
1044 c = missingBytes; 1005 c = missingBytes;
1045 for (i=0; i<c; i++) { 1006 for (i=0; i<c; i++) {
1046 this._value.push(0); 1007 this._value.push(0);
1047 } 1008 }
1048 1009
1049 this._value.push(aValue); 1010 this._value.push(aValue);
1050 } 1011 }
1051 }, 1012 },
1052 1013
1053 //------------------------------------------------------------------------- 1014 //-------------------------------------------------------------------------
1054 1015
1055 'toHexString': function() { 1016 'toHexString': function() {
1056 var result; 1017 var result;
1057 var i, c; 1018 var i, c;
1058 1019
1059 result = "0x"; 1020 result = "0x";
1060 c = this.length(); 1021 c = this.length();
1061 for (i=0; i<c; i++) { 1022 for (i=0; i<c; i++) {
1062 result += Clipperz.ByteArray.byteToHex(this._value[i]); 1023 result += Clipperz.ByteArray.byteToHex(this._value[i]);
1063 } 1024 }
1064 1025
1065 return result; 1026 return result;
1066 }, 1027 },
1067 1028
1068 //------------------------------------------------------------------------- 1029 //-------------------------------------------------------------------------
1069 1030
1070 'split': function(aStartingIndex, anEndingIndex) { 1031 'split': function(aStartingIndex, anEndingIndex) {
1071 var result; 1032 var result;
1072 1033
1073 result = this.newInstance(); 1034 result = this.newInstance();
1074 result._value = this._value.slice(aStartingIndex, anEndingIndex ? anEndingIndex : this.length()); 1035 result._value = this._value.slice(aStartingIndex, anEndingIndex ? anEndingIndex : this.length());
1075 1036
1076 return result; 1037 return result;
1077 }, 1038 },
1078 1039
1079 //------------------------------------------------------------------------- 1040 //-------------------------------------------------------------------------
1080 1041
1081 'arrayValues': function() { 1042 'arrayValues': function() {
1082 return this._value.slice(0); 1043 return this._value.slice(0);
1083 }, 1044 },
1084 1045
1085 //------------------------------------------------------------------------- 1046 //-------------------------------------------------------------------------
1086 __syntaxFix__: "syntax fix" 1047 __syntaxFix__: "syntax fix"
1087}); 1048});
1088 1049
1089 1050
1090 1051
1091 1052
1092 1053
1093//============================================================================= 1054//=============================================================================
1094// 1055//
1095 //Clipperz.ByteArray_string 1056 //Clipperz.ByteArray_string
1096// 1057//
1097//============================================================================= 1058//=============================================================================
1098/* 1059/*
1099Clipperz.ByteArray_string = function (args) { 1060Clipperz.ByteArray_string = function (args) {
1100 this._value = ""; 1061 this._value = "";
1101 1062
1102 if (typeof(args) != 'undefined') { 1063 if (typeof(args) != 'undefined') {
1103 if (args.constructor == Array) { 1064 if (args.constructor == Array) {
1104 this.appendBytes(args); 1065 this.appendBytes(args);
1105 } else if (args.constructor == String) { 1066 } else if (args.constructor == String) {
1106 var result; 1067 var result;
1107 varvalue; 1068 varvalue;
1108 var i, c; 1069 var i, c;
1109 1070
1110 if (args.indexOf("0x") == 0) { 1071 if (args.indexOf("0x") == 0) {
1111 1072
1112 value = args.substring(2).toLowerCase(); 1073 value = args.substring(2).toLowerCase();
1113 if (/[0123456789abcdef]* /.test(value)) { the space in the regexp shoud be removed if the code is activated 1074 if (/[0123456789abcdef]* /.test(value)) { the space in the regexp shoud be removed if the code is activated
1114 if ((value.length % 2) != 0) { 1075 if ((value.length % 2) != 0) {
1115 value = "0" + value; 1076 value = "0" + value;
1116 } 1077 }
1117 } else { 1078 } else {
1118MochiKit.Logging.logError("Clipperz.ByteArray should be inizialized with an hex string."); 1079Clipperz.logError("Clipperz.ByteArray should be inizialized with an hex string.");
1119 throw Clipperz.ByteArray.exception.InvalidValue; 1080 throw Clipperz.ByteArray.exception.InvalidValue;
1120 } 1081 }
1121 } else { 1082 } else {
1122 value = ""; 1083 value = "";
1123 c = args.length; 1084 c = args.length;
1124 for (i=0; i<c; i++) { 1085 for (i=0; i<c; i++) {
1125 value += Clipperz.ByteArray.unicodeToUtf8HexString(args.charCodeAt(i)); 1086 value += Clipperz.ByteArray.unicodeToUtf8HexString(args.charCodeAt(i));
1126 } 1087 }
1127 } 1088 }
1128 1089
1129 c = value.length / 2 1090 c = value.length / 2
1130 for (i=0; i<c; i++) { 1091 for (i=0; i<c; i++) {
1131 this.appendByte(parseInt(value.substr(i*2, 2), 16)); 1092 this.appendByte(parseInt(value.substr(i*2, 2), 16));
1132 } 1093 }
1133 } else { 1094 } else {
1134 this.appendBytes(MochiKit.Base.extend(null, arguments)); 1095 this.appendBytes(MochiKit.Base.extend(null, arguments));
1135 } 1096 }
1136 } 1097 }
1137 1098
1138 return this; 1099 return this;
1139} 1100}
1140 1101
1141Clipperz.ByteArray_string.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), { 1102Clipperz.ByteArray_string.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), {
1142 1103
1143 //------------------------------------------------------------------------- 1104 //-------------------------------------------------------------------------
1144 1105
1145 'toString': function() { 1106 'toString': function() {
1146 return "Clipperz.ByteArray_string"; 1107 return "Clipperz.ByteArray_string";
1147 }, 1108 },
1148 1109
1149 //------------------------------------------------------------------------- 1110 //-------------------------------------------------------------------------
1150 1111
1151 'clone': function() { 1112 'clone': function() {
1152 var result; 1113 var result;
1153 1114
1154 result = this.newInstance(); 1115 result = this.newInstance();
1155 result._value = this._value; 1116 result._value = this._value;
1156 1117
1157 return result; 1118 return result;
1158 }, 1119 },
1159 1120
1160 //------------------------------------------------------------------------- 1121 //-------------------------------------------------------------------------
1161 1122
1162 'newInstance': function() { 1123 'newInstance': function() {
1163 return new Clipperz.ByteArray_string(); 1124 return new Clipperz.ByteArray_string();
1164 }, 1125 },
1165 1126
1166 //------------------------------------------------------------------------- 1127 //-------------------------------------------------------------------------
1167 1128
1168 'reset': function() { 1129 'reset': function() {
1169 this._value = ""; 1130 this._value = "";
1170 }, 1131 },
1171 1132
1172 //------------------------------------------------------------------------- 1133 //-------------------------------------------------------------------------
1173 1134
1174 'length': function() { 1135 'length': function() {
1175 return (this._value.length); 1136 return (this._value.length);
1176 }, 1137 },
1177 1138
1178 //------------------------------------------------------------------------- 1139 //-------------------------------------------------------------------------
1179 1140
1180 'appendBlock': function(aBlock) { 1141 'appendBlock': function(aBlock) {
1181 this._value += aBlock._value; 1142 this._value += aBlock._value;
1182 1143
1183 return this; 1144 return this;
1184 }, 1145 },
1185 1146
1186 //------------------------------------------------------------------------- 1147 //-------------------------------------------------------------------------
1187 1148
1188 'appendByte': function(aValue) { 1149 'appendByte': function(aValue) {
1189 if (aValue != null) { 1150 if (aValue != null) {
1190 this.checkByteValue(aValue); 1151 this.checkByteValue(aValue);
1191 this._value += String.fromCharCode(aValue); 1152 this._value += String.fromCharCode(aValue);
1192 } 1153 }
1193 1154
1194 return this; 1155 return this;
1195 }, 1156 },
1196 1157
1197 //------------------------------------------------------------------------- 1158 //-------------------------------------------------------------------------
1198 1159
1199 'byteAtIndex': function(anIndex) { 1160 'byteAtIndex': function(anIndex) {
1200 return this._value.charCodeAt(anIndex); 1161 return this._value.charCodeAt(anIndex);
1201 }, 1162 },
1202 1163
1203 'setByteAtIndex': function(aValue, anIndex) { 1164 'setByteAtIndex': function(aValue, anIndex) {
1204 varmissingBytes; 1165 varmissingBytes;
1205 1166
1206 this.checkByteValue(aValue); 1167 this.checkByteValue(aValue);
1207 1168
1208 missingBytes = anIndex - this.length(); 1169 missingBytes = anIndex - this.length();
1209 1170
1210 if (missingBytes < 0) { 1171 if (missingBytes < 0) {
1211 this._value = this._value.substring(0, anIndex) + String.fromCharCode(aValue) + this._value.substring(anIndex + 1); 1172 this._value = this._value.substring(0, anIndex) + String.fromCharCode(aValue) + this._value.substring(anIndex + 1);
1212 } else if (missingBytes == 0) { 1173 } else if (missingBytes == 0) {
1213 this.appendByte(aValue); 1174 this.appendByte(aValue);
1214 } else { 1175 } else {
diff --git a/frontend/gamma/js/Clipperz/CSVProcessor.js b/frontend/gamma/js/Clipperz/CSVProcessor.js
index 0b18731..1288ed7 100644
--- a/frontend/gamma/js/Clipperz/CSVProcessor.js
+++ b/frontend/gamma/js/Clipperz/CSVProcessor.js
@@ -1,346 +1,344 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27 25
28 26
29Clipperz.CSVProcessor = function(args) { 27Clipperz.CSVProcessor = function(args) {
30 args = args || {}; 28 args = args || {};
31 29
32 // this._status = undefined; 30 // this._status = undefined;
33 // this._error_input= undefined; 31 // this._error_input= undefined;
34 // this._string = undefined; 32 // this._string = undefined;
35 // this._fields = undefined; 33 // this._fields = undefined;
36 34
37 this._quoteChar = args['quoteChar'] ||"\042"; 35 this._quoteChar = args['quoteChar'] ||"\042";
38 this._eol = args['eol'] ||""; 36 this._eol = args['eol'] ||"";
39 this._escapeChar = args['escapeChar'] ||"\042"; 37 this._escapeChar = args['escapeChar'] ||"\042";
40 this._separatorChar = args['separatorChar'] ||","; 38 this._separatorChar = args['separatorChar'] ||",";
41 this._binary = args['binary'] ||false; 39 this._binary = args['binary'] ||false;
42 this._alwaysQuote = args['alwaysQuote'] ||false; 40 this._alwaysQuote = args['alwaysQuote'] ||false;
43 41
44 return this; 42 return this;
45} 43}
46 44
47//============================================================================= 45//=============================================================================
48 46
49Clipperz.CSVProcessor.prototype = MochiKit.Base.update(null, { 47Clipperz.CSVProcessor.prototype = MochiKit.Base.update(null, {
50 48
51 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
52 50
53 'quoteChar': function() { 51 'quoteChar': function() {
54 return this._quoteChar; 52 return this._quoteChar;
55 }, 53 },
56 54
57 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
58 56
59 'eol': function() { 57 'eol': function() {
60 return this._eol; 58 return this._eol;
61 }, 59 },
62 60
63 //------------------------------------------------------------------------- 61 //-------------------------------------------------------------------------
64 62
65 'escapeChar': function() { 63 'escapeChar': function() {
66 return this._escapeChar; 64 return this._escapeChar;
67 }, 65 },
68 66
69 //------------------------------------------------------------------------- 67 //-------------------------------------------------------------------------
70 68
71 'separatorChar': function() { 69 'separatorChar': function() {
72 return this._separatorChar; 70 return this._separatorChar;
73 }, 71 },
74 72
75 'setSeparatorChar': function(aValue) { 73 'setSeparatorChar': function(aValue) {
76 this._separatorChar = aValue; 74 this._separatorChar = aValue;
77 }, 75 },
78 76
79 //------------------------------------------------------------------------- 77 //-------------------------------------------------------------------------
80 78
81 'binary': function() { 79 'binary': function() {
82 return this._binary; 80 return this._binary;
83 }, 81 },
84 82
85 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
86 84
87 'alwaysQuote': function() { 85 'alwaysQuote': function() {
88 return this._alwaysQuote; 86 return this._alwaysQuote;
89 }, 87 },
90 88
91 //------------------------------------------------------------------------- 89 //-------------------------------------------------------------------------
92/* 90/*
93 'parse': function(aValue) { 91 'parse': function(aValue) {
94 var result; 92 var result;
95 var lines; 93 var lines;
96 var parameter; 94 var parameter;
97 95
98//MochiKit.Logging.logDebug(">>> CSVProcessor.parse"); 96//Clipperz.logDebug(">>> CSVProcessor.parse");
99 result = []; 97 result = [];
100 98
101 lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n* /g, "").replace(/\n$/g, "");; 99 lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n* /g, "").replace(/\n$/g, "");;
102 parameter = { 100 parameter = {
103 line: lines 101 line: lines
104 } 102 }
105 103
106 do { 104 do {
107 var fields; 105 var fields;
108 106
109 fields = this.parseLine(parameter); 107 fields = this.parseLine(parameter);
110 108
111 if (fields != null) { 109 if (fields != null) {
112 result.push(fields); 110 result.push(fields);
113 } 111 }
114 112
115 parameter.line = parameter.line.replace(/^\n* /g, "").replace(/\n$/g, ""); 113 parameter.line = parameter.line.replace(/^\n* /g, "").replace(/\n$/g, "");
116 114
117//MochiKit.Logging.logDebug("line: '" + parameter.line + "'"); 115//Clipperz.logDebug("line: '" + parameter.line + "'");
118 } while (parameter.line != ""); 116 } while (parameter.line != "");
119//MochiKit.Logging.logDebug("--- CSVProcessor.parse - result: " + Clipperz.Base.serializeJSON(result)); 117//Clipperz.logDebug("--- CSVProcessor.parse - result: " + Clipperz.Base.serializeJSON(result));
120//MochiKit.Logging.logDebug("<<< CSVProcessor.parse"); 118//Clipperz.logDebug("<<< CSVProcessor.parse");
121 119
122 return result; 120 return result;
123 }, 121 },
124*/ 122*/
125 //------------------------------------------------------------------------- 123 //-------------------------------------------------------------------------
126 124
127 'deferredParse_core': function(aContext) { 125 'deferredParse_core': function(aContext) {
128 var deferredResult; 126 var deferredResult;
129 127
130 if (aContext.line == "") { 128 if (aContext.line == "") {
131 deferredResult = MochiKit.Async.succeed(aContext.result); 129 deferredResult = MochiKit.Async.succeed(aContext.result);
132 } else { 130 } else {
133 var fields; 131 var fields;
134 132
135 fields = this.parseLine(aContext); 133 fields = this.parseLine(aContext);
136 if (fields != null) { 134 if (fields != null) {
137 aContext.result.push(fields); 135 aContext.result.push(fields);
138 } 136 }
139 137
140 aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, ""); 138 aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, "");
141 139
142 deferredResult = new Clipperz.Async.Deferred("CVSProcessor.deferredParse_core"); 140 deferredResult = new Clipperz.Async.Deferred("CVSProcessor.deferredParse_core");
143 // deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)}); 141 // deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
144 deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)}); 142 deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
145 deferredResult.addCallback(MochiKit.Async.wait, 0.2); 143 deferredResult.addCallback(MochiKit.Async.wait, 0.2);
146 deferredResult.addMethod(this, 'deferredParse_core') 144 deferredResult.addMethod(this, 'deferredParse_core')
147 deferredResult.callback(aContext); 145 deferredResult.callback(aContext);
148 } 146 }
149 147
150 return deferredResult; 148 return deferredResult;
151 }, 149 },
152 150
153 //......................................................................... 151 //.........................................................................
154 152
155 'deferredParse': function(aValue) { 153 'deferredParse': function(aValue) {
156 var deferredResult; 154 var deferredResult;
157 var lines; 155 var lines;
158 var context; 156 var context;
159 157
160 lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n*/g, "").replace(/\n$/g, ""); 158 lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n*/g, "").replace(/\n$/g, "");
161 159
162 context = { 160 context = {
163 line: lines, 161 line: lines,
164 size: lines.length, 162 size: lines.length,
165 result: [] 163 result: []
166 } 164 }
167 165
168 deferredResult = new Clipperz.Async.Deferred("CSVProcessor.deferredParse"); 166 deferredResult = new Clipperz.Async.Deferred("CSVProcessor.deferredParse");
169 deferredResult.addMethod(this, 'deferredParse_core'); 167 deferredResult.addMethod(this, 'deferredParse_core');
170 deferredResult.callback(context); 168 deferredResult.callback(context);
171 169
172 return deferredResult; 170 return deferredResult;
173 }, 171 },
174 172
175 //------------------------------------------------------------------------- 173 //-------------------------------------------------------------------------
176 174
177 'parseLine': function(aParameter) { 175 'parseLine': function(aParameter) {
178 var result; 176 var result;
179 var palatable; 177 var palatable;
180 var line; 178 var line;
181 var processedField; 179 var processedField;
182 180
183 result = []; 181 result = [];
184 182
185 do { 183 do {
186 processedField = this.parseField(aParameter); 184 processedField = this.parseField(aParameter);
187 if (processedField != null) { 185 if (processedField != null) {
188 result.push(processedField) 186 result.push(processedField)
189 }; 187 };
190 } while (processedField != null); 188 } while (processedField != null);
191 189
192 return result; 190 return result;
193 }, 191 },
194 192
195 //------------------------------------------------------------------------- 193 //-------------------------------------------------------------------------
196 194
197 'parseField': function(aParameter) { 195 'parseField': function(aParameter) {
198 var result; 196 var result;
199 197
200 var inQuotes; 198 var inQuotes;
201 var validRegExp; 199 var validRegExp;
202 var singleQuoteBeginRegexp; 200 var singleQuoteBeginRegexp;
203 var escapedQuoteBeginRegexp; 201 var escapedQuoteBeginRegexp;
204 var singleQuoteCommaEndRegexp; 202 var singleQuoteCommaEndRegexp;
205 var singleQuoteNewLineEndRegexp; 203 var singleQuoteNewLineEndRegexp;
206 var commaBeginRegexp; 204 var commaBeginRegexp;
207 var newlineRegexp; 205 var newlineRegexp;
208 206
209 207
210 singleQuoteBeginRegexp = new RegExp("^" + '\\' + this.quoteChar()); 208 singleQuoteBeginRegexp = new RegExp("^" + '\\' + this.quoteChar());
211 escapedQuoteBeginRegexp = new RegExp("^" + '\\' + this.escapeChar() + '\\' + this.quoteChar()); 209 escapedQuoteBeginRegexp = new RegExp("^" + '\\' + this.escapeChar() + '\\' + this.quoteChar());
212 singleQuoteCommaEndRegexp= new RegExp("^" + '\\' + this.quoteChar() + '\\' + this.separatorChar()); 210 singleQuoteCommaEndRegexp= new RegExp("^" + '\\' + this.quoteChar() + '\\' + this.separatorChar());
213 singleQuoteNewLineEndRegexp= new RegExp("^" + '\\' + this.quoteChar() + "\n"); 211 singleQuoteNewLineEndRegexp= new RegExp("^" + '\\' + this.quoteChar() + "\n");
214 commaBeginRegexp = new RegExp("^" + '\\' + this.separatorChar()); 212 commaBeginRegexp = new RegExp("^" + '\\' + this.separatorChar());
215 newlineRegexp = new RegExp("^\n"); 213 newlineRegexp = new RegExp("^\n");
216 214
217 inQuotes = false; 215 inQuotes = false;
218 216
219//MochiKit.Logging.logDebug("#################################### '" + aParameter.line + "'"); 217//Clipperz.logDebug("#################################### '" + aParameter.line + "'");
220 if (aParameter.line == "") { 218 if (aParameter.line == "") {
221 if (aParameter.isThereAnEmptyFinalField == true) { 219 if (aParameter.isThereAnEmptyFinalField == true) {
222 aParameter.isThereAnEmptyFinalField = false; 220 aParameter.isThereAnEmptyFinalField = false;
223 result = ""; 221 result = "";
224 } else { 222 } else {
225 result = null; 223 result = null;
226 } 224 }
227 } else { 225 } else {
228 if (this.binary()) { 226 if (this.binary()) {
229 validRegexp = /^./; 227 validRegexp = /^./;
230 // validRegexp = /^[^\\]/; 228 // validRegexp = /^[^\\]/;
231 } else { 229 } else {
232 validRegexp = /^[\t\040-\176]/; 230 validRegexp = /^[\t\040-\176]/;
233 } 231 }
234 232
235 try { 233 try {
236 var done; 234 var done;
237 235
238 done = false; 236 done = false;
239 result = ""; 237 result = "";
240 238
241 while (!done) { 239 while (!done) {
242 if (aParameter.line.length < 1) { 240 if (aParameter.line.length < 1) {
243//MochiKit.Logging.logDebug("---> 1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 241//Clipperz.logDebug("---> 1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
244 if (inQuotes == true) { 242 if (inQuotes == true) {
245//MochiKit.Logging.logDebug("---> 1.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 243//Clipperz.logDebug("---> 1.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
246 throw new Error("CSV Parsing error; end of string, missing closing double-quote..."); 244 throw new Error("CSV Parsing error; end of string, missing closing double-quote...");
247 } else { 245 } else {
248//MochiKit.Logging.logDebug("---> 1.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 246//Clipperz.logDebug("---> 1.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
249 done = true; 247 done = true;
250 } 248 }
251 } else if (escapedQuoteBeginRegexp.test(aParameter.line)) { 249 } else if (escapedQuoteBeginRegexp.test(aParameter.line)) {
252//MochiKit.Logging.logDebug("---> 2.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 250//Clipperz.logDebug("---> 2.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
253 result += this.quoteChar(); 251 result += this.quoteChar();
254 aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1); 252 aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1);
255//MochiKit.Logging.logDebug("<--- 2.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 253//Clipperz.logDebug("<--- 2.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
256 } else if (singleQuoteBeginRegexp.test(aParameter.line)) { 254 } else if (singleQuoteBeginRegexp.test(aParameter.line)) {
257//MochiKit.Logging.logDebug("---> 3: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 255//Clipperz.logDebug("---> 3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
258 if (inQuotes == true) { 256 if (inQuotes == true) {
259 if (aParameter.line.length == 1) { 257 if (aParameter.line.length == 1) {
260//MochiKit.Logging.logDebug("---> 3.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 258//Clipperz.logDebug("---> 3.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
261 aParameter.line = ''; 259 aParameter.line = '';
262 done = true; 260 done = true;
263 } else if (singleQuoteCommaEndRegexp.test(aParameter.line)) { 261 } else if (singleQuoteCommaEndRegexp.test(aParameter.line)) {
264//MochiKit.Logging.logDebug("---> 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 262//Clipperz.logDebug("---> 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
265 aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1); 263 aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1);
266 done = true; 264 done = true;
267//MochiKit.Logging.logDebug("<--- 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 265//Clipperz.logDebug("<--- 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
268 } else if (singleQuoteNewLineEndRegexp.test(aParameter.line)) { 266 } else if (singleQuoteNewLineEndRegexp.test(aParameter.line)) {
269 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); 267 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
270 done = true; 268 done = true;
271 } else { 269 } else {
272 throw new Error("CSV Parsing error; double-quote, followed by undesirable character (bad character sequence)... " + aParameter.line); 270 throw new Error("CSV Parsing error; double-quote, followed by undesirable character (bad character sequence)... " + aParameter.line);
273 } 271 }
274 } else { 272 } else {
275//MochiKit.Logging.logDebug("---> 4: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 273//Clipperz.logDebug("---> 4: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
276 if (result == "") { 274 if (result == "") {
277//MochiKit.Logging.logDebug("---> 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 275//Clipperz.logDebug("---> 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
278 inQuotes = true; 276 inQuotes = true;
279 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); 277 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
280//MochiKit.Logging.logDebug("<--- 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 278//Clipperz.logDebug("<--- 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
281 } else { 279 } else {
282 throw new Error("CSV Parsing error; double-quote, outside of double-quotes (bad character sequence)..."); 280 throw new Error("CSV Parsing error; double-quote, outside of double-quotes (bad character sequence)...");
283 } 281 }
284 } 282 }
285 } else if (commaBeginRegexp.test(aParameter.line)) { 283 } else if (commaBeginRegexp.test(aParameter.line)) {
286//MochiKit.Logging.logDebug("---> 5: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 284//Clipperz.logDebug("---> 5: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
287 if (inQuotes) { 285 if (inQuotes) {
288//MochiKit.Logging.logDebug("---> 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 286//Clipperz.logDebug("---> 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
289 result += aParameter.line.substr(0 ,1); 287 result += aParameter.line.substr(0 ,1);
290 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); 288 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
291//MochiKit.Logging.logDebug("<--- 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 289//Clipperz.logDebug("<--- 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
292 } else { 290 } else {
293//MochiKit.Logging.logDebug("---> 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 291//Clipperz.logDebug("---> 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
294 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); 292 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
295 if (newlineRegexp.test(aParameter.line) || aParameter.line == "") { 293 if (newlineRegexp.test(aParameter.line) || aParameter.line == "") {
296//MochiKit.Logging.logDebug("######"); 294//Clipperz.logDebug("######");
297 aParameter.isThereAnEmptyFinalField = true; 295 aParameter.isThereAnEmptyFinalField = true;
298 }; 296 };
299 done = true; 297 done = true;
300//MochiKit.Logging.logDebug("<--- 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 298//Clipperz.logDebug("<--- 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
301 } 299 }
302 } else if (validRegexp.test(aParameter.line)) { 300 } else if (validRegexp.test(aParameter.line)) {
303//MochiKit.Logging.logDebug("---> 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 301//Clipperz.logDebug("---> 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
304 result += aParameter.line.substr(0, 1); 302 result += aParameter.line.substr(0, 1);
305 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); 303 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
306//MochiKit.Logging.logDebug("<--- 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'"); 304//Clipperz.logDebug("<--- 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
307 } else if (newlineRegexp.test(aParameter.line)) { 305 } else if (newlineRegexp.test(aParameter.line)) {
308 if (inQuotes == true) { 306 if (inQuotes == true) {
309 result += aParameter.line.substr(0 ,1); 307 result += aParameter.line.substr(0 ,1);
310 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1); 308 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
311 } else { 309 } else {
312 if (result == "") { 310 if (result == "") {
313 if (aParameter.isThereAnEmptyFinalField == true) { 311 if (aParameter.isThereAnEmptyFinalField == true) {
314 aParameter.isThereAnEmptyFinalField = false; 312 aParameter.isThereAnEmptyFinalField = false;
315 } else { 313 } else {
316 result = null; 314 result = null;
317 } 315 }
318 } 316 }
319 317
320 done = true; 318 done = true;
321 } 319 }
322 } else { 320 } else {
323 throw new Error("CSV Parsing error; an undesirable character... '" + aParameter.line.substr(0,1) + "'"); 321 throw new Error("CSV Parsing error; an undesirable character... '" + aParameter.line.substr(0,1) + "'");
324 } 322 }
325 } 323 }
326 } catch(exception) { 324 } catch(exception) {
327 MochiKit.Logging.logError(exception.message); 325 Clipperz.logError(exception.message);
328 // result = null; 326 // result = null;
329 throw exception; 327 throw exception;
330 } 328 }
331 } 329 }
332 330
333//if (result != null) { 331//if (result != null) {
334 //MochiKit.Logging.logDebug("<=== result: '" + result.replace(/\n/g, "\\n") + "'"); 332 //Clipperz.logDebug("<=== result: '" + result.replace(/\n/g, "\\n") + "'");
335//} else { 333//} else {
336 //MochiKit.Logging.logDebug("<=== result: NULL"); 334 //Clipperz.logDebug("<=== result: NULL");
337//} 335//}
338 336
339 return result; 337 return result;
340 }, 338 },
341 339
342 //------------------------------------------------------------------------- 340 //-------------------------------------------------------------------------
343 __syntaxFix__: "syntax fix" 341 __syntaxFix__: "syntax fix"
344}); 342});
345 343
346 344
diff --git a/frontend/gamma/js/Clipperz/Crypto/AES.js b/frontend/gamma/js/Clipperz/Crypto/AES.js
index c811f1c..cb56f11 100644
--- a/frontend/gamma/js/Clipperz/Crypto/AES.js
+++ b/frontend/gamma/js/Clipperz/Crypto/AES.js
@@ -1,243 +1,240 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.Crypto.AES depends on Clipperz.ByteArray!"; 25 throw "Clipperz.Crypto.AES depends on Clipperz.ByteArray!";
28} 26}
29 27
30 //Dependency commented to avoid a circular reference 28 //Dependency commented to avoid a circular reference
31//try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) { 29//try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
32 //throw "Clipperz.Crypto.AES depends on Clipperz.Crypto.PRNG!"; 30 //throw "Clipperz.Crypto.AES depends on Clipperz.Crypto.PRNG!";
33//} 31//}
34 32
35if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; } 33if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; }
36 34
37//############################################################################# 35//#############################################################################
38 36
39Clipperz.Crypto.AES.DeferredExecutionContext = function(args) { 37Clipperz.Crypto.AES.DeferredExecutionContext = function(args) {
40 args = args || {}; 38 args = args || {};
41 39
42 this._key = args.key; 40 this._key = args.key;
43 this._message = args.message; 41 this._message = args.message;
44 this._result = args.message.clone(); 42 this._result = args.message.clone();
45 this._nonce = args.nonce; 43 this._nonce = args.nonce;
46 this._messageLength = this._message.length(); 44 this._messageLength = this._message.length();
47 45
48 this._messageArray = this._message.arrayValues(); 46 this._messageArray = this._message.arrayValues();
49 this._resultArray = this._result.arrayValues(); 47 this._resultArray = this._result.arrayValues();
50 this._nonceArray = this._nonce.arrayValues(); 48 this._nonceArray = this._nonce.arrayValues();
51 49
52 this._executionStep = 0; 50 this._executionStep = 0;
53 51
54 // this._elaborationChunkSize = 1024; // 4096; // 16384; //4096; 52 // this._elaborationChunkSize = 1024; // 4096; // 16384; //4096;
55 this._elaborationChunks = 10; 53 this._elaborationChunks = 10;
56 this._pauseTime = 0.02; // 0.02 //0.2; 54 this._pauseTime = 0.02; // 0.02 //0.2;
57 55
58 return this; 56 return this;
59} 57}
60 58
61Clipperz.Crypto.AES.DeferredExecutionContext.prototype = MochiKit.Base.update(null, { 59Clipperz.Crypto.AES.DeferredExecutionContext.prototype = MochiKit.Base.update(null, {
62 60
63 'key': function() { 61 'key': function() {
64 return this._key; 62 return this._key;
65 }, 63 },
66 64
67 'message': function() { 65 'message': function() {
68 return this._message; 66 return this._message;
69 }, 67 },
70 68
71 'messageLength': function() { 69 'messageLength': function() {
72 return this._messageLength; 70 return this._messageLength;
73 }, 71 },
74 72
75 'result': function() { 73 'result': function() {
76 return new Clipperz.ByteArray(this.resultArray()); 74 return new Clipperz.ByteArray(this.resultArray());
77 }, 75 },
78 76
79 'nonce': function() { 77 'nonce': function() {
80 return this._nonce; 78 return this._nonce;
81 }, 79 },
82 80
83 'messageArray': function() { 81 'messageArray': function() {
84 return this._messageArray; 82 return this._messageArray;
85 }, 83 },
86 84
87 'resultArray': function() { 85 'resultArray': function() {
88 return this._resultArray; 86 return this._resultArray;
89 }, 87 },
90 88
91 'nonceArray': function() { 89 'nonceArray': function() {
92 return this._nonceArray; 90 return this._nonceArray;
93 }, 91 },
94 92
95 'elaborationChunkSize': function() { 93 'elaborationChunkSize': function() {
96 // return Clipperz.Crypto.AES.DeferredExecution.chunkSize; 94 // return Clipperz.Crypto.AES.DeferredExecution.chunkSize;
97 // return this._elaborationChunkSize; 95 // return this._elaborationChunkSize;
98 return (this._elaborationChunks * 1024); 96 return (this._elaborationChunks * 1024);
99 }, 97 },
100 98
101 'executionStep': function() { 99 'executionStep': function() {
102 return this._executionStep; 100 return this._executionStep;
103 }, 101 },
104 102
105 'setExecutionStep': function(aValue) { 103 'setExecutionStep': function(aValue) {
106 this._executionStep = aValue; 104 this._executionStep = aValue;
107 }, 105 },
108 106
109 'tuneExecutionParameters': function (anElapsedTime) { 107 'tuneExecutionParameters': function (anElapsedTime) {
110//var originalChunks = this._elaborationChunks; 108//var originalChunks = this._elaborationChunks;
111 if (anElapsedTime > 0) { 109 if (anElapsedTime > 0) {
112 this._elaborationChunks = Math.round(this._elaborationChunks * ((anElapsedTime + 1000)/(anElapsedTime * 2))); 110 this._elaborationChunks = Math.round(this._elaborationChunks * ((anElapsedTime + 1000)/(anElapsedTime * 2)));
113 } 111 }
114//Clipperz.log("tuneExecutionParameters - elapsedTime: " + anElapsedTime + /*originalChunks,*/ " chunks # " + this._elaborationChunks + " [" + this._executionStep + " / " + this._messageLength + "]"); 112//Clipperz.log("tuneExecutionParameters - elapsedTime: " + anElapsedTime + /*originalChunks,*/ " chunks # " + this._elaborationChunks + " [" + this._executionStep + " / " + this._messageLength + "]");
115 }, 113 },
116 114
117 'pause': function(aValue) { 115 'pause': function(aValue) {
118 // return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue); 116 // return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue);
119 return MochiKit.Async.wait(this._pauseTime, aValue); 117 return MochiKit.Async.wait(this._pauseTime, aValue);
120 }, 118 },
121 119
122 'isDone': function () { 120 'isDone': function () {
123//console.log("isDone", this.executionStep(), this.messageLength());
124 return (this._executionStep >= this._messageLength); 121 return (this._executionStep >= this._messageLength);
125 }, 122 },
126 123
127 //----------------------------------------------------------------------------- 124 //-----------------------------------------------------------------------------
128 __syntaxFix__: "syntax fix" 125 __syntaxFix__: "syntax fix"
129 126
130}); 127});
131 128
132//############################################################################# 129//#############################################################################
133 130
134Clipperz.Crypto.AES.Key = function(args) { 131Clipperz.Crypto.AES.Key = function(args) {
135 args = args || {}; 132 args = args || {};
136 133
137 this._key = args.key; 134 this._key = args.key;
138 this._keySize = args.keySize || this.key().length(); 135 this._keySize = args.keySize || this.key().length();
139 136
140 if (this.keySize() == 128/8) { 137 if (this.keySize() == 128/8) {
141 this._b = 176; 138 this._b = 176;
142 this._numberOfRounds = 10; 139 this._numberOfRounds = 10;
143 } else if (this.keySize() == 256/8) { 140 } else if (this.keySize() == 256/8) {
144 this._b = 240; 141 this._b = 240;
145 this._numberOfRounds = 14; 142 this._numberOfRounds = 14;
146 } else { 143 } else {
147 MochiKit.Logging.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits"); 144 Clipperz.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits");
148 throw Clipperz.Crypto.AES.exception.UnsupportedKeySize; 145 throw Clipperz.Crypto.AES.exception.UnsupportedKeySize;
149 } 146 }
150 147
151 this._stretchedKey = null; 148 this._stretchedKey = null;
152 149
153 return this; 150 return this;
154} 151}
155 152
156Clipperz.Crypto.AES.Key.prototype = MochiKit.Base.update(null, { 153Clipperz.Crypto.AES.Key.prototype = MochiKit.Base.update(null, {
157 154
158 'asString': function() { 155 'asString': function() {
159 return "Clipperz.Crypto.AES.Key (" + this.key().toHexString() + ")"; 156 return "Clipperz.Crypto.AES.Key (" + this.key().toHexString() + ")";
160 }, 157 },
161 158
162 //----------------------------------------------------------------------------- 159 //-----------------------------------------------------------------------------
163 160
164 'key': function() { 161 'key': function() {
165 return this._key; 162 return this._key;
166 }, 163 },
167 164
168 'keySize': function() { 165 'keySize': function() {
169 return this._keySize; 166 return this._keySize;
170 }, 167 },
171 168
172 'b': function() { 169 'b': function() {
173 return this._b; 170 return this._b;
174 }, 171 },
175 172
176 'numberOfRounds': function() { 173 'numberOfRounds': function() {
177 return this._numberOfRounds; 174 return this._numberOfRounds;
178 }, 175 },
179 //========================================================================= 176 //=========================================================================
180 177
181 'keyScheduleCore': function(aWord, aRoundConstantsIndex) { 178 'keyScheduleCore': function(aWord, aRoundConstantsIndex) {
182 varresult; 179 varresult;
183 var sbox; 180 var sbox;
184 181
185 sbox = Clipperz.Crypto.AES.sbox(); 182 sbox = Clipperz.Crypto.AES.sbox();
186 183
187 result = [sbox[aWord[1]] ^ Clipperz.Crypto.AES.roundConstants()[aRoundConstantsIndex], 184 result = [sbox[aWord[1]] ^ Clipperz.Crypto.AES.roundConstants()[aRoundConstantsIndex],
188 sbox[aWord[2]], 185 sbox[aWord[2]],
189 sbox[aWord[3]], 186 sbox[aWord[3]],
190 sbox[aWord[0]]]; 187 sbox[aWord[0]]];
191 188
192 return result; 189 return result;
193 }, 190 },
194 191
195 //----------------------------------------------------------------------------- 192 //-----------------------------------------------------------------------------
196 193
197 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) { 194 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) {
198 varresult; 195 varresult;
199 var i,c; 196 var i,c;
200 197
201 result = []; 198 result = [];
202 c = 4; 199 c = 4;
203 for (i=0; i<c; i++) { 200 for (i=0; i<c; i++) {
204 result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i); 201 result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i);
205 } 202 }
206 203
207 return result; 204 return result;
208 }, 205 },
209 206
210 //----------------------------------------------------------------------------- 207 //-----------------------------------------------------------------------------
211 208
212 'sboxShakeup': function(aWord) { 209 'sboxShakeup': function(aWord) {
213 var result; 210 var result;
214 var sbox; 211 var sbox;
215 var i,c; 212 var i,c;
216 213
217 result = []; 214 result = [];
218 sbox = Clipperz.Crypto.AES.sbox(); 215 sbox = Clipperz.Crypto.AES.sbox();
219 c =4; 216 c =4;
220 for (i=0; i<c; i++) { 217 for (i=0; i<c; i++) {
221 result[i] = sbox[aWord[i]]; 218 result[i] = sbox[aWord[i]];
222 } 219 }
223 220
224 return result; 221 return result;
225 }, 222 },
226 223
227 //----------------------------------------------------------------------------- 224 //-----------------------------------------------------------------------------
228 225
229 'stretchKey': function(aKey) { 226 'stretchKey': function(aKey) {
230 varcurrentWord; 227 varcurrentWord;
231 varkeyLength; 228 varkeyLength;
232 varpreviousStretchIndex; 229 varpreviousStretchIndex;
233 var i,c; 230 var i,c;
234 231
235 keyLength = aKey.length(); 232 keyLength = aKey.length();
236 previousStretchIndex = keyLength - this.keySize(); 233 previousStretchIndex = keyLength - this.keySize();
237 234
238 currentWord = [aKey.byteAtIndex(keyLength - 4), 235 currentWord = [aKey.byteAtIndex(keyLength - 4),
239 aKey.byteAtIndex(keyLength - 3), 236 aKey.byteAtIndex(keyLength - 3),
240 aKey.byteAtIndex(keyLength - 2), 237 aKey.byteAtIndex(keyLength - 2),
241 aKey.byteAtIndex(keyLength - 1)]; 238 aKey.byteAtIndex(keyLength - 1)];
242 currentWord = this.keyScheduleCore(currentWord, keyLength / this.keySize()); 239 currentWord = this.keyScheduleCore(currentWord, keyLength / this.keySize());
243 240
@@ -715,152 +712,148 @@ MochiKit.Base.update(Clipperz.Crypto.AES, {
715 varmessageLength; 712 varmessageLength;
716 var blockSize; 713 var blockSize;
717 var executionLimit; 714 var executionLimit;
718 var startTime, endTime; 715 var startTime, endTime;
719 716
720 self = Clipperz.Crypto.AES; 717 self = Clipperz.Crypto.AES;
721 startTime = new Date(); 718 startTime = new Date();
722 blockSize = 128/8; 719 blockSize = 128/8;
723 messageLength = anExecutionContext.messageArray().length; 720 messageLength = anExecutionContext.messageArray().length;
724 nonce = anExecutionContext.nonceArray(); 721 nonce = anExecutionContext.nonceArray();
725 result = anExecutionContext.resultArray(); 722 result = anExecutionContext.resultArray();
726 723
727 messageIndex = anExecutionContext.executionStep(); 724 messageIndex = anExecutionContext.executionStep();
728 executionLimit = messageIndex + anExecutionContext.elaborationChunkSize(); 725 executionLimit = messageIndex + anExecutionContext.elaborationChunkSize();
729 executionLimit = Math.min(executionLimit, messageLength); 726 executionLimit = Math.min(executionLimit, messageLength);
730 727
731 while (messageIndex < executionLimit) { 728 while (messageIndex < executionLimit) {
732 var encryptedBlock; 729 var encryptedBlock;
733 var i,c; 730 var i,c;
734 731
735 self.incrementNonce(nonce); 732 self.incrementNonce(nonce);
736 encryptedBlock = self.encryptBlock(anExecutionContext.key(), nonce); 733 encryptedBlock = self.encryptBlock(anExecutionContext.key(), nonce);
737 734
738 if ((executionLimit - messageIndex) > blockSize) { 735 if ((executionLimit - messageIndex) > blockSize) {
739 c = blockSize; 736 c = blockSize;
740 } else { 737 } else {
741 c = executionLimit - messageIndex; 738 c = executionLimit - messageIndex;
742 } 739 }
743 740
744 for (i=0; i<c; i++) { 741 for (i=0; i<c; i++) {
745 result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i]; 742 result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i];
746 } 743 }
747 744
748 messageIndex += blockSize; 745 messageIndex += blockSize;
749 } 746 }
750 anExecutionContext.setExecutionStep(messageIndex); 747 anExecutionContext.setExecutionStep(messageIndex);
751 endTime = new Date(); 748 endTime = new Date();
752 anExecutionContext.tuneExecutionParameters(endTime - startTime); 749 anExecutionContext.tuneExecutionParameters(endTime - startTime);
753 750
754 return anExecutionContext; 751 return anExecutionContext;
755 }, 752 },
756 753
757 //----------------------------------------------------------------------------- 754 //-----------------------------------------------------------------------------
758/* 755/*
759 'deferredEncryptBlocks': function(anExecutionContext) { 756 'deferredEncryptBlocks': function(anExecutionContext) {
760 vardeferredResult; 757 vardeferredResult;
761 varmessageSize; 758 varmessageSize;
762 var i,c; 759 var i,c;
763 760
764 messageSize = anExecutionContext.messageLength(); 761 messageSize = anExecutionContext.messageLength();
765 762
766 deferredResult = new Clipperz.Async.Deferred("AES.deferredEncryptBloks"); 763 deferredResult = new Clipperz.Async.Deferred("AES.deferredEncryptBloks");
767 764
768 c = Math.ceil(messageSize / anExecutionContext.elaborationChunkSize()); 765 c = Math.ceil(messageSize / anExecutionContext.elaborationChunkSize());
769 for (i=0; i<c; i++) { 766 for (i=0; i<c; i++) {
770 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptExecutionChunk); 767 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptExecutionChunk);
771 deferredResult.addMethod(anExecutionContext, 'pause'); 768 deferredResult.addMethod(anExecutionContext, 'pause');
772 } 769 }
773 770
774 deferredResult.callback(anExecutionContext); 771 deferredResult.callback(anExecutionContext);
775 772
776 return deferredResult; 773 return deferredResult;
777 }, 774 },
778*/ 775*/
779 776
780 'deferredEncryptBlocks': function(anExecutionContext) { 777 'deferredEncryptBlocks': function(anExecutionContext) {
781 vardeferredResult; 778 vardeferredResult;
782 779
783 if (! anExecutionContext.isDone()) { 780 if (! anExecutionContext.isDone()) {
784 deferredResult = Clipperz.Async.callbacks("Clipperz.Crypto.AES.deferredEncryptBloks", [ 781 deferredResult = Clipperz.Async.callbacks("Clipperz.Crypto.AES.deferredEncryptBloks", [
785 Clipperz.Crypto.AES.deferredEncryptExecutionChunk, 782 Clipperz.Crypto.AES.deferredEncryptExecutionChunk,
786 MochiKit.Base.method(anExecutionContext, 'pause'), 783 MochiKit.Base.method(anExecutionContext, 'pause'),
787 Clipperz.Crypto.AES.deferredEncryptBlocks 784 Clipperz.Crypto.AES.deferredEncryptBlocks
788 ], {trace:false}, anExecutionContext); 785 ], {trace:false}, anExecutionContext);
789 } else { 786 } else {
790 deferredResult = MochiKit.Async.succeed(anExecutionContext); 787 deferredResult = MochiKit.Async.succeed(anExecutionContext);
791 } 788 }
792 789
793 return deferredResult; 790 return deferredResult;
794 }, 791 },
795 792
796 //----------------------------------------------------------------------------- 793 //-----------------------------------------------------------------------------
797 794
798 'deferredEncrypt': function(aKey, someData, aNonce) { 795 'deferredEncrypt': function(aKey, someData, aNonce) {
799 var deferredResult; 796 var deferredResult;
800 varexecutionContext; 797 varexecutionContext;
801 var result; 798 var result;
802 var nonce; 799 var nonce;
803 var key; 800 var key;
804 801
805 key = new Clipperz.Crypto.AES.Key({key:aKey}); 802 key = new Clipperz.Crypto.AES.Key({key:aKey});
806 nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8); 803 nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8);
807 804
808 executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:someData, nonce:nonce}); 805 executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:someData, nonce:nonce});
809 806
810 deferredResult = new Clipperz.Async.Deferred("AES.deferredEncrypt"); 807 deferredResult = new Clipperz.Async.Deferred("AES.deferredEncrypt");
811//deferredResult.addCallback(function (aValue) { console.log(">>> deferredEncrypt"); return aValue; });
812 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks); 808 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks);
813 deferredResult.addCallback(function(anExecutionContext) { 809 deferredResult.addCallback(function(anExecutionContext) {
814 var result; 810 var result;
815 811
816 result = anExecutionContext.nonce().clone(); 812 result = anExecutionContext.nonce().clone();
817 result.appendBytes(anExecutionContext.resultArray()); 813 result.appendBytes(anExecutionContext.resultArray());
818 814
819 return result; 815 return result;
820 }); 816 });
821//deferredResult.addCallback(function (aValue) { console.log("<<< deferredEncrypt"); return aValue; });
822 deferredResult.callback(executionContext) 817 deferredResult.callback(executionContext)
823 818
824 return deferredResult; 819 return deferredResult;
825 }, 820 },
826 821
827 //----------------------------------------------------------------------------- 822 //-----------------------------------------------------------------------------
828 823
829 'deferredDecrypt': function(aKey, someData) { 824 'deferredDecrypt': function(aKey, someData) {
830 var deferredResult 825 var deferredResult
831 var nonce; 826 var nonce;
832 var message; 827 var message;
833 var key; 828 var key;
834 829
835 key = new Clipperz.Crypto.AES.Key({key:aKey}); 830 key = new Clipperz.Crypto.AES.Key({key:aKey});
836 nonce = someData.split(0, (128/8)); 831 nonce = someData.split(0, (128/8));
837 message = someData.split(128/8); 832 message = someData.split(128/8);
838 executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:message, nonce:nonce}); 833 executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:message, nonce:nonce});
839 834
840 deferredResult = new Clipperz.Async.Deferred("AES.deferredDecrypt"); 835 deferredResult = new Clipperz.Async.Deferred("AES.deferredDecrypt");
841//deferredResult.addCallback(function (aValue) { console.log(">>> deferredDecrypt"); return aValue; });
842 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks); 836 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks);
843 deferredResult.addCallback(function(anExecutionContext) { 837 deferredResult.addCallback(function(anExecutionContext) {
844 return anExecutionContext.result(); 838 return anExecutionContext.result();
845 }); 839 });
846//deferredResult.addCallback(function (aValue) { console.log("<<< deferredDecrypt"); return aValue; });
847 deferredResult.callback(executionContext); 840 deferredResult.callback(executionContext);
848 841
849 return deferredResult; 842 return deferredResult;
850 }, 843 },
851 844
852 //----------------------------------------------------------------------------- 845 //-----------------------------------------------------------------------------
853 __syntaxFix__: "syntax fix" 846 __syntaxFix__: "syntax fix"
854 847
855}); 848});
856 849
857//############################################################################# 850//#############################################################################
858 851
859//Clipperz.Crypto.AES.DeferredExecution = { 852//Clipperz.Crypto.AES.DeferredExecution = {
860 // 'chunkSize': 16384, // 4096, // 1024 4096 8192 1638432768; 853 // 'chunkSize': 16384, // 4096, // 1024 4096 8192 1638432768;
861 // 'pauseTime': 0.02 //0.2 854 // 'pauseTime': 0.02 //0.2
862//} 855//}
863 856
864Clipperz.Crypto.AES.exception = { 857Clipperz.Crypto.AES.exception = {
865 'UnsupportedKeySize': new MochiKit.Base.NamedError("Clipperz.Crypto.AES.exception.UnsupportedKeySize") 858 'UnsupportedKeySize': new MochiKit.Base.NamedError("Clipperz.Crypto.AES.exception.UnsupportedKeySize")
866}; 859};
diff --git a/frontend/gamma/js/Clipperz/Crypto/Base.js b/frontend/gamma/js/Clipperz/Crypto/Base.js
index d3a8e36..9acfc49 100644
--- a/frontend/gamma/js/Clipperz/Crypto/Base.js
+++ b/frontend/gamma/js/Clipperz/Crypto/Base.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.Base) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.Base) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.Crypto.Base depends on Clipperz.Base!"; 25 throw "Clipperz.Crypto.Base depends on Clipperz.Base!";
28} 26}
29 27
30if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } 28if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
31if (typeof(Clipperz.Crypto.Base) == 'undefined') { Clipperz.Crypto.Base = {}; } 29if (typeof(Clipperz.Crypto.Base) == 'undefined') { Clipperz.Crypto.Base = {}; }
32 30
33Clipperz.Crypto.Base.VERSION = "0.1"; 31Clipperz.Crypto.Base.VERSION = "0.1";
34Clipperz.Crypto.Base.NAME = "Clipperz.Crypto.Base"; 32Clipperz.Crypto.Base.NAME = "Clipperz.Crypto.Base";
35 33
36//############################################################################# 34//#############################################################################
37 //Downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip (jsSha2/sha256.js) 35 //Downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip (jsSha2/sha256.js)
38//############################################################################# 36//#############################################################################
39 37
40/* A JavaScript implementation of the Secure Hash Algorithm, SHA-256 38/* A JavaScript implementation of the Secure Hash Algorithm, SHA-256
41 * Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/ 39 * Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/
42 * Distributed under the BSD License 40 * Distributed under the BSD License
43 * Some bits taken from Paul Johnston's SHA-1 implementation 41 * Some bits taken from Paul Johnston's SHA-1 implementation
44 */ 42 */
45var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ 43var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
46function safe_add (x, y) { 44function safe_add (x, y) {
47 var lsw = (x & 0xFFFF) + (y & 0xFFFF); 45 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
48 var msw = (x >> 16) + (y >> 16) + (lsw >> 16); 46 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
49 return (msw << 16) | (lsw & 0xFFFF); 47 return (msw << 16) | (lsw & 0xFFFF);
50} 48}
51function S (X, n) {return ( X >>> n ) | (X << (32 - n));} 49function S (X, n) {return ( X >>> n ) | (X << (32 - n));}
52function R (X, n) {return ( X >>> n );} 50function R (X, n) {return ( X >>> n );}
53function Ch(x, y, z) {return ((x & y) ^ ((~x) & z));} 51function Ch(x, y, z) {return ((x & y) ^ ((~x) & z));}
54function Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));} 52function Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));}
55function Sigma0256(x) {return (S(x, 2) ^ S(x, 13) ^ S(x, 22));} 53function Sigma0256(x) {return (S(x, 2) ^ S(x, 13) ^ S(x, 22));}
56function Sigma1256(x) {return (S(x, 6) ^ S(x, 11) ^ S(x, 25));} 54function Sigma1256(x) {return (S(x, 6) ^ S(x, 11) ^ S(x, 25));}
57function Gamma0256(x) {return (S(x, 7) ^ S(x, 18) ^ R(x, 3));} 55function Gamma0256(x) {return (S(x, 7) ^ S(x, 18) ^ R(x, 3));}
58function Gamma1256(x) {return (S(x, 17) ^ S(x, 19) ^ R(x, 10));} 56function Gamma1256(x) {return (S(x, 17) ^ S(x, 19) ^ R(x, 10));}
59function core_sha256 (m, l) { 57function core_sha256 (m, l) {
60 var K = new Array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2); 58 var K = new Array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2);
61 var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19); 59 var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
62 var W = new Array(64); 60 var W = new Array(64);
63 var a, b, c, d, e, f, g, h, i, j; 61 var a, b, c, d, e, f, g, h, i, j;
64 var T1, T2; 62 var T1, T2;
65 /* append padding */ 63 /* append padding */
66 m[l >> 5] |= 0x80 << (24 - l % 32); 64 m[l >> 5] |= 0x80 << (24 - l % 32);
67 m[((l + 64 >> 9) << 4) + 15] = l; 65 m[((l + 64 >> 9) << 4) + 15] = l;
68 for ( var i = 0; i<m.length; i+=16 ) { 66 for ( var i = 0; i<m.length; i+=16 ) {
69 a = HASH[0]; b = HASH[1]; c = HASH[2]; d = HASH[3]; e = HASH[4]; f = HASH[5]; g = HASH[6]; h = HASH[7]; 67 a = HASH[0]; b = HASH[1]; c = HASH[2]; d = HASH[3]; e = HASH[4]; f = HASH[5]; g = HASH[6]; h = HASH[7];
70 for ( var j = 0; j<64; j++) { 68 for ( var j = 0; j<64; j++) {
71 if (j < 16) W[j] = m[j + i]; 69 if (j < 16) W[j] = m[j + i];
72 else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]); 70 else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
73 T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]); 71 T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
74 T2 = safe_add(Sigma0256(a), Maj(a, b, c)); 72 T2 = safe_add(Sigma0256(a), Maj(a, b, c));
75 h = g; g = f; f = e; e = safe_add(d, T1); d = c; c = b; b = a; a = safe_add(T1, T2); 73 h = g; g = f; f = e; e = safe_add(d, T1); d = c; c = b; b = a; a = safe_add(T1, T2);
76 } 74 }
77 HASH[0] = safe_add(a, HASH[0]); HASH[1] = safe_add(b, HASH[1]); HASH[2] = safe_add(c, HASH[2]); HASH[3] = safe_add(d, HASH[3]); HASH[4] = safe_add(e, HASH[4]); HASH[5] = safe_add(f, HASH[5]); HASH[6] = safe_add(g, HASH[6]); HASH[7] = safe_add(h, HASH[7]); 75 HASH[0] = safe_add(a, HASH[0]); HASH[1] = safe_add(b, HASH[1]); HASH[2] = safe_add(c, HASH[2]); HASH[3] = safe_add(d, HASH[3]); HASH[4] = safe_add(e, HASH[4]); HASH[5] = safe_add(f, HASH[5]); HASH[6] = safe_add(g, HASH[6]); HASH[7] = safe_add(h, HASH[7]);
78 } 76 }
79 return HASH; 77 return HASH;
80} 78}
81function str2binb (str) { 79function str2binb (str) {
82 var bin = Array(); 80 var bin = Array();
83 var mask = (1 << chrsz) - 1; 81 var mask = (1 << chrsz) - 1;
84 for(var i = 0; i < str.length * chrsz; i += chrsz) 82 for(var i = 0; i < str.length * chrsz; i += chrsz)
85 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32); 83 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
86 return bin; 84 return bin;
87} 85}
88function binb2hex (binarray) { 86function binb2hex (binarray) {
89 var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ 87 var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
90 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; 88 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
91 var str = ""; 89 var str = "";
92 for (var i = 0; i < binarray.length * 4; i++) { 90 for (var i = 0; i < binarray.length * 4; i++) {
93 str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF); 91 str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
94 } 92 }
95 return str; 93 return str;
96} 94}
97function hex_sha256(s){return binb2hex(core_sha256(str2binb(s),s.length * chrsz));} 95function hex_sha256(s){return binb2hex(core_sha256(str2binb(s),s.length * chrsz));}
98 96
99 97
100 98
101//############################################################################# 99//#############################################################################
102 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (entropy.js) 100 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (entropy.js)
103//############################################################################# 101//#############################################################################
104 102
105 // Entropy collection utilities 103 // Entropy collection utilities
106 104
107 /*Start by declaring static storage and initialise 105 /*Start by declaring static storage and initialise
108 the entropy vector from the time we come through 106 the entropy vector from the time we come through
109 here. */ 107 here. */
110 108
111 var entropyData = new Array(); // Collected entropy data 109 var entropyData = new Array(); // Collected entropy data
112 var edlen = 0; // Keyboard array data length 110 var edlen = 0; // Keyboard array data length
113 111
114 addEntropyTime(); // Start entropy collection with page load time 112 addEntropyTime(); // Start entropy collection with page load time
115 ce(); // Roll milliseconds into initial entropy 113 ce(); // Roll milliseconds into initial entropy
116 114
117 //Add a byte to the entropy vector 115 //Add a byte to the entropy vector
118 116
diff --git a/frontend/gamma/js/Clipperz/Crypto/BigInt.js b/frontend/gamma/js/Clipperz/Crypto/BigInt.js
index 41483a3..031ed30 100644
--- a/frontend/gamma/js/Clipperz/Crypto/BigInt.js
+++ b/frontend/gamma/js/Clipperz/Crypto/BigInt.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } 25if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
28 26
29//############################################################################# 27//#############################################################################
30 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js 28 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js
31//############################################################################# 29//#############################################################################
32 30
33 31
34//////////////////////////////////////////////////////////////////////////////////////// 32////////////////////////////////////////////////////////////////////////////////////////
35// Big Integer Library v. 5.0 33// Big Integer Library v. 5.0
36// Created 2000, last modified 2006 34// Created 2000, last modified 2006
37// Leemon Baird 35// Leemon Baird
38// www.leemon.com 36// www.leemon.com
39// 37//
40// This file is public domain. You can use it for any purpose without restriction. 38// This file is public domain. You can use it for any purpose without restriction.
41// I do not guarantee that it is correct, so use it at your own risk. If you use 39// I do not guarantee that it is correct, so use it at your own risk. If you use
42// it for something interesting, I'd appreciate hearing about it. If you find 40// it for something interesting, I'd appreciate hearing about it. If you find
43// any bugs or make any improvements, I'd appreciate hearing about those too. 41// any bugs or make any improvements, I'd appreciate hearing about those too.
44// It would also be nice if my name and address were left in the comments. 42// It would also be nice if my name and address were left in the comments.
45// But none of that is required. 43// But none of that is required.
46// 44//
47// This code defines a bigInt library for arbitrary-precision integers. 45// This code defines a bigInt library for arbitrary-precision integers.
48// A bigInt is an array of integers storing the value in chunks of bpe bits, 46// A bigInt is an array of integers storing the value in chunks of bpe bits,
49// little endian (buff[0] is the least significant word). 47// little endian (buff[0] is the least significant word).
50// Negative bigInts are stored two's complement. 48// Negative bigInts are stored two's complement.
51// Some functions assume their parameters have at least one leading zero element. 49// Some functions assume their parameters have at least one leading zero element.
52// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow, 50// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow,
53// so the caller must make sure overflow won't happen. 51// so the caller must make sure overflow won't happen.
54// For each function where a parameter is modified, that same 52// For each function where a parameter is modified, that same
55// variable must not be used as another argument too. 53// variable must not be used as another argument too.
56// So, you cannot square x by doing multMod_(x,x,n). 54// So, you cannot square x by doing multMod_(x,x,n).
57// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n). 55// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n).
58// 56//
59// These functions are designed to avoid frequent dynamic memory allocation in the inner loop. 57// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.
60// For most functions, if it needs a BigInt as a local variable it will actually use 58// For most functions, if it needs a BigInt as a local variable it will actually use
61// a global, and will only allocate to it when it's not the right size. This ensures 59// a global, and will only allocate to it when it's not the right size. This ensures
62// that when a function is called repeatedly with same-sized parameters, it only allocates 60// that when a function is called repeatedly with same-sized parameters, it only allocates
63// memory on the first call. 61// memory on the first call.
64// 62//
65// Note that for cryptographic purposes, the calls to Math.random() must 63// Note that for cryptographic purposes, the calls to Math.random() must
66// be replaced with calls to a better pseudorandom number generator. 64// be replaced with calls to a better pseudorandom number generator.
67// 65//
68// In the following, "bigInt" means a bigInt with at least one leading zero element, 66// In the following, "bigInt" means a bigInt with at least one leading zero element,
69// and "integer" means a nonnegative integer less than radix. In some cases, integer 67// and "integer" means a nonnegative integer less than radix. In some cases, integer
70// can be negative. Negative bigInts are 2s complement. 68// can be negative. Negative bigInts are 2s complement.
71// 69//
72// The following functions do not modify their inputs, but dynamically allocate memory every time they are called: 70// The following functions do not modify their inputs, but dynamically allocate memory every time they are called:
73// 71//
74// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95 72// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95
75// function dup(x) //returns a copy of bigInt x 73// function dup(x) //returns a copy of bigInt x
76// function findPrimes(n) //return array of all primes less than integer n 74// function findPrimes(n) //return array of all primes less than integer n
77// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements 75// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements
78// function int2bigInt(s,b,n,m) //convert string s in base b to a bigInt with at least n bits and m array elements 76// function int2bigInt(s,b,n,m) //convert string s in base b to a bigInt with at least n bits and m array elements
79// function trim(x,k) //return a copy of x with exactly k leading zero elements 77// function trim(x,k) //return a copy of x with exactly k leading zero elements
80// 78//
81// The following functions do not modify their inputs, so there is never a problem with the result being too big: 79// The following functions do not modify their inputs, so there is never a problem with the result being too big:
82// 80//
83// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros 81// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros
84// function equals(x,y) //is the bigInt x equal to the bigint y? 82// function equals(x,y) //is the bigInt x equal to the bigint y?
85// function equalsInt(x,y) //is bigint x equal to integer y? 83// function equalsInt(x,y) //is bigint x equal to integer y?
86// function greater(x,y) //is x>y? (x and y are nonnegative bigInts) 84// function greater(x,y) //is x>y? (x and y are nonnegative bigInts)
87// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y? 85// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?
88// function isZero(x) //is the bigInt x equal to zero? 86// function isZero(x) //is the bigInt x equal to zero?
89// function millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime (as opposed to definitely composite)? 87// function millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime (as opposed to definitely composite)?
90// function modInt(x,n) //return x mod n for bigInt x and integer n. 88// function modInt(x,n) //return x mod n for bigInt x and integer n.
91// function negative(x) //is bigInt x negative? 89// function negative(x) //is bigInt x negative?
92// 90//
93// The following functions do not modify their inputs, but allocate memory and call functions with underscores 91// The following functions do not modify their inputs, but allocate memory and call functions with underscores
94// 92//
95// function add(x,y) //return (x+y) for bigInts x and y. 93// function add(x,y) //return (x+y) for bigInts x and y.
96// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer. 94// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.
97// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed 95// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed
98// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null 96// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
99// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n. 97// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.
100// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x. 98// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.
101// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x. 99// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
102// function powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n. 100// function powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
103// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm. 101// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm.
104// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement 102// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement
105// 103//
106// The following functions write a bigInt result to one of the parameters, but 104// The following functions write a bigInt result to one of the parameters, but
107// the result is never bigger than the original, so there can't be overflow problems: 105// the result is never bigger than the original, so there can't be overflow problems:
108// 106//
109// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder 107// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder
110// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). 108// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed).
111// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement 109// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
112// function mod_(x,n) //do x=x mod n for bigInts x and n. 110// function mod_(x,n) //do x=x mod n for bigInts x and n.
113// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe. 111// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe.
114// 112//
115// The following functions write a bigInt result to one of the parameters. The caller is responsible for 113// The following functions write a bigInt result to one of the parameters. The caller is responsible for
116// ensuring it is large enough to hold the result. 114// ensuring it is large enough to hold the result.
117// 115//
118// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer 116// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer
@@ -1384,193 +1382,192 @@ function mont_(x,y,n,np) {
1384 } 1382 }
1385 for (;j<kn;j++) { 1383 for (;j<kn;j++) {
1386 c+=sa[j]+ui*n[j]; 1384 c+=sa[j]+ui*n[j];
1387 sa[j-1]=c & mask; 1385 sa[j-1]=c & mask;
1388 c>>=bpe; 1386 c>>=bpe;
1389 } 1387 }
1390 sa[j-1]=c & mask; 1388 sa[j-1]=c & mask;
1391 } 1389 }
1392 1390
1393 if (!greater(n,sa)) 1391 if (!greater(n,sa))
1394 sub_(sa,n); 1392 sub_(sa,n);
1395 copy_(x,sa); 1393 copy_(x,sa);
1396} 1394}
1397 1395
1398 1396
1399 1397
1400 1398
1401//############################################################################# 1399//#############################################################################
1402//############################################################################# 1400//#############################################################################
1403//############################################################################# 1401//#############################################################################
1404//############################################################################# 1402//#############################################################################
1405//############################################################################# 1403//#############################################################################
1406//############################################################################# 1404//#############################################################################
1407//############################################################################# 1405//#############################################################################
1408 1406
1409 1407
1410 1408
1411 1409
1412 1410
1413//############################################################################# 1411//#############################################################################
1414 1412
1415Clipperz.Crypto.BigInt = function (aValue, aBase) { 1413Clipperz.Crypto.BigInt = function (aValue, aBase) {
1416 varbase; 1414 varbase;
1417 varvalue; 1415 varvalue;
1418 1416
1419 if (typeof(aValue) == 'object') { 1417 if (typeof(aValue) == 'object') {
1420 this._internalValue = aValue; 1418 this._internalValue = aValue;
1421 } else { 1419 } else {
1422 if (typeof(aValue) == 'undefined') { 1420 if (typeof(aValue) == 'undefined') {
1423 value = "0"; 1421 value = "0";
1424 } else { 1422 } else {
1425 value = aValue + ""; 1423 value = aValue + "";
1426 } 1424 }
1427 1425
1428 if (typeof(aBase) == 'undefined') { 1426 if (typeof(aBase) == 'undefined') {
1429 base = 10; 1427 base = 10;
1430 } else { 1428 } else {
1431 base = aBase; 1429 base = aBase;
1432 } 1430 }
1433 1431
1434 this._internalValue = str2bigInt(value, base, 1, 1); 1432 this._internalValue = str2bigInt(value, base, 1, 1);
1435 } 1433 }
1436 1434
1437 return this; 1435 return this;
1438} 1436}
1439 1437
1440//============================================================================= 1438//=============================================================================
1441 1439
1442MochiKit.Base.update(Clipperz.Crypto.BigInt.prototype, { 1440MochiKit.Base.update(Clipperz.Crypto.BigInt.prototype, {
1443 1441
1444 'clone': function() { 1442 'clone': function() {
1445 return new Clipperz.Crypto.BigInt(this.internalValue()); 1443 return new Clipperz.Crypto.BigInt(this.internalValue());
1446 }, 1444 },
1447 1445
1448 //------------------------------------------------------------------------- 1446 //-------------------------------------------------------------------------
1449 1447
1450 'internalValue': function () { 1448 'internalValue': function () {
1451 return this._internalValue; 1449 return this._internalValue;
1452 }, 1450 },
1453 1451
1454 //------------------------------------------------------------------------- 1452 //-------------------------------------------------------------------------
1455 1453
1456 'isBigInt': true, 1454 'isBigInt': true,
1457 1455
1458 //------------------------------------------------------------------------- 1456 //-------------------------------------------------------------------------
1459 1457
1460 'toString': function(aBase) { 1458 'toString': function(aBase) {
1461 return this.asString(aBase); 1459 return this.asString(aBase);
1462 }, 1460 },
1463 1461
1464 //------------------------------------------------------------------------- 1462 //-------------------------------------------------------------------------
1465 1463
1466 'asString': function (aBase, minimumLength) { 1464 'asString': function (aBase, minimumLength) {
1467 varresult; 1465 varresult;
1468 varbase; 1466 varbase;
1469 1467
1470 if (typeof(aBase) == 'undefined') { 1468 if (typeof(aBase) == 'undefined') {
1471 base = 10; 1469 base = 10;
1472 } else { 1470 } else {
1473 base = aBase; 1471 base = aBase;
1474 } 1472 }
1475 1473
1476 result = bigInt2str(this.internalValue(), base).toLowerCase(); 1474 result = bigInt2str(this.internalValue(), base).toLowerCase();
1477 1475
1478 if ((typeof(minimumLength) != 'undefined') && (result.length < minimumLength)) { 1476 if ((typeof(minimumLength) != 'undefined') && (result.length < minimumLength)) {
1479 var i, c; 1477 var i, c;
1480 //MochiKit.Logging.logDebug(">>> FIXING BigInt.asString length issue")
1481 c = (minimumLength - result.length); 1478 c = (minimumLength - result.length);
1482 for (i=0; i<c; i++) { 1479 for (i=0; i<c; i++) {
1483 result = '0' + result; 1480 result = '0' + result;
1484 } 1481 }
1485 } 1482 }
1486 1483
1487 return result; 1484 return result;
1488 }, 1485 },
1489 1486
1490 //------------------------------------------------------------------------- 1487 //-------------------------------------------------------------------------
1491 1488
1492 'asByteArray': function() { 1489 'asByteArray': function() {
1493 return new Clipperz.ByteArray("0x" + this.asString(16), 16); 1490 return new Clipperz.ByteArray("0x" + this.asString(16), 16);
1494 }, 1491 },
1495 1492
1496 //------------------------------------------------------------------------- 1493 //-------------------------------------------------------------------------
1497 1494
1498 'equals': function (aValue) { 1495 'equals': function (aValue) {
1499 var result; 1496 var result;
1500 1497
1501 if (aValue.isBigInt) { 1498 if (aValue.isBigInt) {
1502 result = equals(this.internalValue(), aValue.internalValue()); 1499 result = equals(this.internalValue(), aValue.internalValue());
1503 } else if (typeof(aValue) == "number") { 1500 } else if (typeof(aValue) == "number") {
1504 result = equalsInt(this.internalValue(), aValue); 1501 result = equalsInt(this.internalValue(), aValue);
1505 } else { 1502 } else {
1506 throw Clipperz.Crypt.BigInt.exception.UnknownType; 1503 throw Clipperz.Crypt.BigInt.exception.UnknownType;
1507 } 1504 }
1508 1505
1509 return result; 1506 return result;
1510 }, 1507 },
1511 1508
1512 //------------------------------------------------------------------------- 1509 //-------------------------------------------------------------------------
1513 1510
1514 'compare': function(aValue) { 1511 'compare': function(aValue) {
1515/* 1512/*
1516 var result; 1513 var result;
1517 var thisAsString; 1514 var thisAsString;
1518 var aValueAsString; 1515 var aValueAsString;
1519 1516
1520 thisAsString = this.asString(10); 1517 thisAsString = this.asString(10);
1521 aValueAsString = aValue.asString(10); 1518 aValueAsString = aValue.asString(10);
1522 1519
1523 result = MochiKit.Base.compare(thisAsString.length, aValueAsString.length); 1520 result = MochiKit.Base.compare(thisAsString.length, aValueAsString.length);
1524 if (result == 0) { 1521 if (result == 0) {
1525 result = MochiKit.Base.compare(thisAsString, aValueAsString); 1522 result = MochiKit.Base.compare(thisAsString, aValueAsString);
1526 } 1523 }
1527 1524
1528 return result; 1525 return result;
1529*/ 1526*/
1530 var result; 1527 var result;
1531 1528
1532 if (equals(this.internalValue(), aValue.internalValue())) { 1529 if (equals(this.internalValue(), aValue.internalValue())) {
1533 result = 0; 1530 result = 0;
1534 } else if (greater(this.internalValue(), aValue.internalValue())) { 1531 } else if (greater(this.internalValue(), aValue.internalValue())) {
1535 result = 1; 1532 result = 1;
1536 } else { 1533 } else {
1537 result = -1; 1534 result = -1;
1538 } 1535 }
1539 1536
1540 return result; 1537 return result;
1541 }, 1538 },
1542 1539
1543 //------------------------------------------------------------------------- 1540 //-------------------------------------------------------------------------
1544 1541
1545 'add': function (aValue) { 1542 'add': function (aValue) {
1546 var result; 1543 var result;
1547 1544
1548 if (aValue.isBigInt) { 1545 if (aValue.isBigInt) {
1549 result = add(this.internalValue(), aValue.internalValue()); 1546 result = add(this.internalValue(), aValue.internalValue());
1550 } else { 1547 } else {
1551 result = addInt(this.internalValue(), aValue); 1548 result = addInt(this.internalValue(), aValue);
1552 } 1549 }
1553 1550
1554 return new Clipperz.Crypto.BigInt(result); 1551 return new Clipperz.Crypto.BigInt(result);
1555 }, 1552 },
1556 1553
1557 //------------------------------------------------------------------------- 1554 //-------------------------------------------------------------------------
1558 1555
1559 'subtract': function (aValue) { 1556 'subtract': function (aValue) {
1560 var result; 1557 var result;
1561 var value; 1558 var value;
1562 1559
1563 if (aValue.isBigInt) { 1560 if (aValue.isBigInt) {
1564 value = aValue; 1561 value = aValue;
1565 } else { 1562 } else {
1566 value = new Clipperz.Crypto.BigInt(aValue); 1563 value = new Clipperz.Crypto.BigInt(aValue);
1567 } 1564 }
1568 1565
1569 result = sub(this.internalValue(), value.internalValue()); 1566 result = sub(this.internalValue(), value.internalValue());
1570 1567
1571 return new Clipperz.Crypto.BigInt(result); 1568 return new Clipperz.Crypto.BigInt(result);
1572 }, 1569 },
1573 1570
1574 //------------------------------------------------------------------------- 1571 //-------------------------------------------------------------------------
1575 1572
1576 'multiply': function (aValue, aModule) { 1573 'multiply': function (aValue, aModule) {
diff --git a/frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js b/frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js
index f91c7e9..bc60330 100644
--- a/frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js
+++ b/frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } 25if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
28 26
29if (typeof(Leemon) == 'undefined') { Leemon = {}; } 27if (typeof(Leemon) == 'undefined') { Leemon = {}; }
30if (typeof(Baird.Crypto) == 'undefined') { Baird.Crypto = {}; } 28if (typeof(Baird.Crypto) == 'undefined') { Baird.Crypto = {}; }
31if (typeof(Baird.Crypto.BigInt) == 'undefined') { Baird.Crypto.BigInt = {}; } 29if (typeof(Baird.Crypto.BigInt) == 'undefined') { Baird.Crypto.BigInt = {}; }
32 30
33 31
34//############################################################################# 32//#############################################################################
35 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js 33 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js
36//############################################################################# 34//#############################################################################
37 35
38//////////////////////////////////////////////////////////////////////////////////////// 36////////////////////////////////////////////////////////////////////////////////////////
39// Big Integer Library v. 5.0 37// Big Integer Library v. 5.0
40// Created 2000, last modified 2006 38// Created 2000, last modified 2006
41// Leemon Baird 39// Leemon Baird
42// www.leemon.com 40// www.leemon.com
43// 41//
44// This file is public domain. You can use it for any purpose without restriction. 42// This file is public domain. You can use it for any purpose without restriction.
45// I do not guarantee that it is correct, so use it at your own risk. If you use 43// I do not guarantee that it is correct, so use it at your own risk. If you use
46// it for something interesting, I'd appreciate hearing about it. If you find 44// it for something interesting, I'd appreciate hearing about it. If you find
47// any bugs or make any improvements, I'd appreciate hearing about those too. 45// any bugs or make any improvements, I'd appreciate hearing about those too.
48// It would also be nice if my name and address were left in the comments. 46// It would also be nice if my name and address were left in the comments.
49// But none of that is required. 47// But none of that is required.
50// 48//
51// This code defines a bigInt library for arbitrary-precision integers. 49// This code defines a bigInt library for arbitrary-precision integers.
52// A bigInt is an array of integers storing the value in chunks of bpe bits, 50// A bigInt is an array of integers storing the value in chunks of bpe bits,
53// little endian (buff[0] is the least significant word). 51// little endian (buff[0] is the least significant word).
54// Negative bigInts are stored two's complement. 52// Negative bigInts are stored two's complement.
55// Some functions assume their parameters have at least one leading zero element. 53// Some functions assume their parameters have at least one leading zero element.
56// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow, 54// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow,
57// so the caller must make sure overflow won't happen. 55// so the caller must make sure overflow won't happen.
58// For each function where a parameter is modified, that same 56// For each function where a parameter is modified, that same
59// variable must not be used as another argument too. 57// variable must not be used as another argument too.
60// So, you cannot square x by doing multMod_(x,x,n). 58// So, you cannot square x by doing multMod_(x,x,n).
61// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n). 59// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n).
62// 60//
63// These functions are designed to avoid frequent dynamic memory allocation in the inner loop. 61// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.
64// For most functions, if it needs a BigInt as a local variable it will actually use 62// For most functions, if it needs a BigInt as a local variable it will actually use
65// a global, and will only allocate to it when it's not the right size. This ensures 63// a global, and will only allocate to it when it's not the right size. This ensures
66// that when a function is called repeatedly with same-sized parameters, it only allocates 64// that when a function is called repeatedly with same-sized parameters, it only allocates
67// memory on the first call. 65// memory on the first call.
68// 66//
69// Note that for cryptographic purposes, the calls to Math.random() must 67// Note that for cryptographic purposes, the calls to Math.random() must
70// be replaced with calls to a better pseudorandom number generator. 68// be replaced with calls to a better pseudorandom number generator.
71// 69//
72// In the following, "bigInt" means a bigInt with at least one leading zero element, 70// In the following, "bigInt" means a bigInt with at least one leading zero element,
73// and "integer" means a nonnegative integer less than radix. In some cases, integer 71// and "integer" means a nonnegative integer less than radix. In some cases, integer
74// can be negative. Negative bigInts are 2s complement. 72// can be negative. Negative bigInts are 2s complement.
75// 73//
76// The following functions do not modify their inputs, but dynamically allocate memory every time they are called: 74// The following functions do not modify their inputs, but dynamically allocate memory every time they are called:
77// 75//
78// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95 76// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95
79// function dup(x) //returns a copy of bigInt x 77// function dup(x) //returns a copy of bigInt x
80// function findPrimes(n) //return array of all primes less than integer n 78// function findPrimes(n) //return array of all primes less than integer n
81// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements 79// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements
82// function str2bigInt(s,b,n,m) //convert string s in base b to a bigInt with at least n bits and m array elements 80// function str2bigInt(s,b,n,m) //convert string s in base b to a bigInt with at least n bits and m array elements
83// function trim(x,k) //return a copy of x with exactly k leading zero elements 81// function trim(x,k) //return a copy of x with exactly k leading zero elements
84// 82//
85// The following functions do not modify their inputs, so there is never a problem with the result being too big: 83// The following functions do not modify their inputs, so there is never a problem with the result being too big:
86// 84//
87// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros 85// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros
88// function equals(x,y) //is the bigInt x equal to the bigint y? 86// function equals(x,y) //is the bigInt x equal to the bigint y?
89// function equalsInt(x,y) //is bigint x equal to integer y? 87// function equalsInt(x,y) //is bigint x equal to integer y?
90// function greater(x,y) //is x>y? (x and y are nonnegative bigInts) 88// function greater(x,y) //is x>y? (x and y are nonnegative bigInts)
91// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y? 89// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?
92// function isZero(x) //is the bigInt x equal to zero? 90// function isZero(x) //is the bigInt x equal to zero?
93// function millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime (as opposed to definitely composite)? 91// function millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime (as opposed to definitely composite)?
94// function modInt(x,n) //return x mod n for bigInt x and integer n. 92// function modInt(x,n) //return x mod n for bigInt x and integer n.
95// function negative(x) //is bigInt x negative? 93// function negative(x) //is bigInt x negative?
96// 94//
97// The following functions do not modify their inputs, but allocate memory and call functions with underscores 95// The following functions do not modify their inputs, but allocate memory and call functions with underscores
98// 96//
99// function add(x,y) //return (x+y) for bigInts x and y. 97// function add(x,y) //return (x+y) for bigInts x and y.
100// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer. 98// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.
101// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed 99// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed
102// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null 100// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
103// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n. 101// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.
104// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x. 102// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.
105// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x. 103// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
106// function powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n. 104// function powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
107// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm. 105// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm.
108// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement 106// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement
109// 107//
110// The following functions write a bigInt result to one of the parameters, but 108// The following functions write a bigInt result to one of the parameters, but
111// the result is never bigger than the original, so there can't be overflow problems: 109// the result is never bigger than the original, so there can't be overflow problems:
112// 110//
113// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder 111// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder
114// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). 112// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed).
115// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement 113// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
116// function mod_(x,n) //do x=x mod n for bigInts x and n. 114// function mod_(x,n) //do x=x mod n for bigInts x and n.
117// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe. 115// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe.
118// 116//
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js
index 19f19c2..0d76b9c 100644
--- a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js
@@ -1,547 +1,500 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 24//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
27 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; 25 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
28//} 26//}
29if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } 27if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
30if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } 28if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
31 29
32Clipperz.Crypto.ECC.BinaryField.Curve = function(args) { 30Clipperz.Crypto.ECC.BinaryField.Curve = function(args) {
33 args = args || {}; 31 args = args || {};
34 32
35 this._modulus = args.modulus; 33 this._modulus = args.modulus;
36 34
37 this._a = args.a; 35 this._a = args.a;
38 this._b = args.b; 36 this._b = args.b;
39 this._G = args.G; 37 this._G = args.G;
40 this._r = args.r; 38 this._r = args.r;
41 this._h = args.h; 39 this._h = args.h;
42 40
43 this._finiteField = null; 41 this._finiteField = null;
44 42
45 return this; 43 return this;
46} 44}
47 45
48Clipperz.Crypto.ECC.BinaryField.Curve.prototype = MochiKit.Base.update(null, { 46Clipperz.Crypto.ECC.BinaryField.Curve.prototype = MochiKit.Base.update(null, {
49 47
50 'asString': function() { 48 'asString': function() {
51 return "Clipperz.Crypto.ECC.BinaryField.Curve"; 49 return "Clipperz.Crypto.ECC.BinaryField.Curve";
52 }, 50 },
53 51
54 //----------------------------------------------------------------------------- 52 //-----------------------------------------------------------------------------
55 53
56 'modulus': function() { 54 'modulus': function() {
57 return this._modulus; 55 return this._modulus;
58 }, 56 },
59 57
60 'a': function() { 58 'a': function() {
61 return this._a; 59 return this._a;
62 }, 60 },
63 61
64 'b': function() { 62 'b': function() {
65 return this._b; 63 return this._b;
66 }, 64 },
67 65
68 'G': function() { 66 'G': function() {
69 return this._G; 67 return this._G;
70 }, 68 },
71 69
72 'r': function() { 70 'r': function() {
73 return this._r; 71 return this._r;
74 }, 72 },
75 73
76 'h': function() { 74 'h': function() {
77 return this._h; 75 return this._h;
78 }, 76 },
79 77
80 //----------------------------------------------------------------------------- 78 //-----------------------------------------------------------------------------
81 79
82 'finiteField': function() { 80 'finiteField': function() {
83 if (this._finiteField == null) { 81 if (this._finiteField == null) {
84 this._finiteField = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:this.modulus()}) 82 this._finiteField = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:this.modulus()})
85 } 83 }
86 84
87 return this._finiteField; 85 return this._finiteField;
88 }, 86 },
89 87
90 //----------------------------------------------------------------------------- 88 //-----------------------------------------------------------------------------
91 89
92 'negate': function(aPointA) { 90 'negate': function(aPointA) {
93 var result; 91 var result;
94 92
95 result = new Clipperz.Crypto.ECC.Point({x:aPointA.x(), y:this.finiteField().add(aPointA.y(), aPointA.x())}) 93 result = new Clipperz.Crypto.ECC.Point({x:aPointA.x(), y:this.finiteField().add(aPointA.y(), aPointA.x())})
96 94
97 return result; 95 return result;
98 }, 96 },
99 97
100 //----------------------------------------------------------------------------- 98 //-----------------------------------------------------------------------------
101 99
102 'add': function(aPointA, aPointB) { 100 'add': function(aPointA, aPointB) {
103 var result; 101 var result;
104 102
105//console.log(">>> ECC.BinaryField.Curve.add");
106 if (aPointA.isZero()) { 103 if (aPointA.isZero()) {
107//console.log("--- pointA == zero");
108 result = aPointB; 104 result = aPointB;
109 } else if (aPointB.isZero()) { 105 } else if (aPointB.isZero()) {
110//console.log("--- pointB == zero");
111 result = aPointA; 106 result = aPointA;
112 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) { 107 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) {
113//console.log("compare A.x - B.x: ", aPointA.x().compare(aPointB.x()));
114//console.log("compare A.y - B.y: ", (aPointA.y().compare(aPointB.y()) != 0));
115//console.log("compare B.x.isZero(): ", aPointB.x().isZero());
116
117//console.log("--- result = zero");
118 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); 108 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
119 } else { 109 } else {
120//console.log("--- result = ELSE");
121 varf2m; 110 varf2m;
122 var x, y; 111 var x, y;
123 var lambda; 112 var lambda;
124 var aX, aY, bX, bY; 113 var aX, aY, bX, bY;
125 114
126 aX = aPointA.x()._value; 115 aX = aPointA.x()._value;
127 aY = aPointA.y()._value; 116 aY = aPointA.y()._value;
128 bX = aPointB.x()._value; 117 bX = aPointB.x()._value;
129 bY = aPointB.y()._value; 118 bY = aPointB.y()._value;
130 119
131 f2m = this.finiteField(); 120 f2m = this.finiteField();
132 121
133 if (aPointA.x().compare(aPointB.x()) != 0) { 122 if (aPointA.x().compare(aPointB.x()) != 0) {
134//console.log(" a.x != b.x");
135 lambda =f2m._fastMultiply( 123 lambda =f2m._fastMultiply(
136 f2m._add(aY, bY), 124 f2m._add(aY, bY),
137 f2m._inverse(f2m._add(aX, bX)) 125 f2m._inverse(f2m._add(aX, bX))
138 ); 126 );
139 x = f2m._add(this.a()._value, f2m._square(lambda)); 127 x = f2m._add(this.a()._value, f2m._square(lambda));
140 f2m._overwriteAdd(x, lambda); 128 f2m._overwriteAdd(x, lambda);
141 f2m._overwriteAdd(x, aX); 129 f2m._overwriteAdd(x, aX);
142 f2m._overwriteAdd(x, bX); 130 f2m._overwriteAdd(x, bX);
143 } else { 131 } else {
144//console.log(" a.x == b.x");
145 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX))); 132 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX)));
146//console.log(" lambda: " + lambda.asString(16));
147 x = f2m._add(this.a()._value, f2m._square(lambda)); 133 x = f2m._add(this.a()._value, f2m._square(lambda));
148//console.log(" x (step 1): " + x.asString(16));
149 f2m._overwriteAdd(x, lambda); 134 f2m._overwriteAdd(x, lambda);
150//console.log(" x (step 2): " + x.asString(16));
151 } 135 }
152 136
153 y = f2m._fastMultiply(f2m._add(bX, x), lambda); 137 y = f2m._fastMultiply(f2m._add(bX, x), lambda);
154//console.log(" y (step 1): " + y.asString(16));
155 f2m._overwriteAdd(y, x); 138 f2m._overwriteAdd(y, x);
156//console.log(" y (step 2): " + y.asString(16));
157 f2m._overwriteAdd(y, bY); 139 f2m._overwriteAdd(y, bY);
158//console.log(" y (step 3): " + y.asString(16));
159 140
160 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)}) 141 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)})
161 } 142 }
162//console.log("<<< ECC.BinaryField.Curve.add");
163 143
164 return result; 144 return result;
165 }, 145 },
166 146
167 //----------------------------------------------------------------------------- 147 //-----------------------------------------------------------------------------
168 148
169 'addTwice': function(aPointA) { 149 'addTwice': function(aPointA) {
170 return this.add(aPointA, aPointA); 150 return this.add(aPointA, aPointA);
171 }, 151 },
172 152
173 //----------------------------------------------------------------------------- 153 //-----------------------------------------------------------------------------
174 154
175 'overwriteAdd': function(aPointA, aPointB) { 155 'overwriteAdd': function(aPointA, aPointB) {
176 if (aPointA.isZero()) { 156 if (aPointA.isZero()) {
177 // result = aPointB; 157 // result = aPointB;
178 aPointA._x._value = aPointB._x._value; 158 aPointA._x._value = aPointB._x._value;
179 aPointA._y._value = aPointB._y._value; 159 aPointA._y._value = aPointB._y._value;
180 } else if (aPointB.isZero()) { 160 } else if (aPointB.isZero()) {
181 // result = aPointA; 161 // result = aPointA;
182 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) { 162 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) {
183 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); 163 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
184 aPointA._x = Clipperz.Crypto.ECC.BinaryField.Value.O; 164 aPointA._x = Clipperz.Crypto.ECC.BinaryField.Value.O;
185 aPointA._y = Clipperz.Crypto.ECC.BinaryField.Value.O; 165 aPointA._y = Clipperz.Crypto.ECC.BinaryField.Value.O;
186 } else { 166 } else {
187 varf2m; 167 varf2m;
188 var x, y; 168 var x, y;
189 var lambda; 169 var lambda;
190 var aX, aY, bX, bY; 170 var aX, aY, bX, bY;
191 171
192 aX = aPointA.x()._value; 172 aX = aPointA.x()._value;
193 aY = aPointA.y()._value; 173 aY = aPointA.y()._value;
194 bX = aPointB.x()._value; 174 bX = aPointB.x()._value;
195 bY = aPointB.y()._value; 175 bY = aPointB.y()._value;
196 176
197 f2m = this.finiteField(); 177 f2m = this.finiteField();
198 178
199 if (aPointA.x().compare(aPointB.x()) != 0) { 179 if (aPointA.x().compare(aPointB.x()) != 0) {
200//console.log(" a.x != b.x");
201 lambda =f2m._fastMultiply( 180 lambda =f2m._fastMultiply(
202 f2m._add(aY, bY), 181 f2m._add(aY, bY),
203 f2m._inverse(f2m._add(aX, bX)) 182 f2m._inverse(f2m._add(aX, bX))
204 ); 183 );
205 x = f2m._add(this.a()._value, f2m._square(lambda)); 184 x = f2m._add(this.a()._value, f2m._square(lambda));
206 f2m._overwriteAdd(x, lambda); 185 f2m._overwriteAdd(x, lambda);
207 f2m._overwriteAdd(x, aX); 186 f2m._overwriteAdd(x, aX);
208 f2m._overwriteAdd(x, bX); 187 f2m._overwriteAdd(x, bX);
209 } else { 188 } else {
210//console.log(" a.x == b.x");
211 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX))); 189 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX)));
212//console.log(" lambda: " + lambda.asString(16));
213 x = f2m._add(this.a()._value, f2m._square(lambda)); 190 x = f2m._add(this.a()._value, f2m._square(lambda));
214//console.log(" x (step 1): " + x.asString(16));
215 f2m._overwriteAdd(x, lambda); 191 f2m._overwriteAdd(x, lambda);
216//console.log(" x (step 2): " + x.asString(16));
217 } 192 }
218 193
219 y = f2m._fastMultiply(f2m._add(bX, x), lambda); 194 y = f2m._fastMultiply(f2m._add(bX, x), lambda);
220//console.log(" y (step 1): " + y.asString(16));
221 f2m._overwriteAdd(y, x); 195 f2m._overwriteAdd(y, x);
222//console.log(" y (step 2): " + y.asString(16));
223 f2m._overwriteAdd(y, bY); 196 f2m._overwriteAdd(y, bY);
224//console.log(" y (step 3): " + y.asString(16));
225 197
226 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)}) 198 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)})
227 aPointA._x._value = x; 199 aPointA._x._value = x;
228 aPointA._y._value = y; 200 aPointA._y._value = y;
229 201
230 } 202 }
231//console.log("<<< ECC.BinaryField.Curve.add");
232 203
233 return result; 204 return result;
234 }, 205 },
235 206
236 //----------------------------------------------------------------------------- 207 //-----------------------------------------------------------------------------
237 208
238 'multiply': function(aValue, aPoint) { 209 'multiply': function(aValue, aPoint) {
239 var result; 210 var result;
240 211
241//console.profile(); 212//console.profile();
242 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); 213 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
243 214
244 if (aValue.isZero() == false) { 215 if (aValue.isZero() == false) {
245 var k, Q; 216 var k, Q;
246 var i; 217 var i;
247 var countIndex; countIndex = 0; 218 var countIndex; countIndex = 0;
248 219
249 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) { 220 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) {
250 k = aValue; 221 k = aValue;
251 Q = aPoint; 222 Q = aPoint;
252 } else { 223 } else {
253MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!"); 224 Clipperz.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!");
254 k = aValue.negate(); 225 k = aValue.negate();
255 Q = this.negate(aPoint); 226 Q = this.negate(aPoint);
256 } 227 }
257 228
258//console.log("k: " + k.toString(16));
259//console.log("k.bitSize: " + k.bitSize());
260 for (i=k.bitSize()-1; i>=0; i--) { 229 for (i=k.bitSize()-1; i>=0; i--) {
261 result = this.add(result, result); 230 result = this.add(result, result);
262 // this.overwriteAdd(result, result); 231 // this.overwriteAdd(result, result);
263 if (k.isBitSet(i)) { 232 if (k.isBitSet(i)) {
264 result = this.add(result, Q); 233 result = this.add(result, Q);
265 // this.overwriteAdd(result, Q); 234 // this.overwriteAdd(result, Q);
266 } 235 }
267 236
268 // if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++; 237 // if (countIndex==100) {Clipperz.log("multiply.break"); break;} else countIndex++;
269 } 238 }
270 } 239 }
271//console.profileEnd(); 240//console.profileEnd();
272 241
273 return result; 242 return result;
274 }, 243 },
275 244
276 //----------------------------------------------------------------------------- 245 //-----------------------------------------------------------------------------
277 246
278 'deferredMultiply': function(aValue, aPoint) { 247 'deferredMultiply': function(aValue, aPoint) {
279 var deferredResult; 248 var deferredResult;
280 var result; 249 var result;
281 250
282MochiKit.Logging.logDebug(">>> deferredMultiply - value: " + aValue + ", point: " + aPoint); 251Clipperz.log(">>> deferredMultiply - value: " + aValue + ", point: " + aPoint);
283//console.profile("ECC.Curve.multiply"); 252//console.profile("ECC.Curve.multiply");
284 deferredResult = new MochiKit.Async.Deferred(); 253 deferredResult = new MochiKit.Async.Deferred();
285//deferredResult.addCallback(function(res) {console.profile("ECC.Curve.deferredMultiply"); return res;} ); 254//deferredResult.addCallback(function(res) {console.profile("ECC.Curve.deferredMultiply"); return res;} );
286//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 1: " + res); return res;}); 255//deferredResult.addBoth(function(res) {Clipperz.logDebug("# 1: " + res); return res;});
287 256
288 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); 257 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
289//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 2: " + res); return res;}); 258//deferredResult.addBoth(function(res) {Clipperz.logDebug("# 2: " + res); return res;});
290 259
291 if (aValue.isZero() == false) { 260 if (aValue.isZero() == false) {
292 var k, Q; 261 var k, Q;
293 var i; 262 var i;
294 var countIndex; countIndex = 0; 263 var countIndex; countIndex = 0;
295 264
296 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) { 265 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) {
297 k = aValue; 266 k = aValue;
298 Q = aPoint; 267 Q = aPoint;
299 } else { 268 } else {
300MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!"); 269 Clipperz.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!");
301 k = aValue.negate(); 270 k = aValue.negate();
302 Q = this.negate(aPoint); 271 Q = this.negate(aPoint);
303 } 272 }
304 273
305//console.log("k: " + k.toString(16));
306//console.log("k.bitSize: " + k.bitSize());
307 274
308//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 3: " + res); return res;});
309 for (i=k.bitSize()-1; i>=0; i--) { 275 for (i=k.bitSize()-1; i>=0; i--) {
310//MochiKit.Logging.logDebug("====> " + i);
311//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4 > i = " + i + ": " + res); return res;});
312 deferredResult.addMethod(this, "addTwice"); 276 deferredResult.addMethod(this, "addTwice");
313 //# result = this.add(result, result); 277 //# result = this.add(result, result);
314 // this.overwriteAdd(result, result); 278 // this.overwriteAdd(result, result);
315 if (k.isBitSet(i)) { 279 if (k.isBitSet(i)) {
316 deferredResult.addMethod(this, "add", Q); 280 deferredResult.addMethod(this, "add", Q);
317 //# result = this.add(result, Q); 281 //# result = this.add(result, Q);
318 // this.overwriteAdd(result, Q); 282 // this.overwriteAdd(result, Q);
319 } 283 }
320 if (i%20 == 0) {deferredResult.addCallback(MochiKit.Async.wait, 0.1);} 284 if (i%20 == 0) {deferredResult.addCallback(MochiKit.Async.wait, 0.1);}
321
322 // if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++;
323//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4 < i = " + i + ": " + res); return res;});
324 } 285 }
325//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4: " + res); return res;});
326 } 286 }
327//#console.profileEnd(); 287//#console.profileEnd();
328//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 5: " + res); return res;});
329//deferredResult.addBoth(function(res) {console.profileEnd(); return res;}); 288//deferredResult.addBoth(function(res) {console.profileEnd(); return res;});
330//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 6: " + res); return res;});
331 deferredResult.callback(result); 289 deferredResult.callback(result);
332 290
333 //# return result; 291 //# return result;
334 return deferredResult; 292 return deferredResult;
335 }, 293 },
336 294
337 //----------------------------------------------------------------------------- 295 //-----------------------------------------------------------------------------
338 __syntaxFix__: "syntax fix" 296 __syntaxFix__: "syntax fix"
339}); 297});
340 298
341 299
342//############################################################################# 300//#############################################################################
343 301
344Clipperz.Crypto.ECC.StandardCurves = {}; 302Clipperz.Crypto.ECC.StandardCurves = {};
345 303
346MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, { 304MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, {
347/* 305/*
348 '_K571': null, 306 '_K571': null,
349 'K571': function() { 307 'K571': function() {
350 if (Clipperz.Crypto.ECC.StandardCurves._K571 == null) { 308 if (Clipperz.Crypto.ECC.StandardCurves._K571 == null) {
351 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.BinaryField.Curve({ 309 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
352 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16), 310 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16),
353 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16), 311 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16),
354 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), 312 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
355 G: new Clipperz.Crypto.ECC.BinaryField.Point({ 313 G: new Clipperz.Crypto.ECC.BinaryField.Point({
356 x: new Clipperz.Crypto.ECC.BinaryField.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16), 314 x: new Clipperz.Crypto.ECC.BinaryField.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16),
357 y: new Clipperz.Crypto.ECC.BinaryField.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16) 315 y: new Clipperz.Crypto.ECC.BinaryField.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16)
358 }), 316 }),
359 r: new Clipperz.Crypto.ECC.BinaryField.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16), 317 r: new Clipperz.Crypto.ECC.BinaryField.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16),
360 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16) 318 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16)
361 }); 319 });
362 } 320 }
363 321
364 return Clipperz.Crypto.ECC.StandardCurves._K571; 322 return Clipperz.Crypto.ECC.StandardCurves._K571;
365 }, 323 },
366 324
367 325
368 326
369 '_K283': null, 327 '_K283': null,
370 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1 328 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
371 if (Clipperz.Crypto.ECC.StandardCurves._K283 == null) { 329 if (Clipperz.Crypto.ECC.StandardCurves._K283 == null) {
372 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.BinaryField.Curve({ 330 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
373 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), 331 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
374 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16), 332 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16),
375 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), 333 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
376 G: new Clipperz.Crypto.ECC.BinaryField.Point({ 334 G: new Clipperz.Crypto.ECC.BinaryField.Point({
377 x: new Clipperz.Crypto.ECC.BinaryField.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16), 335 x: new Clipperz.Crypto.ECC.BinaryField.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16),
378 y: new Clipperz.Crypto.ECC.BinaryField.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16) 336 y: new Clipperz.Crypto.ECC.BinaryField.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16)
379 }), 337 }),
380 r: new Clipperz.Crypto.ECC.BinaryField.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16), 338 r: new Clipperz.Crypto.ECC.BinaryField.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16),
381 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16) 339 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16)
382 }); 340 });
383 } 341 }
384 342
385 return Clipperz.Crypto.ECC.StandardCurves._K283; 343 return Clipperz.Crypto.ECC.StandardCurves._K283;
386 }, 344 },
387*/ 345*/
388 //----------------------------------------------------------------------------- 346 //-----------------------------------------------------------------------------
389 347
390 '_B571': null, 348 '_B571': null,
391 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1 349 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
392 if (Clipperz.Crypto.ECC.StandardCurves._B571 == null) { 350 if (Clipperz.Crypto.ECC.StandardCurves._B571 == null) {
393 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({ 351 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
394 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16), 352 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16),
395 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), 353 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
396 b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a', 16), 354 b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a', 16),
397 G: new Clipperz.Crypto.ECC.BinaryField.Point({ 355 G: new Clipperz.Crypto.ECC.BinaryField.Point({
398 x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16), 356 x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16),
399 y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16) 357 y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16)
400 }), 358 }),
401 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16), 359 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16),
402 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) 360 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
403 361
404 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10), 362 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
405 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16) 363 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
406 }); 364 });
407 365
408 //----------------------------------------------------------------------------- 366 //-----------------------------------------------------------------------------
409 // 367 //
410 //Guide to Elliptic Curve Cryptography 368 //Guide to Elliptic Curve Cryptography
411 //Darrel Hankerson, Alfred Menezes, Scott Vanstone 369 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
412 //- Pag: 56, Alorithm 2.45 (with a typo!!!) 370 //- Pag: 56, Alorithm 2.45 (with a typo!!!)
413 // 371 //
414 //----------------------------------------------------------------------------- 372 //-----------------------------------------------------------------------------
415 // 373 //
416 // http://www.milw0rm.com/papers/136 374 // http://www.milw0rm.com/papers/136
417 // 375 //
418 // ------------------------------------------------------------------------- 376 // -------------------------------------------------------------------------
419 // Polynomial Reduction Algorithm Modulo f571 377 // Polynomial Reduction Algorithm Modulo f571
420 // ------------------------------------------------------------------------- 378 // -------------------------------------------------------------------------
421 // 379 //
422 // Input: Polynomial p(x) of degree 1140 or less, stored as 380 // Input: Polynomial p(x) of degree 1140 or less, stored as
423 // an array of 2T machinewords. 381 // an array of 2T machinewords.
424 // Output: p(x) mod f571(x) 382 // Output: p(x) mod f571(x)
425 // 383 //
426 // FOR i = T-1, ..., 0 DO 384 // FOR i = T-1, ..., 0 DO
427 // SET X := P[i+T] 385 // SET X := P[i+T]
428 // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15) 386 // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15)
429 // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27) 387 // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27)
430 // 388 //
431 // SET X := P[T-1] >> 27 389 // SET X := P[T-1] >> 27
432 // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10) 390 // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10)
433 // P[T-1] := P[T-1] & 0x07ffffff 391 // P[T-1] := P[T-1] & 0x07ffffff
434 // 392 //
435 // RETURN P[T-1],...,P[0] 393 // RETURN P[T-1],...,P[0]
436 // 394 //
437 // ------------------------------------------------------------------------- 395 // -------------------------------------------------------------------------
438 // 396 //
439 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module; 397 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module;
440 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) { 398 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) {
441 varresult; 399 varresult;
442 400
443 if (aValue.bitSize() > 1140) { 401 if (aValue.bitSize() > 1140) {
444 MochiKit.Logging.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation"); 402 Clipperz.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation");
445 result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue); 403 result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue);
446 } else { 404 } else {
447 varC, T; 405 varC, T;
448 var i; 406 var i;
449 407
450//console.log(">>> binaryField.finiteField.(improved)module");
451 // C = aValue.value().slice(0);
452 C = aValue._value.slice(0); 408 C = aValue._value.slice(0);
453 for (i=35; i>=18; i--) { 409 for (i=35; i>=18; i--) {
454 T = C[i]; 410 T = C[i];
455 C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0); 411 C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0);
456 C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0); 412 C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0);
457 } 413 }
458 T = (C[17] >>> 27); 414 T = (C[17] >>> 27);
459 C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0); 415 C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0);
460 C[17] = (C[17] & 0x07ffffff); 416 C[17] = (C[17] & 0x07ffffff);
461 417
462 for(i=18; i<=35; i++) { 418 for(i=18; i<=35; i++) {
463 C[i] = 0; 419 C[i] = 0;
464 } 420 }
465 421
466 result = new Clipperz.Crypto.ECC.BinaryField.Value(C); 422 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
467//console.log("<<< binaryField.finiteField.(improved)module");
468 } 423 }
469 424
470 return result; 425 return result;
471 }; 426 };
472 } 427 }
473 428
474 return Clipperz.Crypto.ECC.StandardCurves._B571; 429 return Clipperz.Crypto.ECC.StandardCurves._B571;
475 }, 430 },
476 431
477 //----------------------------------------------------------------------------- 432 //-----------------------------------------------------------------------------
478 433
479 '_B283': null, 434 '_B283': null,
480 'B283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1 435 'B283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
481 if (Clipperz.Crypto.ECC.StandardCurves._B283 == null) { 436 if (Clipperz.Crypto.ECC.StandardCurves._B283 == null) {
482 Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({ 437 Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
483 // modulus: new Clipperz.Crypto.ECC.BinaryField.Value('10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), 438 // modulus: new Clipperz.Crypto.ECC.BinaryField.Value('10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
484 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), 439 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
485 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), 440 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
486 b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16), 441 b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16),
487 G: new Clipperz.Crypto.ECC.BinaryField.Point({ 442 G: new Clipperz.Crypto.ECC.BinaryField.Point({
488 x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16), 443 x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16),
489 y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16) 444 y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16)
490 }), 445 }),
491 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16), 446 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16),
492 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) 447 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
493 448
494 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10), 449 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
495 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16) 450 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
496 }); 451 });
497 452
498 //----------------------------------------------------------------------------- 453 //-----------------------------------------------------------------------------
499 // 454 //
500 //Guide to Elliptic Curve Cryptography 455 //Guide to Elliptic Curve Cryptography
501 //Darrel Hankerson, Alfred Menezes, Scott Vanstone 456 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
502 //- Pag: 56, Alorithm 2.43 457 //- Pag: 56, Alorithm 2.43
503 // 458 //
504 //----------------------------------------------------------------------------- 459 //-----------------------------------------------------------------------------
505 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module; 460 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module;
506 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) { 461 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) {
507 varresult; 462 varresult;
508 463
509 if (aValue.bitSize() > 564) { 464 if (aValue.bitSize() > 564) {
510 MochiKit.Logging.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation"); 465 Clipperz.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation");
511 result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue); 466 result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue);
512 } else { 467 } else {
513 varC, T; 468 varC, T;
514 var i; 469 var i;
515 470
516//console.log(">>> binaryField.finiteField.(improved)module");
517 C = aValue._value.slice(0); 471 C = aValue._value.slice(0);
518 for (i=17; i>=9; i--) { 472 for (i=17; i>=9; i--) {
519 T = C[i]; 473 T = C[i];
520 C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0); 474 C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0);
521 C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0); 475 C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0);
522 } 476 }
523 T = (C[8] >>> 27); 477 T = (C[8] >>> 27);
524 C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0); 478 C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0);
525 C[8] = (C[8] & 0x07ffffff); 479 C[8] = (C[8] & 0x07ffffff);
526 480
527 for(i=9; i<=17; i++) { 481 for(i=9; i<=17; i++) {
528 C[i] = 0; 482 C[i] = 0;
529 } 483 }
530 484
531 result = new Clipperz.Crypto.ECC.BinaryField.Value(C); 485 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
532//console.log("<<< binaryField.finiteField.(improved)module");
533 } 486 }
534 487
535 return result; 488 return result;
536 }; 489 };
537 } 490 }
538 491
539 return Clipperz.Crypto.ECC.StandardCurves._B283; 492 return Clipperz.Crypto.ECC.StandardCurves._B283;
540 }, 493 },
541 494
542 //----------------------------------------------------------------------------- 495 //-----------------------------------------------------------------------------
543 __syntaxFix__: "syntax fix" 496 __syntaxFix__: "syntax fix"
544}); 497});
545 498
546//############################################################################# 499//#############################################################################
547 500
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js
index 56f257a..7b7c2c6 100644
--- a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js
@@ -1,174 +1,170 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 24//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
27 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; 25 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
28//} 26//}
29if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } 27if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
30if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } 28if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
31 29
32Clipperz.Crypto.ECC.BinaryField.FiniteField = function(args) { 30Clipperz.Crypto.ECC.BinaryField.FiniteField = function(args) {
33 args = args || {}; 31 args = args || {};
34 this._modulus = args.modulus; 32 this._modulus = args.modulus;
35 33
36 return this; 34 return this;
37} 35}
38 36
39Clipperz.Crypto.ECC.BinaryField.FiniteField.prototype = MochiKit.Base.update(null, { 37Clipperz.Crypto.ECC.BinaryField.FiniteField.prototype = MochiKit.Base.update(null, {
40 38
41 'asString': function() { 39 'asString': function() {
42 return "Clipperz.Crypto.ECC.BinaryField.FiniteField (" + this.modulus().asString() + ")"; 40 return "Clipperz.Crypto.ECC.BinaryField.FiniteField (" + this.modulus().asString() + ")";
43 }, 41 },
44 42
45 //----------------------------------------------------------------------------- 43 //-----------------------------------------------------------------------------
46 44
47 'modulus': function() { 45 'modulus': function() {
48 return this._modulus; 46 return this._modulus;
49 }, 47 },
50 48
51 //----------------------------------------------------------------------------- 49 //-----------------------------------------------------------------------------
52 50
53 '_module': function(aValue) { 51 '_module': function(aValue) {
54 varresult; 52 varresult;
55 var modulusComparison; 53 var modulusComparison;
56//console.log(">>> binaryField.finiteField.(standard)module");
57 54
58 modulusComparison = Clipperz.Crypto.ECC.BinaryField.Value._compare(aValue, this.modulus()._value); 55 modulusComparison = Clipperz.Crypto.ECC.BinaryField.Value._compare(aValue, this.modulus()._value);
59 56
60 if (modulusComparison < 0) { 57 if (modulusComparison < 0) {
61 result = aValue; 58 result = aValue;
62 } else if (modulusComparison == 0) { 59 } else if (modulusComparison == 0) {
63 result = [0]; 60 result = [0];
64 } else { 61 } else {
65 var modulusBitSize; 62 var modulusBitSize;
66 var resultBitSize; 63 var resultBitSize;
67 64
68 result = aValue; 65 result = aValue;
69 66
70 modulusBitSize = this.modulus().bitSize(); 67 modulusBitSize = this.modulus().bitSize();
71 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result); 68 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result);
72 while (resultBitSize >= modulusBitSize) { 69 while (resultBitSize >= modulusBitSize) {
73 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this.modulus()._value, resultBitSize - modulusBitSize)); 70 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this.modulus()._value, resultBitSize - modulusBitSize));
74 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result); 71 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result);
75 } 72 }
76 } 73 }
77//console.log("<<< binaryField.finiteField.(standard)module"); 74
78
79 return result; 75 return result;
80 }, 76 },
81 77
82 'module': function(aValue) { 78 'module': function(aValue) {
83 return new Clipperz.Crypto.ECC.BinaryField.Value(this._module(aValue._value.slice(0))); 79 return new Clipperz.Crypto.ECC.BinaryField.Value(this._module(aValue._value.slice(0)));
84 }, 80 },
85 81
86 //----------------------------------------------------------------------------- 82 //-----------------------------------------------------------------------------
87 83
88 '_add': function(a, b) { 84 '_add': function(a, b) {
89 return Clipperz.Crypto.ECC.BinaryField.Value._xor(a, b); 85 return Clipperz.Crypto.ECC.BinaryField.Value._xor(a, b);
90 }, 86 },
91 87
92 '_overwriteAdd': function(a, b) { 88 '_overwriteAdd': function(a, b) {
93 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(a, b); 89 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(a, b);
94 }, 90 },
95 91
96 'add': function(a, b) { 92 'add': function(a, b) {
97 return new Clipperz.Crypto.ECC.BinaryField.Value(this._add(a._value, b._value)); 93 return new Clipperz.Crypto.ECC.BinaryField.Value(this._add(a._value, b._value));
98 }, 94 },
99 95
100 //----------------------------------------------------------------------------- 96 //-----------------------------------------------------------------------------
101 97
102 'negate': function(aValue) { 98 'negate': function(aValue) {
103 return aValue.clone(); 99 return aValue.clone();
104 }, 100 },
105 101
106 //----------------------------------------------------------------------------- 102 //-----------------------------------------------------------------------------
107 103
108 '_multiply': function(a, b) { 104 '_multiply': function(a, b) {
109 var result; 105 var result;
110 var valueToXor; 106 var valueToXor;
111 var i,c; 107 var i,c;
112 108
113 result = [0]; 109 result = [0];
114 valueToXor = b; 110 valueToXor = b;
115 c = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(a); 111 c = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(a);
116 for (i=0; i<c; i++) { 112 for (i=0; i<c; i++) {
117 if (Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(a, i) === true) { 113 if (Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(a, i) === true) {
118 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, valueToXor); 114 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, valueToXor);
119 } 115 }
120 valueToXor = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(valueToXor, 1); 116 valueToXor = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(valueToXor, 1);
121 } 117 }
122 result = this._module(result); 118 result = this._module(result);
123 119
124 return result; 120 return result;
125 }, 121 },
126 122
127 'multiply': function(a, b) { 123 'multiply': function(a, b) {
128 return new Clipperz.Crypto.ECC.BinaryField.Value(this._multiply(a._value, b._value)); 124 return new Clipperz.Crypto.ECC.BinaryField.Value(this._multiply(a._value, b._value));
129 }, 125 },
130 126
131 //----------------------------------------------------------------------------- 127 //-----------------------------------------------------------------------------
132 128
133 '_fastMultiply': function(a, b) { 129 '_fastMultiply': function(a, b) {
134 var result; 130 var result;
135 var B; 131 var B;
136 var i,c; 132 var i,c;
137 133
138 result = [0]; 134 result = [0];
139 B = b.slice(0); //Is this array copy avoidable? 135 B = b.slice(0); //Is this array copy avoidable?
140 c = 32; 136 c = 32;
141 for (i=0; i<c; i++) { 137 for (i=0; i<c; i++) {
142 var ii, cc; 138 var ii, cc;
143 139
144 cc = a.length; 140 cc = a.length;
145 for (ii=0; ii<cc; ii++) { 141 for (ii=0; ii<cc; ii++) {
146 if (((a[ii] >>> i) & 0x01) == 1) { 142 if (((a[ii] >>> i) & 0x01) == 1) {
147 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, B, ii); 143 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, B, ii);
148 } 144 }
149 } 145 }
150 146
151 if (i < (c-1)) { 147 if (i < (c-1)) {
152 B = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(B, 1); 148 B = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(B, 1);
153 } 149 }
154 } 150 }
155 result = this._module(result); 151 result = this._module(result);
156 152
157 return result; 153 return result;
158 }, 154 },
159 155
160 'fastMultiply': function(a, b) { 156 'fastMultiply': function(a, b) {
161 return new Clipperz.Crypto.ECC.BinaryField.Value(this._fastMultiply(a._value, b._value)); 157 return new Clipperz.Crypto.ECC.BinaryField.Value(this._fastMultiply(a._value, b._value));
162 }, 158 },
163 159
164 //----------------------------------------------------------------------------- 160 //-----------------------------------------------------------------------------
165 // 161 //
166 //Guide to Elliptic Curve Cryptography 162 //Guide to Elliptic Curve Cryptography
167 //Darrel Hankerson, Alfred Menezes, Scott Vanstone 163 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
168 //- Pag: 49, Alorithm 2.34 164 //- Pag: 49, Alorithm 2.34
169 // 165 //
170 //----------------------------------------------------------------------------- 166 //-----------------------------------------------------------------------------
171 167
172 '_square': function(aValue) { 168 '_square': function(aValue) {
173 var result; 169 var result;
174 var value; 170 var value;
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js
index ffe287b..fef3220 100644
--- a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js
@@ -1,64 +1,62 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 24//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
27 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; 25 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
28//} 26//}
29if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } 27if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
30if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } 28if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
31 29
32Clipperz.Crypto.ECC.BinaryField.Point = function(args) { 30Clipperz.Crypto.ECC.BinaryField.Point = function(args) {
33 args = args || {}; 31 args = args || {};
34 this._x = args.x; 32 this._x = args.x;
35 this._y = args.y; 33 this._y = args.y;
36 34
37 return this; 35 return this;
38} 36}
39 37
40Clipperz.Crypto.ECC.BinaryField.Point.prototype = MochiKit.Base.update(null, { 38Clipperz.Crypto.ECC.BinaryField.Point.prototype = MochiKit.Base.update(null, {
41 39
42 'asString': function() { 40 'asString': function() {
43 return "Clipperz.Crypto.ECC.BinaryField.Point (" + this.x() + ", " + this.y() + ")"; 41 return "Clipperz.Crypto.ECC.BinaryField.Point (" + this.x() + ", " + this.y() + ")";
44 }, 42 },
45 43
46 //----------------------------------------------------------------------------- 44 //-----------------------------------------------------------------------------
47 45
48 'x': function() { 46 'x': function() {
49 return this._x; 47 return this._x;
50 }, 48 },
51 49
52 'y': function() { 50 'y': function() {
53 return this._y; 51 return this._y;
54 }, 52 },
55 53
56 //----------------------------------------------------------------------------- 54 //-----------------------------------------------------------------------------
57 55
58 'isZero': function() { 56 'isZero': function() {
59 return (this.x().isZero() && this.y().isZero()) 57 return (this.x().isZero() && this.y().isZero())
60 }, 58 },
61 59
62 //----------------------------------------------------------------------------- 60 //-----------------------------------------------------------------------------
63 __syntaxFix__: "syntax fix" 61 __syntaxFix__: "syntax fix"
64}); 62});
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js
index b705a20..634772a 100644
--- a/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 24//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
27 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; 25 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
28//} 26//}
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 27if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } 28if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
31if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } 29if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
32if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } 30if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
33 31
34Clipperz.Crypto.ECC.BinaryField.Value = function(aValue, aBase, aBitSize) { 32Clipperz.Crypto.ECC.BinaryField.Value = function(aValue, aBase, aBitSize) {
35 if (aValue.constructor == String) { 33 if (aValue.constructor == String) {
36 varvalue; 34 varvalue;
37 varstringLength; 35 varstringLength;
38 var numberOfWords; 36 var numberOfWords;
39 vari,c; 37 vari,c;
40 38
41 if (aBase != 16) { 39 if (aBase != 16) {
42 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase; 40 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase;
43 } 41 }
44 42
45 value = aValue.replace(/ /g, ''); 43 value = aValue.replace(/ /g, '');
46 stringLength = value.length; 44 stringLength = value.length;
47 numberOfWords = Math.ceil(stringLength / 8); 45 numberOfWords = Math.ceil(stringLength / 8);
48 this._value = new Array(numberOfWords); 46 this._value = new Array(numberOfWords);
49 47
50 c = numberOfWords; 48 c = numberOfWords;
51 for (i=0; i<c; i++) { 49 for (i=0; i<c; i++) {
52 varword; 50 varword;
53 51
54 if (i < (c-1)) { 52 if (i < (c-1)) {
55 word = parseInt(value.substr(stringLength-((i+1)*8), 8), 16); 53 word = parseInt(value.substr(stringLength-((i+1)*8), 8), 16);
56 } else { 54 } else {
57 word = parseInt(value.substr(0, stringLength-(i*8)), 16); 55 word = parseInt(value.substr(0, stringLength-(i*8)), 16);
58 } 56 }
59 57
60 this._value[i] = word; 58 this._value[i] = word;
61 } 59 }
62 } else if (aValue.constructor == Array) { 60 } else if (aValue.constructor == Array) {
63 var itemsToCopy; 61 var itemsToCopy;
64 62
65 itemsToCopy = aValue.length; 63 itemsToCopy = aValue.length;
66 while (aValue[itemsToCopy - 1] == 0) { 64 while (aValue[itemsToCopy - 1] == 0) {
67 itemsToCopy --; 65 itemsToCopy --;
68 } 66 }
69 67
70 this._value = aValue.slice(0, itemsToCopy); 68 this._value = aValue.slice(0, itemsToCopy);
71 } else if (aValue.constructor == Number) { 69 } else if (aValue.constructor == Number) {
72 this._value = [aValue]; 70 this._value = [aValue];
73 } else { 71 } else {
74 // throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType; 72 // throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType;
75 } 73 }
76 74
77 this._bitSize == aBitSize || null; 75 this._bitSize == aBitSize || null;
78 76
79 return this; 77 return this;
80} 78}
81 79
82Clipperz.Crypto.ECC.BinaryField.Value.prototype = MochiKit.Base.update(null, { 80Clipperz.Crypto.ECC.BinaryField.Value.prototype = MochiKit.Base.update(null, {
83 81
84 'value': function() { 82 'value': function() {
85 return this._value; 83 return this._value;
86 }, 84 },
87 85
88 //----------------------------------------------------------------------------- 86 //-----------------------------------------------------------------------------
89 87
90 'wordSize': function() { 88 'wordSize': function() {
91 return this._value.length 89 return this._value.length
92 }, 90 },
93 91
94 //----------------------------------------------------------------------------- 92 //-----------------------------------------------------------------------------
95 93
96 'clone': function() { 94 'clone': function() {
97 return new Clipperz.Crypto.ECC.BinaryField.Value(this._value.slice(0), null, this._bitSize); 95 return new Clipperz.Crypto.ECC.BinaryField.Value(this._value.slice(0), null, this._bitSize);
98 }, 96 },
99 97
100 //----------------------------------------------------------------------------- 98 //-----------------------------------------------------------------------------
101 99
102 'isZero': function() { 100 'isZero': function() {
103 return (this.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) == 0); 101 return (this.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) == 0);
104 }, 102 },
105 103
106 //----------------------------------------------------------------------------- 104 //-----------------------------------------------------------------------------
107 105
108 'asString': function(aBase) { 106 'asString': function(aBase) {
109 varresult; 107 varresult;
110 var i,c; 108 var i,c;
111 109
112 if (aBase != 16) { 110 if (aBase != 16) {
113 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase; 111 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase;
114 } 112 }
115 113
116 result = ""; 114 result = "";
117 c = this.wordSize(); 115 c = this.wordSize();
118 for (i=0; i<c; i++) { 116 for (i=0; i<c; i++) {
@@ -275,109 +273,107 @@ Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft = function(aWordArray,
275 for (i=0; i<c; i++) { 273 for (i=0; i<c; i++) {
276 result[i] = 0; 274 result[i] = 0;
277 } 275 }
278 276
279 overflowValue = 0; 277 overflowValue = 0;
280 nextOverflowValue = 0; 278 nextOverflowValue = 0;
281 279
282 c = aWordArray.length; 280 c = aWordArray.length;
283 for (i=0; i<c; i++) { 281 for (i=0; i<c; i++) {
284 varvalue; 282 varvalue;
285 varresultWord; 283 varresultWord;
286 284
287 // value = this.value()[i]; 285 // value = this.value()[i];
288 value = aWordArray[i]; 286 value = aWordArray[i];
289 287
290 if (numberOfBitsToShift > 0) { 288 if (numberOfBitsToShift > 0) {
291 var nextOverflowValue; 289 var nextOverflowValue;
292 290
293 nextOverflowValue = (value >>> (32 - numberOfBitsToShift)); 291 nextOverflowValue = (value >>> (32 - numberOfBitsToShift));
294 value = value & (0xffffffff >>> numberOfBitsToShift); 292 value = value & (0xffffffff >>> numberOfBitsToShift);
295 resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0); 293 resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0);
296 } else { 294 } else {
297 resultWord = value; 295 resultWord = value;
298 } 296 }
299 297
300 result[i+numberOfWordsToShift] = resultWord; 298 result[i+numberOfWordsToShift] = resultWord;
301 overflowValue = nextOverflowValue; 299 overflowValue = nextOverflowValue;
302 } 300 }
303 301
304 if (overflowValue != 0) { 302 if (overflowValue != 0) {
305 result[aWordArray.length + numberOfWordsToShift] = overflowValue; 303 result[aWordArray.length + numberOfWordsToShift] = overflowValue;
306 } 304 }
307 305
308 return result; 306 return result;
309}; 307};
310 308
311Clipperz.Crypto.ECC.BinaryField.Value._bitSize = function(aWordArray) { 309Clipperz.Crypto.ECC.BinaryField.Value._bitSize = function(aWordArray) {
312 varresult; 310 varresult;
313 varnotNullElements; 311 varnotNullElements;
314 var mostValuableWord; 312 var mostValuableWord;
315 var matchingBitsInMostImportantWord; 313 var matchingBitsInMostImportantWord;
316 var mask; 314 var mask;
317 var i,c; 315 var i,c;
318 316
319 notNullElements = aWordArray.length; 317 notNullElements = aWordArray.length;
320 318
321 if ((aWordArray.length == 1) && (aWordArray[0] == 0)) { 319 if ((aWordArray.length == 1) && (aWordArray[0] == 0)) {
322 result = 0; 320 result = 0;
323 } else { 321 } else {
324 notNullElements --; 322 notNullElements --;
325 while((notNullElements > 0) && (aWordArray[notNullElements] == 0)) { 323 while((notNullElements > 0) && (aWordArray[notNullElements] == 0)) {
326 notNullElements --; 324 notNullElements --;
327 } 325 }
328 326
329 result = notNullElements * 32; 327 result = notNullElements * 32;
330 mostValuableWord = aWordArray[notNullElements]; 328 mostValuableWord = aWordArray[notNullElements];
331 329
332 matchingBits = 32; 330 matchingBits = 32;
333 mask = 0x80000000; 331 mask = 0x80000000;
334 332
335 while ((matchingBits > 0) && ((mostValuableWord & mask) == 0)) { 333 while ((matchingBits > 0) && ((mostValuableWord & mask) == 0)) {
336 matchingBits --; 334 matchingBits --;
337 mask >>>= 1; 335 mask >>>= 1;
338 } 336 }
339 337
340 result += matchingBits; 338 result += matchingBits;
341 } 339 }
342 340
343 return result; 341 return result;
344}; 342};
345 343
346Clipperz.Crypto.ECC.BinaryField.Value._isBitSet = function(aWordArray, aBitPosition) { 344Clipperz.Crypto.ECC.BinaryField.Value._isBitSet = function(aWordArray, aBitPosition) {
347 var result; 345 var result;
348 varbyteIndex; 346 varbyteIndex;
349 var bitIndexInSelectedByte; 347 var bitIndexInSelectedByte;
350 348
351 byteIndex = Math.floor(aBitPosition / 32); 349 byteIndex = Math.floor(aBitPosition / 32);
352 bitIndexInSelectedByte = aBitPosition % 32; 350 bitIndexInSelectedByte = aBitPosition % 32;
353 351
354 if (byteIndex <= aWordArray.length) { 352 if (byteIndex <= aWordArray.length) {
355 result = ((aWordArray[byteIndex] & (1 << bitIndexInSelectedByte)) != 0); 353 result = ((aWordArray[byteIndex] & (1 << bitIndexInSelectedByte)) != 0);
356 } else { 354 } else {
357 result = false; 355 result = false;
358 } 356 }
359 357
360 return result; 358 return result;
361}; 359};
362 360
363Clipperz.Crypto.ECC.BinaryField.Value._compare = function(a,b) { 361Clipperz.Crypto.ECC.BinaryField.Value._compare = function(a,b) {
364 varresult; 362 varresult;
365 var i,c; 363 var i,c;
366 364
367 result = MochiKit.Base.compare(a.length, b.length); 365 result = MochiKit.Base.compare(a.length, b.length);
368 366
369 c = a.length; 367 c = a.length;
370 for (i=0; (i<c) && (result==0); i++) { 368 for (i=0; (i<c) && (result==0); i++) {
371//console.log("compare[" + c + " - " + i + " - 1] " + this.value()[c-i-1] + ", " + aValue.value()[c-i-1]);
372 // result = MochiKit.Base.compare(this.value()[c-i-1], aValue.value()[c-i-1]);
373 result = MochiKit.Base.compare(a[c-i-1], b[c-i-1]); 369 result = MochiKit.Base.compare(a[c-i-1], b[c-i-1]);
374 } 370 }
375 371
376 return result; 372 return result;
377}; 373};
378 374
379 375
380Clipperz.Crypto.ECC.BinaryField.Value['exception']= { 376Clipperz.Crypto.ECC.BinaryField.Value['exception']= {
381 'UnsupportedBase': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase"), 377 'UnsupportedBase': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase"),
382 'UnsupportedConstructorValueType':new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType") 378 'UnsupportedConstructorValueType':new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType")
383}; 379};
diff --git a/frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js b/frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js
index be197e3..239e264 100644
--- a/frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js
+++ b/frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js
@@ -1,236 +1,229 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26//try { if (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) == 'undefined') { throw ""; }} catch (e) { 24//try { if (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) == 'undefined') { throw ""; }} catch (e) {
27 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.BinaryField.Curve!"; 25 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.BinaryField.Curve!";
28//} 26//}
29//try { if (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) == 'undefined') { throw ""; }} catch (e) { 27//try { if (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.Koblitz.Curve!"; 28 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.Koblitz.Curve!";
31//} 29//}
32 30
33Clipperz.Crypto.ECC.StandardCurves = {}; 31Clipperz.Crypto.ECC.StandardCurves = {};
34 32
35MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, { 33MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, {
36 34
37 //============================================================================== 35 //==============================================================================
38 36
39 '_K571': null, 37 '_K571': null,
40 'K571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1 38 'K571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
41 if ((Clipperz.Crypto.ECC.StandardCurves._K571 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) { 39 if ((Clipperz.Crypto.ECC.StandardCurves._K571 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) {
42 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.Koblitz.Curve({ 40 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.Koblitz.Curve({
43 modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16), 41 modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16),
44 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16), 42 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16),
45 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16), 43 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16),
46 G: new Clipperz.Crypto.ECC.Koblitz.Point({ 44 G: new Clipperz.Crypto.ECC.Koblitz.Point({
47 x: new Clipperz.Crypto.ECC.Koblitz.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16), 45 x: new Clipperz.Crypto.ECC.Koblitz.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16),
48 y: new Clipperz.Crypto.ECC.Koblitz.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16) 46 y: new Clipperz.Crypto.ECC.Koblitz.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16)
49 }), 47 }),
50 r: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16), 48 r: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16),
51 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16), 49 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16),
52 primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16) 50 primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16)
53 }); 51 });
54 } 52 }
55 53
56 return Clipperz.Crypto.ECC.StandardCurves._K571; 54 return Clipperz.Crypto.ECC.StandardCurves._K571;
57 }, 55 },
58 56
59 //----------------------------------------------------------------------------- 57 //-----------------------------------------------------------------------------
60 58
61 '_K283': null, 59 '_K283': null,
62 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1 60 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
63 if ((Clipperz.Crypto.ECC.StandardCurves._K283 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) { 61 if ((Clipperz.Crypto.ECC.StandardCurves._K283 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) {
64 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.Koblitz.Curve({ 62 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.Koblitz.Curve({
65 modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), 63 modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
66 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16), 64 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16),
67 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16), 65 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16),
68 G: new Clipperz.Crypto.ECC.Koblitz.Point({ 66 G: new Clipperz.Crypto.ECC.Koblitz.Point({
69 x: new Clipperz.Crypto.ECC.Koblitz.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16), 67 x: new Clipperz.Crypto.ECC.Koblitz.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16),
70 y: new Clipperz.Crypto.ECC.Koblitz.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16) 68 y: new Clipperz.Crypto.ECC.Koblitz.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16)
71 }), 69 }),
72 r: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16), 70 r: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16),
73 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16), 71 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16),
74 primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16) 72 primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16)
75 }); 73 });
76 } 74 }
77 75
78 return Clipperz.Crypto.ECC.StandardCurves._K283; 76 return Clipperz.Crypto.ECC.StandardCurves._K283;
79 }, 77 },
80 78
81 //============================================================================== 79 //==============================================================================
82 80
83 '_B571': null, 81 '_B571': null,
84 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1 82 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
85 if ((Clipperz.Crypto.ECC.StandardCurves._B571 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) { 83 if ((Clipperz.Crypto.ECC.StandardCurves._B571 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) {
86 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({ 84 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
87 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16), 85 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16),
88 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), 86 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
89 b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e 2221f295 de297117 b7f3d62f 5c6a97ff cb8ceff1 cd6ba8ce 4a9a18ad 84ffabbd 8efa5933 2be7ad67 56a66e29 4afd185a 78ff12aa 520e4de7 39baca0c 7ffeff7f 2955727a', 16), 87 b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e 2221f295 de297117 b7f3d62f 5c6a97ff cb8ceff1 cd6ba8ce 4a9a18ad 84ffabbd 8efa5933 2be7ad67 56a66e29 4afd185a 78ff12aa 520e4de7 39baca0c 7ffeff7f 2955727a', 16),
90 G: new Clipperz.Crypto.ECC.BinaryField.Point({ 88 G: new Clipperz.Crypto.ECC.BinaryField.Point({
91 x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16), 89 x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16),
92 y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16) 90 y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16)
93 }), 91 }),
94 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16), 92 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16),
95 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) 93 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
96 94
97 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10), 95 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
98 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16) 96 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
99 }); 97 });
100 98
101 //----------------------------------------------------------------------------- 99 //-----------------------------------------------------------------------------
102 // 100 //
103 //Guide to Elliptic Curve Cryptography 101 //Guide to Elliptic Curve Cryptography
104 //Darrel Hankerson, Alfred Menezes, Scott Vanstone 102 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
105 //- Pag: 56, Alorithm 2.45 (with a typo!!!) 103 //- Pag: 56, Alorithm 2.45 (with a typo!!!)
106 // 104 //
107 //----------------------------------------------------------------------------- 105 //-----------------------------------------------------------------------------
108 // 106 //
109 // http://www.milw0rm.com/papers/136 107 // http://www.milw0rm.com/papers/136
110 // 108 //
111 // ------------------------------------------------------------------------- 109 // -------------------------------------------------------------------------
112 // Polynomial Reduction Algorithm Modulo f571 110 // Polynomial Reduction Algorithm Modulo f571
113 // ------------------------------------------------------------------------- 111 // -------------------------------------------------------------------------
114 // 112 //
115 // Input: Polynomial p(x) of degree 1140 or less, stored as 113 // Input: Polynomial p(x) of degree 1140 or less, stored as
116 // an array of 2T machinewords. 114 // an array of 2T machinewords.
117 // Output: p(x) mod f571(x) 115 // Output: p(x) mod f571(x)
118 // 116 //
119 // FOR i = T-1, ..., 0 DO 117 // FOR i = T-1, ..., 0 DO
120 // SET X := P[i+T] 118 // SET X := P[i+T]
121 // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15) 119 // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15)
122 // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27) 120 // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27)
123 // 121 //
124 // SET X := P[T-1] >> 27 122 // SET X := P[T-1] >> 27
125 // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10) 123 // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10)
126 // P[T-1] := P[T-1] & 0x07ffffff 124 // P[T-1] := P[T-1] & 0x07ffffff
127 // 125 //
128 // RETURN P[T-1],...,P[0] 126 // RETURN P[T-1],...,P[0]
129 // 127 //
130 // ------------------------------------------------------------------------- 128 // -------------------------------------------------------------------------
131 // 129 //
132 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module; 130 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module;
133 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) { 131 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) {
134 varresult; 132 varresult;
135 133
136 if (aValue.bitSize() > 1140) { 134 if (aValue.bitSize() > 1140) {
137 MochiKit.Logging.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation"); 135 Clipperz.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation");
138 result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue); 136 result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue);
139 } else { 137 } else {
140 varC, T; 138 varC, T;
141 var i; 139 var i;
142 140
143//console.log(">>> binaryField.finiteField.(improved)module");
144 // C = aValue.value().slice(0);
145 C = aValue._value.slice(0); 141 C = aValue._value.slice(0);
146 for (i=35; i>=18; i--) { 142 for (i=35; i>=18; i--) {
147 T = C[i]; 143 T = C[i];
148 C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0); 144 C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0);
149 C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0); 145 C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0);
150 } 146 }
151 T = (C[17] >>> 27); 147 T = (C[17] >>> 27);
152 C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0); 148 C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0);
153 C[17] = (C[17] & 0x07ffffff); 149 C[17] = (C[17] & 0x07ffffff);
154 150
155 for(i=18; i<=35; i++) { 151 for(i=18; i<=35; i++) {
156 C[i] = 0; 152 C[i] = 0;
157 } 153 }
158 154
159 result = new Clipperz.Crypto.ECC.BinaryField.Value(C); 155 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
160//console.log("<<< binaryField.finiteField.(improved)module");
161 } 156 }
162 157
163 return result; 158 return result;
164 }; 159 };
165 } 160 }
166 161
167 return Clipperz.Crypto.ECC.StandardCurves._B571; 162 return Clipperz.Crypto.ECC.StandardCurves._B571;
168 }, 163 },
169 164
170 //----------------------------------------------------------------------------- 165 //-----------------------------------------------------------------------------
171 166
172 '_B283': null, 167 '_B283': null,
173 'B283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1 168 'B283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
174 if ((Clipperz.Crypto.ECC.StandardCurves._B283 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) { 169 if ((Clipperz.Crypto.ECC.StandardCurves._B283 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) {
175 Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({ 170 Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
176 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), 171 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
177 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), 172 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
178 b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16), 173 b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16),
179 G: new Clipperz.Crypto.ECC.BinaryField.Point({ 174 G: new Clipperz.Crypto.ECC.BinaryField.Point({
180 x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16), 175 x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16),
181 y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16) 176 y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16)
182 }), 177 }),
183 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16), 178 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16),
184 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) 179 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
185 }); 180 });
186 181
187 //----------------------------------------------------------------------------- 182 //-----------------------------------------------------------------------------
188 // 183 //
189 //Guide to Elliptic Curve Cryptography 184 //Guide to Elliptic Curve Cryptography
190 //Darrel Hankerson, Alfred Menezes, Scott Vanstone 185 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
191 //- Pag: 56, Alorithm 2.43 186 //- Pag: 56, Alorithm 2.43
192 // 187 //
193 //----------------------------------------------------------------------------- 188 //-----------------------------------------------------------------------------
194 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module; 189 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module;
195 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) { 190 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) {
196 varresult; 191 varresult;
197 192
198 if (aValue.bitSize() > 564) { 193 if (aValue.bitSize() > 564) {
199 MochiKit.Logging.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation"); 194 Clipperz.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation");
200 result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue); 195 result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue);
201 } else { 196 } else {
202 varC, T; 197 varC, T;
203 var i; 198 var i;
204 199
205//console.log(">>> binaryField.finiteField.(improved)module");
206 C = aValue._value.slice(0); 200 C = aValue._value.slice(0);
207 for (i=17; i>=9; i--) { 201 for (i=17; i>=9; i--) {
208 T = C[i]; 202 T = C[i];
209 C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0); 203 C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0);
210 C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0); 204 C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0);
211 } 205 }
212 T = (C[8] >>> 27); 206 T = (C[8] >>> 27);
213 C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0); 207 C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0);
214 C[8] = (C[8] & 0x07ffffff); 208 C[8] = (C[8] & 0x07ffffff);
215 209
216 for(i=9; i<=17; i++) { 210 for(i=9; i<=17; i++) {
217 C[i] = 0; 211 C[i] = 0;
218 } 212 }
219 213
220 result = new Clipperz.Crypto.ECC.BinaryField.Value(C); 214 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
221//console.log("<<< binaryField.finiteField.(improved)module");
222 } 215 }
223 216
224 return result; 217 return result;
225 }; 218 };
226 } 219 }
227 220
228 return Clipperz.Crypto.ECC.StandardCurves._B283; 221 return Clipperz.Crypto.ECC.StandardCurves._B283;
229 }, 222 },
230 223
231 //============================================================================== 224 //==============================================================================
232 __syntaxFix__: "syntax fix" 225 __syntaxFix__: "syntax fix"
233}); 226});
234 227
235 228
236 229
diff --git a/frontend/gamma/js/Clipperz/Crypto/PRNG.js b/frontend/gamma/js/Clipperz/Crypto/PRNG.js
index adfdb16..c539f06 100644
--- a/frontend/gamma/js/Clipperz/Crypto/PRNG.js
+++ b/frontend/gamma/js/Clipperz/Crypto/PRNG.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; 25 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
28} 26}
29 27
30try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) { 28try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) {
31 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!"; 29 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!";
32} 30}
33 31
34try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) { 32try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) {
35 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!"; 33 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!";
36} 34}
37 35
38if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; } 36if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; }
39 37
40//############################################################################# 38//#############################################################################
41 39
42Clipperz.Crypto.PRNG.EntropyAccumulator = function(args) { 40Clipperz.Crypto.PRNG.EntropyAccumulator = function(args) {
43 args = args || {}; 41 args = args || {};
44 //MochiKit.Base.bindMethods(this); 42 //MochiKit.Base.bindMethods(this);
45 43
46 this._stack = new Clipperz.ByteArray(); 44 this._stack = new Clipperz.ByteArray();
47 this._maxStackLengthBeforeHashing = args.maxStackLengthBeforeHashing || 256; 45 this._maxStackLengthBeforeHashing = args.maxStackLengthBeforeHashing || 256;
48 return this; 46 return this;
49} 47}
50 48
51Clipperz.Crypto.PRNG.EntropyAccumulator.prototype = MochiKit.Base.update(null, { 49Clipperz.Crypto.PRNG.EntropyAccumulator.prototype = MochiKit.Base.update(null, {
52 50
53 'toString': function() { 51 'toString': function() {
54 return "Clipperz.Crypto.PRNG.EntropyAccumulator"; 52 return "Clipperz.Crypto.PRNG.EntropyAccumulator";
55 }, 53 },
56 54
57 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
58 56
59 'stack': function() { 57 'stack': function() {
60 return this._stack; 58 return this._stack;
61 }, 59 },
62 60
63 'setStack': function(aValue) { 61 'setStack': function(aValue) {
64 this._stack = aValue; 62 this._stack = aValue;
65 }, 63 },
66 64
67 'resetStack': function() { 65 'resetStack': function() {
68 this.stack().reset(); 66 this.stack().reset();
69 }, 67 },
70 68
71 'maxStackLengthBeforeHashing': function() { 69 'maxStackLengthBeforeHashing': function() {
72 return this._maxStackLengthBeforeHashing; 70 return this._maxStackLengthBeforeHashing;
73 }, 71 },
74 72
75 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
76 74
77 'addRandomByte': function(aValue) { 75 'addRandomByte': function(aValue) {
78 this.stack().appendByte(aValue); 76 this.stack().appendByte(aValue);
79 77
80 if (this.stack().length() > this.maxStackLengthBeforeHashing()) { 78 if (this.stack().length() > this.maxStackLengthBeforeHashing()) {
81 this.setStack(Clipperz.Crypto.SHA.sha_d256(this.stack())); 79 this.setStack(Clipperz.Crypto.SHA.sha_d256(this.stack()));
82 } 80 }
83 }, 81 },
84 82
85 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
86 __syntaxFix__: "syntax fix" 84 __syntaxFix__: "syntax fix"
87}); 85});
88 86
89//############################################################################# 87//#############################################################################
90 88
91Clipperz.Crypto.PRNG.RandomnessSource = function(args) { 89Clipperz.Crypto.PRNG.RandomnessSource = function(args) {
92 args = args || {}; 90 args = args || {};
93 MochiKit.Base.bindMethods(this); 91 MochiKit.Base.bindMethods(this);
94 92
95 this._generator = args.generator || null; 93 this._generator = args.generator || null;
96 this._sourceId = args.sourceId || null; 94 this._sourceId = args.sourceId || null;
97 this._boostMode = args.boostMode || false; 95 this._boostMode = args.boostMode || false;
98 96
99 this._nextPoolIndex = 0; 97 this._nextPoolIndex = 0;
100 98
101 return this; 99 return this;
102} 100}
103 101
104Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, { 102Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, {
105 103
106 'generator': function() { 104 'generator': function() {
107 return this._generator; 105 return this._generator;
108 }, 106 },
109 107
110 'setGenerator': function(aValue) { 108 'setGenerator': function(aValue) {
111 this._generator = aValue; 109 this._generator = aValue;
112 }, 110 },
113 111
114 //------------------------------------------------------------------------- 112 //-------------------------------------------------------------------------
115 113
116 'boostMode': function() { 114 'boostMode': function() {
117 return this._boostMode; 115 return this._boostMode;
118 }, 116 },
@@ -396,336 +394,327 @@ Clipperz.Crypto.PRNG.Fortuna = function(args) {
396 this._counter = 0; 394 this._counter = 0;
397 this._key = new Clipperz.ByteArray(); 395 this._key = new Clipperz.ByteArray();
398 } else { 396 } else {
399 this._counter = 1; 397 this._counter = 1;
400 } 398 }
401 399
402 this._aesKey = null; 400 this._aesKey = null;
403 401
404 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64; 402 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64;
405 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32; 403 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32;
406 404
407 this._accumulators = []; 405 this._accumulators = [];
408 c = this.numberOfEntropyAccumulators(); 406 c = this.numberOfEntropyAccumulators();
409 for (i=0; i<c; i++) { 407 for (i=0; i<c; i++) {
410 this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator()); 408 this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator());
411 } 409 }
412 410
413 this._randomnessSources = []; 411 this._randomnessSources = [];
414 this._reseedCounter = 0; 412 this._reseedCounter = 0;
415 413
416 return this; 414 return this;
417} 415}
418 416
419Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, { 417Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, {
420 418
421 'toString': function() { 419 'toString': function() {
422 return "Clipperz.Crypto.PRNG.Fortuna"; 420 return "Clipperz.Crypto.PRNG.Fortuna";
423 }, 421 },
424 422
425 //------------------------------------------------------------------------- 423 //-------------------------------------------------------------------------
426 424
427 'key': function() { 425 'key': function() {
428 return this._key; 426 return this._key;
429 }, 427 },
430 428
431 'setKey': function(aValue) { 429 'setKey': function(aValue) {
432 this._key = aValue; 430 this._key = aValue;
433 this._aesKey = null; 431 this._aesKey = null;
434 }, 432 },
435 433
436 'aesKey': function() { 434 'aesKey': function() {
437 if (this._aesKey == null) { 435 if (this._aesKey == null) {
438 this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()}); 436 this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()});
439 } 437 }
440 438
441 return this._aesKey; 439 return this._aesKey;
442 }, 440 },
443 441
444 'accumulators': function() { 442 'accumulators': function() {
445 return this._accumulators; 443 return this._accumulators;
446 }, 444 },
447 445
448 'firstPoolReseedLevel': function() { 446 'firstPoolReseedLevel': function() {
449 return this._firstPoolReseedLevel; 447 return this._firstPoolReseedLevel;
450 }, 448 },
451 449
452 //------------------------------------------------------------------------- 450 //-------------------------------------------------------------------------
453 451
454 'reseedCounter': function() { 452 'reseedCounter': function() {
455 return this._reseedCounter; 453 return this._reseedCounter;
456 }, 454 },
457 455
458 'incrementReseedCounter': function() { 456 'incrementReseedCounter': function() {
459 this._reseedCounter = this._reseedCounter +1; 457 this._reseedCounter = this._reseedCounter +1;
460 }, 458 },
461 459
462 //------------------------------------------------------------------------- 460 //-------------------------------------------------------------------------
463 461
464 'reseed': function() { 462 'reseed': function() {
465 varnewKeySeed; 463 varnewKeySeed;
466 var reseedCounter; 464 var reseedCounter;
467 varreseedCounterMask; 465 varreseedCounterMask;
468 var i, c; 466 var i, c;
469 467
470 newKeySeed = this.key(); 468 newKeySeed = this.key();
471 this.incrementReseedCounter(); 469 this.incrementReseedCounter();
472 reseedCounter = this.reseedCounter(); 470 reseedCounter = this.reseedCounter();
473 471
474 c = this.numberOfEntropyAccumulators(); 472 c = this.numberOfEntropyAccumulators();
475 reseedCounterMask = 0xffffffff >>> (32 - c); 473 reseedCounterMask = 0xffffffff >>> (32 - c);
476 for (i=0; i<c; i++) { 474 for (i=0; i<c; i++) {
477 if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) { 475 if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) {
478 newKeySeed.appendBlock(this.accumulators()[i].stack()); 476 newKeySeed.appendBlock(this.accumulators()[i].stack());
479 this.accumulators()[i].resetStack(); 477 this.accumulators()[i].resetStack();
480 } 478 }
481 } 479 }
482 480
483 if (reseedCounter == 1) { 481 if (reseedCounter == 1) {
484 c = this.randomnessSources().length; 482 c = this.randomnessSources().length;
485 for (i=0; i<c; i++) { 483 for (i=0; i<c; i++) {
486 this.randomnessSources()[i].setBoostMode(false); 484 this.randomnessSources()[i].setBoostMode(false);
487 } 485 }
488 } 486 }
489 487
490 this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed)); 488 this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed));
491 if (reseedCounter == 1) { 489 if (reseedCounter == 1) {
492//MochiKit.Logging.logDebug("### PRNG.readyToGenerateRandomBytes");
493Clipperz.log("### PRNG.readyToGenerateRandomBytes"); 490Clipperz.log("### PRNG.readyToGenerateRandomBytes");
494 MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes'); 491 MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes');
495 } 492 }
496 MochiKit.Signal.signal(this, 'reseeded'); 493 MochiKit.Signal.signal(this, 'reseeded');
497 }, 494 },
498 495
499 //------------------------------------------------------------------------- 496 //-------------------------------------------------------------------------
500 497
501 'isReadyToGenerateRandomValues': function() { 498 'isReadyToGenerateRandomValues': function() {
502 return this.reseedCounter() != 0; 499 return this.reseedCounter() != 0;
503 }, 500 },
504 501
505 //------------------------------------------------------------------------- 502 //-------------------------------------------------------------------------
506 503
507 'entropyLevel': function() { 504 'entropyLevel': function() {
508 return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel()); 505 return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel());
509 }, 506 },
510 507
511 //------------------------------------------------------------------------- 508 //-------------------------------------------------------------------------
512 509
513 'counter': function() { 510 'counter': function() {
514 return this._counter; 511 return this._counter;
515 }, 512 },
516 513
517 'incrementCounter': function() { 514 'incrementCounter': function() {
518 this._counter += 1; 515 this._counter += 1;
519 }, 516 },
520 517
521 'counterBlock': function() { 518 'counterBlock': function() {
522 var result; 519 var result;
523 520
524 result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0); 521 result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0);
525 522
526 return result; 523 return result;
527 }, 524 },
528 525
529 //------------------------------------------------------------------------- 526 //-------------------------------------------------------------------------
530 527
531 'getRandomBlock': function() { 528 'getRandomBlock': function() {
532 var result; 529 var result;
533 530
534 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues())); 531 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues()));
535 this.incrementCounter(); 532 this.incrementCounter();
536 533
537 return result; 534 return result;
538 }, 535 },
539 536
540 //------------------------------------------------------------------------- 537 //-------------------------------------------------------------------------
541 538
542 'getRandomBytes': function(aSize) { 539 'getRandomBytes': function(aSize) {
543 var result; 540 var result;
544 541
545 if (this.isReadyToGenerateRandomValues()) { 542 if (this.isReadyToGenerateRandomValues()) {
546 var i,c; 543 var i,c;
547 var newKey; 544 var newKey;
548 545
549 result = new Clipperz.ByteArray(); 546 result = new Clipperz.ByteArray();
550 547
551 c = Math.ceil(aSize / (128 / 8)); 548 c = Math.ceil(aSize / (128 / 8));
552 for (i=0; i<c; i++) { 549 for (i=0; i<c; i++) {
553 result.appendBlock(this.getRandomBlock()); 550 result.appendBlock(this.getRandomBlock());
554 } 551 }
555 552
556 if (result.length() != aSize) { 553 if (result.length() != aSize) {
557 result = result.split(0, aSize); 554 result = result.split(0, aSize);
558 } 555 }
559 556
560 newKey = this.getRandomBlock().appendBlock(this.getRandomBlock()); 557 newKey = this.getRandomBlock().appendBlock(this.getRandomBlock());
561 this.setKey(newKey); 558 this.setKey(newKey);
562 } else { 559 } else {
563MochiKit.Logging.logWarning("Fortuna generator has not enough entropy, yet!"); 560Clipperz.logWarning("Fortuna generator has not enough entropy, yet!");
564 throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy; 561 throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy;
565 } 562 }
566 563
567 return result; 564 return result;
568 }, 565 },
569 566
570 //------------------------------------------------------------------------- 567 //-------------------------------------------------------------------------
571 568
572 'addRandomByte': function(aSourceId, aPoolId, aRandomValue) { 569 'addRandomByte': function(aSourceId, aPoolId, aRandomValue) {
573 varselectedAccumulator; 570 varselectedAccumulator;
574 571
575 selectedAccumulator = this.accumulators()[aPoolId]; 572 selectedAccumulator = this.accumulators()[aPoolId];
576 selectedAccumulator.addRandomByte(aRandomValue); 573 selectedAccumulator.addRandomByte(aRandomValue);
577 574
578 if (aPoolId == 0) { 575 if (aPoolId == 0) {
579 MochiKit.Signal.signal(this, 'addedRandomByte') 576 MochiKit.Signal.signal(this, 'addedRandomByte')
580 if (selectedAccumulator.stack().length() > this.firstPoolReseedLevel()) { 577 if (selectedAccumulator.stack().length() > this.firstPoolReseedLevel()) {
581 this.reseed(); 578 this.reseed();
582 } 579 }
583 } 580 }
584 }, 581 },
585 582
586 //------------------------------------------------------------------------- 583 //-------------------------------------------------------------------------
587 584
588 'numberOfEntropyAccumulators': function() { 585 'numberOfEntropyAccumulators': function() {
589 return this._numberOfEntropyAccumulators; 586 return this._numberOfEntropyAccumulators;
590 }, 587 },
591 588
592 //------------------------------------------------------------------------- 589 //-------------------------------------------------------------------------
593 590
594 'randomnessSources': function() { 591 'randomnessSources': function() {
595 return this._randomnessSources; 592 return this._randomnessSources;
596 }, 593 },
597 594
598 'addRandomnessSource': function(aRandomnessSource) { 595 'addRandomnessSource': function(aRandomnessSource) {
599 aRandomnessSource.setGenerator(this); 596 aRandomnessSource.setGenerator(this);
600 aRandomnessSource.setSourceId(this.randomnessSources().length); 597 aRandomnessSource.setSourceId(this.randomnessSources().length);
601 this.randomnessSources().push(aRandomnessSource); 598 this.randomnessSources().push(aRandomnessSource);
602 599
603 if (this.isReadyToGenerateRandomValues() == false) { 600 if (this.isReadyToGenerateRandomValues() == false) {
604 aRandomnessSource.setBoostMode(true); 601 aRandomnessSource.setBoostMode(true);
605 } 602 }
606 }, 603 },
607 604
608 //------------------------------------------------------------------------- 605 //-------------------------------------------------------------------------
609 606
610 'deferredEntropyCollection': function(aValue) { 607 'deferredEntropyCollection': function(aValue) {
611 var result; 608 var result;
612 609
613//MochiKit.Logging.logDebug(">>> PRNG.deferredEntropyCollection");
614 610
615 if (this.isReadyToGenerateRandomValues()) { 611 if (this.isReadyToGenerateRandomValues()) {
616//MochiKit.Logging.logDebug("--- PRNG.deferredEntropyCollection - 1");
617 result = aValue; 612 result = aValue;
618 } else { 613 } else {
619//MochiKit.Logging.logDebug("--- PRNG.deferredEntropyCollection - 2");
620 var deferredResult; 614 var deferredResult;
621 615
622 // Clipperz.NotificationCenter.notify(this, 'updatedProgressState', 'collectingEntropy', true);
623
624 deferredResult = new Clipperz.Async.Deferred("PRNG.deferredEntropyCollection"); 616 deferredResult = new Clipperz.Async.Deferred("PRNG.deferredEntropyCollection");
625 // deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.1 - PRNG.deferredEntropyCollection - 1: " + res); return res;});
626 deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Async.succeed, aValue)); 617 deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Async.succeed, aValue));
627 // deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.2 - PRNG.deferredEntropyCollection - 2: " + res); return res;});
628 MochiKit.Signal.connect(this, 618 MochiKit.Signal.connect(this,
629 'readyToGenerateRandomBytes', 619 'readyToGenerateRandomBytes',
630 deferredResult, 620 deferredResult,
631 'callback'); 621 'callback');
632 622
633 result = deferredResult; 623 result = deferredResult;
634 } 624 }
635//MochiKit.Logging.logDebug("<<< PRNG.deferredEntropyCollection - result: " + result);
636 625
637 return result; 626 return result;
638 }, 627 },
639 628
640 //------------------------------------------------------------------------- 629 //-------------------------------------------------------------------------
641 630
642 'fastEntropyAccumulationForTestingPurpose': function() { 631 'fastEntropyAccumulationForTestingPurpose': function() {
643 while (! this.isReadyToGenerateRandomValues()) { 632 while (! this.isReadyToGenerateRandomValues()) {
644 this.addRandomByte(Math.floor(Math.random() * 32), Math.floor(Math.random() * 32), Math.floor(Math.random() * 256)); 633 this.addRandomByte(Math.floor(Math.random() * 32), Math.floor(Math.random() * 32), Math.floor(Math.random() * 256));
645 } 634 }
646 }, 635 },
647 636
648 //------------------------------------------------------------------------- 637 //-------------------------------------------------------------------------
649 638
650 'dump': function(appendToDoc) { 639 'dump': function(appendToDoc) {
651 var tbl; 640 var tbl;
652 var i,c; 641 var i,c;
653 642
654 tbl = document.createElement("table"); 643 tbl = document.createElement("table");
655 tbl.border = 0; 644 tbl.border = 0;
656 with (tbl.style) { 645 with (tbl.style) {
657 border = "1px solid lightgrey"; 646 border = "1px solid lightgrey";
658 fontFamily = 'Helvetica, Arial, sans-serif'; 647 fontFamily = 'Helvetica, Arial, sans-serif';
659 fontSize = '8pt'; 648 fontSize = '8pt';
660 //borderCollapse = "collapse"; 649 //borderCollapse = "collapse";
661 } 650 }
662 var hdr = tbl.createTHead(); 651 var hdr = tbl.createTHead();
663 var hdrtr = hdr.insertRow(0); 652 var hdrtr = hdr.insertRow(0);
664 // document.createElement("tr"); 653 // document.createElement("tr");
665 { 654 {
666 var ntd; 655 var ntd;
667 656
668 ntd = hdrtr.insertCell(0); 657 ntd = hdrtr.insertCell(0);
669 ntd.style.borderBottom = "1px solid lightgrey"; 658 ntd.style.borderBottom = "1px solid lightgrey";
670 ntd.style.borderRight = "1px solid lightgrey"; 659 ntd.style.borderRight = "1px solid lightgrey";
671 ntd.appendChild(document.createTextNode("#")); 660 ntd.appendChild(document.createTextNode("#"));
672 661
673 ntd = hdrtr.insertCell(1); 662 ntd = hdrtr.insertCell(1);
674 ntd.style.borderBottom = "1px solid lightgrey"; 663 ntd.style.borderBottom = "1px solid lightgrey";
675 ntd.style.borderRight = "1px solid lightgrey"; 664 ntd.style.borderRight = "1px solid lightgrey";
676 ntd.appendChild(document.createTextNode("s")); 665 ntd.appendChild(document.createTextNode("s"));
677 666
678 ntd = hdrtr.insertCell(2); 667 ntd = hdrtr.insertCell(2);
679 ntd.colSpan = this.firstPoolReseedLevel(); 668 ntd.colSpan = this.firstPoolReseedLevel();
680 ntd.style.borderBottom = "1px solid lightgrey"; 669 ntd.style.borderBottom = "1px solid lightgrey";
681 ntd.style.borderRight = "1px solid lightgrey"; 670 ntd.style.borderRight = "1px solid lightgrey";
682 ntd.appendChild(document.createTextNode("base values")); 671 ntd.appendChild(document.createTextNode("base values"));
683 672
684 ntd = hdrtr.insertCell(3); 673 ntd = hdrtr.insertCell(3);
685 ntd.colSpan = 20; 674 ntd.colSpan = 20;
686 ntd.style.borderBottom = "1px solid lightgrey"; 675 ntd.style.borderBottom = "1px solid lightgrey";
687 ntd.appendChild(document.createTextNode("extra values")); 676 ntd.appendChild(document.createTextNode("extra values"));
688 677
689 } 678 }
690 679
691 c = this.accumulators().length; 680 c = this.accumulators().length;
692 for (i=0; i<c ; i++) { 681 for (i=0; i<c ; i++) {
693 varcurrentAccumulator; 682 varcurrentAccumulator;
694 var bdytr; 683 var bdytr;
695 var bdytd; 684 var bdytd;
696 var ii, cc; 685 var ii, cc;
697 686
698 currentAccumulator = this.accumulators()[i] 687 currentAccumulator = this.accumulators()[i]
699 688
700 bdytr = tbl.insertRow(true); 689 bdytr = tbl.insertRow(true);
701 690
702 bdytd = bdytr.insertCell(0); 691 bdytd = bdytr.insertCell(0);
703 bdytd.style.borderRight = "1px solid lightgrey"; 692 bdytd.style.borderRight = "1px solid lightgrey";
704 bdytd.style.color = "lightgrey"; 693 bdytd.style.color = "lightgrey";
705 bdytd.appendChild(document.createTextNode("" + i)); 694 bdytd.appendChild(document.createTextNode("" + i));
706 695
707 bdytd = bdytr.insertCell(1); 696 bdytd = bdytr.insertCell(1);
708 bdytd.style.borderRight = "1px solid lightgrey"; 697 bdytd.style.borderRight = "1px solid lightgrey";
709 bdytd.style.color = "gray"; 698 bdytd.style.color = "gray";
710 bdytd.appendChild(document.createTextNode("" + currentAccumulator.stack().length())); 699 bdytd.appendChild(document.createTextNode("" + currentAccumulator.stack().length()));
711 700
712 701
713 cc = Math.max(currentAccumulator.stack().length(), this.firstPoolReseedLevel()); 702 cc = Math.max(currentAccumulator.stack().length(), this.firstPoolReseedLevel());
714 for (ii=0; ii<cc; ii++) { 703 for (ii=0; ii<cc; ii++) {
715 var cellText; 704 var cellText;
716 705
717 bdytd = bdytr.insertCell(ii + 2); 706 bdytd = bdytr.insertCell(ii + 2);
718 707
719 if (ii < currentAccumulator.stack().length()) { 708 if (ii < currentAccumulator.stack().length()) {
720 cellText = Clipperz.ByteArray.byteToHex(currentAccumulator.stack().byteAtIndex(ii)); 709 cellText = Clipperz.ByteArray.byteToHex(currentAccumulator.stack().byteAtIndex(ii));
721 } else { 710 } else {
722 cellText = "_"; 711 cellText = "_";
723 } 712 }
724 713
725 if (ii == (this.firstPoolReseedLevel() - 1)) { 714 if (ii == (this.firstPoolReseedLevel() - 1)) {
726 bdytd.style.borderRight = "1px solid lightgrey"; 715 bdytd.style.borderRight = "1px solid lightgrey";
727 } 716 }
728 717
729 bdytd.appendChild(document.createTextNode(cellText)); 718 bdytd.appendChild(document.createTextNode(cellText));
730 } 719 }
731 720
diff --git a/frontend/gamma/js/Clipperz/Crypto/RSA.js b/frontend/gamma/js/Clipperz/Crypto/RSA.js
index 6844dba..5a480f1 100644
--- a/frontend/gamma/js/Clipperz/Crypto/RSA.js
+++ b/frontend/gamma/js/Clipperz/Crypto/RSA.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.Crypto.RSA depends on Clipperz.Crypto.BigInt!"; 25 throw "Clipperz.Crypto.RSA depends on Clipperz.Crypto.BigInt!";
28} 26}
29 27
30if (typeof(Clipperz.Crypto.RSA) == 'undefined') { Clipperz.Crypto.RSA = {}; } 28if (typeof(Clipperz.Crypto.RSA) == 'undefined') { Clipperz.Crypto.RSA = {}; }
31 29
32Clipperz.Crypto.RSA.VERSION = "0.1"; 30Clipperz.Crypto.RSA.VERSION = "0.1";
33Clipperz.Crypto.RSA.NAME = "Clipperz.RSA"; 31Clipperz.Crypto.RSA.NAME = "Clipperz.RSA";
34 32
35//############################################################################# 33//#############################################################################
36 34
37MochiKit.Base.update(Clipperz.Crypto.RSA, { 35MochiKit.Base.update(Clipperz.Crypto.RSA, {
38 36
39 //------------------------------------------------------------------------- 37 //-------------------------------------------------------------------------
40 38
41 'publicKeyWithValues': function (e, d, n) { 39 'publicKeyWithValues': function (e, d, n) {
42 varresult; 40 varresult;
43 41
44 result = {}; 42 result = {};
45 43
46 if (e.isBigInt) { 44 if (e.isBigInt) {
47 result.e = e; 45 result.e = e;
48 } else { 46 } else {
49 result.e = new Clipperz.Crypto.BigInt(e, 16); 47 result.e = new Clipperz.Crypto.BigInt(e, 16);
50 } 48 }
51 49
52 if (d.isBigInt) { 50 if (d.isBigInt) {
53 result.d = d; 51 result.d = d;
54 } else { 52 } else {
55 result.d = new Clipperz.Crypto.BigInt(d, 16); 53 result.d = new Clipperz.Crypto.BigInt(d, 16);
56 } 54 }
57 55
58 if (n.isBigInt) { 56 if (n.isBigInt) {
59 result.n = n; 57 result.n = n;
60 } else { 58 } else {
61 result.n = new Clipperz.Crypto.BigInt(n, 16); 59 result.n = new Clipperz.Crypto.BigInt(n, 16);
62 } 60 }
63 61
64 return result; 62 return result;
65 }, 63 },
66 64
67 'privateKeyWithValues': function(e, d, n) { 65 'privateKeyWithValues': function(e, d, n) {
68 return Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n); 66 return Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n);
69 }, 67 },
70 68
71 //----------------------------------------------------------------------------- 69 //-----------------------------------------------------------------------------
72 70
73 'encryptUsingPublicKey': function (aKey, aMessage) { 71 'encryptUsingPublicKey': function (aKey, aMessage) {
74 varmessageValue; 72 varmessageValue;
75 varresult; 73 varresult;
76 74
77 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16); 75 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16);
78 result = messageValue.powerModule(aKey.e, aKey.n); 76 result = messageValue.powerModule(aKey.e, aKey.n);
79 77
80 return result.asString(16); 78 return result.asString(16);
81 }, 79 },
82 80
83 //............................................................................. 81 //.............................................................................
84 82
85 'decryptUsingPublicKey': function (aKey, aMessage) { 83 'decryptUsingPublicKey': function (aKey, aMessage) {
86 return Clipperz.Crypto.RSA.encryptUsingPublicKey(aKey, aMessage); 84 return Clipperz.Crypto.RSA.encryptUsingPublicKey(aKey, aMessage);
87 }, 85 },
88 86
89 //----------------------------------------------------------------------------- 87 //-----------------------------------------------------------------------------
90 88
91 'encryptUsingPrivateKey': function (aKey, aMessage) { 89 'encryptUsingPrivateKey': function (aKey, aMessage) {
92 varmessageValue; 90 varmessageValue;
93 varresult; 91 varresult;
94 92
95 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16); 93 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16);
96 result = messageValue.powerModule(aKey.d, aKey.n); 94 result = messageValue.powerModule(aKey.d, aKey.n);
97 95
98 return result.asString(16); 96 return result.asString(16);
99 }, 97 },
100 98
101 //............................................................................. 99 //.............................................................................
102 100
103 'decryptUsingPrivateKey': function (aKey, aMessage) { 101 'decryptUsingPrivateKey': function (aKey, aMessage) {
104 return Clipperz.Crypto.RSA.encryptUsingPrivateKey(aKey, aMessage); 102 return Clipperz.Crypto.RSA.encryptUsingPrivateKey(aKey, aMessage);
105 }, 103 },
106 104
107 //----------------------------------------------------------------------------- 105 //-----------------------------------------------------------------------------
108 106
109 'generatePublicKey': function(aNumberOfBits) { 107 'generatePublicKey': function(aNumberOfBits) {
110 varresult; 108 varresult;
111 vare; 109 vare;
112 vard; 110 vard;
113 varn; 111 varn;
114 112
115 e = new Clipperz.Crypto.BigInt("10001", 16); 113 e = new Clipperz.Crypto.BigInt("10001", 16);
116 114
117 { 115 {
118 var p, q; 116 var p, q;
diff --git a/frontend/gamma/js/Clipperz/Crypto/SHA.js b/frontend/gamma/js/Clipperz/Crypto/SHA.js
index b07fa85..f8bfe6e 100644
--- a/frontend/gamma/js/Clipperz/Crypto/SHA.js
+++ b/frontend/gamma/js/Clipperz/Crypto/SHA.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; 25 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
28} 26}
29 27
30if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } 28if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
31if (typeof(Clipperz.Crypto.SHA) == 'undefined') { Clipperz.Crypto.SHA = {}; } 29if (typeof(Clipperz.Crypto.SHA) == 'undefined') { Clipperz.Crypto.SHA = {}; }
32 30
33Clipperz.Crypto.SHA.VERSION = "0.3"; 31Clipperz.Crypto.SHA.VERSION = "0.3";
34Clipperz.Crypto.SHA.NAME = "Clipperz.Crypto.SHA"; 32Clipperz.Crypto.SHA.NAME = "Clipperz.Crypto.SHA";
35 33
36MochiKit.Base.update(Clipperz.Crypto.SHA, { 34MochiKit.Base.update(Clipperz.Crypto.SHA, {
37 35
38 '__repr__': function () { 36 '__repr__': function () {
39 return "[" + this.NAME + " " + this.VERSION + "]"; 37 return "[" + this.NAME + " " + this.VERSION + "]";
40 }, 38 },
41 39
42 'toString': function () { 40 'toString': function () {
43 return this.__repr__(); 41 return this.__repr__();
44 }, 42 },
45 43
46 //----------------------------------------------------------------------------- 44 //-----------------------------------------------------------------------------
47 45
48 'rotateRight': function(aValue, aNumberOfBits) { 46 'rotateRight': function(aValue, aNumberOfBits) {
49//Clipperz.Profile.start("Clipperz.Crypto.SHA.rotateRight"); 47//Clipperz.Profile.start("Clipperz.Crypto.SHA.rotateRight");
50 var result; 48 var result;
51 49
52 result = (aValue >>> aNumberOfBits) | (aValue << (32 - aNumberOfBits)); 50 result = (aValue >>> aNumberOfBits) | (aValue << (32 - aNumberOfBits));
53 51
54//Clipperz.Profile.stop("Clipperz.Crypto.SHA.rotateRight"); 52//Clipperz.Profile.stop("Clipperz.Crypto.SHA.rotateRight");
55 return result; 53 return result;
56 }, 54 },
57 55
58 'shiftRight': function(aValue, aNumberOfBits) { 56 'shiftRight': function(aValue, aNumberOfBits) {
59//Clipperz.Profile.start("Clipperz.Crypto.SHA.shiftRight"); 57//Clipperz.Profile.start("Clipperz.Crypto.SHA.shiftRight");
60 var result; 58 var result;
61 59
62 result = aValue >>> aNumberOfBits; 60 result = aValue >>> aNumberOfBits;
63 61
64//Clipperz.Profile.stop("Clipperz.Crypto.SHA.shiftRight"); 62//Clipperz.Profile.stop("Clipperz.Crypto.SHA.shiftRight");
65 return result; 63 return result;
66 }, 64 },
67 65
68 //----------------------------------------------------------------------------- 66 //-----------------------------------------------------------------------------
69 67
70 'safeAdd': function() { 68 'safeAdd': function() {
71//Clipperz.Profile.start("Clipperz.Crypto.SHA.safeAdd"); 69//Clipperz.Profile.start("Clipperz.Crypto.SHA.safeAdd");
72 varresult; 70 varresult;
73 vari, c; 71 vari, c;
74 72
75 result = arguments[0]; 73 result = arguments[0];
76 c = arguments.length; 74 c = arguments.length;
77 for (i=1; i<c; i++) { 75 for (i=1; i<c; i++) {
78 varlowerBytesSum; 76 varlowerBytesSum;
79 77
80 lowerBytesSum = (result & 0xffff) + (arguments[i] & 0xffff); 78 lowerBytesSum = (result & 0xffff) + (arguments[i] & 0xffff);
81 result = (((result >> 16) + (arguments[i] >> 16) + (lowerBytesSum >> 16)) << 16) | (lowerBytesSum & 0xffff); 79 result = (((result >> 16) + (arguments[i] >> 16) + (lowerBytesSum >> 16)) << 16) | (lowerBytesSum & 0xffff);
82 } 80 }
83 81
84//Clipperz.Profile.stop("Clipperz.Crypto.SHA.safeAdd"); 82//Clipperz.Profile.stop("Clipperz.Crypto.SHA.safeAdd");
85 return result; 83 return result;
86 }, 84 },
87 85
88 //----------------------------------------------------------------------------- 86 //-----------------------------------------------------------------------------
89 87
90 'sha256_array': function(aValue) { 88 'sha256_array': function(aValue) {
91//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256_array"); 89//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256_array");
92 varresult; 90 varresult;
93 varmessage; 91 varmessage;
94 var h0, h1, h2, h3, h4, h5, h6, h7; 92 var h0, h1, h2, h3, h4, h5, h6, h7;
95 vark; 93 vark;
96 varmessageLength; 94 varmessageLength;
97 varmessageLengthInBits; 95 varmessageLengthInBits;
98 var_i, _c; 96 var_i, _c;
99 var charBits; 97 var charBits;
100 var rotateRight; 98 var rotateRight;
101 var shiftRight; 99 var shiftRight;
102 var safeAdd; 100 var safeAdd;
103 varbytesPerBlock; 101 varbytesPerBlock;
104 var currentMessageIndex; 102 var currentMessageIndex;
105 103
106 bytesPerBlock = 512/8; 104 bytesPerBlock = 512/8;
107 rotateRight = Clipperz.Crypto.SHA.rotateRight; 105 rotateRight = Clipperz.Crypto.SHA.rotateRight;
108 shiftRight = Clipperz.Crypto.SHA.shiftRight; 106 shiftRight = Clipperz.Crypto.SHA.shiftRight;
109 safeAdd = Clipperz.Crypto.SHA.safeAdd; 107 safeAdd = Clipperz.Crypto.SHA.safeAdd;
110 108
111 charBits = 8; 109 charBits = 8;
112 110
113 h0 = 0x6a09e667; 111 h0 = 0x6a09e667;
114 h1 = 0xbb67ae85; 112 h1 = 0xbb67ae85;
115 h2 = 0x3c6ef372; 113 h2 = 0x3c6ef372;
116 h3 = 0xa54ff53a; 114 h3 = 0xa54ff53a;
117 h4 = 0x510e527f; 115 h4 = 0x510e527f;
118 h5 = 0x9b05688c; 116 h5 = 0x9b05688c;
diff --git a/frontend/gamma/js/Clipperz/Crypto/SRP.js b/frontend/gamma/js/Clipperz/Crypto/SRP.js
index 3b25275..597e72d 100644
--- a/frontend/gamma/js/Clipperz/Crypto/SRP.js
+++ b/frontend/gamma/js/Clipperz/Crypto/SRP.js
@@ -1,328 +1,316 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; 25 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
28} 26}
29 27
30try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) { 28try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) {
31 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.BigInt!"; 29 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.BigInt!";
32} 30}
33 31
34try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) { 32try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
35 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.PRNG!"; 33 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.PRNG!";
36} 34}
37 35
38if (typeof(Clipperz.Crypto.SRP) == 'undefined') { Clipperz.Crypto.SRP = {}; } 36if (typeof(Clipperz.Crypto.SRP) == 'undefined') { Clipperz.Crypto.SRP = {}; }
39 37
40Clipperz.Crypto.SRP.VERSION = "0.1"; 38Clipperz.Crypto.SRP.VERSION = "0.1";
41Clipperz.Crypto.SRP.NAME = "Clipperz.Crypto.SRP"; 39Clipperz.Crypto.SRP.NAME = "Clipperz.Crypto.SRP";
42 40
43//############################################################################# 41//#############################################################################
44 42
45MochiKit.Base.update(Clipperz.Crypto.SRP, { 43MochiKit.Base.update(Clipperz.Crypto.SRP, {
46 44
47 '_n': null, 45 '_n': null,
48 '_g': null, 46 '_g': null,
49 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
50 48
51 'n': function() { 49 'n': function() {
52 if (Clipperz.Crypto.SRP._n == null) { 50 if (Clipperz.Crypto.SRP._n == null) {
53 Clipperz.Crypto.SRP._n = new Clipperz.Crypto.BigInt("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16); 51 Clipperz.Crypto.SRP._n = new Clipperz.Crypto.BigInt("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16);
54 } 52 }
55 53
56 return Clipperz.Crypto.SRP._n; 54 return Clipperz.Crypto.SRP._n;
57 }, 55 },
58 56
59 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
60 58
61 'g': function() { 59 'g': function() {
62 if (Clipperz.Crypto.SRP._g == null) { 60 if (Clipperz.Crypto.SRP._g == null) {
63 Clipperz.Crypto.SRP._g = new Clipperz.Crypto.BigInt(2); //eventually 5 (as suggested on the Diffi-Helmann documentation) 61 Clipperz.Crypto.SRP._g = new Clipperz.Crypto.BigInt(2); //eventually 5 (as suggested on the Diffi-Helmann documentation)
64 } 62 }
65 63
66 return Clipperz.Crypto.SRP._g; 64 return Clipperz.Crypto.SRP._g;
67 }, 65 },
68 66
69 //----------------------------------------------------------------------------- 67 //-----------------------------------------------------------------------------
70 68
71 'exception': { 69 'exception': {
72 'InvalidValue': new MochiKit.Base.NamedError("Clipperz.Crypto.SRP.exception.InvalidValue") 70 'InvalidValue': new MochiKit.Base.NamedError("Clipperz.Crypto.SRP.exception.InvalidValue")
73 }, 71 },
74 72
75 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
76 __syntaxFix__: "syntax fix" 74 __syntaxFix__: "syntax fix"
77 75
78}); 76});
79 77
80//############################################################################# 78//#############################################################################
81// 79//
82 // S R P C o n n e c t i o n version 1.0 80 // S R P C o n n e c t i o n version 1.0
83// 81//
84//============================================================================= 82//=============================================================================
85Clipperz.Crypto.SRP.Connection = function (args) { 83Clipperz.Crypto.SRP.Connection = function (args) {
86 args = args || {}; 84 args = args || {};
87 85
88 this._C = args.C; 86 this._C = args.C;
89 this._P = args.P; 87 this._P = args.P;
90 this.hash = args.hash; 88 this.hash = args.hash;
91 89
92 this._a = null; 90 this._a = null;
93 this._A = null; 91 this._A = null;
94 92
95 this._s = null; 93 this._s = null;
96 this._B = null; 94 this._B = null;
97 95
98 this._x = null; 96 this._x = null;
99 97
100 this._u = null; 98 this._u = null;
101 this._K = null; 99 this._K = null;
102 this._M1 = null; 100 this._M1 = null;
103 this._M2 = null; 101 this._M2 = null;
104 102
105 this._sessionKey = null; 103 this._sessionKey = null;
106 104
107 return this; 105 return this;
108} 106}
109 107
110Clipperz.Crypto.SRP.Connection.prototype = MochiKit.Base.update(null, { 108Clipperz.Crypto.SRP.Connection.prototype = MochiKit.Base.update(null, {
111 109
112 'toString': function () { 110 'toString': function () {
113 return "Clipperz.Crypto.SRP.Connection (username: " + this.username() + "). Status: " + this.statusDescription(); 111 return "Clipperz.Crypto.SRP.Connection (username: " + this.username() + "). Status: " + this.statusDescription();
114 }, 112 },
115 113
116 //------------------------------------------------------------------------- 114 //-------------------------------------------------------------------------
117 115
118 'C': function () { 116 'C': function () {
119 return this._C; 117 return this._C;
120 }, 118 },
121 119
122 //------------------------------------------------------------------------- 120 //-------------------------------------------------------------------------
123 121
124 'P': function () { 122 'P': function () {
125 return this._P; 123 return this._P;
126 }, 124 },
127 125
128 //------------------------------------------------------------------------- 126 //-------------------------------------------------------------------------
129 127
130 'a': function () { 128 'a': function () {
131 if (this._a == null) { 129 if (this._a == null) {
132 this._a = new Clipperz.Crypto.BigInt(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2), 16); 130 this._a = new Clipperz.Crypto.BigInt(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2), 16);
133 // this._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10); 131 // this._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10);
134//MochiKit.Logging.logDebug("SRP a: " + this._a);
135 } 132 }
136 133
137 return this._a; 134 return this._a;
138 }, 135 },
139 136
140 //------------------------------------------------------------------------- 137 //-------------------------------------------------------------------------
141 138
142 'A': function () { 139 'A': function () {
143 if (this._A == null) { 140 if (this._A == null) {
144 //Warning: this value should be strictly greater than zero: how should we perform this check? 141 //Warning: this value should be strictly greater than zero: how should we perform this check?
145 this._A = Clipperz.Crypto.SRP.g().powerModule(this.a(), Clipperz.Crypto.SRP.n()); 142 this._A = Clipperz.Crypto.SRP.g().powerModule(this.a(), Clipperz.Crypto.SRP.n());
146 143
147 if (this._A.equals(0)) { 144 if (this._A.equals(0)) {
148MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'A' to 0."); 145 Clipperz.logError("Clipperz.Crypto.SRP.Connection: trying to set 'A' to 0.");
149 throw Clipperz.Crypto.SRP.exception.InvalidValue; 146 throw Clipperz.Crypto.SRP.exception.InvalidValue;
150 } 147 }
151//MochiKit.Logging.logDebug("SRP A: " + this._A);
152 } 148 }
153 149
154 return this._A; 150 return this._A;
155 }, 151 },
156 152
157 //------------------------------------------------------------------------- 153 //-------------------------------------------------------------------------
158 154
159 's': function () { 155 's': function () {
160 return this._s; 156 return this._s;
161//MochiKit.Logging.logDebug("SRP s: " + this._S);
162 }, 157 },
163 158
164 'set_s': function(aValue) { 159 'set_s': function(aValue) {
165 this._s = aValue; 160 this._s = aValue;
166 }, 161 },
167 162
168 //------------------------------------------------------------------------- 163 //-------------------------------------------------------------------------
169 164
170 'B': function () { 165 'B': function () {
171 return this._B; 166 return this._B;
172 }, 167 },
173 168
174 'set_B': function(aValue) { 169 'set_B': function(aValue) {
175 //Warning: this value should be strictly greater than zero: how should we perform this check? 170 //Warning: this value should be strictly greater than zero: how should we perform this check?
176 if (! aValue.equals(0)) { 171 if (! aValue.equals(0)) {
177 this._B = aValue; 172 this._B = aValue;
178//MochiKit.Logging.logDebug("SRP B: " + this._B);
179 } else { 173 } else {
180MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'B' to 0."); 174 Clipperz.logError("Clipperz.Crypto.SRP.Connection: trying to set 'B' to 0.");
181 throw Clipperz.Crypto.SRP.exception.InvalidValue; 175 throw Clipperz.Crypto.SRP.exception.InvalidValue;
182 } 176 }
183 }, 177 },
184 178
185 //------------------------------------------------------------------------- 179 //-------------------------------------------------------------------------
186 180
187 'x': function () { 181 'x': function () {
188 if (this._x == null) { 182 if (this._x == null) {
189 this._x = new Clipperz.Crypto.BigInt(this.stringHash(this.s().asString(16, 64) + this.P()), 16); 183 this._x = new Clipperz.Crypto.BigInt(this.stringHash(this.s().asString(16, 64) + this.P()), 16);
190//MochiKit.Logging.logDebug("SRP x: " + this._x);
191 } 184 }
192 185
193 return this._x; 186 return this._x;
194 }, 187 },
195 188
196 //------------------------------------------------------------------------- 189 //-------------------------------------------------------------------------
197 190
198 'u': function () { 191 'u': function () {
199 if (this._u == null) { 192 if (this._u == null) {
200 this._u = new Clipperz.Crypto.BigInt(this.stringHash(this.B().asString()), 16); 193 this._u = new Clipperz.Crypto.BigInt(this.stringHash(this.B().asString()), 16);
201//MochiKit.Logging.logDebug("SRP u: " + this._u);
202 } 194 }
203 195
204 return this._u; 196 return this._u;
205 }, 197 },
206 198
207 //------------------------------------------------------------------------- 199 //-------------------------------------------------------------------------
208 200
209 'S': function () { 201 'S': function () {
210 if (this._S == null) { 202 if (this._S == null) {
211 var bigint; 203 var bigint;
212 varsrp; 204 varsrp;
213 205
214 bigint = Clipperz.Crypto.BigInt; 206 bigint = Clipperz.Crypto.BigInt;
215 srp = Clipperz.Crypto.SRP; 207 srp = Clipperz.Crypto.SRP;
216 208
217 this._S =bigint.powerModule( 209 this._S =bigint.powerModule(
218 bigint.subtract(this.B(), bigint.powerModule(srp.g(), this.x(), srp.n())), 210 bigint.subtract(this.B(), bigint.powerModule(srp.g(), this.x(), srp.n())),
219 bigint.add(this.a(), bigint.multiply(this.u(), this.x())), 211 bigint.add(this.a(), bigint.multiply(this.u(), this.x())),
220 srp.n() 212 srp.n()
221 ) 213 )
222//MochiKit.Logging.logDebug("SRP S: " + this._S);
223 } 214 }
224 215
225 return this._S; 216 return this._S;
226 }, 217 },
227 218
228 //------------------------------------------------------------------------- 219 //-------------------------------------------------------------------------
229 220
230 'K': function () { 221 'K': function () {
231 if (this._K == null) { 222 if (this._K == null) {
232 this._K = this.stringHash(this.S().asString()); 223 this._K = this.stringHash(this.S().asString());
233//MochiKit.Logging.logDebug("SRP K: " + this._K);
234 } 224 }
235 225
236 return this._K; 226 return this._K;
237 }, 227 },
238 228
239 //------------------------------------------------------------------------- 229 //-------------------------------------------------------------------------
240 230
241 'M1': function () { 231 'M1': function () {
242 if (this._M1 == null) { 232 if (this._M1 == null) {
243 this._M1 = this.stringHash(this.A().asString(10) + this.B().asString(10) + this.K()); 233 this._M1 = this.stringHash(this.A().asString(10) + this.B().asString(10) + this.K());
244//MochiKit.Logging.logDebug("SRP M1: " + this._M1);
245 } 234 }
246 235
247 return this._M1; 236 return this._M1;
248 }, 237 },
249 238
250 //------------------------------------------------------------------------- 239 //-------------------------------------------------------------------------
251 240
252 'M2': function () { 241 'M2': function () {
253 if (this._M2 == null) { 242 if (this._M2 == null) {
254 this._M2 = this.stringHash(this.A().asString(10) + this.M1() + this.K()); 243 this._M2 = this.stringHash(this.A().asString(10) + this.M1() + this.K());
255//MochiKit.Logging.logDebug("SRP M2: " + this._M2);
256 } 244 }
257 245
258 return this._M2; 246 return this._M2;
259 }, 247 },
260 248
261 //========================================================================= 249 //=========================================================================
262 250
263 'serverSideCredentialsWithSalt': function(aSalt) { 251 'serverSideCredentialsWithSalt': function(aSalt) {
264 var result; 252 var result;
265 var s, x, v; 253 var s, x, v;
266 254
267 s = aSalt; 255 s = aSalt;
268 x = this.stringHash(s + this.P()); 256 x = this.stringHash(s + this.P());
269 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n()); 257 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
270 258
271 result = {}; 259 result = {};
272 result['C'] = this.C(); 260 result['C'] = this.C();
273 result['s'] = s; 261 result['s'] = s;
274 result['v'] = v.asString(16); 262 result['v'] = v.asString(16);
275 263
276 return result; 264 return result;
277 }, 265 },
278 266
279 'serverSideCredentials': function() { 267 'serverSideCredentials': function() {
280 var result; 268 var result;
281 var s; 269 var s;
282 270
283 s = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 271 s = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
284 272
285 result = this.serverSideCredentialsWithSalt(s); 273 result = this.serverSideCredentialsWithSalt(s);
286 274
287 return result; 275 return result;
288 }, 276 },
289 277
290 //========================================================================= 278 //=========================================================================
291/* 279/*
292 'computeServerSide_S': function(b) { 280 'computeServerSide_S': function(b) {
293 var result; 281 var result;
294 var v; 282 var v;
295 var bigint; 283 var bigint;
296 varsrp; 284 varsrp;
297 285
298 bigint = Clipperz.Crypto.BigInt; 286 bigint = Clipperz.Crypto.BigInt;
299 srp = Clipperz.Crypto.SRP; 287 srp = Clipperz.Crypto.SRP;
300 288
301 v = new Clipperz.Crypto.BigInt(srpConnection.serverSideCredentialsWithSalt(this.s().asString(16, 64)).v, 16); 289 v = new Clipperz.Crypto.BigInt(srpConnection.serverSideCredentialsWithSalt(this.s().asString(16, 64)).v, 16);
302 // _S = (this.A().multiply(this.v().modPow(this.u(), this.n()))).modPow(this.b(), this.n()); 290 // _S = (this.A().multiply(this.v().modPow(this.u(), this.n()))).modPow(this.b(), this.n());
303 result = bigint.powerModule( 291 result = bigint.powerModule(
304 bigint.multiply( 292 bigint.multiply(
305 this.A(), 293 this.A(),
306 bigint.powerModule(v, this.u(), srp.n()) 294 bigint.powerModule(v, this.u(), srp.n())
307 ), new Clipperz.Crypto.BigInt(b, 10), srp.n() 295 ), new Clipperz.Crypto.BigInt(b, 10), srp.n()
308 ); 296 );
309 297
310 return result; 298 return result;
311 }, 299 },
312*/ 300*/
313 //========================================================================= 301 //=========================================================================
314 302
315 'stringHash': function(aValue) { 303 'stringHash': function(aValue) {
316 varresult; 304 varresult;
317 305
318 result = this.hash(new Clipperz.ByteArray(aValue)).toHexString().substring(2); 306 result = this.hash(new Clipperz.ByteArray(aValue)).toHexString().substring(2);
319 307
320 return result; 308 return result;
321 }, 309 },
322 310
323 //========================================================================= 311 //=========================================================================
324 __syntaxFix__: "syntax fix" 312 __syntaxFix__: "syntax fix"
325 313
326}); 314});
327 315
328//############################################################################# 316//#############################################################################
diff --git a/frontend/gamma/js/Clipperz/DOM.js b/frontend/gamma/js/Clipperz/DOM.js
index 8f24653..1d52a4b 100644
--- a/frontend/gamma/js/Clipperz/DOM.js
+++ b/frontend/gamma/js/Clipperz/DOM.js
@@ -1,136 +1,134 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.DOM) == 'undefined') { Clipperz.DOM = {}; } 25if (typeof(Clipperz.DOM) == 'undefined') { Clipperz.DOM = {}; }
28 26
29Clipperz.DOM.VERSION = "0.1"; 27Clipperz.DOM.VERSION = "0.1";
30Clipperz.DOM.NAME = "Clipperz.DOM"; 28Clipperz.DOM.NAME = "Clipperz.DOM";
31 29
32MochiKit.Base.update(Clipperz.DOM, { 30MochiKit.Base.update(Clipperz.DOM, {
33 31
34 //------------------------------------------------------------------------- 32 //-------------------------------------------------------------------------
35 33
36 '__repr__': function () { 34 '__repr__': function () {
37 return "[" + this.NAME + " " + this.VERSION + "]"; 35 return "[" + this.NAME + " " + this.VERSION + "]";
38 }, 36 },
39 37
40 //------------------------------------------------------------------------- 38 //-------------------------------------------------------------------------
41 39
42 'toString': function () { 40 'toString': function () {
43 return this.__repr__(); 41 return this.__repr__();
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'selectOptionMatchingValue': function (aSelectElement, aValue, shouldUseCaseInsensitiveTest) { 46 'selectOptionMatchingValue': function (aSelectElement, aValue, shouldUseCaseInsensitiveTest) {
49 var selectedOptionIndex; 47 var selectedOptionIndex;
50 var i, c; 48 var i, c;
51 49
52 selectedOptionIndex = -1; 50 selectedOptionIndex = -1;
53 51
54 c = aSelectElement.options.length; 52 c = aSelectElement.options.length;
55 for (i=0; (i<c) && (selectedOptionIndex == -1); i++) { 53 for (i=0; (i<c) && (selectedOptionIndex == -1); i++) {
56 if (shouldUseCaseInsensitiveTest == true) { 54 if (shouldUseCaseInsensitiveTest == true) {
57 if (aSelectElement.options[i].value.toLowerCase() == aValue.toLowerCase()) { 55 if (aSelectElement.options[i].value.toLowerCase() == aValue.toLowerCase()) {
58 selectedOptionIndex = i; 56 selectedOptionIndex = i;
59 } 57 }
60 } else { 58 } else {
61 if (aSelectElement.options[i].value == aValue) { 59 if (aSelectElement.options[i].value == aValue) {
62 selectedOptionIndex = i; 60 selectedOptionIndex = i;
63 } 61 }
64 } 62 }
65 } 63 }
66 64
67 if (selectedOptionIndex != -1) { 65 if (selectedOptionIndex != -1) {
68 aSelectElement.selectedIndex = selectedOptionIndex; 66 aSelectElement.selectedIndex = selectedOptionIndex;
69 } 67 }
70 }, 68 },
71 69
72 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
73 71
74 'setFormContents': function(aNode, someValues) { 72 'setFormContents': function(aNode, someValues) {
75 var node; 73 var node;
76 var values; 74 var values;
77 var i, c; 75 var i, c;
78 76
79 values = {}; 77 values = {};
80 c = someValues[0].length; 78 c = someValues[0].length;
81 for (i=0; i<c; i++) { 79 for (i=0; i<c; i++) {
82 values[someValues[0][i]] = someValues[1][i]; 80 values[someValues[0][i]] = someValues[1][i];
83 } 81 }
84 82
85 // var m = MochiKit.Base; 83 // var m = MochiKit.Base;
86 // var self = MochiKit.DOM; 84 // var self = MochiKit.DOM;
87 if (typeof(aNode) == "undefined" || aNode === null) { 85 if (typeof(aNode) == "undefined" || aNode === null) {
88 node = MochiKit.DOM._document.body; 86 node = MochiKit.DOM._document.body;
89 } else { 87 } else {
90 node = MochiKit.DOM.getElement(aNode); 88 node = MochiKit.DOM.getElement(aNode);
91 } 89 }
92 90
93 MochiKit.Base.nodeWalk(node, function(aNode) { 91 MochiKit.Base.nodeWalk(node, function(aNode) {
94 var result; 92 var result;
95 var name; 93 var name;
96 94
97 result = null; 95 result = null;
98 name = aNode.name; 96 name = aNode.name;
99 if (MochiKit.Base.isNotEmpty(name) && (typeof(values[name]) != 'undefined')) { 97 if (MochiKit.Base.isNotEmpty(name) && (typeof(values[name]) != 'undefined')) {
100 var tagName; 98 var tagName;
101 99
102 tagName = aNode.tagName.toUpperCase(); 100 tagName = aNode.tagName.toUpperCase();
103 if (tagName === "INPUT" && (aNode.type == "radio" || aNode.type == "checkbox")) { 101 if (tagName === "INPUT" && (aNode.type == "radio" || aNode.type == "checkbox")) {
104 aNode.checked = values[name]; 102 aNode.checked = values[name];
105 } else if (tagName === "SELECT") { 103 } else if (tagName === "SELECT") {
106 if (aNode.type == "select-one") { 104 if (aNode.type == "select-one") {
107 Clipperz.DOM.selectOptionMatchingValue(aNode, values[name]); 105 Clipperz.DOM.selectOptionMatchingValue(aNode, values[name]);
108 } else { //aNode.type == "select-multiple" 106 } else { //aNode.type == "select-multiple"
109MochiKit.Logging.logWarning("### unhandled Select.type = 'select-multiple' condition"); 107 Clipperz.logWarning("### unhandled Select.type = 'select-multiple' condition");
110 } 108 }
111 } else if (tagName === "FORM" || tagName === "P" || tagName === "SPAN" || tagName === "DIV") { 109 } else if (tagName === "FORM" || tagName === "P" || tagName === "SPAN" || tagName === "DIV") {
112 result = aNode.childNodes; 110 result = aNode.childNodes;
113 } else { 111 } else {
114 aNode.value = values[name] 112 aNode.value = values[name]
115 } 113 }
116 } else { 114 } else {
117 result = aNode.childNodes; 115 result = aNode.childNodes;
118 } 116 }
119 117
120 return result; 118 return result;
121 }); 119 });
122 }, 120 },
123 121
124 //------------------------------------------------------------------------- 122 //-------------------------------------------------------------------------
125 123
126 'get': MochiKit.DOM.getElement, 124 'get': MochiKit.DOM.getElement,
127 125
128 //------------------------------------------------------------------------- 126 //-------------------------------------------------------------------------
129 127
130 'Helper': Clipperz.YUI.DomHelper, 128 'Helper': Clipperz.YUI.DomHelper,
131 129
132 //------------------------------------------------------------------------- 130 //-------------------------------------------------------------------------
133 __syntaxFix__: "syntax fix" 131 __syntaxFix__: "syntax fix"
134 132
135}); 133});
136 134
diff --git a/frontend/gamma/js/Clipperz/Date.js b/frontend/gamma/js/Clipperz/Date.js
index 020d77b..163790e 100644
--- a/frontend/gamma/js/Clipperz/Date.js
+++ b/frontend/gamma/js/Clipperz/Date.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.Date) == 'undefined') { Clipperz.Date = {}; } 25if (typeof(Clipperz.Date) == 'undefined') { Clipperz.Date = {}; }
28 26
29Clipperz.Date.VERSION = "0.1"; 27Clipperz.Date.VERSION = "0.1";
30Clipperz.Date.NAME = "Clipperz.Date"; 28Clipperz.Date.NAME = "Clipperz.Date";
31 29
32MochiKit.Base.update(Clipperz.Date, { 30MochiKit.Base.update(Clipperz.Date, {
33 31
34 //------------------------------------------------------------------------- 32 //-------------------------------------------------------------------------
35 33
36 '__repr__': function () { 34 '__repr__': function () {
37 return "[" + this.NAME + " " + this.VERSION + "]"; 35 return "[" + this.NAME + " " + this.VERSION + "]";
38 }, 36 },
39 37
40 //------------------------------------------------------------------------- 38 //-------------------------------------------------------------------------
41 39
42 'toString': function () { 40 'toString': function () {
43 return this.__repr__(); 41 return this.__repr__();
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'daysInMonth': [31,28,31,30,31,30,31,31,30,31,30,31], 46 'daysInMonth': [31,28,31,30,31,30,31,31,30,31,30,31],
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'englishOrdinalDaySuffixForDate': function(aDate) { 50 'englishOrdinalDaySuffixForDate': function(aDate) {
53 var result; 51 var result;
54 52
55 switch (aDate.getDate()) { 53 switch (aDate.getDate()) {
56 case 1: 54 case 1:
57 case 21: 55 case 21:
58 case 31: 56 case 31:
59 result = "st"; 57 result = "st";
60 break; 58 break;
61 case 2: 59 case 2:
62 case 22: 60 case 22:
63 result = "nd"; 61 result = "nd";
64 break; 62 break;
65 case 3: 63 case 3:
66 case 23: 64 case 23:
67 result = "rd"; 65 result = "rd";
68 break; 66 break;
69 default: 67 default:
70 result = "th"; 68 result = "th";
71 break; 69 break;
72 } 70 }
73 71
74 return result; 72 return result;
75 }, 73 },
76 74
77 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
78 76
79 'isLeapYear': function(aDate) { 77 'isLeapYear': function(aDate) {
80 var year; 78 var year;
81 var result; 79 var result;
82 80
83 year = aDate.getFullYear(); 81 year = aDate.getFullYear();
84 result = ((year & 0x03) == 0 && (year % 100 || (year % 400 == 0 && year))); 82 result = ((year & 0x03) == 0 && (year % 100 || (year % 400 == 0 && year)));
85 83
86 return result; 84 return result;
87 }, 85 },
88 86
89 //------------------------------------------------------------------------- 87 //-------------------------------------------------------------------------
90 88
91 'getDaysInMonth': function(aDate) { 89 'getDaysInMonth': function(aDate) {
92 var result; 90 var result;
93 91
94 if (aDate.getMonth() == 1) { 92 if (aDate.getMonth() == 1) {
95 Clipperz.Date.isLeapYear(aDate) 93 Clipperz.Date.isLeapYear(aDate)
96 result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28; 94 result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28;
97 } else { 95 } else {
98 result = Clipperz.Date.daysInMonth[aDate.getMonth()]; 96 result = Clipperz.Date.daysInMonth[aDate.getMonth()];
99 } 97 }
100 98
101 return result; 99 return result;
102 }, 100 },
103 101
104 //------------------------------------------------------------------------- 102 //-------------------------------------------------------------------------
105 103
106 'getTimezone': function(aDate) { 104 'getTimezone': function(aDate) {
107 var result; 105 var result;
108 106
109 result = aDate.toString(); 107 result = aDate.toString();
110 result = result.replace(/([A-Z]{3}) [0-9]{4}/, '$1'); 108 result = result.replace(/([A-Z]{3}) [0-9]{4}/, '$1');
111 result = result.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3"); 109 result = result.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3");
112 110
113 return result; 111 return result;
114 }, 112 },
115 113
116 'getGMTOffset': function(aDate) { 114 'getGMTOffset': function(aDate) {
117 return (aDate.getTimezoneOffset() > 0 ? "-" : "+")+ MochiKit.Format.numberFormatter('00')(Math.floor(this.getTimezoneOffset() / 60)) 115 return (aDate.getTimezoneOffset() > 0 ? "-" : "+")+ MochiKit.Format.numberFormatter('00')(Math.floor(this.getTimezoneOffset() / 60))
118 + MochiKit.Format.numberFormatter('00')(this.getTimezoneOffset() % 60); 116 + MochiKit.Format.numberFormatter('00')(this.getTimezoneOffset() % 60);
@@ -146,157 +144,154 @@ MochiKit.Base.update(Clipperz.Date, {
146 result = " + MochiKit.Format.numberFormatter('00')(aDate.getDate())"; 144 result = " + MochiKit.Format.numberFormatter('00')(aDate.getDate())";
147 break; 145 break;
148 case "D": 146 case "D":
149 result = " + aLocale['shortDays'][aDate.getDay()]"; 147 result = " + aLocale['shortDays'][aDate.getDay()]";
150 break; 148 break;
151 case "j": 149 case "j":
152 result = " + aDate.getDate()"; 150 result = " + aDate.getDate()";
153 break; 151 break;
154 case "l": 152 case "l":
155 result = " + aLocale['days'][aDate.getDay()]"; 153 result = " + aLocale['days'][aDate.getDay()]";
156 break; 154 break;
157 case "S": 155 case "S":
158 result = " + Clipperz.Date.englishOrdinalDaySuffixForDate(aDate)"; 156 result = " + Clipperz.Date.englishOrdinalDaySuffixForDate(aDate)";
159 break; 157 break;
160 case "w": 158 case "w":
161 result = " + aDate.getDay()"; 159 result = " + aDate.getDay()";
162 break; 160 break;
163 case "z": 161 case "z":
164 result = " + aDate.getDayOfYear()"; 162 result = " + aDate.getDayOfYear()";
165 break; 163 break;
166 case "W": 164 case "W":
167 result = " + aDate.getWeekOfYear()"; 165 result = " + aDate.getWeekOfYear()";
168 break; 166 break;
169 case "F": 167 case "F":
170 result = " + aLocale['months'][aDate.getMonth()]"; 168 result = " + aLocale['months'][aDate.getMonth()]";
171 break; 169 break;
172 case "m": 170 case "m":
173 result = " + MochiKit.Format.numberFormatter('00')(aDate.getMonth() + 1)"; 171 result = " + MochiKit.Format.numberFormatter('00')(aDate.getMonth() + 1)";
174 break; 172 break;
175 case "M": 173 case "M":
176 result = " + aLocale['shortMonths'][aDate.getMonth()]"; 174 result = " + aLocale['shortMonths'][aDate.getMonth()]";
177 break; 175 break;
178 case "n": 176 case "n":
179 result = " + (aDate.getMonth() + 1)"; 177 result = " + (aDate.getMonth() + 1)";
180 break; 178 break;
181 case "t": 179 case "t":
182 result = " + Clipperz.Date.getDaysInMonth(aDate)"; 180 result = " + Clipperz.Date.getDaysInMonth(aDate)";
183 break; 181 break;
184 case "L": 182 case "L":
185 result = " + (Clipperz.Date.isLeapYear(aDate) ? 1 : 0)"; 183 result = " + (Clipperz.Date.isLeapYear(aDate) ? 1 : 0)";
186 break; 184 break;
187 case "Y": 185 case "Y":
188 result = " + aDate.getFullYear()"; 186 result = " + aDate.getFullYear()";
189 break; 187 break;
190 case "y": 188 case "y":
191 result = " + ('' + aDate.getFullYear()).substring(2, 4)"; 189 result = " + ('' + aDate.getFullYear()).substring(2, 4)";
192 break; 190 break;
193 case "a": 191 case "a":
194 result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'] : aLocale['pmDesignation'])"; 192 result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'] : aLocale['pmDesignation'])";
195 break; 193 break;
196 case "A": 194 case "A":
197 result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'].toUpperCase() : aLocale['pmDesignation'].toUpperCase())"; 195 result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'].toUpperCase() : aLocale['pmDesignation'].toUpperCase())";
198 break; 196 break;
199 case "g": 197 case "g":
200 result = " + ((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)"; 198 result = " + ((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)";
201 break; 199 break;
202 case "G": 200 case "G":
203 result = " + aDate.getHours()"; 201 result = " + aDate.getHours()";
204 break; 202 break;
205 case "h": 203 case "h":
206 result = " + MochiKit.Format.numberFormatter('00')((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)"; 204 result = " + MochiKit.Format.numberFormatter('00')((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)";
207 break; 205 break;
208 case "H": 206 case "H":
209 result = " + MochiKit.Format.numberFormatter('00')(aDate.getHours())"; 207 result = " + MochiKit.Format.numberFormatter('00')(aDate.getHours())";
210 break; 208 break;
211 case "i": 209 case "i":
212 result = " + MochiKit.Format.numberFormatter('00')(aDate.getMinutes())"; 210 result = " + MochiKit.Format.numberFormatter('00')(aDate.getMinutes())";
213 break; 211 break;
214 case "s": 212 case "s":
215 result = " + MochiKit.Format.numberFormatter('00')(aDate.getSeconds())"; 213 result = " + MochiKit.Format.numberFormatter('00')(aDate.getSeconds())";
216 break; 214 break;
217 case "O": 215 case "O":
218 result = " + aDate.getGMTOffset()"; 216 result = " + aDate.getGMTOffset()";
219 break; 217 break;
220 case "T": 218 case "T":
221 result = " + Clipperz.Date.getTimezone(aDate)"; 219 result = " + Clipperz.Date.getTimezone(aDate)";
222 break; 220 break;
223 case "Z": 221 case "Z":
224 result = " + ( + aDate.getTimezoneOffset() * -60)"; 222 result = " + ( + aDate.getTimezoneOffset() * -60)";
225 break; 223 break;
226 default: 224 default:
227 result = " + '" + aCharacter + "'"; 225 result = " + '" + aCharacter + "'";
228 break; 226 break;
229 }; 227 };
230 228
231 return result; 229 return result;
232 }, 230 },
233 231
234 //========================================================================= 232 //=========================================================================
235 233
236 'formatDateWithPHPLikeTemplateAndLocale': function(aDate, aFormat, aLocale) { 234 'formatDateWithPHPLikeTemplateAndLocale': function(aDate, aFormat, aLocale) {
237 var result; 235 var result;
238 var formatterCode; 236 var formatterCode;
239 var formatter; 237 var formatter;
240 var i,c; 238 var i,c;
241 239
242//MochiKit.Logging.logDebug(">>> Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale");
243 formatterCode = "Clipperz.Date.__scratchFormatter = function(aDate, aLocale){return ''"; 240 formatterCode = "Clipperz.Date.__scratchFormatter = function(aDate, aLocale){return ''";
244 241
245 c = aFormat.length; 242 c = aFormat.length;
246 i = 0; 243 i = 0;
247 244
248 while (i<c) { 245 while (i<c) {
249 var character; 246 var character;
250 247
251 character = aFormat.charAt(i); 248 character = aFormat.charAt(i);
252 if (character == "\\") { 249 if (character == "\\") {
253 i++; 250 i++;
254 character = aFormat.charAt(i); 251 character = aFormat.charAt(i);
255 formatterCode += " + '" + character + "'" 252 formatterCode += " + '" + character + "'"
256 } else { 253 } else {
257 formatterCode += Clipperz.Date.getPHPLikeFormatCode(character); 254 formatterCode += Clipperz.Date.getPHPLikeFormatCode(character);
258 } 255 }
259 256
260 i++; 257 i++;
261 } 258 }
262 259
263 formatterCode += ";}"; 260 formatterCode += ";}";
264//MochiKit.Logging.logDebug("--- Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale - formatterCode: " + formatterCode);
265 eval(formatterCode); 261 eval(formatterCode);
266 262
267 result = Clipperz.Date.__scratchFormatter.call(this, aDate, aLocale); 263 result = Clipperz.Date.__scratchFormatter.call(this, aDate, aLocale);
268 delete Clipperz.Date.__scratchFormatter; 264 delete Clipperz.Date.__scratchFormatter;
269//MochiKit.Logging.logDebug("<<< Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale");
270 265
271 return result; 266 return result;
272 }, 267 },
273 268
274 //------------------------------------------------------------------------- 269 //-------------------------------------------------------------------------
275 270
276 'parseDateWithPHPLikeTemplateAndLocale': function(aString, aFormat, aLocale) { 271 'parseDateWithPHPLikeTemplateAndLocale': function(aString, aFormat, aLocale) {
277 return new Date(); 272 return new Date();
278 }, 273 },
279 274
280 //========================================================================= 275 //=========================================================================
281 276
282 'formatDateWithUTCFormatAndLocale': function(aDate, aLocale) { 277 'formatDateWithUTCFormatAndLocale': function(aDate, aLocale) {
283 // return Clipperz.Date.formatWithJavaLikeTemplateAndLocale(aDate, "EEE, dd MMMM yyyy HH:mm:ss zzz", aLocale); 278 // return Clipperz.Date.formatWithJavaLikeTemplateAndLocale(aDate, "EEE, dd MMMM yyyy HH:mm:ss zzz", aLocale);
284 return aDate.toString(); 279 return aDate.toString();
285 }, 280 },
286 281
287 'parseDateWithUTCFormatAndLocale': function(aValue, aLocale) { 282 'parseDateWithUTCFormatAndLocale': function(aValue, aLocale) {
288 return new Date(Date.parse(aValue)); 283 return new Date(Date.parse(aValue));
289 }, 284 },
290 285
291 //========================================================================= 286 //=========================================================================
292 287
293 'exception': { 288 'exception': {
294 // 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"), 289 // 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"),
295 // 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType") 290 // 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType")
296 }, 291 },
297 292
298 //------------------------------------------------------------------------- 293 //-------------------------------------------------------------------------
299 __syntaxFix__: "syntax fix" 294 __syntaxFix__: "syntax fix"
300 295
301}); 296});
302 297
diff --git a/frontend/gamma/js/Clipperz/KeePassExportProcessor.js b/frontend/gamma/js/Clipperz/KeePassExportProcessor.js
index a3c10c8..e35d729 100644
--- a/frontend/gamma/js/Clipperz/KeePassExportProcessor.js
+++ b/frontend/gamma/js/Clipperz/KeePassExportProcessor.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27 25
28 26
29Clipperz.KeePassExportProcessor = function(args) { 27Clipperz.KeePassExportProcessor = function(args) {
30 args = args || {}; 28 args = args || {};
31 29
32 return this; 30 return this;
33} 31}
34 32
35//============================================================================= 33//=============================================================================
36 34
37Clipperz.KeePassExportProcessor.prototype = MochiKit.Base.update(null, { 35Clipperz.KeePassExportProcessor.prototype = MochiKit.Base.update(null, {
38 36
39 //------------------------------------------------------------------------- 37 //-------------------------------------------------------------------------
40 38
41 'deferredParse_core': function(aContext) { 39 'deferredParse_core': function(aContext) {
42 var deferredResult; 40 var deferredResult;
43 41
44 if (aContext.line == "") { 42 if (aContext.line == "") {
45 deferredResult = MochiKit.Async.succeed(aContext.result); 43 deferredResult = MochiKit.Async.succeed(aContext.result);
46 } else { 44 } else {
47 var record; 45 var record;
48 46
49 record = this.parseRecord(aContext); 47 record = this.parseRecord(aContext);
50 if (record != null) { 48 if (record != null) {
51 aContext.result.push(record); 49 aContext.result.push(record);
52 } 50 }
53 51
54 aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, ""); 52 aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, "");
55 53
56 deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredParse_core"); 54 deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredParse_core");
57 deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)}); 55 deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
58 deferredResult.addCallback(MochiKit.Async.wait, 0.2); 56 deferredResult.addCallback(MochiKit.Async.wait, 0.2);
59 deferredResult.addMethod(this, 'deferredParse_core'); 57 deferredResult.addMethod(this, 'deferredParse_core');
60 deferredResult.callback(aContext); 58 deferredResult.callback(aContext);
61 } 59 }
62 60
63 return deferredResult; 61 return deferredResult;
64 }, 62 },
65 63
66 //......................................................................... 64 //.........................................................................
67 65
68 'deferredParse': function(aValue) { 66 'deferredParse': function(aValue) {
69 var deferredResult; 67 var deferredResult;
70 var lines; 68 var lines;
71 var context; 69 var context;
72 70
73 lines = aValue.replace(/\r?\n/g, "\n"); 71 lines = aValue.replace(/\r?\n/g, "\n");
74 context = { 72 context = {
75 line: lines, 73 line: lines,
76 size: lines.length, 74 size: lines.length,
77 result: [] 75 result: []
78 } 76 }
79 77
80 deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredResult"); 78 deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredResult");
81 deferredResult.addMethod(this, 'deferredParse_core'); 79 deferredResult.addMethod(this, 'deferredParse_core');
82 deferredResult.callback(context); 80 deferredResult.callback(context);
83 81
84 return deferredResult; 82 return deferredResult;
85 }, 83 },
86 84
87 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
88 86
89 'parseRecord': function(aContext) { 87 'parseRecord': function(aContext) {
90 var result; 88 var result;
91 var recordLabelRegexp; 89 var recordLabelRegexp;
92 varfieldLabelRegexp; 90 varfieldLabelRegexp;
93 var fieldValueRegexp; 91 var fieldValueRegexp;
94 var fullLineRegexp; 92 var fullLineRegexp;
95/* 93/*
96[Record name] 94[Record name]
97Group Tree: 95Group Tree:
98UserName: 96UserName:
99URL: 97URL:
100Password: 98Password:
101Notes: test 99Notes: test
102UUID: 525f62430079bae48b79ed2961924b05 100UUID: 525f62430079bae48b79ed2961924b05
103Icon: 0 101Icon: 0
104Creation Time: 2007-06-26 17:56:03 102Creation Time: 2007-06-26 17:56:03
105Last Access: 2007-10-25 16:23:51 103Last Access: 2007-10-25 16:23:51
106Last Modification: 2007-10-25 16:23:51 104Last Modification: 2007-10-25 16:23:51
107Expires: 2999-12-28 23:59:59 105Expires: 2999-12-28 23:59:59
108 106
109 [Record name] ==> Title 107 [Record name] ==> Title
110 Group: General ==> Group 108 Group: General ==> Group
111 Group Tree: ==> Group Tree 109 Group Tree: ==> Group Tree
112 UserName: ==> UserName 110 UserName: ==> UserName
113 URL: ==>URL 111 URL: ==>URL
114 Password: ==>Password 112 Password: ==>Password
115 Notes: test ==>Notes 113 Notes: test ==>Notes
116 UUID: 525f62430079bae48b79ed2961924b05 ==>UUID 114 UUID: 525f62430079bae48b79ed2961924b05 ==>UUID
117 Icon: 0 ==>Icon 115 Icon: 0 ==>Icon
118 Creation Time: 2007-06-26 17:56:03 ==>Creation Time 116 Creation Time: 2007-06-26 17:56:03 ==>Creation Time
diff --git a/frontend/gamma/js/Clipperz/KeyValueObjectStore.js b/frontend/gamma/js/Clipperz/KeyValueObjectStore.js
index 36cda88..8bc125b 100644
--- a/frontend/gamma/js/Clipperz/KeyValueObjectStore.js
+++ b/frontend/gamma/js/Clipperz/KeyValueObjectStore.js
@@ -1,173 +1,166 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.KeyValueObjectStore = function(args) { 28Clipperz.KeyValueObjectStore = function(args) {
31 args = args || {}; 29 args = args || {};
32 30
33 //this._name = args['name'] || "unnamed KeyValueObjectStore"; 31 //this._name = args['name'] || "unnamed KeyValueObjectStore";
34 this._values = args['values'] || {}; 32 this._values = args['values'] || {};
35 //this._referenceObjectStore = null; 33 //this._referenceObjectStore = null;
36//console.log("new KeyValueObjectStore", args, this._values);
37 34
38 return this; 35 return this;
39} 36}
40 37
41Clipperz.KeyValueObjectStore.prototype = MochiKit.Base.update(null, { 38Clipperz.KeyValueObjectStore.prototype = MochiKit.Base.update(null, {
42 39
43 'values': function() { 40 'values': function() {
44 return this._values; 41 return this._values;
45 }, 42 },
46 43
47 'initWithValues': function (someValues) { 44 'initWithValues': function (someValues) {
48 this._values = Clipperz.Base.deepClone(someValues) || {}; 45 this._values = Clipperz.Base.deepClone(someValues) || {};
49 return this; 46 return this;
50 }, 47 },
51 48
52 'setValues': function (someValues) { 49 'setValues': function (someValues) {
53//console.log("KeyValueObjectStore.setValues", someValues);
54 this._values = someValues; 50 this._values = someValues;
55 return this; 51 return this;
56 }, 52 },
57 53
58 //'initWithObjectStore': function (anObjectStore) { 54 //'initWithObjectStore': function (anObjectStore) {
59 // this._referenceObjectStore = anObjectStore; 55 // this._referenceObjectStore = anObjectStore;
60 //}, 56 //},
61 57
62 'removeAllData': function () { 58 'removeAllData': function () {
63 this._values = {}; 59 this._values = {};
64 }, 60 },
65 61
66 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
67 63
68 'getValue': function(aKeyPath) { 64 'getValue': function(aKeyPath) {
69 var result; 65 var result;
70 var keys; 66 var keys;
71 var i,c; 67 var i,c;
72 68
73 result = this.values(); 69 result = this.values();
74 70
75 keys = (aKeyPath + '').split('.'); 71 keys = (aKeyPath + '').split('.');
76 c = keys.length; 72 c = keys.length;
77 i = 0; 73 i = 0;
78 74
79 while ((i<c) && (result != null)) { 75 while ((i<c) && (result != null)) {
80 if (typeof result[keys[i]] != 'undefined') { 76 if (typeof result[keys[i]] != 'undefined') {
81 result = result[keys[i]]; 77 result = result[keys[i]];
82 } else { 78 } else {
83 result = null; 79 result = null;
84 } 80 }
85 81
86 i++; 82 i++;
87 } 83 }
88 84
89 return result; 85 return result;
90 }, 86 },
91 87
92 //------------------------------------------------------------------------- 88 //-------------------------------------------------------------------------
93 89
94 'setValue': function(aKeyPath, aValue) { 90 'setValue': function(aKeyPath, aValue) {
95 var targetObject; 91 var targetObject;
96 var keys; 92 var keys;
97 var i,c; 93 var i,c;
98 94
99//console.log(">>> KeyValueObjectStore.setValue", this, this.values(), aKeyPath, aValue);
100 targetObject = this.values(); 95 targetObject = this.values();
101 keys = (aKeyPath + '').split('.'); 96 keys = (aKeyPath + '').split('.');
102 c = keys.length - 1; 97 c = keys.length - 1;
103 for (i=0; i<c; i++) { 98 for (i=0; i<c; i++) {
104//console.log("--- KeyValueObjectStore.setValue", i, targetObject, keys[i]);
105 if (typeof targetObject[keys[i]] == 'undefined') { 99 if (typeof targetObject[keys[i]] == 'undefined') {
106 targetObject[keys[i]] = {} 100 targetObject[keys[i]] = {}
107 } 101 }
108 102
109 targetObject = targetObject[keys[i]]; 103 targetObject = targetObject[keys[i]];
110 } 104 }
111 105
112 targetObject[keys[c]] = aValue; 106 targetObject[keys[c]] = aValue;
113//console.log("<<< KeyValueObjectStore.setValue");
114 107
115 return aValue; 108 return aValue;
116 }, 109 },
117 110
118 //------------------------------------------------------------------------- 111 //-------------------------------------------------------------------------
119 112
120 'removeValue': function (aKeyPath) { 113 'removeValue': function (aKeyPath) {
121 // this.setValue(aKeyPath, null); 114 // this.setValue(aKeyPath, null);
122 115
123 var targetObject; 116 var targetObject;
124 var keys; 117 var keys;
125 var i,c; 118 var i,c;
126 119
127 targetObject = this.values(); 120 targetObject = this.values();
128 keys = ('' + aKeyPath).split('.'); 121 keys = ('' + aKeyPath).split('.');
129 c = keys.length - 1; 122 c = keys.length - 1;
130 for (i=0; i<c; i++) { 123 for (i=0; i<c; i++) {
131 if (typeof targetObject[keys[i]] == 'undefined') { 124 if (typeof targetObject[keys[i]] == 'undefined') {
132 targetObject[keys[i]] = {} 125 targetObject[keys[i]] = {}
133 } 126 }
134 127
135 targetObject = targetObject[keys[i]]; 128 targetObject = targetObject[keys[i]];
136 } 129 }
137 130
138 delete targetObject[keys[c]]; 131 delete targetObject[keys[c]];
139 }, 132 },
140 133
141 //------------------------------------------------------------------------- 134 //-------------------------------------------------------------------------
142 135
143 'deferredGetOrSet': function(aKeyPath, aGetterFunction) { 136 'deferredGetOrSet': function(aKeyPath, aGetterFunction) {
144 var deferredResult; 137 var deferredResult;
145 138
146 if (this.getValue(aKeyPath) != null) { 139 if (this.getValue(aKeyPath) != null) {
147 deferredResult = MochiKit.Async.succeed(this.getValue(aKeyPath)); 140 deferredResult = MochiKit.Async.succeed(this.getValue(aKeyPath));
148 } else { 141 } else {
149 deferredResult = new Clipperz.Async.Deferred("KeyValueObjectStore.deferredGetOrSet [" + aKeyPath + "]", {trace:false}); 142 deferredResult = new Clipperz.Async.Deferred("KeyValueObjectStore.deferredGetOrSet [" + aKeyPath + "]", {trace:false});
150 143
151 deferredResult.addCallback(aGetterFunction); 144 deferredResult.addCallback(aGetterFunction);
152 deferredResult.addMethod(this, 'setValue', aKeyPath); 145 deferredResult.addMethod(this, 'setValue', aKeyPath);
153 deferredResult.callback(); 146 deferredResult.callback();
154 } 147 }
155 148
156 return deferredResult; 149 return deferredResult;
157 }, 150 },
158 151
159 //------------------------------------------------------------------------- 152 //-------------------------------------------------------------------------
160 153
161 'isEmpty': function () { 154 'isEmpty': function () {
162 return (MochiKit.Base.keys(this.values()).length == 0) 155 return (MochiKit.Base.keys(this.values()).length == 0)
163 }, 156 },
164 157
165 //------------------------------------------------------------------------- 158 //-------------------------------------------------------------------------
166/* 159/*
167 'dumpData': function () { 160 'dumpData': function () {
168 return Clipperz.Base.serializeJSON(this.values()); 161 return Clipperz.Base.serializeJSON(this.values());
169 }, 162 },
170*/ 163*/
171 //------------------------------------------------------------------------- 164 //-------------------------------------------------------------------------
172 __syntaxFix__: "syntax fix" 165 __syntaxFix__: "syntax fix"
173}); 166});
diff --git a/frontend/gamma/js/Clipperz/Logging.js b/frontend/gamma/js/Clipperz/Logging.js
index 77a0896..b6b806a 100644
--- a/frontend/gamma/js/Clipperz/Logging.js
+++ b/frontend/gamma/js/Clipperz/Logging.js
@@ -1,39 +1,32 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz'); 24Clipperz.Base.module('Clipperz');
27 25
28if (typeof console == 'undefined') { 26Clipperz.log = function () {
29 Clipperz.log = MochiKit.Logging.logDebug; 27 console.log.apply(console, arguments);
30// Safari/WebKit 4 28}
31} else if (navigator.userAgent.match(/WebKit/)) { 29
32 //Clipperz.log = console.log; 30 Clipperz.logError= Clipperz.log;
33 Clipperz.log = MochiKit.Logging.logDebug; 31 Clipperz.logWarning= Clipperz.log;
34} else if (navigator.userAgent.match(/Gecko/)) { 32 Clipperz.logDebug= Clipperz.log; \ No newline at end of file
35 Clipperz.log = function () {
36 // firebug 1.3 bug see http://code.google.com/p/fbug/issues/detail?id=1347
37 console.log.apply(window._firebug, arguments);
38 };
39} \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js b/frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js
index 897beed..4818b76 100644
--- a/frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js
+++ b/frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26/* 24/*
27if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 25if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
28if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 26if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
29 27
30Clipperz.PM.BookmarkletProcessor = function(aConfiguration) { 28Clipperz.PM.BookmarkletProcessor = function(aConfiguration) {
31 this._configuration = aConfiguration; 29 this._configuration = aConfiguration;
32 30
33 this._editableFields = null; 31 this._editableFields = null;
34 this._favicon = null; 32 this._favicon = null;
35 33
36 return this; 34 return this;
37} 35}
38 36
39Clipperz.PM.BookmarkletProcessor.prototype = MochiKit.Base.update(null, { 37Clipperz.PM.BookmarkletProcessor.prototype = MochiKit.Base.update(null, {
40 38
41 'toString': function() { 39 'toString': function() {
42 return "Clipperz.PM.BookmarkletProcessor"; 40 return "Clipperz.PM.BookmarkletProcessor";
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'configuration': function() { 45 'configuration': function() {
48 return this._configuration; 46 return this._configuration;
49 }, 47 },
50 48
51 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
52 50
53 'pageTitle': function() { 51 'pageTitle': function() {
54 return this.configuration().page.title; 52 return this.configuration().page.title;
55 }, 53 },
56 54
57 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
58 56
59 'fields': function() { 57 'fields': function() {
60 return this.configuration().form.inputs; 58 return this.configuration().form.inputs;
61 }, 59 },
62 60
63 //------------------------------------------------------------------------- 61 //-------------------------------------------------------------------------
64 62
65 'editableFields': function() { 63 'editableFields': function() {
66 if (this._editableFields == null) { 64 if (this._editableFields == null) {
67 this._editableFields = MochiKit.Base.filter(function(aField) { 65 this._editableFields = MochiKit.Base.filter(function(aField) {
68 var result; 66 var result;
69 var type; 67 var type;
70 68
71 type = aField['type'].toLowerCase(); 69 type = aField['type'].toLowerCase();
72 result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select')); 70 result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select'));
73 71
74 return result; 72 return result;
75 }, this.fields()) 73 }, this.fields())
76 } 74 }
77 75
78 return this._editableFields; 76 return this._editableFields;
79 }, 77 },
80 78
81 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
82 80
83 'hostname': function() { 81 'hostname': function() {
84 if (this._hostname == null) { 82 if (this._hostname == null) {
85 var actionUrl; 83 var actionUrl;
86 84
87 actionUrl = this.configuration()['form']['attributes']['action']; 85 actionUrl = this.configuration()['form']['attributes']['action'];
88 this._hostname = actionUrl.replace(/ ^ h t t p s ? : \ / \ / ( [ ^ \ / ] * ) \ / . * /, '$1'); 86 this._hostname = actionUrl.replace(/ ^ h t t p s ? : \ / \ / ( [ ^ \ / ] * ) \ / . * /, '$1');
89 } 87 }
90 88
91 return this._hostname; 89 return this._hostname;
92 }, 90 },
93 91
94 'favicon': function() { 92 'favicon': function() {
95 if (this._favicon == null) { 93 if (this._favicon == null) {
96 this._favicon = "http://" + this.hostname() + "/favicon.ico"; 94 this._favicon = "http://" + this.hostname() + "/favicon.ico";
97 } 95 }
98 96
99 return this._favicon; 97 return this._favicon;
100 }, 98 },
101 99
102 //------------------------------------------------------------------------- 100 //-------------------------------------------------------------------------
103 __syntaxFix__: "syntax fix" 101 __syntaxFix__: "syntax fix"
104}); 102});
105 103
106//############################################################################# 104//#############################################################################
107/ * 105/ *
108Clipperz.PM.BookmarkletProcessor.createRecordFromBookmarkletConfiguration = function(anUser, aConfiguration) { 106Clipperz.PM.BookmarkletProcessor.createRecordFromBookmarkletConfiguration = function(anUser, aConfiguration) {
109 var processor; 107 var processor;
110 var record; 108 var record;
111 var recordVersion; 109 var recordVersion;
112 var directLogin; 110 var directLogin;
113 var bindings; 111 var bindings;
114 var i,c; 112 var i,c;
115 113
116 processor = new Clipperz.PM.BookmarkletProcessor(aConfiguration); 114 processor = new Clipperz.PM.BookmarkletProcessor(aConfiguration);
117 115
118 record = new Clipperz.PM.DataModel.Record({ 116 record = new Clipperz.PM.DataModel.Record({
diff --git a/frontend/gamma/js/Clipperz/PM/Connection.js b/frontend/gamma/js/Clipperz/PM/Connection.js
index a05a310..6a8f15e 100644
--- a/frontend/gamma/js/Clipperz/PM/Connection.js
+++ b/frontend/gamma/js/Clipperz/PM/Connection.js
@@ -1,603 +1,600 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28 26
29//----------------------------------------------------------------------------- 27//-----------------------------------------------------------------------------
30// 28//
31 // Abstract C O N N E C T I O N class 29 // Abstract C O N N E C T I O N class
32// 30//
33//----------------------------------------------------------------------------- 31//-----------------------------------------------------------------------------
34 32
35Clipperz.PM.Connection = function (args) { 33Clipperz.PM.Connection = function (args) {
36 args = args || {}; 34 args = args || {};
37 35
38 this._proxy = args.proxy || Clipperz.PM.Proxy.defaultProxy; 36 this._proxy = args.proxy || Clipperz.PM.Proxy.defaultProxy;
39 this._getCredentialsFunction = args.getCredentialsFunction; 37 this._getCredentialsFunction = args.getCredentialsFunction;
40 38
41 this._clipperz_pm_crypto_version = null; 39 this._clipperz_pm_crypto_version = null;
42 this._connectionId = null; 40 this._connectionId = null;
43 this._sharedSecret = null; 41 this._sharedSecret = null;
44 this._serverLockValue = null; 42 this._serverLockValue = null;
45 43
46 return this; 44 return this;
47} 45}
48 46
49Clipperz.PM.Connection.prototype = MochiKit.Base.update(null, { 47Clipperz.PM.Connection.prototype = MochiKit.Base.update(null, {
50 48
51 'toString': function() { 49 'toString': function() {
52 return "Connection [" + this.version() + "]"; 50 return "Connection [" + this.version() + "]";
53 }, 51 },
54 52
55 //========================================================================= 53 //=========================================================================
56 54
57 'version': function() { 55 'version': function() {
58 throw Clipperz.Base.exception.AbstractMethod; 56 throw Clipperz.Base.exception.AbstractMethod;
59 }, 57 },
60 58
61 'clipperz_pm_crypto_version': function() { 59 'clipperz_pm_crypto_version': function() {
62 if (this._clipperz_pm_crypto_version == null) { 60 if (this._clipperz_pm_crypto_version == null) {
63 var connectionVersions; 61 var connectionVersions;
64 varversions; 62 varversions;
65 varversion; 63 varversion;
66 var i, c; 64 var i, c;
67 65
68 version = null; 66 version = null;
69 connectionVersions = Clipperz.PM.Connection.communicationProtocol.versions; 67 connectionVersions = Clipperz.PM.Connection.communicationProtocol.versions;
70 versions = MochiKit.Base.keys(connectionVersions); 68 versions = MochiKit.Base.keys(connectionVersions);
71 c = versions.length; 69 c = versions.length;
72 for (i=0; i<c; i++) { 70 for (i=0; i<c; i++) {
73 if (! (versions[i] == 'current')) { 71 if (! (versions[i] == 'current')) {
74 if (this instanceof connectionVersions[versions[i]]) { 72 if (this instanceof connectionVersions[versions[i]]) {
75 version = versions[i]; 73 version = versions[i];
76 }; 74 };
77 } 75 }
78 } 76 }
79 77
80 this._clipperz_pm_crypto_version = version; 78 this._clipperz_pm_crypto_version = version;
81 } 79 }
82 80
83 return this._clipperz_pm_crypto_version; 81 return this._clipperz_pm_crypto_version;
84 }, 82 },
85 83
86 //------------------------------------------------------------------------- 84 //-------------------------------------------------------------------------
87 85
88 'defaultErrorHandler': function(anErrorString, anException) { 86 'defaultErrorHandler': function(anErrorString, anException) {
89MochiKit.Logging.logError("### Connection.defaultErrorHandler: " + anErrorString + " (" + anException + ")"); 87 // Clipperz.logError("### Connection.defaultErrorHandler: " + anErrorString, anException);
88 Clipperz.logError("### Connection.defaultErrorHandler: " + anErrorString + " (" + anException + ")");
90 }, 89 },
91 90
92 //------------------------------------------------------------------------- 91 //-------------------------------------------------------------------------
93 92
94 'getCredentialsFunction': function () { 93 'getCredentialsFunction': function () {
95 return this._getCredentialsFunction; 94 return this._getCredentialsFunction;
96 }, 95 },
97 96
98 'normalizedCredentials': function(someValues) { 97 'normalizedCredentials': function(someValues) {
99 throw Clipperz.Base.exception.AbstractMethod; 98 throw Clipperz.Base.exception.AbstractMethod;
100 }, 99 },
101 100
102 //========================================================================= 101 //=========================================================================
103 102
104 'proxy': function () { 103 'proxy': function () {
105 return this._proxy; 104 return this._proxy;
106 }, 105 },
107 106
108 //========================================================================= 107 //=========================================================================
109 108
110 'register': function () { 109 'register': function () {
111 throw Clipperz.Base.exception.AbstractMethod; 110 throw Clipperz.Base.exception.AbstractMethod;
112 }, 111 },
113 112
114 'login': function() { 113 'login': function() {
115 throw Clipperz.Base.exception.AbstractMethod; 114 throw Clipperz.Base.exception.AbstractMethod;
116 }, 115 },
117 116
118 //------------------------------------------------------------------------- 117 //-------------------------------------------------------------------------
119 118
120 'message': function(someArguments, aCallback) { 119 'message': function(someArguments, aCallback) {
121 throw Clipperz.Base.exception.AbstractMethod; 120 throw Clipperz.Base.exception.AbstractMethod;
122 }, 121 },
123 122
124 //------------------------------------------------------------------------- 123 //-------------------------------------------------------------------------
125 124
126 'serverSideUserCredentials': function() { 125 'serverSideUserCredentials': function() {
127 throw Clipperz.Base.exception.AbstractMethod; 126 throw Clipperz.Base.exception.AbstractMethod;
128 }, 127 },
129 128
130 //========================================================================= 129 //=========================================================================
131 130
132 'sharedSecret': function () { 131 'sharedSecret': function () {
133 return this._sharedSecret; 132 return this._sharedSecret;
134 }, 133 },
135 134
136 'setSharedSecret': function (aValue) { 135 'setSharedSecret': function (aValue) {
137 this._sharedSecret = aValue; 136 this._sharedSecret = aValue;
138 }, 137 },
139 138
140 //------------------------------------------------------------------------- 139 //-------------------------------------------------------------------------
141 140
142 'connectionId': function() { 141 'connectionId': function() {
143 return this._connectionId; 142 return this._connectionId;
144 }, 143 },
145 144
146 'setConnectionId': function(aValue) { 145 'setConnectionId': function(aValue) {
147 this._connectionId = aValue; 146 this._connectionId = aValue;
148 }, 147 },
149 148
150 //------------------------------------------------------------------------- 149 //-------------------------------------------------------------------------
151 150
152 'serverLockValue': function () { 151 'serverLockValue': function () {
153 return this._serverLockValue; 152 return this._serverLockValue;
154 }, 153 },
155 154
156 'setServerLockValue': function (aValue) { 155 'setServerLockValue': function (aValue) {
157 this._serverLockValue = aValue; 156 this._serverLockValue = aValue;
158 }, 157 },
159 158
160 //========================================================================= 159 //=========================================================================
161/* 160/*
162 //TODO: ????? 161 //TODO: ?????
163 'oneTimePassword': function() { 162 'oneTimePassword': function() {
164 return this._oneTimePassword; 163 return this._oneTimePassword;
165 }, 164 },
166 165
167 'setOneTimePassword': function(aValue) { 166 'setOneTimePassword': function(aValue) {
168 this._oneTimePassword = aValue; 167 this._oneTimePassword = aValue;
169 }, 168 },
170*/ 169*/
171 //========================================================================= 170 //=========================================================================
172 171
173 'reset': function() { 172 'reset': function() {
174 this.setSharedSecret(null); 173 this.setSharedSecret(null);
175 this.setConnectionId(null); 174 this.setConnectionId(null);
176 }, 175 },
177 176
178 //========================================================================= 177 //=========================================================================
179 __syntaxFix__: "syntax fix" 178 __syntaxFix__: "syntax fix"
180 179
181} 180}
182); 181);
183 182
184 183
185if (typeof(Clipperz.PM.Connection.SRP) == 'undefined') { Clipperz.PM.Connection.SRP = {}; } 184if (typeof(Clipperz.PM.Connection.SRP) == 'undefined') { Clipperz.PM.Connection.SRP = {}; }
186//----------------------------------------------------------------------------- 185//-----------------------------------------------------------------------------
187// 186//
188 // S R P [ 1 . 0 ] C O N N E C T I O N class 187 // S R P [ 1 . 0 ] C O N N E C T I O N class
189// 188//
190//----------------------------------------------------------------------------- 189//-----------------------------------------------------------------------------
191 190
192Clipperz.PM.Connection.SRP['1.0'] = function (args) { 191Clipperz.PM.Connection.SRP['1.0'] = function (args) {
193 Clipperz.PM.Connection.call(this, args); 192 Clipperz.PM.Connection.call(this, args);
194 193
195 return this; 194 return this;
196} 195}
197 196
198Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection(), { 197Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection(), {
199 198
200 'version': function() { 199 'version': function() {
201 return '1.0'; 200 return '1.0';
202 }, 201 },
203 202
204 //========================================================================= 203 //=========================================================================
205 204
206 'register': function (someUserData) { 205 'register': function (someUserData) {
207 vardeferredResult; 206 vardeferredResult;
208 var cryptoVersion; 207 var cryptoVersion;
209 var srpConnection; 208 var srpConnection;
210 209
211 cryptoVersion = this.clipperz_pm_crypto_version(); 210 cryptoVersion = this.clipperz_pm_crypto_version();
212 211
213 deferredResult = new Clipperz.Async.Deferred("Connection.registerWithVersion", {trace:false}); 212 deferredResult = new Clipperz.Async.Deferred("Connection.registerWithVersion", {trace:false});
214 deferredResult.collectResults({ 213 deferredResult.collectResults({
215 'credentials': [ 214 'credentials': [
216 this.getCredentialsFunction(), 215 this.getCredentialsFunction(),
217 MochiKit.Base.method(this, 'normalizedCredentials'), 216 MochiKit.Base.method(this, 'normalizedCredentials'),
218 MochiKit.Base.bind(function(someCredentials) { 217 MochiKit.Base.bind(function(someCredentials) {
219 var srpConnection; 218 var srpConnection;
220 var result; 219 var result;
221 220
222 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() }); 221 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
223 result = srpConnection.serverSideCredentials(); 222 result = srpConnection.serverSideCredentials();
224 result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion; 223 result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion;
225 224
226 return result; 225 return result;
227 }, this) 226 }, this)
228 ], 227 ],
229 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData), 228 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData),
230 'version':MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Connection.communicationProtocol.currentVersion), 229 'version':MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Connection.communicationProtocol.currentVersion),
231 'message':MochiKit.Base.partial(MochiKit.Async.succeed, 'completeRegistration') 230 'message':MochiKit.Base.partial(MochiKit.Async.succeed, 'completeRegistration')
232 }); 231 });
233 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 232 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
234 deferredResult.addMethod(this.proxy(), 'registration'); 233 deferredResult.addMethod(this.proxy(), 'registration');
235 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 234 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
236 235
237 deferredResult.callback(); 236 deferredResult.callback();
238 237
239 return deferredResult; 238 return deferredResult;
240 }, 239 },
241 240
242 //------------------------------------------------------------------------- 241 //-------------------------------------------------------------------------
243 242
244 'updateCredentials': function (aUsername, aPassphrase, someUserData) { 243 'updateCredentials': function (aUsername, aPassphrase, someUserData) {
245 vardeferredResult; 244 vardeferredResult;
246 245
247 deferredResult = new Clipperz.Async.Deferred("Connection.updateCredentials", {trace:false}); 246 deferredResult = new Clipperz.Async.Deferred("Connection.updateCredentials", {trace:false});
248 deferredResult.collectResults({ 247 deferredResult.collectResults({
249 'credentials': [ 248 'credentials': [
250 MochiKit.Base.method(this, 'normalizedCredentials', {username:aUsername, password:aPassphrase}), 249 MochiKit.Base.method(this, 'normalizedCredentials', {username:aUsername, password:aPassphrase}),
251 MochiKit.Base.bind(function(someCredentials) { 250 MochiKit.Base.bind(function(someCredentials) {
252 var srpConnection; 251 var srpConnection;
253 var result; 252 var result;
254 253
255 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() }); 254 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
256 result = srpConnection.serverSideCredentials(); 255 result = srpConnection.serverSideCredentials();
257 result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion; 256 result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion;
258 257
259 return result; 258 return result;
260 }, this) 259 }, this)
261 ], 260 ],
262 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData) 261 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData)
263 }); 262 });
264 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 263 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
265 deferredResult.addMethod(this, 'message', 'upgradeUserCredentials'); 264 deferredResult.addMethod(this, 'message', 'upgradeUserCredentials');
266 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 265 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
267 deferredResult.callback(); 266 deferredResult.callback();
268 267
269 return deferredResult; 268 return deferredResult;
270 269
271 }, 270 },
272 271
273 //========================================================================= 272 //=========================================================================
274 273
275 'redeemOneTimePassword': function (someParameters) { 274 'redeemOneTimePassword': function (someParameters) {
276//console.log("Connections.redeemOneTimePassword", someParameters['username'], someParameters['password']);
277/* 275/*
278 //========================================================================= 276 //=========================================================================
279 //LOGIN WITH PASSPHRASE, extracted from the TRUNK version (LoginPanel.js) 277 //LOGIN WITH PASSPHRASE, extracted from the TRUNK version (LoginPanel.js)
280 deferredResult.addCallback(function(anUsername, aOneTimePassword) { 278 deferredResult.addCallback(function(anUsername, aOneTimePassword) {
281 var args; 279 var args;
282 280
283 args = { 281 args = {
284 'message': 'oneTimePassword', 282 'message': 'oneTimePassword',
285 'version': Clipperz.PM.Crypto.communicationProtocol.currentVersion, 283 'version': Clipperz.PM.Crypto.communicationProtocol.currentVersion,
286 'parameters': { 284 'parameters': {
287 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(anUsername, aOneTimePassword), 285 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(anUsername, aOneTimePassword),
288 'oneTimePasswordKeyChecksum': Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(anUsername, aOneTimePassword) 286 'oneTimePasswordKeyChecksum': Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(anUsername, aOneTimePassword)
289 } 287 }
290 } 288 }
291 289
292 return args; 290 return args;
293 }, anUsername, oneTimePassword); 291 }, anUsername, oneTimePassword);
294 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_loadingOTP'); 292 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_loadingOTP');
295 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake')); 293 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake'));
296 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_extractingPassphrase'); 294 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_extractingPassphrase');
297 deferredResult.addCallback(function(aResult) { 295 deferredResult.addCallback(function(aResult) {
298 return Clipperz.PM.Crypto.deferredDecrypt(oneTimePassword, aResult['data'], aResult['version']); 296 return Clipperz.PM.Crypto.deferredDecrypt(oneTimePassword, aResult['data'], aResult['version']);
299 }); 297 });
300 deferredResult.addCallback(function(aResult) { 298 deferredResult.addCallback(function(aResult) {
301 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString(); 299 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString();
302 }); 300 });
303 deferredResult.addMethod(this, 'doLoginWithUsernameAndPassphrase', anUsername), 301 deferredResult.addMethod(this, 'doLoginWithUsernameAndPassphrase', anUsername),
304*/ 302*/
305 var args; 303 var args;
306 var normalizedOTP; 304 var normalizedOTP;
307 305
308 normalizedOTP = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(someParameters['password']); 306 normalizedOTP = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(someParameters['password']);
309 307
310 args = { 308 args = {
311 'message': 'oneTimePassword', 309 'message': 'oneTimePassword',
312 'version': Clipperz.PM.Connection.communicationProtocol.currentVersion, 310 'version': Clipperz.PM.Connection.communicationProtocol.currentVersion,
313 'parameters': { 311 'parameters': {
314 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(someParameters['username'], normalizedOTP), 312 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(someParameters['username'], normalizedOTP),
315 'oneTimePasswordKeyChecksum':Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(someParameters['username'], normalizedOTP) 313 'oneTimePasswordKeyChecksum':Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(someParameters['username'], normalizedOTP)
316 } 314 }
317 } 315 }
318 316
319 return Clipperz.Async.callbacks("Connction.redeemOTP", [ 317 return Clipperz.Async.callbacks("Connction.redeemOTP", [
320 MochiKit.Base.method(this.proxy(), 'handshake', args), 318 MochiKit.Base.method(this.proxy(), 'handshake', args),
321 function(aResult) { 319 function(aResult) {
322 return Clipperz.PM.Crypto.deferredDecrypt({ 320 return Clipperz.PM.Crypto.deferredDecrypt({
323 value:aResult['data'], 321 value:aResult['data'],
324 key:normalizedOTP, 322 key:normalizedOTP,
325 version:aResult['version'] 323 version:aResult['version']
326 }); 324 });
327 }, 325 },
328 function(aResult) { 326 function(aResult) {
329 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString(); 327 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString();
330 } 328 }
331 ], {trace:false}) 329 ], {trace:false})
332 }, 330 },
333 331
334 'login': function(isReconnecting) { 332 'login': function(isReconnecting) {
335 vardeferredResult; 333 vardeferredResult;
336 var cryptoVersion; 334 var cryptoVersion;
337 var srpConnection; 335 var srpConnection;
338 336
339 cryptoVersion = this.clipperz_pm_crypto_version(); 337 cryptoVersion = this.clipperz_pm_crypto_version();
340 deferredResult = new Clipperz.Async.Deferred("Connection.login", {trace:false}); 338 deferredResult = new Clipperz.Async.Deferred("Connection.login", {trace:false});
341 deferredResult.addCallback(this.getCredentialsFunction()); 339 deferredResult.addCallback(this.getCredentialsFunction());
342 deferredResult.addMethod(this, 'normalizedCredentials'); 340 deferredResult.addMethod(this, 'normalizedCredentials');
343 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_sendingCredentials'); 341 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_sendingCredentials');
344 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 342 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
345 deferredResult.addCallback(MochiKit.Base.bind(function(someCredentials) { 343 deferredResult.addCallback(MochiKit.Base.bind(function(someCredentials) {
346 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() }); 344 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
347 }, this)); 345 }, this));
348 deferredResult.addCallback(function() { 346 deferredResult.addCallback(function() {
349 var result; 347 var result;
350 348
351 result = { 349 result = {
352 message: 'connect', 350 message: 'connect',
353 version: cryptoVersion, 351 version: cryptoVersion,
354 parameters: { 352 parameters: {
355 C: srpConnection.C(), 353 C: srpConnection.C(),
356 A: srpConnection.A().asString(16) 354 A: srpConnection.A().asString(16)
357 // reconnecting: this.connectionId() 355 // reconnecting: this.connectionId()
358 } 356 }
359 }; 357 };
360 358
361 // TODO: ????? 359 // TODO: ?????
362 // if (isReconnecting == true) { 360 // if (isReconnecting == true) {
363 // args.parameters['reconnecting'] = aConnection.connectionId(); 361 // args.parameters['reconnecting'] = aConnection.connectionId();
364 // } 362 // }
365 363
366 return result; 364 return result;
367 }); 365 });
368 deferredResult.addMethod(this.proxy(), 'handshake'); 366 deferredResult.addMethod(this.proxy(), 'handshake');
369 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_credentialVerification'); 367 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_credentialVerification');
370 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 368 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
371 deferredResult.addCallback(function(someParameters) { 369 deferredResult.addCallback(function(someParameters) {
372 var result; 370 var result;
373 371
374 srpConnection.set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16)); 372 srpConnection.set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16));
375 srpConnection.set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16)); 373 srpConnection.set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16));
376 374
377 //TODO: ????? 375 //TODO: ?????
378 // if (typeof(someParameters['oneTimePassword']) != 'undefined') { 376 // if (typeof(someParameters['oneTimePassword']) != 'undefined') {
379 // this.setOneTimePassword(someParameters['oneTimePassword']); 377 // this.setOneTimePassword(someParameters['oneTimePassword']);
380 // } 378 // }
381 379
382 result = { 380 result = {
383 message: 'credentialCheck', 381 message: 'credentialCheck',
384 version: cryptoVersion, 382 version: cryptoVersion,
385 parameters: { 383 parameters: {
386 M1: srpConnection.M1() 384 M1: srpConnection.M1()
387 } 385 }
388 }; 386 };
389 387
390 return result; 388 return result;
391 }); 389 });
392 deferredResult.addMethod(this.proxy(), 'handshake'); 390 deferredResult.addMethod(this.proxy(), 'handshake');
393 deferredResult.addCallback(function(someParameters) { 391 deferredResult.addCallback(function(someParameters) {
394 var result; 392 var result;
395 393
396 if (someParameters['M2'] == srpConnection.M2()) { 394 if (someParameters['M2'] == srpConnection.M2()) {
397 result = MochiKit.Async.succeed(someParameters); 395 result = MochiKit.Async.succeed(someParameters);
398 } else { 396 } else {
399 result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum); 397 result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum);
400 } 398 }
401 399
402 return result; 400 return result;
403 }); 401 });
404 deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) { 402 deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) {
405 this.setConnectionId(someParameters['connectionId']); 403 this.setConnectionId(someParameters['connectionId']);
406 this.setSharedSecret(srpConnection.K()); 404 this.setSharedSecret(srpConnection.K());
407 405
408 // TODO: ????? 406 // TODO: ?????
409 // if (this.oneTimePassword() != null) { 407 // if (this.oneTimePassword() != null) {
410 /// ?? result = this.user().oneTimePasswordManager().archiveOneTimePassword(this.oneTimePassword())); 408 /// ?? result = this.user().oneTimePasswordManager().archiveOneTimePassword(this.oneTimePassword()));
411 // } 409 // }
412 410
413 if ((isReconnecting == true) && (this.serverLockValue() != someParameters['lock'])) { 411 if ((isReconnecting == true) && (this.serverLockValue() != someParameters['lock'])) {
414 throw Clipperz.PM.Connection.exception.StaleData; 412 throw Clipperz.PM.Connection.exception.StaleData;
415 } else { 413 } else {
416 this.setServerLockValue(someParameters['lock']); 414 this.setServerLockValue(someParameters['lock']);
417 } 415 }
418 416
419 return someParameters; 417 return someParameters;
420 }, this)); 418 }, this));
421 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_loggedIn'); 419 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_loggedIn');
422 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress'); 420 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
423 deferredResult.addCallback(MochiKit.Async.succeed, {result:"done"}); 421 deferredResult.addCallback(MochiKit.Async.succeed, {result:"done"});
424 422
425 deferredResult.callback(); 423 deferredResult.callback();
426 424
427 return deferredResult; 425 return deferredResult;
428 }, 426 },
429 427
430 //========================================================================= 428 //=========================================================================
431 429
432 'logout': function() { 430 'logout': function() {
433 return Clipperz.Async.callbacks("Connection.logout", [ 431 return Clipperz.Async.callbacks("Connection.logout", [
434 MochiKit.Base.method(this, 'setSharedSecret'), 432 MochiKit.Base.method(this, 'setSharedSecret'),
435 MochiKit.Base.method(this.proxy(), 'logout', {}) 433 MochiKit.Base.method(this.proxy(), 'logout', {})
436 ], {trace:false}); 434 ], {trace:false});
437 }, 435 },
438 436
439 //========================================================================= 437 //=========================================================================
440 438
441 'ping': function () { 439 'ping': function () {
442 //TODO: ping the server in order to have a valid session 440 //TODO: ping the server in order to have a valid session
443 }, 441 },
444 442
445 //========================================================================= 443 //=========================================================================
446 444
447 'message': function(aMessageName, someParameters) { 445 'message': function(aMessageName, someParameters) {
448 var args; 446 var args;
449 var parameters; 447 var parameters;
450 448
451 parameters = someParameters || {}; 449 parameters = someParameters || {};
452 if (typeof(parameters['user']) != 'undefined') { 450 if (typeof(parameters['user']) != 'undefined') {
453 parameters['user']['lock'] = this.serverLockValue(); 451 parameters['user']['lock'] = this.serverLockValue();
454 } 452 }
455 453
456//console.log(">>> Connection.message", aMessageName, someParameters);
457 args = { 454 args = {
458 message: aMessageName, 455 message: aMessageName,
459 srpSharedSecret: this.sharedSecret(), 456 srpSharedSecret: this.sharedSecret(),
460 // parameters: (someParameters || {}) 457 // parameters: (someParameters || {})
461 parameters: parameters 458 parameters: parameters
462 } 459 }
463 460
464 return this.sendMessage(args); 461 return this.sendMessage(args);
465 }, 462 },
466 463
467 //------------------------------------------------------------------------- 464 //-------------------------------------------------------------------------
468 465
469 'sendMessage': function(someArguments) { 466 'sendMessage': function(someArguments) {
470 vardeferredResult; 467 vardeferredResult;
471 468
472 deferredResult = new Clipperz.Async.Deferred("Connection.sendMessage", {trace:false}); 469 deferredResult = new Clipperz.Async.Deferred("Connection.sendMessage", {trace:false});
473 deferredResult.addMethod(this.proxy(), 'message', someArguments); 470 deferredResult.addMethod(this.proxy(), 'message', someArguments);
474 deferredResult.addCallback(MochiKit.Base.bind(function(res) { 471 deferredResult.addCallback(MochiKit.Base.bind(function(res) {
475 if (typeof(res['lock']) != 'undefined') { 472 if (typeof(res['lock']) != 'undefined') {
476 this.setServerLockValue(res['lock']); 473 this.setServerLockValue(res['lock']);
477 } 474 }
478 return res; 475 return res;
479 }, this)); 476 }, this));
480 477
481 deferredResult.addErrback(MochiKit.Base.method(this, 'messageExceptionHandler'), someArguments); 478 deferredResult.addErrback(MochiKit.Base.method(this, 'messageExceptionHandler'), someArguments);
482 deferredResult.callback(); 479 deferredResult.callback();
483 480
484 return deferredResult 481 return deferredResult
485 }, 482 },
486 483
487 //------------------------------------------------------------------------- 484 //-------------------------------------------------------------------------
488 485
489 'messageExceptionHandler': function(anOriginalMessageArguments, anError) { 486 'messageExceptionHandler': function(anOriginalMessageArguments, anError) {
490 var result; 487 var result;
491 488
492console.log(">>> Connection.messageExceptionHandler", anError, anError.message); 489Clipperz.log(">>> Connection.messageExceptionHandler: " + anError.message, anError);
493 if (anError instanceof MochiKit.Async.CancelledError) { 490 if (anError instanceof MochiKit.Async.CancelledError) {
494 result = anError; 491 result = anError;
495 } else { 492 } else {
496 if ((anError.message == 'Trying to communicate without an active connection')|| 493 if ((anError.message == 'Trying to communicate without an active connection')||
497 (anError.message == 'No tollManager available for current session') 494 (anError.message == 'No tollManager available for current session')
498 ) { 495 ) {
499 result = this.reestablishConnection(anOriginalMessageArguments); 496 result = this.reestablishConnection(anOriginalMessageArguments);
500 } else if (anError.message == 'Session with stale data') { 497 } else if (anError.message == 'Session with stale data') {
501 MochiKit.Signal.signal(this, 'EXCEPTION'); 498 MochiKit.Signal.signal(this, 'EXCEPTION');
502 } else { 499 } else {
503 result = anError; 500 result = anError;
504 } 501 }
505 } 502 }
506console.log("<<< Connection.messageExceptionHandler", anError) 503Clipperz.log("<<< Connection.messageExceptionHandler")
507 504
508 return result;; 505 return result;;
509 }, 506 },
510 507
511 //========================================================================= 508 //=========================================================================
512 509
513 'reestablishConnection': function(anOriginalMessageArguments) { 510 'reestablishConnection': function(anOriginalMessageArguments) {
514 var deferredResult; 511 var deferredResult;
515 512
516 deferredResult = new Clipperz.Async.Deferred("Connection.reestablishConnection"); 513 deferredResult = new Clipperz.Async.Deferred("Connection.reestablishConnection");
517 deferredResult.addMethod(this, 'reset'); 514 deferredResult.addMethod(this, 'reset');
518 deferredResult.addMethod(this, 'login', true); 515 deferredResult.addMethod(this, 'login', true);
519 deferredResult.addCallback(MochiKit.Base.bind(function(aMessage) { 516 deferredResult.addCallback(MochiKit.Base.bind(function(aMessage) {
520 aMessage['srpSharedSecret'] = this.sharedSecret(); 517 aMessage['srpSharedSecret'] = this.sharedSecret();
521 return aMessage; 518 return aMessage;
522 }, this), anOriginalMessageArguments); 519 }, this), anOriginalMessageArguments);
523 deferredResult.addMethod(this, 'sendMessage'); 520 deferredResult.addMethod(this, 'sendMessage');
524 deferredResult.addErrback(MochiKit.Signal.signal, this, 'EXCEPTION', null); 521 deferredResult.addErrback(MochiKit.Signal.signal, this, 'EXCEPTION', null);
525 deferredResult.callback(); 522 deferredResult.callback();
526 523
527 return deferredResult; 524 return deferredResult;
528 }, 525 },
529 526
530 //========================================================================= 527 //=========================================================================
531 528
532 'serverSideUserCredentials': function(aUsername, aPassword) { 529 'serverSideUserCredentials': function(aUsername, aPassword) {
533 varresult; 530 varresult;
534 varnewSrpConnection; 531 varnewSrpConnection;
535 var normalizedAttributes; 532 var normalizedAttributes;
536 533
537 normalizedAttributes = this.normalizedCredentials({username:aUsername, password:aPassword}); 534 normalizedAttributes = this.normalizedCredentials({username:aUsername, password:aPassword});
538 newSrpConnection = new Clipperz.Crypto.SRP.Connection({ C:normalizedAttributes['username'], P:normalizedAttributes['password'], hash:this.hash() }); 535 newSrpConnection = new Clipperz.Crypto.SRP.Connection({ C:normalizedAttributes['username'], P:normalizedAttributes['password'], hash:this.hash() });
539 result = newSrpConnection.serverSideCredentials(); 536 result = newSrpConnection.serverSideCredentials();
540 result['version'] = this.clipperz_pm_crypto_version(); 537 result['version'] = this.clipperz_pm_crypto_version();
541 538
542 return result; 539 return result;
543 }, 540 },
544 541
545 //========================================================================= 542 //=========================================================================
546 543
547 'normalizedCredentials': function(someValues) { 544 'normalizedCredentials': function(someValues) {
548 var result; 545 var result;
549 546
550 result = {} 547 result = {}
551 result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'])).toHexString().substring(2); 548 result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'])).toHexString().substring(2);
552 result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2); 549 result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2);
553 550
554 return result; 551 return result;
555 }, 552 },
556 553
557 //----------------------------------------------------------------------------- 554 //-----------------------------------------------------------------------------
558 555
559 'hash': function() { 556 'hash': function() {
560 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash; 557 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash;
561 }, 558 },
562 559
563 //----------------------------------------------------------------------------- 560 //-----------------------------------------------------------------------------
564 __syntaxFix__: "syntax fix" 561 __syntaxFix__: "syntax fix"
565 562
566}); 563});
567 564
568 565
569 566
570//----------------------------------------------------------------------------- 567//-----------------------------------------------------------------------------
571// 568//
572 // S R P [ 1 . 1 ] C O N N E C T I O N class 569 // S R P [ 1 . 1 ] C O N N E C T I O N class
573// 570//
574//----------------------------------------------------------------------------- 571//-----------------------------------------------------------------------------
575 572
576Clipperz.PM.Connection.SRP['1.1'] = function (args) { 573Clipperz.PM.Connection.SRP['1.1'] = function (args) {
577 Clipperz.PM.Connection.SRP['1.0'].call(this, args); 574 Clipperz.PM.Connection.SRP['1.0'].call(this, args);
578 575
579 return this; 576 return this;
580} 577}
581 578
582Clipperz.PM.Connection.SRP['1.1'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection.SRP['1.0'](), { 579Clipperz.PM.Connection.SRP['1.1'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection.SRP['1.0'](), {
583 580
584 'version': function() { 581 'version': function() {
585 return '1.1'; 582 return '1.1';
586 }, 583 },
587 584
588 //----------------------------------------------------------------------------- 585 //-----------------------------------------------------------------------------
589 586
590 'normalizedCredentials': function(someValues) { 587 'normalizedCredentials': function(someValues) {
591 var result; 588 var result;
592 589
593 result = {} 590 result = {}
594 result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'] + someValues['password'])).toHexString().substring(2); 591 result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'] + someValues['password'])).toHexString().substring(2);
595 result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2); 592 result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2);
596 593
597 return result; 594 return result;
598 }, 595 },
599 596
600 //----------------------------------------------------------------------------- 597 //-----------------------------------------------------------------------------
601 598
602 'hash': function() { 599 'hash': function() {
603 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash; 600 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash;
diff --git a/frontend/gamma/js/Clipperz/PM/Crypto.js b/frontend/gamma/js/Clipperz/PM/Crypto.js
index 31fe349..cd10e33 100644
--- a/frontend/gamma/js/Clipperz/PM/Crypto.js
+++ b/frontend/gamma/js/Clipperz/PM/Crypto.js
@@ -1,507 +1,505 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.Crypto) == 'undefined') { Clipperz.PM.Crypto = {}; } 26if (typeof(Clipperz.PM.Crypto) == 'undefined') { Clipperz.PM.Crypto = {}; }
29 27
30Clipperz.PM.Crypto.VERSION = "0.2"; 28Clipperz.PM.Crypto.VERSION = "0.2";
31Clipperz.PM.Crypto.NAME = "Clipperz.PM.Crypto"; 29Clipperz.PM.Crypto.NAME = "Clipperz.PM.Crypto";
32 30
33Clipperz.PM.Crypto.encryptingFunctions = {}; 31Clipperz.PM.Crypto.encryptingFunctions = {};
34 32
35MochiKit.Base.update(Clipperz.PM.Crypto, { 33MochiKit.Base.update(Clipperz.PM.Crypto, {
36 34
37 '__repr__': function () { 35 '__repr__': function () {
38 return "[" + this.NAME + " " + this.VERSION + "]"; 36 return "[" + this.NAME + " " + this.VERSION + "]";
39 }, 37 },
40 38
41 //------------------------------------------------------------------------- 39 //-------------------------------------------------------------------------
42 40
43 'toString': function () { 41 'toString': function () {
44 return this.__repr__(); 42 return this.__repr__();
45 }, 43 },
46 44
47 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
48/* 46/*
49 'communicationProtocol': { 47 'communicationProtocol': {
50 'currentVersion': '0.2', 48 'currentVersion': '0.2',
51 'versions': { 49 'versions': {
52 '0.1': Clipperz.PM.Connection.SRP['1.0'],//Clipperz.Crypto.SRP.versions['1.0'].Connection, 50 '0.1': Clipperz.PM.Connection.SRP['1.0'],//Clipperz.Crypto.SRP.versions['1.0'].Connection,
53 '0.2': Clipperz.PM.Connection.SRP['1.1']//Clipperz.Crypto.SRP.versions['1.1'].Connection 51 '0.2': Clipperz.PM.Connection.SRP['1.1']//Clipperz.Crypto.SRP.versions['1.1'].Connection
54 }, 52 },
55 'fallbackVersions': { 53 'fallbackVersions': {
56 'current':'0.1', 54 'current':'0.1',
57 '0.2': '0.1', 55 '0.2': '0.1',
58 '0.1': null 56 '0.1': null
59 } 57 }
60 }, 58 },
61*/ 59*/
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'encryptingFunctions': { 62 'encryptingFunctions': {
65 'currentVersion': '0.3', 63 'currentVersion': '0.3',
66 'versions': { 64 'versions': {
67 65
68 //##################################################################### 66 //#####################################################################
69 67
70 '0.1': { 68 '0.1': {
71 'encrypt': function(aKey, aValue) { 69 'encrypt': function(aKey, aValue) {
72 return Clipperz.Crypto.Base.encryptUsingSecretKey(aKey, Clipperz.Base.serializeJSON(aValue)); 70 return Clipperz.Crypto.Base.encryptUsingSecretKey(aKey, Clipperz.Base.serializeJSON(aValue));
73 }, 71 },
74 72
75 'deferredEncrypt': function(aKey, aValue) { 73 'deferredEncrypt': function(aKey, aValue) {
76 var deferredResult; 74 var deferredResult;
77 75
78 deferredResult = new Clipperz.Async.Deferred("Crypto[0.1].deferredEncrypt"); 76 deferredResult = new Clipperz.Async.Deferred("Crypto[0.1].deferredEncrypt");
79 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt, aKey, aValue); 77 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt, aKey, aValue);
80 deferredResult.callback(); 78 deferredResult.callback();
81 79
82 return deferredResult; 80 return deferredResult;
83 }, 81 },
84 82
85 'decrypt': function(aKey, aValue) { 83 'decrypt': function(aKey, aValue) {
86 var result; 84 var result;
87 85
88 if (aValue != null) { 86 if (aValue != null) {
89 result = Clipperz.Base.evalJSON(Clipperz.Crypto.Base.decryptUsingSecretKey(aKey, aValue)); 87 result = Clipperz.Base.evalJSON(Clipperz.Crypto.Base.decryptUsingSecretKey(aKey, aValue));
90 } else { 88 } else {
91 result = null; 89 result = null;
92 } 90 }
93 91
94 return result; 92 return result;
95 }, 93 },
96 94
97 'deferredDecrypt': function(aKey, aValue) { 95 'deferredDecrypt': function(aKey, aValue) {
98 var deferredResult; 96 var deferredResult;
99 97
100 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.1].deferredDecrypt"); 98 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.1].deferredDecrypt");
101 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt, aKey, aValue); 99 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt, aKey, aValue);
102 deferredResult.callback(); 100 deferredResult.callback();
103 101
104 return deferredResult; 102 return deferredResult;
105 }, 103 },
106 104
107 'hash': function(aValue) { 105 'hash': function(aValue) {
108 var result; 106 var result;
109 var strngResult; 107 var strngResult;
110 108
111 stringResult = Clipperz.Crypto.Base.computeHashValue(aValue.asString()); //!!!!!!! 109 stringResult = Clipperz.Crypto.Base.computeHashValue(aValue.asString()); //!!!!!!!
112 result = new Clipperz.ByteArray("0x" + stringResult); 110 result = new Clipperz.ByteArray("0x" + stringResult);
113 111
114 return result; 112 return result;
115 }, 113 },
116 114
117 'deriveKey': function(aStringValue) { 115 'deriveKey': function(aStringValue) {
118 return Clipperz.Crypto.Base.computeHashValue(aStringValue); 116 return Clipperz.Crypto.Base.computeHashValue(aStringValue);
119 } 117 }
120 }, 118 },
121 119
122 //##################################################################### 120 //#####################################################################
123 121
124 '0.2': { 122 '0.2': {
125 'encrypt': function(aKey, aValue, aNonce) { 123 'encrypt': function(aKey, aValue, aNonce) {
126 var result; 124 var result;
127 varkey, value; 125 varkey, value;
128 var dataToEncrypt; 126 var dataToEncrypt;
129 var encryptedData; 127 var encryptedData;
130 128
131 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 129 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
132 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue)); 130 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
133 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value); 131 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
134 encryptedData = Clipperz.Crypto.AES.encrypt(key, dataToEncrypt, aNonce); 132 encryptedData = Clipperz.Crypto.AES.encrypt(key, dataToEncrypt, aNonce);
135 result = encryptedData.toBase64String(); 133 result = encryptedData.toBase64String();
136 134
137 return result; 135 return result;
138 }, 136 },
139 137
140 'deferredEncrypt': function(aKey, aValue, aNonce) { 138 'deferredEncrypt': function(aKey, aValue, aNonce) {
141 var deferredResult; 139 var deferredResult;
142 varkey, value; 140 varkey, value;
143 var dataToEncrypt; 141 var dataToEncrypt;
144 // var encryptedData; 142 // var encryptedData;
145 143
146 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 144 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
147 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue)); 145 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
148 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value); 146 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
149 147
150 deferredResult = new Clipperz.Async.Deferred("Crypto[0.2].deferredEncrypt") 148 deferredResult = new Clipperz.Async.Deferred("Crypto[0.2].deferredEncrypt")
151 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, dataToEncrypt, aNonce); 149 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, dataToEncrypt, aNonce);
152 deferredResult.addCallback(function(aResult) { 150 deferredResult.addCallback(function(aResult) {
153 return aResult.toBase64String(); 151 return aResult.toBase64String();
154 }) 152 })
155 deferredResult.callback(); 153 deferredResult.callback();
156 154
157 return deferredResult; 155 return deferredResult;
158 }, 156 },
159 157
160 'decrypt': function(aKey, aValue) { 158 'decrypt': function(aKey, aValue) {
161 var result; 159 var result;
162 160
163 if (aValue != null) { 161 if (aValue != null) {
164 var key, value; 162 var key, value;
165 var decryptedData; 163 var decryptedData;
166 var decryptedValue; 164 var decryptedValue;
167 165
168 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 166 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
169 value = new Clipperz.ByteArray().appendBase64String(aValue); 167 value = new Clipperz.ByteArray().appendBase64String(aValue);
170 168
171 decryptedData = Clipperz.Crypto.AES.decrypt(key, value); 169 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
172 decryptedValue = decryptedData.split((256/8)); 170 decryptedValue = decryptedData.split((256/8));
173 171
174 try { 172 try {
175 result = Clipperz.Base.evalJSON(decryptedValue.asString()); 173 result = Clipperz.Base.evalJSON(decryptedValue.asString());
176 } catch (exception) { 174 } catch (exception) {
177 MochiKit.Logging.logError("Error while decrypting data [1]"); 175 Clipperz.logError("Error while decrypting data [1]");
178 throw Clipperz.Crypto.Base.exception.CorruptedMessage; 176 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
179 } 177 }
180 } else { 178 } else {
181 result = null; 179 result = null;
182 } 180 }
183 181
184 return result; 182 return result;
185 }, 183 },
186 184
187 'deferredDecrypt': function(aKey, aValue) { 185 'deferredDecrypt': function(aKey, aValue) {
188 var result; 186 var result;
189 187
190 if (aValue != null) { 188 if (aValue != null) {
191 var deferredResult; 189 var deferredResult;
192 var key, value; 190 var key, value;
193 // var decryptedData; 191 // var decryptedData;
194 192
195 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 193 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
196 value = new Clipperz.ByteArray().appendBase64String(aValue); 194 value = new Clipperz.ByteArray().appendBase64String(aValue);
197 195
198 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.2].deferredDecrypt"); 196 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.2].deferredDecrypt");
199 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value); 197 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
200 deferredResult.addCallback(function(aResult) { 198 deferredResult.addCallback(function(aResult) {
201 var result; 199 var result;
202 var decryptedData; 200 var decryptedData;
203 201
204 decryptedData = aResult.split((256/8)); 202 decryptedData = aResult.split((256/8));
205 203
206 try { 204 try {
207 result = Clipperz.Base.evalJSON(decryptedData.asString()); 205 result = Clipperz.Base.evalJSON(decryptedData.asString());
208 } catch (exception) { 206 } catch (exception) {
209 MochiKit.Logging.logError("Error while decrypting data [2]"); 207 Clipperz.logError("Error while decrypting data [2]");
210 throw Clipperz.Crypto.Base.exception.CorruptedMessage; 208 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
211 } 209 }
212 210
213 return result; 211 return result;
214 }) 212 })
215 deferredResult.callback(); 213 deferredResult.callback();
216 214
217 result = deferredResult; 215 result = deferredResult;
218 } else { 216 } else {
219 result = MochiKit.Async.succeed(null); 217 result = MochiKit.Async.succeed(null);
220 } 218 }
221 219
222 return result; 220 return result;
223 }, 221 },
224 222
225 'hash': Clipperz.Crypto.SHA.sha_d256, 223 'hash': Clipperz.Crypto.SHA.sha_d256,
226 224
227 'deriveKey': function(aStringValue) { 225 'deriveKey': function(aStringValue) {
228 varbyteData; 226 varbyteData;
229 var result; 227 var result;
230 228
231 byteData = new Clipperz.ByteArray(aStringValue); 229 byteData = new Clipperz.ByteArray(aStringValue);
232 result = Clipperz.Crypto.SHA.sha_d256(byteData); 230 result = Clipperz.Crypto.SHA.sha_d256(byteData);
233 231
234 return result; 232 return result;
235 } 233 }
236 }, 234 },
237 235
238 //##################################################################### 236 //#####################################################################
239 237
240 '0.3': { 238 '0.3': {
241 'encrypt': function(aKey, aValue, aNonce) { 239 'encrypt': function(aKey, aValue, aNonce) {
242 var result; 240 var result;
243 varkey, value; 241 varkey, value;
244 var data; 242 var data;
245 var dataToEncrypt; 243 var dataToEncrypt;
246 var encryptedData; 244 var encryptedData;
247 245
248 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 246 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
249 value = Clipperz.Base.serializeJSON(aValue); 247 value = Clipperz.Base.serializeJSON(aValue);
250 data = new Clipperz.ByteArray(value); 248 data = new Clipperz.ByteArray(value);
251 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce); 249 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
252 result = encryptedData.toBase64String(); 250 result = encryptedData.toBase64String();
253 251
254 return result; 252 return result;
255 }, 253 },
256 254
257 'deferredEncrypt': function(aKey, aValue, aNonce) { 255 'deferredEncrypt': function(aKey, aValue, aNonce) {
258 var deferredResult; 256 var deferredResult;
259 varkey, value; 257 varkey, value;
260 var data; 258 var data;
261 var dataToEncrypt; 259 var dataToEncrypt;
262 var encryptedData; 260 var encryptedData;
263 261
264 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 262 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
265 value = Clipperz.Base.serializeJSON(aValue); 263 value = Clipperz.Base.serializeJSON(aValue);
266 data = new Clipperz.ByteArray(value); 264 data = new Clipperz.ByteArray(value);
267 265
268 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredEncrypt") 266 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredEncrypt")
269 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data, aNonce); 267 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data, aNonce);
270 deferredResult.addCallback(function(aResult) { 268 deferredResult.addCallback(function(aResult) {
271 return aResult.toBase64String(); 269 return aResult.toBase64String();
272 }) 270 })
273 deferredResult.callback(); 271 deferredResult.callback();
274 272
275 return deferredResult; 273 return deferredResult;
276 }, 274 },
277 275
278 'decrypt': function(aKey, aValue) { 276 'decrypt': function(aKey, aValue) {
279 var result; 277 var result;
280 278
281 if (aValue != null) { 279 if (aValue != null) {
282 var key, value; 280 var key, value;
283 var decryptedData; 281 var decryptedData;
284 282
285 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 283 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
286 value = new Clipperz.ByteArray().appendBase64String(aValue); 284 value = new Clipperz.ByteArray().appendBase64String(aValue);
287 285
288 decryptedData = Clipperz.Crypto.AES.decrypt(key, value); 286 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
289 287
290 value = decryptedData.asString(); 288 value = decryptedData.asString();
291 try { 289 try {
292 result = Clipperz.Base.evalJSON(value); 290 result = Clipperz.Base.evalJSON(value);
293 } catch (exception) { 291 } catch (exception) {
294 MochiKit.Logging.logError("Error while decrypting data [3]"); 292 Clipperz.logError("Error while decrypting data [3]");
295 throw Clipperz.Crypto.Base.exception.CorruptedMessage; 293 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
296 } 294 }
297 } else { 295 } else {
298 result = null; 296 result = null;
299 } 297 }
300 298
301 return result; 299 return result;
302 }, 300 },
303 301
304 'deferredDecrypt': function(aKey, aValue) { 302 'deferredDecrypt': function(aKey, aValue) {
305 var deferredResult; 303 var deferredResult;
306 304
307 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredDecrypt", {trace: false}); 305 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredDecrypt", {trace: false});
308 // now = new Date; 306 // now = new Date;
309 307
310 if (aValue != null) { 308 if (aValue != null) {
311 var key, value; 309 var key, value;
312 // var decryptedData; 310 // var decryptedData;
313 311
314 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 312 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
315 value = new Clipperz.ByteArray().appendBase64String(aValue); 313 value = new Clipperz.ByteArray().appendBase64String(aValue);
316 314
317 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value); 315 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
318 deferredResult.addCallback(MochiKit.Async.wait, 0.1); 316 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
319 deferredResult.addCallback(function(aResult) { 317 deferredResult.addCallback(function(aResult) {
320 return aResult.asString(); 318 return aResult.asString();
321 }); 319 });
322 deferredResult.addCallback(MochiKit.Async.wait, 0.1); 320 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
323 deferredResult.addCallback(Clipperz.Base.evalJSON); 321 deferredResult.addCallback(Clipperz.Base.evalJSON);
324 deferredResult.addErrback(function(anError) { 322 deferredResult.addErrback(function(anError) {
325 MochiKit.Logging.logError("Error while decrypting data [4]"); 323 Clipperz.logError("Error while decrypting data [4]");
326 throw Clipperz.Crypto.Base.exception.CorruptedMessage; 324 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
327 }) 325 })
328 } else { 326 } else {
329 deferredResult.addCallback(function() { 327 deferredResult.addCallback(function() {
330 return null; 328 return null;
331 }); 329 });
332 } 330 }
333 deferredResult.callback(); 331 deferredResult.callback();
334 332
335 return deferredResult; 333 return deferredResult;
336 }, 334 },
337 335
338 'hash': Clipperz.Crypto.SHA.sha_d256, 336 'hash': Clipperz.Crypto.SHA.sha_d256,
339 337
340 'deriveKey': function(aStringValue) { 338 'deriveKey': function(aStringValue) {
341 varbyteData; 339 varbyteData;
342 var result; 340 var result;
343 341
344 byteData = new Clipperz.ByteArray(aStringValue); 342 byteData = new Clipperz.ByteArray(aStringValue);
345 result = Clipperz.Crypto.SHA.sha_d256(byteData); 343 result = Clipperz.Crypto.SHA.sha_d256(byteData);
346 344
347 return result; 345 return result;
348 } 346 }
349 347
350 }, 348 },
351 349
352 //##################################################################### 350 //#####################################################################
353/* 351/*
354 '0.4': { 352 '0.4': {
355 'encrypt': function(aKey, aValue, aNonce) { 353 'encrypt': function(aKey, aValue, aNonce) {
356 var result; 354 var result;
357 varkey, value; 355 varkey, value;
358 var data; 356 var data;
359 var dataToEncrypt; 357 var dataToEncrypt;
360 var encryptedData; 358 var encryptedData;
361 359
362//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt"); 360//Clipperz.logDebug(">>> [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt");
363 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 361 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
364//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 1"); 362//Clipperz.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 1");
365 value = Clipperz.Base.serializeJSON(aValue); 363 value = Clipperz.Base.serializeJSON(aValue);
366//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 2"); 364//Clipperz.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 2");
367/ * 365/ *
368//MochiKit.Logging.logDebug("--> encrypt.fullSize: " + value.length); 366//Clipperz.logDebug("--> encrypt.fullSize: " + value.length);
369 value = value.replace(/":{"label":"/g, '":{l:"'); 367 value = value.replace(/":{"label":"/g, '":{l:"');
370 value = value.replace(/":{"key":"/g, '":{k:"'); 368 value = value.replace(/":{"key":"/g, '":{k:"');
371 value = value.replace(/":{"notes":"/g, '":{n:"'); 369 value = value.replace(/":{"notes":"/g, '":{n:"');
372 value = value.replace(/":{"record":"/g, '":{r:"'); 370 value = value.replace(/":{"record":"/g, '":{r:"');
373 value = value.replace(/", "label":"/g, '",l:"'); 371 value = value.replace(/", "label":"/g, '",l:"');
374 value = value.replace(/", "favicon":"/g,'",f:"'); 372 value = value.replace(/", "favicon":"/g,'",f:"');
375//MochiKit.Logging.logDebug("<-- encrypt.compressed: " + value.length); 373//Clipperz.logDebug("<-- encrypt.compressed: " + value.length);
376* / 374* /
377 data = new Clipperz.ByteArray(value); 375 data = new Clipperz.ByteArray(value);
378//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 3"); 376//Clipperz.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 3");
379 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce); 377 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
380//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 4"); 378//Clipperz.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 4");
381 result = encryptedData.toBase64String(); 379 result = encryptedData.toBase64String();
382//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt"); 380//Clipperz.logDebug("<<< [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt");
383 381
384 return result; 382 return result;
385 }, 383 },
386 384
387 'decrypt': function(aKey, aValue) { 385 'decrypt': function(aKey, aValue) {
388 var result; 386 var result;
389 387
390 if (aValue != null) { 388 if (aValue != null) {
391 var key, value; 389 var key, value;
392 var decryptedData; 390 var decryptedData;
393 391
394 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); 392 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
395 value = new Clipperz.ByteArray().appendBase64String(aValue); 393 value = new Clipperz.ByteArray().appendBase64String(aValue);
396 394
397 decryptedData = Clipperz.Crypto.AES.decrypt(key, value); 395 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
398 396
399 value = decryptedData.asString(); 397 value = decryptedData.asString();
400/ * 398/ *
401 value = value.replace(/":{l:"/g,'":{"label":"'); 399 value = value.replace(/":{l:"/g,'":{"label":"');
402 value = value.replace(/":{k:"/g,'":{"key":"'); 400 value = value.replace(/":{k:"/g,'":{"key":"');
403 value = value.replace(/":{n:"/g,'":{"notes":"'); 401 value = value.replace(/":{n:"/g,'":{"notes":"');
404 value = value.replace(/":{r:"/g,'":{"record":"'); 402 value = value.replace(/":{r:"/g,'":{"record":"');
405 value = value.replace(/",l:"/g, '", "label":"'); 403 value = value.replace(/",l:"/g, '", "label":"');
406 value = value.replace(/",f:"/g, '", "favicon":"'); 404 value = value.replace(/",f:"/g, '", "favicon":"');
407* / 405* /
408 try { 406 try {
409 result = Clipperz.Base.evalJSON(value); 407 result = Clipperz.Base.evalJSON(value);
410 } catch (exception) { 408 } catch (exception) {
411 MochiKit.Logging.logError("Error while decrypting data"); 409 Clipperz.logError("Error while decrypting data");
412 throw Clipperz.Crypto.Base.exception.CorruptedMessage; 410 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
413 } 411 }
414 412
415 413
416 } else { 414 } else {
417 result = null; 415 result = null;
418 } 416 }
419 417
420 return result; 418 return result;
421 }, 419 },
422 420
423 'hash': Clipperz.Crypto.SHA.sha_d256 421 'hash': Clipperz.Crypto.SHA.sha_d256
424 }, 422 },
425*/ 423*/
426 //##################################################################### 424 //#####################################################################
427 __syntaxFix__: "syntax fix" 425 __syntaxFix__: "syntax fix"
428 } 426 }
429 }, 427 },
430 428
431 //------------------------------------------------------------------------- 429 //-------------------------------------------------------------------------
432 430
433 'encrypt': function(aKey, aValue, aVersion) { 431 'encrypt': function(aKey, aValue, aVersion) {
434 return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].encrypt(aKey, aValue); 432 return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].encrypt(aKey, aValue);
435 }, 433 },
436 434
437 'deferredEncrypt': function(someParameters) { 435 'deferredEncrypt': function(someParameters) {
438 return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredEncrypt(someParameters['key'], someParameters['value']); 436 return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredEncrypt(someParameters['key'], someParameters['value']);
439 }, 437 },
440 438
441 //......................................................................... 439 //.........................................................................
442 440
443 'decrypt': function(aKey, aValue, aVersion) { 441 'decrypt': function(aKey, aValue, aVersion) {
444 return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].decrypt(aKey, aValue); 442 return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].decrypt(aKey, aValue);
445 }, 443 },
446 444
447 'deferredDecrypt': function(someParameters) { 445 'deferredDecrypt': function(someParameters) {
448 return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredDecrypt(someParameters['key'], someParameters['value']); 446 return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredDecrypt(someParameters['key'], someParameters['value']);
449 }, 447 },
450 448
451 //------------------------------------------------------------------------- 449 //-------------------------------------------------------------------------
452 450
453 'hash': function(aValue) { 451 'hash': function(aValue) {
454 return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]['hash'](aValue); 452 return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]['hash'](aValue);
455 }, 453 },
456 454
457 //------------------------------------------------------------------------- 455 //-------------------------------------------------------------------------
458 456
459 'randomKey': function() { 457 'randomKey': function() {
460 return Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 458 return Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
461 }, 459 },
462 460
463 //------------------------------------------------------------------------- 461 //-------------------------------------------------------------------------
464 462
465 'deriveKey': function(aValue) { 463 'deriveKey': function(aValue) {
466 return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion].deriveKey(aValue); 464 return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion].deriveKey(aValue);
467 }, 465 },
468 466
469 //------------------------------------------------------------------------- 467 //-------------------------------------------------------------------------
470 468
471 'passwordEntropy': function(aValue) { 469 'passwordEntropy': function(aValue) {
472 var result; 470 var result;
473 varbitPerChar; 471 varbitPerChar;
474 472
475 bitPerChar = 4; 473 bitPerChar = 4;
476 if (/[a-z]/.test(aValue)) { 474 if (/[a-z]/.test(aValue)) {
477 bitPerChar ++; 475 bitPerChar ++;
478 } 476 }
479 if (/[A-Z]/.test(aValue)) { 477 if (/[A-Z]/.test(aValue)) {
480 bitPerChar ++; 478 bitPerChar ++;
481 } 479 }
482 if (/[^a-zA-Z0-9]/.test(aValue)) { 480 if (/[^a-zA-Z0-9]/.test(aValue)) {
483 bitPerChar ++; 481 bitPerChar ++;
484 } 482 }
485 483
486 result = aValue.length * bitPerChar; 484 result = aValue.length * bitPerChar;
487 485
488 return result; 486 return result;
489 }, 487 },
490 488
491 //------------------------------------------------------------------------- 489 //-------------------------------------------------------------------------
492 490
493 'nullValue': '####', 491 'nullValue': '####',
494 492
495 //------------------------------------------------------------------------- 493 //-------------------------------------------------------------------------
496 __syntaxFix__: "syntax fix" 494 __syntaxFix__: "syntax fix"
497 495
498}); 496});
499 497
500//***************************************************************************** 498//*****************************************************************************
501 499
502//MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, { 500//MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, {
503 //'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion] 501 //'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
504//}); 502//});
505 503
506MochiKit.Base.update(Clipperz.PM.Crypto.encryptingFunctions.versions, { 504MochiKit.Base.update(Clipperz.PM.Crypto.encryptingFunctions.versions, {
507 'current': Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion] 505 'current': Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js
index 8f8696d..507ee31 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.DataModel'); 24Clipperz.Base.module('Clipperz.PM.DataModel');
27 25
28Clipperz.PM.DataModel.DirectLogin = function(args) { 26Clipperz.PM.DataModel.DirectLogin = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.DataModel.DirectLogin.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.DataModel.DirectLogin.superclass.constructor.apply(this, arguments);
32 30
33 this._reference =args.reference 31 this._reference =args.reference
34 ||Clipperz.PM.Crypto.randomKey(); 32 ||Clipperz.PM.Crypto.randomKey();
35 this._record =args.record 33 this._record =args.record
36 ||Clipperz.Base.exception.raise('MandatoryParameter'); 34 ||Clipperz.Base.exception.raise('MandatoryParameter');
37 35
38 this._retrieveIndexDataFunction = args.retrieveIndexDataFunction 36 this._retrieveIndexDataFunction = args.retrieveIndexDataFunction
39 ||this.record().retrieveDirectLoginIndexDataFunction() 37 ||this.record().retrieveDirectLoginIndexDataFunction()
40 ||Clipperz.Base.exception.raise('MandatoryParameter'); 38 ||Clipperz.Base.exception.raise('MandatoryParameter');
41 this._setIndexDataFunction = args.setIndexDataFunction 39 this._setIndexDataFunction = args.setIndexDataFunction
42 ||this.record().setDirectLoginIndexDataFunction() 40 ||this.record().setDirectLoginIndexDataFunction()
43 ||Clipperz.Base.exception.raise('MandatoryParameter'); 41 ||Clipperz.Base.exception.raise('MandatoryParameter');
44 this._removeIndexDataFunction =args.removeIndexDataFunction 42 this._removeIndexDataFunction =args.removeIndexDataFunction
45 ||this.record().removeDirectLoginIndexDataFunction() 43 ||this.record().removeDirectLoginIndexDataFunction()
46 ||Clipperz.Base.exception.raise('MandatoryParameter'); 44 ||Clipperz.Base.exception.raise('MandatoryParameter');
47 45
48 this._inputs = null; 46 this._inputs = null;
49 this._bindings = null; 47 this._bindings = null;
50 this._formValues = null; 48 this._formValues = null;
51 49
52 // this._inputsDeferredLock = new MochiKit.Async.DeferredLock(); 50 // this._inputsDeferredLock = new MochiKit.Async.DeferredLock();
53 // this._bindingsDeferredLock = new MochiKit.Async.DeferredLock(); 51 // this._bindingsDeferredLock = new MochiKit.Async.DeferredLock();
54 // this._formValuesDeferredLock = new MochiKit.Async.DeferredLock(); 52 // this._formValuesDeferredLock = new MochiKit.Async.DeferredLock();
55 53
56 this._transientState = null; 54 this._transientState = null;
57 55
58 this._isBrandNew = MochiKit.Base.isUndefinedOrNull(args.reference); 56 this._isBrandNew = MochiKit.Base.isUndefinedOrNull(args.reference);
59 57
60 this.record().addDirectLogin(this); 58 this.record().addDirectLogin(this);
61 59
62 return this; 60 return this;
63} 61}
64 62
65Clipperz.Base.extend(Clipperz.PM.DataModel.DirectLogin, Object, { 63Clipperz.Base.extend(Clipperz.PM.DataModel.DirectLogin, Object, {
66 64
67 'toString': function() { 65 'toString': function() {
68 return "DirectLogin (" + this.reference() + ")"; 66 return "DirectLogin (" + this.reference() + ")";
69 }, 67 },
70 68
71 //========================================================================= 69 //=========================================================================
72 70
73 'reference': function () { 71 'reference': function () {
74 return this._reference; 72 return this._reference;
75 }, 73 },
76 74
77 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
78 76
79 'record': function () { 77 'record': function () {
80 return this._record; 78 return this._record;
81 }, 79 },
82 80
83 //========================================================================= 81 //=========================================================================
84 82
85 'isBrandNew': function () { 83 'isBrandNew': function () {
86 return this._isBrandNew; 84 return this._isBrandNew;
87 }, 85 },
88 86
89 //========================================================================= 87 //=========================================================================
90 88
91 'removeIndexDataFunction': function () { 89 'removeIndexDataFunction': function () {
92 return this._removeIndexDataFunction; 90 return this._removeIndexDataFunction;
93 }, 91 },
94 92
95 'remove': function () { 93 'remove': function () {
96 return Clipperz.Async.callbacks("DirectLogin.remove", [ 94 return Clipperz.Async.callbacks("DirectLogin.remove", [
97 MochiKit.Base.partial(this.removeIndexDataFunction(), this.reference()), 95 MochiKit.Base.partial(this.removeIndexDataFunction(), this.reference()),
98 MochiKit.Base.method(this.record(), 'removeDirectLogin', this) 96 MochiKit.Base.method(this.record(), 'removeDirectLogin', this)
99 ], {trace:false}); 97 ], {trace:false});
100 }, 98 },
101 99
102 //========================================================================= 100 //=========================================================================
103 /* 101 /*
104 'inputsDeferredLock': function () { 102 'inputsDeferredLock': function () {
105 return this._inputsDeferredLock; 103 return this._inputsDeferredLock;
106 }, 104 },
107 105
108 'bindingsDeferredLock': function () { 106 'bindingsDeferredLock': function () {
109 return this._bindingsDeferredLock; 107 return this._bindingsDeferredLock;
110 }, 108 },
111 109
112 'formValuesDeferredLock': function () { 110 'formValuesDeferredLock': function () {
113 return this._formValuesDeferredLock; 111 return this._formValuesDeferredLock;
114 }, 112 },
115*/ 113*/
116 //========================================================================= 114 //=========================================================================
117 115
118 'label': function () { 116 'label': function () {
@@ -236,550 +234,542 @@ Clipperz.Base.extend(Clipperz.PM.DataModel.DirectLogin, Object, {
236 'serializedData': function () { 234 'serializedData': function () {
237 return Clipperz.Async.collectResults("DirectLogin.serializedData", { 235 return Clipperz.Async.collectResults("DirectLogin.serializedData", {
238 'bookmarkletVersion': MochiKit.Base.method(this, 'getValue', 'bookmarkletVersion'), 236 'bookmarkletVersion': MochiKit.Base.method(this, 'getValue', 'bookmarkletVersion'),
239 'formData': MochiKit.Base.method(this, 'getValue', 'formData'), 237 'formData': MochiKit.Base.method(this, 'getValue', 'formData'),
240 'formValues': MochiKit.Base.method(this, 'getValue', 'formValues'), 238 'formValues': MochiKit.Base.method(this, 'getValue', 'formValues'),
241 'bindingData': [ 239 'bindingData': [
242 MochiKit.Base.method(this, 'bindings'), 240 MochiKit.Base.method(this, 'bindings'),
243 function (someBindings) { 241 function (someBindings) {
244 var result; 242 var result;
245 var bindingKey; 243 var bindingKey;
246 244
247 result = {} 245 result = {}
248 for (bindingKey in someBindings) { 246 for (bindingKey in someBindings) {
249 result[bindingKey] = someBindings[bindingKey].serializedData(); 247 result[bindingKey] = someBindings[bindingKey].serializedData();
250 } 248 }
251 249
252 return result; 250 return result;
253 } 251 }
254 ] 252 ]
255 }, {trace:false})() 253 }, {trace:false})()
256 }, 254 },
257 255
258 //========================================================================= 256 //=========================================================================
259/* 257/*
260 'fixFormDataFromBookmarkletVersion_0_1': function(aValue) { 258 'fixFormDataFromBookmarkletVersion_0_1': function(aValue) {
261//{"type":"radio", "name":"action", "value":"new-user", "checked":false }, { "type":"radio", "name":"action", "value":"sign-in", "checked":true } 259//{"type":"radio", "name":"action", "value":"new-user", "checked":false }, { "type":"radio", "name":"action", "value":"sign-in", "checked":true }
262 // || 260 // ||
263 // \ / 261 // \ /
264 // \/ 262 // \/
265//{"name":"dominio", "type":"radio", "options":[{"value":"@alice.it", "checked":true}, {"value":"@tin.it", "checked":false}, {"value":"@virgilio.it", "checked":false}, {"value":"@tim.it", "checked":false}]} 263//{"name":"dominio", "type":"radio", "options":[{"value":"@alice.it", "checked":true}, {"value":"@tin.it", "checked":false}, {"value":"@virgilio.it", "checked":false}, {"value":"@tim.it", "checked":false}]}
266 var result; 264 var result;
267 var inputs; 265 var inputs;
268 var updatedInputs; 266 var updatedInputs;
269 var radios; 267 var radios;
270 268
271 result = aValue; 269 result = aValue;
272 inputs = aValue['inputs']; 270 inputs = aValue['inputs'];
273 271
274 updatedInputs = MochiKit.Base.filter(function(anInput) { 272 updatedInputs = MochiKit.Base.filter(function(anInput) {
275 varresult; 273 varresult;
276 var type; 274 var type;
277 275
278 type = anInput['type'] || 'text'; 276 type = anInput['type'] || 'text';
279 result = type.toLowerCase() != 'radio'; 277 result = type.toLowerCase() != 'radio';
280 278
281 return result; 279 return result;
282 }, inputs); 280 }, inputs);
283 radios = MochiKit.Base.filter(function(anInput) { 281 radios = MochiKit.Base.filter(function(anInput) {
284 varresult; 282 varresult;
285 var type; 283 var type;
286 284
287 type = anInput['type'] || 'text'; 285 type = anInput['type'] || 'text';
288 result = type.toLowerCase() == 'radio'; 286 result = type.toLowerCase() == 'radio';
289 287
290 return result; 288 return result;
291 }, inputs); 289 }, inputs);
292 290
293 if (radios.length > 0) { 291 if (radios.length > 0) {
294 var updatedRadios; 292 var updatedRadios;
295 293
296 updatedRadios = {}; 294 updatedRadios = {};
297 MochiKit.Iter.forEach(radios, MochiKit.Base.bind(function(aRadio) { 295 MochiKit.Iter.forEach(radios, MochiKit.Base.bind(function(aRadio) {
298 varradioConfiguration; 296 varradioConfiguration;
299 297
300 radioConfiguration = updatedRadios[aRadio['name']]; 298 radioConfiguration = updatedRadios[aRadio['name']];
301 if (radioConfiguration == null) { 299 if (radioConfiguration == null) {
302 radioConfiguration = {type:'radio', name:aRadio['name'], options:[]}; 300 radioConfiguration = {type:'radio', name:aRadio['name'], options:[]};
303 updatedRadios[aRadio['name']] = radioConfiguration; 301 updatedRadios[aRadio['name']] = radioConfiguration;
304 } 302 }
305 303
306 //TODO: remove the value: field and replace it with element.dom.value = <some value> 304 //TODO: remove the value: field and replace it with element.dom.value = <some value>
307 radioConfiguration.options.push({value:aRadio['value'], checked:aRadio['checked']}); 305 radioConfiguration.options.push({value:aRadio['value'], checked:aRadio['checked']});
308 306
309 //TODO: shoud remove the 'formValues' call, as it is now deferred 307 //TODO: shoud remove the 'formValues' call, as it is now deferred
310 // if ((aRadio['checked'] == true) && (this.formValues()[aRadio['name']] == null)) { 308 // if ((aRadio['checked'] == true) && (this.formValues()[aRadio['name']] == null)) {
311 // this.formValues()[aRadio['name']] = aRadio['value']; 309 // this.formValues()[aRadio['name']] = aRadio['value'];
312 // } 310 // }
313 }, this)) 311 }, this))
314 312
315 updatedInputs = MochiKit.Base.concat(updatedInputs, MochiKit.Base.values(updatedRadios)); 313 updatedInputs = MochiKit.Base.concat(updatedInputs, MochiKit.Base.values(updatedRadios));
316 } 314 }
317 315
318 delete result.inputs; 316 delete result.inputs;
319 result.inputs = updatedInputs; 317 result.inputs = updatedInputs;
320 318
321 return result; 319 return result;
322 }, 320 },
323 321
324 '_fixConfiguration': function (aConfiguration) { 322 '_fixConfiguration': function (aConfiguration) {
325 var fixedConfiguration; 323 var fixedConfiguration;
326 // var inputs; 324 // var inputs;
327 // var bindings; 325 // var bindings;
328 // var i,c; 326 // var i,c;
329 327
330 fixedConfiguration = Clipperz.Base.deepClone(aConfiguration); 328 fixedConfiguration = Clipperz.Base.deepClone(aConfiguration);
331 329
332//console.log("PROCESS CONFIGURATION", aConfiguration); 330//Clipperz.log("PROCESS CONFIGURATION", aConfiguration);
333 switch (aConfiguration['bookmarkletVersion']) { 331 switch (aConfiguration['bookmarkletVersion']) {
334 case '0.1': 332 case '0.1':
335 fixedConfiguration['formData'] = this.fixFormDataFromBookmarkletVersion_0_1(aConfiguration['formData']); 333 fixedConfiguration['formData'] = this.fixFormDataFromBookmarkletVersion_0_1(aConfiguration['formData']);
336 break; 334 break;
337 case '0.2': 335 case '0.2':
338 fixedConfiguration['formData'] = aConfiguration['formData']; 336 fixedConfiguration['formData'] = aConfiguration['formData'];
339 break; 337 break;
340 } 338 }
341 339
342 / * 340 / *
343 aConfiguration['_inputs'] = []; 341 aConfiguration['_inputs'] = [];
344 c = formData['inputs'].length; 342 c = formData['inputs'].length;
345 for (i=0; i<c; i++) { 343 for (i=0; i<c; i++) {
346 aConfiguration['_inputs'].push(new Clipperz.PM.DataModel.DirectLoginInput(formData['inputs'][i])); 344 aConfiguration['_inputs'].push(new Clipperz.PM.DataModel.DirectLoginInput(formData['inputs'][i]));
347 } 345 }
348* / 346* /
349/ * 347/ *
350 aConfiguration['_bindings'] = {}; 348 aConfiguration['_bindings'] = {};
351 if (aConfiguration['legacyBindingData'] == null) { 349 if (aConfiguration['legacyBindingData'] == null) {
352 if (aConfiguration['bindingData'] != null) { 350 if (aConfiguration['bindingData'] != null) {
353 var bindingKey; 351 var bindingKey;
354 352
355 for (bindingKey in aConfiguration['bindingData']) { 353 for (bindingKey in aConfiguration['bindingData']) {
356 var newBinding; 354 var newBinding;
357 355
358 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldKey:aConfiguration['bindingData'][bindingKey]}); 356 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldKey:aConfiguration['bindingData'][bindingKey]});
359 aConfiguration['_bindings'][newBinding.key()] = newBinding; 357 aConfiguration['_bindings'][newBinding.key()] = newBinding;
360 } 358 }
361 } else { 359 } else {
362 var editableFields; 360 var editableFields;
363 361
364 editableFields = MochiKit.Base.filter(function(aField) { 362 editableFields = MochiKit.Base.filter(function(aField) {
365 var result; 363 var result;
366 var type; 364 var type;
367 365
368 type = aField['type'].toLowerCase(); 366 type = aField['type'].toLowerCase();
369 result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select')); 367 result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select'));
370 368
371 return result; 369 return result;
372 }, aConfiguration['_inputs']); 370 }, aConfiguration['_inputs']);
373 371
374 MochiKit.Iter.forEach(editableFields, MochiKit.Base.bind(function(anEditableField) { 372 MochiKit.Iter.forEach(editableFields, MochiKit.Base.bind(function(anEditableField) {
375 var newBinding; 373 var newBinding;
376 374
377 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(anEditableField['name']); 375 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(anEditableField['name']);
378 aConfiguration['_bindings'][newBinding.key()] = newBinding; 376 aConfiguration['_bindings'][newBinding.key()] = newBinding;
379 }, this)); 377 }, this));
380 } 378 }
381 379
382 } else { 380 } else {
383 var bindingKey; 381 var bindingKey;
384 382
385 for (bindingKey in aConfiguration['legacyBindingData']) { 383 for (bindingKey in aConfiguration['legacyBindingData']) {
386 var newBinding; 384 var newBinding;
387 385
388 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldName:aConfiguration['legacyBindingData'][bindingKey]}); 386 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldName:aConfiguration['legacyBindingData'][bindingKey]});
389 aConfiguration['_bindings'][newBinding.key()] = newBinding; 387 aConfiguration['_bindings'][newBinding.key()] = newBinding;
390 } 388 }
391 } 389 }
392* / 390* /
393 391
394 return fixedConfiguration; 392 return fixedConfiguration;
395 }, 393 },
396 394
397 //------------------------------------------------------------------------- 395 //-------------------------------------------------------------------------
398 396
399 'getObjectDataStore': function () { 397 'getObjectDataStore': function () {
400 var deferredResult; 398 var deferredResult;
401 399
402 deferredResult = new Clipperz.Async.Deferred("DirectLogin.getObjectDataStore", {trace:false}); 400 deferredResult = new Clipperz.Async.Deferred("DirectLogin.getObjectDataStore", {trace:false});
403 deferredResult.acquireLock(this.objectDataStoreDeferredLock()); 401 deferredResult.acquireLock(this.objectDataStoreDeferredLock());
404 deferredResult.addCallback(MochiKit.Base.bind(function () { 402 deferredResult.addCallback(MochiKit.Base.bind(function () {
405 var innerDeferredResult; 403 var innerDeferredResult;
406 404
407 if (this._objectDataStore == null) { 405 if (this._objectDataStore == null) {
408 this._objectDataStore = new Clipperz.KeyValueObjectStore(); 406 this._objectDataStore = new Clipperz.KeyValueObjectStore();
409 407
410 innerDeferredResult = new Clipperz.Async.Deferred("DirectLogin.getObjectDataStore <inner deferred>", {trace:false}); 408 innerDeferredResult = new Clipperz.Async.Deferred("DirectLogin.getObjectDataStore <inner deferred>", {trace:false});
411 // innerDeferredResult.addMethod(this.record(), 'getValue', 'directLogins' + '.' + this.reference()); 409 // innerDeferredResult.addMethod(this.record(), 'getValue', 'directLogins' + '.' + this.reference());
412 innerDeferredResult.addMethod(this, 'getValue', ''), 410 innerDeferredResult.addMethod(this, 'getValue', ''),
413 innerDeferredResult.addMethod(this, 'setOriginalState'); 411 innerDeferredResult.addMethod(this, 'setOriginalState');
414 innerDeferredResult.addMethod(this, '_fixConfiguration'); 412 innerDeferredResult.addMethod(this, '_fixConfiguration');
415 innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues'); 413 innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues');
416 // innerDeferredResult.addMethod(this._objectDataStore, 'setValues'); 414 // innerDeferredResult.addMethod(this._objectDataStore, 'setValues');
417 innerDeferredResult.callback(); 415 innerDeferredResult.callback();
418 } else { 416 } else {
419 innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore); 417 innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore);
420 } 418 }
421 419
422 return innerDeferredResult; 420 return innerDeferredResult;
423 }, this)); 421 }, this));
424 deferredResult.releaseLock(this.objectDataStoreDeferredLock()); 422 deferredResult.releaseLock(this.objectDataStoreDeferredLock());
425 deferredResult.callback(); 423 deferredResult.callback();
426 424
427 return deferredResult; 425 return deferredResult;
428 }, 426 },
429 427
430 //------------------------------------------------------------------------- 428 //-------------------------------------------------------------------------
431 429
432 'hasInitiatedObjectDataStore': function () { 430 'hasInitiatedObjectDataStore': function () {
433 return (this._objectDataStore != null); 431 return (this._objectDataStore != null);
434 }, 432 },
435 433
436 //------------------------------------------------------------------------- 434 //-------------------------------------------------------------------------
437 435
438 'resetObjectDataStore': function () { 436 'resetObjectDataStore': function () {
439 this._objectDataStore.removeAllData(); 437 this._objectDataStore.removeAllData();
440 this._objectDataStore = null; 438 this._objectDataStore = null;
441 }, 439 },
442*/ 440*/
443 //========================================================================= 441 //=========================================================================
444 442
445 'bookmarkletConfiguration': function () { 443 'bookmarkletConfiguration': function () {
446 return Clipperz.Async.callbacks("DirectLogin.bookmarkletConfiguration", [ 444 return Clipperz.Async.callbacks("DirectLogin.bookmarkletConfiguration", [
447 Clipperz.Async.collectResults("DirectLogin.bookmarkletConfiguration <inner results>", { 445 Clipperz.Async.collectResults("DirectLogin.bookmarkletConfiguration <inner results>", {
448 'label': MochiKit.Base.method(this, 'label'), 446 'label': MochiKit.Base.method(this, 'label'),
449 'configuration': MochiKit.Base.method(this, 'getValue', '') 447 'configuration': MochiKit.Base.method(this, 'getValue', '')
450 }, {trace:false}), 448 }, {trace:false}),
451 function (someValues) { 449 function (someValues) {
452 var result; 450 var result;
453 451
454 if (someValues['configuration'] != null) { 452 if (someValues['configuration'] != null) {
455 varconfiguration; 453 varconfiguration;
456 454
457 configuration = { 455 configuration = {
458 'page': { 456 'page': {
459 'title': someValues['label'] 457 'title': someValues['label']
460 //'favicon' 458 //'favicon'
461 // 'url' 459 // 'url'
462 }, 460 },
463 'form': someValues['configuration']['formData'], 461 'form': someValues['configuration']['formData'],
464 'version':someValues['configuration']['bookmarkletVersion'] 462 'version':someValues['configuration']['bookmarkletVersion']
465 } 463 }
466 464
467 result = Clipperz.Base.formatJSON(configuration); 465 result = Clipperz.Base.formatJSON(configuration);
468 } else { 466 } else {
469 result = ''; 467 result = '';
470 } 468 }
471 469
472 return result; 470 return result;
473 } 471 }
474 ], {trace:false}); 472 ], {trace:false});
475 473
476 }, 474 },
477 475
478 //------------------------------------------------------------------------- 476 //-------------------------------------------------------------------------
479 477
480 'setBookmarkletConfiguration': function (aValue) { 478 'setBookmarkletConfiguration': function (aValue) {
481 var bookmarkletConfiguration; 479 var bookmarkletConfiguration;
482 480
483 bookmarkletConfiguration = Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(aValue); 481 bookmarkletConfiguration = Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(aValue);
484//console.log("BOOKMARKLET CONFIGURATION", bookmarkletConfiguration); 482
485 return Clipperz.Async.callbacks("DirectLogin.setBookmarkletConfiguration", [ 483 return Clipperz.Async.callbacks("DirectLogin.setBookmarkletConfiguration", [
486 MochiKit.Base.method(this, 'setValue', 'formData', bookmarkletConfiguration['form']), 484 MochiKit.Base.method(this, 'setValue', 'formData', bookmarkletConfiguration['form']),
487//function (aValue) { console.log("SET VALUE - formData", aValue); return aValue; },
488 MochiKit.Base.method(this, 'setValue', 'bookmarkletVersion', bookmarkletConfiguration['version']), 485 MochiKit.Base.method(this, 'setValue', 'bookmarkletVersion', bookmarkletConfiguration['version']),
489 486
490 MochiKit.Base.method(this, 'favicon'), 487 MochiKit.Base.method(this, 'favicon'),
491 Clipperz.Async.deferredIf("the favicon is not set", [ 488 Clipperz.Async.deferredIf("the favicon is not set", [
492 ], [ 489 ], [
493 MochiKit.Base.method(this, 'faviconUrlWithBookmarkletConfiguration', bookmarkletConfiguration), 490 MochiKit.Base.method(this, 'faviconUrlWithBookmarkletConfiguration', bookmarkletConfiguration),
494 MochiKit.Base.method(this, 'setFavicon') 491 MochiKit.Base.method(this, 'setFavicon')
495 ]), 492 ]),
496 493
497 MochiKit.Base.method(this, 'updateInputsAfterChangingBookmarkletConfiguration'), 494 MochiKit.Base.method(this, 'updateInputsAfterChangingBookmarkletConfiguration'),
498 MochiKit.Base.method(this, 'updateFormValuesAfterChangingBookmarkletConfiguration'), 495 MochiKit.Base.method(this, 'updateFormValuesAfterChangingBookmarkletConfiguration'),
499 MochiKit.Base.method(this, 'updateBindingsAfterChangingBookmarkletConfiguration'), 496 MochiKit.Base.method(this, 'updateBindingsAfterChangingBookmarkletConfiguration'),
500 497
501 MochiKit.Base.noop 498 MochiKit.Base.noop
502 ], {trace:false}); 499 ], {trace:false});
503 }, 500 },
504 501
505 //========================================================================= 502 //=========================================================================
506 503
507 'formAttributes': function () { 504 'formAttributes': function () {
508 return this.getValue('formData.attributes'); 505 return this.getValue('formData.attributes');
509 }, 506 },
510 507
511 //========================================================================= 508 //=========================================================================
512 509
513 'inputs': function () { 510 'inputs': function () {
514 return Clipperz.Async.callbacks("DirectLogin.inputs", [ 511 return Clipperz.Async.callbacks("DirectLogin.inputs", [
515 Clipperz.Async.deferredIf("this._inputs is defined", [ 512 Clipperz.Async.deferredIf("this._inputs is defined", [
516 ], [ 513 ], [
517 MochiKit.Base.method(this, 'updateInputsAfterChangingBookmarkletConfiguration') 514 MochiKit.Base.method(this, 'updateInputsAfterChangingBookmarkletConfiguration')
518 ]) 515 ])
519 ], {trace:false}, this._inputs); 516 ], {trace:false}, this._inputs);
520 }, 517 },
521 518
522 'setInputWithFormDataConfiguration': function (aFormDataConfiguration) { 519 'setInputWithFormDataConfiguration': function (aFormDataConfiguration) {
523 this._inputs = {}; 520 this._inputs = {};
524 521
525 if (aFormDataConfiguration != null) { 522 if (aFormDataConfiguration != null) {
526 MochiKit.Iter.forEach(aFormDataConfiguration['inputs'], MochiKit.Base.bind(function (anInputData) { 523 MochiKit.Iter.forEach(aFormDataConfiguration['inputs'], MochiKit.Base.bind(function (anInputData) {
527 var newInput; 524 var newInput;
528 525
529 newInput = new Clipperz.PM.DataModel.DirectLoginInput(anInputData); 526 newInput = new Clipperz.PM.DataModel.DirectLoginInput(anInputData);
530 this._inputs[newInput.name()] = newInput; 527 this._inputs[newInput.name()] = newInput;
531 }, this)); 528 }, this));
532 } 529 }
533 530
534 return this._inputs; 531 return this._inputs;
535 }, 532 },
536 533
537 'updateInputsAfterChangingBookmarkletConfiguration': function () { 534 'updateInputsAfterChangingBookmarkletConfiguration': function () {
538 return Clipperz.Async.callbacks("DirectLogin.updateInputsAfterChangingBookmarkletConfiguration", [ 535 return Clipperz.Async.callbacks("DirectLogin.updateInputsAfterChangingBookmarkletConfiguration", [
539 // MochiKit.Base.method(this, 'getValue', ''),
540//function (aValue) { console.log("VALUE", aValue); return aValue },
541 MochiKit.Base.method(this, 'getValue', 'formData'), 536 MochiKit.Base.method(this, 'getValue', 'formData'),
542//function (aValue) { console.log("FORM DATA", aValue); return aValue },
543 MochiKit.Base.method(this, 'setInputWithFormDataConfiguration') 537 MochiKit.Base.method(this, 'setInputWithFormDataConfiguration')
544 ], {trace:false}); 538 ], {trace:false});
545 }, 539 },
546 540
547 //========================================================================= 541 //=========================================================================
548 542
549 'inputValues': function () { 543 'inputValues': function () {
550 return Clipperz.Async.callbacks("DirectLogin.inputValues", [ 544 return Clipperz.Async.callbacks("DirectLogin.inputValues", [
551 MochiKit.Base.method(this, 'inputs'), 545 MochiKit.Base.method(this, 'inputs'),
552 MochiKit.Base.values, 546 MochiKit.Base.values,
553 //function (aValue) { console.log("INPUTS", aValue); return aValue; },
554 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.partial(MochiKit.Base.method(this, 'inputValue'))), 547 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.partial(MochiKit.Base.method(this, 'inputValue'))),
555 Clipperz.Async.collectAll, 548 Clipperz.Async.collectAll,
556 Clipperz.Base.mergeItems 549 Clipperz.Base.mergeItems
557 ], {trace:false}); 550 ], {trace:false});
558 }, 551 },
559 552
560 'inputValue': function (anInput) { 553 'inputValue': function (anInput) {
561 vardeferredResult; 554 vardeferredResult;
562 555
563 deferredResult = new Clipperz.Async.Deferred("DirectLogin.inputValue", {trace:false}); 556 deferredResult = new Clipperz.Async.Deferred("DirectLogin.inputValue", {trace:false});
564 557
565 if (anInput.needsFormValue()) { 558 if (anInput.needsFormValue()) {
566 deferredResult.addMethod(this, 'formValues'); 559 deferredResult.addMethod(this, 'formValues');
567 deferredResult.addCallback(MochiKit.Base.itemgetter(anInput.name())); 560 deferredResult.addCallback(MochiKit.Base.itemgetter(anInput.name()));
568 deferredResult.addMethodcaller('value'); 561 deferredResult.addMethodcaller('value');
569 } else if (anInput.needsBinding()) { 562 } else if (anInput.needsBinding()) {
570 deferredResult.addMethod(this, 'bindings'); 563 deferredResult.addMethod(this, 'bindings');
571 deferredResult.addCallback(MochiKit.Base.itemgetter(anInput.name())); 564 deferredResult.addCallback(MochiKit.Base.itemgetter(anInput.name()));
572 deferredResult.addMethodcaller('field'); 565 deferredResult.addMethodcaller('field');
573 deferredResult.addMethodcaller('value'); 566 deferredResult.addMethodcaller('value');
574 } else { 567 } else {
575 deferredResult.addCallback(MochiKit.Async.succeed, anInput.value()); 568 deferredResult.addCallback(MochiKit.Async.succeed, anInput.value());
576 } 569 }
577 deferredResult.addCallback(function (anActualValue) { 570 deferredResult.addCallback(function (anActualValue) {
578 return [anInput.name(), anActualValue]; 571 return [anInput.name(), anActualValue];
579 }); 572 });
580 573
581 deferredResult.callback(); 574 deferredResult.callback();
582 575
583 return deferredResult; 576 return deferredResult;
584 }, 577 },
585 578
586 //========================================================================= 579 //=========================================================================
587 580
588 'bindings': function () { 581 'bindings': function () {
589 return Clipperz.Async.callbacks("DirectLogin.bindings", [ 582 return Clipperz.Async.callbacks("DirectLogin.bindings", [
590 Clipperz.Async.deferredIf("this._bindings is defined", [ 583 Clipperz.Async.deferredIf("this._bindings is defined", [
591 ], [ 584 ], [
592 MochiKit.Base.method(this, 'updateBindingsAfterChangingBookmarkletConfiguration'), 585 MochiKit.Base.method(this, 'updateBindingsAfterChangingBookmarkletConfiguration'),
593 MochiKit.Base.bind(function () { return this._bindings;}, this) 586 MochiKit.Base.bind(function () { return this._bindings;}, this)
594 ]) 587 ])
595 ], {trace:false}, this._bindings); 588 ], {trace:false}, this._bindings);
596 }, 589 },
597 590
598 'bindFormFieldWithLabelToRecordFieldWithLabel': function (aFormFieldLabel, aRecordFieldLabel) { 591 'bindFormFieldWithLabelToRecordFieldWithLabel': function (aFormFieldLabel, aRecordFieldLabel) {
599 return Clipperz.Async.callbacks("DirectLogin.bindFormFieldWithLabelToCardFieldWithLabel", [ 592 return Clipperz.Async.callbacks("DirectLogin.bindFormFieldWithLabelToCardFieldWithLabel", [
600 Clipperz.Async.collectResults("DirectLogin.bindFormFieldWithLabelToCardFieldWithLabel - collect results", { 593 Clipperz.Async.collectResults("DirectLogin.bindFormFieldWithLabelToCardFieldWithLabel - collect results", {
601 'binding': [ 594 'binding': [
602 MochiKit.Base.method(this, 'bindings'), 595 MochiKit.Base.method(this, 'bindings'),
603 MochiKit.Base.itemgetter(aFormFieldLabel) 596 MochiKit.Base.itemgetter(aFormFieldLabel)
604 ], 597 ],
605 'field': [ 598 'field': [
606 MochiKit.Base.method(this.record(), 'fieldWithLabel', aRecordFieldLabel) 599 MochiKit.Base.method(this.record(), 'fieldWithLabel', aRecordFieldLabel)
607 ] 600 ]
608 }), 601 }),
609 function (someValues) { 602 function (someValues) {
610 someValues['binding'].setField(someValues['field']) 603 someValues['binding'].setField(someValues['field'])
611 } 604 }
612 ], {trace:false}); 605 ], {trace:false});
613 }, 606 },
614 607
615 //------------------------------------------------------------------------- 608 //-------------------------------------------------------------------------
616/* 609/*
617 'bindingValues': function () { 610 'bindingValues': function () {
618 return Clipperz.Async.callbacks("DirectLogin.bindingValues", [ 611 return Clipperz.Async.callbacks("DirectLogin.bindingValues", [
619 Clipperz.Async.collectResults("DirectLogin.bindingValues [collectResults]", { 612 Clipperz.Async.collectResults("DirectLogin.bindingValues [collectResults]", {
620 'fieldValues': [ 613 'fieldValues': [
621 MochiKit.Base.method(this, 'record'), 614 MochiKit.Base.method(this, 'record'),
622 MochiKit.Base.methodcaller('getFieldsValues') 615 MochiKit.Base.methodcaller('getFieldsValues')
623 ], 616 ],
624 'bindings': MochiKit.Base.method(this, 'bindings') 617 'bindings': MochiKit.Base.method(this, 'bindings')
625 }, {trace:false}), 618 }, {trace:false}),
626 function (someData) { 619 function (someData) {
627 var result; 620 var result;
628 varbindingKey; 621 varbindingKey;
629 622
630 result = {}; 623 result = {};
631 for (bindingKey in someData['bindings']) { 624 for (bindingKey in someData['bindings']) {
632 result[bindingKey] = someData['fieldValues'][someData['bindings'][bindingKey].fieldKey()]['value']; 625 result[bindingKey] = someData['fieldValues'][someData['bindings'][bindingKey].fieldKey()]['value'];
633 } 626 }
634 627
635 return result; 628 return result;
636 } 629 }
637 ], {trace:false}); 630 ], {trace:false});
638 }, 631 },
639*/ 632*/
640 //------------------------------------------------------------------------- 633 //-------------------------------------------------------------------------
641 634
642 'updateBindingsAfterChangingBookmarkletConfiguration': function () { 635 'updateBindingsAfterChangingBookmarkletConfiguration': function () {
643 return Clipperz.Async.callbacks("DirectLogin.updateBindingsAfterChangingBookmarkletConfiguration", [ 636 return Clipperz.Async.callbacks("DirectLogin.updateBindingsAfterChangingBookmarkletConfiguration", [
644 Clipperz.Async.collectResults("DirectLogin.updateBindingsAfterChangingBookmarkletConfiguration<collect results>", { 637 Clipperz.Async.collectResults("DirectLogin.updateBindingsAfterChangingBookmarkletConfiguration<collect results>", {
645 'currentValues':MochiKit.Base.method(this, 'getValue', ''), 638 'currentValues':MochiKit.Base.method(this, 'getValue', ''),
646 'originalValues':MochiKit.Base.method(this, 'originalConfiguration'), 639 'originalValues':MochiKit.Base.method(this, 'originalConfiguration'),
647 'inputs': MochiKit.Base.method(this, 'inputs') 640 'inputs': MochiKit.Base.method(this, 'inputs')
648 }, {trace:false}), 641 }, {trace:false}),
649 MochiKit.Base.bind(function (someValues) { 642 MochiKit.Base.bind(function (someValues) {
650 var availableBindingValues; 643 var availableBindingValues;
651 var inputRequiringBindingValues; 644 var inputRequiringBindingValues;
652 var newBindingValues; 645 var newBindingValues;
653 646
654 if (MochiKit.Base.isUndefinedOrNull(someValues['originalValues']) || MochiKit.Base.isUndefinedOrNull(someValues['originalValues']['bindingData'])) { 647 if (MochiKit.Base.isUndefinedOrNull(someValues['originalValues']) || MochiKit.Base.isUndefinedOrNull(someValues['originalValues']['bindingData'])) {
655 availableBindingValues = {}; 648 availableBindingValues = {};
656 } else { 649 } else {
657 availableBindingValues = Clipperz.Base.deepClone(someValues['originalValues']['bindingData']) 650 availableBindingValues = Clipperz.Base.deepClone(someValues['originalValues']['bindingData'])
658 } 651 }
659 652
660 if (someValues['currentValues'] != null) { 653 if (someValues['currentValues'] != null) {
661 MochiKit.Base.update(availableBindingValues, someValues['currentValues']['bindingData']); 654 MochiKit.Base.update(availableBindingValues, someValues['currentValues']['bindingData']);
662 } 655 }
663 656
664 this._bindings = {}; 657 this._bindings = {};
665 newBindingValues = {} 658 newBindingValues = {}
666 MochiKit.Iter.forEach(MochiKit.Base.filter(MochiKit.Base.methodcaller('needsBinding'), MochiKit.Base.values(someValues['inputs'])), MochiKit.Base.bind(function (anInput) { 659 MochiKit.Iter.forEach(MochiKit.Base.filter(MochiKit.Base.methodcaller('needsBinding'), MochiKit.Base.values(someValues['inputs'])), MochiKit.Base.bind(function (anInput) {
667 varnewBinding; 660 varnewBinding;
668 661
669 newBindingValues[anInput.name()] = availableBindingValues[anInput.name()]; 662 newBindingValues[anInput.name()] = availableBindingValues[anInput.name()];
670 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, { 663 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, {
671 'key': anInput.name(), 664 'key': anInput.name(),
672 'field':availableBindingValues[anInput.name()] 665 'field':availableBindingValues[anInput.name()]
673 }); 666 });
674 667
675 this._bindings[anInput.name()] = newBinding; 668 this._bindings[anInput.name()] = newBinding;
676 }, this)) 669 }, this))
677//console.log("THIS._BINDINGS", this._bindings);
678 670
679 return newBindingValues; 671 return newBindingValues;
680 672
681/* 673/*
682 this._bindings = {}; 674 this._bindings = {};
683//console.log("CONFIGURATION", aConfiguration);
684 675
685 if (someValues['currentValues'] != null) { 676 if (someValues['currentValues'] != null) {
686 if (someValues['currentValues']['bindingData'] != null) { 677 if (someValues['currentValues']['bindingData'] != null) {
687 var bindingKey; 678 var bindingKey;
688 679
689//console.log("BINDING DATA", someValues['currentValues']['bindingData']);
690 for (bindingKey in someValues['currentValues']['bindingData']) { 680 for (bindingKey in someValues['currentValues']['bindingData']) {
691 var newBinding; 681 var newBinding;
692 682
693 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, { 683 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, {
694 'key': bindingKey, 684 'key': bindingKey,
695 'field':someValues['currentValues']['bindingData'][bindingKey] 685 'field':someValues['currentValues']['bindingData'][bindingKey]
696 }); 686 });
697 this._bindings[newBinding.key()] = newBinding; 687 this._bindings[newBinding.key()] = newBinding;
698 } 688 }
699 } else if (someValues['currentValues']['legacyBindingData'] == null) { 689 } else if (someValues['currentValues']['legacyBindingData'] == null) {
700 var bindingKey; 690 var bindingKey;
701 691
702 for (bindingKey in someValues['currentValues']['legacyBindingData']) { 692 for (bindingKey in someValues['currentValues']['legacyBindingData']) {
703 var newBinding; 693 var newBinding;
704 694
705 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, { 695 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, {
706 'key': bindingKey, 696 'key': bindingKey,
707 'field':someValues['currentValues']['legacyBindingData'][bindingKey] 697 'field':someValues['currentValues']['legacyBindingData'][bindingKey]
708 }); 698 });
709 this._bindings[newBinding.key()] = newBinding; 699 this._bindings[newBinding.key()] = newBinding;
710 } 700 }
711 } else { 701 } else {
712 WTF = TODO; 702 WTF = TODO;
713 } 703 }
714 } 704 }
715 705
716 return this._bindings; 706 return this._bindings;
717*/ 707*/
718 }, this), 708 }, this),
719 MochiKit.Base.method(this, 'setValue', 'bindingData') 709 MochiKit.Base.method(this, 'setValue', 'bindingData')
720 ], {trace:false}); 710 ], {trace:false});
721 }, 711 },
722 712
723 //========================================================================= 713 //=========================================================================
724 714
725 'formValues': function () { 715 'formValues': function () {
726 return Clipperz.Async.callbacks("DirectLogin.formValues", [ 716 return Clipperz.Async.callbacks("DirectLogin.formValues", [
727 Clipperz.Async.deferredIf("this._formValues is defined", [ 717 Clipperz.Async.deferredIf("this._formValues is defined", [
728 ], [ 718 ], [
729 MochiKit.Base.method(this, 'updateFormValuesAfterChangingBookmarkletConfiguration'), 719 MochiKit.Base.method(this, 'updateFormValuesAfterChangingBookmarkletConfiguration'),
730 MochiKit.Base.bind(function () { return this._formValues;}, this) 720 MochiKit.Base.bind(function () { return this._formValues;}, this)
731 ]) 721 ])
732 ], {trace:false}, this._formValues); 722 ], {trace:false}, this._formValues);
733 }, 723 },
734 724
735 //------------------------------------------------------------------------- 725 //-------------------------------------------------------------------------
736 726
737 'updateFormValuesAfterChangingBookmarkletConfiguration': function () { 727 'updateFormValuesAfterChangingBookmarkletConfiguration': function () {
738 return Clipperz.Async.callbacks("DirectLogin.updateFormValuesAfterChangingBookmarkletConfiguration", [ 728 return Clipperz.Async.callbacks("DirectLogin.updateFormValuesAfterChangingBookmarkletConfiguration", [
739 Clipperz.Async.collectResults("DirectLogin.updateFormValuesAfterChangingBookmarkletConfiguration <collect results>", { 729 Clipperz.Async.collectResults("DirectLogin.updateFormValuesAfterChangingBookmarkletConfiguration <collect results>", {
740 'currentValues':MochiKit.Base.method(this, 'getValue', ''), 730 'currentValues':MochiKit.Base.method(this, 'getValue', ''),
741 'originalValues':MochiKit.Base.method(this, 'originalConfiguration'), 731 'originalValues':MochiKit.Base.method(this, 'originalConfiguration'),
742 'inputs': MochiKit.Base.method(this, 'inputs') 732 'inputs': MochiKit.Base.method(this, 'inputs')
743 }, {trace:false}), 733 }, {trace:false}),
744 MochiKit.Base.bind(function (someValues) { 734 MochiKit.Base.bind(function (someValues) {
745 var availableFormValues; 735 var availableFormValues;
746 var inputRequiringFormValues; 736 var inputRequiringFormValues;
747 var newFormValues; 737 var newFormValues;
748 738
749 if (MochiKit.Base.isUndefinedOrNull(someValues['originalValues']) || MochiKit.Base.isUndefinedOrNull(someValues['originalValues']['formValues'])) { 739 if (MochiKit.Base.isUndefinedOrNull(someValues['originalValues']) || MochiKit.Base.isUndefinedOrNull(someValues['originalValues']['formValues'])) {
750 availableFormValues = {}; 740 availableFormValues = {};
751 } else { 741 } else {
752 availableFormValues = Clipperz.Base.deepClone(someValues['originalValues']['formValues']) 742 availableFormValues = Clipperz.Base.deepClone(someValues['originalValues']['formValues'])
753 } 743 }
754 744
755 MochiKit.Base.update(availableFormValues, someValues['currentValues']['formValues']); 745 MochiKit.Base.update(availableFormValues, someValues['currentValues']['formValues']);
756 746
757 this._formValues = {}; 747 this._formValues = {};
758 newFormValues = {}; 748 newFormValues = {};
759 MochiKit.Iter.forEach(MochiKit.Base.filter(MochiKit.Base.methodcaller('needsFormValue'), MochiKit.Base.values(someValues['inputs'])), MochiKit.Base.bind(function (anInput) { 749 MochiKit.Iter.forEach(MochiKit.Base.filter(MochiKit.Base.methodcaller('needsFormValue'), MochiKit.Base.values(someValues['inputs'])), MochiKit.Base.bind(function (anInput) {
760 varnewFormValue; 750 varnewFormValue;
761 var fieldOptions; 751 var fieldOptions;
762 752
763 fieldOptions = { 753 fieldOptions = {
764 'type': anInput.type(), 754 'type': anInput.type(),
765 'options':anInput.options() 755 'options':anInput.options()
766 }; 756 };
767 757
768 newFormValues[anInput.name()] = availableFormValues[anInput.name()] 758 newFormValues[anInput.name()] = availableFormValues[anInput.name()]
769 newFormValue = new Clipperz.PM.DataModel.DirectLoginFormValue(this, { 759 newFormValue = new Clipperz.PM.DataModel.DirectLoginFormValue(this, {
770 'key': anInput.name(), 760 'key': anInput.name(),
771 'fieldOptions':fieldOptions, 761 'fieldOptions':fieldOptions,
772 'value': availableFormValues[anInput.name()] 762 'value': availableFormValues[anInput.name()]
773 }); 763 });
774 764
775 this._formValues[anInput.name()] = newFormValue; 765 this._formValues[anInput.name()] = newFormValue;
776 }, this)) 766 }, this))
777 767
778 return newFormValues; 768 return newFormValues;
779 }, this), 769 }, this),
780 MochiKit.Base.method(this, 'setValue', 'formValues') 770 MochiKit.Base.method(this, 'setValue', 'formValues')
781 ], {trace:false}); 771 ], {trace:false});
782 }, 772 },
783 773
784 //========================================================================= 774 //=========================================================================
785 775
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js
index 4377853..a8ebb97 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 26if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
29 27
30 28
31//############################################################################# 29//#############################################################################
32 30
33Clipperz.PM.DataModel.DirectLoginBinding = function(aDirectLogin, args) { 31Clipperz.PM.DataModel.DirectLoginBinding = function(aDirectLogin, args) {
34 args = args || {}; 32 args = args || {};
35 33
36 this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter');
37 35
38 this._key = args.key|| Clipperz.Base.exception.raise('MandatoryParameter'); 36 this._key = args.key|| Clipperz.Base.exception.raise('MandatoryParameter');
39 this._fieldKey = args.field || /* this.directLogin().fieldWithName(args.fieldName).reference() || */null; 37 this._fieldKey = args.field || /* this.directLogin().fieldWithName(args.fieldName).reference() || */null;
40 38
41 return this; 39 return this;
42} 40}
43 41
44Clipperz.PM.DataModel.DirectLoginBinding.prototype = MochiKit.Base.update(null, { 42Clipperz.PM.DataModel.DirectLoginBinding.prototype = MochiKit.Base.update(null, {
45 43
46 'toString': function() { 44 'toString': function() {
47 return "DirectLoginBinding (" + this.key() + ", " + this.fieldKey() + ")"; 45 return "DirectLoginBinding (" + this.key() + ", " + this.fieldKey() + ")";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'directLogin': function () { 50 'directLogin': function () {
53 return this._directLogin; 51 return this._directLogin;
54 }, 52 },
55 53
56 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
57 55
58 'key': function() { 56 'key': function() {
59 return this._key; 57 return this._key;
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'fieldKey': function() { 62 'fieldKey': function() {
65 return this._fieldKey; 63 return this._fieldKey;
66 }, 64 },
67 65
68 'setFieldKey': function(aValue) { 66 'setFieldKey': function(aValue) {
69 this._fieldKey = aValue; 67 this._fieldKey = aValue;
70 68
71 return this.directLogin().setValue('bindingData' + '.' + this.key(), aValue); 69 return this.directLogin().setValue('bindingData' + '.' + this.key(), aValue);
72 }, 70 },
73 71
74 //'fieldName': function() { 72 //'fieldName': function() {
75 // return this._fieldName; 73 // return this._fieldName;
76 //}, 74 //},
77 75
78 //------------------------------------------------------------------------- 76 //-------------------------------------------------------------------------
79 77
80 'field': function() { 78 'field': function() {
81 var deferredResult; 79 var deferredResult;
82 80
83 if (this.fieldKey() != null) { 81 if (this.fieldKey() != null) {
84 deferredResult = Clipperz.Async.callbacks("DirectLoginBinding.field [1]", [ 82 deferredResult = Clipperz.Async.callbacks("DirectLoginBinding.field [1]", [
85 MochiKit.Base.method(this.directLogin().record(), 'fields'), 83 MochiKit.Base.method(this.directLogin().record(), 'fields'),
86 MochiKit.Base.itemgetter(this.fieldKey()) 84 MochiKit.Base.itemgetter(this.fieldKey())
87 ], {trace:false}); 85 ], {trace:false});
88 // } else if (this.fieldName() != null) { 86 // } else if (this.fieldName() != null) {
89 // WTF = TODO; 87 // WTF = TODO;
90 // result = this.directLogin().record().fieldWithName(this.fieldName()); 88 // result = this.directLogin().record().fieldWithName(this.fieldName());
91 // 89 //
92 // this.setFieldKey(result.key()); 90 // this.setFieldKey(result.key());
93 } else { 91 } else {
94 deferredResult = MochiKit.Async.succeed(null); 92 deferredResult = MochiKit.Async.succeed(null);
95 } 93 }
96 94
97 return deferredResult; 95 return deferredResult;
98 }, 96 },
99 97
100 'setField': function (aField) { 98 'setField': function (aField) {
101 this.setFieldKey(aField.reference()); 99 this.setFieldKey(aField.reference());
102 }, 100 },
103 101
104 //------------------------------------------------------------------------- 102 //-------------------------------------------------------------------------
105/* 103/*
106 'fieldValue': function () { 104 'fieldValue': function () {
107 return Clipperz.Async.callbacks("DirectLoginBinding.fieldValue", [ 105 return Clipperz.Async.callbacks("DirectLoginBinding.fieldValue", [
108 MochiKit.Base.method('field'), 106 MochiKit.Base.method('field'),
109 MochiKit.Base.methodcaller('value') 107 MochiKit.Base.methodcaller('value')
110 ], {trace:false}); 108 ], {trace:false});
111 }, 109 },
112*/ 110*/
113 //------------------------------------------------------------------------- 111 //-------------------------------------------------------------------------
114 112
115 'serializedData': function() { 113 'serializedData': function() {
116 return this.fieldKey(); 114 return this.fieldKey();
117 }, 115 },
118 116
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js
index a461197..2429f88 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js
@@ -1,104 +1,101 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 26if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
29 27
30 28
31//############################################################################# 29//#############################################################################
32 30
33Clipperz.PM.DataModel.DirectLoginFormValue = function(aDirectLogin, args) { 31Clipperz.PM.DataModel.DirectLoginFormValue = function(aDirectLogin, args) {
34 args = args || {}; 32 args = args || {};
35 33
36 this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter');
37 35
38 this._key = args.key || Clipperz.Base.exception.raise('MandatoryParameter'); 36 this._key = args.key || Clipperz.Base.exception.raise('MandatoryParameter');
39 this._fieldOptions = args.fieldOptions|| Clipperz.Base.exception.raise('MandatoryParameter'); 37 this._fieldOptions = args.fieldOptions|| Clipperz.Base.exception.raise('MandatoryParameter');
40 this._value = args.value || null; 38 this._value = args.value || null;
41 39
42 return this; 40 return this;
43} 41}
44 42
45Clipperz.PM.DataModel.DirectLoginFormValue.prototype = MochiKit.Base.update(null, { 43Clipperz.PM.DataModel.DirectLoginFormValue.prototype = MochiKit.Base.update(null, {
46 44
47 'toString': function() { 45 'toString': function() {
48 return "DirectLoginFormValue (" + this.key() + ", " + this.value() + ")"; 46 return "DirectLoginFormValue (" + this.key() + ", " + this.value() + ")";
49 }, 47 },
50 48
51 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
52 50
53 'directLogin': function () { 51 'directLogin': function () {
54 return this._directLogin; 52 return this._directLogin;
55 }, 53 },
56 54
57 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
58 56
59 'key': function() { 57 'key': function() {
60 return this._key; 58 return this._key;
61 }, 59 },
62 60
63 //------------------------------------------------------------------------- 61 //-------------------------------------------------------------------------
64 62
65 'fieldOptions': function() { 63 'fieldOptions': function() {
66 return this._fieldOptions; 64 return this._fieldOptions;
67 }, 65 },
68 66
69 //------------------------------------------------------------------------- 67 //-------------------------------------------------------------------------
70 68
71 'type': function () { 69 'type': function () {
72 return this.fieldOptions()['type']; 70 return this.fieldOptions()['type'];
73 }, 71 },
74 72
75 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
76 74
77 'value': function() { 75 'value': function() {
78 varresult; 76 varresult;
79 77
80 result = this._value; 78 result = this._value;
81 79
82 // if ((result == null) && (this.type() == 'checkbox')) { 80 // if ((result == null) && (this.type() == 'checkbox')) {
83 // result = false; 81 // result = false;
84 // }; 82 // };
85 83
86 return result; 84 return result;
87 }, 85 },
88 86
89 'setValue': function (aValue) { 87 'setValue': function (aValue) {
90//console.log("DirectLoginFormValue.setValue", aValue);
91 this._value = aValue; 88 this._value = aValue;
92 return this.directLogin().setValue('formValues' + '.' + this.key(), aValue); 89 return this.directLogin().setValue('formValues' + '.' + this.key(), aValue);
93 }, 90 },
94 91
95 //------------------------------------------------------------------------- 92 //-------------------------------------------------------------------------
96/* 93/*
97 'serializedData': function() { 94 'serializedData': function() {
98 return this.value(); 95 return this.value();
99 }, 96 },
100*/ 97*/
101 //------------------------------------------------------------------------- 98 //-------------------------------------------------------------------------
102 __syntaxFix__: "syntax fix" 99 __syntaxFix__: "syntax fix"
103}); 100});
104 101
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js
index 8188389..d9995fc 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js
@@ -1,200 +1,192 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 26if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
29 27
30//############################################################################# 28//#############################################################################
31 29
32Clipperz.PM.DataModel.DirectLoginInput = function(args) { 30Clipperz.PM.DataModel.DirectLoginInput = function(args) {
33 this._args = args; 31 this._args = args;
34 32
35 return this; 33 return this;
36} 34}
37 35
38Clipperz.PM.DataModel.DirectLoginInput.prototype = MochiKit.Base.update(null, { 36Clipperz.PM.DataModel.DirectLoginInput.prototype = MochiKit.Base.update(null, {
39 37
40 'args': function() { 38 'args': function() {
41 return this._args; 39 return this._args;
42 }, 40 },
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'name': function() { 44 'name': function() {
47 return this.args()['name']; 45 return this.args()['name'];
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'type': function() { 50 'type': function() {
53 var result; 51 var result;
54 52
55 result = this.args()['type']; 53 result = this.args()['type'];
56 54
57 if (result != null) { 55 if (result != null) {
58 result = result.toLowerCase(); 56 result = result.toLowerCase();
59 } 57 }
60 return result; 58 return result;
61 }, 59 },
62 60
63 //------------------------------------------------------------------------- 61 //-------------------------------------------------------------------------
64 62
65 'options': function() { 63 'options': function() {
66 return this.args()['options']; 64 return this.args()['options'];
67 }, 65 },
68 66
69 //------------------------------------------------------------------------- 67 //-------------------------------------------------------------------------
70 68
71 'value': function() { 69 'value': function() {
72 return this.args()['value']; 70 return this.args()['value'];
73 }, 71 },
74 72
75 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
76 /* 74 /*
77 'formConfiguration': function(someFormValues, someBindings, someFields) { 75 'formConfiguration': function(someFormValues, someBindings, someFields) {
78 var result; 76 var result;
79//console.log("### DirectLoginInput.formConfiguration", someFields); 77
80 if (this.shouldSetValue()) { 78 if (this.shouldSetValue()) {
81 switch (this.type()) { 79 switch (this.type()) {
82 case 'select': 80 case 'select':
83 var currentValue; 81 var currentValue;
84 var options; 82 var options;
85 83
86 // currentValue = this.directLogin()._configuration['formValues'][this.name()]; 84 // currentValue = this.directLogin()._configuration['formValues'][this.name()];
87 currentValue = someFormValues[this.name()]; 85 currentValue = someFormValues[this.name()];
88 options = this.args()['options']; 86 options = this.args()['options'];
89 87
90 result = MochiKit.DOM.SELECT({name:this.name()}, 88 result = MochiKit.DOM.SELECT({name:this.name()},
91 MochiKit.Base.map(function(anOption) { 89 MochiKit.Base.map(function(anOption) {
92 var options; 90 var options;
93 91
94 options = {value:anOption['value']}; 92 options = {value:anOption['value']};
95 if (currentValue == anOption['value']) { 93 if (currentValue == anOption['value']) {
96 options.selected = true; 94 options.selected = true;
97 } 95 }
98 96
99 return MochiKit.DOM.OPTION(options, anOption['label']) 97 return MochiKit.DOM.OPTION(options, anOption['label'])
100 }, options) 98 }, options)
101 ) 99 )
102 break; 100 break;
103 case 'checkbox': 101 case 'checkbox':
104 var options; 102 var options;
105 103
106 options = {type:'checkbox', name: this.name()}; 104 options = {type:'checkbox', name: this.name()};
107 // if (this.directLogin()._configuration['formValues'][this.name()] == true) { 105 // if (this.directLogin()._configuration['formValues'][this.name()] == true) {
108 if (someFormValues[this.name()] == true) { 106 if (someFormValues[this.name()] == true) {
109 options['checked'] = true; 107 options['checked'] = true;
110 }; 108 };
111 109
112 result = MochiKit.DOM.INPUT(options, null); 110 result = MochiKit.DOM.INPUT(options, null);
113 break; 111 break;
114 case 'radio': 112 case 'radio':
115 var currentName; 113 var currentName;
116 var currentValue; 114 var currentValue;
117 var options; 115 var options;
118 116
119 currentName = this.name(); 117 currentName = this.name();
120 // currentValue = this.directLogin()._configuration['formValues'][this.name()]; 118 // currentValue = this.directLogin()._configuration['formValues'][this.name()];
121 currentValue = someFormValues[this.name()]; 119 currentValue = someFormValues[this.name()];
122 options = this.args()['options']; 120 options = this.args()['options'];
123 121
124 result = MochiKit.DOM.DIV(null, 122 result = MochiKit.DOM.DIV(null,
125 MochiKit.Base.map(function(anOption) { 123 MochiKit.Base.map(function(anOption) {
126 var options; 124 var options;
127 var isChecked; 125 var isChecked;
128 var inputNode; 126 var inputNode;
129 var divNode; 127 var divNode;
130 128
131 options = {type:'radio', name:currentName, value:anOption['value']} 129 options = {type:'radio', name:currentName, value:anOption['value']}
132 isChecked = (currentValue == anOption['value']); 130 isChecked = (currentValue == anOption['value']);
133 if (isChecked) { 131 if (isChecked) {
134 options.checked = true; 132 options.checked = true;
135 } 133 }
136 134
137 if (Clipperz_IEisBroken == true) { 135 if (Clipperz_IEisBroken == true) {
138 var checkedValue; 136 var checkedValue;
139 137
140 checkedValue = (isChecked ? " CHECKED" : ""); 138 checkedValue = (isChecked ? " CHECKED" : "");
141 inputNode = MochiKit.DOM.currentDocument().createElement("<INPUT TYPE='RADIO' NAME='" + currentName + "' VALUE='" + anOption['value'] + "'" + checkedValue + ">"); 139 inputNode = MochiKit.DOM.currentDocument().createElement("<INPUT TYPE='RADIO' NAME='" + currentName + "' VALUE='" + anOption['value'] + "'" + checkedValue + ">");
142 } else { 140 } else {
143 inputNode = MochiKit.DOM.INPUT(options, anOption['value']); 141 inputNode = MochiKit.DOM.INPUT(options, anOption['value']);
144 } 142 }
145 divNode = MochiKit.DOM.DIV(null, inputNode); 143 divNode = MochiKit.DOM.DIV(null, inputNode);
146 144
147 return divNode; 145 return divNode;
148 }, options) 146 }, options)
149 ); 147 );
150 break; 148 break;
151 } 149 }
152 } else { 150 } else {
153 var binding; 151 var binding;
154 // binding = this.directLogin().bindings()[this.name()]; 152 // binding = this.directLogin().bindings()[this.name()];
155 binding = someBindings[this.name()]; 153 binding = someBindings[this.name()];
156 154
157//console.log("### binding", binding);
158//if (binding != null) {
159 ///console.log(" binding.field()", binding.field());
160 ///console.log(" binding.field().value()", binding.field().value());
161 //console.log(" someFields[binding.fieldKey()].value()", someFields[binding.fieldKey()].value());
162//}
163 result = MochiKit.DOM.INPUT({ 155 result = MochiKit.DOM.INPUT({
164 type:((this.type() != 'password') ? this.type() : 'text'), 156 type:((this.type() != 'password') ? this.type() : 'text'),
165 name:this.name(), 157 name:this.name(),
166 // value:((binding != null)? binding.field().value() : this.value()) 158 // value:((binding != null)? binding.field().value() : this.value())
167 value:((binding != null)? someFields[binding.fieldKey()]['value'] : this.value()) 159 value:((binding != null)? someFields[binding.fieldKey()]['value'] : this.value())
168 // value:((binding != null)? someFields[binding.fieldKey()].value() : this.value()) 160 // value:((binding != null)? someFields[binding.fieldKey()].value() : this.value())
169 }, null); 161 }, null);
170 } 162 }
171 163
172 return result; 164 return result;
173 }, 165 },
174 */ 166 */
175 //------------------------------------------------------------------------- 167 //-------------------------------------------------------------------------
176 168
177 'needsFormValue': function() { 169 'needsFormValue': function() {
178 var type; 170 var type;
179 var result; 171 var result;
180 172
181 type = this.type(); 173 type = this.type();
182 result = ((type == 'checkbox') || (type == 'radio') || (type == 'select')); 174 result = ((type == 'checkbox') || (type == 'radio') || (type == 'select'));
183 175
184 return result; 176 return result;
185 }, 177 },
186 178
187 'needsBinding': function() { 179 'needsBinding': function() {
188 var type; 180 var type;
189 var result; 181 var result;
190 182
191 type = this.type(); 183 type = this.type();
192 result = ((type == 'text') || (type == 'password')); 184 result = ((type == 'text') || (type == 'password'));
193 185
194 return result; 186 return result;
195 }, 187 },
196 188
197 //------------------------------------------------------------------------- 189 //-------------------------------------------------------------------------
198 __syntaxFix__: "syntax fix" 190 __syntaxFix__: "syntax fix"
199}); 191});
200 192
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js b/frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js
index cdeec8b..1aa7a52 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.KeyValueObjectStore) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.KeyValueObjectStore) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.PM.DataModel.EncryptedRemoteObject depends on Clipperz.KeyValueObjectStore!"; 25 throw "Clipperz.PM.DataModel.EncryptedRemoteObject depends on Clipperz.KeyValueObjectStore!";
28} 26}
29 27
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 28if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 29if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
32 30
33Clipperz.PM.DataModel.EncryptedRemoteObject = function(args) { 31Clipperz.PM.DataModel.EncryptedRemoteObject = function(args) {
34 args = args || {}; 32 args = args || {};
35 33
36 this._name = args.name || null; 34 this._name = args.name || null;
37 this._reference = args.reference || Clipperz.PM.Crypto.randomKey(); 35 this._reference = args.reference || Clipperz.PM.Crypto.randomKey();
38 this._isBrandNew = ((args.reference == null) && (args.remoteData == null)); 36 this._isBrandNew = ((args.reference == null) && (args.remoteData == null));
39 37
40 if ((this._isBrandNew == false) && (args['retrieveKeyFunction'] == null)) { 38 if ((this._isBrandNew == false) && (args['retrieveKeyFunction'] == null)) {
41 Clipperz.Base.exception.raise('MandatoryParameter'); 39 Clipperz.Base.exception.raise('MandatoryParameter');
42 } else { 40 } else {
43 this._retrieveKeyFunction = args['retrieveKeyFunction']; 41 this._retrieveKeyFunction = args['retrieveKeyFunction'];
44 } 42 }
45 43
46 this._retrieveRemoteDataFunction = args.retrieveRemoteDataFunction|| null; 44 this._retrieveRemoteDataFunction = args.retrieveRemoteDataFunction|| null;
47 this._remoteData = args.remoteData || null; 45 this._remoteData = args.remoteData || null;
48 // this._remoteData = args.remoteData ? Clipperz.Base.deepClone(args.remoteData) : null; 46 // this._remoteData = args.remoteData ? Clipperz.Base.deepClone(args.remoteData) : null;
49 if ((!this._isBrandNew) && ((this._retrieveRemoteDataFunction == null) && (this._remoteData == null))) { 47 if ((!this._isBrandNew) && ((this._retrieveRemoteDataFunction == null) && (this._remoteData == null))) {
50 Clipperz.Base.exception.raise('MandatoryParameter'); 48 Clipperz.Base.exception.raise('MandatoryParameter');
51 } 49 }
52 50
53 51
54 this._encryptedDataKeypath = args.encryptedDataKeypath || 'data'; //Clipperz.Base.exception.raise('MandatoryParameter'); 52 this._encryptedDataKeypath = args.encryptedDataKeypath || 'data'; //Clipperz.Base.exception.raise('MandatoryParameter');
55 this._encryptedVersionKeypath = args.encryptedVersionKeypath || 'version';//Clipperz.Base.exception.raise('MandatoryParameter'); 53 this._encryptedVersionKeypath = args.encryptedVersionKeypath || 'version';//Clipperz.Base.exception.raise('MandatoryParameter');
56 54
57 55
58 this._transientState = null; 56 this._transientState = null;
59 this._deferredLocks = {}; 57 this._deferredLocks = {};
60 58
61 if (this._isBrandNew == true) { 59 if (this._isBrandNew == true) {
62 this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [1]'}*/); 60 this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [1]'}*/);
63 } else { 61 } else {
64 this._objectDataStore = null; 62 this._objectDataStore = null;
65 } 63 }
66 64
67 return this; 65 return this;
68} 66}
69 67
70// 68//
71 // Basic data workflow 69 // Basic data workflow
72 //======================= 70 //=======================
73// 71//
74 //getRemoteData 72 //getRemoteData
75 // unpackRemoteData 73 // unpackRemoteData
76 // getDecryptData [encryptedDataKeypath, encryptedVersionKeypath] 74 // getDecryptData [encryptedDataKeypath, encryptedVersionKeypath]
77 // unpackData 75 // unpackData
78 // 76 //
79 // 77 //
80 // ?? packData 78 // ?? packData
81 // ?? encryptDataWithKey 79 // ?? encryptDataWithKey
82 // ??packRemoteData [encryptedDataKeypath (?), encryptedVersionKeypath (?)] 80 // ??packRemoteData [encryptedDataKeypath (?), encryptedVersionKeypath (?)]
83// 81//
84 82
85Clipperz.PM.DataModel.EncryptedRemoteObject.prototype = MochiKit.Base.update(null, { 83Clipperz.PM.DataModel.EncryptedRemoteObject.prototype = MochiKit.Base.update(null, {
86 84
87 'toString': function () { 85 'toString': function () {
88 return "Clipperz.PM.DataModel.EncryptedRemoteObject" + (this.name() != null ? " - " + this.name() : ""); 86 return "Clipperz.PM.DataModel.EncryptedRemoteObject" + (this.name() != null ? " - " + this.name() : "");
89 }, 87 },
90 88
91 //------------------------------------------------------------------------- 89 //-------------------------------------------------------------------------
92 90
93 'name': function () { 91 'name': function () {
94 return this._name; 92 return this._name;
95 }, 93 },
96 94
97 //------------------------------------------------------------------------- 95 //-------------------------------------------------------------------------
98 96
99 'reference': function () { 97 'reference': function () {
100 return this._reference; 98 return this._reference;
101 }, 99 },
102 100
103 'setReference': function (aValue) { 101 'setReference': function (aValue) {
104 this._reference = aValue; 102 this._reference = aValue;
105 103
106 return this._reference; 104 return this._reference;
107 }, 105 },
108 106
109 //------------------------------------------------------------------------- 107 //-------------------------------------------------------------------------
110 108
111 'transientState': function () { 109 'transientState': function () {
112 if (this._transientState == null) { 110 if (this._transientState == null) {
113 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.transientState [2]'}*/); 111 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.transientState [2]'}*/);
114 } 112 }
115 113
116 return this._transientState; 114 return this._transientState;
117 }, 115 },
118 116
@@ -318,196 +316,192 @@ Clipperz.PM.DataModel.EncryptedRemoteObject.prototype = MochiKit.Base.update(nul
318 MochiKit.Base.method(this, '_getObjectDataStore'), 316 MochiKit.Base.method(this, '_getObjectDataStore'),
319 MochiKit.Base.methodcaller('values') 317 MochiKit.Base.methodcaller('values')
320 ], {trace:false}); 318 ], {trace:false});
321 }, 319 },
322 320
323 'setValues': function (someValues) { 321 'setValues': function (someValues) {
324 return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [ 322 return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [
325 MochiKit.Base.method(this, '_getObjectDataStore'), 323 MochiKit.Base.method(this, '_getObjectDataStore'),
326 MochiKit.Base.methodcaller('setValues', someValues) 324 MochiKit.Base.methodcaller('setValues', someValues)
327 ], {trace:false}); 325 ], {trace:false});
328 }, 326 },
329 327
330 //......................................................................... 328 //.........................................................................
331 329
332 '_getObjectDataStore': function () { 330 '_getObjectDataStore': function () {
333 var deferredResult; 331 var deferredResult;
334 var deferredLock; 332 var deferredLock;
335 333
336 deferredLock = this.getDeferredLockForKey('objectDataStore'); 334 deferredLock = this.getDeferredLockForKey('objectDataStore');
337 335
338 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore", {trace:false}); 336 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore", {trace:false});
339 deferredResult.acquireLock(deferredLock); 337 deferredResult.acquireLock(deferredLock);
340 deferredResult.addCallback(MochiKit.Base.bind(function () { 338 deferredResult.addCallback(MochiKit.Base.bind(function () {
341 var innerDeferredResult; 339 var innerDeferredResult;
342 340
343 if (this._objectDataStore == null) { 341 if (this._objectDataStore == null) {
344 this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [4]'}*/); 342 this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [4]'}*/);
345 343
346 innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore <inner deferred>", {trace:false}); 344 innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore <inner deferred>", {trace:false});
347 innerDeferredResult.addMethod(this, 'getDecryptedData'); 345 innerDeferredResult.addMethod(this, 'getDecryptedData');
348 innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues'); 346 innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues');
349 innerDeferredResult.callback(); 347 innerDeferredResult.callback();
350 } else { 348 } else {
351 innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore); 349 innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore);
352 } 350 }
353 351
354 return innerDeferredResult; 352 return innerDeferredResult;
355 }, this)); 353 }, this));
356 deferredResult.releaseLock(deferredLock); 354 deferredResult.releaseLock(deferredLock);
357 deferredResult.callback(); 355 deferredResult.callback();
358 356
359 return deferredResult; 357 return deferredResult;
360 }, 358 },
361 359
362 'hasInitiatedObjectDataStore': function () { 360 'hasInitiatedObjectDataStore': function () {
363 return (this._objectDataStore != null); 361 return (this._objectDataStore != null);
364 }, 362 },
365 363
366 //------------------------------------------------------------------------- 364 //-------------------------------------------------------------------------
367 365
368 'getDeferredLockForKey': function (aKey) { 366 'getDeferredLockForKey': function (aKey) {
369 var result; 367 var result;
370 368
371 result = this._deferredLocks[aKey]; 369 result = this._deferredLocks[aKey];
372 370
373 if (typeof(result) == 'undefined') { 371 if (typeof(result) == 'undefined') {
374 result = new MochiKit.Async.DeferredLock(); 372 result = new MochiKit.Async.DeferredLock();
375 this._deferredLocks[aKey] = result; 373 this._deferredLocks[aKey] = result;
376 } 374 }
377 375
378 return result; 376 return result;
379 }, 377 },
380 378
381 //------------------------------------------------------------------------- 379 //-------------------------------------------------------------------------
382 380
383 'unpackData': function (someData) { //++ 381 'unpackData': function (someData) { //++
384 return someData; 382 return someData;
385 }, 383 },
386 384
387 'packData': function (someData) { //++ 385 'packData': function (someData) { //++
388 return someData; 386 return someData;
389 }, 387 },
390 388
391 //------------------------------------------------------------------------- 389 //-------------------------------------------------------------------------
392 390
393 'hasPendingChanges': function () { 391 'hasPendingChanges': function () {
394 var deferredResult; 392 var deferredResult;
395 var tempObj = this; 393 var tempObj = this;
396 394
397 if (this.isBrandNew()) { 395 if (this.isBrandNew()) {
398 // deferredResult = MochiKit.Async.succeed(true); 396 // deferredResult = MochiKit.Async.succeed(true);
399 deferredResult = this.hasPendingChangesWhenBrandNew(); 397 deferredResult = this.hasPendingChangesWhenBrandNew();
400 } else if (this.hasInitiatedObjectDataStore()) { 398 } else if (this.hasInitiatedObjectDataStore()) {
401 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.hasPendingChanges", {trace:false}); 399 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.hasPendingChanges", {trace:false});
402 deferredResult.collectResults({ 400 deferredResult.collectResults({
403 'decryptedData': [ 401 'decryptedData': [
404 MochiKit.Base.method(this, 'getDecryptedData'), 402 MochiKit.Base.method(this, 'getDecryptedData'),
405 Clipperz.Base.serializeJSON 403 Clipperz.Base.serializeJSON
406 ], 404 ],
407 'objectData': [ 405 'objectData': [
408 MochiKit.Base.method(this, '_getObjectDataStore'), 406 MochiKit.Base.method(this, '_getObjectDataStore'),
409 MochiKit.Base.methodcaller('values'), 407 MochiKit.Base.methodcaller('values'),
410 Clipperz.Base.serializeJSON 408 Clipperz.Base.serializeJSON
411 ] 409 ]
412 }); 410 });
413 deferredResult.addCallback(function (someValues) { 411 deferredResult.addCallback(function (someValues) {
414//if (someValues['decryptedData'] != someValues['objectData']) {
415 //console.log("ORIGINAL DATA", '[[[' + someValues['decryptedData'] + ']]]');
416 //console.log("CURRENT DATA", '>>>' + someValues['objectData'] + '<<<');
417//}
418 return (someValues['decryptedData'] != someValues['objectData']); 412 return (someValues['decryptedData'] != someValues['objectData']);
419 }); 413 });
420 deferredResult.callback(); 414 deferredResult.callback();
421 } else { 415 } else {
422 deferredResult = MochiKit.Async.succeed(false); 416 deferredResult = MochiKit.Async.succeed(false);
423 } 417 }
424 418
425 return deferredResult; 419 return deferredResult;
426 }, 420 },
427 421
428 'hasPendingChangesWhenBrandNew': function () { 422 'hasPendingChangesWhenBrandNew': function () {
429 return MochiKit.Async.succeed(true); 423 return MochiKit.Async.succeed(true);
430 }, 424 },
431 425
432 //------------------------------------------------------------------------- 426 //-------------------------------------------------------------------------
433 427
434 'commitTransientState': function () { 428 'commitTransientState': function () {
435 var deferredResult; 429 var deferredResult;
436 430
437 // if (this.transientState().getValue('__prepareRemoteData') == true) { 431 // if (this.transientState().getValue('__prepareRemoteData') == true) {
438 if (this.transientState().getValue('packedRemoteData') != null) { 432 if (this.transientState().getValue('packedRemoteData') != null) {
439 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.commitTransientState - prepareRemoteData", [ 433 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.commitTransientState - prepareRemoteData", [
440 MochiKit.Base.bind(function (someData) { 434 MochiKit.Base.bind(function (someData) {
441 this._remoteData = this.transientState().getValue('packedRemoteData'); 435 this._remoteData = this.transientState().getValue('packedRemoteData');
442 }, this), 436 }, this),
443 437
444 MochiKit.Base.method(this, '_getObjectDataStore'), 438 MochiKit.Base.method(this, '_getObjectDataStore'),
445 MochiKit.Base.methodcaller('values'), 439 MochiKit.Base.methodcaller('values'),
446 Clipperz.Base.deepClone, 440 Clipperz.Base.deepClone,
447 MochiKit.Base.method(this.decryptedDataStore(), 'setValue', 'decryptedData'), 441 MochiKit.Base.method(this.decryptedDataStore(), 'setValue', 'decryptedData'),
448 442
449 MochiKit.Base.method(this, 'resetTransientState', true) 443 MochiKit.Base.method(this, 'resetTransientState', true)
450 ], {trace:false}); 444 ], {trace:false});
451 445
452 } else { 446 } else {
453 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.commitTransientState - NO prepareRemoteData", [ 447 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.commitTransientState - NO prepareRemoteData", [
454 MochiKit.Base.method(this, 'resetTransientState', true) 448 MochiKit.Base.method(this, 'resetTransientState', true)
455 ], {trace:false}); 449 ], {trace:false});
456 } 450 }
457 451
458 this._isBrandNew = false; 452 this._isBrandNew = false;
459 453
460 return deferredResult; 454 return deferredResult;
461 }, 455 },
462 456
463 //------------------------------------------------------------------------- 457 //-------------------------------------------------------------------------
464 458
465 'revertChanges': function () { 459 'revertChanges': function () {
466 if (this.hasInitiatedObjectDataStore()) { 460 if (this.hasInitiatedObjectDataStore()) {
467 this._objectDataStore.removeAllData(); 461 this._objectDataStore.removeAllData();
468 this._objectDataStore = null; 462 this._objectDataStore = null;
469 } 463 }
470 this.resetTransientState(false); 464 this.resetTransientState(false);
471 465
472 return MochiKit.Async.succeed(); 466 return MochiKit.Async.succeed();
473 }, 467 },
474 468
475 //------------------------------------------------------------------------- 469 //-------------------------------------------------------------------------
476 470
477 'deleteAllCleanTextData': function () { 471 'deleteAllCleanTextData': function () {
478 var deferredResult; 472 var deferredResult;
479 473
480 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.deleteAllCleanTextData", {trace:false}); 474 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.deleteAllCleanTextData", {trace:false});
481 475
482 deferredResult.addMethod(this, 'resetTransientState', false); 476 deferredResult.addMethod(this, 'resetTransientState', false);
483 477
484 deferredResult.acquireLock(this.getDeferredLockForKey('decryptedData')); 478 deferredResult.acquireLock(this.getDeferredLockForKey('decryptedData'));
485 deferredResult.addCallback(MochiKit.Base.bind(function () { 479 deferredResult.addCallback(MochiKit.Base.bind(function () {
486 if (this._decryptedDataStore != null) { 480 if (this._decryptedDataStore != null) {
487 this._decryptedDataStore.removeAllData(); 481 this._decryptedDataStore.removeAllData();
488 } 482 }
489 }, this)); 483 }, this));
490 deferredResult.releaseLock(this.getDeferredLockForKey('decryptedData')); 484 deferredResult.releaseLock(this.getDeferredLockForKey('decryptedData'));
491 485
492 deferredResult.acquireLock(this.getDeferredLockForKey('objectDataStore')); 486 deferredResult.acquireLock(this.getDeferredLockForKey('objectDataStore'));
493 deferredResult.addCallback(MochiKit.Base.bind(function () { 487 deferredResult.addCallback(MochiKit.Base.bind(function () {
494 if (this._objectDataStore != null) { 488 if (this._objectDataStore != null) {
495 this._objectDataStore.removeAllData(); 489 this._objectDataStore.removeAllData();
496 this._objectDataStore = null; 490 this._objectDataStore = null;
497 } 491 }
498 }, this)); 492 }, this));
499 deferredResult.releaseLock(this.getDeferredLockForKey('objectDataStore')); 493 deferredResult.releaseLock(this.getDeferredLockForKey('objectDataStore'));
500 494
501 deferredResult.callback(); 495 deferredResult.callback();
502 496
503 return deferredResult; 497 return deferredResult;
504 }, 498 },
505 499
506 //......................................................................... 500 //.........................................................................
507 501
508 'hasAnyCleanTextData': function () { 502 'hasAnyCleanTextData': function () {
509 var result; 503 var result;
510 504
511 result = false; 505 result = false;
512 506
513 result = result || (! this.decryptedDataStore().isEmpty()); 507 result = result || (! this.decryptedDataStore().isEmpty());
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js b/frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js
index 834e21b..fbca1ff 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js
@@ -1,354 +1,350 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 26if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
29 27
30 28
31//############################################################################# 29//#############################################################################
32 30
33Clipperz.PM.DataModel.OneTimePassword = function(args) { 31Clipperz.PM.DataModel.OneTimePassword = function(args) {
34 args = args || {}; 32 args = args || {};
35 33
36 //this._user = args['user']; 34 //this._user = args['user'];
37 this._reference = args['reference']|| Clipperz.PM.Crypto.randomKey(); 35 this._reference = args['reference']|| Clipperz.PM.Crypto.randomKey();
38 this._password = args['password']; 36 this._password = args['password'];
39 this._passwordValue = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(args['password']); 37 this._passwordValue = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(args['password']);
40 this._creationDate = args['created'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['created']) : new Date(); 38 this._creationDate = args['created'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['created']) : new Date();
41 this._usageDate = args['used'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['used']) : null; 39 this._usageDate = args['used'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['used']) : null;
42 40
43 this._status = args['status'] || 'ACTIVE'; //'REQUESTED', 'USED', 'DISABLED' 41 this._status = args['status'] || 'ACTIVE'; //'REQUESTED', 'USED', 'DISABLED'
44 this._connectionInfo= null; 42 this._connectionInfo= null;
45 43
46 this._key = null; 44 this._key = null;
47 this._keyChecksum= null; 45 this._keyChecksum= null;
48 46
49 return this; 47 return this;
50} 48}
51 49
52Clipperz.PM.DataModel.OneTimePassword.prototype = MochiKit.Base.update(null, { 50Clipperz.PM.DataModel.OneTimePassword.prototype = MochiKit.Base.update(null, {
53 51
54 'toString': function() { 52 'toString': function() {
55 return "Clipperz.PM.DataModel.OneTimePassword"; 53 return "Clipperz.PM.DataModel.OneTimePassword";
56 }, 54 },
57/* 55/*
58 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
59 57
60 'user': function() { 58 'user': function() {
61 return this._user; 59 return this._user;
62 }, 60 },
63 61
64 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
65 63
66 'password': function() { 64 'password': function() {
67 return this._password; 65 return this._password;
68 }, 66 },
69 67
70 //------------------------------------------------------------------------- 68 //-------------------------------------------------------------------------
71 69
72 'passwordValue': function() { 70 'passwordValue': function() {
73 return this._passwordValue; 71 return this._passwordValue;
74 }, 72 },
75 73
76 //------------------------------------------------------------------------- 74 //-------------------------------------------------------------------------
77 75
78 'creationDate': function() { 76 'creationDate': function() {
79 return this._creationDate; 77 return this._creationDate;
80 }, 78 },
81 79
82 //------------------------------------------------------------------------- 80 //-------------------------------------------------------------------------
83 81
84 'reference': function() { 82 'reference': function() {
85 return this._reference; 83 return this._reference;
86 }, 84 },
87 85
88 //------------------------------------------------------------------------- 86 //-------------------------------------------------------------------------
89 87
90 'key': function() { 88 'key': function() {
91 if (this._key == null) { 89 if (this._key == null) {
92 this._key = Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(this.user().username(), this.passwordValue()); 90 this._key = Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(this.user().username(), this.passwordValue());
93 } 91 }
94 92
95 return this._key; 93 return this._key;
96 }, 94 },
97 95
98 //------------------------------------------------------------------------- 96 //-------------------------------------------------------------------------
99 97
100 'keyChecksum': function() { 98 'keyChecksum': function() {
101 if (this._keyChecksum == null) { 99 if (this._keyChecksum == null) {
102 this._keyChecksum = Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(this.user().username(), this.passwordValue()); 100 this._keyChecksum = Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(this.user().username(), this.passwordValue());
103 } 101 }
104 102
105 return this._keyChecksum; 103 return this._keyChecksum;
106 }, 104 },
107*/ 105*/
108 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
109 107
110 'status': function() { 108 'status': function() {
111 return this._status; 109 return this._status;
112 }, 110 },
113 111
114 'setStatus': function(aValue) { 112 'setStatus': function(aValue) {
115 this._status = aValue; 113 this._status = aValue;
116 }, 114 },
117 115
118 //------------------------------------------------------------------------- 116 //-------------------------------------------------------------------------
119/* 117/*
120 'serializedData': function() { 118 'serializedData': function() {
121 var result; 119 var result;
122 120
123 result = { 121 result = {
124 'password': this.password(), 122 'password': this.password(),
125 'created': this.creationDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.creationDate()) : null, 123 'created': this.creationDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.creationDate()) : null,
126 'used': this.usageDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.usageDate()) : null, 124 'used': this.usageDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.usageDate()) : null,
127 'status': this.status() 125 'status': this.status()
128 }; 126 };
129 127
130 return result; 128 return result;
131 }, 129 },
132 130
133 //------------------------------------------------------------------------- 131 //-------------------------------------------------------------------------
134 132
135 'packedPassphrase': function() { 133 'packedPassphrase': function() {
136 var result; 134 var result;
137 var packedPassphrase; 135 var packedPassphrase;
138 var encodedPassphrase; 136 var encodedPassphrase;
139 varprefixPadding; 137 varprefixPadding;
140 var suffixPadding; 138 var suffixPadding;
141 var getRandomBytes; 139 var getRandomBytes;
142 140
143 getRandomBytes = MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes'); 141 getRandomBytes = MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes');
144 142
145 encodedPassphrase = new Clipperz.ByteArray(this.user().passphrase()).toBase64String(); 143 encodedPassphrase = new Clipperz.ByteArray(this.user().passphrase()).toBase64String();
146//MochiKit.Logging.logDebug("--- encodedPassphrase.length: " + encodedPassphrase.length); 144//Clipperz.logDebug("--- encodedPassphrase.length: " + encodedPassphrase.length);
147 prefixPadding = getRandomBytes(getRandomBytes(1).byteAtIndex(0)).toBase64String(); 145 prefixPadding = getRandomBytes(getRandomBytes(1).byteAtIndex(0)).toBase64String();
148//MochiKit.Logging.logDebug("--- prefixPadding.length: " + prefixPadding.length); 146//Clipperz.logDebug("--- prefixPadding.length: " + prefixPadding.length);
149 suffixPadding = getRandomBytes((500 - prefixPadding.length - encodedPassphrase.length) * 6 / 8).toBase64String(); 147 suffixPadding = getRandomBytes((500 - prefixPadding.length - encodedPassphrase.length) * 6 / 8).toBase64String();
150//MochiKit.Logging.logDebug("--- suffixPadding.length: " + suffixPadding.length); 148//Clipperz.logDebug("--- suffixPadding.length: " + suffixPadding.length);
151//MochiKit.Logging.logDebug("--- total.length: " + (prefixPadding.length + encodedPassphrase.length + suffixPadding.length)); 149//Clipperz.logDebug("--- total.length: " + (prefixPadding.length + encodedPassphrase.length + suffixPadding.length));
152 150
153 packedPassphrase = { 151 packedPassphrase = {
154 'prefix': prefixPadding, 152 'prefix': prefixPadding,
155 'passphrase': encodedPassphrase, 153 'passphrase': encodedPassphrase,
156 'suffix': suffixPadding 154 'suffix': suffixPadding
157 }; 155 };
158 156
159 // result = Clipperz.Base.serializeJSON(packedPassphrase); 157 // result = Clipperz.Base.serializeJSON(packedPassphrase);
160 result = packedPassphrase; 158 result = packedPassphrase;
161//MochiKit.Logging.logDebug("===== OTP packedPassprase: [" + result.length + "]" + result); 159//Clipperz.logDebug("===== OTP packedPassprase: [" + result.length + "]" + result);
162//MochiKit.Logging.logDebug("<<< OneTimePassword.packedPassphrase"); 160//Clipperz.logDebug("<<< OneTimePassword.packedPassphrase");
163 161
164 return result; 162 return result;
165 }, 163 },
166 164
167 //------------------------------------------------------------------------- 165 //-------------------------------------------------------------------------
168 166
169 'encryptedPackedPassphrase': function() { 167 'encryptedPackedPassphrase': function() {
170 return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(this.passwordValue(), this.packedPassphrase()) 168 return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(this.passwordValue(), this.packedPassphrase())
171 }, 169 },
172 170
173 //------------------------------------------------------------------------- 171 //-------------------------------------------------------------------------
174 172
175 'encryptedData': function() { 173 'encryptedData': function() {
176 var deferredResult; 174 var deferredResult;
177 varresult; 175 varresult;
178 176
179//MochiKit.Logging.logDebug(">>> OneTimePassword.encryptedData"); 177//Clipperz.logDebug(">>> OneTimePassword.encryptedData");
180//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - id: " + this.reference()); 178//Clipperz.logDebug("--- OneTimePassword.encryptedData - id: " + this.reference());
181 result = { 179 result = {
182 'reference': this.reference(), 180 'reference': this.reference(),
183 'key': this.key(), 181 'key': this.key(),
184 'keyChecksum': this.keyChecksum(), 182 'keyChecksum': this.keyChecksum(),
185 'data': "", 183 'data': "",
186 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion 184 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion
187 } 185 }
188//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 2: " + Clipperz.Base.serializeJSON(result)); 186//Clipperz.logDebug("--- OneTimePassword.encryptedData - 2: " + Clipperz.Base.serializeJSON(result));
189 deferredResult = new MochiKit.Async.Deferred(); 187 deferredResult = new MochiKit.Async.Deferred();
190//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 3"); 188//Clipperz.logDebug("--- OneTimePassword.encryptedData - 3");
191//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 1: " + res); return res;}); 189//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.encryptedData - 1: " + res); return res;});
192 //# deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion, this.passwordValue(), this.packedPassphrase()); 190 //# deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion, this.passwordValue(), this.packedPassphrase());
193 deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedPackedPassphrase')); 191 deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedPackedPassphrase'));
194//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 4"); 192//Clipperz.logDebug("--- OneTimePassword.encryptedData - 4");
195//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 2: [" + res.length + "]" + res); return res;}); 193//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.encryptedData - 2: [" + res.length + "]" + res); return res;});
196 deferredResult.addCallback(function(aResult, res) { 194 deferredResult.addCallback(function(aResult, res) {
197 aResult['data'] = res; 195 aResult['data'] = res;
198 return aResult; 196 return aResult;
199 }, result); 197 }, result);
200//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 5"); 198//Clipperz.logDebug("--- OneTimePassword.encryptedData - 5");
201//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.encryptedData - 3: " + Clipperz.Base.serializeJSON(res)); return res;}); 199//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.encryptedData - 3: " + Clipperz.Base.serializeJSON(res)); return res;});
202 deferredResult.callback(); 200 deferredResult.callback();
203//MochiKit.Logging.logDebug("--- OneTimePassword.encryptedData - 6"); 201//Clipperz.logDebug("--- OneTimePassword.encryptedData - 6");
204 202
205 return deferredResult; 203 return deferredResult;
206 }, 204 },
207 205
208 //------------------------------------------------------------------------- 206 //-------------------------------------------------------------------------
209 207
210 'saveChanges': function() { 208 'saveChanges': function() {
211 var deferredResult; 209 var deferredResult;
212 varresult; 210 varresult;
213 211
214//MochiKit.Logging.logDebug(">>> OneTimePassword.saveChanges"); 212//Clipperz.logDebug(">>> OneTimePassword.saveChanges");
215 result = {}; 213 result = {};
216 deferredResult = new MochiKit.Async.Deferred(); 214 deferredResult = new MochiKit.Async.Deferred();
217 215
218 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptUserData'); 216 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptUserData');
219 deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData')); 217 deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData'));
220 deferredResult.addCallback(function(aResult, res) { 218 deferredResult.addCallback(function(aResult, res) {
221 aResult['user'] = res; 219 aResult['user'] = res;
222 return aResult; 220 return aResult;
223 }, result); 221 }, result);
224 222
225 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptOTPData'); 223 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptOTPData');
226 deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData')); 224 deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData'));
227 deferredResult.addCallback(function(aResult, res) { 225 deferredResult.addCallback(function(aResult, res) {
228 aResult['oneTimePassword'] = res; 226 aResult['oneTimePassword'] = res;
229 return aResult; 227 return aResult;
230 }, result); 228 }, result);
231 229
232 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_sendingData'); 230 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_sendingData');
233//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 1: " + Clipperz.Base.serializeJSON(res)); return res;}); 231//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.saveChanges - 1: " + Clipperz.Base.serializeJSON(res)); return res;});
234 deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'addNewOneTimePassword'); 232 deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'addNewOneTimePassword');
235 233
236 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_updatingInterface'); 234 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_updatingInterface');
237//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;}); 235//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;});
238 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'OTPUpdated'); 236 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'OTPUpdated');
239 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'oneTimePassword_saveChanges_done', null); 237 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'oneTimePassword_saveChanges_done', null);
240//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;}); 238//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;});
241 deferredResult.callback(); 239 deferredResult.callback();
242//MochiKit.Logging.logDebug("<<< OneTimePassword.saveChanges"); 240//Clipperz.logDebug("<<< OneTimePassword.saveChanges");
243 241
244 return deferredResult; 242 return deferredResult;
245 }, 243 },
246 244
247 //------------------------------------------------------------------------- 245 //-------------------------------------------------------------------------
248 246
249 'usageDate': function() { 247 'usageDate': function() {
250 return this._usageDate; 248 return this._usageDate;
251 }, 249 },
252 250
253 'setUsageDate': function(aValue) { 251 'setUsageDate': function(aValue) {
254 this._usageDate = aValue; 252 this._usageDate = aValue;
255 }, 253 },
256 254
257 //------------------------------------------------------------------------- 255 //-------------------------------------------------------------------------
258 256
259 'connectionInfo': function() { 257 'connectionInfo': function() {
260 return this._connectionInfo; 258 return this._connectionInfo;
261 }, 259 },
262 260
263 'setConnectionInfo': function(aValue) { 261 'setConnectionInfo': function(aValue) {
264 this._connectionInfo = aValue; 262 this._connectionInfo = aValue;
265 }, 263 },
266 264
267 //------------------------------------------------------------------------- 265 //-------------------------------------------------------------------------
268 266
269 'isExpired': function() { 267 'isExpired': function() {
270 return (this.usageDate() != null); 268 return (this.usageDate() != null);
271 }, 269 },
272 270
273 //------------------------------------------------------------------------- 271 //-------------------------------------------------------------------------
274 272
275 'updateStatusWithValues': function(someValues) { 273 'updateStatusWithValues': function(someValues) {
276 var result; 274 var result;
277 275
278 result = false; 276 result = false;
279 277
280 if (someValues['status'] != this.status()) { 278 if (someValues['status'] != this.status()) {
281 result = true; 279 result = true;
282 } 280 }
283 281
284 this.setStatus(someValues['status']); 282 this.setStatus(someValues['status']);
285 this.setUsageDate(Clipperz.PM.Date.parseDateWithUTCFormat(someValues['requestDate'])); 283 this.setUsageDate(Clipperz.PM.Date.parseDateWithUTCFormat(someValues['requestDate']));
286 this.setConnectionInfo(someValues['connection']); 284 this.setConnectionInfo(someValues['connection']);
287 285
288 return result; 286 return result;
289 }, 287 },
290 */ 288 */
291 //------------------------------------------------------------------------- 289 //-------------------------------------------------------------------------
292 __syntaxFix__: "syntax fix" 290 __syntaxFix__: "syntax fix"
293}); 291});
294 292
295//############################################################################# 293//#############################################################################
296 294
297Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword = function(anUsername, aPassword) { 295Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword = function(anUsername, aPassword) {
298 return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aPassword)).toHexString().substring(2); 296 return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aPassword)).toHexString().substring(2);
299} 297}
300 298
301Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword = function(anUsername, aPassword) { 299Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword = function(anUsername, aPassword) {
302 return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(anUsername + aPassword)).toHexString().substring(2); 300 return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(anUsername + aPassword)).toHexString().substring(2);
303} 301}
304 302
305//============================================================================= 303//=============================================================================
306 304
307Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue = function(aPassword) { 305Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue = function(aPassword) {
308 var result; 306 var result;
309 307
310 //"yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg" 308 //"yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"
311//console.log("Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue", aPassword);
312 if (aPassword.replace(/[\s\-]/g, '').length == 32) { 309 if (aPassword.replace(/[\s\-]/g, '').length == 32) {
313 try { 310 try {
314 var passwordByteArray; 311 var passwordByteArray;
315 312
316 passwordByteArray = new Clipperz.ByteArray(); 313 passwordByteArray = new Clipperz.ByteArray();
317 passwordByteArray.appendBase32String(aPassword); 314 passwordByteArray.appendBase32String(aPassword);
318 315
319 result = true; 316 result = true;
320 } catch(exception) { 317 } catch(exception) {
321 result = false; 318 result = false;
322 } 319 }
323 } else { 320 } else {
324 result = false; 321 result = false;
325 } 322 }
326 323
327 return result; 324 return result;
328} 325}
329 326
330//============================================================================= 327//=============================================================================
331 328
332Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword = function(aPassword) { 329Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword = function(aPassword) {
333 varresult; 330 varresult;
334 331
335 if (aPassword.replace(/[\s\-]/g, '').length == 32) { 332 if (aPassword.replace(/[\s\-]/g, '').length == 32) {
336 try { 333 try {
337 var passwordByteArray; 334 var passwordByteArray;
338 335
339 passwordByteArray = new Clipperz.ByteArray(); 336 passwordByteArray = new Clipperz.ByteArray();
340 passwordByteArray.appendBase32String(aPassword); 337 passwordByteArray.appendBase32String(aPassword);
341 338
342 result = passwordByteArray.toBase64String(); 339 result = passwordByteArray.toBase64String();
343 } catch(exception) { 340 } catch(exception) {
344 result = aPassword; 341 result = aPassword;
345 } 342 }
346 } else { 343 } else {
347 result = aPassword; 344 result = aPassword;
348 } 345 }
349 346
350//console.log("Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword", aPassword, result);
351 return result; 347 return result;
352} 348}
353 349
354//############################################################################# 350//#############################################################################
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js b/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js
index f51bbc2..986db40 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.PM.DataModel.Record.Version) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.PM.DataModel.Record.Version) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.PM.DataModel.Record.Version.Field depends on Clipperz.PM.DataModel.Record.Version!"; 25 throw "Clipperz.PM.DataModel.Record.Version.Field depends on Clipperz.PM.DataModel.Record.Version!";
28} 26}
29 27
30Clipperz.PM.DataModel.Record.Version.Field = function(args) { 28Clipperz.PM.DataModel.Record.Version.Field = function(args) {
31 Clipperz.PM.DataModel.Record.Version.Field.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.DataModel.Record.Version.Field.superclass.constructor.apply(this, arguments);
32 30
33 this._recordVersion = args.recordVersion|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._recordVersion = args.recordVersion|| Clipperz.Base.exception.raise('MandatoryParameter');
34 this._reference = args.reference || Clipperz.PM.Crypto.randomKey(); 32 this._reference = args.reference || Clipperz.PM.Crypto.randomKey();
35 33
36 return this; 34 return this;
37} 35}
38 36
39 37
40Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version.Field, Object, { 38Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version.Field, Object, {
41 39
42 'toString': function() { 40 'toString': function() {
43 return "Record.Version.Field (" + this.reference() + ")"; 41 return "Record.Version.Field (" + this.reference() + ")";
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'recordVersion': function () { 46 'recordVersion': function () {
49 return this._recordVersion; 47 return this._recordVersion;
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'reference': function () { 52 'reference': function () {
55 return this._reference; 53 return this._reference;
56 }, 54 },
57 55
58 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
59 57
60 'getItem': function (aKey) { 58 'getItem': function (aKey) {
61 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [ 59 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [
62 MochiKit.Base.method(this, 'recordVersion'), 60 MochiKit.Base.method(this, 'recordVersion'),
63 MochiKit.Base.methodcaller('getValue', 'fields' + '.' + this.reference() + '.' + aKey) 61 MochiKit.Base.methodcaller('getValue', 'fields' + '.' + this.reference() + '.' + aKey)
64 ], {trace:false}); 62 ], {trace:false});
65 }, 63 },
66 64
67 'setItem': function (aKey, aValue) { 65 'setItem': function (aKey, aValue) {
68 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [ 66 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [
69 MochiKit.Base.method(this, 'recordVersion'), 67 MochiKit.Base.method(this, 'recordVersion'),
70 MochiKit.Base.methodcaller('setValue', 'fields' + '.' + this.reference() + '.' + aKey, aValue) 68 MochiKit.Base.methodcaller('setValue', 'fields' + '.' + this.reference() + '.' + aKey, aValue)
71 ], {trace:false}); 69 ], {trace:false});
72 }, 70 },
73 71
74 //------------------------------------------------------------------------- 72 //-------------------------------------------------------------------------
75 73
76 'label': function () { 74 'label': function () {
77 return this.getItem('label'); 75 return this.getItem('label');
78 }, 76 },
79 77
80 'setLabel': function (aValue) { 78 'setLabel': function (aValue) {
81 return this.setItem('label', aValue); 79 return this.setItem('label', aValue);
82 }, 80 },
83 81
84 //------------------------------------------------------------------------- 82 //-------------------------------------------------------------------------
85 83
86 'value': function () { 84 'value': function () {
87 return this.getItem('value'); 85 return this.getItem('value');
88 }, 86 },
89 87
90 'setValue': function (aValue) { 88 'setValue': function (aValue) {
91 return this.setItem('value', aValue); 89 return this.setItem('value', aValue);
92 }, 90 },
93 91
94 //------------------------------------------------------------------------- 92 //-------------------------------------------------------------------------
95 93
96 'actionType': function () { 94 'actionType': function () {
97 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.actionType", [ 95 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.actionType", [
98 Clipperz.Async.collectResults("Clipperz.PM.DataModel.Record.Version.Field.actionType [collect results]", { 96 Clipperz.Async.collectResults("Clipperz.PM.DataModel.Record.Version.Field.actionType [collect results]", {
99 'isHidden':MochiKit.Base.method(this, 'isHidden'), 97 'isHidden':MochiKit.Base.method(this, 'isHidden'),
100 'value':MochiKit.Base.method(this, 'value') 98 'value':MochiKit.Base.method(this, 'value')
101 }, {trace:false}), 99 }, {trace:false}),
102 function (someValues) { 100 function (someValues) {
103 var result; //'NONE', 'URL', 'EMAIL', 'PASSWORD' 101 var result; //'NONE', 'URL', 'EMAIL', 'PASSWORD'
104 102
105 result = 'NONE'; 103 result = 'NONE';
106 104
107 if (someValues['isHidden']) { 105 if (someValues['isHidden']) {
108 result = 'PASSWORD'; 106 result = 'PASSWORD';
109 } else if (Clipperz.Base.isUrl(someValues['value'])) { 107 } else if (Clipperz.Base.isUrl(someValues['value'])) {
110 result = 'URL' 108 result = 'URL'
111 } else if (Clipperz.Base.isEmail(someValues['value'])) { 109 } else if (Clipperz.Base.isEmail(someValues['value'])) {
112 result = 'EMAIL' 110 result = 'EMAIL'
113 }; 111 };
114 112
115 return result; 113 return result;
116 } 114 }
117 ], {trace:false}); 115 ], {trace:false});
118 }, 116 },
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js b/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js
index dd35fc9..87b319c 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js
@@ -1,333 +1,328 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.PM.DataModel.Record) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.PM.DataModel.Record) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.PM.DataModel.Record.Version depends on Clipperz.PM.DataModel.Record!"; 25 throw "Clipperz.PM.DataModel.Record.Version depends on Clipperz.PM.DataModel.Record!";
28} 26}
29 27
30Clipperz.PM.DataModel.Record.Version = function(args) { 28Clipperz.PM.DataModel.Record.Version = function(args) {
31//console.log(">>> Record.new");
32 Clipperz.PM.DataModel.Record.Version.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.DataModel.Record.Version.superclass.constructor.apply(this, arguments);
33 30
34 this._getVersionFunction = args.getVersion|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._getVersionFunction = args.getVersion|| Clipperz.Base.exception.raise('MandatoryParameter');
35 this._fields = null; 32 this._fields = null;
36 33
37 return this; 34 return this;
38} 35}
39 36
40 37
41Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version, Clipperz.PM.DataModel.EncryptedRemoteObject, { 38Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version, Clipperz.PM.DataModel.EncryptedRemoteObject, {
42 39
43 'toString': function() { 40 'toString': function() {
44 return "Record.Version (" + this.reference() + ")"; 41 return "Record.Version (" + this.reference() + ")";
45 }, 42 },
46 43
47 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
48 45
49 'reference': function () { 46 'reference': function () {
50 return this._reference; 47 return this._reference;
51 }, 48 },
52 49
53 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
54/* 51/*
55 'hasPendingChanges': function () { 52 'hasPendingChanges': function () {
56 var deferredResult; 53 var deferredResult;
57 54
58 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChanges", {trace:false}); 55 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChanges", {trace:false});
59 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.hasPendingChanges, this)); 56 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.hasPendingChanges, this));
60 deferredResult.callback(); 57 deferredResult.callback();
61 58
62 return deferredResult; 59 return deferredResult;
63 }, 60 },
64*/ 61*/
65 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
66 63
67 64
68 'hasPendingChangesWhenBrandNew': function () { 65 'hasPendingChangesWhenBrandNew': function () {
69 var deferredResult; 66 var deferredResult;
70 67
71 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChangesWhenBrandNew", {trace:false}); 68 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChangesWhenBrandNew", {trace:false});
72 deferredResult.addMethod(this, 'fields'); 69 deferredResult.addMethod(this, 'fields');
73 deferredResult.addCallback(MochiKit.Base.values); 70 deferredResult.addCallback(MochiKit.Base.values);
74 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('isEmpty')) 71 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('isEmpty'))
75 deferredResult.addCallback(Clipperz.Async.collectAll); 72 deferredResult.addCallback(Clipperz.Async.collectAll);
76 deferredResult.addCallback(function(someValues) { 73 deferredResult.addCallback(function(someValues) {
77 return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity); 74 return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity);
78 }); 75 });
79 deferredResult.addCallback(MochiKit.Base.operator.lognot) 76 deferredResult.addCallback(MochiKit.Base.operator.lognot)
80 deferredResult.callback(); 77 deferredResult.callback();
81 78
82 return deferredResult; 79 return deferredResult;
83 }, 80 },
84 81
85 //========================================================================= 82 //=========================================================================
86 83
87 'commitTransientState': function () { 84 'commitTransientState': function () {
88 var deferredResult; 85 var deferredResult;
89 86
90 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.commitTransientState", {trace:false}); 87 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.commitTransientState", {trace:false});
91 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.commitTransientState, this)); 88 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.commitTransientState, this));
92 deferredResult.callback(); 89 deferredResult.callback();
93 90
94 return deferredResult; 91 return deferredResult;
95 }, 92 },
96 93
97 //========================================================================= 94 //=========================================================================
98 95
99 'unpackData': function (someData) { //++ 96 'unpackData': function (someData) { //++
100 varresult; 97 varresult;
101 98
102//console.log("Record.Version - UNPACK DATA", this, someData);
103 result = someData; 99 result = someData;
104 if ((someData['fields'] != null) && (someData['fields'] instanceof Array)) { 100 if ((someData['fields'] != null) && (someData['fields'] instanceof Array)) {
105 varfields; 101 varfields;
106 var i,c; 102 var i,c;
107 103
108 fields = someData['fields']; 104 fields = someData['fields'];
109 delete someData['fields']; 105 delete someData['fields'];
110 106
111 someData['fields'] = {}; 107 someData['fields'] = {};
112 c = fields.length; 108 c = fields.length;
113 for (i=0; i<c; i++) { 109 for (i=0; i<c; i++) {
114 someData['fields'][i] = fields[i]; 110 someData['fields'][i] = fields[i];
115 } 111 }
116 } 112 }
117 113
118 114
119 115
120 return result; 116 return result;
121 }, 117 },
122 118
123 //========================================================================= 119 //=========================================================================
124 120
125 'fields': function () { 121 'fields': function () {
126 vardeferredResult; 122 vardeferredResult;
127 var deferredLock; 123 var deferredLock;
128 124
129 deferredLock = this.getDeferredLockForKey('fields'); 125 deferredLock = this.getDeferredLockForKey('fields');
130 126
131 deferredResult = new Clipperz.Async.Deferred("Record.Version.fields", {trace:false}); 127 deferredResult = new Clipperz.Async.Deferred("Record.Version.fields", {trace:false});
132 deferredResult.acquireLock(deferredLock); 128 deferredResult.acquireLock(deferredLock);
133 deferredResult.addCallback(MochiKit.Base.bind(function () { 129 deferredResult.addCallback(MochiKit.Base.bind(function () {
134 var innerDeferredResult; 130 var innerDeferredResult;
135 131
136 if (this._fields == null) { 132 if (this._fields == null) {
137 innerDeferredResult = new Clipperz.Async.Deferred("Record.Version.fields <inner deferred>", {trace:false}); 133 innerDeferredResult = new Clipperz.Async.Deferred("Record.Version.fields <inner deferred>", {trace:false});
138 innerDeferredResult.addMethod(this, 'getValue', 'fields'); 134 innerDeferredResult.addMethod(this, 'getValue', 'fields');
139 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) { 135 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) {
140 var reference; 136 var reference;
141 137
142 this._fields = {}; 138 this._fields = {};
143 139
144 for (reference in someObjectData) { 140 for (reference in someObjectData) {
145 varrecordVersionField; 141 varrecordVersionField;
146 142
147 recordVersionField = new Clipperz.PM.DataModel.Record.Version.Field({ 143 recordVersionField = new Clipperz.PM.DataModel.Record.Version.Field({
148 'recordVersion':this, 144 'recordVersion':this,
149 'reference': reference 145 'reference': reference
150 }); 146 });
151 147
152 this._fields[reference] = recordVersionField; 148 this._fields[reference] = recordVersionField;
153 } 149 }
154 150
155 return this._fields; 151 return this._fields;
156 }, this)); 152 }, this));
157 innerDeferredResult.callback(); 153 innerDeferredResult.callback();
158 } else { 154 } else {
159 innerDeferredResult = MochiKit.Async.succeed(this._fields); 155 innerDeferredResult = MochiKit.Async.succeed(this._fields);
160 } 156 }
161 157
162 return innerDeferredResult; 158 return innerDeferredResult;
163 }, this)); 159 }, this));
164 deferredResult.releaseLock(deferredLock); 160 deferredResult.releaseLock(deferredLock);
165 deferredResult.callback(); 161 deferredResult.callback();
166 162
167 return deferredResult; 163 return deferredResult;
168 }, 164 },
169 165
170 //------------------------------------------------------------------------- 166 //-------------------------------------------------------------------------
171 167
172 'getFieldsValues': function () { 168 'getFieldsValues': function () {
173 return this.getValue('fields'); 169 return this.getValue('fields');
174 }, 170 },
175 171
176 //------------------------------------------------------------------------- 172 //-------------------------------------------------------------------------
177 173
178 'addField': function (someParameters) { 174 'addField': function (someParameters) {
179 varnewField; 175 varnewField;
180 176
181 newField = new Clipperz.PM.DataModel.Record.Version.Field({recordVersion:this}); 177 newField = new Clipperz.PM.DataModel.Record.Version.Field({recordVersion:this});
182 178
183 return Clipperz.Async.callbacks("Record.Version.addField", [ 179 return Clipperz.Async.callbacks("Record.Version.addField", [
184 MochiKit.Base.method(this, 'fields'), 180 MochiKit.Base.method(this, 'fields'),
185 181
186 MochiKit.Base.method(this, '_getObjectDataStore'), 182 MochiKit.Base.method(this, '_getObjectDataStore'),
187 MochiKit.Base.methodcaller('values'), 183 MochiKit.Base.methodcaller('values'),
188 Clipperz.Base.serializeJSON, 184 Clipperz.Base.serializeJSON,
189 185
190 MochiKit.Base.bind(function () { this._fields[newField.reference()] = newField; }, this), 186 MochiKit.Base.bind(function () { this._fields[newField.reference()] = newField; }, this),
191 MochiKit.Base.method(newField, 'setLabel', someParameters['label']), 187 MochiKit.Base.method(newField, 'setLabel', someParameters['label']),
192 MochiKit.Base.method(newField, 'setValue', someParameters['value']), 188 MochiKit.Base.method(newField, 'setValue', someParameters['value']),
193 MochiKit.Base.method(newField, 'setIsHidden',someParameters['isHidden']), 189 MochiKit.Base.method(newField, 'setIsHidden',someParameters['isHidden']),
194 190
195 MochiKit.Base.method(this, '_getObjectDataStore'), 191 MochiKit.Base.method(this, '_getObjectDataStore'),
196 MochiKit.Base.methodcaller('values'), 192 MochiKit.Base.methodcaller('values'),
197 Clipperz.Base.serializeJSON, 193 Clipperz.Base.serializeJSON,
198 194
199 MochiKit.Base.partial(MochiKit.Async.succeed, newField) 195 MochiKit.Base.partial(MochiKit.Async.succeed, newField)
200 ], {trace:false}); 196 ], {trace:false});
201 }, 197 },
202 198
203 //------------------------------------------------------------------------- 199 //-------------------------------------------------------------------------
204 200
205 'removeField': function (aField) { 201 'removeField': function (aField) {
206 return Clipperz.Async.callbacks("Record.Version.removeField", [ 202 return Clipperz.Async.callbacks("Record.Version.removeField", [
207 MochiKit.Base.method(this, 'fields'), 203 MochiKit.Base.method(this, 'fields'),
208 MochiKit.Base.bind(function () { delete this._fields[aField.reference()]; }, this), 204 MochiKit.Base.bind(function () { delete this._fields[aField.reference()]; }, this),
209 MochiKit.Base.method(this, 'removeValue', 'fields' + '.' + aField.reference()) 205 MochiKit.Base.method(this, 'removeValue', 'fields' + '.' + aField.reference())
210 ], {trace:false}); 206 ], {trace:false});
211 }, 207 },
212 208
213 //------------------------------------------------------------------------- 209 //-------------------------------------------------------------------------
214/* 210/*
215 'sortFieldReference': function (someSortedFieldReferences) { 211 'sortFieldReference': function (someSortedFieldReferences) {
216 212
217 213
218 214
219 }, 215 },
220*/ 216*/
221 //========================================================================= 217 //=========================================================================
222/* 218/*
223 'directLogins': function () { 219 'directLogins': function () {
224 return MochiKit.Base.values(this._directLogins); 220 return MochiKit.Base.values(this._directLogins);
225 }, 221 },
226 222
227 'addDirectLogin': function (aDirectLogin) { 223 'addDirectLogin': function (aDirectLogin) {
228 this._directLogins[aDirectLogin.reference()] = aDirectLogin; 224 this._directLogins[aDirectLogin.reference()] = aDirectLogin;
229 }, 225 },
230*/ 226*/
231 227
232 //========================================================================= 228 //=========================================================================
233/* 229/*
234 'updateValues': function (anotherVersion) { 230 'updateValues': function (anotherVersion) {
235 return Clipperz.Async.callbacks("Record.Version.updateValue", [ 231 return Clipperz.Async.callbacks("Record.Version.updateValue", [
236 MochiKit.Base.partial(MochiKit.Async.succeed, this) 232 MochiKit.Base.partial(MochiKit.Async.succeed, this)
237 ], {trace:false}); 233 ], {trace:false});
238 }, 234 },
239*/ 235*/
240 //========================================================================= 236 //=========================================================================
241 237
242 'setRemoteData': function (aValue) { 238 'setRemoteData': function (aValue) {
243 this._remoteData = aValue; 239 this._remoteData = aValue;
244 240
245 return aValue; 241 return aValue;
246 }, 242 },
247 243
248 //========================================================================= 244 //=========================================================================
249 245
250 'getVersionFunction': function () { 246 'getVersionFunction': function () {
251 return this._getVersionFunction; 247 return this._getVersionFunction;
252 }, 248 },
253 249
254 'previousVersion': function () { 250 'previousVersion': function () {
255 return Clipperz.Async.callbacks("Record.Versions.previousVersion", [ 251 return Clipperz.Async.callbacks("Record.Versions.previousVersion", [
256 MochiKit.Base.method(this, 'previousVersionReference'), 252 MochiKit.Base.method(this, 'previousVersionReference'),
257 this.getVersionFunction() 253 this.getVersionFunction()
258 ], {trace:false}); 254 ], {trace:false});
259 }, 255 },
260 256
261 'previousVersionReference': function () { 257 'previousVersionReference': function () {
262 return this.getValue('previousVersionReference'); 258 return this.getValue('previousVersionReference');
263 }, 259 },
264 260
265 'previousVersionKey': function () { 261 'previousVersionKey': function () {
266 //TODO: this value i encrypted on its own. So it can not be saved in the main objectStore!!! 262 //TODO: this value i encrypted on its own. So it can not be saved in the main objectStore!!!
267 return this.getValue('previousVersionKey'); 263 return this.getValue('previousVersionKey');
268 }, 264 },
269 265
270 //------------------------------------------------------------------------- 266 //-------------------------------------------------------------------------
271 267
272 'setPreviousVersionReferenceAndKey': function (aVersionObjectAndKey) { 268 'setPreviousVersionReferenceAndKey': function (aVersionObjectAndKey) {
273 // this._previousVersion = anotherVersion; 269 // this._previousVersion = anotherVersion;
274 return Clipperz.Async.callbacks("Record.Version.setPreviousVersion", [ 270 return Clipperz.Async.callbacks("Record.Version.setPreviousVersion", [
275 MochiKit.Base.method(this, 'setValue', 'previousVersionReference',aVersionObjectAndKey['reference']), 271 MochiKit.Base.method(this, 'setValue', 'previousVersionReference',aVersionObjectAndKey['reference']),
276 MochiKit.Base.method(this, 'setValue', 'previousVersionKey', aVersionObjectAndKey['key']) 272 MochiKit.Base.method(this, 'setValue', 'previousVersionKey', aVersionObjectAndKey['key'])
277 ], {trace:false}); 273 ], {trace:false});
278 }, 274 },
279 275
280 //========================================================================= 276 //=========================================================================
281 277
282 'revertChanges': function () { 278 'revertChanges': function () {
283 this.setReference(this.transientState()['originalReference']); 279 this.setReference(this.transientState()['originalReference']);
284 Clipperz.PM.DataModel.Record.Version.superclass.revertChanges.apply(this, arguments); 280 Clipperz.PM.DataModel.Record.Version.superclass.revertChanges.apply(this, arguments);
285 }, 281 },
286 282
287 //------------------------------------------------------------------------- 283 //-------------------------------------------------------------------------
288 284
289 'prepareRemoteDataWithKey': function (aKey) { 285 'prepareRemoteDataWithKey': function (aKey) {
290 var deferredResult; 286 var deferredResult;
291 var result; 287 var result;
292 288
293 result = {}; 289 result = {};
294 290
295//console.log("prepareRemoteDataWithKey", aKey);
296 deferredResult = new Clipperz.Async.Deferred("Record.Version.prepareRemoteDataWithKey", {trace:false}); 291 deferredResult = new Clipperz.Async.Deferred("Record.Version.prepareRemoteDataWithKey", {trace:false});
297 if (this.isBrandNew() == false) { 292 if (this.isBrandNew() == false) {
298 this.transientState()['originalReference'] = this.reference(); 293 this.transientState()['originalReference'] = this.reference();
299 294
300 deferredResult.collectResults({ 295 deferredResult.collectResults({
301 'key':MochiKit.Base.partial(MochiKit.Async.succeed, aKey), 296 'key':MochiKit.Base.partial(MochiKit.Async.succeed, aKey),
302 'value': MochiKit.Base.method(this, 'getKey'), 297 'value': MochiKit.Base.method(this, 'getKey'),
303 'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion) 298 'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion)
304 }); 299 });
305 deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt); 300 deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt);
306 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey'); 301 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey');
307 } else { 302 } else {
308 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey', Clipperz.PM.Crypto.nullValue); 303 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey', Clipperz.PM.Crypto.nullValue);
309 } 304 }
310 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey)); 305 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey));
311 deferredResult.addCallback(MochiKit.Base.update, result); 306 deferredResult.addCallback(MochiKit.Base.update, result);
312 deferredResult.addMethod(this, 'setRemoteData'); 307 deferredResult.addMethod(this, 'setRemoteData');
313 308
314 deferredResult.callback(); 309 deferredResult.callback();
315 310
316 return deferredResult; 311 return deferredResult;
317 }, 312 },
318 313
319 //========================================================================= 314 //=========================================================================
320/* 315/*
321 'deleteAllCleanTextData': function () { 316 'deleteAllCleanTextData': function () {
322 return Clipperz.PM.DataModel.Record.Version.superclass.deleteAllCleanTextData.apply(this, arguments); 317 return Clipperz.PM.DataModel.Record.Version.superclass.deleteAllCleanTextData.apply(this, arguments);
323 }, 318 },
324 319
325 'hasAnyCleanTextData': function () { 320 'hasAnyCleanTextData': function () {
326 return Clipperz.PM.DataModel.Record.Version.superclass.hasAnyCleanTextData.apply(this, arguments); 321 return Clipperz.PM.DataModel.Record.Version.superclass.hasAnyCleanTextData.apply(this, arguments);
327 }, 322 },
328*/ 323*/
329 //========================================================================= 324 //=========================================================================
330 __syntaxFix__: "syntax fix" 325 __syntaxFix__: "syntax fix"
331}); 326});
332 327
333 328
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/Record.js b/frontend/gamma/js/Clipperz/PM/DataModel/Record.js
index b816f80..3fc1813 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/Record.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/Record.js
@@ -1,878 +1,854 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 26if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
29 27
30 28
31Clipperz.PM.DataModel.Record = function(args) { 29Clipperz.PM.DataModel.Record = function(args) {
32//console.log(">>> new Clipperz.PM.DataModel.Record", args);
33 Clipperz.PM.DataModel.Record.superclass.constructor.apply(this, arguments); 30 Clipperz.PM.DataModel.Record.superclass.constructor.apply(this, arguments);
34 31
35 this._updateDate = (args.updateDate ? Clipperz.PM.Date.parse(args.updateDate) : Clipperz.Base.exception.raise('MandatoryParameter')); 32 this._updateDate = (args.updateDate ? Clipperz.PM.Date.parse(args.updateDate) : Clipperz.Base.exception.raise('MandatoryParameter'));
36 33
37 this._retrieveIndexDataFunction = args.retrieveIndexDataFunction|| Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._retrieveIndexDataFunction = args.retrieveIndexDataFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
38 this._updateIndexDataFunction = args.updateIndexDataFunction || Clipperz.Base.exception.raise('MandatoryParameter'); 35 this._updateIndexDataFunction = args.updateIndexDataFunction || Clipperz.Base.exception.raise('MandatoryParameter');
39 36
40 this._retrieveDirectLoginIndexDataFunction = args.retrieveDirectLoginIndexDataFunction|| null; 37 this._retrieveDirectLoginIndexDataFunction = args.retrieveDirectLoginIndexDataFunction|| null;
41 this._setDirectLoginIndexDataFunction = args.setDirectLoginIndexDataFunction || null; 38 this._setDirectLoginIndexDataFunction = args.setDirectLoginIndexDataFunction || null;
42 this._removeDirectLoginIndexDataFunction = args.removeDirectLoginIndexDataFunction|| null; 39 this._removeDirectLoginIndexDataFunction = args.removeDirectLoginIndexDataFunction|| null;
43 40
44 this._createNewDirectLoginFunction = args.createNewDirectLoginFunction || null; 41 this._createNewDirectLoginFunction = args.createNewDirectLoginFunction || null;
45 42
46 this._directLogins = {}; 43 this._directLogins = {};
47 44
48 this._versions = {}; 45 this._versions = {};
49 46
50 this._currentRecordVersion = null; 47 this._currentRecordVersion = null;
51 if (this.isBrandNew()) { 48 if (this.isBrandNew()) {
52 var newVersion; 49 var newVersion;
53 50
54 this.setNotes(''); 51 this.setNotes('');
55 newVersion = new Clipperz.PM.DataModel.Record.Version({ 52 newVersion = new Clipperz.PM.DataModel.Record.Version({
56 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'), 53 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'),
57 'getVersion': MochiKit.Base.method(this, 'getVersion') 54 'getVersion': MochiKit.Base.method(this, 'getVersion')
58 55
59 }); 56 });
60 this._versions[newVersion.reference()] = newVersion; 57 this._versions[newVersion.reference()] = newVersion;
61 this._currentVersionReference = newVersion.reference(); 58 this._currentVersionReference = newVersion.reference();
62 // this.setLabel(''); 59 // this.setLabel('');
63 } 60 }
64 61
65//console.log("<<< new Clipperz.PM.DataModel.Record", args);
66
67 return this; 62 return this;
68} 63}
69 64
70 65
71Clipperz.Base.extend(Clipperz.PM.DataModel.Record, Clipperz.PM.DataModel.EncryptedRemoteObject, { 66Clipperz.Base.extend(Clipperz.PM.DataModel.Record, Clipperz.PM.DataModel.EncryptedRemoteObject, {
72 67
73 'toString': function() { 68 'toString': function() {
74 return "Record (" + this.reference() + ")"; 69 return "Record (" + this.reference() + ")";
75 }, 70 },
76 71
77 //------------------------------------------------------------------------- 72 //-------------------------------------------------------------------------
78 73
79 'reference': function () { 74 'reference': function () {
80 return this._reference; 75 return this._reference;
81 }, 76 },
82 77
83 //========================================================================= 78 //=========================================================================
84 79
85 'getIndexData': function () { 80 'getIndexData': function () {
86 return this._retrieveIndexDataFunction(this.reference()); 81 return this._retrieveIndexDataFunction(this.reference());
87 }, 82 },
88 83
89 //......................................................................... 84 //.........................................................................
90 85
91 'getIndexDataForKey': function (aKey) { 86 'getIndexDataForKey': function (aKey) {
92 return Clipperz.Async.callbacks("Record.getIndexDataForKey", [ 87 return Clipperz.Async.callbacks("Record.getIndexDataForKey", [
93 MochiKit.Base.method(this, 'getIndexData'), 88 MochiKit.Base.method(this, 'getIndexData'),
94 MochiKit.Base.itemgetter(aKey) 89 MochiKit.Base.itemgetter(aKey)
95 ], {trace:false}); 90 ], {trace:false});
96 }, 91 },
97 92
98 //------------------------------------------------------------------------- 93 //-------------------------------------------------------------------------
99 94
100 'setIndexDataForKey': function (aKey, aValue) { 95 'setIndexDataForKey': function (aKey, aValue) {
101 // return this._updateIndexDataFunction(this.reference(), aKey, aValue); 96 // return this._updateIndexDataFunction(this.reference(), aKey, aValue);
102 97
103 var deferredResult; 98 var deferredResult;
104 99
105 deferredResult = new Clipperz.Async.Deferred("Record.setIndexDataForKey", {trace:false}); 100 deferredResult = new Clipperz.Async.Deferred("Record.setIndexDataForKey", {trace:false});
106 deferredResult.addMethod(this, 'getIndexDataForKey', aKey); 101 deferredResult.addMethod(this, 'getIndexDataForKey', aKey);
107 deferredResult.addCallback(MochiKit.Base.bind(function (aCurrentValue) { 102 deferredResult.addCallback(MochiKit.Base.bind(function (aCurrentValue) {
108 var result; 103 var result;
109 var originalValue; 104 var originalValue;
110 105
111 originalValue = this.transientState().getValue('originalValues.indexData.' + aKey); 106 originalValue = this.transientState().getValue('originalValues.indexData.' + aKey);
112 if (originalValue == null) { 107 if (originalValue == null) {
113 originalValue = this.transientState().setValue('originalValues.indexData.' + aKey, aCurrentValue); 108 originalValue = this.transientState().setValue('originalValues.indexData.' + aKey, aCurrentValue);
114 } 109 }
115 110
116 if (aCurrentValue != aValue) { 111 if (aCurrentValue != aValue) {
117 if (originalValue != aValue) { 112 if (originalValue != aValue) {
118 this.transientState().setValue('hasPendingChanges.indexData.' + aKey, true); 113 this.transientState().setValue('hasPendingChanges.indexData.' + aKey, true);
119 } else { 114 } else {
120 this.transientState().setValue('hasPendingChanges.indexData.' + aKey, false); 115 this.transientState().setValue('hasPendingChanges.indexData.' + aKey, false);
121 } 116 }
122 117
123 result = this._updateIndexDataFunction(this.reference(), aKey, aValue); 118 result = this._updateIndexDataFunction(this.reference(), aKey, aValue);
124 } else { 119 } else {
125 result = MochiKit.Async.succeed(aValue); 120 result = MochiKit.Async.succeed(aValue);
126 } 121 }
127 122
128 return result; 123 return result;
129 }, this)); 124 }, this));
130 125
131 deferredResult.callback(); 126 deferredResult.callback();
132 127
133 return deferredResult; 128 return deferredResult;
134 }, 129 },
135 130
136 //========================================================================= 131 //=========================================================================
137/* 132/*
138 'key': function () { 133 'key': function () {
139 return this.getIndexDataForKey('key'); 134 return this.getIndexDataForKey('key');
140 }, 135 },
141*/ 136*/
142 //========================================================================= 137 //=========================================================================
143 138
144 'label': function () { 139 'label': function () {
145 return this.getIndexDataForKey('label'); 140 return this.getIndexDataForKey('label');
146 }, 141 },
147 142
148 //......................................................................... 143 //.........................................................................
149 144
150 'setLabel': function (aValue) { 145 'setLabel': function (aValue) {
151 return this.setIndexDataForKey('label', aValue); 146 return this.setIndexDataForKey('label', aValue);
152 }, 147 },
153 148
154 //========================================================================= 149 //=========================================================================
155 150
156 'headerNotes': function () { 151 'headerNotes': function () {
157 return this.getIndexDataForKey('notes'); 152 return this.getIndexDataForKey('notes');
158 }, 153 },
159 154
160 //------------------------------------------------------------------------- 155 //-------------------------------------------------------------------------
161 156
162 'notes': function () { 157 'notes': function () {
163 return Clipperz.Async.callbacks("Record.notes", [ 158 return Clipperz.Async.callbacks("Record.notes", [
164 MochiKit.Base.method(this, 'headerNotes'), 159 MochiKit.Base.method(this, 'headerNotes'),
165 MochiKit.Base.bind(function (someHeaderNotes) { 160 MochiKit.Base.bind(function (someHeaderNotes) {
166 var result; 161 var result;
167 162
168 if ((someHeaderNotes == null) || (typeof(someHeaderNotes) == 'undefined')) { 163 if ((someHeaderNotes == null) || (typeof(someHeaderNotes) == 'undefined')) {
169 result = this.getValue('notes'); 164 result = this.getValue('notes');
170 } else { 165 } else {
171 result = MochiKit.Async.succeed(someHeaderNotes); 166 result = MochiKit.Async.succeed(someHeaderNotes);
172 } 167 }
173 168
174 return result; 169 return result;
175 }, this) 170 }, this)
176 ], {trace:false}); 171 ], {trace:false});
177 }, 172 },
178 173
179 //......................................................................... 174 //.........................................................................
180 175
181 'setNotes': function (aValue) { 176 'setNotes': function (aValue) {
182 return this.setValue('notes', aValue); 177 return this.setValue('notes', aValue);
183 }, 178 },
184 179
185 //========================================================================= 180 //=========================================================================
186 181
187 'updateDate': function () { 182 'updateDate': function () {
188 return MochiKit.Async.succeed(this._updateDate); 183 return MochiKit.Async.succeed(this._updateDate);
189 }, 184 },
190 185
191 //========================================================================= 186 //=========================================================================
192 187
193 'favicon': function () { 188 'favicon': function () {
194 var result; 189 var result;
195 var directLogins; 190 var directLogins;
196 191
197 directLogins = MochiKit.Base.values(this.directLogins()); 192 directLogins = MochiKit.Base.values(this.directLogins());
198 if (directLogins.length > 0) { 193 if (directLogins.length > 0) {
199 result = directLogins[0].favicon(); 194 result = directLogins[0].favicon();
200 // } else if (/* is there an URL to use for searching a favicon */){ 195 // } else if (/* is there an URL to use for searching a favicon */){
201 } else { 196 } else {
202 result = null; //MochiKit.Async.succeed(Clipperz.PM.Strings['defaultFaviconUrl']); 197 result = null; //MochiKit.Async.succeed(Clipperz.PM.Strings['defaultFaviconUrl']);
203 } 198 }
204 199
205 return result; 200 return result;
206 }, 201 },
207 202
208 //------------------------------------------------------------------------- 203 //-------------------------------------------------------------------------
209 204
210 'searchableContent': function () { 205 'searchableContent': function () {
211 var deferredResult; 206 var deferredResult;
212 207
213//console.log(">>> searchableContent");
214 deferredResult = new Clipperz.Async.Deferred("Record.searchableContent", {trace:false}); 208 deferredResult = new Clipperz.Async.Deferred("Record.searchableContent", {trace:false});
215 209
216 deferredResult.collectResults({ 210 deferredResult.collectResults({
217 'recordLabel': MochiKit.Base.method(this, 'label'), 211 'recordLabel': MochiKit.Base.method(this, 'label'),
218 'directLoginLabels': [ 212 'directLoginLabels': [
219 MochiKit.Base.method(this, 'directLoginReferences'), 213 MochiKit.Base.method(this, 'directLoginReferences'),
220 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.itemgetter('label')) 214 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.itemgetter('label'))
221 ] 215 ]
222 }) 216 })
223 deferredResult.addCallback(function (someValues) { 217 deferredResult.addCallback(function (someValues) {
224 return someValues['recordLabel'] + ' ' + someValues['directLoginLabels'].join(' '); 218 return someValues['recordLabel'] + ' ' + someValues['directLoginLabels'].join(' ');
225 }); 219 });
226 deferredResult.callback(); 220 deferredResult.callback();
227//console.log("<<< searchableContent");
228 221
229 return deferredResult; 222 return deferredResult;
230 }, 223 },
231 224
232 //------------------------------------------------------------------------- 225 //-------------------------------------------------------------------------
233 226
234 'isMatching': function (aRegExp) { 227 'isMatching': function (aRegExp) {
235 return Clipperz.Async.callbacks("deferredFilterFunction", [ 228 return Clipperz.Async.callbacks("deferredFilterFunction", [
236 MochiKit.Base.method(this, 'searchableContent'), 229 MochiKit.Base.method(this, 'searchableContent'),
237 MochiKit.Base.method(aRegExp, 'test'), 230 MochiKit.Base.method(aRegExp, 'test'),
238 function (doesItMatch) { 231 function (doesItMatch) {
239 var result; 232 var result;
240 233
241 if (doesItMatch) { 234 if (doesItMatch) {
242 result = MochiKit.Async.succeed('match'); 235 result = MochiKit.Async.succeed('match');
243 } else { 236 } else {
244 result = MochiKit.Async.fail('miss'); 237 result = MochiKit.Async.fail('miss');
245 } 238 }
246 239
247 return result; 240 return result;
248 } 241 }
249 ], {trace:false}); 242 ], {trace:false});
250 }, 243 },
251 244
252 //========================================================================= 245 //=========================================================================
253 246
254 'directLogins': function () { 247 'directLogins': function () {
255 return this._directLogins; 248 return this._directLogins;
256 }, 249 },
257 250
258 'addDirectLogin': function (aDirectLogin) { 251 'addDirectLogin': function (aDirectLogin) {
259 this._directLogins[aDirectLogin.reference()] = aDirectLogin; 252 this._directLogins[aDirectLogin.reference()] = aDirectLogin;
260 }, 253 },
261 254
262 'directLoginWithReference': function (aDirectLoginReference) { 255 'directLoginWithReference': function (aDirectLoginReference) {
263 return this._directLogins[aDirectLoginReference]; 256 return this._directLogins[aDirectLoginReference];
264 }, 257 },
265 258
266 'createNewDirectLoginFunction': function () { 259 'createNewDirectLoginFunction': function () {
267 return this._createNewDirectLoginFunction; 260 return this._createNewDirectLoginFunction;
268 }, 261 },
269 262
270 'saveOriginalDirectLoginStatusToTransientState': function () { 263 'saveOriginalDirectLoginStatusToTransientState': function () {
271 if (this.transientState().getValue('directLogins') == null) { 264 if (this.transientState().getValue('directLogins') == null) {
272 // this.transientState().setValue('directLogins', this._directLogins) 265 // this.transientState().setValue('directLogins', this._directLogins)
273//console.log("SET TRANSIENT STATE", Clipperz.Base.serializeJSON(MochiKit.Base.keys(this.transientState().getValue('directLogins'))))
274 MochiKit.Iter.forEach(MochiKit.Base.keys(this._directLogins), MochiKit.Base.bind(function(aKey) { 266 MochiKit.Iter.forEach(MochiKit.Base.keys(this._directLogins), MochiKit.Base.bind(function(aKey) {
275 this.transientState().setValue('directLogins' + '.' + aKey, this._directLogins[aKey]) 267 this.transientState().setValue('directLogins' + '.' + aKey, this._directLogins[aKey])
276 }, this)) 268 }, this))
277 } 269 }
278 }, 270 },
279 271
280 'createNewDirectLogin': function () { 272 'createNewDirectLogin': function () {
281 this.saveOriginalDirectLoginStatusToTransientState(); 273 this.saveOriginalDirectLoginStatusToTransientState();
282 274
283 return this.createNewDirectLoginFunction()(this); 275 return this.createNewDirectLoginFunction()(this);
284 }, 276 },
285 277
286 'removeDirectLogin': function(aDirectLogin) { 278 'removeDirectLogin': function(aDirectLogin) {
287 this.saveOriginalDirectLoginStatusToTransientState(); 279 this.saveOriginalDirectLoginStatusToTransientState();
288 280
289 return Clipperz.Async.callbacks("Record.removeDirectLogin", [ 281 return Clipperz.Async.callbacks("Record.removeDirectLogin", [
290 MochiKit.Base.method(this, 'removeValue', 'directLogins' + '.' + aDirectLogin.reference()), 282 MochiKit.Base.method(this, 'removeValue', 'directLogins' + '.' + aDirectLogin.reference()),
291 MochiKit.Base.bind(function () { 283 MochiKit.Base.bind(function () {
292 delete this._directLogins[aDirectLogin.reference()] 284 delete this._directLogins[aDirectLogin.reference()]
293 }, this) 285 }, this)
294 ], {trace:false}); 286 ], {trace:false});
295 287
296 }, 288 },
297 289
298 'directLoginReferences': function () { 290 'directLoginReferences': function () {
299 var result; 291 var result;
300 292
301 result = Clipperz.Async.callbacks("Record.directLoginReferences", [ 293 result = Clipperz.Async.callbacks("Record.directLoginReferences", [
302 MochiKit.Base.method(this, 'directLogins'), 294 MochiKit.Base.method(this, 'directLogins'),
303 MochiKit.Base.values, 295 MochiKit.Base.values,
304 function (someDirectLogins) { 296 function (someDirectLogins) {
305 var result; 297 var result;
306 var i,c; 298 var i,c;
307 299
308 result = []; 300 result = [];
309 c = someDirectLogins.length; 301 c = someDirectLogins.length;
310 for (i=0; i<c; i++) { 302 for (i=0; i<c; i++) {
311 result.push(Clipperz.Async.collectResults("Record.directLoginReferences - collectResults", { 303 result.push(Clipperz.Async.collectResults("Record.directLoginReferences - collectResults", {
312 '_rowObject': MochiKit.Async.succeed, 304 '_rowObject': MochiKit.Async.succeed,
313 '_reference': MochiKit.Base.methodcaller('reference'), 305 '_reference': MochiKit.Base.methodcaller('reference'),
314 'label': MochiKit.Base.methodcaller('label'), 306 'label': MochiKit.Base.methodcaller('label'),
315 'favicon': MochiKit.Base.methodcaller('favicon') 307 'favicon': MochiKit.Base.methodcaller('favicon')
316 }, {trace:false})(someDirectLogins[i])); 308 }, {trace:false})(someDirectLogins[i]));
317 }; 309 };
318 310
319 return result; 311 return result;
320 }, 312 },
321 Clipperz.Async.collectAll 313 Clipperz.Async.collectAll
322 ], {trace:false}); 314 ], {trace:false});
323 315
324 return result; 316 return result;
325 }, 317 },
326 318
327 //========================================================================= 319 //=========================================================================
328 320
329 'unpackRemoteData': function (someData) { 321 'unpackRemoteData': function (someData) {
330 var result; 322 var result;
331 323
332//console.log("new Clipperz.PM.DataModel.Record.Version [2]");
333/* 324/*
334 this._currentRecordVersion = new Clipperz.PM.DataModel.Record.Version({ 325 this._currentRecordVersion = new Clipperz.PM.DataModel.Record.Version({
335 'reference': someData['currentVersion']['reference'], 326 'reference': someData['currentVersion']['reference'],
336 'retrieveKeyFunction': MochiKit.Base.method(this, 'getCurrentRecordVersionKey'), 327 'retrieveKeyFunction': MochiKit.Base.method(this, 'getCurrentRecordVersionKey'),
337 'remoteData': someData['currentVersion'], 328 'remoteData': someData['currentVersion'],
338 }); 329 });
339*/ 330*/
340 var versionKey; 331 var versionKey;
341 332
342 for (versionKey in someData['versions']) { 333 for (versionKey in someData['versions']) {
343//console.log("### versionKey", versionKey);
344 this._versions[versionKey] = new Clipperz.PM.DataModel.Record.Version({ 334 this._versions[versionKey] = new Clipperz.PM.DataModel.Record.Version({
345 'reference': versionKey, 335 'reference': versionKey,
346 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'), 336 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'),
347 'remoteData': someData['versions'][versionKey], 337 'remoteData': someData['versions'][versionKey],
348 'getVersion': MochiKit.Base.method(this, 'getVersion') 338 'getVersion': MochiKit.Base.method(this, 'getVersion')
349 }) 339 })
350 } 340 }
351 341
352 // this._currentVersionReference = someData['currentVersion']['reference']; 342 // this._currentVersionReference = someData['currentVersion']['reference'];
353 this._currentVersionReference = someData['currentVersion']; 343 this._currentVersionReference = someData['currentVersion'];
354//console.log("=== currentVersionReference", this._currentVersionReference, someData);
355 344
356 result = Clipperz.PM.DataModel.Record.superclass.unpackRemoteData.apply(this, arguments); 345 result = Clipperz.PM.DataModel.Record.superclass.unpackRemoteData.apply(this, arguments);
357 346
358 return result; 347 return result;
359 }, 348 },
360 349
361 //------------------------------------------------------------------------- 350 //-------------------------------------------------------------------------
362 351
363 'unpackData': function (someData) { 352 'unpackData': function (someData) {
364 var result; 353 var result;
365 354
366 result = Clipperz.PM.DataModel.Record.superclass.unpackData.apply(this, arguments); 355 result = Clipperz.PM.DataModel.Record.superclass.unpackData.apply(this, arguments);
367 356
368 if (MochiKit.Base.isUndefinedOrNull(result['notes'])) { 357 if (MochiKit.Base.isUndefinedOrNull(result['notes'])) {
369 result['notes'] = '' 358 result['notes'] = ''
370 } 359 }
371 360
372 return result; 361 return result;
373 }, 362 },
374 363
375 //------------------------------------------------------------------------- 364 //-------------------------------------------------------------------------
376 365
377 'prepareRemoteDataWithKey': function (aKey) { 366 'prepareRemoteDataWithKey': function (aKey) {
378 var deferredResult; 367 var deferredResult;
379 varnewVersionKey; 368 varnewVersionKey;
380 var result; 369 var result;
381 370
382 newVersionKey = Clipperz.PM.Crypto.randomKey(); 371 newVersionKey = Clipperz.PM.Crypto.randomKey();
383 result = {}; 372 result = {};
384 373
385 deferredResult = new Clipperz.Async.Deferred("Record.prepareRemoteDataWithKey", {trace:false}); 374 deferredResult = new Clipperz.Async.Deferred("Record.prepareRemoteDataWithKey", {trace:false});
386 deferredResult.addCallbackList([ 375 deferredResult.addCallbackList([
387 Clipperz.Async.collectResults("Record.prepareRemoteDataWithKey - collect results", { 376 Clipperz.Async.collectResults("Record.prepareRemoteDataWithKey - collect results", {
388 'isBrandNew': MochiKit.Base.method(this, 'isBrandNew'), 377 'isBrandNew': MochiKit.Base.method(this, 'isBrandNew'),
389 'versionHasPendingChanges':[ 378 'versionHasPendingChanges':[
390 // MochiKit.Base.method(this, 'getCurrentRecordVersion'), 379 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
391 // MochiKit.Base.methodcaller('hasPendingChanges') 380 // MochiKit.Base.methodcaller('hasPendingChanges')
392 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges') 381 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges')
393 ] 382 ]
394 }), 383 }),
395 Clipperz.Async.or, 384 Clipperz.Async.or,
396 385
397 Clipperz.Async.deferredIf("Current Version has pending changes", [ 386 Clipperz.Async.deferredIf("Current Version has pending changes", [
398 MochiKit.Base.method(this, 'createNewRecordVersion'), 387 MochiKit.Base.method(this, 'createNewRecordVersion'),
399 MochiKit.Base.methodcaller('prepareRemoteDataWithKey', newVersionKey), 388 MochiKit.Base.methodcaller('prepareRemoteDataWithKey', newVersionKey),
400 MochiKit.Base.partial(Clipperz.Async.setItem, result, 'currentRecordVersion'), 389 MochiKit.Base.partial(Clipperz.Async.setItem, result, 'currentRecordVersion'),
401 MochiKit.Base.method(this, 'setCurrentRecordVersionKey', newVersionKey) 390 MochiKit.Base.method(this, 'setCurrentRecordVersionKey', newVersionKey)
402 ], []), 391 ], []),
403 392
404 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey), 393 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey),
405 MochiKit.Base.partial(Clipperz.Async.setItem, result, 'record'), 394 MochiKit.Base.partial(Clipperz.Async.setItem, result, 'record'),
406 395
407 MochiKit.Base.partial(MochiKit.Async.succeed, result) 396 MochiKit.Base.partial(MochiKit.Async.succeed, result)
408 ]); 397 ]);
409 398
410 deferredResult.callback(); 399 deferredResult.callback();
411 400
412 return deferredResult; 401 return deferredResult;
413 }, 402 },
414 403
415 //========================================================================= 404 //=========================================================================
416 405
417 'fields': function () { 406 'fields': function () {
418 return this.invokeCurrentRecordVersionMethod('fields'); 407 return this.invokeCurrentRecordVersionMethod('fields');
419 }, 408 },
420 409
421 'addField': function (someParameters) { 410 'addField': function (someParameters) {
422 return this.invokeCurrentRecordVersionMethod('addField', someParameters); 411 return this.invokeCurrentRecordVersionMethod('addField', someParameters);
423 }, 412 },
424 413
425 'removeField': function (someParameters) { 414 'removeField': function (someParameters) {
426 return this.invokeCurrentRecordVersionMethod('removeField', someParameters); 415 return this.invokeCurrentRecordVersionMethod('removeField', someParameters);
427 }, 416 },
428 417
429 //'sortFieldReference': function (someSortedFieldReferences) { 418 //'sortFieldReference': function (someSortedFieldReferences) {
430 // return this.invokeCurrentRecordVersionMethod('sortFieldReference', someSortedFieldReferences); 419 // return this.invokeCurrentRecordVersionMethod('sortFieldReference', someSortedFieldReferences);
431 //}, 420 //},
432 421
433 'getFieldsValues': function () { 422 'getFieldsValues': function () {
434 return this.invokeCurrentRecordVersionMethod('getFieldsValues'); 423 return this.invokeCurrentRecordVersionMethod('getFieldsValues');
435 }, 424 },
436 425
437 'fieldWithLabel': function (aLabel) { 426 'fieldWithLabel': function (aLabel) {
438 return Clipperz.Async.callbacks("Record.fieldWithLabel", [ 427 return Clipperz.Async.callbacks("Record.fieldWithLabel", [
439 MochiKit.Base.method(this, 'fields'), 428 MochiKit.Base.method(this, 'fields'),
440 MochiKit.Base.values, 429 MochiKit.Base.values,
441 MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aField) { 430 MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aField) {
442 return Clipperz.Async.callbacks("Record.fieldWithLabel - check field label", [ 431 return Clipperz.Async.callbacks("Record.fieldWithLabel - check field label", [
443 MochiKit.Base.methodcaller('label'), 432 MochiKit.Base.methodcaller('label'),
444 MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel) 433 MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel)
445 ], {trace:false}, aField); 434 ], {trace:false}, aField);
446 }), 435 }),
447 function (someFilteredResults) { 436 function (someFilteredResults) {
448 var result; 437 var result;
449 438
450 switch (someFilteredResults.length) { 439 switch (someFilteredResults.length) {
451 case 0: 440 case 0:
452 result = null; 441 result = null;
453 break; 442 break;
454 case 1: 443 case 1:
455 result = someFilteredResults[0]; 444 result = someFilteredResults[0];
456 break; 445 break;
457 default: 446 default:
458 WTF = TODO; 447 WTF = TODO;
459 break; 448 break;
460 } 449 }
461 450
462 return result; 451 return result;
463 } 452 }
464 ], {trace:false}); 453 ], {trace:false});
465 }, 454 },
466 455
467 //========================================================================= 456 //=========================================================================
468 457
469 'getVersion': function (aVersionReference) { 458 'getVersion': function (aVersionReference) {
470 return Clipperz.Async.callbacks("Record.getVersion", [ 459 return Clipperz.Async.callbacks("Record.getVersion", [
471 MochiKit.Base.method(this, 'getVersions'), 460 MochiKit.Base.method(this, 'getVersions'),
472 MochiKit.Base.itemgetter(aVersionReference) 461 MochiKit.Base.itemgetter(aVersionReference)
473 ], {trace:false}); 462 ], {trace:false});
474 }, 463 },
475 464
476 //------------------------------------------------------------------------- 465 //-------------------------------------------------------------------------
477 466
478 'getVersionKey': function (aVersionReference) { 467 'getVersionKey': function (aVersionReference) {
479 vardeferredResult; 468 vardeferredResult;
480 var transientStateKey; 469 var transientStateKey;
481 470
482 transientStateKey = 'versionKeys' + '.' + aVersionReference; 471 transientStateKey = 'versionKeys' + '.' + aVersionReference;
483 if (this.transientState().getValue(transientStateKey) != null) { 472 if (this.transientState().getValue(transientStateKey) != null) {
484 deferredResult = MochiKit.Async.succeed(this.transientState().getValue(transientStateKey)); 473 deferredResult = MochiKit.Async.succeed(this.transientState().getValue(transientStateKey));
485 } else { 474 } else {
486 deferredResult = Clipperz.Async.callbacks("Record.getVersionKey", [ 475 deferredResult = Clipperz.Async.callbacks("Record.getVersionKey", [
487 MochiKit.Base.method(this, 'getVersions'), 476 MochiKit.Base.method(this, 'getVersions'),
488 MochiKit.Base.partial(MochiKit.Base.operator.eq, aVersionReference, this.currentVersionReference()), 477 MochiKit.Base.partial(MochiKit.Base.operator.eq, aVersionReference, this.currentVersionReference()),
489 Clipperz.Async.deferredIf("getVersionKey for current version", [ 478 Clipperz.Async.deferredIf("getVersionKey for current version", [
490 MochiKit.Base.method(this, 'getCurrentRecordVersionKey'), 479 MochiKit.Base.method(this, 'getCurrentRecordVersionKey'),
491 MochiKit.Base.method(this.transientState(), 'setValue', transientStateKey) 480 MochiKit.Base.method(this.transientState(), 'setValue', transientStateKey)
492 ],[ 481 ],[
493 MochiKit.Async.fail 482 MochiKit.Async.fail
494 ]) 483 ])
495 ], {trace:false}); 484 ], {trace:false});
496 } 485 }
497 486
498 return deferredResult; 487 return deferredResult;
499 }, 488 },
500 489
501 //------------------------------------------------------------------------- 490 //-------------------------------------------------------------------------
502 491
503 'versions': function () { 492 'versions': function () {
504 return this._versions; 493 return this._versions;
505 }, 494 },
506 495
507 'getVersions': function () { 496 'getVersions': function () {
508 return Clipperz.Async.callbacks("Record.versions", [ 497 return Clipperz.Async.callbacks("Record.versions", [
509 MochiKit.Base.method(this, 'getValue', 'fakeKey, just to trigger unpackRemoteData'), 498 MochiKit.Base.method(this, 'getValue', 'fakeKey, just to trigger unpackRemoteData'),
510 MochiKit.Base.bind(function () { return this._versions; }, this) 499 MochiKit.Base.bind(function () { return this._versions; }, this)
511 ], {trace:false}); 500 ], {trace:false});
512 }, 501 },
513 502
514 //------------------------------------------------------------------------- 503 //-------------------------------------------------------------------------
515 504
516 'getCurrentRecordVersion': function () { 505 'getCurrentRecordVersion': function () {
517 return Clipperz.Async.callbacks("Record.getCurrentRecordVersion", [ 506 return Clipperz.Async.callbacks("Record.getCurrentRecordVersion", [
518 // MochiKit.Base.method(this, 'getValue', 'fakeKey, just to trigger unpackRemoteData'), 507 // MochiKit.Base.method(this, 'getValue', 'fakeKey, just to trigger unpackRemoteData'),
519 // MochiKit.Base.bind(function () { return this._currentRecordVersion; }, this) 508 // MochiKit.Base.bind(function () { return this._currentRecordVersion; }, this)
520 509
521 MochiKit.Base.method(this, 'versions'), 510 MochiKit.Base.method(this, 'versions'),
522 MochiKit.Base.itemgetter(this.currentVersionReference()), 511 MochiKit.Base.itemgetter(this.currentVersionReference()),
523 Clipperz.Async.deferredIf("The current version is available", [ 512 Clipperz.Async.deferredIf("The current version is available", [
524 MochiKit.Async.succeed 513 MochiKit.Async.succeed
525 ], [ 514 ], [
526 MochiKit.Base.method(this, 'getVersions'), 515 MochiKit.Base.method(this, 'getVersions'),
527 MochiKit.Base.bind(function (someVersions) { return someVersions[this.currentVersionReference()]}, this) 516 MochiKit.Base.bind(function (someVersions) { return someVersions[this.currentVersionReference()]}, this)
528 ]) 517 ])
529 ], {trace:false}); 518 ], {trace:false});
530 }, 519 },
531 520
532 'setCurrentRecordVersion': function (aRecordVersion) { 521 'setCurrentRecordVersion': function (aRecordVersion) {
533 this._currentVersionReference = aRecordVersion.reference(); 522 this._currentVersionReference = aRecordVersion.reference();
534 }, 523 },
535 524
536 //......................................................................... 525 //.........................................................................
537 526
538 'currentVersionReference': function () { 527 'currentVersionReference': function () {
539//console.log("currentVersionReference");
540 return this._currentVersionReference; 528 return this._currentVersionReference;
541 }, 529 },
542 530
543 //------------------------------------------------------------------------- 531 //-------------------------------------------------------------------------
544 532
545 'createNewRecordVersion': function () { 533 'createNewRecordVersion': function () {
546 var deferredResult; 534 var deferredResult;
547 535
548 if (this.isBrandNew()) { 536 if (this.isBrandNew()) {
549 deferredResult = this.getCurrentRecordVersion(); 537 deferredResult = this.getCurrentRecordVersion();
550 } else { 538 } else {
551 var newVersion; 539 var newVersion;
552 540
553 newVersion = new Clipperz.PM.DataModel.Record.Version({ 541 newVersion = new Clipperz.PM.DataModel.Record.Version({
554 // 'reference': versionKey, 542 // 'reference': versionKey,
555 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'), 543 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'),
556 // 'remoteData': {}, 544 // 'remoteData': {},
557 'getVersion': MochiKit.Base.method(this, 'getVersion') 545 'getVersion': MochiKit.Base.method(this, 'getVersion')
558 }) 546 })
559 this._versions[newVersion.reference()] = newVersion; 547 this._versions[newVersion.reference()] = newVersion;
560 548
561 deferredResult = Clipperz.Async.callbacks("Record.createNewRecordVersion", [ 549 deferredResult = Clipperz.Async.callbacks("Record.createNewRecordVersion", [
562 // MochiKit.Base.method(this, 'getCurrentRecordVersion'), 550 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
563 // MochiKit.Base.methodcaller('values'), 551 // MochiKit.Base.methodcaller('values'),
564 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'values'), 552 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'values'),
565 MochiKit.Base.method(newVersion, 'setValues'), 553 MochiKit.Base.method(newVersion, 'setValues'),
566 554
567 Clipperz.Async.collectResults("Record.createNewRecordVersion [collect results]", { 555 Clipperz.Async.collectResults("Record.createNewRecordVersion [collect results]", {
568 'reference':MochiKit.Base.method(this, 'currentVersionReference'), 556 'reference':MochiKit.Base.method(this, 'currentVersionReference'),
569 'key': MochiKit.Base.method(this, 'getCurrentRecordVersionKey') 557 'key': MochiKit.Base.method(this, 'getCurrentRecordVersionKey')
570 }, {trace:false}), 558 }, {trace:false}),
571 MochiKit.Base.method(newVersion, 'setPreviousVersionReferenceAndKey'), 559 MochiKit.Base.method(newVersion, 'setPreviousVersionReferenceAndKey'),
572 560
573 // MochiKit.Base.method(this, 'getCurrentRecordVersion'), 561 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
574 // MochiKit.Base.method(this, 'revertChanges'), 562 // MochiKit.Base.method(this, 'revertChanges'),
575 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'revertChanges'), 563 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'revertChanges'),
576 564
577 MochiKit.Base.method(this, 'setCurrentRecordVersion', newVersion), 565 MochiKit.Base.method(this, 'setCurrentRecordVersion', newVersion),
578 MochiKit.Base.partial(MochiKit.Async.succeed, newVersion) 566 MochiKit.Base.partial(MochiKit.Async.succeed, newVersion)
579 ], {trace:false}); 567 ], {trace:false});
580 } 568 }
581 569
582 return deferredResult; 570 return deferredResult;
583 }, 571 },
584 572
585 //------------------------------------------------------------------------- 573 //-------------------------------------------------------------------------
586 574
587 'getCurrentRecordVersionKey': function () { 575 'getCurrentRecordVersionKey': function () {
588//console.log("getCurrentRecordVersionKey");
589 return Clipperz.Async.callbacks("Record.getCurrentRecordVersionKey", [ 576 return Clipperz.Async.callbacks("Record.getCurrentRecordVersionKey", [
590 MochiKit.Base.method(this, 'getValue', 'currentVersionKey'), 577 MochiKit.Base.method(this, 'getValue', 'currentVersionKey'),
591 Clipperz.Async.deferredIf("currentVersionKey is NOT null", [ 578 Clipperz.Async.deferredIf("currentVersionKey is NOT null", [
592 MochiKit.Async.succeed 579 MochiKit.Async.succeed
593 ], [ 580 ], [
594 MochiKit.Base.method(this, 'getKey') 581 MochiKit.Base.method(this, 'getKey')
595 ]) 582 ])
596 ], {trace:false}); 583 ], {trace:false});
597 }, 584 },
598 585
599 'setCurrentRecordVersionKey': function (aValue) { 586 'setCurrentRecordVersionKey': function (aValue) {
600 //TODO: triple check this method! 587 //TODO: triple check this method!
601 return Clipperz.Async.callbacks("Record.setCurrentRecordVersionKey", [ 588 return Clipperz.Async.callbacks("Record.setCurrentRecordVersionKey", [
602 MochiKit.Base.method(this, 'setValue', 'currentVersionKey', aValue) 589 MochiKit.Base.method(this, 'setValue', 'currentVersionKey', aValue)
603 ], {trace:false}); 590 ], {trace:false});
604 }, 591 },
605 592
606 //------------------------------------------------------------------------- 593 //-------------------------------------------------------------------------
607 594
608 'invokeCurrentRecordVersionMethod': function (aMethodName, someValues) { 595 'invokeCurrentRecordVersionMethod': function (aMethodName, someValues) {
609//console.log(">>> invokeCurrentRecordVersionMethod", aMethodName);
610 return Clipperz.Async.callbacks("Record.invokeCurrentRecordVersionMethod", [ 596 return Clipperz.Async.callbacks("Record.invokeCurrentRecordVersionMethod", [
611 MochiKit.Base.method(this, 'getCurrentRecordVersion'), 597 MochiKit.Base.method(this, 'getCurrentRecordVersion'),
612//function (aValue) { console.log("=== getCurrentRecordVersion", aValue); return aValue},
613 MochiKit.Base.methodcaller(aMethodName, someValues) 598 MochiKit.Base.methodcaller(aMethodName, someValues)
614 ], {trace:false}); 599 ], {trace:false});
615 }, 600 },
616 601
617 602
618 'lazilyinvokeCurrentRecordVersionMethod': function (aMethodName, someValues, defaultResult) { 603 'lazilyinvokeCurrentRecordVersionMethod': function (aMethodName, someValues, defaultResult) {
619 return Clipperz.Async.callbacks("Record.lazilyinvokeCurrentRecordVersionMethod", [ 604 return Clipperz.Async.callbacks("Record.lazilyinvokeCurrentRecordVersionMethod", [
620 MochiKit.Base.method(this, 'currentVersionReference'), 605 MochiKit.Base.method(this, 'currentVersionReference'),
621//function (aValue) { console.log("LAZY -> versions", aValue); return aValue; },
622 Clipperz.Async.deferredIf("versions has been loaded", [ 606 Clipperz.Async.deferredIf("versions has been loaded", [
623//function (aValue) { console.log("LAZY -> then"); return aValue; },
624 MochiKit.Base.method(this, 'getCurrentRecordVersion'), 607 MochiKit.Base.method(this, 'getCurrentRecordVersion'),
625 MochiKit.Base.methodcaller(aMethodName, someValues), 608 MochiKit.Base.methodcaller(aMethodName, someValues),
626//function (aValue) { console.log("LAZY <- then"); return aValue; }
627 ], [ 609 ], [
628//function (aValue) { console.log("LAZY -> else"); return aValue; },
629 MochiKit.Base.partial(MochiKit.Async.succeed, defaultResult), 610 MochiKit.Base.partial(MochiKit.Async.succeed, defaultResult),
630//function (aValue) { console.log("LAZY <- else"); return aValue; }
631 ]) 611 ])
632 ], {trace:false}); 612 ], {trace:false});
633 }, 613 },
634 614
635 //========================================================================= 615 //=========================================================================
636 616
637 'hasPendingChanges': function () { 617 'hasPendingChanges': function () {
638 var deferredResult; 618 var deferredResult;
639 619
640 if (this.hasInitiatedObjectDataStore()) { 620 if (this.hasInitiatedObjectDataStore()) {
641 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.hasPendingChanges", {trace:false}); 621 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.hasPendingChanges", {trace:false});
642 deferredResult.collectResults({ 622 deferredResult.collectResults({
643 'super': MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.hasPendingChanges, this), 623 'super': MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.hasPendingChanges, this),
644 'currentVersion': [ 624 'currentVersion': [
645 // MochiKit.Base.method(this, 'getCurrentRecordVersion'), 625 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
646 // MochiKit.Base.methodcaller('hasPendingChanges') 626 // MochiKit.Base.methodcaller('hasPendingChanges')
647 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges') 627 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges')
648 ], 628 ],
649 'directLogins': [ 629 'directLogins': [
650 MochiKit.Base.method(this, 'directLogins'), 630 MochiKit.Base.method(this, 'directLogins'),
651//function (aValue) { console.log("Record.directLogins", aValue); return aValue; },
652 MochiKit.Base.values, 631 MochiKit.Base.values,
653 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasPendingChanges')), 632 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasPendingChanges')),
654 Clipperz.Async.collectAll, 633 Clipperz.Async.collectAll,
655 Clipperz.Async.or 634 Clipperz.Async.or
656 // function(someValues) { 635 // function(someValues) {
657 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); 636 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
658 // } 637 // }
659 ] 638 ]
660 }); 639 });
661//deferredResult.addCallback(function (aValue) { console.log("Record.hasPendingResults", aValue); return aValue; });
662 deferredResult.addCallback(MochiKit.Base.values); 640 deferredResult.addCallback(MochiKit.Base.values);
663 deferredResult.addCallback(MochiKit.Base.bind(function(someValues) { 641 deferredResult.addCallback(MochiKit.Base.bind(function(someValues) {
664 var result; 642 var result;
665 result = MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); 643 result = MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
666 644
667 if ((result == false) && (this.isBrandNew() == false)) { 645 if ((result == false) && (this.isBrandNew() == false)) {
668 result = MochiKit.Iter.some(MochiKit.Base.values(this.transientState().getValue('hasPendingChanges.indexData')), MochiKit.Base.operator.identity); 646 result = MochiKit.Iter.some(MochiKit.Base.values(this.transientState().getValue('hasPendingChanges.indexData')), MochiKit.Base.operator.identity);
669 } 647 }
670 648
671 return result; 649 return result;
672 }, this)); 650 }, this));
673 651
674 deferredResult.callback(); 652 deferredResult.callback();
675 } else { 653 } else {
676 deferredResult = Clipperz.Async.callbacks("Recrod.hasPendingChanges [hasInitiatedObjectDataStore == false]", [ 654 deferredResult = Clipperz.Async.callbacks("Recrod.hasPendingChanges [hasInitiatedObjectDataStore == false]", [
677 MochiKit.Base.method(this, 'directLogins'), 655 MochiKit.Base.method(this, 'directLogins'),
678 MochiKit.Base.values, 656 MochiKit.Base.values,
679 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasPendingChanges')), 657 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasPendingChanges')),
680 Clipperz.Async.collectAll, 658 Clipperz.Async.collectAll,
681 Clipperz.Async.or 659 Clipperz.Async.or
682 // function(someValues) { 660 // function(someValues) {
683 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); 661 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
684 // } 662 // }
685 ], {trace:false}) 663 ], {trace:false})
686 } 664 }
687 665
688 return deferredResult; 666 return deferredResult;
689 }, 667 },
690 668
691 //------------------------------------------------------------------------- 669 //-------------------------------------------------------------------------
692 670
693 'hasPendingChangesWhenBrandNew': function () { 671 'hasPendingChangesWhenBrandNew': function () {
694 var deferredResult; 672 var deferredResult;
695 673
696 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.hasPendingChangesWhenBrandNew", {trace:false}); 674 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.hasPendingChangesWhenBrandNew", {trace:false});
697 deferredResult.collectResults({ 675 deferredResult.collectResults({
698 'label': [ 676 'label': [
699 MochiKit.Base.method(this, 'label'), 677 MochiKit.Base.method(this, 'label'),
700 MochiKit.Base.partial(MochiKit.Base.operator.ne, '') 678 MochiKit.Base.partial(MochiKit.Base.operator.ne, '')
701 ], 679 ],
702 'notes': [ 680 'notes': [
703 MochiKit.Base.method(this, 'notes'), 681 MochiKit.Base.method(this, 'notes'),
704 MochiKit.Base.partial(MochiKit.Base.operator.ne, '') 682 MochiKit.Base.partial(MochiKit.Base.operator.ne, '')
705 ] 683 ]
706 }); 684 });
707 // deferredResult.addCallback(MochiKit.Base.values); 685 // deferredResult.addCallback(MochiKit.Base.values);
708 // deferredResult.addCallback(function(someValues) { 686 // deferredResult.addCallback(function(someValues) {
709 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); 687 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
710 // }); 688 // });
711 deferredResult.addCallback(Clipperz.Async.or); 689 deferredResult.addCallback(Clipperz.Async.or);
712 690
713 deferredResult.callback(); 691 deferredResult.callback();
714 692
715 return deferredResult; 693 return deferredResult;
716 }, 694 },
717 695
718 //------------------------------------------------------------------------- 696 //-------------------------------------------------------------------------
719 697
720 'isBrandNewWithNoPendingChanges': function () { 698 'isBrandNewWithNoPendingChanges': function () {
721 vardeferredResult; 699 vardeferredResult;
722 700
723 if (this.isBrandNew() == false) { 701 if (this.isBrandNew() == false) {
724 deferredResult = MochiKit.Async.succeed(false); 702 deferredResult = MochiKit.Async.succeed(false);
725 } else { 703 } else {
726 deferredResult = Clipperz.Async.callbacks("Record.isBrandNewWithNoPendingChanges", [ 704 deferredResult = Clipperz.Async.callbacks("Record.isBrandNewWithNoPendingChanges", [
727 MochiKit.Base.method(this, 'hasPendingChanges'), 705 MochiKit.Base.method(this, 'hasPendingChanges'),
728 MochiKit.Base.operator.lognot 706 MochiKit.Base.operator.lognot
729 ], {trace:false}); 707 ], {trace:false});
730 } 708 }
731 709
732 return deferredResult; 710 return deferredResult;
733 }, 711 },
734 712
735 //========================================================================= 713 //=========================================================================
736 714
737 'revertChanges': function () { 715 'revertChanges': function () {
738 var deferredResult; 716 var deferredResult;
739 717
740 if (this.isBrandNew() == false) { 718 if (this.isBrandNew() == false) {
741 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.revertChanges", {trace:false}); 719 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.revertChanges", {trace:false});
742 deferredResult.addMethod(this, 'hasPendingChanges'); 720 deferredResult.addMethod(this, 'hasPendingChanges');
743 deferredResult.addIf([ 721 deferredResult.addIf([
744 // MochiKit.Base.method(this, 'getCurrentRecordVersion'), 722 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
745 // MochiKit.Base.methodcaller('revertChanges'), 723 // MochiKit.Base.methodcaller('revertChanges'),
746 MochiKit.Base.method(this,'invokeCurrentRecordVersionMethod', 'revertChanges'), 724 MochiKit.Base.method(this,'invokeCurrentRecordVersionMethod', 'revertChanges'),
747 725
748 MochiKit.Base.method(this, 'directLogins'), 726 MochiKit.Base.method(this, 'directLogins'),
749 MochiKit.Base.values, 727 MochiKit.Base.values,
750 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('revertChanges')), 728 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('revertChanges')),
751 729
752 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.revertChanges, this) 730 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.revertChanges, this)
753 ], [ 731 ], [
754 MochiKit.Async.succeed 732 MochiKit.Async.succeed
755 ]); 733 ]);
756 deferredResult.callback(); 734 deferredResult.callback();
757 } else { 735 } else {
758 // this.deleteAllCleanTextData(); 736 // this.deleteAllCleanTextData();
759 deferredResult = MochiKit.Async.succeed(); 737 deferredResult = MochiKit.Async.succeed();
760 } 738 }
761 739
762 return deferredResult; 740 return deferredResult;
763 }, 741 },
764 742
765 //------------------------------------------------------------------------- 743 //-------------------------------------------------------------------------
766 744
767 'resetTransientState': function (isCommitting) { 745 'resetTransientState': function (isCommitting) {
768 // if ((isCommitting == false) && (this.transientState().getValue('directLogins') != null)) { 746 // if ((isCommitting == false) && (this.transientState().getValue('directLogins') != null)) {
769 // this._directLogins = this.transientState().getValue('directLogins'); 747 // this._directLogins = this.transientState().getValue('directLogins');
770 // } 748 // }
771 749
772 return Clipperz.Async.callbacks("Record.resetTransientState", [ 750 return Clipperz.Async.callbacks("Record.resetTransientState", [
773 //- MochiKit.Base.method(this, 'getCurrentRecordVersion'), 751 //- MochiKit.Base.method(this, 'getCurrentRecordVersion'),
774 //- MochiKit.Base.methodcaller('resetTransientState'), 752 //- MochiKit.Base.methodcaller('resetTransientState'),
775 // MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'resetTransientState'), 753 // MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'resetTransientState'),
776 MochiKit.Base.method(this, 'lazilyinvokeCurrentRecordVersionMethod', 'resetTransientState'), 754 MochiKit.Base.method(this, 'lazilyinvokeCurrentRecordVersionMethod', 'resetTransientState'),
777 755
778 MochiKit.Base.method(this, 'directLogins'), 756 MochiKit.Base.method(this, 'directLogins'),
779//function (aValue) { console.log("resetTransientState - directLogins", aValue); return aValue; },
780 MochiKit.Base.values, 757 MochiKit.Base.values,
781 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('resetTransientState')), 758 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('resetTransientState')),
782 759
783 MochiKit.Base.bind(function () { 760 MochiKit.Base.bind(function () {
784 if ((isCommitting == false) && (this.transientState().getValue('directLogins') != null)) { 761 if ((isCommitting == false) && (this.transientState().getValue('directLogins') != null)) {
785 this._directLogins = this.transientState().getValue('directLogins'); 762 this._directLogins = this.transientState().getValue('directLogins');
786 } 763 }
787 }, this), 764 }, this),
788 765
789 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.resetTransientState, this, isCommitting) 766 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.resetTransientState, this, isCommitting)
790 ], {trace:false}) 767 ], {trace:false})
791 }, 768 },
792 769
793 //------------------------------------------------------------------------- 770 //-------------------------------------------------------------------------
794 771
795 'commitTransientState': function () { 772 'commitTransientState': function () {
796 var deferredResult; 773 var deferredResult;
797 774
798 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.commitTransientState", {trace:false}); 775 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.commitTransientState", {trace:false});
799 deferredResult.addMethod(this, 'hasPendingChanges'); 776 deferredResult.addMethod(this, 'hasPendingChanges');
800 deferredResult.addIf([ 777 deferredResult.addIf([
801 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.commitTransientState, this), 778 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.commitTransientState, this),
802 // MochiKit.Base.method(this, 'getCurrentRecordVersion'), 779 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
803 // MochiKit.Base.methodcaller('commitTransientState'), 780 // MochiKit.Base.methodcaller('commitTransientState'),
804 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'commitTransientState'), 781 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'commitTransientState'),
805 MochiKit.Base.method(this, 'directLogins'), 782 MochiKit.Base.method(this, 'directLogins'),
806 MochiKit.Base.values, 783 MochiKit.Base.values,
807 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('commitTransientState')) 784 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('commitTransientState'))
808 ], [ 785 ], [
809 MochiKit.Async.succeed 786 MochiKit.Async.succeed
810 ]); 787 ]);
811 deferredResult.callback(); 788 deferredResult.callback();
812 789
813 return deferredResult; 790 return deferredResult;
814 }, 791 },
815 792
816 //========================================================================= 793 //=========================================================================
817 794
818 'retrieveDirectLoginIndexDataFunction': function () { 795 'retrieveDirectLoginIndexDataFunction': function () {
819//console.log("Record.retrieveDirectLoginIndexDataFunction", this._retrieveDirectLoginIndexDataFunction);
820 return this._retrieveDirectLoginIndexDataFunction; 796 return this._retrieveDirectLoginIndexDataFunction;
821 }, 797 },
822 798
823 'setDirectLoginIndexDataFunction': function () { 799 'setDirectLoginIndexDataFunction': function () {
824 return this._setDirectLoginIndexDataFunction; 800 return this._setDirectLoginIndexDataFunction;
825 }, 801 },
826 802
827 'removeDirectLoginIndexDataFunction': function () { 803 'removeDirectLoginIndexDataFunction': function () {
828 return this._removeDirectLoginIndexDataFunction; 804 return this._removeDirectLoginIndexDataFunction;
829 }, 805 },
830 806
831 //========================================================================= 807 //=========================================================================
832 808
833 'deleteAllCleanTextData': function () { 809 'deleteAllCleanTextData': function () {
834 // return Clipperz.PM.DataModel.Record.superclass.deleteAllCleanTextData.apply(this, arguments); 810 // return Clipperz.PM.DataModel.Record.superclass.deleteAllCleanTextData.apply(this, arguments);
835 811
836 return Clipperz.Async.callbacks("Record.deleteAllCleanTextData", [ 812 return Clipperz.Async.callbacks("Record.deleteAllCleanTextData", [
837 MochiKit.Base.method(this, 'versions'), 813 MochiKit.Base.method(this, 'versions'),
838 MochiKit.Base.values, 814 MochiKit.Base.values,
839 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')), 815 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
840 816
841 MochiKit.Base.method(this, 'directLogins'), 817 MochiKit.Base.method(this, 'directLogins'),
842 MochiKit.Base.values, 818 MochiKit.Base.values,
843 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')), 819 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
844 820
845 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.deleteAllCleanTextData, this) 821 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.deleteAllCleanTextData, this)
846 ], {trace:false}); 822 ], {trace:false});
847 }, 823 },
848 824
849 'hasAnyCleanTextData': function () { 825 'hasAnyCleanTextData': function () {
850 // return Clipperz.PM.DataModel.Record.superclass.hasAnyCleanTextData.apply(this, arguments); 826 // return Clipperz.PM.DataModel.Record.superclass.hasAnyCleanTextData.apply(this, arguments);
851 827
852 return Clipperz.Async.callbacks("Record.hasAnyCleanTextData", [ 828 return Clipperz.Async.callbacks("Record.hasAnyCleanTextData", [
853 Clipperz.Async.collectResults("Record.hasAnyCleanTextData [collect results]", { 829 Clipperz.Async.collectResults("Record.hasAnyCleanTextData [collect results]", {
854 'versions':[ 830 'versions':[
855 MochiKit.Base.method(this, 'versions'), 831 MochiKit.Base.method(this, 'versions'),
856 MochiKit.Base.values, 832 MochiKit.Base.values,
857 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')), 833 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
858 Clipperz.Async.collectAll 834 Clipperz.Async.collectAll
859 ], 835 ],
860 'directLogins': [ 836 'directLogins': [
861 MochiKit.Base.method(this, 'directLogins'), 837 MochiKit.Base.method(this, 'directLogins'),
862 MochiKit.Base.values, 838 MochiKit.Base.values,
863 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')), 839 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
864 Clipperz.Async.collectAll 840 Clipperz.Async.collectAll
865 ], 841 ],
866 'super': [ 842 'super': [
867 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.hasAnyCleanTextData, this) 843 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.hasAnyCleanTextData, this)
868 ] 844 ]
869 }, {trace:false}), 845 }, {trace:false}),
870 Clipperz.Async.or 846 Clipperz.Async.or
871 ]) 847 ])
872 }, 848 },
873 849
874 //========================================================================= 850 //=========================================================================
875 __syntaxFix__: "syntax fix" 851 __syntaxFix__: "syntax fix"
876}); 852});
877 853
878 854
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js
index d6202ff..cda5a41 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.PM.DataModel.User.Header.Legacy depends on Clipperz.PM.DataModel.User!"; 25 throw "Clipperz.PM.DataModel.User.Header.Legacy depends on Clipperz.PM.DataModel.User!";
28} 26}
29 27
30if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } 28if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
31 29
32Clipperz.PM.DataModel.User.Header.Legacy = function(args) { 30Clipperz.PM.DataModel.User.Header.Legacy = function(args) {
33 //args = args || {}; 31 //args = args || {};
34 Clipperz.PM.DataModel.User.Header.Legacy.superclass.constructor.apply(this, arguments); 32 Clipperz.PM.DataModel.User.Header.Legacy.superclass.constructor.apply(this, arguments);
35 33
36 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._records = null; 35 this._records = null;
38 //this._directLogins = null; 36 //this._directLogins = null;
39 37
40 return this; 38 return this;
41} 39}
42 40
43 41
44Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Legacy, Clipperz.PM.DataModel.EncryptedRemoteObject, { 42Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Legacy, Clipperz.PM.DataModel.EncryptedRemoteObject, {
45 43
46 'toString': function() { 44 'toString': function() {
47 return "Clipperz.PM.DataModel.User.Header.Legacy"; 45 return "Clipperz.PM.DataModel.User.Header.Legacy";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'retrieveRecordDetailFunction': function () { 50 'retrieveRecordDetailFunction': function () {
53 return this._retrieveRecordDetailFunction; 51 return this._retrieveRecordDetailFunction;
54 }, 52 },
55 53
56 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
57 55
58 'getRecordKey': function (aRecordReference) { 56 'getRecordKey': function (aRecordReference) {
59 var deferredResult; 57 var deferredResult;
60 58
61 deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.getRecordKey", {trace:false}); 59 deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.getRecordKey", {trace:false});
62 deferredResult.addMethod(this, 'getRecordIndexData'); 60 deferredResult.addMethod(this, 'getRecordIndexData');
63 deferredResult.addCallback(MochiKit.Base.itemgetter('key')) 61 deferredResult.addCallback(MochiKit.Base.itemgetter('key'))
64 deferredResult.callback(); 62 deferredResult.callback();
65 63
66 return deferredResult; 64 return deferredResult;
67 }, 65 },
68 66
69 //========================================================================= 67 //=========================================================================
70 68
71 'getRecordIndexData': function (aRecordReference) { 69 'getRecordIndexData': function (aRecordReference) {
72 return this.getValue('records.' + aRecordReference); 70 return this.getValue('records.' + aRecordReference);
73 }, 71 },
74 72
75 'updateRecordIndexData': function (aRecordReference, aKey, aValue) { 73 'updateRecordIndexData': function (aRecordReference, aKey, aValue) {
76 return this.setValue('records.' + aRecordReference + "." + aKey, aValue); 74 return this.setValue('records.' + aRecordReference + "." + aKey, aValue);
77 }, 75 },
78 76
79 //------------------------------------------------------------------------- 77 //-------------------------------------------------------------------------
80 78
81 'getDirectLoginIndexData': function (aDirectLoginReference) { 79 'getDirectLoginIndexData': function (aDirectLoginReference) {
82 return this.getValue('directLogins.' + aDirectLoginReference); 80 return this.getValue('directLogins.' + aDirectLoginReference);
83 }, 81 },
84 82
85 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) { 83 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) {
86 return this.setValue('directLogins.' + aDirectLoginReference + '.' + aKey, aValue); 84 return this.setValue('directLogins.' + aDirectLoginReference + '.' + aKey, aValue);
87 }, 85 },
88 86
89 'removeDirectLoginIndexData': function (aDirectLoginReference) { 87 'removeDirectLoginIndexData': function (aDirectLoginReference) {
90 return this.removeValue('directLogins.' + aDirectLoginReference); 88 return this.removeValue('directLogins.' + aDirectLoginReference);
91 }, 89 },
92 90
93 //========================================================================= 91 //=========================================================================
94 92
95 'records': function () { 93 'records': function () {
96 vardeferredResult; 94 vardeferredResult;
97 var deferredLock; 95 var deferredLock;
98 96
99 deferredLock = this.getDeferredLockForKey('records'); 97 deferredLock = this.getDeferredLockForKey('records');
100 98
101 deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records", {trace:false}); 99 deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records", {trace:false});
102 deferredResult.acquireLock(deferredLock); 100 deferredResult.acquireLock(deferredLock);
103 deferredResult.addCallback(MochiKit.Base.bind(function () { 101 deferredResult.addCallback(MochiKit.Base.bind(function () {
104 var innerDeferredResult; 102 var innerDeferredResult;
105 103
106 if (this._records == null) { 104 if (this._records == null) {
107 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records <inner deferred>", {trace:false}); 105 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records <inner deferred>", {trace:false});
108 innerDeferredResult.collectResults({ 106 innerDeferredResult.collectResults({
109 'header': [ 107 'header': [
110 // MochiKit.Base.method(this, 'getObjectDataStore'), 108 // MochiKit.Base.method(this, 'getObjectDataStore'),
111 // MochiKit.Base.methodcaller('values') 109 // MochiKit.Base.methodcaller('values')
112 MochiKit.Base.method(this, 'values') 110 MochiKit.Base.method(this, 'values')
113 ], 111 ],
114 'recordsStats': [ 112 'recordsStats': [
115 MochiKit.Base.method(this, 'getRemoteData'), 113 MochiKit.Base.method(this, 'getRemoteData'),
116 MochiKit.Base.itemgetter('recordsStats') 114 MochiKit.Base.itemgetter('recordsStats')
117 ] 115 ]
118 }); 116 });
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js
index 3528db6..e82da47 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js
@@ -1,125 +1,117 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.PM.DataModel.User.Header.OneTimePasswords depends on Clipperz.PM.DataModel.User!"; 25 throw "Clipperz.PM.DataModel.User.Header.OneTimePasswords depends on Clipperz.PM.DataModel.User!";
28} 26}
29if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } 27if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
30 28
31//----------------------------------------------------------------------------- 29//-----------------------------------------------------------------------------
32 30
33Clipperz.PM.DataModel.User.Header.OneTimePasswords = function(args) { 31Clipperz.PM.DataModel.User.Header.OneTimePasswords = function(args) {
34 Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.constructor.apply(this, arguments); 32 Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.constructor.apply(this, arguments);
35 33
36 this._oneTimePasswords = null; 34 this._oneTimePasswords = null;
37 35
38 return this; 36 return this;
39} 37}
40 38
41//----------------------------------------------------------------------------- 39//-----------------------------------------------------------------------------
42 40
43Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.OneTimePasswords, Clipperz.PM.DataModel.EncryptedRemoteObject, { 41Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.OneTimePasswords, Clipperz.PM.DataModel.EncryptedRemoteObject, {
44 42
45 'toString': function() { 43 'toString': function() {
46 return "Clipperz.PM.DataModel.User.Header.OneTimePasswords"; 44 return "Clipperz.PM.DataModel.User.Header.OneTimePasswords";
47 }, 45 },
48 46
49 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
50/* 48/*
51 'packData': function (someData) { //++ 49 'packData': function (someData) { //++
52 var result; 50 var result;
53 51
54console.log(">>> OneTimePasswords.packData", someData);
55 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packData.apply(this, arguments); 52 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packData.apply(this, arguments);
56console.log("<<< OneTimePasswords.packData");
57 53
58 return result; 54 return result;
59 }, 55 },
60*/ 56*/
61 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
62/* 58/*
63 'packRemoteData': function (someData) { 59 'packRemoteData': function (someData) {
64 var result; 60 var result;
65 61
66console.log(">>> OneTimePasswords.packRemoteData", someData);
67 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packRemoteData.apply(this, arguments); 62 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packRemoteData.apply(this, arguments);
68console.log("<<< OneTimePasswords.packRemoteData");
69 63
70 return result; 64 return result;
71 }, 65 },
72*/ 66*/
73 //------------------------------------------------------------------------- 67 //-------------------------------------------------------------------------
74/* 68/*
75 'prepareRemoteDataWithKey': function (aKey) { 69 'prepareRemoteDataWithKey': function (aKey) {
76 var result; 70 var result;
77 71
78console.log(">>> OneTimePasswords.prepareRemoteDataWithKey");
79 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.prepareRemoteDataWithKey.apply(this, arguments); 72 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.prepareRemoteDataWithKey.apply(this, arguments);
80console.log("<<< OneTimePasswords.prepareRemoteDataWithKey");
81 73
82 return result; 74 return result;
83 }, 75 },
84*/ 76*/
85 //========================================================================= 77 //=========================================================================
86 78
87 'oneTimePasswords': function () { 79 'oneTimePasswords': function () {
88 vardeferredResult; 80 vardeferredResult;
89 81
90 deferredResult = new Clipperz.Async.Deferred("User.Header.OneTimePasswords.oneTimePasswords", {trace:false}); 82 deferredResult = new Clipperz.Async.Deferred("User.Header.OneTimePasswords.oneTimePasswords", {trace:false});
91 if (this._oneTimePasswords == null) { 83 if (this._oneTimePasswords == null) {
92 deferredResult.addMethod(this, 'values') 84 deferredResult.addMethod(this, 'values')
93 deferredResult.addCallback(MochiKit.Base.bind(function (someData) { 85 deferredResult.addCallback(MochiKit.Base.bind(function (someData) {
94 varotpKey; 86 varotpKey;
95 87
96 this._oneTimePasswords = {}; 88 this._oneTimePasswords = {};
97 89
98 for (otpKey in someData) { 90 for (otpKey in someData) {
99 var otp; 91 var otp;
100 var otpParameters; 92 var otpParameters;
101 93
102 otpParameters = Clipperz.Base.deepClone(someData[otpKey]); 94 otpParameters = Clipperz.Base.deepClone(someData[otpKey]);
103 otpParameters['reference'] = otpKey; 95 otpParameters['reference'] = otpKey;
104 96
105 otp = new Clipperz.PM.DataModel.OneTimePassword(otpParameters); 97 otp = new Clipperz.PM.DataModel.OneTimePassword(otpParameters);
106 this._oneTimePasswords[otpKey] = otp; 98 this._oneTimePasswords[otpKey] = otp;
107 } 99 }
108 100
109 return this._oneTimePasswords; 101 return this._oneTimePasswords;
110 102
111 }, this)); 103 }, this));
112 deferredResult.callback(); 104 deferredResult.callback();
113 } else { 105 } else {
114 deferredResult = MochiKit.Async.succeed(this._oneTimePasswords); 106 deferredResult = MochiKit.Async.succeed(this._oneTimePasswords);
115 } 107 }
116 108
117 return deferredResult; 109 return deferredResult;
118 }, 110 },
119 111
120 //========================================================================= 112 //=========================================================================
121 __syntaxFix__: "syntax fix" 113 __syntaxFix__: "syntax fix"
122}); 114});
123 115
124//----------------------------------------------------------------------------- 116//-----------------------------------------------------------------------------
125 117
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js
index b164889..f1f95e8 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js
@@ -1,50 +1,48 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.PM.DataModel.User.Header.Preferences depends on Clipperz.PM.DataModel.User!"; 25 throw "Clipperz.PM.DataModel.User.Header.Preferences depends on Clipperz.PM.DataModel.User!";
28} 26}
29 27
30if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } 28if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
31 29
32Clipperz.PM.DataModel.User.Header.Preferences = function(args) { 30Clipperz.PM.DataModel.User.Header.Preferences = function(args) {
33 Clipperz.PM.DataModel.User.Header.Preferences.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.DataModel.User.Header.Preferences.superclass.constructor.apply(this, arguments);
34 32
35 return this; 33 return this;
36} 34}
37 35
38 36
39Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Preferences, Clipperz.PM.DataModel.EncryptedRemoteObject, { 37Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Preferences, Clipperz.PM.DataModel.EncryptedRemoteObject, {
40 38
41 'toString': function() { 39 'toString': function() {
42 return "Clipperz.PM.DataModel.User.Header.Preferences"; 40 return "Clipperz.PM.DataModel.User.Header.Preferences";
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 //========================================================================= 44 //=========================================================================
47 __syntaxFix__: "syntax fix" 45 __syntaxFix__: "syntax fix"
48}); 46});
49 47
50 48
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
index f77ea80..5681f70 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
@@ -1,669 +1,652 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.PM.DataModel.User.Header.RecordIndex depends on Clipperz.PM.DataModel.User!"; 25 throw "Clipperz.PM.DataModel.User.Header.RecordIndex depends on Clipperz.PM.DataModel.User!";
28} 26}
29 27
30if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } 28if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
31 29
32Clipperz.PM.DataModel.User.Header.RecordIndex = function(args) { 30Clipperz.PM.DataModel.User.Header.RecordIndex = function(args) {
33 Clipperz.PM.DataModel.User.Header.RecordIndex.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.DataModel.User.Header.RecordIndex.superclass.constructor.apply(this, arguments);
34 32
35//console.log("NEW Clipperz.PM.DataModel.User.Header.RecordIndex", args);
36 this._recordsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 33 this._recordsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({
37 'name':'recordsData', 34 'name':'recordsData',
38 'retrieveKeyFunction': args.retrieveKeyFunction, 35 'retrieveKeyFunction': args.retrieveKeyFunction,
39 'remoteData': { 36 'remoteData': {
40 'data': args.recordsData['data'], 37 'data': args.recordsData['data'],
41 'version': args.encryptedDataVersion, 38 'version': args.encryptedDataVersion,
42 'recordsStats': args.recordsStats 39 'recordsStats': args.recordsStats
43 }//, 40 }//,
44 // 'encryptedDataKeypath': 'data', 41 // 'encryptedDataKeypath': 'data',
45 // 'encryptedVersionKeypath': 'version' 42 // 'encryptedVersionKeypath': 'version'
46 }); 43 });
47 44
48 this._directLoginsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 45 this._directLoginsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({
49 'name':'directLoginsData', 46 'name':'directLoginsData',
50 'retrieveKeyFunction': args.retrieveKeyFunction, 47 'retrieveKeyFunction': args.retrieveKeyFunction,
51 'remoteData': { 48 'remoteData': {
52 'data': args.directLoginsData['data'], 49 'data': args.directLoginsData['data'],
53 'version': args.encryptedDataVersion 50 'version': args.encryptedDataVersion
54 }//, 51 }//,
55 // 'encryptedDataKeypath': 'data', 52 // 'encryptedDataKeypath': 'data',
56 // 'encryptedVersionKeypath': 'version' 53 // 'encryptedVersionKeypath': 'version'
57 }); 54 });
58 55
59 this._lock = new MochiKit.Async.DeferredLock(); 56 this._lock = new MochiKit.Async.DeferredLock();
60 this._transientState = null; 57 this._transientState = null;
61 58
62 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter'); 59 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
63 this._recordsIndex = args.recordsData['index'] || Clipperz.Base.exception.raise('MandatoryParameter'); 60 this._recordsIndex = args.recordsData['index'] || Clipperz.Base.exception.raise('MandatoryParameter');
64 this._directLoginsIndex = args.directLoginsData['index']|| Clipperz.Base.exception.raise('MandatoryParameter'); 61 this._directLoginsIndex = args.directLoginsData['index']|| Clipperz.Base.exception.raise('MandatoryParameter');
65 62
66 this._records = null; 63 this._records = null;
67 64
68 return this; 65 return this;
69} 66}
70 67
71 68
72Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.RecordIndex, Object, { 69Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.RecordIndex, Object, {
73 70
74 'toString': function() { 71 'toString': function() {
75 return "Clipperz.PM.DataModel.User.Header.RecordIndex"; 72 return "Clipperz.PM.DataModel.User.Header.RecordIndex";
76 }, 73 },
77 74
78 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
79 76
80 'retrieveRecordDetailFunction': function () { 77 'retrieveRecordDetailFunction': function () {
81 return this._retrieveRecordDetailFunction; 78 return this._retrieveRecordDetailFunction;
82 }, 79 },
83 80
84 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
85 82
86 'recordsIndex': function () { 83 'recordsIndex': function () {
87 return this._recordsIndex; 84 return this._recordsIndex;
88 }, 85 },
89 86
90 'recordsData': function () { 87 'recordsData': function () {
91 return this._recordsData; 88 return this._recordsData;
92 }, 89 },
93 90
94 //------------------------------------------------------------------------- 91 //-------------------------------------------------------------------------
95 92
96 'directLoginsIndex': function () { 93 'directLoginsIndex': function () {
97 return this._directLoginsIndex; 94 return this._directLoginsIndex;
98 }, 95 },
99 96
100 'directLoginsData': function () { 97 'directLoginsData': function () {
101 return this._directLoginsData; 98 return this._directLoginsData;
102 }, 99 },
103 100
104 //------------------------------------------------------------------------- 101 //-------------------------------------------------------------------------
105 102
106 'lock': function () { 103 'lock': function () {
107 return this._lock; 104 return this._lock;
108 }, 105 },
109 106
110 //------------------------------------------------------------------------- 107 //-------------------------------------------------------------------------
111 108
112 'transientState': function () { 109 'transientState': function () {
113 if (this._transientState == null) { 110 if (this._transientState == null) {
114 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'User.Header.RecordIndex.transientState [1]'}*/); 111 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'User.Header.RecordIndex.transientState [1]'}*/);
115 } 112 }
116 113
117 return this._transientState; 114 return this._transientState;
118 }, 115 },
119 116
120 'resetTransientState': function (isCommitting) { 117 'resetTransientState': function (isCommitting) {
121//console.log("######## UserHeaderRecordIndex - resetTransientState", Clipperz.Base.deepClone(this._transientState));
122 if (this._transientState != null) { 118 if (this._transientState != null) {
123 this._transientState.removeAllData(); 119 this._transientState.removeAllData();
124 } 120 }
125 121
126 this._transientState = null; 122 this._transientState = null;
127 }, 123 },
128 124
129 //------------------------------------------------------------------------- 125 //-------------------------------------------------------------------------
130 126
131 'getRecordKey': function (aRecordReference) { 127 'getRecordKey': function (aRecordReference) {
132 return Clipperz.Async.callbacks("User.Header.RecordIndex.getRecordKey", [ 128 return Clipperz.Async.callbacks("User.Header.RecordIndex.getRecordKey", [
133 MochiKit.Base.method(this, 'getRecordIndexData', aRecordReference), 129 MochiKit.Base.method(this, 'getRecordIndexData', aRecordReference),
134 MochiKit.Base.itemgetter('key') 130 MochiKit.Base.itemgetter('key')
135 ], {trace:false}); 131 ], {trace:false});
136 }, 132 },
137 133
138 'setRecordKey': function (aRecordReference, aValue) { 134 'setRecordKey': function (aRecordReference, aValue) {
139 return this.updateRecordIndexData(aRecordReference, 'key', aValue); 135 return this.updateRecordIndexData(aRecordReference, 'key', aValue);
140 }, 136 },
141 137
142 //------------------------------------------------------------------------- 138 //-------------------------------------------------------------------------
143 139
144 'getRecordIndexData': function (aRecordReference) { 140 'getRecordIndexData': function (aRecordReference) {
145 return this.recordsData().getValue(this.recordsIndex()[aRecordReference]); 141 return this.recordsData().getValue(this.recordsIndex()[aRecordReference]);
146 }, 142 },
147 143
148 //......................................................................... 144 //.........................................................................
149 145
150 'updateRecordIndexData': function (aRecordReference, aKey, aValue) { 146 'updateRecordIndexData': function (aRecordReference, aKey, aValue) {
151 return this.recordsData().setValue(this.recordsIndex()[aRecordReference]+'.'+aKey, aValue); 147 return this.recordsData().setValue(this.recordsIndex()[aRecordReference]+'.'+aKey, aValue);
152 }, 148 },
153 149
154 //------------------------------------------------------------------------- 150 //-------------------------------------------------------------------------
155 151
156 'getDirectLoginIndexData': function (aDirectLoginReference) { 152 'getDirectLoginIndexData': function (aDirectLoginReference) {
157 return this.directLoginsData().getValue(this.directLoginsIndex()[aDirectLoginReference]); 153 return this.directLoginsData().getValue(this.directLoginsIndex()[aDirectLoginReference]);
158 }, 154 },
159 155
160 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) { 156 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) {
161//console.log("UserHeaderRecordIndex.setDirectLoginIndexData", aDirectLoginReference, this.directLoginsIndex()[aDirectLoginReference], aKey);
162//if (MochiKit.Base.isUndefinedOrNull(this.directLoginsIndex()[aDirectLoginReference])) { 157//if (MochiKit.Base.isUndefinedOrNull(this.directLoginsIndex()[aDirectLoginReference])) {
163 //throw "PIPPO"; 158 //throw "PIPPO";
164//} 159//}
165 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference] + '.' + aKey, aValue); 160 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference] + '.' + aKey, aValue);
166 }, 161 },
167 162
168 'addDirectLoginIndexData': function (aDirectLoginReference) { 163 'addDirectLoginIndexData': function (aDirectLoginReference) {
169//console.log("UserHeaderRecordIndex.addDirectLoginIndexData", aDirectLoginReference, this.directLoginsIndex()[aDirectLoginReference]);
170 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference], {}); 164 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference], {});
171 }, 165 },
172 166
173 'removeDirectLoginIndexData': function (aDirectLoginReference) { 167 'removeDirectLoginIndexData': function (aDirectLoginReference) {
174 return this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLoginReference]) 168 return this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLoginReference])
175 }, 169 },
176 170
177 //------------------------------------------------------------------------- 171 //-------------------------------------------------------------------------
178 172
179 'records': function () { 173 'records': function () {
180 vardeferredResult; 174 vardeferredResult;
181 175
182 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records", {trace:false}); 176 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records", {trace:false});
183 deferredResult.acquireLock(this.lock()); 177 deferredResult.acquireLock(this.lock());
184 deferredResult.addCallback(MochiKit.Base.bind(function () { 178 deferredResult.addCallback(MochiKit.Base.bind(function () {
185 var innerDeferredResult; 179 var innerDeferredResult;
186 180
187 if (this._records == null) { 181 if (this._records == null) {
188 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records <inner deferred>", {trace:false}); 182 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records <inner deferred>", {trace:false});
189 innerDeferredResult.collectResults({ 183 innerDeferredResult.collectResults({
190 'records': [ 184 'records': [
191 // MochiKit.Base.method(this.recordsData(), 'getObjectDataStore'), 185 // MochiKit.Base.method(this.recordsData(), 'getObjectDataStore'),
192 // MochiKit.Base.methodcaller('values') 186 // MochiKit.Base.methodcaller('values')
193 MochiKit.Base.method(this.recordsData(), 'values') 187 MochiKit.Base.method(this.recordsData(), 'values')
194 ], 188 ],
195 'recordsStats': [ 189 'recordsStats': [
196 MochiKit.Base.method(this.recordsData(), 'getRemoteData'), 190 MochiKit.Base.method(this.recordsData(), 'getRemoteData'),
197 MochiKit.Base.itemgetter('recordsStats') 191 MochiKit.Base.itemgetter('recordsStats')
198 ], 192 ],
199 'directLogins': [ 193 'directLogins': [
200 // MochiKit.Base.method(this.directLoginsData(), 'getObjectDataStore'), 194 // MochiKit.Base.method(this.directLoginsData(), 'getObjectDataStore'),
201 // MochiKit.Base.methodcaller('values') 195 // MochiKit.Base.methodcaller('values')
202 MochiKit.Base.method(this.directLoginsData(), 'values') 196 MochiKit.Base.method(this.directLoginsData(), 'values')
203 ] 197 ]
204 }) 198 })
205 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someData) { 199 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someData) {
206 var indexReference; 200 var indexReference;
207 var recordsInvertedIndex; 201 var recordsInvertedIndex;
208 var directLoginsInvertedIndex; 202 var directLoginsInvertedIndex;
209 203
210 recordsInvertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.recordsIndex()); 204 recordsInvertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.recordsIndex());
211 directLoginsInvertedIndex= Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.directLoginsIndex()); 205 directLoginsInvertedIndex= Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.directLoginsIndex());
212 206
213 this._records = {}; 207 this._records = {};
214 208
215 for (indexReference in someData['records']) { 209 for (indexReference in someData['records']) {
216 varrecord; 210 varrecord;
217 var reference; 211 var reference;
218 var updateDate; 212 var updateDate;
219 213
220 reference = recordsInvertedIndex[indexReference]; 214 reference = recordsInvertedIndex[indexReference];
221 215
222 if (typeof(someData['recordsStats'][reference]) != 'undefined') { 216 if (typeof(someData['recordsStats'][reference]) != 'undefined') {
223 updateDate = someData['recordsStats'][reference]['updateDate']; 217 updateDate = someData['recordsStats'][reference]['updateDate'];
224 218
225 record = new Clipperz.PM.DataModel.Record({ 219 record = new Clipperz.PM.DataModel.Record({
226 'reference': reference, 220 'reference': reference,
227 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'), 221 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
228 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(), 222 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
229 223
230 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'), 224 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
231 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'), 225 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
232 'updateDate': updateDate, 226 'updateDate': updateDate,
233 227
234 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'), 228 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
235 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'), 229 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
236 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'), 230 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'),
237 231
238 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin') 232 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin')
239 }); 233 });
240 234
241 this._records[reference] = record; 235 this._records[reference] = record;
242 } else { 236 } else {
243Clipperz.log("SKIPPING record " + reference + " as there are no stas associated - " + Clipperz.Base.serializeJSON(someData['records'][reference])); 237Clipperz.log("SKIPPING record " + reference + " as there are no stas associated - " + Clipperz.Base.serializeJSON(someData['records'][reference]));
244 //# skip the record, as it seems it is not present in the DB 238 //# skip the record, as it seems it is not present in the DB
245 //updateDate = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); 239 //updateDate = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
246 } 240 }
247 } 241 }
248 242
249 for (indexReference in someData['directLogins']) { 243 for (indexReference in someData['directLogins']) {
250 // vardirectLogin; 244 // vardirectLogin;
251 var reference; 245 var reference;
252 var record; 246 var record;
253 247
254 reference = directLoginsInvertedIndex[indexReference]; 248 reference = directLoginsInvertedIndex[indexReference];
255 record = this._records[recordsInvertedIndex[someData['directLogins'][indexReference]['record']]]; 249 record = this._records[recordsInvertedIndex[someData['directLogins'][indexReference]['record']]];
256 250
257 if (record != null) { 251 if (record != null) {
258 // directLogin = new Clipperz.PM.DataModel.DirectLogin({ 252 // directLogin = new Clipperz.PM.DataModel.DirectLogin({
259 new Clipperz.PM.DataModel.DirectLogin({ 253 new Clipperz.PM.DataModel.DirectLogin({
260 'reference': reference, 254 'reference': reference,
261 'record': record 255 'record': record
262 }); 256 });
263 } else { 257 } else {
264Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!"); 258 Clipperz.logWarning("WARNING: DIRECT LOGIN without a matching RECORD!!");
265//console.log("direct login data", someData['directLogins']);
266//console.log("current direct login data", someData['directLogins'][indexReference])
267//console.log("reference", reference);
268//console.log("record index", this.recordsIndex());
269//console.log("record inverted index", recordsInvertedIndex);
270 } 259 }
271 } 260 }
272 261
273 return this._records; 262 return this._records;
274 }, this)); 263 }, this));
275 innerDeferredResult.callback(); 264 innerDeferredResult.callback();
276 } else { 265 } else {
277 innerDeferredResult = MochiKit.Async.succeed(this._records); 266 innerDeferredResult = MochiKit.Async.succeed(this._records);
278 } 267 }
279 268
280 return innerDeferredResult; 269 return innerDeferredResult;
281 }, this)); 270 }, this));
282 deferredResult.releaseLock(this.lock()); 271 deferredResult.releaseLock(this.lock());
283 deferredResult.callback(); 272 deferredResult.callback();
284 273
285 return deferredResult; 274 return deferredResult;
286 }, 275 },
287 276
288 //------------------------------------------------------------------------- 277 //-------------------------------------------------------------------------
289 278
290 'updateRecordIndexForNewRecord': function (aNewRecord) { 279 'updateRecordIndexForNewRecord': function (aNewRecord) {
291 var newRecordIndex; 280 var newRecordIndex;
292 var recordReference; 281 var recordReference;
293 282
294 recordReference = aNewRecord.reference(); 283 recordReference = aNewRecord.reference();
295 newRecordIndex = (MochiKit.Base.listMax(MochiKit.Base.map(MochiKit.Base.partial(MochiKit.Base.operator.mul, 1), MochiKit.Base.values(this.recordsIndex()))) + 1) + ''; 284 newRecordIndex = (MochiKit.Base.listMax(MochiKit.Base.map(MochiKit.Base.partial(MochiKit.Base.operator.mul, 1), MochiKit.Base.values(this.recordsIndex()))) + 1) + '';
296 this.recordsIndex()[recordReference] = newRecordIndex; 285 this.recordsIndex()[recordReference] = newRecordIndex;
297 286
298 this.transientState().setValue('newlyCreatedRecordsIndex' + '.' + recordReference, newRecordIndex); 287 this.transientState().setValue('newlyCreatedRecordsIndex' + '.' + recordReference, newRecordIndex);
299 this.transientState().setValue('newlyCreatedRecordsReferences'+ '.' + recordReference, aNewRecord); 288 this.transientState().setValue('newlyCreatedRecordsReferences'+ '.' + recordReference, aNewRecord);
300 }, 289 },
301 290
302 //......................................................................... 291 //.........................................................................
303 292
304 'createNewRecord': function () { 293 'createNewRecord': function () {
305 var deferredResult; 294 var deferredResult;
306 var newRecord; 295 var newRecord;
307 296
308//console.log("#### new Clipperz.PM.DataModel.Record [4]");
309 newRecord = new Clipperz.PM.DataModel.Record({ 297 newRecord = new Clipperz.PM.DataModel.Record({
310 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'), 298 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
311 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(), 299 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
312 300
313 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'), 301 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
314 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'), 302 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
315 'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), 303 'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
316 304
317 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'), 305 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
318 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'), 306 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
319 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'), 307 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'),
320 308
321 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin') 309 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin')
322 }); 310 });
323 311
324 this.transientState().setValue('newRecordsReferences' + '.' + newRecord.reference(), newRecord); 312 this.transientState().setValue('newRecordsReferences' + '.' + newRecord.reference(), newRecord);
325 this.updateRecordIndexForNewRecord(newRecord); 313 this.updateRecordIndexForNewRecord(newRecord);
326 314
327 deferredResult = Clipperz.Async.callbacks("User.Header.RecordIndex.createNewRecord", [ 315 deferredResult = Clipperz.Async.callbacks("User.Header.RecordIndex.createNewRecord", [
328 MochiKit.Base.method(this, 'records'), 316 MochiKit.Base.method(this, 'records'),
329 MochiKit.Base.partial(Clipperz.Async.setItemOnObject, newRecord.reference(), newRecord), 317 MochiKit.Base.partial(Clipperz.Async.setItemOnObject, newRecord.reference(), newRecord),
330 MochiKit.Base.method(this, 'setRecordKey', newRecord.reference(), Clipperz.PM.Crypto.randomKey()), 318 MochiKit.Base.method(this, 'setRecordKey', newRecord.reference(), Clipperz.PM.Crypto.randomKey()),
331 MochiKit.Base.method(newRecord, 'setLabel', ''), 319 MochiKit.Base.method(newRecord, 'setLabel', ''),
332 MochiKit.Base.partial(MochiKit.Async.succeed, newRecord) 320 MochiKit.Base.partial(MochiKit.Async.succeed, newRecord)
333 ], {trace:false}); 321 ], {trace:false});
334 322
335 323
336 return deferredResult; 324 return deferredResult;
337 }, 325 },
338 326
339 //------------------------------------------------------------------------- 327 //-------------------------------------------------------------------------
340 328
341 'deleteRecord': function (aRecord) { 329 'deleteRecord': function (aRecord) {
342 var deferredResult; 330 var deferredResult;
343 var recordReference; 331 var recordReference;
344 332
345 recordReference = aRecord.reference(); 333 recordReference = aRecord.reference();
346 334
347 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.deleteRecord", {trace:false}); 335 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.deleteRecord", {trace:false});
348 336
349 deferredResult.addMethod(aRecord, 'directLogins'); 337 deferredResult.addMethod(aRecord, 'directLogins');
350 deferredResult.addCallback(MochiKit.Base.values); 338 deferredResult.addCallback(MochiKit.Base.values);
351 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeDirectLogin')); 339 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeDirectLogin'));
352 340
353 deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]); 341 deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]);
354 deferredResult.addCallback(MochiKit.Base.bind(function () { 342 deferredResult.addCallback(MochiKit.Base.bind(function () {
355 this.transientState().setValue('deleteRecordsIndex' + '.' + recordReference, this.recordsIndex()[recordReference]); 343 this.transientState().setValue('deleteRecordsIndex' + '.' + recordReference, this.recordsIndex()[recordReference]);
356 delete this.recordsIndex()[recordReference]; 344 delete this.recordsIndex()[recordReference];
357 }, this)); 345 }, this));
358 346
359 deferredResult.addMethod(this, 'records'); 347 deferredResult.addMethod(this, 'records');
360 deferredResult.addCallback(MochiKit.Base.itemgetter(recordReference)); 348 deferredResult.addCallback(MochiKit.Base.itemgetter(recordReference));
361 deferredResult.addMethod(this.transientState(), 'setValue', 'deleteRecordsReferences' + '.' + recordReference); 349 deferredResult.addMethod(this.transientState(), 'setValue', 'deleteRecordsReferences' + '.' + recordReference);
362 350
363 deferredResult.addMethod(this, 'records'); 351 deferredResult.addMethod(this, 'records');
364 deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) { 352 deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) {
365 delete someRecords[recordReference]; 353 delete someRecords[recordReference];
366 }, this)); 354 }, this));
367 deferredResult.callback(); 355 deferredResult.callback();
368 356
369 return deferredResult; 357 return deferredResult;
370 }, 358 },
371 359
372 //========================================================================= 360 //=========================================================================
373 361
374 'removeDirectLogin': function (aDirectLogin) { 362 'removeDirectLogin': function (aDirectLogin) {
375 this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLogin.reference()]); 363 this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLogin.reference()]);
376 }, 364 },
377 365
378 //------------------------------------------------------------------------- 366 //-------------------------------------------------------------------------
379 367
380 'createNewDirectLogin': function (aRecord) { 368 'createNewDirectLogin': function (aRecord) {
381 var newDirectLogin; 369 var newDirectLogin;
382 varnewDirectLoginIndexValue; 370 varnewDirectLoginIndexValue;
383 371
384 newDirectLogin = new Clipperz.PM.DataModel.DirectLogin({record:aRecord}); 372 newDirectLogin = new Clipperz.PM.DataModel.DirectLogin({record:aRecord});
385 newDirectLoginIndexValue = MochiKit.Base.listMax(MochiKit.Base.map(function (aValue) { return aValue * 1; }, MochiKit.Base.values(this.directLoginsIndex()))) + 1; 373 newDirectLoginIndexValue = MochiKit.Base.listMax(MochiKit.Base.map(function (aValue) { return aValue * 1; }, MochiKit.Base.values(this.directLoginsIndex()))) + 1;
386 374
387 this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin); 375 this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin);
388 376
389//console.log("UserHeaderRecordIndex.createNewDirectLogin [1]", newDirectLogin.reference(), newDirectLoginIndexValue);
390 this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue; 377 this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue;
391//console.log("UserHeaderRecordIndex.createNewDirectLogin [2]", newDirectLogin.reference(), this.directLoginsIndex()[newDirectLogin.reference()]);
392 this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]}); 378 this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]});
393 379
394 return newDirectLogin; 380 return newDirectLogin;
395 }, 381 },
396 382
397 //========================================================================= 383 //=========================================================================
398 384
399 'deleteAllCleanTextData': function () { 385 'deleteAllCleanTextData': function () {
400 return Clipperz.Async.callbacks("User.Header.RecordIndex.deleteAllCleanTextData", [ 386 return Clipperz.Async.callbacks("User.Header.RecordIndex.deleteAllCleanTextData", [
401 // MochiKit.Base.method(this, 'records'), 387 // MochiKit.Base.method(this, 'records'),
402 // MochiKit.Base.values, 388 // MochiKit.Base.values,
403 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')), 389 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
404 390
405 MochiKit.Base.method(this, 'recordsData'), 391 MochiKit.Base.method(this, 'recordsData'),
406 MochiKit.Base.methodcaller('deleteAllCleanTextData'), 392 MochiKit.Base.methodcaller('deleteAllCleanTextData'),
407 MochiKit.Base.method(this, 'directLoginsData'), 393 MochiKit.Base.method(this, 'directLoginsData'),
408 MochiKit.Base.methodcaller('deleteAllCleanTextData') 394 MochiKit.Base.methodcaller('deleteAllCleanTextData')
409 ], {trace:false}); 395 ], {trace:false});
410 }, 396 },
411 397
412 //------------------------------------------------------------------------- 398 //-------------------------------------------------------------------------
413 399
414 'hasAnyCleanTextData': function () { 400 'hasAnyCleanTextData': function () {
415 var deferredResult; 401 var deferredResult;
416 402
417 deferredResult = new Clipperz.Async.Deferred({trace:false}); 403 deferredResult = new Clipperz.Async.Deferred({trace:false});
418 deferredResult.collectResults({ 404 deferredResult.collectResults({
419 'recordsData': [ 405 'recordsData': [
420 MochiKit.Base.method(this, 'recordsData'), 406 MochiKit.Base.method(this, 'recordsData'),
421 MochiKit.Base.methodcaller('hasAnyCleanTextData') 407 MochiKit.Base.methodcaller('hasAnyCleanTextData')
422 ], 408 ],
423 'directLoginsData':[ 409 'directLoginsData':[
424 MochiKit.Base.method(this, 'directLoginsData'), 410 MochiKit.Base.method(this, 'directLoginsData'),
425 MochiKit.Base.methodcaller('hasAnyCleanTextData') 411 MochiKit.Base.methodcaller('hasAnyCleanTextData')
426 ], 412 ],
427 // 'records': [ 413 // 'records': [
428 // MochiKit.Base.method(this, 'records'), 414 // MochiKit.Base.method(this, 'records'),
429 // MochiKit.Base.values, 415 // MochiKit.Base.values,
430 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')), 416 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
431 // Clipperz.Async.collectAll 417 // Clipperz.Async.collectAll
432 // ] 418 // ]
433 }); 419 });
434//deferredResult.addCallback(function (aValue) { console.log("USER.Header.RecordIndex.hasAnyCleanTextData", aValue); return aValue});
435 420
436 // deferredResult.addCallback(MochiKit.Base.values); 421 // deferredResult.addCallback(MochiKit.Base.values);
437 // deferredResult.addCallback(MochiKit.Base.flattenArguments); 422 // deferredResult.addCallback(MochiKit.Base.flattenArguments);
438 // deferredResult.addCallback(function(someValues) { 423 // deferredResult.addCallback(function(someValues) {
439 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); 424 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
440 // }); 425 // });
441 deferredResult.addCallback(Clipperz.Async.or); 426 deferredResult.addCallback(Clipperz.Async.or);
442 427
443 deferredResult.callback(); 428 deferredResult.callback();
444 429
445 return deferredResult; 430 return deferredResult;
446 }, 431 },
447 432
448 //------------------------------------------------------------------------- 433 //-------------------------------------------------------------------------
449 434
450 'hasPendingChanges': function () { 435 'hasPendingChanges': function () {
451 vardeferredResult; 436 vardeferredResult;
452 437
453 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.hasPendingChanges", {trace:false}); 438 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.hasPendingChanges", {trace:false});
454 deferredResult.collectResults({ 439 deferredResult.collectResults({
455 'recordsData': [ 440 'recordsData': [
456 MochiKit.Base.method(this, 'recordsData'), 441 MochiKit.Base.method(this, 'recordsData'),
457 MochiKit.Base.methodcaller('hasPendingChanges') 442 MochiKit.Base.methodcaller('hasPendingChanges')
458 ], 443 ],
459 'directLoginsData': [ 444 'directLoginsData': [
460 MochiKit.Base.method(this, 'directLoginsData'), 445 MochiKit.Base.method(this, 'directLoginsData'),
461 MochiKit.Base.methodcaller('hasPendingChanges') 446 MochiKit.Base.methodcaller('hasPendingChanges')
462 ] 447 ]
463 }); 448 });
464//deferredResult.addCallback(function (aValue) { console.log("UserHeaderIndex.hasPendingResults", aValue); return aValue; });
465 deferredResult.addCallback(Clipperz.Async.or); 449 deferredResult.addCallback(Clipperz.Async.or);
466 // deferredResult.addCallback(MochiKit.Base.values); 450 // deferredResult.addCallback(MochiKit.Base.values);
467 // deferredResult.addCallback(MochiKit.Base.flattenArguments); 451 // deferredResult.addCallback(MochiKit.Base.flattenArguments);
468 // deferredResult.addCallback(function(someValues) { 452 // deferredResult.addCallback(function(someValues) {
469 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity); 453 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
470 // }); 454 // });
471 deferredResult.callback(); 455 deferredResult.callback();
472 456
473 return deferredResult; 457 return deferredResult;
474 }, 458 },
475 459
476 //------------------------------------------------------------------------- 460 //-------------------------------------------------------------------------
477 461
478 'commitTransientState': function () { 462 'commitTransientState': function () {
479 var deferredResult; 463 var deferredResult;
480 464
481 deferredResut = Clipperz.Async.callbacks("User.Header.RecordIndex.commitTransientState", [ 465 deferredResut = Clipperz.Async.callbacks("User.Header.RecordIndex.commitTransientState", [
482 MochiKit.Base.method(this, 'recordsData'), 466 MochiKit.Base.method(this, 'recordsData'),
483 MochiKit.Base.methodcaller('commitTransientState'), 467 MochiKit.Base.methodcaller('commitTransientState'),
484 468
485 MochiKit.Base.method(this, 'directLoginsData'), 469 MochiKit.Base.method(this, 'directLoginsData'),
486 MochiKit.Base.methodcaller('commitTransientState'), 470 MochiKit.Base.methodcaller('commitTransientState'),
487 471
488 MochiKit.Base.method(this, 'resetTransientState', true) 472 MochiKit.Base.method(this, 'resetTransientState', true)
489 ], {trace:false}); 473 ], {trace:false});
490 474
491 return deferredResult; 475 return deferredResult;
492 }, 476 },
493 477
494 //------------------------------------------------------------------------- 478 //-------------------------------------------------------------------------
495 479
496 'revertChanges': function () { 480 'revertChanges': function () {
497 return Clipperz.Async.callbacks("User.Header.RecordIndex.revertChanges", [ 481 return Clipperz.Async.callbacks("User.Header.RecordIndex.revertChanges", [
498 MochiKit.Base.method(this, 'recordsData'), 482 MochiKit.Base.method(this, 'recordsData'),
499 MochiKit.Base.methodcaller('revertChanges'), 483 MochiKit.Base.methodcaller('revertChanges'),
500 484
501 // MochiKit.Base.method(this, 'directLoginsData'), 485 // MochiKit.Base.method(this, 'directLoginsData'),
502 // MochiKit.Base.methodcaller('revertChanges'), 486 // MochiKit.Base.methodcaller('revertChanges'),
503 487
504 MochiKit.Base.method(this, 'records'), 488 MochiKit.Base.method(this, 'records'),
505 MochiKit.Base.bind(function (someRecords) { 489 MochiKit.Base.bind(function (someRecords) {
506 varrecordReference; 490 varrecordReference;
507 491
508 for (recordReference in this.transientState().getValue('deleteRecordsReferences')) { 492 for (recordReference in this.transientState().getValue('deleteRecordsReferences')) {
509 this.recordsIndex()[recordReference] = this.transientState().getValue('deleteRecordsIndex' + '.' + recordReference); 493 this.recordsIndex()[recordReference] = this.transientState().getValue('deleteRecordsIndex' + '.' + recordReference);
510 someRecords[recordReference] = this.transientState().getValue('deleteRecordsReferences' + '.' + recordReference); 494 someRecords[recordReference] = this.transientState().getValue('deleteRecordsReferences' + '.' + recordReference);
511 } 495 }
512 496
513 for (recordReference in this.transientState().getValue('newRecordsReferences')) { 497 for (recordReference in this.transientState().getValue('newRecordsReferences')) {
514 delete this.recordsIndex()[recordReference]; 498 delete this.recordsIndex()[recordReference];
515 delete someRecords[recordReference]; 499 delete someRecords[recordReference];
516 } 500 }
517 }, this), 501 }, this),
518 502
519 // MochiKit.Base.method(this, 'directLogins'), 503 // MochiKit.Base.method(this, 'directLogins'),
520 MochiKit.Base.bind(function () { 504 MochiKit.Base.bind(function () {
521 vardirectLoginReference; 505 vardirectLoginReference;
522 506
523 //this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin); 507 //this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin);
524// 508//
525 //this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue; 509 //this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue;
526 //this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]}); 510 //this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]});
527 511
528 512
529 // for (directLoginReference in this.transientState().getValue('deleteDirectLoginReferences')) { 513 // for (directLoginReference in this.transientState().getValue('deleteDirectLoginReferences')) {
530 // someDirectLogins[directLoginReference] = this.transientState().getValue('deleteDirectLoginReferences' + '.' + recordReference); 514 // someDirectLogins[directLoginReference] = this.transientState().getValue('deleteDirectLoginReferences' + '.' + recordReference);
531 // } 515 // }
532 516
533 for (directLoginReference in this.transientState().getValue('newDirectLoginReferences')) { 517 for (directLoginReference in this.transientState().getValue('newDirectLoginReferences')) {
534 // this.directLoginsData().removeValue(this.directLoginsIndex()[directLoginReference]); 518 // this.directLoginsData().removeValue(this.directLoginsIndex()[directLoginReference]);
535 delete this.directLoginsIndex()[directLoginReference]; 519 delete this.directLoginsIndex()[directLoginReference];
536 } 520 }
537 }, this), 521 }, this),
538 522
539 MochiKit.Base.method(this, 'directLoginsData'), 523 MochiKit.Base.method(this, 'directLoginsData'),
540 MochiKit.Base.methodcaller('revertChanges'), 524 MochiKit.Base.methodcaller('revertChanges'),
541 525
542 MochiKit.Base.method(this, 'resetTransientState', false) 526 MochiKit.Base.method(this, 'resetTransientState', false)
543 ], {trace:false}); 527 ], {trace:false});
544 }, 528 },
545 529
546 //------------------------------------------------------------------------- 530 //-------------------------------------------------------------------------
547 531
548 'prepareRemoteDataWithKey': function (aKey) { 532 'prepareRemoteDataWithKey': function (aKey) {
549 // "records": { 533 // "records": {
550 // "index": { 534 // "index": {
551 // "eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5": "0", 535 // "eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5": "0",
552 // "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551": "1", 536 // "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551": "1",
553 // ... 537 // ...
554 // "465a067a0bd2b470fa834de5397e38494de0c7707938262fae3427932e219744": "18", 538 // "465a067a0bd2b470fa834de5397e38494de0c7707938262fae3427932e219744": "18",
555 // "4fd1dc2ca860b7fb47cef10a84edb3270da05510b0a30a6b0b083898712d4b9e": "19" 539 // "4fd1dc2ca860b7fb47cef10a84edb3270da05510b0a30a6b0b083898712d4b9e": "19"
556 // }, 540 // },
557 // "data": "n+AzGEEQXaSRSY4d ... BDypotrXgPo94uHfoXvGFzwCn8w=" 541 // "data": "n+AzGEEQXaSRSY4d ... BDypotrXgPo94uHfoXvGFzwCn8w="
558 // }, 542 // },
559 // "directLogins": { 543 // "directLogins": {
560 // "index": { 544 // "index": {
561 // "61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0", 545 // "61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0",
562 // "989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1", 546 // "989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1",
563 // ... 547 // ...
564 // "cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17", 548 // "cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17",
565 // "7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18" 549 // "7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18"
566 // }, 550 // },
567 // "data":"5YG9KKU/OZ5guUgFlms6k1 ... ZG/5Fn0uN+LoAsNfHm+EE62x" 551 // "data":"5YG9KKU/OZ5guUgFlms6k1 ... ZG/5Fn0uN+LoAsNfHm+EE62x"
568 // }, 552 // },
569 553
570 var deferredResult; 554 var deferredResult;
571 var result; 555 var result;
572 556
573//console.log("recordsIndex", this.recordsIndex());
574 result = {}; 557 result = {};
575 558
576 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataWithKey", {trace:false}); 559 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataWithKey", {trace:false});
577 deferredResult.collectResults({ 560 deferredResult.collectResults({
578 'index':MochiKit.Base.partial(MochiKit.Async.succeed, this.recordsIndex()), 561 'index':MochiKit.Base.partial(MochiKit.Async.succeed, this.recordsIndex()),
579 'data': [ 562 'data': [
580 MochiKit.Base.method(this.recordsData(), 'prepareRemoteDataWithKey', aKey), 563 MochiKit.Base.method(this.recordsData(), 'prepareRemoteDataWithKey', aKey),
581 MochiKit.Base.itemgetter('data') 564 MochiKit.Base.itemgetter('data')
582 ] 565 ]
583 }); 566 });
584 deferredResult.addCallback(Clipperz.Async.setItem, result, 'records'); 567 deferredResult.addCallback(Clipperz.Async.setItem, result, 'records');
585 568
586 deferredResult.collectResults({ 569 deferredResult.collectResults({
587 'index':MochiKit.Base.partial(MochiKit.Async.succeed, this.directLoginsIndex()), 570 'index':MochiKit.Base.partial(MochiKit.Async.succeed, this.directLoginsIndex()),
588 'data': [ 571 'data': [
589 MochiKit.Base.method(this.directLoginsData(), 'prepareRemoteDataWithKey', aKey), 572 MochiKit.Base.method(this.directLoginsData(), 'prepareRemoteDataWithKey', aKey),
590 MochiKit.Base.itemgetter('data') 573 MochiKit.Base.itemgetter('data')
591 ] 574 ]
592 }); 575 });
593 deferredResult.addCallback(Clipperz.Async.setItem, result, 'directLogins'); 576 deferredResult.addCallback(Clipperz.Async.setItem, result, 'directLogins');
594 577
595 deferredResult.addCallback(MochiKit.Async.succeed, result); 578 deferredResult.addCallback(MochiKit.Async.succeed, result);
596 579
597 deferredResult.callback(); 580 deferredResult.callback();
598 581
599 return deferredResult; 582 return deferredResult;
600 }, 583 },
601 584
602 //------------------------------------------------------------------------- 585 //-------------------------------------------------------------------------
603 586
604 'updateRecordKeyAndPrepareRemoteData': function (aRecord) { 587 'updateRecordKeyAndPrepareRemoteData': function (aRecord) {
605 varnewRecordKey; 588 varnewRecordKey;
606 var deferredResult; 589 var deferredResult;
607 590
608 newRecordKey = Clipperz.PM.Crypto.randomKey(); 591 newRecordKey = Clipperz.PM.Crypto.randomKey();
609 592
610 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.updateRecordKeyAndPrepareRemoteData", {trace:false}); 593 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.updateRecordKeyAndPrepareRemoteData", {trace:false});
611 deferredResult.addCallback(MochiKit.Base.method(aRecord, 'prepareRemoteDataWithKey', newRecordKey)); 594 deferredResult.addCallback(MochiKit.Base.method(aRecord, 'prepareRemoteDataWithKey', newRecordKey));
612 deferredResult.addCallbackPass(MochiKit.Base.method(this, 'setRecordKey', aRecord.reference(), newRecordKey)); 595 deferredResult.addCallbackPass(MochiKit.Base.method(this, 'setRecordKey', aRecord.reference(), newRecordKey));
613 deferredResult.callback(); 596 deferredResult.callback();
614 597
615 return deferredResult; 598 return deferredResult;
616 }, 599 },
617 600
618 //......................................................................... 601 //.........................................................................
619 602
620 'removeNewRecordWithNoChanges': function (aRecord) { 603 'removeNewRecordWithNoChanges': function (aRecord) {
621 var deferredResult; 604 var deferredResult;
622 var recordReference; 605 var recordReference;
623 606
624 recordReference = aRecord.reference(); 607 recordReference = aRecord.reference();
625 608
626 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.removeNewRecordWithNoChanges", {trace:false}); 609 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.removeNewRecordWithNoChanges", {trace:false});
627 610
628 deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]); 611 deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]);
629 deferredResult.addCallback(MochiKit.Base.bind(function () { 612 deferredResult.addCallback(MochiKit.Base.bind(function () {
630 delete this.recordsIndex()[recordReference]; 613 delete this.recordsIndex()[recordReference];
631 }, this)); 614 }, this));
632 615
633 deferredResult.addMethod(this, 'records'); 616 deferredResult.addMethod(this, 'records');
634 deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) { 617 deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) {
635 delete someRecords[recordReference]; 618 delete someRecords[recordReference];
636 }, this)); 619 }, this));
637 deferredResult.callback(); 620 deferredResult.callback();
638 621
639 return deferredResult; 622 return deferredResult;
640 }, 623 },
641 624
642 //......................................................................... 625 //.........................................................................
643 626
644 'prepareRemoteDataForChangedRecords': function () { 627 'prepareRemoteDataForChangedRecords': function () {
645 vardeferredResult; 628 vardeferredResult;
646 varresult; 629 varresult;
647 630
648 result = {}; 631 result = {};
649 632
650 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataForChangedRecords", {trace:false}); 633 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataForChangedRecords", {trace:false});
651 634
652 deferredResult.addMethod(this, 'records'); 635 deferredResult.addMethod(this, 'records');
653 deferredResult.addCallback(MochiKit.Base.values); 636 deferredResult.addCallback(MochiKit.Base.values);
654 deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('isBrandNewWithNoPendingChanges')); 637 deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('isBrandNewWithNoPendingChanges'));
655 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeNewRecordWithNoChanges')); 638 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeNewRecordWithNoChanges'));
656 639
657 deferredResult.addMethod(this, 'records'); 640 deferredResult.addMethod(this, 'records');
658 deferredResult.addCallback(MochiKit.Base.values); 641 deferredResult.addCallback(MochiKit.Base.values);
659 deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('hasPendingChanges')); 642 deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('hasPendingChanges'));
660 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordKeyAndPrepareRemoteData')); 643 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordKeyAndPrepareRemoteData'));
661 deferredResult.addCallback(Clipperz.Async.collectAll); 644 deferredResult.addCallback(Clipperz.Async.collectAll);
662 645
663 deferredResult.addCallback(Clipperz.Async.deferredIf("updated records != null", [ 646 deferredResult.addCallback(Clipperz.Async.deferredIf("updated records != null", [
664 MochiKit.Base.operator.identity 647 MochiKit.Base.operator.identity
665 ], [ 648 ], [
666 MochiKit.Base.partial(MochiKit.Async.succeed, []) 649 MochiKit.Base.partial(MochiKit.Async.succeed, [])
667 ])); 650 ]));
668 deferredResult.addCallback(Clipperz.Async.setItem, result, 'updated'); 651 deferredResult.addCallback(Clipperz.Async.setItem, result, 'updated');
669 652
diff --git a/frontend/gamma/js/Clipperz/PM/DataModel/User.js b/frontend/gamma/js/Clipperz/PM/DataModel/User.js
index 646ce21..fd18faf 100644
--- a/frontend/gamma/js/Clipperz/PM/DataModel/User.js
+++ b/frontend/gamma/js/Clipperz/PM/DataModel/User.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } 26if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
29 27
30 28
31//############################################################################# 29//#############################################################################
32 30
33Clipperz.PM.DataModel.User = function (args) { 31Clipperz.PM.DataModel.User = function (args) {
34 args = args || {}; 32 args = args || {};
35 33
36 Clipperz.PM.DataModel.User.superclass.constructor.apply(this, arguments); 34 Clipperz.PM.DataModel.User.superclass.constructor.apply(this, arguments);
37 35
38 this._username = args.username || null; 36 this._username = args.username || null;
39 this._getPassphraseFunction = args.getPassphraseFunction || null; 37 this._getPassphraseFunction = args.getPassphraseFunction || null;
40 38
41 this._data = null; 39 this._data = null;
42 40
43 this._connection = null; 41 this._connection = null;
44 this._connectionVersion = 'current'; 42 this._connectionVersion = 'current';
45 43
46 this._serverData = null; 44 this._serverData = null;
47 //this._serverLockValue = null; 45 //this._serverLockValue = null;
48 this._transientState = null; 46 this._transientState = null;
49 47
50 this._deferredLocks = { 48 this._deferredLocks = {
51 'passphrase': new MochiKit.Async.DeferredLock(), 49 'passphrase': new MochiKit.Async.DeferredLock(),
52 'serverData': new MochiKit.Async.DeferredLock(), 50 'serverData': new MochiKit.Async.DeferredLock(),
53 // 'recordsIndex': new MochiKit.Async.DeferredLock(), 51 // 'recordsIndex': new MochiKit.Async.DeferredLock(),
54 // 'directLoginsIndex':new MochiKit.Async.DeferredLock() 52 // 'directLoginsIndex':new MochiKit.Async.DeferredLock()
55 // 'preferences': new MochiKit.Async.DeferredLock() 53 // 'preferences': new MochiKit.Async.DeferredLock()
56 // 'oneTimePasswords': new MochiKit.Async.DeferredLock() 54 // 'oneTimePasswords': new MochiKit.Async.DeferredLock()
57 '__syntaxFix__': 'syntax fix' 55 '__syntaxFix__': 'syntax fix'
58 }; 56 };
59 57
60 return this; 58 return this;
61} 59}
62 60
63Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, { 61Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, {
64 62
65 'toString': function () { 63 'toString': function () {
66 return "Clipperz.PM.DataModel.User - " + this.username(); 64 return "Clipperz.PM.DataModel.User - " + this.username();
67 }, 65 },
68 66
69 //------------------------------------------------------------------------- 67 //-------------------------------------------------------------------------
70 68
71 'username': function () { 69 'username': function () {
72 return this._username; 70 return this._username;
73 }, 71 },
74 72
75 'setUsername': function (aValue) { 73 'setUsername': function (aValue) {
76 this._username = aValue; 74 this._username = aValue;
77 }, 75 },
78 76
79 //------------------------------------------------------------------------- 77 //-------------------------------------------------------------------------
80 78
81 'displayName': function() { 79 'displayName': function() {
82 return "" + this.username() + ""; 80 return "" + this.username() + "";
83 }, 81 },
84 82
85 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
86 84
87 'data': function () { 85 'data': function () {
88 if (this._data == null) { 86 if (this._data == null) {
89 this._data = new Clipperz.KeyValueObjectStore(/*{'name':'User.data [1]'}*/); 87 this._data = new Clipperz.KeyValueObjectStore(/*{'name':'User.data [1]'}*/);
90 }; 88 };
91 89
92 return this._data; 90 return this._data;
93 }, 91 },
94 92
95 //------------------------------------------------------------------------- 93 //-------------------------------------------------------------------------
96/* 94/*
97 'serverLockValue': function () { 95 'serverLockValue': function () {
98 return this._serverLockValue; 96 return this._serverLockValue;
99 }, 97 },
100 98
101 'setServerLockValue': function (aValue) { 99 'setServerLockValue': function (aValue) {
102 this._serverLockValue = aValue; 100 this._serverLockValue = aValue;
103 }, 101 },
104*/ 102*/
105 //------------------------------------------------------------------------- 103 //-------------------------------------------------------------------------
106 104
107 'transientState': function () { 105 'transientState': function () {
108 if (this._transientState == null) { 106 if (this._transientState == null) {
109 this._transientState = {} 107 this._transientState = {}
110 } 108 }
111 109
112 return this._transientState; 110 return this._transientState;
113 }, 111 },
114 112
115 'resetTransientState': function (isCommitting) { 113 'resetTransientState': function (isCommitting) {
116 this._transientState = null; 114 this._transientState = null;
117 }, 115 },
118 116
@@ -235,282 +233,280 @@ Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, {
235 233
236 'login': function () { 234 'login': function () {
237 var deferredResult; 235 var deferredResult;
238 236
239 deferredResult = new Clipperz.Async.Deferred("User.login", {trace:false}); 237 deferredResult = new Clipperz.Async.Deferred("User.login", {trace:false});
240 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3}); 238 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
241 deferredResult.addMethod(this, 'getPassphrase'); 239 deferredResult.addMethod(this, 'getPassphrase');
242 deferredResult.addCallback(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue); 240 deferredResult.addCallback(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue);
243 deferredResult.addCallback(Clipperz.Async.deferredIf("Is the passphrase an OTP", [ 241 deferredResult.addCallback(Clipperz.Async.deferredIf("Is the passphrase an OTP", [
244 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':1}), 242 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':1}),
245 MochiKit.Base.method(this, 'getCredentials'), 243 MochiKit.Base.method(this, 'getCredentials'),
246 MochiKit.Base.method(this.connection(), 'redeemOneTimePassword'), 244 MochiKit.Base.method(this.connection(), 'redeemOneTimePassword'),
247 MochiKit.Base.method(this.data(), 'setValue', 'passphrase') 245 MochiKit.Base.method(this.data(), 'setValue', 'passphrase')
248 ], [])); 246 ], []));
249 deferredResult.addErrback(MochiKit.Base.method(this, 'getPassphrase')); 247 deferredResult.addErrback(MochiKit.Base.method(this, 'getPassphrase'));
250 deferredResult.addMethod(this.connection(), 'login', false); 248 deferredResult.addMethod(this.connection(), 'login', false);
251 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn'); 249 deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn');
252 deferredResult.addErrback (MochiKit.Base.method(this, 'handleConnectionFallback')); 250 deferredResult.addErrback (MochiKit.Base.method(this, 'handleConnectionFallback'));
253 251
254 deferredResult.callback(); 252 deferredResult.callback();
255 253
256 return deferredResult; 254 return deferredResult;
257 }, 255 },
258 256
259 //......................................................................... 257 //.........................................................................
260 258
261 'handleConnectionFallback': function(aValue) { 259 'handleConnectionFallback': function(aValue) {
262 var result; 260 var result;
263 261
264 if (aValue instanceof MochiKit.Async.CancelledError) { 262 if (aValue instanceof MochiKit.Async.CancelledError) {
265 result = aValue; 263 result = aValue;
266 } else { 264 } else {
267 this.setConnectionVersion(Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()]); 265 this.setConnectionVersion(Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()]);
268 266
269 if (this.connectionVersion() != null) { 267 if (this.connectionVersion() != null) {
270 result = new Clipperz.Async.Deferred("User.handleConnectionFallback - retry"); 268 result = new Clipperz.Async.Deferred("User.handleConnectionFallback - retry");
271 269
272 result.addMethod(this, 'login'); 270 result.addMethod(this, 'login');
273 result.callback(); 271 result.callback();
274 } else { 272 } else {
275 result = Clipperz.Async.callbacks("User.handleConnectionFallback - failed", [ 273 result = Clipperz.Async.callbacks("User.handleConnectionFallback - failed", [
276 MochiKit.Base.method(this.data(), 'removeValue', 'passphrase'), 274 MochiKit.Base.method(this.data(), 'removeValue', 'passphrase'),
277 MochiKit.Base.method(this, 'setConnectionVersion', 'current'), 275 MochiKit.Base.method(this, 'setConnectionVersion', 'current'),
278 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userLoginFailed'), 276 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userLoginFailed'),
279 MochiKit.Base.partial(MochiKit.Async.fail, Clipperz.PM.DataModel.User.exception.LoginFailed) 277 MochiKit.Base.partial(MochiKit.Async.fail, Clipperz.PM.DataModel.User.exception.LoginFailed)
280 ], {trace:false}); 278 ], {trace:false});
281 } 279 }
282 } 280 }
283 281
284 return result; 282 return result;
285 }, 283 },
286 284
287 //------------------------------------------------------------------------- 285 //-------------------------------------------------------------------------
288 286
289 'lock': function () { 287 'lock': function () {
290 return Clipperz.Async.callbacks("User.lock", [ 288 return Clipperz.Async.callbacks("User.lock", [
291 MochiKit.Base.method(this, 'deleteAllCleanTextData') 289 MochiKit.Base.method(this, 'deleteAllCleanTextData')
292 ], {trace:false}); 290 ], {trace:false});
293 }, 291 },
294 292
295 //------------------------------------------------------------------------- 293 //-------------------------------------------------------------------------
296 294
297 'logout': function () { 295 'logout': function () {
298 return Clipperz.Async.callbacks("User.logout", [ 296 return Clipperz.Async.callbacks("User.logout", [
299 MochiKit.Base.method(this, 'deleteAllCleanTextData'), 297 MochiKit.Base.method(this, 'deleteAllCleanTextData'),
300 MochiKit.Base.method(this.connection(), 'logout') 298 MochiKit.Base.method(this.connection(), 'logout')
301 ], {trace:false}); 299 ], {trace:false});
302 }, 300 },
303 301
304 //------------------------------------------------------------------------- 302 //-------------------------------------------------------------------------
305 303
306 'headerFormatVersion': function(anHeader) { 304 'headerFormatVersion': function(anHeader) {
307 var result; 305 var result;
308 306
309 if (anHeader.charAt(0) == '{') { 307 if (anHeader.charAt(0) == '{') {
310 varheaderData; 308 varheaderData;
311 309
312 headerData = Clipperz.Base.evalJSON(anHeader); 310 headerData = Clipperz.Base.evalJSON(anHeader);
313 result = headerData['version']; 311 result = headerData['version'];
314 } else { 312 } else {
315 result = 'LEGACY'; 313 result = 'LEGACY';
316 } 314 }
317 315
318 return result; 316 return result;
319 }, 317 },
320 318
321 //------------------------------------------------------------------------- 319 //-------------------------------------------------------------------------
322 320
323 'unpackServerData': function (someServerData) { 321 'unpackServerData': function (someServerData) {
324 var unpackedData; 322 var unpackedData;
325 var headerVersion; 323 var headerVersion;
326 324
327 varrecordsIndex; 325 varrecordsIndex;
328 var preferences; 326 var preferences;
329 var oneTimePasswords; 327 var oneTimePasswords;
330 328
331//console.log(">>> ***************** user.unpackServerData", someServerData);
332 // this.setServerLockValue(someServerData['lock']); 329 // this.setServerLockValue(someServerData['lock']);
333 330
334 headerVersion = this.headerFormatVersion(someServerData['header']); 331 headerVersion = this.headerFormatVersion(someServerData['header']);
335 332
336 switch (headerVersion) { 333 switch (headerVersion) {
337 case 'LEGACY': 334 case 'LEGACY':
338 varlegacyHeader; 335 varlegacyHeader;
339 336
340 legacyHeader = new Clipperz.PM.DataModel.User.Header.Legacy({ 337 legacyHeader = new Clipperz.PM.DataModel.User.Header.Legacy({
341 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 338 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
342 'remoteData': { 339 'remoteData': {
343 'data': someServerData['header'], 340 'data': someServerData['header'],
344 'version': someServerData['version'], 341 'version': someServerData['version'],
345 'recordsStats': someServerData['recordsStats'] 342 'recordsStats': someServerData['recordsStats']
346 }, 343 },
347 // 'encryptedDataKeypath': 'data', 344 // 'encryptedDataKeypath': 'data',
348 // 'encryptedVersionKeypath': 'version', 345 // 'encryptedVersionKeypath': 'version',
349 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail') 346 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
350 }); 347 });
351 348
352 recordsIndex = legacyHeader; 349 recordsIndex = legacyHeader;
353 preferences = legacyHeader; 350 preferences = legacyHeader;
354 oneTimePasswords= legacyHeader; 351 oneTimePasswords= legacyHeader;
355 break; 352 break;
356 case '0.1': 353 case '0.1':
357 varheaderData; 354 varheaderData;
358 355
359 headerData = Clipperz.Base.evalJSON(someServerData['header']); 356 headerData = Clipperz.Base.evalJSON(someServerData['header']);
360 357
361 recordsIndex = new Clipperz.PM.DataModel.User.Header.RecordIndex({ 358 recordsIndex = new Clipperz.PM.DataModel.User.Header.RecordIndex({
362 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 359 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
363 'recordsData': headerData['records'], 360 'recordsData': headerData['records'],
364 'recordsStats': someServerData['recordsStats'], 361 'recordsStats': someServerData['recordsStats'],
365 'directLoginsData': headerData['directLogins'], 362 'directLoginsData': headerData['directLogins'],
366 'encryptedDataVersion': someServerData['version'], 363 'encryptedDataVersion': someServerData['version'],
367 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail') 364 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
368 }); 365 });
369 366
370 //Still missing a test case that actually fais with the old version of the code, where the check for undefined was missing 367 //Still missing a test case that actually fais with the old version of the code, where the check for undefined was missing
371 if (typeof(headerData['preferences']) != 'undefined') { 368 if (typeof(headerData['preferences']) != 'undefined') {
372 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({ 369 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({
373 'name':'preferences', 370 'name':'preferences',
374 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 371 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
375 'remoteData': { 372 'remoteData': {
376 'data': headerData['preferences']['data'], 373 'data': headerData['preferences']['data'],
377 'version': someServerData['version'] 374 'version': someServerData['version']
378 } 375 }
379 }); 376 });
380 } else { 377 } else {
381 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({ 378 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({
382 'name':'preferences', 379 'name':'preferences',
383 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 380 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
384 }); 381 });
385 } 382 }
386 383
387 if (typeof(headerData['oneTimePasswords']) != 'undefined') { 384 if (typeof(headerData['oneTimePasswords']) != 'undefined') {
388 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ 385 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
389 'name':'preferences', 386 'name':'preferences',
390 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'), 387 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
391 'remoteData': { 388 'remoteData': {
392 'data': headerData['oneTimePasswords']['data'], 389 'data': headerData['oneTimePasswords']['data'],
393 'version': someServerData['version'] 390 'version': someServerData['version']
394 } 391 }
395 }); 392 });
396 } else { 393 } else {
397 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({ 394 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
398 'name':'preferences', 395 'name':'preferences',
399 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase') 396 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
400 }); 397 });
401 } 398 }
402 399
403 break; 400 break;
404 } 401 }
405 402
406 unpackedData = { 403 unpackedData = {
407 'version': someServerData['version'], 404 'version': someServerData['version'],
408 'statistics': someServerData['statistics'], 405 'statistics': someServerData['statistics'],
409 'header': { 406 'header': {
410 'data': someServerData['header'], 407 'data': someServerData['header'],
411 'version': headerVersion, 408 'version': headerVersion,
412 409
413 'recordsIndex': recordsIndex, 410 'recordsIndex': recordsIndex,
414 'preferences': preferences, 411 'preferences': preferences,
415 'oneTimePasswords': oneTimePasswords 412 'oneTimePasswords': oneTimePasswords
416 } 413 }
417 }; 414 };
418 415
419 this._serverData = unpackedData; 416 this._serverData = unpackedData;
420//console.log("<<< ***************** user.unpackServerData", this._serverData);
421 417
422 return this._serverData; 418 return this._serverData;
423 }, 419 },
424 420
425 //------------------------------------------------------------------------- 421 //-------------------------------------------------------------------------
426 422
427 'getServerData': function() { 423 'getServerData': function() {
428 var deferredResult; 424 var deferredResult;
429 425
430 deferredResult = new Clipperz.Async.Deferred("User.getServerData", {trace:false}); 426 deferredResult = new Clipperz.Async.Deferred("User.getServerData", {trace:false});
431 deferredResult.acquireLock(this.deferredLockForSection('serverData')); 427 deferredResult.acquireLock(this.deferredLockForSection('serverData'));
432 deferredResult.addCallback(MochiKit.Base.bind(function(aResult) { 428 deferredResult.addCallback(MochiKit.Base.bind(function(aResult) {
433 var innerDeferredResult; 429 var innerDeferredResult;
434 430
435 innerDeferredResult = new Clipperz.Async.Deferred("User.getUserDetails.innerDeferred", {trace:false}); 431 innerDeferredResult = new Clipperz.Async.Deferred("User.getUserDetails.innerDeferred", {trace:false});
436 if (this._serverData == null) { 432 if (this._serverData == null) {
437 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadingUserDetails'); 433 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadingUserDetails');
438 innerDeferredResult.addMethod(this.connection(), 'message', 'getUserDetails'); 434 innerDeferredResult.addMethod(this.connection(), 'message', 'getUserDetails');
439 innerDeferredResult.addMethod(this, 'unpackServerData'); 435 innerDeferredResult.addMethod(this, 'unpackServerData');
440 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadedUserDetails'); 436 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadedUserDetails');
441 } 437 }
442 438
443 innerDeferredResult.addCallback(MochiKit.Base.bind(function () { 439 innerDeferredResult.addCallback(MochiKit.Base.bind(function () {
444 return this._serverData; 440 return this._serverData;
445 },this)); 441 },this));
446 innerDeferredResult.callback(); 442 innerDeferredResult.callback();
447 443
448 return innerDeferredResult; 444 return innerDeferredResult;
449 }, this)); 445 }, this));
450 deferredResult.releaseLock(this.deferredLockForSection('serverData')); 446 deferredResult.releaseLock(this.deferredLockForSection('serverData'));
451 deferredResult.callback(); 447 deferredResult.callback();
452 448
453 return deferredResult; 449 return deferredResult;
454 }, 450 },
455 451
456 //------------------------------------------------------------------------- 452 //-------------------------------------------------------------------------
457 453
458 'connectionVersion': function() { 454 'connectionVersion': function() {
459 return this._connectionVersion; 455 return this._connectionVersion;
460 }, 456 },
461 457
462 'setConnectionVersion': function(aValue) { 458 'setConnectionVersion': function(aValue) {
463 if (this._connectionVersion != aValue) { 459 if (this._connectionVersion != aValue) {
464 this.resetConnection(); 460 this.resetConnection();
465 } 461 }
466 this._connectionVersion = aValue; 462 this._connectionVersion = aValue;
467 }, 463 },
468 464
469 //------------------------------------------------------------------------- 465 //-------------------------------------------------------------------------
470 466
471 'connection': function() { 467 'connection': function() {
472 if ((this._connection == null) && (this.connectionVersion() != null) ){ 468 if ((this._connection == null) && (this.connectionVersion() != null) ){
473 this._connection = new Clipperz.PM.Connection.communicationProtocol.versions[this.connectionVersion()]({ 469 this._connection = new Clipperz.PM.Connection.communicationProtocol.versions[this.connectionVersion()]({
474 getCredentialsFunction: MochiKit.Base.method(this, 'getCredentials') 470 getCredentialsFunction: MochiKit.Base.method(this, 'getCredentials')
475 }); 471 });
476 } 472 }
477 473
478 return this._connection; 474 return this._connection;
479 }, 475 },
480 476
481 'resetConnection': function(aValue) { 477 'resetConnection': function(aValue) {
482 if (this._connection != null) { 478 if (this._connection != null) {
483 this._connection.reset(); 479 this._connection.reset();
484 } 480 }
485 481
486 this._connection = null; 482 this._connection = null;
487 }, 483 },
488 484
489 //========================================================================= 485 //=========================================================================
490 486
491 'getHeaderIndex': function (aKey) { 487 'getHeaderIndex': function (aKey) {
492 return Clipperz.Async.callbacks("User.getHeaderIndex", [ 488 return Clipperz.Async.callbacks("User.getHeaderIndex", [
493 MochiKit.Base.method(this, 'getServerData'), 489 MochiKit.Base.method(this, 'getServerData'),
494 MochiKit.Base.itemgetter('header'), 490 MochiKit.Base.itemgetter('header'),
495 MochiKit.Base.itemgetter(aKey) 491 MochiKit.Base.itemgetter(aKey)
496 ], {trace:false}) 492 ], {trace:false})
497 }, 493 },
498 494
499 //========================================================================= 495 //=========================================================================
500 496
501 'getRecords': function () { 497 'getRecords': function () {
502 return Clipperz.Async.callbacks("User.getRecords", [ 498 return Clipperz.Async.callbacks("User.getRecords", [
503 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'), 499 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
504 MochiKit.Base.methodcaller('records'), 500 MochiKit.Base.methodcaller('records'),
505 MochiKit.Base.values 501 MochiKit.Base.values
506 ], {trace:false}); 502 ], {trace:false});
507 }, 503 },
508 504
509 'recordWithLabel': function (aLabel) { 505 'recordWithLabel': function (aLabel) {
510 return Clipperz.Async.callbacks("User.recordWithLabel", [ 506 return Clipperz.Async.callbacks("User.recordWithLabel", [
511 MochiKit.Base.method(this, 'getRecords'), 507 MochiKit.Base.method(this, 'getRecords'),
512 MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aRecord) { 508 MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aRecord) {
513 return Clipperz.Async.callbacks("User.recordWithLabel - check record label", [ 509 return Clipperz.Async.callbacks("User.recordWithLabel - check record label", [
514 MochiKit.Base.methodcaller('label'), 510 MochiKit.Base.methodcaller('label'),
515 MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel) 511 MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel)
516 ], {trace:false}, aRecord); 512 ], {trace:false}, aRecord);
diff --git a/frontend/gamma/js/Clipperz/PM/Date.js b/frontend/gamma/js/Clipperz/PM/Date.js
index 96a2700..a62857e 100644
--- a/frontend/gamma/js/Clipperz/PM/Date.js
+++ b/frontend/gamma/js/Clipperz/PM/Date.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.Date) == 'undefined') { Clipperz.PM.Date = {}; } 26if (typeof(Clipperz.PM.Date) == 'undefined') { Clipperz.PM.Date = {}; }
29 27
30Clipperz.PM.Date.VERSION = "0.1"; 28Clipperz.PM.Date.VERSION = "0.1";
31Clipperz.PM.Date.NAME = "Clipperz.PM.Date"; 29Clipperz.PM.Date.NAME = "Clipperz.PM.Date";
32 30
33MochiKit.Base.update(Clipperz.PM.Date, { 31MochiKit.Base.update(Clipperz.PM.Date, {
34 32
35 '__repr__': function () { 33 '__repr__': function () {
36 return "[" + this.NAME + " " + this.VERSION + "]"; 34 return "[" + this.NAME + " " + this.VERSION + "]";
37 }, 35 },
38 36
39 //------------------------------------------------------------------------- 37 //-------------------------------------------------------------------------
40 38
41 'toString': function () { 39 'toString': function () {
42 return this.__repr__(); 40 return this.__repr__();
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'locale': function() { 45 'locale': function() {
48 return { 46 return {
49 'amDesignation':Clipperz.PM.Strings.getValue('calendarStrings.amDesignation'), 47 'amDesignation':Clipperz.PM.Strings.getValue('calendarStrings.amDesignation'),
50 'pmDesignation':Clipperz.PM.Strings.getValue('calendarStrings.pmDesignation'), 48 'pmDesignation':Clipperz.PM.Strings.getValue('calendarStrings.pmDesignation'),
51 'days': Clipperz.PM.Strings.getValue('calendarStrings.days'), 49 'days': Clipperz.PM.Strings.getValue('calendarStrings.days'),
52 'shortDays': Clipperz.PM.Strings.getValue('calendarStrings.shortDays'), 50 'shortDays': Clipperz.PM.Strings.getValue('calendarStrings.shortDays'),
53 'shortMonths': Clipperz.PM.Strings.getValue('calendarStrings.shortMonths'), 51 'shortMonths': Clipperz.PM.Strings.getValue('calendarStrings.shortMonths'),
54 'months': Clipperz.PM.Strings.getValue('calendarStrings.months') 52 'months': Clipperz.PM.Strings.getValue('calendarStrings.months')
55 } 53 }
56 }, 54 },
57 55
58 //========================================================================= 56 //=========================================================================
59/* 57/*
60 'formatDateWithPHPLikeTemplate': function(aDate, aTemplate) { 58 'formatDateWithPHPLikeTemplate': function(aDate, aTemplate) {
61 return Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); 59 return Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
62 }, 60 },
63 61
64 'parseDateWithPHPLikeTemplate': function(aDate, aTemplate) { 62 'parseDateWithPHPLikeTemplate': function(aDate, aTemplate) {
65 return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); 63 return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
66 }, 64 },
67 65
68 //========================================================================= 66 //=========================================================================
69 67
70 'formatDateWithJavaLikeTemplate': function(aDate, aTemplate) { 68 'formatDateWithJavaLikeTemplate': function(aDate, aTemplate) {
71 return Clipperz.Date.formatDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); 69 return Clipperz.Date.formatDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
72 }, 70 },
73 71
74 'parseDateWithJavaLikeTemplate': function(aDate, aTemplate) { 72 'parseDateWithJavaLikeTemplate': function(aDate, aTemplate) {
75 return Clipperz.Date.parseDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); 73 return Clipperz.Date.parseDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
76 }, 74 },
77*/ 75*/
78 //========================================================================= 76 //=========================================================================
79 77
80 'formatWithTemplate': function (aTemplate, aDate) { 78 'formatWithTemplate': function (aTemplate, aDate) {
81 return Clipperz.PM.Date.formatDateWithTemplate(aDate, aTemplate); 79 return Clipperz.PM.Date.formatDateWithTemplate(aDate, aTemplate);
82 }, 80 },
83 81
84 'formatDateWithTemplate': function(aDate, aTemplate) { 82 'formatDateWithTemplate': function(aDate, aTemplate) {
85 var result; 83 var result;
86 84
87 if (aDate == null) { 85 if (aDate == null) {
88 result = "" 86 result = ""
89 } else { 87 } else {
90 result = Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale()); 88 result = Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
91 }; 89 };
92 90
93 return result; 91 return result;
94 }, 92 },
95 93
96 'parseDateWithTemplate': function(aValue, aTemplate) { 94 'parseDateWithTemplate': function(aValue, aTemplate) {
97 return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aValue, aTemplate, Clipperz.PM.Date.locale()); 95 return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aValue, aTemplate, Clipperz.PM.Date.locale());
98 }, 96 },
99 97
100 //========================================================================= 98 //=========================================================================
101 99
102 'formatDateWithUTCFormat': function(aDate) { 100 'formatDateWithUTCFormat': function(aDate) {
103 return Clipperz.Date.formatDateWithUTCFormatAndLocale(aDate, Clipperz.PM.Date.locale()); 101 return Clipperz.Date.formatDateWithUTCFormatAndLocale(aDate, Clipperz.PM.Date.locale());
104 }, 102 },
105 103
106 'parseDateWithUTCFormat': function(aValue) { 104 'parseDateWithUTCFormat': function(aValue) {
107 var result; 105 var result;
108 106
109 if (aValue == null) { 107 if (aValue == null) {
110 result = null; 108 result = null;
111 } else { 109 } else {
112 result = Clipperz.Date.parseDateWithUTCFormatAndLocale(aValue, Clipperz.PM.Date.locale()); 110 result = Clipperz.Date.parseDateWithUTCFormatAndLocale(aValue, Clipperz.PM.Date.locale());
113 } 111 }
114 112
115 return result; 113 return result;
116 }, 114 },
117 115
118 //========================================================================= 116 //=========================================================================
diff --git a/frontend/gamma/js/Clipperz/PM/PIN.js b/frontend/gamma/js/Clipperz/PM/PIN.js
index bc932b2..a32889a 100644
--- a/frontend/gamma/js/Clipperz/PM/PIN.js
+++ b/frontend/gamma/js/Clipperz/PM/PIN.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.PIN) == 'undefined') { Clipperz.PM.PIN = {}; } 26if (typeof(Clipperz.PM.PIN) == 'undefined') { Clipperz.PM.PIN = {}; }
29 27
30MochiKit.Base.update(Clipperz.PM.PIN, { 28MochiKit.Base.update(Clipperz.PM.PIN, {
31 29
32 //------------------------------------------------------------------------- 30 //-------------------------------------------------------------------------
33 31
34 '__repr__': function () { 32 '__repr__': function () {
35 return "[" + this.NAME + " " + this.VERSION + "]"; 33 return "[" + this.NAME + " " + this.VERSION + "]";
36 }, 34 },
37 35
38 //------------------------------------------------------------------------- 36 //-------------------------------------------------------------------------
39 37
40 'toString': function () { 38 'toString': function () {
41 return this.__repr__(); 39 return this.__repr__();
42 }, 40 },
43 41
44 'CREDENTIALS': 'CLIPPERZ.CREDENTIALS', 42 'CREDENTIALS': 'CLIPPERZ.CREDENTIALS',
45 'FAILURE_COUNT': 'CLIPPERZ.FAILED_LOGIN_COUNT', 43 'FAILURE_COUNT': 'CLIPPERZ.FAILED_LOGIN_COUNT',
46 'ALLOWED_RETRY': 3, 44 'ALLOWED_RETRY': 3,
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'isSet': function () { 48 'isSet': function () {
51 return (this.storedCredentials() != null); 49 return (this.storedCredentials() != null);
52 }, 50 },
53 51
54 'storedCredentials': function () { 52 'storedCredentials': function () {
55 return localStorage[this.CREDENTIALS]; 53 return localStorage[this.CREDENTIALS];
56 }, 54 },
57 55
58 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
59 57
60 'recordFailedAttempt': function () { 58 'recordFailedAttempt': function () {
61 varfailureCount; 59 varfailureCount;
62 varresult; 60 varresult;
63 61
64 failureCount = localStorage[this.FAILURE_COUNT]; 62 failureCount = localStorage[this.FAILURE_COUNT];
65 63
66 if (failureCount == null) { 64 if (failureCount == null) {
67 failureCount = 0 65 failureCount = 0
68 } 66 }
69 67
70 failureCount ++; 68 failureCount ++;
71 69
72 if (failureCount < this.ALLOWED_RETRY) { 70 if (failureCount < this.ALLOWED_RETRY) {
73 localStorage[this.FAILURE_COUNT] = failureCount; 71 localStorage[this.FAILURE_COUNT] = failureCount;
74 result = failureCount; 72 result = failureCount;
75 } else { 73 } else {
76 this.removeLocalCredentials(); 74 this.removeLocalCredentials();
77 result = -1; 75 result = -1;
78 } 76 }
79 77
80 return result; 78 return result;
81 }, 79 },
82 80
83 'resetFailedAttemptCount': function () { 81 'resetFailedAttemptCount': function () {
84 localStorage.removeItem(this.FAILURE_COUNT); 82 localStorage.removeItem(this.FAILURE_COUNT);
85 }, 83 },
86 84
87 'failureCount': function () { 85 'failureCount': function () {
88 return localStorage[this.FAILURE_COUNT]; 86 return localStorage[this.FAILURE_COUNT];
89 }, 87 },
90 88
91 //------------------------------------------------------------------------- 89 //-------------------------------------------------------------------------
92 90
93 'deriveKeyFromPin': function (aPIN) { 91 'deriveKeyFromPin': function (aPIN) {
94 return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aPIN)); 92 return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aPIN));
95 }, 93 },
96 94
97 'credentialsWithPIN': function (aPIN) { 95 'credentialsWithPIN': function (aPIN) {
98 varbyteArrayValue; 96 varbyteArrayValue;
99 var decryptedValue; 97 var decryptedValue;
100 varresult; 98 varresult;
101 99
102 byteArrayValue = (new Clipperz.ByteArray()).appendBase64String(localStorage[this.CREDENTIALS]); 100 byteArrayValue = (new Clipperz.ByteArray()).appendBase64String(localStorage[this.CREDENTIALS]);
103 decryptedValue = Clipperz.Crypto.AES.decrypt(this.deriveKeyFromPin(aPIN), byteArrayValue).asString(); 101 decryptedValue = Clipperz.Crypto.AES.decrypt(this.deriveKeyFromPin(aPIN), byteArrayValue).asString();
104 try { 102 try {
105 result = Clipperz.Base.evalJSON(decryptedValue); 103 result = Clipperz.Base.evalJSON(decryptedValue);
106 } catch (error) { 104 } catch (error) {
107 result = {'username':'fakeusername', 'passphrase':'fakepassphrase'}; 105 result = {'username':'fakeusername', 'passphrase':'fakepassphrase'};
108 } 106 }
109 107
110 return result; 108 return result;
111 }, 109 },
112 110
113 'setCredentialsWithPIN': function (aPIN, someCredentials) { 111 'setCredentialsWithPIN': function (aPIN, someCredentials) {
114 varencodedValue; 112 varencodedValue;
115 varbyteArrayValue; 113 varbyteArrayValue;
116 var encryptedValue; 114 var encryptedValue;
117 115
118 encodedValue = Clipperz.Base.serializeJSON(someCredentials); 116 encodedValue = Clipperz.Base.serializeJSON(someCredentials);
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy.js b/frontend/gamma/js/Clipperz/PM/Proxy.js
index 190bffd..a5eaae6 100644
--- a/frontend/gamma/js/Clipperz/PM/Proxy.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy.js
@@ -1,169 +1,161 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28 26
29//============================================================================= 27//=============================================================================
30 28
31Clipperz.PM.Proxy = function(args) { 29Clipperz.PM.Proxy = function(args) {
32 args = args || {}; 30 args = args || {};
33 31
34 this._shouldPayTolls = args.shouldPayTolls || false; 32 this._shouldPayTolls = args.shouldPayTolls || false;
35 33
36 this._tolls = { 34 this._tolls = {
37 'CONNECT':[], 35 'CONNECT':[],
38 'REGISTER':[], 36 'REGISTER':[],
39 'MESSAGE':[] 37 'MESSAGE':[]
40 }; 38 };
41 39
42 if (args.isDefault === true) { 40 if (args.isDefault === true) {
43 Clipperz.PM.Proxy.defaultProxy = this; 41 Clipperz.PM.Proxy.defaultProxy = this;
44 } 42 }
45 43
46 return this; 44 return this;
47} 45}
48 46
49Clipperz.PM.Proxy.prototype = MochiKit.Base.update(null, { 47Clipperz.PM.Proxy.prototype = MochiKit.Base.update(null, {
50 48
51 'toString': function() { 49 'toString': function() {
52 return "Clipperz.PM.Proxy"; 50 return "Clipperz.PM.Proxy";
53 }, 51 },
54 52
55 //========================================================================= 53 //=========================================================================
56 54
57 'shouldPayTolls': function() { 55 'shouldPayTolls': function() {
58 return this._shouldPayTolls; 56 return this._shouldPayTolls;
59 }, 57 },
60 58
61 //------------------------------------------------------------------------- 59 //-------------------------------------------------------------------------
62 60
63 'tolls': function() { 61 'tolls': function() {
64 return this._tolls; 62 return this._tolls;
65 }, 63 },
66 64
67 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
68 66
69 'payToll': function(aRequestType, someParameters) { 67 'payToll': function(aRequestType, someParameters) {
70 vardeferredResult; 68 vardeferredResult;
71 69
72//console.log(">>> Proxy.payToll", aRequestType, someParameters);
73 if (this.shouldPayTolls()) { 70 if (this.shouldPayTolls()) {
74 deferredResult = new Clipperz.Async.Deferred("Proxy.payToll", {trace:false}); 71 deferredResult = new Clipperz.Async.Deferred("Proxy.payToll", {trace:false});
75 72
76 if (this.tolls()[aRequestType].length == 0) { 73 if (this.tolls()[aRequestType].length == 0) {
77 deferredResult.addMethod(this, 'sendMessage', 'knock', {requestType:aRequestType}); 74 deferredResult.addMethod(this, 'sendMessage', 'knock', {requestType:aRequestType});
78 deferredResult.addMethod(this, 'setTollCallback'); 75 deferredResult.addMethod(this, 'setTollCallback');
79 } 76 }
80 deferredResult.addMethod(this.tolls()[aRequestType], 'pop'); 77 deferredResult.addMethod(this.tolls()[aRequestType], 'pop');
81 deferredResult.addCallback(MochiKit.Base.methodcaller('deferredPay')); 78 deferredResult.addCallback(MochiKit.Base.methodcaller('deferredPay'));
82 deferredResult.addCallback(function(aToll) { 79 deferredResult.addCallback(function(aToll) {
83 var result; 80 var result;
84 81
85 result = { 82 result = {
86 parameters: someParameters, 83 parameters: someParameters,
87 toll: aToll 84 toll: aToll
88 } 85 }
89 86
90 return result; 87 return result;
91 }); 88 });
92 89
93 deferredResult.callback(); 90 deferredResult.callback();
94 } else { 91 } else {
95 deferredResult = MochiKit.Async.succeed({parameters:someParameters}); 92 deferredResult = MochiKit.Async.succeed({parameters:someParameters});
96 } 93 }
97//console.log("<<< Proxy.payToll");
98 94
99 return deferredResult; 95 return deferredResult;
100 }, 96 },
101 97
102 //------------------------------------------------------------------------- 98 //-------------------------------------------------------------------------
103 99
104 'addToll': function(aToll) { 100 'addToll': function(aToll) {
105//console.log(">>> Proxy.addToll", aToll);
106 this.tolls()[aToll.requestType()].push(aToll); 101 this.tolls()[aToll.requestType()].push(aToll);
107//console.log("<<< Proxy.addToll");
108 }, 102 },
109 103
110 //========================================================================= 104 //=========================================================================
111 105
112 'setTollCallback': function(someParameters) { 106 'setTollCallback': function(someParameters) {
113//console.log(">>> Proxy.setTollCallback", someParameters);
114 if (typeof(someParameters['toll']) != 'undefined') { 107 if (typeof(someParameters['toll']) != 'undefined') {
115//console.log("added a new toll", someParameters['toll']);
116 this.addToll(new Clipperz.PM.Toll(someParameters['toll'])); 108 this.addToll(new Clipperz.PM.Toll(someParameters['toll']));
117 } 109 }
118//console.log("<<< Proxy.setTallCallback", someParameters['result']); 110
119 return someParameters['result']; 111 return someParameters['result'];
120 }, 112 },
121 113
122 //========================================================================= 114 //=========================================================================
123 115
124 'registration': function (someParameters) { 116 'registration': function (someParameters) {
125 return this.processMessage('registration', someParameters, 'REGISTER'); 117 return this.processMessage('registration', someParameters, 'REGISTER');
126 }, 118 },
127 119
128 'handshake': function (someParameters) { 120 'handshake': function (someParameters) {
129 return this.processMessage('handshake', someParameters, 'CONNECT'); 121 return this.processMessage('handshake', someParameters, 'CONNECT');
130 }, 122 },
131 123
132 'message': function (someParameters) { 124 'message': function (someParameters) {
133 return this.processMessage('message', someParameters, 'MESSAGE'); 125 return this.processMessage('message', someParameters, 'MESSAGE');
134 }, 126 },
135 127
136 'logout': function (someParameters) { 128 'logout': function (someParameters) {
137 return this.processMessage('logout', someParameters, 'MESSAGE'); 129 return this.processMessage('logout', someParameters, 'MESSAGE');
138 }, 130 },
139 131
140 //========================================================================= 132 //=========================================================================
141 133
142 'processMessage': function (aFunctionName, someParameters, aRequestType) { 134 'processMessage': function (aFunctionName, someParameters, aRequestType) {
143 vardeferredResult; 135 vardeferredResult;
144 136
145 deferredResult = new Clipperz.Async.Deferred("Proxy.processMessage", {trace:false}); 137 deferredResult = new Clipperz.Async.Deferred("Proxy.processMessage", {trace:false});
146 deferredResult.addMethod(this, 'payToll', aRequestType); 138 deferredResult.addMethod(this, 'payToll', aRequestType);
147 deferredResult.addMethod(this, 'sendMessage', aFunctionName); 139 deferredResult.addMethod(this, 'sendMessage', aFunctionName);
148 deferredResult.addMethod(this, 'setTollCallback'); 140 deferredResult.addMethod(this, 'setTollCallback');
149 deferredResult.callback(someParameters); 141 deferredResult.callback(someParameters);
150 142
151 return deferredResult; 143 return deferredResult;
152 }, 144 },
153 145
154 //========================================================================= 146 //=========================================================================
155 147
156 'sendMessage': function () { 148 'sendMessage': function () {
157 throw Clipperz.Base.exception.AbstractMethod; 149 throw Clipperz.Base.exception.AbstractMethod;
158 }, 150 },
159 151
160 //========================================================================= 152 //=========================================================================
161 153
162 'isReadOnly': function () { 154 'isReadOnly': function () {
163 return false; 155 return false;
164 }, 156 },
165 157
166 //========================================================================= 158 //=========================================================================
167 __syntaxFix__: "syntax fix" 159 __syntaxFix__: "syntax fix"
168 160
169}); 161});
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js
index 5b39b4a..7d10dd4 100755
--- a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js
@@ -1,91 +1,89 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28 26
29//============================================================================= 27//=============================================================================
30 28
31Clipperz.PM.Proxy.JSON = function(args) { 29Clipperz.PM.Proxy.JSON = function(args) {
32 Clipperz.PM.Proxy.JSON.superclass.constructor.call(this, args); 30 Clipperz.PM.Proxy.JSON.superclass.constructor.call(this, args);
33 31
34 this._url = args.url || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._url = args.url || Clipperz.Base.exception.raise('MandatoryParameter');
35 33
36 return this; 34 return this;
37} 35}
38 36
39Clipperz.Base.extend(Clipperz.PM.Proxy.JSON, Clipperz.PM.Proxy, { 37Clipperz.Base.extend(Clipperz.PM.Proxy.JSON, Clipperz.PM.Proxy, {
40 38
41 'toString': function() { 39 'toString': function() {
42 return "Clipperz.PM.Proxy.JSON"; 40 return "Clipperz.PM.Proxy.JSON";
43 }, 41 },
44 42
45 //========================================================================= 43 //=========================================================================
46 44
47 'url': function () { 45 'url': function () {
48 return this._url; 46 return this._url;
49 }, 47 },
50 48
51 //========================================================================= 49 //=========================================================================
52 50
53 'sendMessage': function(aFunctionName, someParameters) { 51 'sendMessage': function(aFunctionName, someParameters) {
54 vardeferredResult; 52 vardeferredResult;
55 var parameters; 53 var parameters;
56 54
57 parameters = { 55 parameters = {
58 method: aFunctionName, 56 method: aFunctionName,
59 // version: someParameters['version'], 57 // version: someParameters['version'],
60 // message: someParameters['message'], 58 // message: someParameters['message'],
61 parameters: Clipperz.Base.serializeJSON(someParameters) 59 parameters: Clipperz.Base.serializeJSON(someParameters)
62 }; 60 };
63 61
64 deferredResult = new Clipperz.Async.Deferred("Proxy.JSON.sendMessage", {trace:false}); 62 deferredResult = new Clipperz.Async.Deferred("Proxy.JSON.sendMessage", {trace:false});
65 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestSent'); 63 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestSent');
66 deferredResult.addCallback(MochiKit.Async.doXHR, this.url(), { 64 deferredResult.addCallback(MochiKit.Async.doXHR, this.url(), {
67 method:'POST', 65 method:'POST',
68 sendContent:MochiKit.Base.queryString(parameters), 66 sendContent:MochiKit.Base.queryString(parameters),
69 headers:{"Content-Type":"application/x-www-form-urlencoded"} 67 headers:{"Content-Type":"application/x-www-form-urlencoded"}
70 }); 68 });
71 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestReceived'); 69 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestReceived');
72 // deferredResult.addCallback(MochiKit.Async.evalJSONRequest); 70 // deferredResult.addCallback(MochiKit.Async.evalJSONRequest);
73 deferredResult.addCallback(MochiKit.Base.itemgetter('responseText')); 71 deferredResult.addCallback(MochiKit.Base.itemgetter('responseText'));
74 deferredResult.addCallback(Clipperz.Base.evalJSON); 72 deferredResult.addCallback(Clipperz.Base.evalJSON);
75 deferredResult.addCallback(function (someValues) { 73 deferredResult.addCallback(function (someValues) {
76 if (someValues['result'] == 'EXCEPTION') { 74 if (someValues['result'] == 'EXCEPTION') {
77 throw someValues['message']; 75 throw someValues['message'];
78 } 76 }
79 77
80 return someValues; 78 return someValues;
81 }) 79 })
82 // return MochiKit.Base.evalJSON(req.responseText); 80 // return MochiKit.Base.evalJSON(req.responseText);
83 deferredResult.callback(); 81 deferredResult.callback();
84 82
85 return deferredResult; 83 return deferredResult;
86 }, 84 },
87 85
88 //========================================================================= 86 //=========================================================================
89 __syntaxFix__: "syntax fix" 87 __syntaxFix__: "syntax fix"
90 88
91}); 89});
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
index 01ba122..326022c 100644
--- a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
@@ -1,221 +1,217 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { if (typeof(Clipperz.PM.Proxy.Offline) == 'undefined') { throw ""; }} catch (e) { 24try { if (typeof(Clipperz.PM.Proxy.Offline) == 'undefined') { throw ""; }} catch (e) {
27 throw "Clipperz.PM.Proxy.Offline.DataStore depends on Clipperz.PM.Proxy.Offline!"; 25 throw "Clipperz.PM.Proxy.Offline.DataStore depends on Clipperz.PM.Proxy.Offline!";
28} 26}
29 27
30//============================================================================= 28//=============================================================================
31 29
32Clipperz.PM.Proxy.Offline.DataStore = function(args) { 30Clipperz.PM.Proxy.Offline.DataStore = function(args) {
33 args = args || {}; 31 args = args || {};
34 32
35 this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null); 33 this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null);
36 this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly); 34 this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly);
37 this._shouldPayTolls = args.shouldPayTolls || false; 35 this._shouldPayTolls = args.shouldPayTolls || false;
38 36
39 this._tolls = {}; 37 this._tolls = {};
40 this._currentStaticConnection = null; 38 this._currentStaticConnection = null;
41 39
42 return this; 40 return this;
43} 41}
44 42
45Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, { 43Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
46 44
47 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
48 46
49 'isReadOnly': function () { 47 'isReadOnly': function () {
50 return this._isReadOnly; 48 return this._isReadOnly;
51 }, 49 },
52 50
53 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
54 52
55 'shouldPayTolls': function() { 53 'shouldPayTolls': function() {
56 return this._shouldPayTolls; 54 return this._shouldPayTolls;
57 }, 55 },
58 56
59 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
60 58
61 'data': function () { 59 'data': function () {
62 return this._data; 60 return this._data;
63 }, 61 },
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67 'tolls': function () { 65 'tolls': function () {
68 return this._tolls; 66 return this._tolls;
69 }, 67 },
70 68
71 //========================================================================= 69 //=========================================================================
72 70
73 'resetData': function() { 71 'resetData': function() {
74 this._data = { 72 this._data = {
75 'users': { 73 'users': {
76 'catchAllUser': { 74 'catchAllUser': {
77 __masterkey_test_value__: 'masterkey', 75 __masterkey_test_value__: 'masterkey',
78 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 76 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
79 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 77 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
80 } 78 }
81 } 79 }
82 }; 80 };
83 }, 81 },
84 82
85 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
86 84
87 'setupWithEncryptedData': function(someData) { 85 'setupWithEncryptedData': function(someData) {
88 this._data = Clipperz.Base.deepClone(someData); 86 this._data = Clipperz.Base.deepClone(someData);
89 }, 87 },
90 88
91 //------------------------------------------------------------------------- 89 //-------------------------------------------------------------------------
92 90
93 'setupWithData': function(someData) { 91 'setupWithData': function(someData) {
94 var deferredResult; 92 var deferredResult;
95 var resultData; 93 var resultData;
96 var i, c; 94 var i, c;
97 95
98//Clipperz.log(">>> Proxy.Test.setupWithData"); 96//Clipperz.log(">>> Proxy.Test.setupWithData");
99 resultData = this._data; 97 resultData = this._data;
100 98
101 deferredResult = new Clipperz.Async.Deferred("Proxy.Test.seupWithData", {trace:false}); 99 deferredResult = new Clipperz.Async.Deferred("Proxy.Test.seupWithData", {trace:false});
102 c = someData['users'].length; 100 c = someData['users'].length;
103 101
104 for (i=0; i<c; i++) { 102 for (i=0; i<c; i++) {
105 varnewConnection; 103 varnewConnection;
106 varrecordConfiguration; 104 varrecordConfiguration;
107 105
108 deferredResult.addMethod(this, 'userSerializedEncryptedData', someData['users'][i]); 106 deferredResult.addMethod(this, 'userSerializedEncryptedData', someData['users'][i]);
109 deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) { 107 deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) {
110//console.log("SERIALIZED USER", aUserSerializationContext);
111 resultData['users'][aUserSerializationContext['credentials']['C']] = { 108 resultData['users'][aUserSerializationContext['credentials']['C']] = {
112 's': aUserSerializationContext['credentials']['s'], 109 's': aUserSerializationContext['credentials']['s'],
113 'v': aUserSerializationContext['credentials']['v'], 110 'v': aUserSerializationContext['credentials']['v'],
114 'version': aUserSerializationContext['data']['connectionVersion'], 111 'version': aUserSerializationContext['data']['connectionVersion'],
115 'userDetails': aUserSerializationContext['encryptedData']['user']['header'], 112 'userDetails': aUserSerializationContext['encryptedData']['user']['header'],
116 'userDetailsVersion':aUserSerializationContext['encryptedData']['user']['version'], 113 'userDetailsVersion':aUserSerializationContext['encryptedData']['user']['version'],
117 'statistics': aUserSerializationContext['encryptedData']['user']['statistics'], 114 'statistics': aUserSerializationContext['encryptedData']['user']['statistics'],
118 'lock': aUserSerializationContext['encryptedData']['user']['lock'], 115 'lock': aUserSerializationContext['encryptedData']['user']['lock'],
119 'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records']) 116 'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records'])
120 } 117 }
121 }, this)); 118 }, this));
122 } 119 }
123 120
124 deferredResult.addCallback(MochiKit.Base.bind(function() { 121 deferredResult.addCallback(MochiKit.Base.bind(function() {
125//console.log("this._data", resultData);
126 this._data = resultData; 122 this._data = resultData;
127 }, this)); 123 }, this));
128 124
129 deferredResult.callback(); 125 deferredResult.callback();
130//Clipperz.log("<<< Proxy.Test.setupWithData"); 126//Clipperz.log("<<< Proxy.Test.setupWithData");
131 127
132 return deferredResult; 128 return deferredResult;
133 }, 129 },
134 130
135 //========================================================================= 131 //=========================================================================
136 132
137 'getTollForRequestType': function (aRequestType) { 133 'getTollForRequestType': function (aRequestType) {
138 varresult; 134 varresult;
139 vartargetValue; 135 vartargetValue;
140 var cost; 136 var cost;
141 137
142 targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 138 targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
143 switch (aRequestType) { 139 switch (aRequestType) {
144 case 'REGISTER': 140 case 'REGISTER':
145 cost = 5; 141 cost = 5;
146 break; 142 break;
147 case 'CONNECT': 143 case 'CONNECT':
148 cost = 5; 144 cost = 5;
149 break; 145 break;
150 case 'MESSAGE': 146 case 'MESSAGE':
151 cost = 2; 147 cost = 2;
152 break; 148 break;
153 } 149 }
154 150
155 result = { 151 result = {
156 requestType: aRequestType, 152 requestType: aRequestType,
157 targetValue: targetValue, 153 targetValue: targetValue,
158 cost: cost 154 cost: cost
159 } 155 }
160 156
161 if (this.shouldPayTolls()) { 157 if (this.shouldPayTolls()) {
162 this.tolls()[targetValue] = result; 158 this.tolls()[targetValue] = result;
163 } 159 }
164 160
165 return result; 161 return result;
166 }, 162 },
167 163
168 //------------------------------------------------------------------------- 164 //-------------------------------------------------------------------------
169 165
170 'checkToll': function (aFunctionName, someParameters) { 166 'checkToll': function (aFunctionName, someParameters) {
171 if (this.shouldPayTolls()) { 167 if (this.shouldPayTolls()) {
172 var localToll; 168 var localToll;
173 vartollParameters; 169 vartollParameters;
174 170
175 tollParameters = someParameters['toll']; 171 tollParameters = someParameters['toll'];
176 localToll = this.tolls()[tollParameters['targetValue']]; 172 localToll = this.tolls()[tollParameters['targetValue']];
177 173
178 if (localToll != null) { 174 if (localToll != null) {
179 if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) { 175 if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) {
180 throw "Toll value too low."; 176 throw "Toll value too low.";
181 }; 177 };
182 } else { 178 } else {
183 throw "Missing toll"; 179 throw "Missing toll";
184 } 180 }
185 } 181 }
186 }, 182 },
187 183
188 //========================================================================= 184 //=========================================================================
189 185
190 'currentStaticConnection': function () { 186 'currentStaticConnection': function () {
191 if (this._currentStaticConnection == null) { 187 if (this._currentStaticConnection == null) {
192 this._currentStaticConnection = {}; 188 this._currentStaticConnection = {};
193 } 189 }
194 190
195 return this._currentStaticConnection; 191 return this._currentStaticConnection;
196 }, 192 },
197 193
198 //------------------------------------------------------------------------- 194 //-------------------------------------------------------------------------
199 195
200 'getConnectionForRequest': function (aFunctionName, someParameters) { 196 'getConnectionForRequest': function (aFunctionName, someParameters) {
201 varresult; 197 varresult;
202 198
203 if (this.shouldPayTolls()) { 199 if (this.shouldPayTolls()) {
204 if ((typeof(someParameters['toll']) != 'undefined') && (typeof(someParameters['toll']['targetValue']) != 'undefined')) { 200 if ((typeof(someParameters['toll']) != 'undefined') && (typeof(someParameters['toll']['targetValue']) != 'undefined')) {
205 result = this.tolls()[someParameters['toll']['targetValue']]['connection']; 201 result = this.tolls()[someParameters['toll']['targetValue']]['connection'];
206 if (typeof(result) == 'undefined') { 202 if (typeof(result) == 'undefined') {
207 result = {}; 203 result = {};
208 } 204 }
209 } else { 205 } else {
210 result = {}; 206 result = {};
211 } 207 }
212 } else { 208 } else {
213 result = this.currentStaticConnection(); 209 result = this.currentStaticConnection();
214 } 210 }
215 211
216 return result; 212 return result;
217 }, 213 },
218 214
219 //------------------------------------------------------------------------- 215 //-------------------------------------------------------------------------
220 216
221 'storeConnectionForRequestWithConnectionAndResponse': function (aFunctionName, someParameters, aConnection, aResponse) { 217 'storeConnectionForRequestWithConnectionAndResponse': function (aFunctionName, someParameters, aConnection, aResponse) {
@@ -302,507 +298,491 @@ Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
302 result: { 298 result: {
303 'lock': this.data()['users'][someParameters['credentials']['C']]['lock'], 299 'lock': this.data()['users'][someParameters['credentials']['C']]['lock'],
304 'result':'done' 300 'result':'done'
305 }, 301 },
306 toll: this.getTollForRequestType('CONNECT') 302 toll: this.getTollForRequestType('CONNECT')
307 } 303 }
308 304
309 return result; 305 return result;
310 }, 306 },
311 307
312 //------------------------------------------------------------------------- 308 //-------------------------------------------------------------------------
313 309
314 '_handshake': function(aConnection, someParameters) { 310 '_handshake': function(aConnection, someParameters) {
315 var result; 311 var result;
316 varnextTollRequestType; 312 varnextTollRequestType;
317 313
318 result = {}; 314 result = {};
319 if (someParameters.message == "connect") { 315 if (someParameters.message == "connect") {
320 var userData; 316 var userData;
321 var randomBytes; 317 var randomBytes;
322 var v; 318 var v;
323 319
324 userData = this.data()['users'][someParameters.parameters.C]; 320 userData = this.data()['users'][someParameters.parameters.C];
325 321
326 if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) { 322 if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) {
327 aConnection['userData'] = userData; 323 aConnection['userData'] = userData;
328 aConnection['C'] = someParameters.parameters.C; 324 aConnection['C'] = someParameters.parameters.C;
329 } else { 325 } else {
330 aConnection['userData'] = this.data()['users']['catchAllUser']; 326 aConnection['userData'] = this.data()['users']['catchAllUser'];
331 } 327 }
332 328
333 randomBytes = Clipperz.Crypto.Base.generateRandomSeed(); 329 randomBytes = Clipperz.Crypto.Base.generateRandomSeed();
334 aConnection['b'] = new Clipperz.Crypto.BigInt(randomBytes, 16); 330 aConnection['b'] = new Clipperz.Crypto.BigInt(randomBytes, 16);
335 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16); 331 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
336 aConnection['B'] = v.add(Clipperz.Crypto.SRP.g().powerModule(aConnection['b'], Clipperz.Crypto.SRP.n())); 332 aConnection['B'] = v.add(Clipperz.Crypto.SRP.g().powerModule(aConnection['b'], Clipperz.Crypto.SRP.n()));
337 333
338 aConnection['A'] = someParameters.parameters.A; 334 aConnection['A'] = someParameters.parameters.A;
339 335
340 result['s'] = aConnection['userData']['s']; 336 result['s'] = aConnection['userData']['s'];
341 result['B'] = aConnection['B'].asString(16); 337 result['B'] = aConnection['B'].asString(16);
342 338
343 nextTollRequestType = 'CONNECT'; 339 nextTollRequestType = 'CONNECT';
344 } else if (someParameters.message == "credentialCheck") { 340 } else if (someParameters.message == "credentialCheck") {
345 var v, u, S, A, K, M1; 341 var v, u, S, A, K, M1;
346 342
347 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16); 343 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
348 u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aConnection['B'].asString(10))).toHexString(), 16); 344 u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aConnection['B'].asString(10))).toHexString(), 16);
349 A = new Clipperz.Crypto.BigInt(aConnection['A'], 16); 345 A = new Clipperz.Crypto.BigInt(aConnection['A'], 16);
350 S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(aConnection['b'], Clipperz.Crypto.SRP.n()); 346 S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(aConnection['b'], Clipperz.Crypto.SRP.n());
351 347
352 K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2); 348 K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2);
353 349
354 M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + aConnection['B'].asString(10) + K)).toHexString().slice(2); 350 M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + aConnection['B'].asString(10) + K)).toHexString().slice(2);
355 if (someParameters.parameters.M1 == M1) { 351 if (someParameters.parameters.M1 == M1) {
356 var M2; 352 var M2;
357 353
358 M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2); 354 M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2);
359 result['M2'] = M2; 355 result['M2'] = M2;
360 } else { 356 } else {
361 throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error"); 357 throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error");
362 } 358 }
363 359
364 nextTollRequestType = 'MESSAGE'; 360 nextTollRequestType = 'MESSAGE';
365 } else if (someParameters.message == "oneTimePassword") { 361 } else if (someParameters.message == "oneTimePassword") {
366 var otpData; 362 var otpData;
367 363
368 otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey]; 364 otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey];
369 365
370 try { 366 try {
371 if (typeof(otpData) != 'undefined') { 367 if (typeof(otpData) != 'undefined') {
372 if (otpData['status'] == 'ACTIVE') { 368 if (otpData['status'] == 'ACTIVE') {
373 if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) { 369 if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) {
374 result = { 370 result = {
375 'data': otpData['data'], 371 'data': otpData['data'],
376 'version':otpData['version'] 372 'version':otpData['version']
377 } 373 }
378 374
379 otpData['status'] = 'REQUESTED'; 375 otpData['status'] = 'REQUESTED';
380 } else { 376 } else {
381 otpData['status'] = 'DISABLED'; 377 otpData['status'] = 'DISABLED';
382 throw "The requested One Time Password has been disabled, due to a wrong keyChecksum"; 378 throw "The requested One Time Password has been disabled, due to a wrong keyChecksum";
383 } 379 }
384 } else { 380 } else {
385 throw "The requested One Time Password was not active"; 381 throw "The requested One Time Password was not active";
386 } 382 }
387 } else { 383 } else {
388 throw "The requested One Time Password has not been found" 384 throw "The requested One Time Password has not been found"
389 } 385 }
390 } catch (exception) { 386 } catch (exception) {
391 result = { 387 result = {
392 'data': Clipperz.PM.Crypto.randomKey(), 388 'data': Clipperz.PM.Crypto.randomKey(),
393 'version':Clipperz.PM.Connection.communicationProtocol.currentVersion 389 'version':Clipperz.PM.Connection.communicationProtocol.currentVersion
394 } 390 }
395 } 391 }
396 nextTollRequestType = 'CONNECT'; 392 nextTollRequestType = 'CONNECT';
397 } else { 393 } else {
398 MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message); 394 Clipperz.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message);
399 } 395 }
400 396
401 result = { 397 result = {
402 result: result, 398 result: result,
403 toll: this.getTollForRequestType(nextTollRequestType) 399 toll: this.getTollForRequestType(nextTollRequestType)
404 } 400 }
405 401
406 return result; 402 return result;
407 }, 403 },
408 404
409 //------------------------------------------------------------------------- 405 //-------------------------------------------------------------------------
410 406
411 '_message': function(aConnection, someParameters) { 407 '_message': function(aConnection, someParameters) {
412 var result; 408 var result;
413 409
414 result = {}; 410 result = {};
415 411
416 //===================================================================== 412 //=====================================================================
417 // 413 //
418 // R E A D - O N L Y M e t h o d s 414 // R E A D - O N L Y M e t h o d s
419 // 415 //
420 //===================================================================== 416 //=====================================================================
421 if (someParameters.message == 'getUserDetails') { 417 if (someParameters.message == 'getUserDetails') {
422 var recordsStats; 418 var recordsStats;
423 var recordReference; 419 var recordReference;
424 420
425 recordsStats = {}; 421 recordsStats = {};
426 for (recordReference in aConnection['userData']['records']) { 422 for (recordReference in aConnection['userData']['records']) {
427 recordsStats[recordReference] = { 423 recordsStats[recordReference] = {
428 'updateDate': aConnection['userData']['records'][recordReference]['updateDate'] 424 'updateDate': aConnection['userData']['records'][recordReference]['updateDate']
429 } 425 }
430 } 426 }
431 427
432 result['header'] = this.userDetails(aConnection); 428 result['header'] = this.userDetails(aConnection);
433 result['statistics'] = this.statistics(aConnection); 429 result['statistics'] = this.statistics(aConnection);
434 result['maxNumberOfRecords'] = aConnection['userData']['maxNumberOfRecords']; 430 result['maxNumberOfRecords'] = aConnection['userData']['maxNumberOfRecords'];
435 result['version'] = aConnection['userData']['userDetailsVersion']; 431 result['version'] = aConnection['userData']['userDetailsVersion'];
436 result['recordsStats'] = recordsStats; 432 result['recordsStats'] = recordsStats;
437 433
438 if (this.isReadOnly() == false) { 434 if (this.isReadOnly() == false) {
439 varlock; 435 varlock;
440 436
441 if (typeof(aConnection['userData']['lock']) == 'undefined') { 437 if (typeof(aConnection['userData']['lock']) == 'undefined') {
442 aConnection['userData']['lock'] = "<<LOCK>>"; 438 aConnection['userData']['lock'] = "<<LOCK>>";
443 } 439 }
444 440
445 result['lock'] = aConnection['userData']['lock']; 441 result['lock'] = aConnection['userData']['lock'];
446 } 442 }
447 443
448 //===================================================================== 444 //=====================================================================
449 } else if (someParameters.message == 'getRecordDetail') { 445 } else if (someParameters.message == 'getRecordDetail') {
450/* 446/*
451 varrecordData; 447 varrecordData;
452 var currentVersionData; 448 var currentVersionData;
453 449
454 recordData = this.userData()['records'][someParameters['parameters']['reference']]; 450 recordData = this.userData()['records'][someParameters['parameters']['reference']];
455 result['reference'] = someParameters['parameters']['reference']; 451 result['reference'] = someParameters['parameters']['reference'];
456 result['data'] = recordData['data']; 452 result['data'] = recordData['data'];
457 result['version'] = recordData['version']; 453 result['version'] = recordData['version'];
458 result['creationData'] = recordData['creationDate']; 454 result['creationData'] = recordData['creationDate'];
459 result['updateDate'] = recordData['updateDate']; 455 result['updateDate'] = recordData['updateDate'];
460 result['accessDate'] = recordData['accessDate']; 456 result['accessDate'] = recordData['accessDate'];
461 457
462 currentVersionData = recordData['versions'][recordData['currentVersion']]; 458 currentVersionData = recordData['versions'][recordData['currentVersion']];
463 459
464 result['currentVersion'] = {}; 460 result['currentVersion'] = {};
465 result['currentVersion']['reference'] = recordData['currentVersion']; 461 result['currentVersion']['reference'] = recordData['currentVersion'];
466 result['currentVersion']['version'] = currentVersionData['version']; 462 result['currentVersion']['version'] = currentVersionData['version'];
467 result['currentVersion']['header'] = currentVersionData['header']; 463 result['currentVersion']['header'] = currentVersionData['header'];
468 result['currentVersion']['data'] = currentVersionData['data']; 464 result['currentVersion']['data'] = currentVersionData['data'];
469 result['currentVersion']['creationData'] = currentVersionData['creationDate']; 465 result['currentVersion']['creationData'] = currentVersionData['creationDate'];
470 result['currentVersion']['updateDate'] = currentVersionData['updateDate']; 466 result['currentVersion']['updateDate'] = currentVersionData['updateDate'];
471 result['currentVersion']['accessDate'] = currentVersionData['accessDate']; 467 result['currentVersion']['accessDate'] = currentVersionData['accessDate'];
472 if (typeof(currentVersionData['previousVersion']) != 'undefined') { 468 if (typeof(currentVersionData['previousVersion']) != 'undefined') {
473 result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey']; 469 result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey'];
474 result['currentVersion']['previousVersion'] = currentVersionData['previousVersion']; 470 result['currentVersion']['previousVersion'] = currentVersionData['previousVersion'];
475 } 471 }
476*/ 472*/
477 MochiKit.Base.update(result, aConnection['userData']['records'][someParameters['parameters']['reference']]); 473 MochiKit.Base.update(result, aConnection['userData']['records'][someParameters['parameters']['reference']]);
478 result['reference'] = someParameters['parameters']['reference']; 474 result['reference'] = someParameters['parameters']['reference'];
479 475
480 //===================================================================== 476 //=====================================================================
481 // 477 //
482 // R E A D - W R I T E M e t h o d s 478 // R E A D - W R I T E M e t h o d s
483 // 479 //
484 //===================================================================== 480 //=====================================================================
485 } else if (someParameters.message == 'upgradeUserCredentials') { 481 } else if (someParameters.message == 'upgradeUserCredentials') {
486 if (this.isReadOnly() == false) { 482 if (this.isReadOnly() == false) {
487 var parameters; 483 var parameters;
488 var credentials; 484 var credentials;
489 485
490 parameters = someParameters['parameters']; 486 parameters = someParameters['parameters'];
491 credentials = parameters['credentials']; 487 credentials = parameters['credentials'];
492 488
493 if ((credentials['C'] == null) 489 if ((credentials['C'] == null)
494 ||(credentials['s'] == null) 490 ||(credentials['s'] == null)
495 ||(credentials['v'] == null) 491 ||(credentials['v'] == null)
496 ||(credentials['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion) 492 ||(credentials['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion)
497 ) { 493 ) {
498 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed; 494 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
499 } else { 495 } else {
500 varoldCValue; 496 varoldCValue;
501 oldCValue = aConnection['C']; 497 oldCValue = aConnection['C'];
502 498
503 this.data()['users'][credentials['C']] = aConnection['userData']; 499 this.data()['users'][credentials['C']] = aConnection['userData'];
504 aConnection['C'] = credentials['C']; 500 aConnection['C'] = credentials['C'];
505 501
506 aConnection['userData']['s'] = credentials['s']; 502 aConnection['userData']['s'] = credentials['s'];
507 aConnection['userData']['v'] = credentials['v']; 503 aConnection['userData']['v'] = credentials['v'];
508 aConnection['userData']['version'] = credentials['version']; 504 aConnection['userData']['version'] = credentials['version'];
509 505
510 aConnection['userData']['userDetails'] = parameters['user']['header']; 506 aConnection['userData']['userDetails'] = parameters['user']['header'];
511 aConnection['userData']['userDetailsVersion'] = parameters['user']['version']; 507 aConnection['userData']['userDetailsVersion'] = parameters['user']['version'];
512 aConnection['userData']['statistics'] = parameters['user']['statistics']; 508 aConnection['userData']['statistics'] = parameters['user']['statistics'];
513 509
514 aConnection['userData']['lock'] = parameters['user']['lock']; 510 aConnection['userData']['lock'] = parameters['user']['lock'];
515 511
516 delete this.data()['users'][oldCValue]; 512 delete this.data()['users'][oldCValue];
517 513
518 result = {result:"done", parameters:parameters}; 514 result = {result:"done", parameters:parameters};
519 } 515 }
520 } else { 516 } else {
521 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; 517 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
522 } 518 }
523 //===================================================================== 519 //=====================================================================
524 /* } else if (someParameters.message == 'updateData') { 520 /* } else if (someParameters.message == 'updateData') {
525 if (this.isReadOnly() == false) { 521 if (this.isReadOnly() == false) {
526 var i, c; 522 var i, c;
527 523
528//console.log("###===============================================================");
529//console.log("###>>>", Clipperz.Base.serializeJSON(someParameters));
530//console.log("###--- userData", Clipperz.Base.serializeJSON(this.userData()));
531 if (this.userData()['lock']!= someParameters['parameters']['user']['lock']) { 524 if (this.userData()['lock']!= someParameters['parameters']['user']['lock']) {
532 throw "the lock attribute is not processed correctly" 525 throw "the lock attribute is not processed correctly"
533 } 526 }
534 527
535 this.userData()['userDetails'] = someParameters['parameters']['user']['header']; 528 this.userData()['userDetails'] = someParameters['parameters']['user']['header'];
536 this.userData()['statistics'] = someParameters['parameters']['user']['statistics']; 529 this.userData()['statistics'] = someParameters['parameters']['user']['statistics'];
537 this.userData()['userDetailsVersions']= someParameters['parameters']['user']['version']; 530 this.userData()['userDetailsVersions']= someParameters['parameters']['user']['version'];
538 531
539 c = someParameters['parameters']['records'].length; 532 c = someParameters['parameters']['records'].length;
540 for (i=0; i<c; i++) { 533 for (i=0; i<c; i++) {
541 var currentRecord; 534 var currentRecord;
542 var currentRecordData; 535 var currentRecordData;
543 536
544 currentRecordData = someParameters['parameters']['records'][i]; 537 currentRecordData = someParameters['parameters']['records'][i];
545 currentRecord = this.userData()['records'][currentRecordData['record']['reference']]; 538 currentRecord = this.userData()['records'][currentRecordData['record']['reference']];
546 539
547 if (currentRecord == null) { 540 if (currentRecord == null) {
548 } 541 }
549 542
550 currentRecord['data'] = currentRecordData['record']['data']; 543 currentRecord['data'] = currentRecordData['record']['data'];
551 currentRecord['version'] = currentRecordData['record']['version']; 544 currentRecord['version'] = currentRecordData['record']['version'];
552 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference']; 545 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
553 546
554 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = { 547 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
555 'data': currentRecordData['currentRecordVersion']['data'], 548 'data': currentRecordData['currentRecordVersion']['data'],
556 'version': currentRecordData['currentRecordVersion']['version'], 549 'version': currentRecordData['currentRecordVersion']['version'],
557 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'], 550 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
558 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey'] 551 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey']
559 } 552 }
560 } 553 }
561 554
562 this.userData()['lock'] = Clipperz.PM.Crypto.randomKey(); 555 this.userData()['lock'] = Clipperz.PM.Crypto.randomKey();
563 result['lock'] = this.userData()['lock']; 556 result['lock'] = this.userData()['lock'];
564 result['result'] = 'done'; 557 result['result'] = 'done';
565//console.log("###<<< userData", Clipperz.Base.serializeJSON(this.userData()));
566 } else { 558 } else {
567 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; 559 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
568 } 560 }
569 */ //===================================================================== 561 */ //=====================================================================
570 } else if (someParameters.message == 'saveChanges') { 562 } else if (someParameters.message == 'saveChanges') {
571 if (this.isReadOnly() == false) { 563 if (this.isReadOnly() == false) {
572 var i, c; 564 var i, c;
573 565
574//console.log("###===============================================================");
575//console.log("###>>>", someParameters);
576//console.log("###>>>", Clipperz.Base.serializeJSON(someParameters));
577//console.log("###--- userData", Clipperz.Base.serializeJSON(this.userData()));
578//console.log("###===============================================================");
579//console.log("--- userData.lock ", this.userData()['lock']);
580//console.log("--- parameters.lock", someParameters['parameters']['user']['lock']);
581 if (aConnection['userData']['lock']!= someParameters['parameters']['user']['lock']) { 566 if (aConnection['userData']['lock']!= someParameters['parameters']['user']['lock']) {
582 throw "the lock attribute is not processed correctly" 567 throw "the lock attribute is not processed correctly"
583 } 568 }
584 569
585 aConnection['userData']['userDetails'] = someParameters['parameters']['user']['header']; 570 aConnection['userData']['userDetails'] = someParameters['parameters']['user']['header'];
586 aConnection['userData']['statistics'] = someParameters['parameters']['user']['statistics']; 571 aConnection['userData']['statistics'] = someParameters['parameters']['user']['statistics'];
587 aConnection['userData']['userDetailsVersions']= someParameters['parameters']['user']['version']; 572 aConnection['userData']['userDetailsVersions']= someParameters['parameters']['user']['version'];
588 573
589 c = someParameters['parameters']['records']['updated'].length; 574 c = someParameters['parameters']['records']['updated'].length;
590 for (i=0; i<c; i++) { 575 for (i=0; i<c; i++) {
591 var currentRecord; 576 var currentRecord;
592 var currentRecordData; 577 var currentRecordData;
593 578
594 currentRecordData = someParameters['parameters']['records']['updated'][i]; 579 currentRecordData = someParameters['parameters']['records']['updated'][i];
595 currentRecord = aConnection['userData']['records'][currentRecordData['record']['reference']]; 580 currentRecord = aConnection['userData']['records'][currentRecordData['record']['reference']];
596 581
597 if ( 582 if (
598 (typeof(aConnection['userData']['records'][currentRecordData['record']['reference']]) == 'undefined') 583 (typeof(aConnection['userData']['records'][currentRecordData['record']['reference']]) == 'undefined')
599 && 584 &&
600 (typeof(currentRecordData['currentRecordVersion']) == 'undefined') 585 (typeof(currentRecordData['currentRecordVersion']) == 'undefined')
601 ) { 586 ) {
602//console.log("######## SHIT HAPPENS");
603 throw "Record added without a recordVersion"; 587 throw "Record added without a recordVersion";
604 } 588 }
605 589
606 if (currentRecord == null) { 590 if (currentRecord == null) {
607 currentRecord = {}; 591 currentRecord = {};
608 currentRecord['versions'] = {}; 592 currentRecord['versions'] = {};
609 currentRecord['creationDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); 593 currentRecord['creationDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
610 currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); 594 currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
611 595
612 aConnection['userData']['records'][currentRecordData['record']['reference']] = currentRecord; 596 aConnection['userData']['records'][currentRecordData['record']['reference']] = currentRecord;
613 } 597 }
614 598
615 currentRecord['data'] = currentRecordData['record']['data']; 599 currentRecord['data'] = currentRecordData['record']['data'];
616 currentRecord['version']= currentRecordData['record']['version']; 600 currentRecord['version']= currentRecordData['record']['version'];
617 currentRecord['updateDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date()); 601 currentRecord['updateDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
618 602
619 if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') { 603 if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') {
620 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference']; 604 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
621 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = { 605 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
622 'data': currentRecordData['currentRecordVersion']['data'], 606 'data': currentRecordData['currentRecordVersion']['data'],
623 'version': currentRecordData['currentRecordVersion']['version'], 607 'version': currentRecordData['currentRecordVersion']['version'],
624 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'], 608 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
625 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey'], 609 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey'],
626 'creationDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), 610 'creationDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
627 'updateDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()), 611 'updateDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
628 'accessDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()) 612 'accessDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date())
629 } 613 }
630 } 614 }
631 } 615 }
632 616
633 c = someParameters['parameters']['records']['deleted'].length; 617 c = someParameters['parameters']['records']['deleted'].length;
634 for (i=0; i<c; i++) { 618 for (i=0; i<c; i++) {
635 var currentRecordReference; 619 var currentRecordReference;
636 620
637 currentRecordReference = someParameters['parameters']['records']['deleted'][i]; 621 currentRecordReference = someParameters['parameters']['records']['deleted'][i];
638//console.log("DELETING records", currentRecordReference);
639 delete aConnection['userData']['records'][currentRecordReference]; 622 delete aConnection['userData']['records'][currentRecordReference];
640 } 623 }
641 624
642 aConnection['userData']['lock'] = Clipperz.PM.Crypto.randomKey(); 625 aConnection['userData']['lock'] = Clipperz.PM.Crypto.randomKey();
643 result['lock'] = aConnection['userData']['lock']; 626 result['lock'] = aConnection['userData']['lock'];
644 result['result'] = 'done'; 627 result['result'] = 'done';
645//console.log("###<<< userData", Clipperz.Base.serializeJSON(this.userData()));
646 } else { 628 } else {
647 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly; 629 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
648 } 630 }
649 631
650 //===================================================================== 632 //=====================================================================
651 // 633 //
652 // U N H A N D L E D M e t h o d 634 // U N H A N D L E D M e t h o d
653 // 635 //
654 //===================================================================== 636 //=====================================================================
655 } else { 637 } else {
656 MochiKit.Logging.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message); 638 Clipperz.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message);
657 } 639 }
658 640
659 result = { 641 result = {
660 result: result, 642 result: result,
661 toll: this.getTollForRequestType('MESSAGE') 643 toll: this.getTollForRequestType('MESSAGE')
662 } 644 }
663 645
664 // return MochiKit.Async.succeed(result); 646 // return MochiKit.Async.succeed(result);
665 return result; 647 return result;
666 }, 648 },
667 649
668 //------------------------------------------------------------------------- 650 //-------------------------------------------------------------------------
669 651
670 '_logout': function(someParameters) { 652 '_logout': function(someParameters) {
671 // return MochiKit.Async.succeed({result: 'done'}); 653 // return MochiKit.Async.succeed({result: 'done'});
672 return {result: 'done'}; 654 return {result: 'done'};
673 }, 655 },
674 656
675 //========================================================================= 657 //=========================================================================
676 //######################################################################### 658 //#########################################################################
677 659
678 'isTestData': function(aConnection) { 660 'isTestData': function(aConnection) {
679 return (typeof(aConnection['userData']['__masterkey_test_value__']) != 'undefined'); 661 return (typeof(aConnection['userData']['__masterkey_test_value__']) != 'undefined');
680 }, 662 },
681 663
682 'userDetails': function(aConnection) { 664 'userDetails': function(aConnection) {
683 var result; 665 var result;
684 666
685 if (this.isTestData(aConnection)) { 667 if (this.isTestData(aConnection)) {
686 var serializedHeader; 668 var serializedHeader;
687 var version; 669 var version;
688 670
689//MochiKit.Logging.logDebug("### test data"); 671//Clipperz.logDebug("### test data");
690 version = aConnection['userData']['userDetailsVersion']; 672 version = aConnection['userData']['userDetailsVersion'];
691 serializedHeader = Clipperz.Base.serializeJSON(aConnection['userData']['userDetails']); 673 serializedHeader = Clipperz.Base.serializeJSON(aConnection['userData']['userDetails']);
692 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedHeader); 674 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedHeader);
693 } else { 675 } else {
694//MochiKit.Logging.logDebug("### NOT test data"); 676//Clipperz.logDebug("### NOT test data");
695 result = aConnection['userData']['userDetails']; 677 result = aConnection['userData']['userDetails'];
696 } 678 }
697 679
698 return result; 680 return result;
699 }, 681 },
700 682
701 'statistics': function(aConnection) { 683 'statistics': function(aConnection) {
702 var result; 684 var result;
703 685
704 if (aConnection['userData']['statistics'] != null) { 686 if (aConnection['userData']['statistics'] != null) {
705 if (this.isTestData(aConnection)) { 687 if (this.isTestData(aConnection)) {
706 var serializedStatistics; 688 var serializedStatistics;
707 var version; 689 var version;
708 690
709 version = aConnection['userData']['userDetailsVersion']; 691 version = aConnection['userData']['userDetailsVersion'];
710 serializedStatistics = Clipperz.Base.serializeJSON(aConnection['userData']['statistics']); 692 serializedStatistics = Clipperz.Base.serializeJSON(aConnection['userData']['statistics']);
711 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedStatistics); 693 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedStatistics);
712 } else { 694 } else {
713 result = aConnection['userData']['statistics']; 695 result = aConnection['userData']['statistics'];
714 } 696 }
715 } else { 697 } else {
716 result = null; 698 result = null;
717 } 699 }
718 700
719 return result; 701 return result;
720 }, 702 },
721 703
722/* 704/*
723 'userSerializedEncryptedData': function(someData) { 705 'userSerializedEncryptedData': function(someData) {
724 var deferredResult; 706 var deferredResult;
725 var deferredContext; 707 var deferredContext;
726 708
727 deferredContext = { 'data': someData }; 709 deferredContext = { 'data': someData };
728 710
729 deferredResult = new Clipperz.Async.Deferred('Proxy.Test.serializeUserEncryptedData', {trace:false}); 711 deferredResult = new Clipperz.Async.Deferred('Proxy.Test.serializeUserEncryptedData', {trace:false});
730 deferredResult.addCallback(MochiKit.Base.bind(function(aDeferredContext) { 712 deferredResult.addCallback(MochiKit.Base.bind(function(aDeferredContext) {
731 aDeferredContext['user'] = this.createUserUsingConfigurationData(aDeferredContext['data']); 713 aDeferredContext['user'] = this.createUserUsingConfigurationData(aDeferredContext['data']);
732 return aDeferredContext; 714 return aDeferredContext;
733 }, this)); 715 }, this));
734 deferredResult.addCallback(function(aDeferredContext) { 716 deferredResult.addCallback(function(aDeferredContext) {
735 // return aDeferredContext['user'].encryptedDataUsingVersion(aDeferredContext['data']['version']); 717 // return aDeferredContext['user'].encryptedDataUsingVersion(aDeferredContext['data']['version']);
736 return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']); 718 return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']);
737 }); 719 });
738 deferredResult.addCallback(function(aUserEncryptedData) { 720 deferredResult.addCallback(function(aUserEncryptedData) {
739 deferredContext['encryptedData'] = aUserEncryptedData; 721 deferredContext['encryptedData'] = aUserEncryptedData;
740 return deferredContext; 722 return deferredContext;
741 }); 723 });
742 deferredResult.addCallback(function(aDeferredContext) { 724 deferredResult.addCallback(function(aDeferredContext) {
743 var connection; 725 var connection;
744 726
745 connection = new Clipperz.PM.Connection.communicationProtocol.versions[aDeferredContext['data']['connectionVersion']]() 727 connection = new Clipperz.PM.Connection.communicationProtocol.versions[aDeferredContext['data']['connectionVersion']]()
746 aDeferredContext['credentials'] = connection.serverSideUserCredentials(aDeferredContext['user'].username(),aDeferredContext['user'].passphrase()); 728 aDeferredContext['credentials'] = connection.serverSideUserCredentials(aDeferredContext['user'].username(),aDeferredContext['user'].passphrase());
747 729
748 return aDeferredContext; 730 return aDeferredContext;
749 }); 731 });
750 732
751 // deferredResult.addCallback(function(aDeferredContext) { 733 // deferredResult.addCallback(function(aDeferredContext) {
752//console.log("#-#-#-#-#", aDeferredContext);
753 // return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']); 734 // return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']);
754 // }, deferredContext); 735 // }, deferredContext);
755 // deferredResult.addCallback(function(aUserSerializedData) { 736 // deferredResult.addCallback(function(aUserSerializedData) {
756//console.log("USER SERIALIZED DATA", aUserSerializedData);
757 // }); 737 // });
758// 738//
759 // deferredResult.addCallback(MochiKit.Async.succeed, deferredContext); 739 // deferredResult.addCallback(MochiKit.Async.succeed, deferredContext);
760 deferredResult.callback(deferredContext); 740 deferredResult.callback(deferredContext);
761 741
762 return deferredResult; 742 return deferredResult;
763 }, 743 },
764 744
765 'createUserUsingConfigurationData': function(someData) { 745 'createUserUsingConfigurationData': function(someData) {
766 var result; 746 var result;
767 var user; 747 var user;
768 var recordLabel; 748 var recordLabel;
769 749
770 user = new Clipperz.PM.DataModel.User(); 750 user = new Clipperz.PM.DataModel.User();
771 user.initForTests(); 751 user.initForTests();
772 user.setUsername(someData['username']); 752 user.setUsername(someData['username']);
773 user.setPassphrase(someData['passphrase']); 753 user.setPassphrase(someData['passphrase']);
774 754
775 for (recordLabel in someData['records']) { 755 for (recordLabel in someData['records']) {
776 var recordData; 756 var recordData;
777 var record; 757 var record;
778 var i, c; 758 var i, c;
779 759
780 recordData = someData['records'][recordLabel]; 760 recordData = someData['records'][recordLabel];
781 record = new Clipperz.PM.DataModel.Record({user:user, label:recordLabel}); 761 record = new Clipperz.PM.DataModel.Record({user:user, label:recordLabel});
782 record.setNotes(recordData['notes']); 762 record.setNotes(recordData['notes']);
783 763
784 c = recordData['fields'].length; 764 c = recordData['fields'].length;
785 for (i=0; i<c; i++) { 765 for (i=0; i<c; i++) {
786 var recordField; 766 var recordField;
787 767
788 recordField = new Clipperz.PM.DataModel.RecordField(); 768 recordField = new Clipperz.PM.DataModel.RecordField();
789 recordField.setLabel(recordData['fields'][i]['name']); 769 recordField.setLabel(recordData['fields'][i]['name']);
790 recordField.setValue(recordData['fields'][i]['value']); 770 recordField.setValue(recordData['fields'][i]['value']);
791 recordField.setType(recordData['fields'][i]['type']); 771 recordField.setType(recordData['fields'][i]['type']);
792 record.addField(recordField); 772 record.addField(recordField);
793 } 773 }
794 user.addRecord(record, true); 774 user.addRecord(record, true);
795 } 775 }
796 776
797 result = user; 777 result = user;
798 778
799 return result; 779 return result;
800 }, 780 },
801*/ 781*/
802 //========================================================================= 782 //=========================================================================
803 __syntaxFix__: "syntax fix" 783 __syntaxFix__: "syntax fix"
804}); 784});
805 785
806Clipperz.PM.Proxy.Offline.DataStore['exception'] = { 786Clipperz.PM.Proxy.Offline.DataStore['exception'] = {
807 'ReadOnly': new MochiKit.Base.NamedError("Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly") 787 'ReadOnly': new MochiKit.Base.NamedError("Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly")
808}; \ No newline at end of file 788}; \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js
index a86ac4f..5764bda 100644
--- a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js
@@ -1,64 +1,62 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28 26
29//============================================================================= 27//=============================================================================
30 28
31Clipperz.PM.Proxy.Offline = function(args) { 29Clipperz.PM.Proxy.Offline = function(args) {
32 args = args || {}; 30 args = args || {};
33 31
34 Clipperz.PM.Proxy.Offline.superclass.constructor.call(this, args); 32 Clipperz.PM.Proxy.Offline.superclass.constructor.call(this, args);
35 33
36 this._dataStore = args.dataStore || new Clipperz.PM.Proxy.Offline.DataStore(args); 34 this._dataStore = args.dataStore || new Clipperz.PM.Proxy.Offline.DataStore(args);
37 35
38 return this; 36 return this;
39} 37}
40 38
41Clipperz.Base.extend(Clipperz.PM.Proxy.Offline, Clipperz.PM.Proxy, { 39Clipperz.Base.extend(Clipperz.PM.Proxy.Offline, Clipperz.PM.Proxy, {
42 40
43 'toString': function () { 41 'toString': function () {
44 return "Clipperz.PM.Proxy.Offline"; 42 return "Clipperz.PM.Proxy.Offline";
45 }, 43 },
46 44
47 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
48 46
49 'dataStore': function () { 47 'dataStore': function () {
50 return this._dataStore; 48 return this._dataStore;
51 }, 49 },
52 50
53 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
54 52
55 'sendMessage': function(aFunctionName, someParameters) { 53 'sendMessage': function(aFunctionName, someParameters) {
56 return this.dataStore().processMessage(aFunctionName, someParameters); 54 return this.dataStore().processMessage(aFunctionName, someParameters);
57 }, 55 },
58 56
59 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
60 58
61 __syntaxFix__: "syntax fix" 59 __syntaxFix__: "syntax fix"
62 60
63}); 61});
64 62
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.OfflineCache.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.OfflineCache.js
index 803c590..f628975 100644
--- a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.OfflineCache.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.OfflineCache.js
@@ -1,65 +1,63 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28 26
29//============================================================================= 27//=============================================================================
30 28
31Clipperz.PM.Proxy.OfflineCache = function(args) { 29Clipperz.PM.Proxy.OfflineCache = function(args) {
32 args = args || {}; 30 args = args || {};
33 31
34 Clipperz.PM.Proxy.Offline.superclass.constructor.call(this, args); 32 Clipperz.PM.Proxy.Offline.superclass.constructor.call(this, args);
35 33
36 //this._dataStore = args.dataStore || new Clipperz.PM.Proxy.Offline.DataStore(args); 34 //this._dataStore = args.dataStore || new Clipperz.PM.Proxy.Offline.DataStore(args);
37 35
38 return this; 36 return this;
39} 37}
40 38
41Clipperz.Base.extend(Clipperz.PM.Proxy.OfflineCache, Clipperz.PM.Proxy, { 39Clipperz.Base.extend(Clipperz.PM.Proxy.OfflineCache, Clipperz.PM.Proxy, {
42 40
43 'toString': function () { 41 'toString': function () {
44 return "Clipperz.PM.Proxy.OfflineCache"; 42 return "Clipperz.PM.Proxy.OfflineCache";
45 }, 43 },
46 44
47 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
48 46
49 //'dataStore': function () { 47 //'dataStore': function () {
50 // return this._dataStore; 48 // return this._dataStore;
51 //}, 49 //},
52 50
53 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
54 52
55 'sendMessage': function(aFunctionName, someParameters) { 53 'sendMessage': function(aFunctionName, someParameters) {
56 throw Clipperz.Base.exception.MethodNotImplementedYet; 54 throw Clipperz.Base.exception.MethodNotImplementedYet;
57 // return this.dataStore().processMessage(aFunctionName, someParameters); 55 // return this.dataStore().processMessage(aFunctionName, someParameters);
58 }, 56 },
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 __syntaxFix__: "syntax fix" 60 __syntaxFix__: "syntax fix"
63 61
64}); 62});
65 63
diff --git a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js
index d554c6a..d459726 100644
--- a/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js
+++ b/frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js
@@ -1,164 +1,156 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.Proxy) == 'undefined') { Clipperz.PM.Proxy = {}; } 26if (typeof(Clipperz.PM.Proxy) == 'undefined') { Clipperz.PM.Proxy = {}; }
29 27
30//============================================================================= 28//=============================================================================
31 29
32Clipperz.PM.Proxy.Test = function(args) { 30Clipperz.PM.Proxy.Test = function(args) {
33 Clipperz.PM.Proxy.Test.superclass.constructor.call(this, args); 31 Clipperz.PM.Proxy.Test.superclass.constructor.call(this, args);
34 32
35 args = args || {}; 33 args = args || {};
36 34
37 this._expectedRequests = (args.shouldCheckExpectedRequests === true) ? [] : null; 35 this._expectedRequests = (args.shouldCheckExpectedRequests === true) ? [] : null;
38 this._isExpectingRequests = true; 36 this._isExpectingRequests = true;
39 this._unexpectedRequests = []; 37 this._unexpectedRequests = [];
40 38
41 this.dataStore().resetData(); 39 this.dataStore().resetData();
42 40
43 return this; 41 return this;
44} 42}
45 43
46Clipperz.Base.extend(Clipperz.PM.Proxy.Test, Clipperz.PM.Proxy.Offline, { 44Clipperz.Base.extend(Clipperz.PM.Proxy.Test, Clipperz.PM.Proxy.Offline, {
47 45
48 'toString': function() { 46 'toString': function() {
49 return "Clipperz.PM.Proxy.Test"; 47 return "Clipperz.PM.Proxy.Test";
50 }, 48 },
51 49
52 //========================================================================= 50 //=========================================================================
53 51
54 'expectedRequests': function () { 52 'expectedRequests': function () {
55 return this._expectedRequests; 53 return this._expectedRequests;
56 }, 54 },
57 55
58 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
59 57
60 'shouldCheckExpectedRequests': function () { 58 'shouldCheckExpectedRequests': function () {
61 return (this._expectedRequests != null); 59 return (this._expectedRequests != null);
62 }, 60 },
63 61
64 'setShouldCheckExpectedRequests': function(aValue) { 62 'setShouldCheckExpectedRequests': function(aValue) {
65 if (aValue) { 63 if (aValue) {
66 this._expectedRequests = aValue; 64 this._expectedRequests = aValue;
67 } else { 65 } else {
68 this._expectedRequests = null; 66 this._expectedRequests = null;
69 } 67 }
70 }, 68 },
71 69
72 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
73 71
74 'shouldNotReceiveAnyFurtherRequest': function () { 72 'shouldNotReceiveAnyFurtherRequest': function () {
75 this._isExpectingRequests = false; 73 this._isExpectingRequests = false;
76 }, 74 },
77 75
78 'mayReceiveMoreRequests': function () { 76 'mayReceiveMoreRequests': function () {
79 this._isExpectingRequests = true; 77 this._isExpectingRequests = true;
80 this.resetUnexpectedRequests(); 78 this.resetUnexpectedRequests();
81 }, 79 },
82 80
83 'isExpectingRequests': function () { 81 'isExpectingRequests': function () {
84 return this._isExpectingRequests; 82 return this._isExpectingRequests;
85 }, 83 },
86 84
87 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
88 86
89 'unexpectedRequests': function () { 87 'unexpectedRequests': function () {
90 return this._unexpectedRequests; 88 return this._unexpectedRequests;
91 }, 89 },
92 90
93 'resetUnexpectedRequests': function () { 91 'resetUnexpectedRequests': function () {
94 this._unexpectedRequests = []; 92 this._unexpectedRequests = [];
95 }, 93 },
96 94
97 //------------------------------------------------------------------------- 95 //-------------------------------------------------------------------------
98 96
99 'testExpectedRequestParameters': function (aPath, anActualRequest, anExpectedRequest) { 97 'testExpectedRequestParameters': function (aPath, anActualRequest, anExpectedRequest) {
100 var aKey; 98 var aKey;
101//console.log(">>> Proxy.testExpectedRequestParameters [" + aPath + "]", anActualRequest, anExpectedRequest);
102 for (aKey in anExpectedRequest) { 99 for (aKey in anExpectedRequest) {
103 if (typeof(anActualRequest[aKey]) == 'undefined') { 100 if (typeof(anActualRequest[aKey]) == 'undefined') {
104 throw "the expected paramter [" + aKey + "] is missing from the actual request"; 101 throw "the expected paramter [" + aKey + "] is missing from the actual request";
105 } 102 }
106 if (typeof(anExpectedRequest[aKey]) == 'object') { 103 if (typeof(anExpectedRequest[aKey]) == 'object') {
107 this.testExpectedRequestParameters(aPath + "." + aKey, anActualRequest[aKey], anExpectedRequest[aKey]) 104 this.testExpectedRequestParameters(aPath + "." + aKey, anActualRequest[aKey], anExpectedRequest[aKey])
108 } else { 105 } else {
109 if (! anExpectedRequest[aKey](anActualRequest[aKey])) { 106 if (! anExpectedRequest[aKey](anActualRequest[aKey])) {
110 throw "wrong value for paramter [" + aKey + "]; got '" + anActualRequest[aKey] + "'"; 107 throw "wrong value for paramter [" + aKey + "]; got '" + anActualRequest[aKey] + "'";
111 } 108 }
112 } 109 }
113 } 110 }
114//console.log("<<< Proxy.testExpectedRequestParameters");
115 }, 111 },
116 112
117 //------------------------------------------------------------------------- 113 //-------------------------------------------------------------------------
118 114
119 'checkRequest': function(aFunctionName, someParameters) { 115 'checkRequest': function(aFunctionName, someParameters) {
120 if (this.shouldCheckExpectedRequests()) { 116 if (this.shouldCheckExpectedRequests()) {
121 var expectedRequest; 117 var expectedRequest;
122 118
123//console.log(">>> Proxy.Test.checkRequest - " + aFunctionName, someParameters);
124 expectedRequest = this.expectedRequests().pop(); 119 expectedRequest = this.expectedRequests().pop();
125//console.log("--- Proxy.Test.checkRequest - expectedRequest", expectedRequest);
126 if (expectedRequest == null) { 120 if (expectedRequest == null) {
127 throw "Proxy.Test.sentMessage: no expected result specified. Got request '" + aFunctionName + "': " + someParameters; 121 throw "Proxy.Test.sentMessage: no expected result specified. Got request '" + aFunctionName + "': " + someParameters;
128 } 122 }
129 123
130 try { 124 try {
131 if (aFunctionName != expectedRequest.functionName) { 125 if (aFunctionName != expectedRequest.functionName) {
132 throw "wrong function name. Got '" + aFunctionName + "', expected '" + expectedRequest.request.functionName + "'"; 126 throw "wrong function name. Got '" + aFunctionName + "', expected '" + expectedRequest.request.functionName + "'";
133 } 127 }
134 128
135 this.testExpectedRequestParameters("parameters", someParameters, expectedRequest.parameters); 129 this.testExpectedRequestParameters("parameters", someParameters, expectedRequest.parameters);
136 } catch(exception) { 130 } catch(exception) {
137//console.log("EXCEPTION: Proxy.Test.sentMessage[" + expectedRequest.name + "]", exception)
138 throw "Proxy.Test.sentMessage[" + expectedRequest.name + "]: " + exception; 131 throw "Proxy.Test.sentMessage[" + expectedRequest.name + "]: " + exception;
139 } 132 }
140 } 133 }
141//console.log("<<< Proxy.Test.checkRequest");
142 }, 134 },
143 135
144 //========================================================================= 136 //=========================================================================
145 137
146 'sendMessage': function(aFunctionName, someParameters) { 138 'sendMessage': function(aFunctionName, someParameters) {
147 var result; 139 var result;
148 140
149 if (this.isExpectingRequests() == false) { 141 if (this.isExpectingRequests() == false) {
150 // throw Clipperz.PM.Connection.exception.UnexpectedRequest; 142 // throw Clipperz.PM.Connection.exception.UnexpectedRequest;
151Clipperz.log("UNEXPECTED REQUEST " + aFunctionName /* + ": " + Clipperz.Base.serializeJSON(someParameters) */); 143Clipperz.log("UNEXPECTED REQUEST " + aFunctionName /* + ": " + Clipperz.Base.serializeJSON(someParameters) */);
152 this.unexpectedRequests().push({'functionName':aFunctionName, 'someParameters': someParameters}); 144 this.unexpectedRequests().push({'functionName':aFunctionName, 'someParameters': someParameters});
153 }; 145 };
154 this.checkRequest(aFunctionName, someParameters); 146 this.checkRequest(aFunctionName, someParameters);
155 result = Clipperz.PM.Proxy.Test.superclass.sendMessage.call(this, aFunctionName, someParameters); 147 result = Clipperz.PM.Proxy.Test.superclass.sendMessage.call(this, aFunctionName, someParameters);
156 148
157 return result; 149 return result;
158 }, 150 },
159 151
160 //========================================================================= 152 //=========================================================================
161 __syntaxFix__: "syntax fix" 153 __syntaxFix__: "syntax fix"
162 154
163}); 155});
164 156
diff --git a/frontend/gamma/js/Clipperz/PM/Strings.js b/frontend/gamma/js/Clipperz/PM/Strings.js
index a051365..7e855ff 100644
--- a/frontend/gamma/js/Clipperz/PM/Strings.js
+++ b/frontend/gamma/js/Clipperz/PM/Strings.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; } 26if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
29if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; } 27if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; }
30 28
31//----------------------------------------------------------------------------- 29//-----------------------------------------------------------------------------
32/* 30/*
33Clipperz.PM.Strings.standardStrings = { 31Clipperz.PM.Strings.standardStrings = {
34 'loginPanelSwitchLanguageSelectOptions':[ 32 'loginPanelSwitchLanguageSelectOptions':[
35/ * 33/ *
36 {tag:'option', html:"Arabic (Oman) (العربية)", value:'ar-OM', disabled:true}, 34 {tag:'option', html:"Arabic (Oman) (العربية)", value:'ar-OM', disabled:true},
37 {tag:'option', html:"Arabic (Syria) (العربية)", value:'ar-SY', disabled:true}, 35 {tag:'option', html:"Arabic (Syria) (العربية)", value:'ar-SY', disabled:true},
38 {tag:'option', html:"Bahasa Indonesia", value:'id-ID', disabled:true}, 36 {tag:'option', html:"Bahasa Indonesia", value:'id-ID', disabled:true},
39 {tag:'option', html:"Bulgarian (Български)", value:'bg-BG', disabled:true}, 37 {tag:'option', html:"Bulgarian (Български)", value:'bg-BG', disabled:true},
40 {tag:'option', html:"Català", value:'ca-ES', disabled:true}, 38 {tag:'option', html:"Català", value:'ca-ES', disabled:true},
41 {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN', disabled:true}, 39 {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN', disabled:true},
42 {tag:'option', html:"Chinese (Traditional) (正體中文)", value:'zh-TW', disabled:true}, 40 {tag:'option', html:"Chinese (Traditional) (正體中文)", value:'zh-TW', disabled:true},
43 {tag:'option', html:"Czech (Česky)", value:'cs-CZ', disabled:true}, 41 {tag:'option', html:"Czech (Česky)", value:'cs-CZ', disabled:true},
44 {tag:'option', html:"Dansk", value:'da-DK', disabled:true}, 42 {tag:'option', html:"Dansk", value:'da-DK', disabled:true},
45 {tag:'option', html:"Deutsch", value:'de-DE'/ *, disabled:true* /}, 43 {tag:'option', html:"Deutsch", value:'de-DE'/ *, disabled:true* /},
46 {tag:'option', html:"English (American)", value:'en-US'/ *, disabled:true* /}, 44 {tag:'option', html:"English (American)", value:'en-US'/ *, disabled:true* /},
47 {tag:'option', html:"English (British)", value:'en-GB'/ *, disabled:true* /}, 45 {tag:'option', html:"English (British)", value:'en-GB'/ *, disabled:true* /},
48 {tag:'option', html:"English (Canadian)", value:'en-CA'/ *, disabled:true* /}, 46 {tag:'option', html:"English (Canadian)", value:'en-CA'/ *, disabled:true* /},
49 {tag:'option', html:"Español", value:'es-ES', disabled:true}, 47 {tag:'option', html:"Español", value:'es-ES', disabled:true},
50 {tag:'option', html:"Eesti", value:'et-EE', disabled:true}, 48 {tag:'option', html:"Eesti", value:'et-EE', disabled:true},
51 {tag:'option', html:"Français", value:'fr-FR', disabled:true}, 49 {tag:'option', html:"Français", value:'fr-FR', disabled:true},
52 {tag:'option', html:"Galego", value:'gl-ES', disabled:true}, 50 {tag:'option', html:"Galego", value:'gl-ES', disabled:true},
53 {tag:'option', html:"Greek (Ελληνικά)", value:'el-GR', disabled:true}, 51 {tag:'option', html:"Greek (Ελληνικά)", value:'el-GR', disabled:true},
54 {tag:'option', html:"Íslenska", value:'is-IS', disabled:true}, 52 {tag:'option', html:"Íslenska", value:'is-IS', disabled:true},
55 {tag:'option', html:"Italiano", value:'it-IT'/ *, disabled:true* /}, 53 {tag:'option', html:"Italiano", value:'it-IT'/ *, disabled:true* /},
56 {tag:'option', html:"Japanese (日本語)", value:'ja-JP', disabled:true}, 54 {tag:'option', html:"Japanese (日本語)", value:'ja-JP', disabled:true},
57 {tag:'option', html:"Korean (한국어)", value:'ko-KR', disabled:true}, 55 {tag:'option', html:"Korean (한국어)", value:'ko-KR', disabled:true},
58 {tag:'option', html:"Latviešu", value:'lv-LV', disabled:true}, 56 {tag:'option', html:"Latviešu", value:'lv-LV', disabled:true},
59 {tag:'option', html:"Lietuvių", value:'lt-LT', disabled:true}, 57 {tag:'option', html:"Lietuvių", value:'lt-LT', disabled:true},
60 {tag:'option', html:"Macedonian (Македонски)", value:'mk-MK', disabled:true}, 58 {tag:'option', html:"Macedonian (Македонски)", value:'mk-MK', disabled:true},
61 {tag:'option', html:"Magyar", value:'hu-HU', disabled:true}, 59 {tag:'option', html:"Magyar", value:'hu-HU', disabled:true},
62 {tag:'option', html:"Nederlands", value:'nl-NL', disabled:true}, 60 {tag:'option', html:"Nederlands", value:'nl-NL', disabled:true},
63 {tag:'option', html:"Norsk bokmål", value:'nb-NO', disabled:true}, 61 {tag:'option', html:"Norsk bokmål", value:'nb-NO', disabled:true},
64 {tag:'option', html:"Norsk nynorsk", value:'nn-NO', disabled:true}, 62 {tag:'option', html:"Norsk nynorsk", value:'nn-NO', disabled:true},
65 {tag:'option', html:"Persian (Western) (فارسى)", value:'fa-IR', disabled:true}, 63 {tag:'option', html:"Persian (Western) (فارسى)", value:'fa-IR', disabled:true},
66 {tag:'option', html:"Polski", value:'pl-PL', disabled:true}, 64 {tag:'option', html:"Polski", value:'pl-PL', disabled:true},
67 {tag:'option', html:"Português", value:'pt-PT'/ *, disabled:true* /}, 65 {tag:'option', html:"Português", value:'pt-PT'/ *, disabled:true* /},
68 {tag:'option', html:"Português Brasileiro", value:'pt-BR'/ *, disabled:true* /}, 66 {tag:'option', html:"Português Brasileiro", value:'pt-BR'/ *, disabled:true* /},
69 {tag:'option', html:"Românä", value:'ro-RO', disabled:true}, 67 {tag:'option', html:"Românä", value:'ro-RO', disabled:true},
70 {tag:'option', html:"Russian (Русский)", value:'ru-RU', disabled:true}, 68 {tag:'option', html:"Russian (Русский)", value:'ru-RU', disabled:true},
71 {tag:'option', html:"Slovak (Slovenčina)", value:'sk-SK', disabled:true}, 69 {tag:'option', html:"Slovak (Slovenčina)", value:'sk-SK', disabled:true},
72 {tag:'option', html:"Slovenian (Slovenščina)", value:'sl-SI', disabled:true}, 70 {tag:'option', html:"Slovenian (Slovenščina)", value:'sl-SI', disabled:true},
73 {tag:'option', html:"Suomi", value:'fi-FI', disabled:true}, 71 {tag:'option', html:"Suomi", value:'fi-FI', disabled:true},
74 {tag:'option', html:"Svenska", value:'sv-SE', disabled:true}, 72 {tag:'option', html:"Svenska", value:'sv-SE', disabled:true},
75 {tag:'option', html:"Thai (ไทย)", value:'th-TH', disabled:true}, 73 {tag:'option', html:"Thai (ไทย)", value:'th-TH', disabled:true},
76 {tag:'option', html:"Türkçe", value:'tr-TR', disabled:true}, 74 {tag:'option', html:"Türkçe", value:'tr-TR', disabled:true},
77 {tag:'option', html:"Ukrainian (Українська)", value:'uk-UA', disabled:true} 75 {tag:'option', html:"Ukrainian (Українська)", value:'uk-UA', disabled:true}
78* / 76* /
79 {tag:'option', html:"Arabic (العربية)", value:"ar", disabled:true, cls:'disabledOption'}, 77 {tag:'option', html:"Arabic (العربية)", value:"ar", disabled:true, cls:'disabledOption'},
80 // {tag:'option', html:"Chinese (中文)", value:"zh", disabled:true}, 78 // {tag:'option', html:"Chinese (中文)", value:"zh", disabled:true},
81 {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN'}, 79 {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN'},
82 {tag:'option', html:"Dutch (Nederlands)", value:"nl-NL", disabled:true, cls:'disabledOption'}, 80 {tag:'option', html:"Dutch (Nederlands)", value:"nl-NL", disabled:true, cls:'disabledOption'},
83 {tag:'option', html:"English", value:"en-US"}, 81 {tag:'option', html:"English", value:"en-US"},
84 {tag:'option', html:"French (Français)", value:"fr-FR"}, 82 {tag:'option', html:"French (Français)", value:"fr-FR"},
85 {tag:'option', html:"German (Deutsch)", value:"de-DE", disabled:true, cls:'disabledOption'}, 83 {tag:'option', html:"German (Deutsch)", value:"de-DE", disabled:true, cls:'disabledOption'},
86 {tag:'option', html:"Greek (Ελληνικά)", value:"el-GR", disabled:true, cls:'disabledOption'}, 84 {tag:'option', html:"Greek (Ελληνικά)", value:"el-GR", disabled:true, cls:'disabledOption'},
87 {tag:'option', html:"Hebrew (עברית)", value:"he-IL", disabled:true, cls:'disabledOption'}, 85 {tag:'option', html:"Hebrew (עברית)", value:"he-IL", disabled:true, cls:'disabledOption'},
88 {tag:'option', html:"Italian (Italiano)", value:"it-IT"}, 86 {tag:'option', html:"Italian (Italiano)", value:"it-IT"},
89 {tag:'option', html:"Japanese (日本語)", value:"ja-JP"}, 87 {tag:'option', html:"Japanese (日本語)", value:"ja-JP"},
90 {tag:'option', html:"Korean (한국어)", value:"ko-KR", disabled:true, cls:'disabledOption'}, 88 {tag:'option', html:"Korean (한국어)", value:"ko-KR", disabled:true, cls:'disabledOption'},
91 {tag:'option', html:"Norwegian (Norsk)", value:"no", disabled:true, cls:'disabledOption'}, 89 {tag:'option', html:"Norwegian (Norsk)", value:"no", disabled:true, cls:'disabledOption'},
92 {tag:'option', html:"Persian (فارسی)", value:"fa-IR", disabled:true, cls:'disabledOption'}, 90 {tag:'option', html:"Persian (فارسی)", value:"fa-IR", disabled:true, cls:'disabledOption'},
93 {tag:'option', html:"Polish (Polski)", value:"pl-PL", disabled:true, cls:'disabledOption'}, 91 {tag:'option', html:"Polish (Polski)", value:"pl-PL", disabled:true, cls:'disabledOption'},
94 {tag:'option', html:"Portuguese (Português)", value:"pt-BR"}, 92 {tag:'option', html:"Portuguese (Português)", value:"pt-BR"},
95 {tag:'option', html:"Russian (Русский)", value:"ru-RU", disabled:true, cls:'disabledOption'}, 93 {tag:'option', html:"Russian (Русский)", value:"ru-RU", disabled:true, cls:'disabledOption'},
96 {tag:'option', html:"Spanish (Español)", value:"es-ES"}, 94 {tag:'option', html:"Spanish (Español)", value:"es-ES"},
97 {tag:'option', html:"Swedish (Svenska)", value:"sv-SE", disabled:true, cls:'disabledOption'}, 95 {tag:'option', html:"Swedish (Svenska)", value:"sv-SE", disabled:true, cls:'disabledOption'},
98 {tag:'option', html:"Turkish (Türkçe)", value:"tr-TR", disabled:true, cls:'disabledOption'}, 96 {tag:'option', html:"Turkish (Türkçe)", value:"tr-TR", disabled:true, cls:'disabledOption'},
99 {tag:'option', html:"Vietnamese (Tiếng Việt)", value:"vi-VN", disabled:true, cls:'disabledOption'} 97 {tag:'option', html:"Vietnamese (Tiếng Việt)", value:"vi-VN", disabled:true, cls:'disabledOption'}
100 ] 98 ]
101} 99}
102*/ 100*/
103 101
104Clipperz.PM.Strings.GeneralSettings = { 102Clipperz.PM.Strings.GeneralSettings = {
105 'defaults': { 103 'defaults': {
106 // 'loginFormAarghThatsBadUrl':"http://www.clipperz.com/support/faq/account_faq", 104 // 'loginFormAarghThatsBadUrl':"http://www.clipperz.com/support/faq/account_faq",
107 // 'loginFormVerifyTheCodeUrl':"http://www.clipperz.com/learn_more/reviewing_the_code", 105 // 'loginFormVerifyTheCodeUrl':"http://www.clipperz.com/learn_more/reviewing_the_code",
108 106
109 // 'donateHeaderLinkUrl': "http://www.clipperz.com/donations", 107 // 'donateHeaderLinkUrl': "http://www.clipperz.com/donations",
110 // 'creditsHeaderLinkUrl': "http://www.clipperz.com/credits", 108 // 'creditsHeaderLinkUrl': "http://www.clipperz.com/credits",
111 // 'feedbackHeaderLinkUrl': "http://www.clipperz.com/contact", 109 // 'feedbackHeaderLinkUrl': "http://www.clipperz.com/contact",
112 // 'helpHeaderLinkUrl': "http://www.clipperz.com/support/user_guide", 110 // 'helpHeaderLinkUrl': "http://www.clipperz.com/support/user_guide",
113 // 'forumHeaderLinkUrl': "http://www.clipperz.com/forum", 111 // 'forumHeaderLinkUrl': "http://www.clipperz.com/forum",
114 112
115 // 'httpAuthBookmarkletConfiguration':{tag:'textarea', id:'httpAuthDefaultConfiguration', html:"" + 113 // 'httpAuthBookmarkletConfiguration':{tag:'textarea', id:'httpAuthDefaultConfiguration', html:"" +
116 // "{ \"page\":{\"title\":\"HTTP authentication\"}," + "\n" + 114 // "{ \"page\":{\"title\":\"HTTP authentication\"}," + "\n" +
117 // " \"form\":{\"attributes\": {" + "\n" + 115 // " \"form\":{\"attributes\": {" + "\n" +
118 // " \"action\":\"\"," + "\n" + 116 // " \"action\":\"\"," + "\n" +
@@ -148,145 +146,140 @@ Clipperz.PM.Strings.GeneralSettings = {
148 146
149Clipperz.PM.Strings.defaultLanguages = { 147Clipperz.PM.Strings.defaultLanguages = {
150 'default':"en-us", 148 'default':"en-us",
151 149
152 // 'de':"de-de", 150 // 'de':"de-de",
153 // 'el':"el-gr", 151 // 'el':"el-gr",
154 // 'he':"he-il", 152 // 'he':"he-il",
155 // 'ru':"ru-ru", 153 // 'ru':"ru-ru",
156 154
157 'fr':"fr-fr", 155 'fr':"fr-fr",
158 'es':"es-es", 156 'es':"es-es",
159 'zh':"zh-cn", 157 'zh':"zh-cn",
160 'ja':"ja-jp", 158 'ja':"ja-jp",
161 'pt':"pt-br", 159 'pt':"pt-br",
162 'it':"it-it", 160 'it':"it-it",
163 'en': "en-us" 161 'en': "en-us"
164} 162}
165 163
166Clipperz.PM.Strings.inputTypeToRecordFieldType = { 164Clipperz.PM.Strings.inputTypeToRecordFieldType = {
167 'text': 'TXT', 165 'text': 'TXT',
168 'password': 'PWD', 166 'password': 'PWD',
169 'checkbox': 'CHECK', 167 'checkbox': 'CHECK',
170 'radio': 'RADIO', 168 'radio': 'RADIO',
171 'select': 'SELECT' 169 'select': 'SELECT'
172}; 170};
173 171
174//----------------------------------------------------------------------------- 172//-----------------------------------------------------------------------------
175 173
176Clipperz.PM.Strings.translateBookmarklet = function (aBookmarkletString) { 174Clipperz.PM.Strings.translateBookmarklet = function (aBookmarkletString) {
177 var result; 175 var result;
178 176
179 result = aBookmarkletString; 177 result = aBookmarkletString;
180 178
181 result = result.replace(/@BOOKMARKLET_NO_EXCEPTION_MESSAGE@/,Clipperz.PM.Strings.getValue('bookmarkletCopy.noExceptionMessage')); 179 result = result.replace(/@BOOKMARKLET_NO_EXCEPTION_MESSAGE@/,Clipperz.PM.Strings.getValue('bookmarkletCopy.noExceptionMessage'));
182 result = result.replace(/@BOOKMARKLET_EXCEPTION_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.exceptionMessage')); 180 result = result.replace(/@BOOKMARKLET_EXCEPTION_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.exceptionMessage'));
183 result = result.replace(/@BOOKMARKLET_COPY@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.copy')); 181 result = result.replace(/@BOOKMARKLET_COPY@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.copy'));
184 result = result.replace(/@BOOKMARKLET_SUCCESSFUL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.successfulMessage')); 182 result = result.replace(/@BOOKMARKLET_SUCCESSFUL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.successfulMessage'));
185 result = result.replace(/@BOOKMARKLET_FAIL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.failMessage')); 183 result = result.replace(/@BOOKMARKLET_FAIL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.failMessage'));
186 184
187 return result; 185 return result;
188} 186}
189 187
190//----------------------------------------------------------------------------- 188//-----------------------------------------------------------------------------
191 189
192Clipperz.PM.Strings.Languages.setSelectedLanguage = function(aLanguage) { 190Clipperz.PM.Strings.Languages.setSelectedLanguage = function(aLanguage) {
193 var language; 191 var language;
194 varselectedLanguage; 192 varselectedLanguage;
195 193
196 language = (aLanguage || Clipperz.PM.Strings.preferredLanguage || 'default').toLowerCase(); 194 language = (aLanguage || Clipperz.PM.Strings.preferredLanguage || 'default').toLowerCase();
197 if (typeof(Clipperz.PM.Strings.defaultLanguages[language]) != 'undefined') { 195 if (typeof(Clipperz.PM.Strings.defaultLanguages[language]) != 'undefined') {
198 language = Clipperz.PM.Strings.defaultLanguages[language]; 196 language = Clipperz.PM.Strings.defaultLanguages[language];
199 } 197 }
200 198
201 if (typeof(Clipperz.PM.Strings.Languages[language]) != 'undefined') { 199 if (typeof(Clipperz.PM.Strings.Languages[language]) != 'undefined') {
202 selectedLanguage = language; 200 selectedLanguage = language;
203 } else if (typeof(Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)]) != 'undefined') { 201 } else if (typeof(Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)]) != 'undefined') {
204 selectedLanguage = Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)]; 202 selectedLanguage = Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)];
205 } else { 203 } else {
206 selectedLanguage = Clipperz.PM.Strings.defaultLanguages['default']; 204 selectedLanguage = Clipperz.PM.Strings.defaultLanguages['default'];
207 } 205 }
208 206
209 if (selectedLanguage != Clipperz.PM.Strings.selectedLanguage) { 207 if (selectedLanguage != Clipperz.PM.Strings.selectedLanguage) {
210 vartranslations; 208 vartranslations;
211 209
212 Clipperz.PM.Strings.selectedLanguage = selectedLanguage; 210 Clipperz.PM.Strings.selectedLanguage = selectedLanguage;
213 211
214 translations = {}; 212 translations = {};
215 // MochiKit.Base.update(translations, Clipperz.PM.Strings.standardStrings) 213 // MochiKit.Base.update(translations, Clipperz.PM.Strings.standardStrings)
216 214
217 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages['defaults']); 215 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages['defaults']);
218 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings['defaults']); 216 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings['defaults']);
219 217
220 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[Clipperz.PM.Strings.defaultLanguages['default']]); 218 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[Clipperz.PM.Strings.defaultLanguages['default']]);
221 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[Clipperz.PM.Strings.defaultLanguages['default']]); 219 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[Clipperz.PM.Strings.defaultLanguages['default']]);
222 220
223 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[selectedLanguage]); 221 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[selectedLanguage]);
224 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[selectedLanguage]); 222 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[selectedLanguage]);
225 223
226 Clipperz.PM.Strings.stringsObjectStore = new Clipperz.KeyValueObjectStore(/*{'name':'String.stringsObjectStore [1]'}*/); 224 Clipperz.PM.Strings.stringsObjectStore = new Clipperz.KeyValueObjectStore(/*{'name':'String.stringsObjectStore [1]'}*/);
227 Clipperz.PM.Strings.stringsObjectStore.initWithValues(translations); 225 Clipperz.PM.Strings.stringsObjectStore.initWithValues(translations);
228 226
229 if (typeof(bookmarklet) != 'undefined') { 227 if (typeof(bookmarklet) != 'undefined') {
230 Clipperz.PM.Strings.stringsObjectStore.setValue('bookmarklet', Clipperz.PM.Strings.translateBookmarklet(bookmarklet)); 228 Clipperz.PM.Strings.stringsObjectStore.setValue('bookmarklet', Clipperz.PM.Strings.translateBookmarklet(bookmarklet));
231 } 229 }
232 230
233 MochiKit.Signal.signal(Clipperz.PM.Strings.Languages, 'switchLanguage', selectedLanguage); 231 MochiKit.Signal.signal(Clipperz.PM.Strings.Languages, 'switchLanguage', selectedLanguage);
234 } 232 }
235} 233}
236 234
237//----------------------------------------------------------------------------- 235//-----------------------------------------------------------------------------
238 236
239Clipperz.PM.Strings.getValue = function (aKeyPath, someKeyValues) { 237Clipperz.PM.Strings.getValue = function (aKeyPath, someKeyValues) {
240 varresult; 238 varresult;
241 239
242 result = Clipperz.PM.Strings.stringsObjectStore.getValue(aKeyPath); 240 result = Clipperz.PM.Strings.stringsObjectStore.getValue(aKeyPath);
243 241
244//try {
245 if (typeof(result) == 'string') { 242 if (typeof(result) == 'string') {
246 if (typeof (someKeyValues) != 'undefined') { 243 if (typeof (someKeyValues) != 'undefined') {
247 varkey; 244 varkey;
248 245
249 for (key in someKeyValues) { 246 for (key in someKeyValues) {
250 result = result.replace( new RegExp(key), someKeyValues[key]); 247 result = result.replace( new RegExp(key), someKeyValues[key]);
251 // result.replace(, '');
252 } 248 }
253 } 249 }
254 250
255 result = result.replace(new RegExp('\n'), '<br>'); 251 result = result.replace(new RegExp('\n'), '<br>');
256 } 252 }
257//} catch (exception) {
258 //console.log("####", result, aKeyPath, someKeyValues, exception);
259//}
260 253
261 return result; 254 return result;
262} 255}
263 256
264Clipperz.PM.Strings.errorDescriptionForException = function (anException) { 257Clipperz.PM.Strings.errorDescriptionForException = function (anException) {
265 var result; 258 var result;
266 259
267 result = Clipperz.PM.Strings.getValue('exceptionsMessages' + '.' + anException.name); 260 result = Clipperz.PM.Strings.getValue('exceptionsMessages' + '.' + anException.name);
268 261
269 if (result == null) { 262 if (result == null) {
270 result = anException.message; 263 result = anException.message;
271 } 264 }
272 265
273 return result; 266 return result;
274}, 267},
275 268
276//----------------------------------------------------------------------------- 269//-----------------------------------------------------------------------------
277 270
278Clipperz.PM.Strings.Languages.initSetup = function() { 271Clipperz.PM.Strings.Languages.initSetup = function() {
279 varlanguage; 272 varlanguage;
280 varlanguageParser; 273 varlanguageParser;
281 274
282 language = navigator.language || navigator.userLanguage; //en, en-US, .... "de", "nb-no" 275 language = navigator.language || navigator.userLanguage; //en, en-US, .... "de", "nb-no"
283 languageParser = new RegExp("language=([a-z]{2}(?:\-[a-z]{2})?)(\&|$)", "i"); 276 languageParser = new RegExp("language=([a-z]{2}(?:\-[a-z]{2})?)(\&|$)", "i");
284 if (languageParser.test(window.location.search)) { 277 if (languageParser.test(window.location.search)) {
285 language = RegExp.$1; 278 language = RegExp.$1;
286 } 279 }
287 280
288 Clipperz.PM.Strings.preferredLanguage = language.toLowerCase(); 281 Clipperz.PM.Strings.preferredLanguage = language.toLowerCase();
289 Clipperz.PM.Strings.Languages.setSelectedLanguage(Clipperz.PM.Strings.preferredLanguage); 282 Clipperz.PM.Strings.Languages.setSelectedLanguage(Clipperz.PM.Strings.preferredLanguage);
290} 283}
291 284
292//----------------------------------------------------------------------------- 285//-----------------------------------------------------------------------------
diff --git a/frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js b/frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js
index 7f6c52f..7565d2d 100644
--- a/frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js
+++ b/frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; } 26if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
29 27
30Clipperz.PM.Strings.messagePanelConfigurations = { 28Clipperz.PM.Strings.messagePanelConfigurations = {
31 29
32 30
33 //------------------------------------------------------------------------- 31 //-------------------------------------------------------------------------
34 // 32 //
35 // Registration - connection 33 // Registration - connection
36 // 34 //
37 'registration_verify': function() { 35 'registration_verify': function() {
38 return { 36 return {
39 'title': null, 37 'title': null,
40 'text': Clipperz.PM.Strings['connectionRegistrationSendingRequestMessageText'] 38 'text': Clipperz.PM.Strings['connectionRegistrationSendingRequestMessageText']
41 } 39 }
42 }, 40 },
43 41
44 'registration_sendingCredentials': function() { 42 'registration_sendingCredentials': function() {
45 return { 43 return {
46 'title': null, 44 'title': null,
47 'text': Clipperz.PM.Strings['connectionRegistrationSendingCredentialsMessageText'] 45 'text': Clipperz.PM.Strings['connectionRegistrationSendingCredentialsMessageText']
48 } 46 }
49 }, 47 },
50 48
51 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
52 // 50 //
53 // One Time Password login message panel 51 // One Time Password login message panel
54 // 52 //
55 53
56 'OTP_login_start': function() { 54 'OTP_login_start': function() {
57 return { 55 return {
58 'title': Clipperz.PM.Strings['OTPloginMessagePanelInitialTitle'], 56 'title': Clipperz.PM.Strings['OTPloginMessagePanelInitialTitle'],
59 'text': Clipperz.PM.Strings['OTPloginMessagePanelInitialText'], 57 'text': Clipperz.PM.Strings['OTPloginMessagePanelInitialText'],
60 'steps': '+3', 58 'steps': '+3',
61 'buttons': {} 59 'buttons': {}
62 } 60 }
63 }, 61 },
64 62
65 'OTP_login_loadingOTP': function() { 63 'OTP_login_loadingOTP': function() {
66 return { 64 return {
67 'title': Clipperz.PM.Strings['OTPloginMessagePanelLoadingTitle'], 65 'title': Clipperz.PM.Strings['OTPloginMessagePanelLoadingTitle'],
68 'text': Clipperz.PM.Strings['OTPloginMessagePanelLoadingText'] 66 'text': Clipperz.PM.Strings['OTPloginMessagePanelLoadingText']
69 } 67 }
70 }, 68 },
71 69
72 'OTP_login_extractingPassphrase': function() { 70 'OTP_login_extractingPassphrase': function() {
73 return { 71 return {
74 'title': Clipperz.PM.Strings['OTPloginMessagePanelProcessingTitle'], 72 'title': Clipperz.PM.Strings['OTPloginMessagePanelProcessingTitle'],
75 'text': Clipperz.PM.Strings['OTPloginMessagePanelProcessingText'] 73 'text': Clipperz.PM.Strings['OTPloginMessagePanelProcessingText']
76 } 74 }
77 }, 75 },
78 76
79 77
80 //------------------------------------------------------------------------- 78 //-------------------------------------------------------------------------
81 // 79 //
82 // Login message panel 80 // Login message panel
83 // 81 //
84 'login_start': function() { 82 'login_start': function() {
85 return { 83 return {
86 'title': Clipperz.PM.Strings['loginMessagePanelInitialTitle'], 84 'title': Clipperz.PM.Strings['loginMessagePanelInitialTitle'],
87 'text': Clipperz.PM.Strings['loginMessagePanelInitialText'], 85 'text': Clipperz.PM.Strings['loginMessagePanelInitialText'],
88 'steps': '+7', 86 'steps': '+7',
89 'buttons': { 87 'buttons': {
90 'ok': Clipperz.PM.Strings['loginMessagePanelInitialButtonLabel'] 88 'ok': Clipperz.PM.Strings['loginMessagePanelInitialButtonLabel']
91 } 89 }
92 } 90 }
93 }, 91 },
94 92
95 'login_connected': function() { 93 'login_connected': function() {
96 return { 94 return {
97 'title': Clipperz.PM.Strings['loginMessagePanelConnectedTitle'], 95 'title': Clipperz.PM.Strings['loginMessagePanelConnectedTitle'],
98 'text': Clipperz.PM.Strings['loginMessagePanelConnectedText'], 96 'text': Clipperz.PM.Strings['loginMessagePanelConnectedText'],
99 'buttons': {} 97 'buttons': {}
100 } 98 }
101 }, 99 },
102 100
103 'login_failed':function() { 101 'login_failed':function() {
104 return { 102 return {
105 'title': Clipperz.PM.Strings['loginMessagePanelFailureTitle'], 103 'title': Clipperz.PM.Strings['loginMessagePanelFailureTitle'],
106 'text': Clipperz.PM.Strings['loginMessagePanelFailureText'], 104 'text': Clipperz.PM.Strings['loginMessagePanelFailureText'],
107 'button': Clipperz.PM.Strings['loginMessagePanelFailureButtonLabel'] 105 'button': Clipperz.PM.Strings['loginMessagePanelFailureButtonLabel']
108 } 106 }
109 }, 107 },
110 108
111 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
112 // 110 //
113 // Login message panel - connection 111 // Login message panel - connection
114 // 112 //
115 'connection_sendingCredentials': function() { 113 'connection_sendingCredentials': function() {
116 return { 114 return {
117 'title': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageTitle'], 115 'title': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageTitle'],
118 'text': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageText'] 116 'text': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageText']
diff --git a/frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js b/frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js
index 101ed3f..aefd94a 100644
--- a/frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js
+++ b/frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; } 26if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
29if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; } 27if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; }
30 28
31//============================================================================= 29//=============================================================================
32// 30//
33 // D E F A U L T S ( defaults ) 31 // D E F A U L T S ( defaults )
34// 32//
35//============================================================================= 33//=============================================================================
36 34
37Clipperz.PM.Strings.Languages['defaults'] = { 35Clipperz.PM.Strings.Languages['defaults'] = {
38 36
39'elapsedTimeDescriptions': { 37'elapsedTimeDescriptions': {
40 'MORE_THAN_A_MONTH_AGO': "more than a month ago", 38 'MORE_THAN_A_MONTH_AGO': "more than a month ago",
41 'MORE_THAN_A_WEEK_AGO': "more than a week ago", 39 'MORE_THAN_A_WEEK_AGO': "more than a week ago",
42 'MORE_THAN_*_WEEKS_AGO': "more than __elapsed__ weeks ago", 40 'MORE_THAN_*_WEEKS_AGO': "more than __elapsed__ weeks ago",
43 'YESTERDAY': "yesterday", 41 'YESTERDAY': "yesterday",
44 '*_DAYS_AGO': "__elapsed__ days ago", 42 '*_DAYS_AGO': "__elapsed__ days ago",
45 'ABOUT_AN_HOUR_AGO': "about an hour ago", 43 'ABOUT_AN_HOUR_AGO': "about an hour ago",
46 '*_HOURS_AGO': "__elapsed__ hours ago", 44 '*_HOURS_AGO': "__elapsed__ hours ago",
47 'JUST_A_FEW_MINUTES_AGO': "just a few minutes ago", 45 'JUST_A_FEW_MINUTES_AGO': "just a few minutes ago",
48 'ABOUT_*_MINUTES_AGO': "about __elapsed__ minutes ago" 46 'ABOUT_*_MINUTES_AGO': "about __elapsed__ minutes ago"
49}, 47},
50/* 48/*
51 'unknown_ip': "unknown", 49 'unknown_ip': "unknown",
52 50
53'countries': { 51'countries': {
54 '--': "unknown", 52 '--': "unknown",
55 'AD': "Andorra", 53 'AD': "Andorra",
56 'AE': "United Arab Emirates", 54 'AE': "United Arab Emirates",
57 'AF': "Afghanistan", 55 'AF': "Afghanistan",
58 'AG': "Antigua and Barbuda", 56 'AG': "Antigua and Barbuda",
59 'AI': "Anguilla", 57 'AI': "Anguilla",
60 'AL': "Albania", 58 'AL': "Albania",
61 'AM': "Armenia", 59 'AM': "Armenia",
62 'AN': "Netherlands Antilles", 60 'AN': "Netherlands Antilles",
63 'AO': "Angola", 61 'AO': "Angola",
64 'AP': "Non-Spec Asia Pas Location", 62 'AP': "Non-Spec Asia Pas Location",
65 'AR': "Argentina", 63 'AR': "Argentina",
66 'AS': "American Samoa", 64 'AS': "American Samoa",
67 'AT': "Austria", 65 'AT': "Austria",
68 'AU': "Australia", 66 'AU': "Australia",
69 'AW': "Aruba", 67 'AW': "Aruba",
70 'AX': "Aland Islands", 68 'AX': "Aland Islands",
71 'AZ': "Azerbaijan", 69 'AZ': "Azerbaijan",
72 'BA': "Bosnia and Herzegowina", 70 'BA': "Bosnia and Herzegowina",
73 'BB': "Barbados", 71 'BB': "Barbados",
74 'BD': "Bangladesh", 72 'BD': "Bangladesh",
75 'BE': "Belgium", 73 'BE': "Belgium",
76 'BF': "Burkina Faso", 74 'BF': "Burkina Faso",
77 'BG': "Bulgaria", 75 'BG': "Bulgaria",
78 'BH': "Bahrain", 76 'BH': "Bahrain",
79 'BI': "Burundi", 77 'BI': "Burundi",
80 'BJ': "Benin", 78 'BJ': "Benin",
81 'BM': "Bermuda", 79 'BM': "Bermuda",
82 'BN': "Brunei Darussalam", 80 'BN': "Brunei Darussalam",
83 'BO': "Bolivia", 81 'BO': "Bolivia",
84 'BR': "Brazil", 82 'BR': "Brazil",
85 'BS': "Bahamas", 83 'BS': "Bahamas",
86 'BT': "Bhutan", 84 'BT': "Bhutan",
87 'BW': "Botswana", 85 'BW': "Botswana",
88 'BY': "Belarus", 86 'BY': "Belarus",
89 'BZ': "Belize", 87 'BZ': "Belize",
90 'CA': "Canada", 88 'CA': "Canada",
91 'CD': "Congo the Democratic Republic of the", 89 'CD': "Congo the Democratic Republic of the",
92 'CF': "Central African Republic", 90 'CF': "Central African Republic",
93 'CH': "Switzerland", 91 'CH': "Switzerland",
94 'CI': "Cote D'ivoire", 92 'CI': "Cote D'ivoire",
95 'CK': "Cook Islands", 93 'CK': "Cook Islands",
96 'CL': "Chile", 94 'CL': "Chile",
97 'CM': "Cameroon", 95 'CM': "Cameroon",
98 'CN': "China", 96 'CN': "China",
99 'CO': "Colombia", 97 'CO': "Colombia",
100 'CR': "Costa Rica", 98 'CR': "Costa Rica",
101 'CS': "Serbia and Montenegro", 99 'CS': "Serbia and Montenegro",
102 'CU': "Cuba", 100 'CU': "Cuba",
103 'CY': "Cyprus", 101 'CY': "Cyprus",
104 'CZ': "Czech Republic", 102 'CZ': "Czech Republic",
105 'DE': "Germany", 103 'DE': "Germany",
106 'DJ': "Djibouti", 104 'DJ': "Djibouti",
107 'DK': "Denmark", 105 'DK': "Denmark",
108 'DO': "Dominican Republic", 106 'DO': "Dominican Republic",
109 'DZ': "Algeria", 107 'DZ': "Algeria",
110 'EC': "Ecuador", 108 'EC': "Ecuador",
111 'EE': "Estonia", 109 'EE': "Estonia",
112 'EG': "Egypt", 110 'EG': "Egypt",
113 'ER': "Eritrea", 111 'ER': "Eritrea",
114 'ES': "Spain", 112 'ES': "Spain",
115 'ET': "Ethiopia", 113 'ET': "Ethiopia",
116 'EU': "European Union", 114 'EU': "European Union",
117 'FI': "Finland", 115 'FI': "Finland",
118 'FJ': "Fiji", 116 'FJ': "Fiji",
diff --git a/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js b/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js
index b540633..85d55c0 100644
--- a/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js
+++ b/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26//============================================================================= 24//=============================================================================
27// 25//
28 // E N G L I S H A M E R I C A N ( en_US ) 26 // E N G L I S H A M E R I C A N ( en_US )
29// 27//
30//============================================================================= 28//=============================================================================
31 29
32Clipperz.PM.Strings.Languages['en-us'] = { 30Clipperz.PM.Strings.Languages['en-us'] = {
33/* 31/*
34 //Login page - description 32 //Login page - description
35'clipperzServiceDescription': "\ 33'clipperzServiceDescription': "\
36 <!-- FIX CSS DONE -->\ 34 <!-- FIX CSS DONE -->\
37 <h2>Keep it to yourself!</h2>\ 35 <h2>Keep it to yourself!</h2>\
38 <ul>\ 36 <ul>\
39 <li>\ 37 <li>\
40 <h3>Clipperz is:</h3>\ 38 <h3>Clipperz is:</h3>\
41 <ul>\ 39 <ul>\
42 <li><p>a secure and simple password manager</p></li>\ 40 <li><p>a secure and simple password manager</p></li>\
43 <li><p>an effective single sign-on solution</p></li>\ 41 <li><p>an effective single sign-on solution</p></li>\
44 <li><p>a digital vault for your personal data</p></li>\ 42 <li><p>a digital vault for your personal data</p></li>\
45 </ul>\ 43 </ul>\
46 </li>\ 44 </li>\
47 <li>\ 45 <li>\
48 <h3>With Clipperz you can:</h3>\ 46 <h3>With Clipperz you can:</h3>\
49 <ul>\ 47 <ul>\
50 <li><p>store and manage your passwords and online credentials</p></li>\ 48 <li><p>store and manage your passwords and online credentials</p></li>\
51 <li><p>login to your web services without entering any username or password</p></li>\ 49 <li><p>login to your web services without entering any username or password</p></li>\
52 <li><p>protect all your sensitive data: codes for burglar alarms, PINs, credit card numbers, …</p></li>\ 50 <li><p>protect all your sensitive data: codes for burglar alarms, PINs, credit card numbers, …</p></li>\
53 <li><p>share secrets with family members and associates (coming soon)</p></li>\ 51 <li><p>share secrets with family members and associates (coming soon)</p></li>\
54 </ul>\ 52 </ul>\
55 </li>\ 53 </li>\
56 <li>\ 54 <li>\
57 <h3>Clipperz benefits:</h3>\ 55 <h3>Clipperz benefits:</h3>\
58 <ul>\ 56 <ul>\
59 <li><p>free and completely anonymous</p></li>\ 57 <li><p>free and completely anonymous</p></li>\
60 <li><p>access it any time from any computer</p></li>\ 58 <li><p>access it any time from any computer</p></li>\
61 <li><p>no software to download and nothing to install</p></li>\ 59 <li><p>no software to download and nothing to install</p></li>\
62 <li><p>avoid keeping secrets on your PC or on paper</p></li>\ 60 <li><p>avoid keeping secrets on your PC or on paper</p></li>\
63 </ul>\ 61 </ul>\
64 </li>\ 62 </li>\
65 <li>\ 63 <li>\
66 <h3>Clipperz security:</h3>\ 64 <h3>Clipperz security:</h3>\
67 <ul>\ 65 <ul>\
68 <li><p>your secrets are locally encrypted by your browser before being uploaded to Clipperz</p></li>\ 66 <li><p>your secrets are locally encrypted by your browser before being uploaded to Clipperz</p></li>\
69 <li><p>the encryption key is a passphrase known only to you</p></li>\ 67 <li><p>the encryption key is a passphrase known only to you</p></li>\
70 <li><p>Clipperz hosts your sensitive data in encrypted form and could never actually access the data in its plain form</p></li>\ 68 <li><p>Clipperz hosts your sensitive data in encrypted form and could never actually access the data in its plain form</p></li>\
71 <li><p>Clipperz is built upon standard encryption schemes, nothing fancies or homemade</p></li>\ 69 <li><p>Clipperz is built upon standard encryption schemes, nothing fancies or homemade</p></li>\
72 <li><p>you can review the source code anytime you like, but you need to know nothing about cryptography to be an happy user!</p></li>\ 70 <li><p>you can review the source code anytime you like, but you need to know nothing about cryptography to be an happy user!</p></li>\
73 </ul>\ 71 </ul>\
74 </li>\ 72 </li>\
75 <li>\ 73 <li>\
76 <a href=\"http://www.clipperz.com\" target=\"_blank\">Learn more</a>\ 74 <a href=\"http://www.clipperz.com\" target=\"_blank\">Learn more</a>\
77 </li>\ 75 </li>\
78 </ul>", 76 </ul>",
79 77
80 78
81 'loginFormTitle': "login with your Clipperz account", 79 'loginFormTitle': "login with your Clipperz account",
82 'loginFormUsernameLabel': "username", 80 'loginFormUsernameLabel': "username",
83 'loginFormPassphraseLabel': "passphrase", 81 'loginFormPassphraseLabel': "passphrase",
84 'loginFormDontHaveAnAccountLabel': "don\'t have an account?", 82 'loginFormDontHaveAnAccountLabel': "don\'t have an account?",
85 'loginFormCreateOneLabel': "create one", 83 'loginFormCreateOneLabel': "create one",
86 'loginFormForgotYourCredentialsLabel': "forgot your credentials?", 84 'loginFormForgotYourCredentialsLabel': "forgot your credentials?",
87 'loginFormAarghThatsBadLabel': "aargh! that\'s bad!", 85 'loginFormAarghThatsBadLabel': "aargh! that\'s bad!",
88 'loginFormAfraidOfMaliciousScriptsLabel': "afraid of malicious scripts?", 86 'loginFormAfraidOfMaliciousScriptsLabel': "afraid of malicious scripts?",
89 'loginFormVerifyTheCodeLabel': "verify the code", 87 'loginFormVerifyTheCodeLabel': "verify the code",
90 'loginFormButtonLabel': "Login", 88 'loginFormButtonLabel': "Login",
91 'loginFormOneTimePasswordCheckboxLabel': "use a one-time passphrase", 89 'loginFormOneTimePasswordCheckboxLabel': "use a one-time passphrase",
92'loginFormOneTimePasswordCheckboxDescription': "", 90'loginFormOneTimePasswordCheckboxDescription': "",
93 91
94// Login page - language selection 92// Login page - language selection
95 'loginPanelSwithLanguageDescription': "<h5>Switch to your preferred language</h5>", 93 'loginPanelSwithLanguageDescription': "<h5>Switch to your preferred language</h5>",
96 94
97// Login page - browser compatibility 95// Login page - browser compatibility
98 'browserCompatibilityDescription': "<p>Have a better and safer Clipperz experience with Firefox. However Clipperz works just fine also with Opera, Safari and MS Internet Explorer!</p>", 96 'browserCompatibilityDescription': "<p>Have a better and safer Clipperz experience with Firefox. However Clipperz works just fine also with Opera, Safari and MS Internet Explorer!</p>",
99 97
100// Login with OTP - message panel 98// Login with OTP - message panel
101 'OTPloginMessagePanelInitialTitle': "Logging in using a one-time passphrase", 99 'OTPloginMessagePanelInitialTitle': "Logging in using a one-time passphrase",
102 'OTPloginMessagePanelInitialText': "Sending OTP credentials …", 100 'OTPloginMessagePanelInitialText': "Sending OTP credentials …",
103 'OTPloginMessagePanelLoadingTitle': "Logging in using a one-time passphrase", 101 'OTPloginMessagePanelLoadingTitle': "Logging in using a one-time passphrase",
104 'OTPloginMessagePanelLoadingText': "Fetching encrypted authentication data from the server …", 102 'OTPloginMessagePanelLoadingText': "Fetching encrypted authentication data from the server …",
105 'OTPloginMessagePanelProcessingTitle': "Logging in using a one-time passphrase", 103 'OTPloginMessagePanelProcessingTitle': "Logging in using a one-time passphrase",
106 'OTPloginMessagePanelProcessingText': "Local decryption of authentication data", 104 'OTPloginMessagePanelProcessingText': "Local decryption of authentication data",
107 105
108// Regular login - message panel 106// Regular login - message panel
109 'loginMessagePanelInitialTitle': "Logging in …", 107 'loginMessagePanelInitialTitle': "Logging in …",
110 'loginMessagePanelInitialText': "---", 108 'loginMessagePanelInitialText': "---",
111 'loginMessagePanelInitialButtonLabel': "Cancel", 109 'loginMessagePanelInitialButtonLabel': "Cancel",
112 'loginMessagePanelConnectedTitle': "Connected", 110 'loginMessagePanelConnectedTitle': "Connected",
113 'loginMessagePanelConnectedText': "Done", 111 'loginMessagePanelConnectedText': "Done",
114 'loginMessagePanelFailureTitle': "Error", 112 'loginMessagePanelFailureTitle': "Error",
115 'loginMessagePanelFailureText': "Login failed", 113 'loginMessagePanelFailureText': "Login failed",
116 'loginMessagePanelFailureButtonLabel': "Close", 114 'loginMessagePanelFailureButtonLabel': "Close",
117 115
118// Regular login - message panel - connection 116// Regular login - message panel - connection
diff --git a/frontend/gamma/js/Clipperz/PM/Toll.js b/frontend/gamma/js/Clipperz/PM/Toll.js
index bb31c43..e9c3092 100644
--- a/frontend/gamma/js/Clipperz/PM/Toll.js
+++ b/frontend/gamma/js/Clipperz/PM/Toll.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } 25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
28 26
29//============================================================================= 27//=============================================================================
30 28
31Clipperz.PM.Toll = function(args) { 29Clipperz.PM.Toll = function(args) {
32 args = args || {}; 30 args = args || {};
33 31
34 this._requestType = args.requestType; 32 this._requestType = args.requestType;
35 this._targetValue = args.targetValue; 33 this._targetValue = args.targetValue;
36 this._cost = args.cost; 34 this._cost = args.cost;
37 this._toll = null; 35 this._toll = null;
38 36
39 return this; 37 return this;
40} 38}
41 39
42Clipperz.PM.Toll.prototype = MochiKit.Base.update(null, { 40Clipperz.PM.Toll.prototype = MochiKit.Base.update(null, {
43 41
44 'toString': function() { 42 'toString': function() {
45 return "Clipperz.PM.Toll (" + this.requestType() + ": " + this.cost() + " - " + ((this.toll() == null)? 'UNPAID' : 'PAID') + ")"; 43 return "Clipperz.PM.Toll (" + this.requestType() + ": " + this.cost() + " - " + ((this.toll() == null)? 'UNPAID' : 'PAID') + ")";
46 }, 44 },
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'requestType': function() { 48 'requestType': function() {
51 return this._requestType; 49 return this._requestType;
52 }, 50 },
53 51
54 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
55 53
56 'targetValue': function() { 54 'targetValue': function() {
57 return this._targetValue; 55 return this._targetValue;
58 }, 56 },
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'cost': function() { 60 'cost': function() {
63 return this._cost; 61 return this._cost;
64 }, 62 },
65 63
66 //------------------------------------------------------------------------- 64 //-------------------------------------------------------------------------
67 65
68 'toll': function() { 66 'toll': function() {
69 return this._toll; 67 return this._toll;
70 }, 68 },
71 69
72 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
73/* 71/*
74 '__pay': function() { 72 '__pay': function() {
75 varresult; 73 varresult;
76 vartargetData; 74 vartargetData;
77 vartargetMatchSize; 75 vartargetMatchSize;
78 var prefixMatchingBits; 76 var prefixMatchingBits;
79 varpayment; 77 varpayment;
80 var i; 78 var i;
81 79
82 if (this.toll() == null) { 80 if (this.toll() == null) {
83 i = 0; 81 i = 0;
84 targetData = new Clipperz.ByteArray("0x" + this.targetValue()); 82 targetData = new Clipperz.ByteArray("0x" + this.targetValue());
85 targetMatchSize = this.cost(); 83 targetMatchSize = this.cost();
86 84
87 payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 85 payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
88 86
89 do { 87 do {
90 varpaymentData; 88 varpaymentData;
91 89
92 //payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 90 //payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
93 payment.increment(); 91 payment.increment();
94 paymentData = Clipperz.Crypto.SHA.sha256(payment); 92 paymentData = Clipperz.Crypto.SHA.sha256(payment);
95 // prefixMatchingBits = this.prefixMatchingBits(targetData, paymentData); 93 // prefixMatchingBits = this.prefixMatchingBits(targetData, paymentData);
96 prefixMatchingBits = Clipperz.ByteArray.prefixMatchingBits(targetData, paymentData); 94 prefixMatchingBits = Clipperz.ByteArray.prefixMatchingBits(targetData, paymentData);
97 i++; 95 i++;
98 } while (prefixMatchingBits < targetMatchSize); 96 } while (prefixMatchingBits < targetMatchSize);
99 97
100 this._toll = payment.toHexString().substring(2) 98 this._toll = payment.toHexString().substring(2)
101 } 99 }
102 100
103 return this; 101 return this;
104 }, 102 },
105 */ 103 */
106 //------------------------------------------------------------------------- 104 //-------------------------------------------------------------------------
107 105
108 'innerDeferredPay': function (aTargetValue, aCost, aPayment) { 106 'innerDeferredPay': function (aTargetValue, aCost, aPayment) {
109 var deferredResult; 107 var deferredResult;
110 var result; 108 var result;
111 var payment; 109 var payment;
112 var i; 110 var i;
113 111
114 result = null; 112 result = null;
115 payment = aPayment; 113 payment = aPayment;
116 i = 0; 114 i = 0;
117 115
118 while ((result == null) && (i < Clipperz.PM.Toll.numberOfCloseLoopIterations)) { 116 while ((result == null) && (i < Clipperz.PM.Toll.numberOfCloseLoopIterations)) {
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js
index 25e82ca..f667526 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js
@@ -1,117 +1,115 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //download.js 25 //download.js
28 //Download 26 //Download
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/15/10 28 //Created by Giulio Cesare Solaroli on 3/15/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_CoverActions_downloadWidth = 46.0; 33var kClipperz_PM_UI_Canvas_CoverActions_downloadWidth = 46.0;
36var kClipperz_PM_UI_Canvas_CoverActions_downloadHeight = 46.0; 34var kClipperz_PM_UI_Canvas_CoverActions_downloadHeight = 46.0;
37 35
38function Clipperz_PM_UI_Canvas_CoverActions_download(canvas, aColor, aFillColor, aThickness) 36function Clipperz_PM_UI_Canvas_CoverActions_download(canvas, aColor, aFillColor, aThickness)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var stroke; 41 var stroke;
44 var path; 42 var path;
45 var pointX; 43 var pointX;
46 var pointY; 44 var pointY;
47 if (window.devicePixelRatio) 45 if (window.devicePixelRatio)
48 resolution = window.devicePixelRatio; 46 resolution = window.devicePixelRatio;
49 else 47 else
50 resolution = 1.0; 48 resolution = 1.0;
51 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_CoverActions_downloadWidth + canvas.height / kClipperz_PM_UI_Canvas_CoverActions_downloadHeight); 49 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_CoverActions_downloadWidth + canvas.height / kClipperz_PM_UI_Canvas_CoverActions_downloadHeight);
52 50
53 context.save(); 51 context.save();
54 context.scale(canvas.width / kClipperz_PM_UI_Canvas_CoverActions_downloadWidth, canvas.height / kClipperz_PM_UI_Canvas_CoverActions_downloadHeight); 52 context.scale(canvas.width / kClipperz_PM_UI_Canvas_CoverActions_downloadWidth, canvas.height / kClipperz_PM_UI_Canvas_CoverActions_downloadHeight);
55 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_CoverActions_downloadWidth, kClipperz_PM_UI_Canvas_CoverActions_downloadHeight); 53 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_CoverActions_downloadWidth, kClipperz_PM_UI_Canvas_CoverActions_downloadHeight);
56 54
57 // arrow 55 // arrow
58 56
59 stroke = aThickness; 57 stroke = aThickness;
60 stroke *= resolution; 58 stroke *= resolution;
61 if (stroke < 1.0) 59 if (stroke < 1.0)
62 stroke = Math.ceil(stroke); 60 stroke = Math.ceil(stroke);
63 else 61 else
64 stroke = Math.round(stroke); 62 stroke = Math.round(stroke);
65 stroke /= resolution; 63 stroke /= resolution;
66 alignStroke = (0.5 * stroke * resolution) % 1.0; 64 alignStroke = (0.5 * stroke * resolution) % 1.0;
67 context.beginPath(); 65 context.beginPath();
68 pointX = 16.5; 66 pointX = 16.5;
69 pointY = 22.5; 67 pointY = 22.5;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 68 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 69 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.moveTo(pointX, pointY); 70 context.moveTo(pointX, pointY);
73 pointX = 19.5; 71 pointX = 19.5;
74 pointY = 8.5; 72 pointY = 8.5;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 73 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 74 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 context.lineTo(pointX, pointY); 75 context.lineTo(pointX, pointY);
78 pointX = 30.038; 76 pointX = 30.038;
79 pointY = 10.605; 77 pointY = 10.605;
80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 78 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 79 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
82 context.lineTo(pointX, pointY); 80 context.lineTo(pointX, pointY);
83 pointX = 27.354; 81 pointX = 27.354;
84 pointY = 24.354; 82 pointY = 24.354;
85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 83 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 84 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
87 context.lineTo(pointX, pointY); 85 context.lineTo(pointX, pointY);
88 pointX = 33.28; 86 pointX = 33.28;
89 pointY = 25.293; 87 pointY = 25.293;
90 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 88 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
91 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 89 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
92 context.lineTo(pointX, pointY); 90 context.lineTo(pointX, pointY);
93 pointX = 19.81; 91 pointX = 19.81;
94 pointY = 36.828; 92 pointY = 36.828;
95 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 93 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
96 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 94 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
97 context.lineTo(pointX, pointY); 95 context.lineTo(pointX, pointY);
98 pointX = 10.07; 96 pointX = 10.07;
99 pointY = 21.617; 97 pointY = 21.617;
100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
102 context.lineTo(pointX, pointY); 100 context.lineTo(pointX, pointY);
103 pointX = 16.5; 101 pointX = 16.5;
104 pointY = 22.5; 102 pointY = 22.5;
105 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 103 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
106 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 104 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
107 context.lineTo(pointX, pointY); 105 context.lineTo(pointX, pointY);
108 context.closePath(); 106 context.closePath();
109 context.fillStyle = aFillColor; 107 context.fillStyle = aFillColor;
110 context.fill(); 108 context.fill();
111 context.strokeStyle = aColor; 109 context.strokeStyle = aColor;
112 context.lineWidth = stroke; 110 context.lineWidth = stroke;
113 context.lineCap = "square"; 111 context.lineCap = "square";
114 context.stroke(); 112 context.stroke();
115 113
116 context.restore(); 114 context.restore();
117} 115}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js
index ba425ec..dae5a2d 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //look.js 25 //look.js
28 //Look 26 //Look
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/15/10 28 //Created by Giulio Cesare Solaroli on 3/15/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_CoverActions_lookWidth = 46.0; 33var kClipperz_PM_UI_Canvas_CoverActions_lookWidth = 46.0;
36var kClipperz_PM_UI_Canvas_CoverActions_lookHeight = 46.0; 34var kClipperz_PM_UI_Canvas_CoverActions_lookHeight = 46.0;
37 35
38function Clipperz_PM_UI_Canvas_CoverActions_look(canvas, aColor, aFillColor, aThickness) 36function Clipperz_PM_UI_Canvas_CoverActions_look(canvas, aColor, aFillColor, aThickness)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var stroke; 41 var stroke;
44 var path; 42 var path;
45 var pointX; 43 var pointX;
46 var pointY; 44 var pointY;
47 if (window.devicePixelRatio) 45 if (window.devicePixelRatio)
48 resolution = window.devicePixelRatio; 46 resolution = window.devicePixelRatio;
49 else 47 else
50 resolution = 1.0; 48 resolution = 1.0;
51 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_CoverActions_lookWidth + canvas.height / kClipperz_PM_UI_Canvas_CoverActions_lookHeight); 49 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_CoverActions_lookWidth + canvas.height / kClipperz_PM_UI_Canvas_CoverActions_lookHeight);
52 50
53 context.save(); 51 context.save();
54 context.scale(canvas.width / kClipperz_PM_UI_Canvas_CoverActions_lookWidth, canvas.height / kClipperz_PM_UI_Canvas_CoverActions_lookHeight); 52 context.scale(canvas.width / kClipperz_PM_UI_Canvas_CoverActions_lookWidth, canvas.height / kClipperz_PM_UI_Canvas_CoverActions_lookHeight);
55 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_CoverActions_lookWidth, kClipperz_PM_UI_Canvas_CoverActions_lookHeight); 53 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_CoverActions_lookWidth, kClipperz_PM_UI_Canvas_CoverActions_lookHeight);
56 54
57 // Layer 6 55 // Layer 6
58 56
59 stroke = aThickness; 57 stroke = aThickness;
60 stroke *= resolution; 58 stroke *= resolution;
61 if (stroke < 1.0) 59 if (stroke < 1.0)
62 stroke = Math.ceil(stroke); 60 stroke = Math.ceil(stroke);
63 else 61 else
64 stroke = Math.round(stroke); 62 stroke = Math.round(stroke);
65 stroke /= resolution; 63 stroke /= resolution;
66 alignStroke = (0.5 * stroke * resolution) % 1.0; 64 alignStroke = (0.5 * stroke * resolution) % 1.0;
67 context.save(); 65 context.save();
68 context.translate(17.5, 23.0); 66 context.translate(17.5, 23.0);
69 context.rotate(-0.503); 67 context.rotate(-0.503);
70 context.translate(-17.5, -23.0); 68 context.translate(-17.5, -23.0);
71 context.beginPath(); 69 context.beginPath();
72 pointX = 28.5; 70 pointX = 28.5;
73 pointY = 31.5; 71 pointY = 31.5;
74 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
75 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
76 context.moveTo(pointX, pointY); 74 context.moveTo(pointX, pointY);
77 pointX = 28.5; 75 pointX = 28.5;
78 pointY = 14.5; 76 pointY = 14.5;
79 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 77 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
80 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 78 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
81 context.lineTo(pointX, pointY); 79 context.lineTo(pointX, pointY);
82 pointX = 6.5; 80 pointX = 6.5;
83 pointY = 14.5; 81 pointY = 14.5;
84 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 82 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
85 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 83 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
86 context.lineTo(pointX, pointY); 84 context.lineTo(pointX, pointY);
87 pointX = 6.5; 85 pointX = 6.5;
88 pointY = 31.5; 86 pointY = 31.5;
89 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 87 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
90 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 88 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
91 context.lineTo(pointX, pointY); 89 context.lineTo(pointX, pointY);
92 pointX = 28.5; 90 pointX = 28.5;
93 pointY = 31.5; 91 pointY = 31.5;
94 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 92 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
95 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 93 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
96 context.lineTo(pointX, pointY); 94 context.lineTo(pointX, pointY);
97 context.closePath(); 95 context.closePath();
98 context.fillStyle = aFillColor; 96 context.fillStyle = aFillColor;
99 context.fill(); 97 context.fill();
100 context.strokeStyle = aColor; 98 context.strokeStyle = aColor;
101 context.lineWidth = stroke; 99 context.lineWidth = stroke;
102 context.lineCap = "square"; 100 context.lineCap = "square";
103 context.stroke(); 101 context.stroke();
104 context.restore(); 102 context.restore();
105 103
106 // Layer 3 104 // Layer 3
107 105
108 stroke = aThickness; 106 stroke = aThickness;
109 stroke *= resolution; 107 stroke *= resolution;
110 if (stroke < 1.0) 108 if (stroke < 1.0)
111 stroke = Math.ceil(stroke); 109 stroke = Math.ceil(stroke);
112 else 110 else
113 stroke = Math.round(stroke); 111 stroke = Math.round(stroke);
114 stroke /= resolution; 112 stroke /= resolution;
115 alignStroke = (0.5 * stroke * resolution) % 1.0; 113 alignStroke = (0.5 * stroke * resolution) % 1.0;
116 context.save(); 114 context.save();
117 context.translate(22.5, 20.0); 115 context.translate(22.5, 20.0);
118 context.rotate(-0.071); 116 context.rotate(-0.071);
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js
index 5c1f860..497fd05 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //directLogin.js 25 //directLogin.js
28 //directLogin 26 //directLogin
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/7/10 28 //Created by Giulio Cesare Solaroli on 3/7/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_Features_directLoginWidth = 76.0; 33var kClipperz_PM_UI_Canvas_Features_directLoginWidth = 76.0;
36var kClipperz_PM_UI_Canvas_Features_directLoginHeight = 76.0; 34var kClipperz_PM_UI_Canvas_Features_directLoginHeight = 76.0;
37 35
38function Clipperz_PM_UI_Canvas_Features_directLogin(canvas, aColor, aBannerColor, aBannerBackgroundColor) 36function Clipperz_PM_UI_Canvas_Features_directLogin(canvas, aColor, aBannerColor, aBannerBackgroundColor)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var stroke; 41 var stroke;
44 var path; 42 var path;
45 var pointX; 43 var pointX;
46 var pointY; 44 var pointY;
47 if (window.devicePixelRatio) 45 if (window.devicePixelRatio)
48 resolution = window.devicePixelRatio; 46 resolution = window.devicePixelRatio;
49 else 47 else
50 resolution = 1.0; 48 resolution = 1.0;
51 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_directLoginWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_directLoginHeight); 49 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_directLoginWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_directLoginHeight);
52 50
53 context.save(); 51 context.save();
54 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_directLoginWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_directLoginHeight); 52 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_directLoginWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_directLoginHeight);
55 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_directLoginWidth, kClipperz_PM_UI_Canvas_Features_directLoginHeight); 53 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_directLoginWidth, kClipperz_PM_UI_Canvas_Features_directLoginHeight);
56 54
57 // Layer 2 55 // Layer 2
58 56
59 stroke = 6.0; 57 stroke = 6.0;
60 stroke *= resolution; 58 stroke *= resolution;
61 if (stroke < 1.0) 59 if (stroke < 1.0)
62 stroke = Math.ceil(stroke); 60 stroke = Math.ceil(stroke);
63 else 61 else
64 stroke = Math.round(stroke); 62 stroke = Math.round(stroke);
65 stroke /= resolution; 63 stroke /= resolution;
66 alignStroke = (0.5 * stroke * resolution) % 1.0; 64 alignStroke = (0.5 * stroke * resolution) % 1.0;
67 context.beginPath(); 65 context.beginPath();
68 pointX = 30.0; 66 pointX = 30.0;
69 pointY = 41.0; 67 pointY = 41.0;
70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 68 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 69 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
72 context.moveTo(pointX, pointY); 70 context.moveTo(pointX, pointY);
73 pointX = 45.579; 71 pointX = 45.579;
74 pointY = 25.451; 72 pointY = 25.451;
75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 73 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 74 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
77 context.lineTo(pointX, pointY); 75 context.lineTo(pointX, pointY);
78 context.strokeStyle = aColor; 76 context.strokeStyle = aColor;
79 context.lineWidth = stroke; 77 context.lineWidth = stroke;
80 context.lineCap = "square"; 78 context.lineCap = "square";
81 context.stroke(); 79 context.stroke();
82 80
83 alignStroke = 0.0; 81 alignStroke = 0.0;
84 context.beginPath(); 82 context.beginPath();
85 pointX = 34.207; 83 pointX = 34.207;
86 pointY = 45.697; 84 pointY = 45.697;
87 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
88 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
89 context.moveTo(pointX, pointY); 87 context.moveTo(pointX, pointY);
90 pointX = 24.101; 88 pointX = 24.101;
91 pointY = 37.52; 89 pointY = 37.52;
92 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 90 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
93 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 91 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
94 context.lineTo(pointX, pointY); 92 context.lineTo(pointX, pointY);
95 pointX = 24.122; 93 pointX = 24.122;
96 pointY = 47.828; 94 pointY = 47.828;
97 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 95 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
98 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 96 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
99 context.lineTo(pointX, pointY); 97 context.lineTo(pointX, pointY);
100 pointX = 34.207; 98 pointX = 34.207;
101 pointY = 45.697; 99 pointY = 45.697;
102 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
103 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
104 context.lineTo(pointX, pointY); 102 context.lineTo(pointX, pointY);
105 context.closePath(); 103 context.closePath();
106 context.fillStyle = aColor; 104 context.fillStyle = aColor;
107 context.fill(); 105 context.fill();
108 106
109 stroke = 6.0; 107 stroke = 6.0;
110 stroke *= resolution; 108 stroke *= resolution;
111 if (stroke < 1.0) 109 if (stroke < 1.0)
112 stroke = Math.ceil(stroke); 110 stroke = Math.ceil(stroke);
113 else 111 else
114 stroke = Math.round(stroke); 112 stroke = Math.round(stroke);
115 stroke /= resolution; 113 stroke /= resolution;
116 alignStroke = (0.5 * stroke * resolution) % 1.0; 114 alignStroke = (0.5 * stroke * resolution) % 1.0;
117 context.beginPath(); 115 context.beginPath();
118 pointX = 24.631; 116 pointX = 24.631;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js
index b829ed6..f015535 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //protect.js 25 //protect.js
28 //protect 26 //protect
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/7/10 28 //Created by Giulio Cesare Solaroli on 3/7/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_Features_protectWidth = 76.0; 33var kClipperz_PM_UI_Canvas_Features_protectWidth = 76.0;
36var kClipperz_PM_UI_Canvas_Features_protectHeight = 76.0; 34var kClipperz_PM_UI_Canvas_Features_protectHeight = 76.0;
37 35
38function Clipperz_PM_UI_Canvas_Features_protect(canvas, aColor, aBannerColor, aBannerBackgroundColor) 36function Clipperz_PM_UI_Canvas_Features_protect(canvas, aColor, aBannerColor, aBannerBackgroundColor)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var path; 41 var path;
44 var pointX; 42 var pointX;
45 var pointY; 43 var pointY;
46 var controlPoint1X; 44 var controlPoint1X;
47 var controlPoint1Y; 45 var controlPoint1Y;
48 var controlPoint2X; 46 var controlPoint2X;
49 var controlPoint2Y; 47 var controlPoint2Y;
50 var stroke; 48 var stroke;
51 if (window.devicePixelRatio) 49 if (window.devicePixelRatio)
52 resolution = window.devicePixelRatio; 50 resolution = window.devicePixelRatio;
53 else 51 else
54 resolution = 1.0; 52 resolution = 1.0;
55 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_protectWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_protectHeight); 53 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_protectWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_protectHeight);
56 54
57 context.save(); 55 context.save();
58 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_protectWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_protectHeight); 56 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_protectWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_protectHeight);
59 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_protectWidth, kClipperz_PM_UI_Canvas_Features_protectHeight); 57 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_protectWidth, kClipperz_PM_UI_Canvas_Features_protectHeight);
60 58
61 // Layer 1 59 // Layer 1
62 60
63 alignStroke = 0.0; 61 alignStroke = 0.0;
64 context.beginPath(); 62 context.beginPath();
65 pointX = 38.5; 63 pointX = 38.5;
66 pointY = 36.0; 64 pointY = 36.0;
67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
69 context.moveTo(pointX, pointY); 67 context.moveTo(pointX, pointY);
70 pointX = 37.068; 68 pointX = 37.068;
71 pointY = 38.816; 69 pointY = 38.816;
72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
74 controlPoint1X = 37.41; 72 controlPoint1X = 37.41;
75 controlPoint1Y = 36.234; 73 controlPoint1Y = 36.234;
76 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 74 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
77 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 75 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
78 controlPoint2X = 37.175; 76 controlPoint2X = 37.175;
79 controlPoint2Y = 37.907; 77 controlPoint2Y = 37.907;
80 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 78 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
81 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 79 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
82 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 80 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
83 pointX = 37.031; 81 pointX = 37.031;
84 pointY = 40.802; 82 pointY = 40.802;
85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 83 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 84 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
87 controlPoint1X = 36.991; 85 controlPoint1X = 36.991;
88 controlPoint1Y = 39.474; 86 controlPoint1Y = 39.474;
89 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 87 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
90 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 88 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
91 controlPoint2X = 36.98; 89 controlPoint2X = 36.98;
92 controlPoint2Y = 40.141; 90 controlPoint2Y = 40.141;
93 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 91 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
94 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 92 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
95 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 93 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
96 pointX = 37.258; 94 pointX = 37.258;
97 pointY = 42.23; 95 pointY = 42.23;
98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 96 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 97 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
100 controlPoint1X = 37.068; 98 controlPoint1X = 37.068;
101 controlPoint1Y = 41.283; 99 controlPoint1Y = 41.283;
102 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 100 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
103 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 101 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
104 controlPoint2X = 37.139; 102 controlPoint2X = 37.139;
105 controlPoint2Y = 41.762; 103 controlPoint2Y = 41.762;
106 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 104 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
107 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 105 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
108 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 106 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
109 pointX = 38.348; 107 pointX = 38.348;
110 pointY = 43.979; 108 pointY = 43.979;
111 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 109 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
112 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 110 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
113 controlPoint1X = 37.402; 111 controlPoint1X = 37.402;
114 controlPoint1Y = 42.799; 112 controlPoint1Y = 42.799;
115 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 113 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
116 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 114 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
117 controlPoint2X = 37.682; 115 controlPoint2X = 37.682;
118 controlPoint2Y = 43.798; 116 controlPoint2Y = 43.798;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js
index 8d73cc7..47972fc 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //share.js 25 //share.js
28 //share 26 //share
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/7/10 28 //Created by Giulio Cesare Solaroli on 3/7/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_Features_shareWidth = 76.0; 33var kClipperz_PM_UI_Canvas_Features_shareWidth = 76.0;
36var kClipperz_PM_UI_Canvas_Features_shareHeight = 76.0; 34var kClipperz_PM_UI_Canvas_Features_shareHeight = 76.0;
37 35
38function Clipperz_PM_UI_Canvas_Features_share(canvas, aColor, aBannerColor, aBannerBackgroundColor) 36function Clipperz_PM_UI_Canvas_Features_share(canvas, aColor, aBannerColor, aBannerBackgroundColor)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var path; 41 var path;
44 var pointX; 42 var pointX;
45 var pointY; 43 var pointY;
46 var controlPoint1X; 44 var controlPoint1X;
47 var controlPoint1Y; 45 var controlPoint1Y;
48 var controlPoint2X; 46 var controlPoint2X;
49 var controlPoint2Y; 47 var controlPoint2Y;
50 var stroke; 48 var stroke;
51 if (window.devicePixelRatio) 49 if (window.devicePixelRatio)
52 resolution = window.devicePixelRatio; 50 resolution = window.devicePixelRatio;
53 else 51 else
54 resolution = 1.0; 52 resolution = 1.0;
55 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_shareWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_shareHeight); 53 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_shareWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_shareHeight);
56 54
57 context.save(); 55 context.save();
58 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_shareWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_shareHeight); 56 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_shareWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_shareHeight);
59 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_shareWidth, kClipperz_PM_UI_Canvas_Features_shareHeight); 57 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_shareWidth, kClipperz_PM_UI_Canvas_Features_shareHeight);
60 58
61 // Layer 1 59 // Layer 1
62 60
63 alignStroke = 0.0; 61 alignStroke = 0.0;
64 context.beginPath(); 62 context.beginPath();
65 pointX = 43.179; 63 pointX = 43.179;
66 pointY = 18.621; 64 pointY = 18.621;
67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
69 context.moveTo(pointX, pointY); 67 context.moveTo(pointX, pointY);
70 pointX = 37.163; 68 pointX = 37.163;
71 pointY = 12.605; 69 pointY = 12.605;
72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
74 controlPoint1X = 43.179; 72 controlPoint1X = 43.179;
75 controlPoint1Y = 15.32; 73 controlPoint1Y = 15.32;
76 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 74 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
77 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 75 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
78 controlPoint2X = 40.463; 76 controlPoint2X = 40.463;
79 controlPoint2Y = 12.605; 77 controlPoint2Y = 12.605;
80 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 78 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
81 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 79 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
82 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 80 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
83 pointX = 31.147; 81 pointX = 31.147;
84 pointY = 18.621; 82 pointY = 18.621;
85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 83 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 84 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
87 controlPoint1X = 33.863; 85 controlPoint1X = 33.863;
88 controlPoint1Y = 12.605; 86 controlPoint1Y = 12.605;
89 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 87 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
90 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 88 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
91 controlPoint2X = 31.147; 89 controlPoint2X = 31.147;
92 controlPoint2Y = 15.32; 90 controlPoint2Y = 15.32;
93 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 91 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
94 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 92 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
95 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 93 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
96 pointX = 37.163; 94 pointX = 37.163;
97 pointY = 24.637; 95 pointY = 24.637;
98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 96 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 97 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
100 controlPoint1X = 31.147; 98 controlPoint1X = 31.147;
101 controlPoint1Y = 21.921; 99 controlPoint1Y = 21.921;
102 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 100 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
103 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 101 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
104 controlPoint2X = 33.863; 102 controlPoint2X = 33.863;
105 controlPoint2Y = 24.637; 103 controlPoint2Y = 24.637;
106 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 104 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
107 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 105 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
108 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 106 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
109 pointX = 43.179; 107 pointX = 43.179;
110 pointY = 18.621; 108 pointY = 18.621;
111 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 109 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
112 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 110 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
113 controlPoint1X = 40.463; 111 controlPoint1X = 40.463;
114 controlPoint1Y = 24.637; 112 controlPoint1Y = 24.637;
115 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 113 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
116 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 114 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
117 controlPoint2X = 43.179; 115 controlPoint2X = 43.179;
118 controlPoint2Y = 21.921; 116 controlPoint2Y = 21.921;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js
index 572d9be..a4f30b2 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //store.js 25 //store.js
28 //store 26 //store
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/7/10 28 //Created by Giulio Cesare Solaroli on 3/7/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_Features_storeWidth = 76.0; 33var kClipperz_PM_UI_Canvas_Features_storeWidth = 76.0;
36var kClipperz_PM_UI_Canvas_Features_storeHeight = 76.0; 34var kClipperz_PM_UI_Canvas_Features_storeHeight = 76.0;
37 35
38function Clipperz_PM_UI_Canvas_Features_store(canvas, aColor, aBannerColor, aBannerBackgroundColor) 36function Clipperz_PM_UI_Canvas_Features_store(canvas, aColor, aBannerColor, aBannerBackgroundColor)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var path; 41 var path;
44 var pointX; 42 var pointX;
45 var pointY; 43 var pointY;
46 if (window.devicePixelRatio) 44 if (window.devicePixelRatio)
47 resolution = window.devicePixelRatio; 45 resolution = window.devicePixelRatio;
48 else 46 else
49 resolution = 1.0; 47 resolution = 1.0;
50 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_storeWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_storeHeight); 48 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Features_storeWidth + canvas.height / kClipperz_PM_UI_Canvas_Features_storeHeight);
51 49
52 context.save(); 50 context.save();
53 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_storeWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_storeHeight); 51 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Features_storeWidth, canvas.height / kClipperz_PM_UI_Canvas_Features_storeHeight);
54 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_storeWidth, kClipperz_PM_UI_Canvas_Features_storeHeight); 52 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Features_storeWidth, kClipperz_PM_UI_Canvas_Features_storeHeight);
55 53
56 // Layer 1 54 // Layer 1
57 55
58 alignStroke = 0.0; 56 alignStroke = 0.0;
59 context.beginPath(); 57 context.beginPath();
60 pointX = 27.0; 58 pointX = 27.0;
61 pointY = 29.5; 59 pointY = 29.5;
62 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 60 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
63 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 61 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
64 context.moveTo(pointX, pointY); 62 context.moveTo(pointX, pointY);
65 pointX = 27.0; 63 pointX = 27.0;
66 pointY = 24.5; 64 pointY = 24.5;
67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
69 context.lineTo(pointX, pointY); 67 context.lineTo(pointX, pointY);
70 pointX = 22.0; 68 pointX = 22.0;
71 pointY = 24.5; 69 pointY = 24.5;
72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
74 context.lineTo(pointX, pointY); 72 context.lineTo(pointX, pointY);
75 pointX = 22.0; 73 pointX = 22.0;
76 pointY = 29.5; 74 pointY = 29.5;
77 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
78 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
79 context.lineTo(pointX, pointY); 77 context.lineTo(pointX, pointY);
80 pointX = 27.0; 78 pointX = 27.0;
81 pointY = 29.5; 79 pointY = 29.5;
82 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
83 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
84 context.lineTo(pointX, pointY); 82 context.lineTo(pointX, pointY);
85 context.closePath(); 83 context.closePath();
86 context.fillStyle = aColor; 84 context.fillStyle = aColor;
87 context.fill(); 85 context.fill();
88 86
89 alignStroke = 0.0; 87 alignStroke = 0.0;
90 context.beginPath(); 88 context.beginPath();
91 pointX = 54.0; 89 pointX = 54.0;
92 pointY = 29.5; 90 pointY = 29.5;
93 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 91 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
94 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 92 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
95 context.moveTo(pointX, pointY); 93 context.moveTo(pointX, pointY);
96 pointX = 54.0; 94 pointX = 54.0;
97 pointY = 24.5; 95 pointY = 24.5;
98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 96 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 97 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
100 context.lineTo(pointX, pointY); 98 context.lineTo(pointX, pointY);
101 pointX = 29.0; 99 pointX = 29.0;
102 pointY = 24.5; 100 pointY = 24.5;
103 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
104 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
105 context.lineTo(pointX, pointY); 103 context.lineTo(pointX, pointY);
106 pointX = 29.0; 104 pointX = 29.0;
107 pointY = 29.5; 105 pointY = 29.5;
108 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 106 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
109 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 107 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
110 context.lineTo(pointX, pointY); 108 context.lineTo(pointX, pointY);
111 pointX = 54.0; 109 pointX = 54.0;
112 pointY = 29.5; 110 pointY = 29.5;
113 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 111 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
114 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 112 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
115 context.lineTo(pointX, pointY); 113 context.lineTo(pointX, pointY);
116 context.closePath(); 114 context.closePath();
117 context.fillStyle = aColor; 115 context.fillStyle = aColor;
118 context.fill(); 116 context.fill();
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js
index b9443bd..dccefab 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js
@@ -1,65 +1,63 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Canvas'); 24Clipperz.Base.module('Clipperz.PM.UI.Canvas');
27 25
28MochiKit.Base.update(Clipperz.PM.UI.Canvas , { 26MochiKit.Base.update(Clipperz.PM.UI.Canvas , {
29 'marks': { 27 'marks': {
30 '!':Clipperz_PM_UI_Canvas_Marks_exclamationMark, 28 '!':Clipperz_PM_UI_Canvas_Marks_exclamationMark,
31 '?':Clipperz_PM_UI_Canvas_Marks_questionMark, 29 '?':Clipperz_PM_UI_Canvas_Marks_questionMark,
32 'i':Clipperz_PM_UI_Canvas_Marks_info 30 'i':Clipperz_PM_UI_Canvas_Marks_info
33 }, 31 },
34 32
35 'features': { 33 'features': {
36 'store': Clipperz_PM_UI_Canvas_Features_store, 34 'store': Clipperz_PM_UI_Canvas_Features_store,
37 'protect': Clipperz_PM_UI_Canvas_Features_protect, 35 'protect': Clipperz_PM_UI_Canvas_Features_protect,
38 'directLogin':Clipperz_PM_UI_Canvas_Features_directLogin, 36 'directLogin':Clipperz_PM_UI_Canvas_Features_directLogin,
39 'share': Clipperz_PM_UI_Canvas_Features_share 37 'share': Clipperz_PM_UI_Canvas_Features_share
40 }, 38 },
41 39
42 'tips': { 40 'tips': {
43 'open': Clipperz_PM_UI_Canvas_Tips_open, 41 'open': Clipperz_PM_UI_Canvas_Tips_open,
44 'close': Clipperz_PM_UI_Canvas_Tips_close 42 'close': Clipperz_PM_UI_Canvas_Tips_close
45 }, 43 },
46 44
47 'star': { 45 'star': {
48 'normal': Clipperz_PM_UI_Canvas_Star_normal 46 'normal': Clipperz_PM_UI_Canvas_Star_normal
49 }, 47 },
50 48
51 'coverActions': { 49 'coverActions': {
52 'look': Clipperz_PM_UI_Canvas_CoverActions_look, 50 'look': Clipperz_PM_UI_Canvas_CoverActions_look,
53 'download': Clipperz_PM_UI_Canvas_CoverActions_download 51 'download': Clipperz_PM_UI_Canvas_CoverActions_download
54 }, 52 },
55 53
56 'registerButton': { 54 'registerButton': {
57 'normal': Clipperz_PM_UI_Canvas_RegisterButton_normal 55 'normal': Clipperz_PM_UI_Canvas_RegisterButton_normal
58 }, 56 },
59 57
60 'logo': { 58 'logo': {
61 'normal': Clipperz_PM_UI_Canvas_Logo_normal 59 'normal': Clipperz_PM_UI_Canvas_Logo_normal
62 }, 60 },
63 61
64 __syntaxFix__: "syntax fix" 62 __syntaxFix__: "syntax fix"
65}); 63});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js
index cc60bba..24c0bc3 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js
@@ -1,54 +1,52 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //normal.js 25 //normal.js
28 //New Image 26 //New Image
29// 27//
30 //Created by Giulio Cesare Solaroli on 2/13/12 28 //Created by Giulio Cesare Solaroli on 2/13/12
31 //Copyright 2012 Clipperz 29 //Copyright 2012 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_Logo_normalWidth = 150.0; 33var kClipperz_PM_UI_Canvas_Logo_normalWidth = 150.0;
36var kClipperz_PM_UI_Canvas_Logo_normalHeight = 39.0; 34var kClipperz_PM_UI_Canvas_Logo_normalHeight = 39.0;
37 35
38function Clipperz_PM_UI_Canvas_Logo_normal(canvas, logo, fontSize, text_color) 36function Clipperz_PM_UI_Canvas_Logo_normal(canvas, logo, fontSize, text_color)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 39
42 canvas.width = kClipperz_PM_UI_Canvas_Logo_normalWidth; 40 canvas.width = kClipperz_PM_UI_Canvas_Logo_normalWidth;
43 canvas.height = kClipperz_PM_UI_Canvas_Logo_normalHeight; 41 canvas.height = kClipperz_PM_UI_Canvas_Logo_normalHeight;
44 42
45 context.save(); 43 context.save();
46 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Logo_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_Logo_normalHeight); 44 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Logo_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_Logo_normalHeight);
47 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Logo_normalWidth, kClipperz_PM_UI_Canvas_Logo_normalHeight); 45 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Logo_normalWidth, kClipperz_PM_UI_Canvas_Logo_normalHeight);
48 46
49 context.font = fontSize + " HelveticaNeue-Bold"; 47 context.font = fontSize + " HelveticaNeue-Bold";
50 context.fillStyle = text_color; 48 context.fillStyle = text_color;
51 context.fillText(logo, 3, 30); 49 context.fillText(logo, 3, 30);
52 50
53 context.restore(); 51 context.restore();
54} 52}
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js
index 02f2f80..5982f0d 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //exclamationMark.js 25 //exclamationMark.js
28 //! 26 //!
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/7/10 28 //Created by Giulio Cesare Solaroli on 3/7/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth = 50.0; 33var kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth = 50.0;
36var kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight = 50.0; 34var kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight = 50.0;
37 35
38function Clipperz_PM_UI_Canvas_Marks_exclamationMark(canvas, aColor) 36function Clipperz_PM_UI_Canvas_Marks_exclamationMark(canvas, aColor)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var path; 41 var path;
44 var pointX; 42 var pointX;
45 var pointY; 43 var pointY;
46 var controlPoint1X; 44 var controlPoint1X;
47 var controlPoint1Y; 45 var controlPoint1Y;
48 var controlPoint2X; 46 var controlPoint2X;
49 var controlPoint2Y; 47 var controlPoint2Y;
50 if (window.devicePixelRatio) 48 if (window.devicePixelRatio)
51 resolution = window.devicePixelRatio; 49 resolution = window.devicePixelRatio;
52 else 50 else
53 resolution = 1.0; 51 resolution = 1.0;
54 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight); 52 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight);
55 53
56 context.save(); 54 context.save();
57 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight); 55 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight);
58 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth, kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight); 56 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_exclamationMarkWidth, kClipperz_PM_UI_Canvas_Marks_exclamationMarkHeight);
59 57
60 // Layer 1 58 // Layer 1
61 59
62 alignStroke = 0.0; 60 alignStroke = 0.0;
63 context.beginPath(); 61 context.beginPath();
64 pointX = 26.499; 62 pointX = 26.499;
65 pointY = 10.848; 63 pointY = 10.848;
66 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 64 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
67 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 65 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
68 context.moveTo(pointX, pointY); 66 context.moveTo(pointX, pointY);
69 pointX = 20.887; 67 pointX = 20.887;
70 pointY = 11.584; 68 pointY = 11.584;
71 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 69 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
72 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 70 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
73 controlPoint1X = 25.395; 71 controlPoint1X = 25.395;
74 controlPoint1Y = 10.802; 72 controlPoint1Y = 10.802;
75 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 73 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
76 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 74 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
77 controlPoint2X = 22.175; 75 controlPoint2X = 22.175;
78 controlPoint2Y = 11.078; 76 controlPoint2Y = 11.078;
79 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 77 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
80 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 78 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
81 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 79 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
82 pointX = 20.013; 80 pointX = 20.013;
83 pointY = 13.194; 81 pointY = 13.194;
84 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 82 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
85 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 83 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
86 controlPoint1X = 20.335; 84 controlPoint1X = 20.335;
87 controlPoint1Y = 11.814; 85 controlPoint1Y = 11.814;
88 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 86 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
89 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 87 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
90 controlPoint2X = 19.921; 88 controlPoint2X = 19.921;
91 controlPoint2Y = 12.826; 89 controlPoint2Y = 12.826;
92 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 90 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
93 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 91 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
94 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 92 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
95 pointX = 23.049; 93 pointX = 23.049;
96 pointY = 28.788; 94 pointY = 28.788;
97 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 95 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
98 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 96 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
99 controlPoint1X = 20.243; 97 controlPoint1X = 20.243;
100 controlPoint1Y = 15.448; 98 controlPoint1Y = 15.448;
101 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 99 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
102 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 100 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
103 controlPoint2X = 22.589; 101 controlPoint2X = 22.589;
104 controlPoint2Y = 26.35; 102 controlPoint2Y = 26.35;
105 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 103 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
106 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 104 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
107 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 105 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
108 pointX = 25.027; 106 pointX = 25.027;
109 pointY = 29.156; 107 pointY = 29.156;
110 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 108 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
111 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 109 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
112 controlPoint1X = 23.279; 110 controlPoint1X = 23.279;
113 controlPoint1Y = 29.018; 111 controlPoint1Y = 29.018;
114 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 112 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
115 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 113 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
116 controlPoint2X = 24.705; 114 controlPoint2X = 24.705;
117 controlPoint2Y = 29.202; 115 controlPoint2Y = 29.202;
118 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 116 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js
index fad5c10..2501992 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //info.js 25 //info.js
28 //i 26 //i
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/7/10 28 //Created by Giulio Cesare Solaroli on 3/7/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_Marks_infoWidth = 50.0; 33var kClipperz_PM_UI_Canvas_Marks_infoWidth = 50.0;
36var kClipperz_PM_UI_Canvas_Marks_infoHeight = 50.0; 34var kClipperz_PM_UI_Canvas_Marks_infoHeight = 50.0;
37 35
38function Clipperz_PM_UI_Canvas_Marks_info(canvas, aColor) 36function Clipperz_PM_UI_Canvas_Marks_info(canvas, aColor)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var path; 41 var path;
44 var pointX; 42 var pointX;
45 var pointY; 43 var pointY;
46 var controlPoint1X; 44 var controlPoint1X;
47 var controlPoint1Y; 45 var controlPoint1Y;
48 var controlPoint2X; 46 var controlPoint2X;
49 var controlPoint2Y; 47 var controlPoint2Y;
50 var color; 48 var color;
51 if (window.devicePixelRatio) 49 if (window.devicePixelRatio)
52 resolution = window.devicePixelRatio; 50 resolution = window.devicePixelRatio;
53 else 51 else
54 resolution = 1.0; 52 resolution = 1.0;
55 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_infoWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_infoHeight); 53 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_infoWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_infoHeight);
56 54
57 context.save(); 55 context.save();
58 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_infoWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_infoHeight); 56 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_infoWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_infoHeight);
59 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_infoWidth, kClipperz_PM_UI_Canvas_Marks_infoHeight); 57 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_infoWidth, kClipperz_PM_UI_Canvas_Marks_infoHeight);
60 58
61 // Layer 1 59 // Layer 1
62 60
63 alignStroke = 0.0; 61 alignStroke = 0.0;
64 context.beginPath(); 62 context.beginPath();
65 pointX = 30.253; 63 pointX = 30.253;
66 pointY = 37.436; 64 pointY = 37.436;
67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
69 context.moveTo(pointX, pointY); 67 context.moveTo(pointX, pointY);
70 pointX = 28.505; 68 pointX = 28.505;
71 pointY = 37.022; 69 pointY = 37.022;
72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
74 context.lineTo(pointX, pointY); 72 context.lineTo(pointX, pointY);
75 pointX = 27.677; 73 pointX = 27.677;
76 pointY = 35.09; 74 pointY = 35.09;
77 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
78 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
79 controlPoint1X = 27.953; 77 controlPoint1X = 27.953;
80 controlPoint1Y = 36.792; 78 controlPoint1Y = 36.792;
81 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 79 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
82 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 80 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
83 controlPoint2X = 27.677; 81 controlPoint2X = 27.677;
84 controlPoint2Y = 36.47; 82 controlPoint2Y = 36.47;
85 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 83 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
86 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 84 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
87 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 85 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
88 pointX = 27.631; 86 pointX = 27.631;
89 pointY = 27.546; 87 pointY = 27.546;
90 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 88 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
91 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 89 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
92 controlPoint1X = 27.631; 90 controlPoint1X = 27.631;
93 controlPoint1Y = 32.974; 91 controlPoint1Y = 32.974;
94 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 92 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
95 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 93 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
96 controlPoint2X = 27.631; 94 controlPoint2X = 27.631;
97 controlPoint2Y = 29.892; 95 controlPoint2Y = 29.892;
98 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 96 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
99 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 97 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
100 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 98 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
101 pointX = 27.677; 99 pointX = 27.677;
102 pointY = 19.726; 100 pointY = 19.726;
103 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
104 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
105 controlPoint1X = 27.631; 103 controlPoint1X = 27.631;
106 controlPoint1Y = 24.97; 104 controlPoint1Y = 24.97;
107 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 105 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
108 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 106 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
109 controlPoint2X = 27.677; 107 controlPoint2X = 27.677;
110 controlPoint2Y = 21.612; 108 controlPoint2Y = 21.612;
111 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 109 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
112 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 110 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
113 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 111 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
114 pointX = 19.535; 112 pointX = 19.535;
115 pointY = 21.336; 113 pointY = 21.336;
116 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 114 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
117 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 115 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
118 controlPoint1X = 25.331; 116 controlPoint1X = 25.331;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js
index 5842828..9a8ac7d 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //questionMark.js 25 //questionMark.js
28 //? 26 //?
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/7/10 28 //Created by Giulio Cesare Solaroli on 3/7/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_Marks_questionMarkWidth = 50.0; 33var kClipperz_PM_UI_Canvas_Marks_questionMarkWidth = 50.0;
36var kClipperz_PM_UI_Canvas_Marks_questionMarkHeight = 50.0; 34var kClipperz_PM_UI_Canvas_Marks_questionMarkHeight = 50.0;
37 35
38function Clipperz_PM_UI_Canvas_Marks_questionMark(canvas, aColor) 36function Clipperz_PM_UI_Canvas_Marks_questionMark(canvas, aColor)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var path; 41 var path;
44 var pointX; 42 var pointX;
45 var pointY; 43 var pointY;
46 var controlPoint1X; 44 var controlPoint1X;
47 var controlPoint1Y; 45 var controlPoint1Y;
48 var controlPoint2X; 46 var controlPoint2X;
49 var controlPoint2Y; 47 var controlPoint2Y;
50 var color; 48 var color;
51 if (window.devicePixelRatio) 49 if (window.devicePixelRatio)
52 resolution = window.devicePixelRatio; 50 resolution = window.devicePixelRatio;
53 else 51 else
54 resolution = 1.0; 52 resolution = 1.0;
55 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_questionMarkWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_questionMarkHeight); 53 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Marks_questionMarkWidth + canvas.height / kClipperz_PM_UI_Canvas_Marks_questionMarkHeight);
56 54
57 context.save(); 55 context.save();
58 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_questionMarkWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_questionMarkHeight); 56 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Marks_questionMarkWidth, canvas.height / kClipperz_PM_UI_Canvas_Marks_questionMarkHeight);
59 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_questionMarkWidth, kClipperz_PM_UI_Canvas_Marks_questionMarkHeight); 57 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Marks_questionMarkWidth, kClipperz_PM_UI_Canvas_Marks_questionMarkHeight);
60 58
61 // Layer 1 59 // Layer 1
62 60
63 alignStroke = 0.0; 61 alignStroke = 0.0;
64 context.beginPath(); 62 context.beginPath();
65 pointX = 24.118; 63 pointX = 24.118;
66 pointY = 24.464; 64 pointY = 24.464;
67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
69 context.moveTo(pointX, pointY); 67 context.moveTo(pointX, pointY);
70 pointX = 24.854; 68 pointX = 24.854;
71 pointY = 23.406; 69 pointY = 23.406;
72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
74 controlPoint1X = 24.118; 72 controlPoint1X = 24.118;
75 controlPoint1Y = 24.05; 73 controlPoint1Y = 24.05;
76 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 74 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
77 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 75 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
78 controlPoint2X = 24.44; 76 controlPoint2X = 24.44;
79 controlPoint2Y = 23.636; 77 controlPoint2Y = 23.636;
80 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 78 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
81 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 79 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
82 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 80 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
83 pointX = 29.454; 81 pointX = 29.454;
84 pointY = 20.6; 82 pointY = 20.6;
85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 83 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 84 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
87 controlPoint1X = 26.418; 85 controlPoint1X = 26.418;
88 controlPoint1Y = 22.532; 86 controlPoint1Y = 22.532;
89 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 87 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
90 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 88 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
91 controlPoint2X = 28.534; 89 controlPoint2X = 28.534;
92 controlPoint2Y = 21.566; 90 controlPoint2Y = 21.566;
93 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 91 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
94 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 92 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
95 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 93 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
96 pointX = 30.282; 94 pointX = 30.282;
97 pointY = 17.794; 95 pointY = 17.794;
98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 96 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 97 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
100 controlPoint1X = 29.868; 98 controlPoint1X = 29.868;
101 controlPoint1Y = 20.232; 99 controlPoint1Y = 20.232;
102 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 100 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
103 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 101 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
104 controlPoint2X = 30.282; 102 controlPoint2X = 30.282;
105 controlPoint2Y = 19.082; 103 controlPoint2Y = 19.082;
106 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 104 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
107 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 105 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
108 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 106 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
109 pointX = 27.2; 107 pointX = 27.2;
110 pointY = 12.688; 108 pointY = 12.688;
111 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 109 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
112 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 110 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
113 controlPoint1X = 30.282; 111 controlPoint1X = 30.282;
114 controlPoint1Y = 16.322; 112 controlPoint1Y = 16.322;
115 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 113 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
116 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 114 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
117 controlPoint2X = 29.454; 115 controlPoint2X = 29.454;
118 controlPoint2Y = 14.344; 116 controlPoint2Y = 14.344;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js
index 2462d0e..65e5ca6 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //normal.js 25 //normal.js
28 //normal 26 //normal
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/24/10 28 //Created by Giulio Cesare Solaroli on 3/24/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_RegisterButton_normalWidth = 282.0; 33var kClipperz_PM_UI_Canvas_RegisterButton_normalWidth = 282.0;
36var kClipperz_PM_UI_Canvas_RegisterButton_normalHeight = 93.0; 34var kClipperz_PM_UI_Canvas_RegisterButton_normalHeight = 93.0;
37 35
38function Clipperz_PM_UI_Canvas_RegisterButton_normal(canvas, aBackgroundColor, aDarkBackgroundColor, aLightColor, aDarkColor, aStarColor) 36function Clipperz_PM_UI_Canvas_RegisterButton_normal(canvas, aBackgroundColor, aDarkBackgroundColor, aLightColor, aDarkColor, aStarColor)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var path; 41 var path;
44 var pointX; 42 var pointX;
45 var pointY; 43 var pointY;
46 var controlPoint1X; 44 var controlPoint1X;
47 var controlPoint1Y; 45 var controlPoint1Y;
48 var controlPoint2X; 46 var controlPoint2X;
49 var controlPoint2Y; 47 var controlPoint2Y;
50 var gradient; 48 var gradient;
51 var color; 49 var color;
52 if (window.devicePixelRatio) 50 if (window.devicePixelRatio)
53 resolution = window.devicePixelRatio; 51 resolution = window.devicePixelRatio;
54 else 52 else
55 resolution = 1.0; 53 resolution = 1.0;
56 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_RegisterButton_normalWidth + canvas.height / kClipperz_PM_UI_Canvas_RegisterButton_normalHeight); 54 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_RegisterButton_normalWidth + canvas.height / kClipperz_PM_UI_Canvas_RegisterButton_normalHeight);
57 55
58 context.save(); 56 context.save();
59 context.scale(canvas.width / kClipperz_PM_UI_Canvas_RegisterButton_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_RegisterButton_normalHeight); 57 context.scale(canvas.width / kClipperz_PM_UI_Canvas_RegisterButton_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_RegisterButton_normalHeight);
60 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_RegisterButton_normalWidth, kClipperz_PM_UI_Canvas_RegisterButton_normalHeight); 58 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_RegisterButton_normalWidth, kClipperz_PM_UI_Canvas_RegisterButton_normalHeight);
61 59
62 // background 60 // background
63 61
64 alignStroke = 0.0; 62 alignStroke = 0.0;
65 context.beginPath(); 63 context.beginPath();
66 pointX = 241.0; 64 pointX = 241.0;
67 pointY = 80.0; 65 pointY = 80.0;
68 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 66 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
69 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 67 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
70 context.moveTo(pointX, pointY); 68 context.moveTo(pointX, pointY);
71 pointX = 274.0; 69 pointX = 274.0;
72 pointY = 47.0; 70 pointY = 47.0;
73 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 71 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
74 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 72 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
75 controlPoint1X = 259.103; 73 controlPoint1X = 259.103;
76 controlPoint1Y = 80.0; 74 controlPoint1Y = 80.0;
77 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 75 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
78 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 76 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
79 controlPoint2X = 274.0; 77 controlPoint2X = 274.0;
80 controlPoint2Y = 65.103; 78 controlPoint2Y = 65.103;
81 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 79 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
82 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 80 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
83 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 81 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
84 pointX = 274.0; 82 pointX = 274.0;
85 pointY = 45.0; 83 pointY = 45.0;
86 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 84 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
87 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 85 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
88 context.lineTo(pointX, pointY); 86 context.lineTo(pointX, pointY);
89 pointX = 241.0; 87 pointX = 241.0;
90 pointY = 12.0; 88 pointY = 12.0;
91 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 89 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
92 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 90 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
93 controlPoint1X = 274.0; 91 controlPoint1X = 274.0;
94 controlPoint1Y = 26.897; 92 controlPoint1Y = 26.897;
95 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 93 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
96 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 94 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
97 controlPoint2X = 259.103; 95 controlPoint2X = 259.103;
98 controlPoint2Y = 12.0; 96 controlPoint2Y = 12.0;
99 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 97 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
100 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 98 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
101 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY); 99 context.bezierCurveTo(controlPoint1X, controlPoint1Y, controlPoint2X, controlPoint2Y, pointX, pointY);
102 pointX = 60.0; 100 pointX = 60.0;
103 pointY = 12.0; 101 pointY = 12.0;
104 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 102 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
105 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 103 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
106 context.lineTo(pointX, pointY); 104 context.lineTo(pointX, pointY);
107 pointX = 27.0; 105 pointX = 27.0;
108 pointY = 45.0; 106 pointY = 45.0;
109 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 107 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
110 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 108 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
111 controlPoint1X = 41.897; 109 controlPoint1X = 41.897;
112 controlPoint1Y = 12.0; 110 controlPoint1Y = 12.0;
113 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution; 111 controlPoint1X = (Math.round(resolution * controlPoint1X + alignStroke) - alignStroke) / resolution;
114 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution; 112 controlPoint1Y = (Math.round(resolution * controlPoint1Y + alignStroke) - alignStroke) / resolution;
115 controlPoint2X = 27.0; 113 controlPoint2X = 27.0;
116 controlPoint2Y = 26.897; 114 controlPoint2Y = 26.897;
117 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution; 115 controlPoint2X = (Math.round(resolution * controlPoint2X + alignStroke) - alignStroke) / resolution;
118 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution; 116 controlPoint2Y = (Math.round(resolution * controlPoint2Y + alignStroke) - alignStroke) / resolution;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js
index cf475c6..5b344ef 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //normal.js 25 //normal.js
28 //normal 26 //normal
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/15/10 28 //Created by Giulio Cesare Solaroli on 3/15/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_Star_normalWidth = 46.0; 33var kClipperz_PM_UI_Canvas_Star_normalWidth = 46.0;
36var kClipperz_PM_UI_Canvas_Star_normalHeight = 46.0; 34var kClipperz_PM_UI_Canvas_Star_normalHeight = 46.0;
37 35
38function Clipperz_PM_UI_Canvas_Star_normal(canvas, aColor) 36function Clipperz_PM_UI_Canvas_Star_normal(canvas, aColor)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var path; 41 var path;
44 var pointX; 42 var pointX;
45 var pointY; 43 var pointY;
46 if (window.devicePixelRatio) 44 if (window.devicePixelRatio)
47 resolution = window.devicePixelRatio; 45 resolution = window.devicePixelRatio;
48 else 46 else
49 resolution = 1.0; 47 resolution = 1.0;
50 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Star_normalWidth + canvas.height / kClipperz_PM_UI_Canvas_Star_normalHeight); 48 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Star_normalWidth + canvas.height / kClipperz_PM_UI_Canvas_Star_normalHeight);
51 49
52 context.save(); 50 context.save();
53 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Star_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_Star_normalHeight); 51 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Star_normalWidth, canvas.height / kClipperz_PM_UI_Canvas_Star_normalHeight);
54 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Star_normalWidth, kClipperz_PM_UI_Canvas_Star_normalHeight); 52 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Star_normalWidth, kClipperz_PM_UI_Canvas_Star_normalHeight);
55 53
56 // * 54 // *
57 55
58 alignStroke = 0.0; 56 alignStroke = 0.0;
59 context.beginPath(); 57 context.beginPath();
60 pointX = 8.613; 58 pointX = 8.613;
61 pointY = 15.583; 59 pointY = 15.583;
62 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 60 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
63 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 61 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
64 context.moveTo(pointX, pointY); 62 context.moveTo(pointX, pointY);
65 pointX = 18.563; 63 pointX = 18.563;
66 pointY = 18.821; 64 pointY = 18.821;
67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
69 context.lineTo(pointX, pointY); 67 context.lineTo(pointX, pointY);
70 pointX = 18.563; 68 pointX = 18.563;
71 pointY = 7.347; 69 pointY = 7.347;
72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
74 context.lineTo(pointX, pointY); 72 context.lineTo(pointX, pointY);
75 pointX = 26.799; 73 pointX = 26.799;
76 pointY = 7.347; 74 pointY = 7.347;
77 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
78 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
79 context.lineTo(pointX, pointY); 77 context.lineTo(pointX, pointY);
80 pointX = 26.799; 78 pointX = 26.799;
81 pointY = 18.821; 79 pointY = 18.821;
82 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
83 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
84 context.lineTo(pointX, pointY); 82 context.lineTo(pointX, pointY);
85 pointX = 36.749; 83 pointX = 36.749;
86 pointY = 15.583; 84 pointY = 15.583;
87 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 85 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
88 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 86 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
89 context.lineTo(pointX, pointY); 87 context.lineTo(pointX, pointY);
90 pointX = 38.986; 88 pointX = 38.986;
91 pointY = 22.677; 89 pointY = 22.677;
92 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 90 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
93 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 91 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
94 context.lineTo(pointX, pointY); 92 context.lineTo(pointX, pointY);
95 pointX = 28.846; 93 pointX = 28.846;
96 pointY = 25.819; 94 pointY = 25.819;
97 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 95 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
98 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 96 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
99 context.lineTo(pointX, pointY); 97 context.lineTo(pointX, pointY);
100 pointX = 35.463; 98 pointX = 35.463;
101 pointY = 35.293; 99 pointY = 35.293;
102 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
103 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
104 context.lineTo(pointX, pointY); 102 context.lineTo(pointX, pointY);
105 pointX = 29.369; 103 pointX = 29.369;
106 pointY = 39.625; 104 pointY = 39.625;
107 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 105 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
108 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 106 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
109 context.lineTo(pointX, pointY); 107 context.lineTo(pointX, pointY);
110 pointX = 22.752; 108 pointX = 22.752;
111 pointY = 30.675; 109 pointY = 30.675;
112 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 110 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
113 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 111 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
114 context.lineTo(pointX, pointY); 112 context.lineTo(pointX, pointY);
115 pointX = 15.944; 113 pointX = 15.944;
116 pointY = 39.625; 114 pointY = 39.625;
117 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 115 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
118 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 116 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js
index cd7ed90..21dfcc0 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //close.js 25 //close.js
28 //close 26 //close
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/14/10 28 //Created by Giulio Cesare Solaroli on 3/14/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_Tips_closeWidth = 310.0; 33var kClipperz_PM_UI_Canvas_Tips_closeWidth = 310.0;
36var kClipperz_PM_UI_Canvas_Tips_closeHeight = 6.0; 34var kClipperz_PM_UI_Canvas_Tips_closeHeight = 6.0;
37 35
38function Clipperz_PM_UI_Canvas_Tips_close(canvas, aColor, aBackgroundColor) 36function Clipperz_PM_UI_Canvas_Tips_close(canvas, aColor, aBackgroundColor)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var path; 41 var path;
44 var pointX; 42 var pointX;
45 var pointY; 43 var pointY;
46 if (window.devicePixelRatio) 44 if (window.devicePixelRatio)
47 resolution = window.devicePixelRatio; 45 resolution = window.devicePixelRatio;
48 else 46 else
49 resolution = 1.0; 47 resolution = 1.0;
50 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Tips_closeWidth + canvas.height / kClipperz_PM_UI_Canvas_Tips_closeHeight); 48 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Tips_closeWidth + canvas.height / kClipperz_PM_UI_Canvas_Tips_closeHeight);
51 49
52 context.save(); 50 context.save();
53 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Tips_closeWidth, canvas.height / kClipperz_PM_UI_Canvas_Tips_closeHeight); 51 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Tips_closeWidth, canvas.height / kClipperz_PM_UI_Canvas_Tips_closeHeight);
54 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Tips_closeWidth, kClipperz_PM_UI_Canvas_Tips_closeHeight); 52 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Tips_closeWidth, kClipperz_PM_UI_Canvas_Tips_closeHeight);
55 53
56 // background 54 // background
57 55
58 alignStroke = 0.0; 56 alignStroke = 0.0;
59 context.beginPath(); 57 context.beginPath();
60 pointX = 310.0; 58 pointX = 310.0;
61 pointY = 6.0; 59 pointY = 6.0;
62 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 60 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
63 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 61 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
64 context.moveTo(pointX, pointY); 62 context.moveTo(pointX, pointY);
65 pointX = 310.0; 63 pointX = 310.0;
66 pointY = 0.0; 64 pointY = 0.0;
67 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 65 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
68 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 66 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
69 context.lineTo(pointX, pointY); 67 context.lineTo(pointX, pointY);
70 pointX = 0.0; 68 pointX = 0.0;
71 pointY = 0.0; 69 pointY = 0.0;
72 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 70 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
73 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 71 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
74 context.lineTo(pointX, pointY); 72 context.lineTo(pointX, pointY);
75 pointX = 0.0; 73 pointX = 0.0;
76 pointY = 6.0; 74 pointY = 6.0;
77 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 75 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
78 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 76 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
79 context.lineTo(pointX, pointY); 77 context.lineTo(pointX, pointY);
80 pointX = 310.0; 78 pointX = 310.0;
81 pointY = 6.0; 79 pointY = 6.0;
82 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 80 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
83 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 81 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
84 context.lineTo(pointX, pointY); 82 context.lineTo(pointX, pointY);
85 context.closePath(); 83 context.closePath();
86 context.fillStyle = aBackgroundColor; 84 context.fillStyle = aBackgroundColor;
87 context.fill(); 85 context.fill();
88 86
89 // grid 87 // grid
90 88
91 // background 89 // background
92 90
93 alignStroke = 0.0; 91 alignStroke = 0.0;
94 context.beginPath(); 92 context.beginPath();
95 pointX = 310.0; 93 pointX = 310.0;
96 pointY = 6.0; 94 pointY = 6.0;
97 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 95 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
98 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 96 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
99 context.moveTo(pointX, pointY); 97 context.moveTo(pointX, pointY);
100 pointX = 310.0; 98 pointX = 310.0;
101 pointY = 0.0; 99 pointY = 0.0;
102 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 100 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
103 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 101 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
104 context.lineTo(pointX, pointY); 102 context.lineTo(pointX, pointY);
105 pointX = 0.0; 103 pointX = 0.0;
106 pointY = 0.0; 104 pointY = 0.0;
107 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 105 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
108 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 106 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
109 context.lineTo(pointX, pointY); 107 context.lineTo(pointX, pointY);
110 pointX = 0.0; 108 pointX = 0.0;
111 pointY = 6.0; 109 pointY = 6.0;
112 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 110 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
113 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 111 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
114 context.lineTo(pointX, pointY); 112 context.lineTo(pointX, pointY);
115 pointX = 310.0; 113 pointX = 310.0;
116 pointY = 6.0; 114 pointY = 6.0;
117 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 115 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
118 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 116 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js
index 30c1c69..9c76865 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26// 24//
27 //open.js 25 //open.js
28 //open 26 //open
29// 27//
30 //Created by Giulio Cesare Solaroli on 3/14/10 28 //Created by Giulio Cesare Solaroli on 3/14/10
31 //Copyright 2010 Clipperz 29 //Copyright 2010 Clipperz
32 //This code was generated by Opacity. You may use or modify it in any way. 30 //This code was generated by Opacity. You may use or modify it in any way.
33// 31//
34 32
35var kClipperz_PM_UI_Canvas_Tips_openWidth = 310.0; 33var kClipperz_PM_UI_Canvas_Tips_openWidth = 310.0;
36var kClipperz_PM_UI_Canvas_Tips_openHeight = 6.0; 34var kClipperz_PM_UI_Canvas_Tips_openHeight = 6.0;
37 35
38function Clipperz_PM_UI_Canvas_Tips_open(canvas, aColor, aBackgroundColor) 36function Clipperz_PM_UI_Canvas_Tips_open(canvas, aColor, aBackgroundColor)
39{ 37{
40 var context = canvas.getContext("2d"); 38 var context = canvas.getContext("2d");
41 var alignStroke; 39 var alignStroke;
42 var resolution; 40 var resolution;
43 var path; 41 var path;
44 var pointX; 42 var pointX;
45 var pointY; 43 var pointY;
46 var color; 44 var color;
47 if (window.devicePixelRatio) 45 if (window.devicePixelRatio)
48 resolution = window.devicePixelRatio; 46 resolution = window.devicePixelRatio;
49 else 47 else
50 resolution = 1.0; 48 resolution = 1.0;
51 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Tips_openWidth + canvas.height / kClipperz_PM_UI_Canvas_Tips_openHeight); 49 resolution *= 0.5 * (canvas.width / kClipperz_PM_UI_Canvas_Tips_openWidth + canvas.height / kClipperz_PM_UI_Canvas_Tips_openHeight);
52 50
53 context.save(); 51 context.save();
54 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Tips_openWidth, canvas.height / kClipperz_PM_UI_Canvas_Tips_openHeight); 52 context.scale(canvas.width / kClipperz_PM_UI_Canvas_Tips_openWidth, canvas.height / kClipperz_PM_UI_Canvas_Tips_openHeight);
55 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Tips_openWidth, kClipperz_PM_UI_Canvas_Tips_openHeight); 53 context.clearRect(0.0, 0.0, kClipperz_PM_UI_Canvas_Tips_openWidth, kClipperz_PM_UI_Canvas_Tips_openHeight);
56 54
57 // background 55 // background
58 56
59 alignStroke = 0.0; 57 alignStroke = 0.0;
60 context.beginPath(); 58 context.beginPath();
61 pointX = 310.0; 59 pointX = 310.0;
62 pointY = 6.0; 60 pointY = 6.0;
63 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 61 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
64 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 62 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
65 context.moveTo(pointX, pointY); 63 context.moveTo(pointX, pointY);
66 pointX = 310.0; 64 pointX = 310.0;
67 pointY = 0.0; 65 pointY = 0.0;
68 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 66 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
69 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 67 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
70 context.lineTo(pointX, pointY); 68 context.lineTo(pointX, pointY);
71 pointX = 0.0; 69 pointX = 0.0;
72 pointY = 0.0; 70 pointY = 0.0;
73 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 71 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
74 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 72 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
75 context.lineTo(pointX, pointY); 73 context.lineTo(pointX, pointY);
76 pointX = 0.0; 74 pointX = 0.0;
77 pointY = 6.0; 75 pointY = 6.0;
78 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 76 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
79 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 77 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
80 context.lineTo(pointX, pointY); 78 context.lineTo(pointX, pointY);
81 pointX = 310.0; 79 pointX = 310.0;
82 pointY = 6.0; 80 pointY = 6.0;
83 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 81 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
84 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 82 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
85 context.lineTo(pointX, pointY); 83 context.lineTo(pointX, pointY);
86 context.closePath(); 84 context.closePath();
87 context.fillStyle = aBackgroundColor; 85 context.fillStyle = aBackgroundColor;
88 context.fill(); 86 context.fill();
89 87
90 // grid 88 // grid
91 89
92 // background 90 // background
93 91
94 alignStroke = 0.0; 92 alignStroke = 0.0;
95 context.beginPath(); 93 context.beginPath();
96 pointX = 310.0; 94 pointX = 310.0;
97 pointY = 6.0; 95 pointY = 6.0;
98 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 96 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
99 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 97 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
100 context.moveTo(pointX, pointY); 98 context.moveTo(pointX, pointY);
101 pointX = 310.0; 99 pointX = 310.0;
102 pointY = 0.0; 100 pointY = 0.0;
103 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 101 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
104 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 102 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
105 context.lineTo(pointX, pointY); 103 context.lineTo(pointX, pointY);
106 pointX = 0.0; 104 pointX = 0.0;
107 pointY = 0.0; 105 pointY = 0.0;
108 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 106 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
109 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 107 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
110 context.lineTo(pointX, pointY); 108 context.lineTo(pointX, pointY);
111 pointX = 0.0; 109 pointX = 0.0;
112 pointY = 6.0; 110 pointY = 6.0;
113 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 111 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
114 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 112 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
115 context.lineTo(pointX, pointY); 113 context.lineTo(pointX, pointY);
116 pointX = 310.0; 114 pointX = 310.0;
117 pointY = 6.0; 115 pointY = 6.0;
118 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 116 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js
index b9d7adf..58b7593 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js
@@ -1,416 +1,410 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30var _Clipperz_PM_Components_base_id_ = 0; 28var _Clipperz_PM_Components_base_id_ = 0;
31 29
32//############################################################################# 30//#############################################################################
33 31
34Clipperz.PM.UI.Common.Components.BaseComponent = function(args) { 32Clipperz.PM.UI.Common.Components.BaseComponent = function(args) {
35 args = args || {}; 33 args = args || {};
36 Clipperz.PM.UI.Common.Components.BaseComponent.superclass.constructor.call(this, args); 34 Clipperz.PM.UI.Common.Components.BaseComponent.superclass.constructor.call(this, args);
37 35
38 this._element = args.element || null; 36 this._element = args.element || null;
39 this._ids = {}; 37 this._ids = {};
40 38
41 this._slots = {}; 39 this._slots = {};
42 this._slotComponents = {}; 40 this._slotComponents = {};
43 41
44 this._components = {}; 42 this._components = {};
45 43
46 this._cachedSlots = {}; 44 this._cachedSlots = {};
47 45
48 this._isModal = false; 46 this._isModal = false;
49 47
50 this._isActive = false; 48 this._isActive = false;
51 this._elementUsedToEnterModalState; 49 this._elementUsedToEnterModalState;
52 50
53 this._isFullyRendered = false; 51 this._isFullyRendered = false;
54 this._renderingWaitingQueue = []; 52 this._renderingWaitingQueue = [];
55 53
56 //this._slots = { 54 //this._slots = {
57 // 'header':'header', 55 // 'header':'header',
58 // 'body': 'body', 56 // 'body': 'body',
59 // 'footer':'footer' 57 // 'footer':'footer'
60 //}; 58 //};
61 59
62 return this; 60 return this;
63} 61}
64 62
65//============================================================================= 63//=============================================================================
66 64
67//TODO get back to MochiKit.Base.update as we are not extending anything 65//TODO get back to MochiKit.Base.update as we are not extending anything
68//MochiKit.Base.update(Clipperz.PM.UI.Common.Components.BaseComponent.prototype, { 66//MochiKit.Base.update(Clipperz.PM.UI.Common.Components.BaseComponent.prototype, {
69Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.BaseComponent, /*Ext.Component*/ Object, { 67Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.BaseComponent, /*Ext.Component*/ Object, {
70 68
71 'isClipperzPMComponent': true, 69 'isClipperzPMComponent': true,
72 70
73 //------------------------------------------------------------------------- 71 //-------------------------------------------------------------------------
74 72
75 'toString': function () { 73 'toString': function () {
76 return "Clipperz.PM.UI.Common.Components.BaseComponent component"; 74 return "Clipperz.PM.UI.Common.Components.BaseComponent component";
77 }, 75 },
78 76
79 'componentId': function () { 77 'componentId': function () {
80 return this.getId('_id_'); 78 return this.getId('_id_');
81 }, 79 },
82 80
83 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
84/* 82/*
85 'slots': function() { 83 'slots': function() {
86 return this._slots; 84 return this._slots;
87 }, 85 },
88*/ 86*/
89 'slotComponents': function() { 87 'slotComponents': function() {
90 return this._slotComponents; 88 return this._slotComponents;
91 }, 89 },
92 90
93 //------------------------------------------------------------------------- 91 //-------------------------------------------------------------------------
94 92
95 'components': function () { 93 'components': function () {
96 return this._components; 94 return this._components;
97 }, 95 },
98 96
99 'addComponent': function (aComponent) { 97 'addComponent': function (aComponent) {
100 this.components()[aComponent.componentId()] = aComponent; 98 this.components()[aComponent.componentId()] = aComponent;
101 }, 99 },
102 100
103 'removeComponent': function (aComponent) { 101 'removeComponent': function (aComponent) {
104 var componentId; 102 var componentId;
105 103
106 componentId = aComponent.componentId(); 104 componentId = aComponent.componentId();
107 this.components()[componentId].remove(); 105 this.components()[componentId].remove();
108 delete this.components()[componentId]; 106 delete this.components()[componentId];
109 }, 107 },
110 108
111 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
112/* 110/*
113 'domHelper': function() { 111 'domHelper': function() {
114 return Clipperz.YUI.DomHelper; 112 return Clipperz.YUI.DomHelper;
115 }, 113 },
116 */ 114 */
117 //------------------------------------------------------------------------- 115 //-------------------------------------------------------------------------
118/* 116/*
119 'domHelperAppend': function(aValue) { 117 'domHelperAppend': function(aValue) {
120 Clipperz.YUI.DomHelper.append(this.element().dom, aValue); 118 Clipperz.YUI.DomHelper.append(this.element().dom, aValue);
121 }, 119 },
122 */ 120 */
123 //------------------------------------------------------------------------- 121 //-------------------------------------------------------------------------
124 122
125 'element': function() { 123 'element': function() {
126//MochiKit.Logging.logDebug(">>> BaseComponent.element");
127 return MochiKit.DOM.getElement(this._element); 124 return MochiKit.DOM.getElement(this._element);
128 }, 125 },
129 126
130 'setElement': function(aNode) { 127 'setElement': function(aNode) {
131 this._element = aNode; 128 this._element = aNode;
132 }, 129 },
133 130
134 //----------------------------------------------------- 131 //-----------------------------------------------------
135 132
136 'displayElement': function() { 133 'displayElement': function() {
137 return this.element(); 134 return this.element();
138 }, 135 },
139 136
140 //------------------------------------------------------------------------- 137 //-------------------------------------------------------------------------
141 138
142 'renderInNode': function(aDomNode) { 139 'renderInNode': function(aDomNode) {
143 this.setElement(aDomNode); 140 this.setElement(aDomNode);
144 this.render(); 141 this.render();
145 }, 142 },
146 143
147 'render': function() { 144 'render': function() {
148 this.clear(); 145 this.clear();
149 this.renderSelf(); 146 this.renderSelf();
150 this.renderComponents(); 147 this.renderComponents();
151 if (this.shouldShowTranslationHints()) { 148 if (this.shouldShowTranslationHints()) {
152 this.renderTranslationHints(); 149 this.renderTranslationHints();
153 } 150 }
154 if (this.shouldShowElementWhileRendering()) { 151 if (this.shouldShowElementWhileRendering()) {
155 MochiKit.Style.showElement(this.displayElement()); 152 MochiKit.Style.showElement(this.displayElement());
156 }; 153 };
157 154
158 this._isFullyRendered = true; 155 this._isFullyRendered = true;
159 156
160 MochiKit.Iter.forEach(this.renderingWaitingQueue(), MochiKit.Base.methodcaller('callback')); 157 MochiKit.Iter.forEach(this.renderingWaitingQueue(), MochiKit.Base.methodcaller('callback'));
161 this.resetRenderingWaitingQueue(); 158 this.resetRenderingWaitingQueue();
162 }, 159 },
163 160
164 'renderSelf': function() { 161 'renderSelf': function() {
165 throw Clipperz.Base.exception.AbstractMethod; 162 throw Clipperz.Base.exception.AbstractMethod;
166 }, 163 },
167 164
168 'renderComponents': function() { 165 'renderComponents': function() {
169 varslotName; 166 varslotName;
170 167
171 for (slotName in this.slotComponents()) { 168 for (slotName in this.slotComponents()) {
172 this.slotComponents()[slotName].renderInNode(this.elementForSlotNamed(slotName)); 169 this.slotComponents()[slotName].renderInNode(this.elementForSlotNamed(slotName));
173 } 170 }
174 }, 171 },
175 172
176 //......................................................................... 173 //.........................................................................
177 174
178 'isFullyRendered': function () { 175 'isFullyRendered': function () {
179 return this._isFullyRendered; 176 return this._isFullyRendered;
180 }, 177 },
181 178
182 //......................................................................... 179 //.........................................................................
183 180
184 'renderingWaitingQueue': function () { 181 'renderingWaitingQueue': function () {
185 return this._renderingWaitingQueue; 182 return this._renderingWaitingQueue;
186 }, 183 },
187 184
188 'resetRenderingWaitingQueue': function () { 185 'resetRenderingWaitingQueue': function () {
189 this._renderingWaitingQueue = []; 186 this._renderingWaitingQueue = [];
190 }, 187 },
191 188
192 //......................................................................... 189 //.........................................................................
193 190
194 'waitUntilFullyRendered': function () { 191 'waitUntilFullyRendered': function () {
195 var deferredResult; 192 var deferredResult;
196 193
197 if (this.isFullyRendered() == true) { 194 if (this.isFullyRendered() == true) {
198 deferredResult = MochiKit.Async.succeed 195 deferredResult = MochiKit.Async.succeed
199 } else { 196 } else {
200 deferredResult = new Clipperz.Async.Deferred("BaseComponent.waitUntilFullyRendered", {trace:false}); 197 deferredResult = new Clipperz.Async.Deferred("BaseComponent.waitUntilFullyRendered", {trace:false});
201 this.renderingWaitingQueue().push(deferredResult); 198 this.renderingWaitingQueue().push(deferredResult);
202 } 199 }
203 200
204 return deferredResult; 201 return deferredResult;
205 }, 202 },
206 203
207 //----------------------------------------------------- 204 //-----------------------------------------------------
208 205
209 'renderTranslationHints': function () { 206 'renderTranslationHints': function () {
210 vartranslatableItems; 207 vartranslatableItems;
211 208
212 translatableItems = MochiKit.Selector.findChildElements(this.displayElement(), ['[stringID]']); 209 translatableItems = MochiKit.Selector.findChildElements(this.displayElement(), ['[stringID]']);
213 MochiKit.Iter.forEach(translatableItems, MochiKit.Base.method(this, 'enhanceTranslatableElement')) 210 MochiKit.Iter.forEach(translatableItems, MochiKit.Base.method(this, 'enhanceTranslatableElement'))
214 }, 211 },
215 212
216 'enhanceTranslatableElement': function (anElement) { 213 'enhanceTranslatableElement': function (anElement) {
217//Clipperz.log(">>> enhanceTranslatableElement", anElement); 214//Clipperz.log(">>> enhanceTranslatableElement", anElement);
218 // new Clipperz.PM.UI.Common.Components.TranslatorWidget({ 215 // new Clipperz.PM.UI.Common.Components.TranslatorWidget({
219 // 'element':anElement 216 // 'element':anElement
220 // }); 217 // });
221 218
222 MochiKit.Signal.connect(anElement, 'onmouseenter', MochiKit.Base.partial(Clipperz.PM.UI.Common.Components.TranslatorWidget.show, anElement, MochiKit.DOM.getNodeAttribute(anElement, 'stringID'))); 219 MochiKit.Signal.connect(anElement, 'onmouseenter', MochiKit.Base.partial(Clipperz.PM.UI.Common.Components.TranslatorWidget.show, anElement, MochiKit.DOM.getNodeAttribute(anElement, 'stringID')));
223 MochiKit.Signal.connect(anElement, 'onmouseleave', Clipperz.PM.UI.Common.Components.TranslatorWidget.hide); 220 MochiKit.Signal.connect(anElement, 'onmouseleave', Clipperz.PM.UI.Common.Components.TranslatorWidget.hide);
224//Clipperz.log("<<< enhanceTranslatableElement"); 221//Clipperz.log("<<< enhanceTranslatableElement");
225 }, 222 },
226 223
227 //----------------------------------------------------- 224 //-----------------------------------------------------
228 225
229 'update': function(args) { 226 'update': function(args) {
230 throw Clipperz.Base.exception.AbstractMethod; 227 throw Clipperz.Base.exception.AbstractMethod;
231 }, 228 },
232 229
233 'updateSelf': function(args) { 230 'updateSelf': function(args) {
234 throw Clipperz.Base.exception.AbstractMethod; 231 throw Clipperz.Base.exception.AbstractMethod;
235 }, 232 },
236 233
237 'updateComponents': function(args) { 234 'updateComponents': function(args) {
238 throw Clipperz.Base.exception.AbstractMethod; 235 throw Clipperz.Base.exception.AbstractMethod;
239 }, 236 },
240 237
241 //----------------------------------------------------- 238 //-----------------------------------------------------
242 239
243 'refresh': function() { 240 'refresh': function() {
244 throw Clipperz.Base.exception.AbstractMethod; 241 throw Clipperz.Base.exception.AbstractMethod;
245 }, 242 },
246 243
247 'refreshSelf': function() { 244 'refreshSelf': function() {
248 throw Clipperz.Base.exception.AbstractMethod; 245 throw Clipperz.Base.exception.AbstractMethod;
249 }, 246 },
250 247
251 'refreshComponents': function(args) { 248 'refreshComponents': function(args) {
252 throw Clipperz.Base.exception.AbstractMethod; 249 throw Clipperz.Base.exception.AbstractMethod;
253 }, 250 },
254 251
255 //----------------------------------------------------- 252 //-----------------------------------------------------
256 253
257 'checkSlotNamed': function(aSlotName) { 254 'checkSlotNamed': function(aSlotName) {
258 if (typeof(this._slots[aSlotName]) == 'undefined') { 255 if (typeof(this._slots[aSlotName]) == 'undefined') {
259 throw new Error("undefined slot"); 256 throw new Error("undefined slot");
260 }; 257 };
261 }, 258 },
262 259
263 //----------------------------------------------------- 260 //-----------------------------------------------------
264 261
265 'cachedSlots': function() { 262 'cachedSlots': function() {
266 return this._cachedSlots; 263 return this._cachedSlots;
267 }, 264 },
268 265
269 'slotNamed': function(aSlotName) { 266 'slotNamed': function(aSlotName) {
270 var result; 267 var result;
271 268
272 this.checkSlotNamed(aSlotName); 269 this.checkSlotNamed(aSlotName);
273 if (typeof(this.cachedSlots()[aSlotName]) == 'undefined') { 270 if (typeof(this.cachedSlots()[aSlotName]) == 'undefined') {
274 this.cachedSlots()[aSlotName] = new Clipperz.PM.UI.Common.Components.ComponentSlot(this,aSlotName); 271 this.cachedSlots()[aSlotName] = new Clipperz.PM.UI.Common.Components.ComponentSlot(this,aSlotName);
275 } 272 }
276 273
277 result = this.cachedSlots()[aSlotName]; 274 result = this.cachedSlots()[aSlotName];
278 275
279 return result; 276 return result;
280 }, 277 },
281 278
282 //----------------------------------------------------- 279 //-----------------------------------------------------
283 280
284 'elementForSlotNamed': function(aSlotName) { 281 'elementForSlotNamed': function(aSlotName) {
285 return MochiKit.DOM.getElement(this._slots[aSlotName]); 282 return MochiKit.DOM.getElement(this._slots[aSlotName]);
286 }, 283 },
287 284
288 //----------------------------------------------------- 285 //-----------------------------------------------------
289 286
290 'componentForSlotNamed': function(aSlotName) { 287 'componentForSlotNamed': function(aSlotName) {
291 return this.slotComponents()[aSlotName]; 288 return this.slotComponents()[aSlotName];
292 }, 289 },
293 290
294 'setComponentForSlotNamed': function(aComponent, aSlotName) { 291 'setComponentForSlotNamed': function(aComponent, aSlotName) {
295 var domNode; 292 var domNode;
296 293
297 this.checkSlotNamed(aSlotName); 294 this.checkSlotNamed(aSlotName);
298 295
299 if (this.slotComponents()[aSlotName] != null) { 296 if (this.slotComponents()[aSlotName] != null) {
300 this.slotComponents()[aSlotName].remove(); 297 this.slotComponents()[aSlotName].remove();
301 } 298 }
302 299
303 this.slotComponents()[aSlotName] = aComponent; 300 this.slotComponents()[aSlotName] = aComponent;
304 301
305 // domNode = MochiKit.DOM.getElement(this.slotNamed(aSlotName)); 302 // domNode = MochiKit.DOM.getElement(this.slotNamed(aSlotName));
306 domNode = this.elementForSlotNamed(aSlotName); 303 domNode = this.elementForSlotNamed(aSlotName);
307 304
308 if (domNode != null) { 305 if (domNode != null) {
309 aComponent.renderInNode(domNode); 306 aComponent.renderInNode(domNode);
310 } 307 }
311 }, 308 },
312 309
313 //----------------------------------------------------- 310 //-----------------------------------------------------
314/* 311/*
315 'purgeListeners': function() { 312 'purgeListeners': function() {
316//MochiKit.Logging.logDebug(">>> Clipperz.PM.UI.Common.Components.BaseComponent.purgeListeners [" + this + "]");
317//MochiKit.Logging.logDebug("--- " + this + ".purgeListeners");
318 Clipperz.NotificationCenter.unregister(this); 313 Clipperz.NotificationCenter.unregister(this);
319 MochiKit.Signal.disconnectAllTo(this); 314 MochiKit.Signal.disconnectAllTo(this);
320//MochiKit.Logging.logDebug("<<< Clipperz.PM.UI.Common.Components.BaseComponent.purgeListeners");
321 }, 315 },
322 */ 316 */
323 //----------------------------------------------------- 317 //-----------------------------------------------------
324 318
325 'clear': function() { 319 'clear': function() {
326 varslotName; 320 varslotName;
327 var componentId; 321 var componentId;
328 322
329 MochiKit.Signal.disconnectAllTo(this); 323 MochiKit.Signal.disconnectAllTo(this);
330 324
331 for (slotName in this.slotComponents()) { 325 for (slotName in this.slotComponents()) {
332 this.slotComponents()[slotName].clear(); 326 this.slotComponents()[slotName].clear();
333 } 327 }
334 328
335 for (componentId in this.components()) { 329 for (componentId in this.components()) {
336 this.components()[componentId].clear(); 330 this.components()[componentId].clear();
337 } 331 }
338 332
339 // if (this.element() != null) { 333 // if (this.element() != null) {
340 // this.element().innerHTML = ""; 334 // this.element().innerHTML = "";
341 // } 335 // }
342 336
343 if (this.displayElement() != null) { 337 if (this.displayElement() != null) {
344 if (this.element() != this.displayElement()) { 338 if (this.element() != this.displayElement()) {
345 MochiKit.DOM.removeElement(this.displayElement()); 339 MochiKit.DOM.removeElement(this.displayElement());
346 } else { 340 } else {
347 this.displayElement().innerHTML = ""; 341 this.displayElement().innerHTML = "";
348 } 342 }
349 } 343 }
350 344
351 if (this.isModal()) { 345 if (this.isModal()) {
352 //TODO: cleanup when the closed element was shown modally. 346 //TODO: cleanup when the closed element was shown modally.
353 } 347 }
354 }, 348 },
355 349
356 350
357 'remove': function() { 351 'remove': function() {
358 varslotName; 352 varslotName;
359 var componentId; 353 var componentId;
360 354
361 for (slotName in this.slotComponents()) { 355 for (slotName in this.slotComponents()) {
362 this.slotComponents()[slotName].remove(); 356 this.slotComponents()[slotName].remove();
363 delete this.slotComponents()[slotName]; 357 delete this.slotComponents()[slotName];
364 } 358 }
365 359
366 for (componentId in this.components()) { 360 for (componentId in this.components()) {
367 this.components()[componentId].remove(); 361 this.components()[componentId].remove();
368 delete this.components()[componentId]; 362 delete this.components()[componentId];
369 } 363 }
370 364
371 this.clear(); 365 this.clear();
372 MochiKit.Signal.disconnectAll(this); 366 MochiKit.Signal.disconnectAll(this);
373 }, 367 },
374 368
375 'append': function(aNode, aValue) { 369 'append': function(aNode, aValue) {
376 return Clipperz.DOM.Helper.append(aNode, aValue); 370 return Clipperz.DOM.Helper.append(aNode, aValue);
377 }, 371 },
378 372
379 'insertBefore': function (aNode, aValue) { 373 'insertBefore': function (aNode, aValue) {
380 return Clipperz.DOM.Helper.insertBefore(aNode, aValue); 374 return Clipperz.DOM.Helper.insertBefore(aNode, aValue);
381 }, 375 },
382 376
383 'insertAfter': function (aNode, aValue) { 377 'insertAfter': function (aNode, aValue) {
384 return Clipperz.DOM.Helper.insertAfter(aNode, aValue); 378 return Clipperz.DOM.Helper.insertAfter(aNode, aValue);
385 }, 379 },
386 380
387 //------------------------------------------------------------------------- 381 //-------------------------------------------------------------------------
388 382
389 'getId': function(aValue) { 383 'getId': function(aValue) {
390 varresult; 384 varresult;
391 385
392 if (typeof(aValue) != 'undefined') { 386 if (typeof(aValue) != 'undefined') {
393 result = this._ids[aValue]; 387 result = this._ids[aValue];
394 388
395 if (typeof(result) == 'undefined') { 389 if (typeof(result) == 'undefined') {
396 _Clipperz_PM_Components_base_id_ ++; 390 _Clipperz_PM_Components_base_id_ ++;
397 391
398 result = "Clipperz_PM_Components_" + aValue + "_" + _Clipperz_PM_Components_base_id_; 392 result = "Clipperz_PM_Components_" + aValue + "_" + _Clipperz_PM_Components_base_id_;
399 this._ids[aValue] = result; 393 this._ids[aValue] = result;
400 } 394 }
401 } else { 395 } else {
402 // result = Clipperz.PM.UI.Common.Components.BaseComponent.superclass.getId.call(this); 396 // result = Clipperz.PM.UI.Common.Components.BaseComponent.superclass.getId.call(this);
403 throw "call to BaseComponent.getId with an undefined value"; 397 throw "call to BaseComponent.getId with an undefined value";
404 } 398 }
405 399
406 return result; 400 return result;
407 }, 401 },
408 402
409 'getAnchor': function (aValue) { 403 'getAnchor': function (aValue) {
410 return '#' + this.getId(aValue); 404 return '#' + this.getId(aValue);
411 }, 405 },
412 406
413 //------------------------------------------------------------------------- 407 //-------------------------------------------------------------------------
414 408
415 'getElement': function(aValue) { 409 'getElement': function(aValue) {
416 return Clipperz.DOM.get(this.getId(aValue)); 410 return Clipperz.DOM.get(this.getId(aValue));
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js
index 1010c9d..1268118 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js
@@ -1,113 +1,111 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 25
28Clipperz.PM.UI.Common.Components.Button = function(args) { 26Clipperz.PM.UI.Common.Components.Button = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Common.Components.Button.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Common.Components.Button.superclass.constructor.apply(this, arguments);
32 30
33 this._element = args.element || Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._element = args.element || Clipperz.Base.exception.raise('MandatoryParameter');
34 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
35 this._isDefault = args.isDefault|| false; 33 this._isDefault = args.isDefault|| false;
36 34
37 this.render(); 35 this.render();
38 36
39 return this; 37 return this;
40} 38}
41 39
42//============================================================================= 40//=============================================================================
43 41
44Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Button, Clipperz.PM.UI.Common.Components.BaseComponent, { 42Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Button, Clipperz.PM.UI.Common.Components.BaseComponent, {
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'toString': function () { 46 'toString': function () {
49 return "Clipperz.PM.UI.Common.Components.Button component"; 47 return "Clipperz.PM.UI.Common.Components.Button component";
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'text': function () { 52 'text': function () {
55 return this._text; 53 return this._text;
56 }, 54 },
57 55
58 'isDefault': function () { 56 'isDefault': function () {
59 return this._isDefault; 57 return this._isDefault;
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'renderSelf': function () { 62 'renderSelf': function () {
65/* 63/*
66 this.append(this.element(), {tag:'div', id:this.getId('button'), cls:'button_wrapper', children:[ 64 this.append(this.element(), {tag:'div', id:this.getId('button'), cls:'button_wrapper', children:[
67 {tag:'div', id:this.getId('bodyWrapper'), cls:'button_bodyWrapper', children:[ 65 {tag:'div', id:this.getId('bodyWrapper'), cls:'button_bodyWrapper', children:[
68 {tag:'div', id:this.getId('body'), cls:'button_body', children:[ 66 {tag:'div', id:this.getId('body'), cls:'button_body', children:[
69 {tag:'span', html:this.text()} 67 {tag:'span', html:this.text()}
70 ]}, 68 ]},
71 {tag:'div', id:this.getId('footer'), cls:'button_footer'} 69 {tag:'div', id:this.getId('footer'), cls:'button_footer'}
72 ]} 70 ]}
73 ]}); 71 ]});
74*/ 72*/
75/* 73/*
76 this.append(this.element(), {tag:'div', id:this.getId('button'), cls:'button', children:[ 74 this.append(this.element(), {tag:'div', id:this.getId('button'), cls:'button', children:[
77 {tag:'span', html:this.text()} 75 {tag:'span', html:this.text()}
78 ]}); 76 ]});
79*/ 77*/
80 this.append(this.element(), {tag:'a', id:this.getId('button'), cls:'button', html:this.text()}); 78 this.append(this.element(), {tag:'a', id:this.getId('button'), cls:'button', html:this.text()});
81 79
82 if (this.isDefault()) { 80 if (this.isDefault()) {
83 MochiKit.DOM.addElementClass(this.getId('button'), 'default'); 81 MochiKit.DOM.addElementClass(this.getId('button'), 'default');
84 } 82 }
85 83
86 // MochiKit.Signal.connect(this.getId('button'), 'onmouseenter',this, 'handleOnMouseEnter'); 84 // MochiKit.Signal.connect(this.getId('button'), 'onmouseenter',this, 'handleOnMouseEnter');
87 // MochiKit.Signal.connect(this.getId('button'), 'onmouseleave',this, 'handleOnMouseLeave'); 85 // MochiKit.Signal.connect(this.getId('button'), 'onmouseleave',this, 'handleOnMouseLeave');
88 // MochiKit.Signal.connect(this.getId('button'), 'onmousedown',this, 'handleOnMouseDown'); 86 // MochiKit.Signal.connect(this.getId('button'), 'onmousedown',this, 'handleOnMouseDown');
89 MochiKit.Signal.connect(this.getId('button'), 'onclick', this, 'handleOnClick'); 87 MochiKit.Signal.connect(this.getId('button'), 'onclick', this, 'handleOnClick');
90 }, 88 },
91 89
92 //------------------------------------------------------------------------- 90 //-------------------------------------------------------------------------
93/* 91/*
94 'handleOnMouseEnter': function (anEvent) { 92 'handleOnMouseEnter': function (anEvent) {
95 MochiKit.DOM.addElementClass(this.getId('button'), 'hover'); 93 MochiKit.DOM.addElementClass(this.getId('button'), 'hover');
96 }, 94 },
97 95
98 'handleOnMouseLeave': function (anEvent) { 96 'handleOnMouseLeave': function (anEvent) {
99 MochiKit.DOM.removeElementClass(this.getId('button'), 'hover'); 97 MochiKit.DOM.removeElementClass(this.getId('button'), 'hover');
100 MochiKit.DOM.removeElementClass(this.getId('button'), 'clicked'); 98 MochiKit.DOM.removeElementClass(this.getId('button'), 'clicked');
101 }, 99 },
102 100
103 'handleOnMouseDown': function (anEvent) { 101 'handleOnMouseDown': function (anEvent) {
104 MochiKit.DOM.addElementClass(this.getId('button'), 'clicked'); 102 MochiKit.DOM.addElementClass(this.getId('button'), 'clicked');
105 }, 103 },
106 */ 104 */
107 'handleOnClick': function (anEvent) { 105 'handleOnClick': function (anEvent) {
108 MochiKit.Signal.signal(this, 'onclick', anEvent); 106 MochiKit.Signal.signal(this, 'onclick', anEvent);
109 }, 107 },
110 108
111 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
112 __syntaxFix__: "syntax fix" 110 __syntaxFix__: "syntax fix"
113}); 111});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js
index 7f56c1e..2f82359 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js
@@ -1,61 +1,59 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30 28
31Clipperz.PM.UI.Common.Components.ComponentSlot = function(aComponent, aSlotName) { 29Clipperz.PM.UI.Common.Components.ComponentSlot = function(aComponent, aSlotName) {
32 this._component = aComponent; 30 this._component = aComponent;
33 this._slotName = aSlotName; 31 this._slotName = aSlotName;
34 32
35 return this; 33 return this;
36} 34}
37 35
38//============================================================================= 36//=============================================================================
39 37
40Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.ComponentSlot, Object, { 38Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.ComponentSlot, Object, {
41 39
42 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
43 41
44 'slotName': function() { 42 'slotName': function() {
45 return this._slotName; 43 return this._slotName;
46 }, 44 },
47 45
48 'component': function() { 46 'component': function() {
49 return this._component; 47 return this._component;
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'setContent': function(aComponent) { 52 'setContent': function(aComponent) {
55 this.component().setComponentForSlotNamed(aComponent, this.slotName()); 53 this.component().setComponentForSlotNamed(aComponent, this.slotName());
56 }, 54 },
57 55
58 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
59 __syntaxFix__: "syntax fix" 57 __syntaxFix__: "syntax fix"
60 58
61}); 59});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js
index 2db2489..bf00ffc 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js
@@ -1,88 +1,86 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 25
28Clipperz.PM.UI.Common.Components.FaviconComponent = function(args) { 26Clipperz.PM.UI.Common.Components.FaviconComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Common.Components.FaviconComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Common.Components.FaviconComponent.superclass.constructor.apply(this, arguments);
32 30
33 this.render(); 31 this.render();
34 this.setSrc(args.src); 32 this.setSrc(args.src);
35 33
36 return this; 34 return this;
37} 35}
38 36
39//============================================================================= 37//=============================================================================
40 38
41Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.FaviconComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 39Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.FaviconComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
42 40
43 //------------------------------------------------------------------------- 41 //-------------------------------------------------------------------------
44 42
45 'toString': function () { 43 'toString': function () {
46 return "Clipperz.PM.UI.Common.Components.FaviconComponent component"; 44 return "Clipperz.PM.UI.Common.Components.FaviconComponent component";
47 }, 45 },
48 46
49 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
50 48
51 'src': function () { 49 'src': function () {
52 return this.element().src; 50 return this.element().src;
53 }, 51 },
54 52
55 'setSrc': function (aValue) { 53 'setSrc': function (aValue) {
56 this.element().src = (aValue || Clipperz.PM.Strings.getValue('defaultFaviconUrl')); 54 this.element().src = (aValue || Clipperz.PM.Strings.getValue('defaultFaviconUrl'));
57 }, 55 },
58 56
59 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
60 58
61 'clear': function () {}, 59 'clear': function () {},
62 60
63 //------------------------------------------------------------------------- 61 //-------------------------------------------------------------------------
64 62
65 'renderSelf': function () { 63 'renderSelf': function () {
66 MochiKit.Signal.connect(this.element(), 'onerror',this, 'setDefaultFavicon'); 64 MochiKit.Signal.connect(this.element(), 'onerror',this, 'setDefaultFavicon');
67 MochiKit.Signal.connect(this.element(), 'onabort',this, 'setDefaultFavicon'); 65 MochiKit.Signal.connect(this.element(), 'onabort',this, 'setDefaultFavicon');
68 MochiKit.Signal.connect(this.element(), 'onload',this, 'handleOnLoad'); 66 MochiKit.Signal.connect(this.element(), 'onload',this, 'handleOnLoad');
69 }, 67 },
70 68
71 //------------------------------------------------------------------------- 69 //-------------------------------------------------------------------------
72 70
73 'setDefaultFavicon': function (anEvent) { 71 'setDefaultFavicon': function (anEvent) {
74 MochiKit.Signal.disconnectAll(anEvent.src()); 72 MochiKit.Signal.disconnectAll(anEvent.src());
75 this.setSrc(null); 73 this.setSrc(null);
76 }, 74 },
77 75
78 'handleOnLoad': function (anEvent) { 76 'handleOnLoad': function (anEvent) {
79 MochiKit.Signal.disconnectAll(anEvent.src()); 77 MochiKit.Signal.disconnectAll(anEvent.src());
80//console.log("HANDLE ON LOAD", anEvent, anEvent.src().src); 78
81 if (anEvent.src().complete == false) { 79 if (anEvent.src().complete == false) {
82 this.setSrc(null); 80 this.setSrc(null);
83 } 81 }
84 }, 82 },
85 83
86 //------------------------------------------------------------------------- 84 //-------------------------------------------------------------------------
87 __syntaxFix__: "syntax fix" 85 __syntaxFix__: "syntax fix"
88}); 86});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js
index 2788b79..020290b 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js
@@ -1,161 +1,155 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 25
28Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar = function(args) { 26Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar.superclass.constructor.apply(this, arguments);
32 30
33 // this._openFromElement = args.openFromElement || null; 31 // this._openFromElement = args.openFromElement || null;
34 this._onOkCloseToElement = args.onOkCloseToElement || null; 32 this._onOkCloseToElement = args.onOkCloseToElement || null;
35 this._onCancelCloseToElement = args.onCancelCloseToElement|| null; 33 this._onCancelCloseToElement = args.onCancelCloseToElement|| null;
36 34
37 this._canCancelWhileProcessing= ((typeof(args.canCancelWhileProcessing) == 'undefined') ? true : args.canCancelWhileProcessing); 35 this._canCancelWhileProcessing= ((typeof(args.canCancelWhileProcessing) == 'undefined') ? true : args.canCancelWhileProcessing);
38 36
39 return this; 37 return this;
40} 38}
41 39
42//============================================================================= 40//=============================================================================
43 41
44Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, { 42Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, {
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'toString': function () { 46 'toString': function () {
49 return "Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar component"; 47 return "Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar component";
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53/* 51/*
54 'openFromElement': function () { 52 'openFromElement': function () {
55 return this._openFromElement; 53 return this._openFromElement;
56 }, 54 },
57*/ 55*/
58 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
59 57
60 'onOkCloseToElement': function () { 58 'onOkCloseToElement': function () {
61 return this._onOkCloseToElement; 59 return this._onOkCloseToElement;
62 }, 60 },
63 61
64 'setOnOkCloseToElement': function (anElement) { 62 'setOnOkCloseToElement': function (anElement) {
65 this._onOkCloseToElement = anElement; 63 this._onOkCloseToElement = anElement;
66 }, 64 },
67 65
68 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
69 67
70 'onCancelCloseToElement': function () { 68 'onCancelCloseToElement': function () {
71 return this._onCancelCloseToElement; 69 return this._onCancelCloseToElement;
72 }, 70 },
73 71
74 'setOnCancelCloseToElement': function (anElement) { 72 'setOnCancelCloseToElement': function (anElement) {
75 this._onCancelCloseToElement = anElement; 73 this._onCancelCloseToElement = anElement;
76 }, 74 },
77 75
78 //------------------------------------------------------------------------- 76 //-------------------------------------------------------------------------
79 77
80 'canCancelWhileProcessing': function () { 78 'canCancelWhileProcessing': function () {
81 return this._canCancelWhileProcessing; 79 return this._canCancelWhileProcessing;
82 }, 80 },
83 81
84 //------------------------------------------------------------------------- 82 //-------------------------------------------------------------------------
85 83
86 'deferredShowModal': function (someArgs, aResult) { 84 'deferredShowModal': function (someArgs, aResult) {
87 if (someArgs['onOkCloseToElement'] != null) { 85 if (someArgs['onOkCloseToElement'] != null) {
88 this.setOnOkCloseToElement(someArgs['onOkCloseToElement']); 86 this.setOnOkCloseToElement(someArgs['onOkCloseToElement']);
89 } 87 }
90 88
91 if (someArgs['onCancelCloseToElement'] != null) { 89 if (someArgs['onCancelCloseToElement'] != null) {
92 this.setOnCancelCloseToElement(someArgs['onCancelCloseToElement']); 90 this.setOnCancelCloseToElement(someArgs['onCancelCloseToElement']);
93 } 91 }
94 92
95 Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar.superclass.deferredShowModal.apply(this, arguments); 93 Clipperz.PM.UI.Common.Components.MessagePanelWithProgressBar.superclass.deferredShowModal.apply(this, arguments);
96 return this.deferred(); 94 return this.deferred();
97 }, 95 },
98 96
99 //------------------------------------------------------------------------- 97 //-------------------------------------------------------------------------
100 98
101 'showProgressBar': function () { 99 'showProgressBar': function () {
102 varprogressBarElement; 100 varprogressBarElement;
103 101
104 this.getElement('container').innerHTML = ''; 102 this.getElement('container').innerHTML = '';
105 103
106 progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'}); 104 progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'});
107 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement})); 105 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement}));
108 106
109 if (this.canCancelWhileProcessing() == true) { 107 if (this.canCancelWhileProcessing() == true) {
110 this.setButtons([{text:"Cancel", result:'CANCEL'}]); 108 this.setButtons([{text:"Cancel", result:'CANCEL'}]);
111 } else { 109 } else {
112 this.setButtons([]); 110 this.setButtons([]);
113 } 111 }
114 }, 112 },
115 113
116 //------------------------------------------------------------------------- 114 //-------------------------------------------------------------------------
117 115
118 'showFailure': function (someParameters) { 116 'showFailure': function (someParameters) {
119 // this.setType('ALERT'); 117 // this.setType('ALERT');
120 this.setType(someParameters['type']); 118 this.setType(someParameters['type']);
121 // this.setTitle("Login failed"); 119 // this.setTitle("Login failed");
122 this.setTitle(someParameters['title']); 120 this.setTitle(someParameters['title']);
123 // this.setText("Wrong passphrase; the unlock has failed."); 121 // this.setText("Wrong passphrase; the unlock has failed.");
124 this.setText(someParameters['text']); 122 this.setText(someParameters['text']);
125 // this.getElement('container').innerHTML = ''; 123 // this.getElement('container').innerHTML = '';
126 this.getElement('container').innerHTML = ''; 124 this.getElement('container').innerHTML = '';
127 // this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]); 125 // this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]);
128 this.setButtons(someParameters['buttons']); 126 this.setButtons(someParameters['buttons']);
129 }, 127 },
130 128
131 //------------------------------------------------------------------------- 129 //-------------------------------------------------------------------------
132 130
133 'closeOk': function () { 131 'closeOk': function () {
134//console.log("=== closeOk");
135 this.showProgressBar(); 132 this.showProgressBar();
136 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback')); 133 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback'));
137 this._deferred = null; 134 this._deferred = null;
138 }, 135 },
139 136
140 'closeCancel': function () { 137 'closeCancel': function () {
141//console.log("=== closeCancel");
142 this.deferredHideModal({closeToElement:this.onCancelCloseToElement()}); 138 this.deferredHideModal({closeToElement:this.onCancelCloseToElement()});
143 this.deferred().cancel(); 139 this.deferred().cancel();
144 this._deferred = null; 140 this._deferred = null;
145 }, 141 },
146 142
147 //------------------------------------------------------------------------- 143 //-------------------------------------------------------------------------
148 144
149 'deferredDone': function () { 145 'deferredDone': function () {
150//console.log("=== deferredDone");
151 return this.deferredHideModal({closeToElement:this.onOkCloseToElement()}); 146 return this.deferredHideModal({closeToElement:this.onOkCloseToElement()});
152 }, 147 },
153 148
154 'deferredError': function (someParameters) { 149 'deferredError': function (someParameters) {
155//console.log("=== deferredError");
156 this.showFailure(someParameters); 150 this.showFailure(someParameters);
157 }, 151 },
158 152
159 //------------------------------------------------------------------------- 153 //-------------------------------------------------------------------------
160 __syntaxFix__: "syntax fix" 154 __syntaxFix__: "syntax fix"
161}); 155});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js
index 089e3d4..78e8c9b 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js
@@ -1,137 +1,122 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 25
28Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay = function(anElement, args) { 26Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay = function(anElement, args) {
29 args = args || {}; 27 args = args || {};
30 28
31//MochiKit.Logging.logDebug(">>> new TextFormField");
32 Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay.superclass.constructor.call(this, anElement, args); 29 Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay.superclass.constructor.call(this, anElement, args);
33 30
34 this._wrapperElement = null; 31 this._wrapperElement = null;
35 this._entropyElement = null; 32 this._entropyElement = null;
36 33
37 this.render(); 34 this.render();
38//MochiKit.Logging.logDebug("<<< new TextFormField");
39 35
40 return this; 36 return this;
41}; 37};
42 38
43Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay, Clipperz.PM.UI.Common.Components.BaseComponent, { 39Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay, Clipperz.PM.UI.Common.Components.BaseComponent, {
44 40
45 'toString': function() { 41 'toString': function() {
46 return "Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay"; 42 return "Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay";
47 }, 43 },
48 44
49 //----------------------------------------------------- 45 //-----------------------------------------------------
50 46
51 'wrapperElement': function() { 47 'wrapperElement': function() {
52 return this._wrapperElement; 48 return this._wrapperElement;
53 }, 49 },
54 50
55 'setWrapperElement': function(aValue) { 51 'setWrapperElement': function(aValue) {
56 this._wrapperElement = aValue; 52 this._wrapperElement = aValue;
57 }, 53 },
58 54
59 //----------------------------------------------------- 55 //-----------------------------------------------------
60 56
61 'passwordElement': function() { 57 'passwordElement': function() {
62 return this.element(); 58 return this.element();
63 }, 59 },
64 60
65 //----------------------------------------------------- 61 //-----------------------------------------------------
66 62
67 'entropyElement': function() { 63 'entropyElement': function() {
68 return this._entropyElement; 64 return this._entropyElement;
69 }, 65 },
70 66
71 'setEntropyElement': function(aValue) { 67 'setEntropyElement': function(aValue) {
72 this._entropyElement = aValue; 68 this._entropyElement = aValue;
73 }, 69 },
74 70
75 //----------------------------------------------------- 71 //-----------------------------------------------------
76 72
77 'render': function() { 73 'render': function() {
78/* 74/*
79 MochiKit.Signal.disconnectAllTo(this); 75 MochiKit.Signal.disconnectAllTo(this);
80 76
81 this.setWrapperElement(this.element().wrap({tag:'div'})); 77 this.setWrapperElement(this.element().wrap({tag:'div'}));
82 this.setEntropyElement(Clipperz.DOM.Helper.append(this.wrapperElement().dom, {tag:'div', cls:'passwordEntropy', html:"&nbsp;"}, true)); 78 this.setEntropyElement(Clipperz.DOM.Helper.append(this.wrapperElement().dom, {tag:'div', cls:'passwordEntropy', html:"&nbsp;"}, true));
83 // this.setEntropyElement(Clipperz.DOM.Helper.insertBefore(this.element(), {tag:'div', cls:'passwordEntropy', html:"&nbsp;"}, true)); 79 // this.setEntropyElement(Clipperz.DOM.Helper.insertBefore(this.element(), {tag:'div', cls:'passwordEntropy', html:"&nbsp;"}, true));
84 this.entropyElement().wrap({tag:'div', cls:'passwordEntropyWrapper'}); 80 this.entropyElement().wrap({tag:'div', cls:'passwordEntropyWrapper'});
85 81
86 this.updateEntropyElement(); 82 this.updateEntropyElement();
87 83
88 this.connect('onkeyup', 'updateEntropyElement'); 84 this.connect('onkeyup', 'updateEntropyElement');
89 this.connect('onchange', 'updateEntropyElement'); 85 this.connect('onchange', 'updateEntropyElement');
90 this.connect('onblur', 'updateEntropyElement'); 86 this.connect('onblur', 'updateEntropyElement');
91*/ 87*/
92 MochiKit.Signal.disconnectAllTo(this); 88 MochiKit.Signal.disconnectAllTo(this);
93 89
94 this.setEntropyElement(this.element()); 90 this.setEntropyElement(this.element());
95 this.entropyElement().addClass("entropyLevelIndicator"); 91 this.entropyElement().addClass("entropyLevelIndicator");
96 92
97 this.updateEntropyElement(); 93 this.updateEntropyElement();
98 94
99 this.connect('onkeyup', 'updateEntropyElement'); 95 this.connect('onkeyup', 'updateEntropyElement');
100 this.connect('onchange', 'updateEntropyElement'); 96 this.connect('onchange', 'updateEntropyElement');
101 this.connect('onblur', 'updateEntropyElement'); 97 this.connect('onblur', 'updateEntropyElement');
102 }, 98 },
103 99
104 //----------------------------------------------------- 100 //-----------------------------------------------------
105 101
106 'computeEntropyForString': function(aValue) { 102 'computeEntropyForString': function(aValue) {
107 return Clipperz.PM.Crypto.passwordEntropy(aValue); 103 return Clipperz.PM.Crypto.passwordEntropy(aValue);
108 }, 104 },
109 105
110 //----------------------------------------------------- 106 //-----------------------------------------------------
111 107
112 'updateEntropyElement': function(anEvent) { 108 'updateEntropyElement': function(anEvent) {
113/*
114//MochiKit.Logging.logDebug(">>> PasswordEntropyDisplay.updateEntropyElement");
115 varmaxExtent;
116 varentropy;
117
118 entropy = Math.min(128, this.computeEntropyForString(this.passwordElement().dom.value));
119//MochiKit.Logging.logDebug("--- PasswordEntropyDisplay.updateEntropyElement - entropy: " + entropy);
120 this.entropyElement().setStyle('background-position', "0px " + -entropy + "px");
121 this.entropyElement().setWidth(this.passwordElement().getWidth() * (entropy/128));
122//MochiKit.Logging.logDebug("<<< PasswordEntropyDisplay.updateEntropyElement");
123*/
124 varentropy; 109 varentropy;
125 110
126 entropy = Math.min(128, this.computeEntropyForString(this.passwordElement().dom.value)); 111 entropy = Math.min(128, this.computeEntropyForString(this.passwordElement().dom.value));
127 112
128 if (entropy == 0) { 113 if (entropy == 0) {
129 this.entropyElement().setStyle('background-position', "0px 26px"); 114 this.entropyElement().setStyle('background-position', "0px 26px");
130 } else { 115 } else {
131 this.entropyElement().setStyle('background-position', "0px -" + (128-entropy)*26 + "px"); 116 this.entropyElement().setStyle('background-position', "0px -" + (128-entropy)*26 + "px");
132 } 117 }
133 }, 118 },
134 119
135 //----------------------------------------------------- 120 //-----------------------------------------------------
136 __syntaxFix__: '__syntaxFix__' 121 __syntaxFix__: '__syntaxFix__'
137}); 122});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js
index 5991530..6638008 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js
@@ -1,70 +1,68 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 25
28Clipperz.PM.UI.Common.Components.ProgressBar = function(args) { 26Clipperz.PM.UI.Common.Components.ProgressBar = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Common.Components.ProgressBar.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Common.Components.ProgressBar.superclass.constructor.apply(this, arguments);
32 30
33 this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter');
34 32
35 this.renderSelf(); 33 this.renderSelf();
36 34
37 MochiKit.Signal.connect(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', this, 'updateProgressHandler') 35 MochiKit.Signal.connect(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', this, 'updateProgressHandler')
38 36
39 return this; 37 return this;
40} 38}
41 39
42//============================================================================= 40//=============================================================================
43 41
44Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.ProgressBar, Clipperz.PM.UI.Common.Components.BaseComponent, { 42Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.ProgressBar, Clipperz.PM.UI.Common.Components.BaseComponent, {
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'toString': function () { 46 'toString': function () {
49 return "Clipperz.PM.UI.Common.Components.ProgressBar component"; 47 return "Clipperz.PM.UI.Common.Components.ProgressBar component";
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'renderSelf': function() { 52 'renderSelf': function() {
55 this.append(this.element(), {tag:'div', cls:'loadingBar', children:[ 53 this.append(this.element(), {tag:'div', cls:'loadingBar', children:[
56 {tag:'div', cls:'loadingBarProgressBox', children:[ 54 {tag:'div', cls:'loadingBarProgressBox', children:[
57 {tag:'div', id:this.getId('loadingBarProgress'), cls:'loadingBarProgress'} 55 {tag:'div', id:this.getId('loadingBarProgress'), cls:'loadingBarProgress'}
58 ]} 56 ]}
59 ]}); 57 ]});
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'updateProgressHandler': function (anEvent) { 62 'updateProgressHandler': function (anEvent) {
65 MochiKit.Style.setElementDimensions(this.getId('loadingBarProgress'), {w:anEvent}, '%'); 63 MochiKit.Style.setElementDimensions(this.getId('loadingBarProgress'), {w:anEvent}, '%');
66 }, 64 },
67 65
68 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
69 __syntaxFix__: "syntax fix" 67 __syntaxFix__: "syntax fix"
70}); 68});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js
index 1d816a9..8c98811 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Common.Components.SimpleMessagePanel = function(args) { 26Clipperz.PM.UI.Common.Components.SimpleMessagePanel = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Common.Components.SimpleMessagePanel.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Common.Components.SimpleMessagePanel.superclass.constructor.apply(this, arguments);
32 30
33 this._title = args.title || Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._title = args.title || Clipperz.Base.exception.raise('MandatoryParameter');
34 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
35 this._type = args.type || Clipperz.Base.exception.raise('MandatoryParameter'); //ALERT, INFO, ERROR 33 this._type = args.type || Clipperz.Base.exception.raise('MandatoryParameter'); //ALERT, INFO, ERROR
36 this._buttons = args.buttons || Clipperz.Base.exception.raise('MandatoryParameter'); 34 this._buttons = args.buttons || Clipperz.Base.exception.raise('MandatoryParameter');
37 35
38 this._buttonComponents = []; 36 this._buttonComponents = [];
39 this._deferred = null; 37 this._deferred = null;
40 38
41 this.renderModalMask(); 39 this.renderModalMask();
42 40
43 return this; 41 return this;
44} 42}
45 43
46//============================================================================= 44//=============================================================================
47 45
48Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.SimpleMessagePanel, Clipperz.PM.UI.Common.Components.BaseComponent, { 46Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.SimpleMessagePanel, Clipperz.PM.UI.Common.Components.BaseComponent, {
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'toString': function () { 50 'toString': function () {
53 return "Clipperz.PM.UI.Common.Components.SimpleMessagePanel component"; 51 return "Clipperz.PM.UI.Common.Components.SimpleMessagePanel component";
54 }, 52 },
55 53
56 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
57 55
58 'deferred': function() { 56 'deferred': function() {
59 if (this._deferred == null) { 57 if (this._deferred == null) {
60 this._deferred = new Clipperz.Async.Deferred("SimpleMessagePanel.deferred", {trace:false}); 58 this._deferred = new Clipperz.Async.Deferred("SimpleMessagePanel.deferred", {trace:false});
61 } 59 }
62 60
63 return this._deferred; 61 return this._deferred;
64 }, 62 },
65 63
66 //------------------------------------------------------------------------- 64 //-------------------------------------------------------------------------
67 65
68 'title': function () { 66 'title': function () {
69 return this._title; 67 return this._title;
70 }, 68 },
71 69
72 'setTitle': function (aValue) { 70 'setTitle': function (aValue) {
73 this._title = aValue; 71 this._title = aValue;
74 72
75 if (this.getElement('title') != null) { 73 if (this.getElement('title') != null) {
76 this.getElement('title').innerHTML = aValue; 74 this.getElement('title').innerHTML = aValue;
77 } 75 }
78 }, 76 },
79 77
80 //------------------------------------------------------------------------- 78 //-------------------------------------------------------------------------
81 79
82 'text': function () { 80 'text': function () {
83 return this._text; 81 return this._text;
84 }, 82 },
85 83
86 'setText': function (aValue) { 84 'setText': function (aValue) {
87 this._text = aValue; 85 this._text = aValue;
88 86
89 if (this.getElement('text') != null) { 87 if (this.getElement('text') != null) {
90 this.getElement('text').innerHTML = aValue; 88 this.getElement('text').innerHTML = aValue;
91 } 89 }
92 }, 90 },
93 91
94 //------------------------------------------------------------------------- 92 //-------------------------------------------------------------------------
95 93
96 'type': function () { 94 'type': function () {
97 return this._type; 95 return this._type;
98 }, 96 },
99 97
100 'setType': function (aValue) { 98 'setType': function (aValue) {
101 // if (this.getElement('icon') != null) { 99 // if (this.getElement('icon') != null) {
102 // MochiKit.DOM.removeElementClass(this.getId('icon'), this._type); 100 // MochiKit.DOM.removeElementClass(this.getId('icon'), this._type);
103 // MochiKit.DOM.addElementClass(this.getId('icon'), aValue); 101 // MochiKit.DOM.addElementClass(this.getId('icon'), aValue);
104 // } 102 // }
105 103
106 this._type = aValue; 104 this._type = aValue;
107 }, 105 },
108 106
109 'icon': function () { 107 'icon': function () {
110 var type = this.type(); 108 var type = this.type();
111 var result; 109 var result;
112 110
113 if (type == 'ALERT') { 111 if (type == 'ALERT') {
114 result = '!'; 112 result = '!';
115 } else if (type == 'INFO') { 113 } else if (type == 'INFO') {
116 result = 'i'; 114 result = 'i';
117 } else if (type == 'ERROR') { 115 } else if (type == 'ERROR') {
118 result = '!'; 116 result = '!';
@@ -125,173 +123,165 @@ Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.SimpleMessagePanel, Clippe
125 123
126 'buttons': function () { 124 'buttons': function () {
127 return this._buttons; 125 return this._buttons;
128 }, 126 },
129 127
130 'setButtons': function (someValues) { 128 'setButtons': function (someValues) {
131 MochiKit.Iter.forEach(this.buttonComponents(), MochiKit.Base.methodcaller('clear')); 129 MochiKit.Iter.forEach(this.buttonComponents(), MochiKit.Base.methodcaller('clear'));
132 130
133 this._buttons = someValues; 131 this._buttons = someValues;
134 132
135 if (this.getElement('buttonArea') != null) { 133 if (this.getElement('buttonArea') != null) {
136 this.renderButtons(); 134 this.renderButtons();
137 } 135 }
138 }, 136 },
139 137
140 //......................................................................... 138 //.........................................................................
141 139
142 'buttonComponents': function () { 140 'buttonComponents': function () {
143 return this._buttonComponents; 141 return this._buttonComponents;
144 }, 142 },
145 143
146 //------------------------------------------------------------------------- 144 //-------------------------------------------------------------------------
147 145
148 'renderSelf': function() { 146 'renderSelf': function() {
149 this.append(this.element(), {tag:'div', cls:'SimpleMessagePanel', id:this.getId('panel'), children: [ 147 this.append(this.element(), {tag:'div', cls:'SimpleMessagePanel', id:this.getId('panel'), children: [
150 // {tag:'div', cls:'header', children:[]}, 148 // {tag:'div', cls:'header', children:[]},
151 {tag:'div', cls:'body', children:[ 149 {tag:'div', cls:'body', children:[
152 // {tag:'div', id:this.getId('icon'),cls:'img ' + this.type(), children:[{tag:'div'}]}, 150 // {tag:'div', id:this.getId('icon'),cls:'img ' + this.type(), children:[{tag:'div'}]},
153 {tag:'div', /*id:this.getId('icon'),*/cls:'img ' + this.type(), children:[{tag:'canvas', id:this.getId('icon')}]}, 151 {tag:'div', /*id:this.getId('icon'),*/cls:'img ' + this.type(), children:[{tag:'canvas', id:this.getId('icon')}]},
154 {tag:'h3', id:this.getId('title'),html:this.title()}, 152 {tag:'h3', id:this.getId('title'),html:this.title()},
155 {tag:'p', id:this.getId('text'),html:this.text()}, 153 {tag:'p', id:this.getId('text'),html:this.text()},
156 {tag:'div', id:this.getId('container')}, 154 {tag:'div', id:this.getId('container')},
157 {tag:'div', id:this.getId('buttonArea'), cls:'buttonArea', children:[]} 155 {tag:'div', id:this.getId('buttonArea'), cls:'buttonArea', children:[]}
158 ]} 156 ]}
159 // {tag:'div', cls:'footer', children:[]} 157 // {tag:'div', cls:'footer', children:[]}
160 ]}); 158 ]});
161 159
162 Clipperz.PM.UI.Canvas.marks[this.icon()](this.getElement('icon'), "#ffffff"); 160 Clipperz.PM.UI.Canvas.marks[this.icon()](this.getElement('icon'), "#ffffff");
163 161
164 MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'keyDownHandler'); 162 MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'keyDownHandler');
165 163
166 this.renderButtons(); 164 this.renderButtons();
167 }, 165 },
168 166
169 //------------------------------------------------------------------------- 167 //-------------------------------------------------------------------------
170 168
171 'renderButtons': function () { 169 'renderButtons': function () {
172 this.getElement('buttonArea').innerHTML = ''; 170 this.getElement('buttonArea').innerHTML = '';
173 171
174 MochiKit.Base.map(MochiKit.Base.bind(function (aButton) { 172 MochiKit.Base.map(MochiKit.Base.bind(function (aButton) {
175 var buttonElement; 173 var buttonElement;
176 var buttonComponent; 174 var buttonComponent;
177 175
178 // element = this.append(this.getElement('buttonArea'), {tag:'div', cls:'button' + (aButton['isDefault'] === true ? ' default' : ''), children:[ 176 // element = this.append(this.getElement('buttonArea'), {tag:'div', cls:'button' + (aButton['isDefault'] === true ? ' default' : ''), children:[
179 // {tag:'a', href:'#'/*, id:this.getId('buttonLink')*/, html:aButton['text']} 177 // {tag:'a', href:'#'/*, id:this.getId('buttonLink')*/, html:aButton['text']}
180 // ]}); 178 // ]});
181 179
182 buttonElement = this.append(this.getElement('buttonArea'), {tag:'div'}); 180 buttonElement = this.append(this.getElement('buttonArea'), {tag:'div'});
183 buttonComponent = new Clipperz.PM.UI.Common.Components.Button({'element':buttonElement, 'text':aButton['text'], 'isDefault':aButton['isDefault']}); 181 buttonComponent = new Clipperz.PM.UI.Common.Components.Button({'element':buttonElement, 'text':aButton['text'], 'isDefault':aButton['isDefault']});
184 this.buttonComponents().push(buttonComponent); 182 this.buttonComponents().push(buttonComponent);
185 183
186 MochiKit.Signal.connect(buttonComponent, 'onclick', MochiKit.Base.method(this, 'buttonEventHandler', aButton)); 184 MochiKit.Signal.connect(buttonComponent, 'onclick', MochiKit.Base.method(this, 'buttonEventHandler', aButton));
187 }, this), MochiKit.Iter.reversed(this.buttons())); 185 }, this), MochiKit.Iter.reversed(this.buttons()));
188 }, 186 },
189 187
190 //------------------------------------------------------------------------- 188 //-------------------------------------------------------------------------
191 189
192 'displayElement': function() { 190 'displayElement': function() {
193 return this.getElement('panel'); 191 return this.getElement('panel');
194 }, 192 },
195 193
196 //------------------------------------------------------------------------- 194 //-------------------------------------------------------------------------
197 195
198 'closeOk': function () { 196 'closeOk': function () {
199 this.deferred().callback(); 197 this.deferred().callback();
200 this._deferred = null; 198 this._deferred = null;
201 }, 199 },
202 200
203 'closeCancel': function () { 201 'closeCancel': function () {
204 this.deferred().cancel(); 202 this.deferred().cancel();
205 this._deferred = null; 203 this._deferred = null;
206 }, 204 },
207 205
208 'closeError': function () { 206 'closeError': function () {
209 this.deferred().errback(); 207 this.deferred().errback();
210 this._deferred = null; 208 this._deferred = null;
211 }, 209 },
212 210
213 //------------------------------------------------------------------------- 211 //-------------------------------------------------------------------------
214 212
215 'buttonEventHandler': function(aButton, anEvent) { 213 'buttonEventHandler': function(aButton, anEvent) {
216 anEvent.preventDefault(); 214 anEvent.preventDefault();
217 215
218 // MochiKit.Signal.signal(this, 'cancelEvent'); 216 // MochiKit.Signal.signal(this, 'cancelEvent');
219 switch (aButton['result']) { 217 switch (aButton['result']) {
220 case 'OK': 218 case 'OK':
221//console.log("==> OK");
222 this.closeOk(); 219 this.closeOk();
223 break; 220 break;
224 case 'CANCEL': 221 case 'CANCEL':
225//console.log("==> CANCEL");
226 this.closeCancel(); 222 this.closeCancel();
227 break; 223 break;
228 default: 224 default:
229//console.log("==> ????");
230 this.closeError(); 225 this.closeError();
231 break; 226 break;
232 } 227 }
233//console.log("<==");
234 }, 228 },
235 229
236 //------------------------------------------------------------------------- 230 //-------------------------------------------------------------------------
237 231
238 'deferredShow': function (someArgs, aResult) { 232 'deferredShow': function (someArgs, aResult) {
239 this.deferredShowModal(someArgs); 233 this.deferredShowModal(someArgs);
240 234
241 this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement }); 235 this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement });
242 this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement })); 236 this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement }));
243 this.deferred().addCallback(MochiKit.Async.succeed, aResult); 237 this.deferred().addCallback(MochiKit.Async.succeed, aResult);
244 238
245 return this.deferred(); 239 return this.deferred();
246 }, 240 },
247 241
248 //------------------------------------------------------------------------- 242 //-------------------------------------------------------------------------
249 243
250 'modalDialogMask': function () { 244 'modalDialogMask': function () {
251 return this.getId('modalDialogMask'); 245 return this.getId('modalDialogMask');
252 }, 246 },
253 247
254 'modalDialog': function () { 248 'modalDialog': function () {
255 return this.getId('modalDialog'); 249 return this.getId('modalDialog');
256 }, 250 },
257 251
258 'modalDialogFrame': function() { 252 'modalDialogFrame': function() {
259 return this.getId('modalDialogFrame'); 253 return this.getId('modalDialogFrame');
260 }, 254 },
261 255
262 //------------------------------------------------------------------------- 256 //-------------------------------------------------------------------------
263 257
264 'renderModalMask': function () { 258 'renderModalMask': function () {
265 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, 259 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body,
266 {tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper simpleMessagePanelMask', children:[ 260 {tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper simpleMessagePanelMask', children:[
267 {tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask simpleMessagePanelMask'}, 261 {tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask simpleMessagePanelMask'},
268 {tag:'div', id:this.getId('modalDialogFrame'), cls:'modalDialogFrame simpleMessagePanelMask'}, 262 {tag:'div', id:this.getId('modalDialogFrame'), cls:'modalDialogFrame simpleMessagePanelMask'},
269 {tag:'div', id:this.getId('modalDialog'), cls:'modalDialog simpleMessagePanelMask'} 263 {tag:'div', id:this.getId('modalDialog'), cls:'modalDialog simpleMessagePanelMask'}
270 ]} 264 ]}
271 ); 265 );
272 266
273 MochiKit.Style.hideElement(this.getId('modalDialogMask')); 267 MochiKit.Style.hideElement(this.getId('modalDialogMask'));
274 MochiKit.Style.hideElement(this.getId('modalDialogFrame')); 268 MochiKit.Style.hideElement(this.getId('modalDialogFrame'));
275 }, 269 },
276 270
277 //------------------------------------------------------------------------- 271 //-------------------------------------------------------------------------
278 272
279 'keyDownHandler': function (anEvent) { 273 'keyDownHandler': function (anEvent) {
280 if (anEvent.key().string == 'KEY_ENTER') { 274 if (anEvent.key().string == 'KEY_ENTER') {
281 anEvent.preventDefault(); 275 anEvent.preventDefault();
282//console.log("13 - RETURN ?", this);
283 this.closeOk(); 276 this.closeOk();
284//console.log('<<< 13')
285 } 277 }
286 278
287 if (anEvent.key().string == 'KEY_ESCAPE') { 279 if (anEvent.key().string == 'KEY_ESCAPE') {
288 anEvent.preventDefault(); 280 anEvent.preventDefault();
289//console.log("27 - ESC ?", this);
290 this.closeCancel(); 281 this.closeCancel();
291//console.log("<<< 27");
292 } 282 }
293 }, 283 },
294 284
295 //------------------------------------------------------------------------- 285 //-------------------------------------------------------------------------
296 __syntaxFix__: "syntax fix" 286 __syntaxFix__: "syntax fix"
297}); 287});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js
index 936514a..1e2a690 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js
@@ -1,66 +1,64 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 25
28Clipperz.PM.UI.Common.Components.TabPanelComponent = function(args) { 26Clipperz.PM.UI.Common.Components.TabPanelComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 Clipperz.PM.UI.Common.Components.TabPanelComponent.superclass.constructor.call(this, args); 28 Clipperz.PM.UI.Common.Components.TabPanelComponent.superclass.constructor.call(this, args);
31 29
32 this._tabPanelController = null; 30 this._tabPanelController = null;
33 31
34 return this; 32 return this;
35} 33}
36 34
37//============================================================================= 35//=============================================================================
38 36
39Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.TabPanelComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 37Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.TabPanelComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
40 38
41 'toString': function () { 39 'toString': function () {
42 return "Clipperz.PM.UI.Common.Components.TabPanelComponent component"; 40 return "Clipperz.PM.UI.Common.Components.TabPanelComponent component";
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'tabPanelControllerConfiguration': function() { 45 'tabPanelControllerConfiguration': function() {
48 return this._tabPanelControllerConfiguration; 46 return this._tabPanelControllerConfiguration;
49 }, 47 },
50 48
51 'tabPanelController': function() { 49 'tabPanelController': function() {
52 if (this._tabPanelController == null) { 50 if (this._tabPanelController == null) {
53 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({component:this, configuration:this.tabPanelControllerConfiguration()}); 51 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({component:this, configuration:this.tabPanelControllerConfiguration()});
54 } 52 }
55 53
56 return this._tabPanelController; 54 return this._tabPanelController;
57 }, 55 },
58 56
59 'initiallySelectedTab': function() { 57 'initiallySelectedTab': function() {
60 return this._initiallySelectedTab; 58 return this._initiallySelectedTab;
61 }, 59 },
62 60
63 //------------------------------------------------------------------------- 61 //-------------------------------------------------------------------------
64 __syntaxFix__: "syntax fix" 62 __syntaxFix__: "syntax fix"
65 63
66}); 64});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js
index 8df7e0e..6517d2a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js
@@ -1,214 +1,205 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 25
28Clipperz.PM.UI.Common.Components.Tooltip = function(args) { 26Clipperz.PM.UI.Common.Components.Tooltip = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Common.Components.Tooltip.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Common.Components.Tooltip.superclass.constructor.apply(this, arguments);
32 30
33 this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter');
34 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
35 this._position = args.position || 'BELOW'; //'BELOW', 'ABOVE', 'LEFT', 'RIGHT' 33 this._position = args.position || 'BELOW'; //'BELOW', 'ABOVE', 'LEFT', 'RIGHT'
36 34
37 this._boxDimensions = null; 35 this._boxDimensions = null;
38 this._enabled = (typeof(args.enabled) == 'undefined' ? true : args.enabled); 36 this._enabled = (typeof(args.enabled) == 'undefined' ? true : args.enabled);
39 this._isVisible = false; 37 this._isVisible = false;
40 38
41 this.renderSelf(); 39 this.renderSelf();
42 40
43 return this; 41 return this;
44} 42}
45 43
46//============================================================================= 44//=============================================================================
47 45
48Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Tooltip, Clipperz.PM.UI.Common.Components.BaseComponent, { 46Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.Tooltip, Clipperz.PM.UI.Common.Components.BaseComponent, {
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'toString': function () { 50 'toString': function () {
53 return "Clipperz.PM.UI.Common.Components.Tooltip component"; 51 return "Clipperz.PM.UI.Common.Components.Tooltip component";
54 }, 52 },
55 53
56 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
57 55
58 'text': function () { 56 'text': function () {
59 return this._text; 57 return this._text;
60 }, 58 },
61 59
62 'setText': function (aValue) { 60 'setText': function (aValue) {
63 this._text = aValue; 61 this._text = aValue;
64 }, 62 },
65 63
66 //------------------------------------------------------------------------- 64 //-------------------------------------------------------------------------
67 65
68 'position': function () { 66 'position': function () {
69 return this._position; 67 return this._position;
70 }, 68 },
71 69
72 'setPosition': function (aValue) { 70 'setPosition': function (aValue) {
73 this._position = aValue; 71 this._position = aValue;
74 }, 72 },
75 73
76 //------------------------------------------------------------------------- 74 //-------------------------------------------------------------------------
77 75
78 'enabled': function () { 76 'enabled': function () {
79 return this._enabled; 77 return this._enabled;
80 }, 78 },
81 79
82 'setIsEnabled': function (aValue) { 80 'setIsEnabled': function (aValue) {
83 this._enabled = aValue; 81 this._enabled = aValue;
84 }, 82 },
85 83
86 //------------------------------------------------------------------------- 84 //-------------------------------------------------------------------------
87 85
88 'isVisible': function () { 86 'isVisible': function () {
89 return this._isVisible; 87 return this._isVisible;
90 }, 88 },
91 89
92 'setIsVisible': function (aValue) { 90 'setIsVisible': function (aValue) {
93 this._isVisible = aValue; 91 this._isVisible = aValue;
94 }, 92 },
95 93
96 //------------------------------------------------------------------------- 94 //-------------------------------------------------------------------------
97 95
98 'renderSelf': function() { 96 'renderSelf': function() {
99 // this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[ 97 // this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
100 // this.append(MochiKit.DOM.currentDocument().body, {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[ 98 // this.append(MochiKit.DOM.currentDocument().body, {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
101 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[ 99 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
102 {tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[ 100 {tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[
103 {tag:'div', cls:'tooltip_text', children:[ 101 {tag:'div', cls:'tooltip_text', children:[
104 {tag:'span', html:this.text()} 102 {tag:'span', html:this.text()}
105 ]}//, 103 ]}//,
106 // {tag:'div', id:this.getId('footer'), cls:'tooltip_footer'} 104 // {tag:'div', id:this.getId('footer'), cls:'tooltip_footer'}
107 ]}, 105 ]},
108 {tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'} 106 {tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'}
109 ]}); 107 ]});
110 108
111 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body')); 109 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
112 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h; 110 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
113 111
114 MochiKit.Style.hideElement(this.displayElement()); 112 MochiKit.Style.hideElement(this.displayElement());
115 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show'); 113 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
116 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide'); 114 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
117 }, 115 },
118 116
119 //----------------------------------------------------- 117 //-----------------------------------------------------
120 118
121 'displayElement': function() { 119 'displayElement': function() {
122 return this.getElement('tooltip'); 120 return this.getElement('tooltip');
123 }, 121 },
124 122
125 //------------------------------------------------------------------------- 123 //-------------------------------------------------------------------------
126 124
127 'boxDimensions': function () { 125 'boxDimensions': function () {
128 return this._boxDimensions; 126 return this._boxDimensions;
129 }, 127 },
130 128
131 //------------------------------------------------------------------------- 129 //-------------------------------------------------------------------------
132 130
133 'show': function () { 131 'show': function () {
134 var elementSizeAndPosition; 132 var elementSizeAndPosition;
135 var arrowPosition; 133 var arrowPosition;
136 var bodyPosition; 134 var bodyPosition;
137 135
138 if (this.isVisible() == false) { 136 if (this.isVisible() == false) {
139 arrowPosition = {}; 137 arrowPosition = {};
140 bodyPosition = {}; 138 bodyPosition = {};
141 139
142 this.setIsVisible(true); 140 this.setIsVisible(true);
143 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element()); 141 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element());
144//console.log("ELEMENT SIZE AND POSITION", Clipperz.Base.serializeJSON(elementSizeAndPosition));
145//console.log("BOX DIMENSIONS", Clipperz.Base.serializeJSON(this.boxDimensions()));
146 switch (this.position()) { 142 switch (this.position()) {
147 case 'ABOVE': 143 case 'ABOVE':
148//console.log("ABOVE");
149 // MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px'); 144 // MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
150 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2); 145 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
151 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13; 146 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13;
152 147
153 // arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2); 148 // arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
154 // arrowPosition.y = elementSizeAndPosition.position.y - 13; 149 // arrowPosition.y = elementSizeAndPosition.position.y - 13;
155 break; 150 break;
156 case 'BELOW': 151 case 'BELOW':
157//console.log("BELOW");
158 // MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px'); 152 // MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
159 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2); 153 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
160 bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13; 154 bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13;
161 155
162 // arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2); 156 // arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
163 // arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h; 157 // arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h;
164 break; 158 break;
165 case 'LEFT': 159 case 'LEFT':
166//console.log("LEFT");
167 // MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px'); 160 // MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
168 bodyPosition.x = elementSizeAndPosition.position.x - this.boxDimensions().w - 13; 161 bodyPosition.x = elementSizeAndPosition.position.x - this.boxDimensions().w - 13;
169 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2); 162 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
170 163
171 // arrowPosition.x = elementSizeAndPosition.position.x -13; 164 // arrowPosition.x = elementSizeAndPosition.position.x -13;
172 // arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2); 165 // arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
173 break; 166 break;
174 case 'RIGHT': 167 case 'RIGHT':
175//console.log("RIGHT");
176 // MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px'); 168 // MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
177 bodyPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w + 13; 169 bodyPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w + 13;
178 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2); 170 bodyPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - this.boxDimensions().h/2);
179 171
180 // arrowPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w; 172 // arrowPosition.x = elementSizeAndPosition.position.x + elementSizeAndPosition.dimensions.w;
181 // arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2); 173 // arrowPosition.y = elementSizeAndPosition.position.y + (elementSizeAndPosition.dimensions.h/2 - 36/2);
182 break; 174 break;
183 } 175 }
184//console.log("X: " + bodyPosition.x + ", Y: " + bodyPosition.y);
185 176
186 MochiKit.Style.setElementPosition(this.getId('tooltip'), bodyPosition); 177 MochiKit.Style.setElementPosition(this.getId('tooltip'), bodyPosition);
187 // MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition); 178 // MochiKit.Style.setElementPosition(this.getId('body'), bodyPosition);
188 // MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition); 179 // MochiKit.Style.setElementPosition(this.getId('arrow'), arrowPosition);
189 MochiKit.Visual.appear(this.displayElement(), {duration:0.4}); 180 MochiKit.Visual.appear(this.displayElement(), {duration:0.4});
190 } 181 }
191 }, 182 },
192 183
193 'hide': function () { 184 'hide': function () {
194 if (this.isVisible() == true) { 185 if (this.isVisible() == true) {
195 MochiKit.Visual.fade(this.displayElement(), {duration:0.4}); 186 MochiKit.Visual.fade(this.displayElement(), {duration:0.4});
196 this.setIsVisible(false); 187 this.setIsVisible(false);
197 } 188 }
198 }, 189 },
199 190
200 //------------------------------------------------------------------------- 191 //-------------------------------------------------------------------------
201/* 192/*
202 'shouldRemoveElementWhenClearningUp': function () { 193 'shouldRemoveElementWhenClearningUp': function () {
203 return false; 194 return false;
204 }, 195 },
205*/ 196*/
206 //------------------------------------------------------------------------- 197 //-------------------------------------------------------------------------
207 __syntaxFix__: "syntax fix" 198 __syntaxFix__: "syntax fix"
208}); 199});
209 200
210Clipperz.PM.UI.Common.Components.Tooltip.initTooltips = function () { 201Clipperz.PM.UI.Common.Components.Tooltip.initTooltips = function () {
211 Clipperz.DOM.Helper.insertBefore(MochiKit.DOM.currentDocument().body.childNodes[0], {tag:'div', id:'Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'}); 202 Clipperz.DOM.Helper.insertBefore(MochiKit.DOM.currentDocument().body.childNodes[0], {tag:'div', id:'Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'});
212} 203}
213 204
214MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Common.Components.Tooltip.initTooltips); 205MochiKit.DOM.addLoadEvent(Clipperz.PM.UI.Common.Components.Tooltip.initTooltips);
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js
index c41fc7c..ba58edd 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 25
28Clipperz.PM.UI.Common.Components.TranslatorWidget = function(args) { 26Clipperz.PM.UI.Common.Components.TranslatorWidget = function(args) {
29Clipperz.log(">>> TranslatorWidget.new"); 27Clipperz.log(">>> TranslatorWidget.new");
30 args = args || {}; 28 args = args || {};
31 29
32 Clipperz.PM.UI.Common.Components.TranslatorWidget.superclass.constructor.apply(this, arguments); 30 Clipperz.PM.UI.Common.Components.TranslatorWidget.superclass.constructor.apply(this, arguments);
33 31
34 // this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter'); 32 // this._element = args.element|| Clipperz.Base.exception.raise('MandatoryParameter');
35 // this._stringID = args.stringID || MochiKit.DOM.getNodeAttribute(this.element(), 'stringID')|| Clipperz.Base.exception.raise('MandatoryParameter'); 33 // this._stringID = args.stringID || MochiKit.DOM.getNodeAttribute(this.element(), 'stringID')|| Clipperz.Base.exception.raise('MandatoryParameter');
36 34
37 //MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show'); 35 //MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
38 //MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide'); 36 //MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
39 37
40Clipperz.log("<<< TranslatorWidget.new"); 38Clipperz.log("<<< TranslatorWidget.new");
41 return this; 39 return this;
42} 40}
43 41
44//============================================================================= 42//=============================================================================
45 43
46Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.TranslatorWidget, Clipperz.PM.UI.Common.Components.BaseComponent, { 44Clipperz.Base.extend(Clipperz.PM.UI.Common.Components.TranslatorWidget, Clipperz.PM.UI.Common.Components.BaseComponent, {
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'toString': function () { 48 'toString': function () {
51 return "Clipperz.PM.UI.Common.Components.TranslatorWidget component"; 49 return "Clipperz.PM.UI.Common.Components.TranslatorWidget component";
52 }, 50 },
53 51
54 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
55/* 53/*
56 'renderSelf': function() { 54 'renderSelf': function() {
57 this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[ 55 this.append(this.element(), {tag:'div', id:this.getId('tooltip'), cls:'tooltip ' + this.position(), children:[
58 {tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[ 56 {tag:'div', id:this.getId('body'), cls:'tooltip_body', children:[
59 {tag:'div', cls:'tooltip_text', children:[ 57 {tag:'div', cls:'tooltip_text', children:[
60 {tag:'span', html:this.text()} 58 {tag:'span', html:this.text()}
61 ]}, 59 ]},
62 {tag:'div', id:this.getId('footer'), cls:'tooltip_footer'} 60 {tag:'div', id:this.getId('footer'), cls:'tooltip_footer'}
63 ]}, 61 ]},
64 {tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'} 62 {tag:'div', id:this.getId('arrow'), cls:'tooltip_arrow'}
65 ]}); 63 ]});
66 64
67 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body')); 65 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
68 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h; 66 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
69 67
70 MochiKit.Style.hideElement(this.displayElement()); 68 MochiKit.Style.hideElement(this.displayElement());
71 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show'); 69 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
72 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide'); 70 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
73 }, 71 },
74*/ 72*/
75 //----------------------------------------------------- 73 //-----------------------------------------------------
76/* 74/*
77 'displayElement': function() { 75 'displayElement': function() {
78 return this.getElement('tooltip'); 76 return this.getElement('tooltip');
79 }, 77 },
80*/ 78*/
81 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
82/* 80/*
83 'boxDimensions': function () { 81 'boxDimensions': function () {
84 return this._boxDimensions; 82 return this._boxDimensions;
85 }, 83 },
86*/ 84*/
87 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
88 86
89 'show': function (anElement, aStringID) { 87 'show': function (anElement, aStringID) {
90 Clipperz.log(">>> Clipperz.PM.UI.Common.Components.TranslatorWidget.show: " + aStringID); 88 Clipperz.log(">>> Clipperz.PM.UI.Common.Components.TranslatorWidget.show: " + aStringID);
91/* 89/*
92 var elementSizeAndPosition; 90 var elementSizeAndPosition;
93 var arrowPosition; 91 var arrowPosition;
94 var bodyPosition; 92 var bodyPosition;
95 93
96 arrowPosition = {}; 94 arrowPosition = {};
97 bodyPosition = {}; 95 bodyPosition = {};
98 96
99 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element()); 97 elementSizeAndPosition = Clipperz.Style.getSizeAndPosition(this.element());
100 switch (this.position()) { 98 switch (this.position()) {
101 case 'ABOVE': 99 case 'ABOVE':
102 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px'); 100 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
103 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2); 101 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
104 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13; 102 bodyPosition.y = elementSizeAndPosition.position.y - this.boxDimensions().h - 13;
105 103
106 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2); 104 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
107 arrowPosition.y = elementSizeAndPosition.position.y - 13; 105 arrowPosition.y = elementSizeAndPosition.position.y - 13;
108 break; 106 break;
109 case 'BELOW': 107 case 'BELOW':
110 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px'); 108 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:36, h:13}, 'px');
111 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2); 109 bodyPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - this.boxDimensions().w/2);
112 bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13; 110 bodyPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h + 13;
113 111
114 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2); 112 arrowPosition.x = elementSizeAndPosition.position.x + (elementSizeAndPosition.dimensions.w/2 - 36/2);
115 arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h; 113 arrowPosition.y = elementSizeAndPosition.position.y + elementSizeAndPosition.dimensions.h;
116 break; 114 break;
117 case 'LEFT': 115 case 'LEFT':
118 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px'); 116 MochiKit.Style.setElementDimensions(this.getId('arrow'), {w:13, h:36}, 'px');
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js
index 5fd10f9..77d59a5 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js
@@ -1,264 +1,256 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers');
27 25
28Clipperz.PM.UI.Common.Controllers.DirectLoginRunner = function(args) { 26Clipperz.PM.UI.Common.Controllers.DirectLoginRunner = function(args) {
29 this._directLogin = args['directLogin'] || Clipperz.Base.exception.raise('MandatoryParameter'); 27 this._directLogin = args['directLogin'] || Clipperz.Base.exception.raise('MandatoryParameter');
30 this._target = Clipperz.PM.Crypto.randomKey(); 28 this._target = Clipperz.PM.Crypto.randomKey();
31 29
32 return this; 30 return this;
33} 31}
34 32
35MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.prototype, { 33MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.prototype, {
36 34
37 'toString': function() { 35 'toString': function() {
38 return "Clipperz.PM.UI.Common.Controllers.DirectLoginRunner"; 36 return "Clipperz.PM.UI.Common.Controllers.DirectLoginRunner";
39 }, 37 },
40 38
41 //----------------------------------------------------------------------------- 39 //-----------------------------------------------------------------------------
42 40
43 'directLogin': function () { 41 'directLogin': function () {
44 return this._directLogin; 42 return this._directLogin;
45 }, 43 },
46 44
47 //----------------------------------------------------------------------------- 45 //-----------------------------------------------------------------------------
48 46
49 'target': function () { 47 'target': function () {
50 return this._target; 48 return this._target;
51 }, 49 },
52 50
53 //============================================================================= 51 //=============================================================================
54 52
55 'setWindowTitle': function (aWindow, aTitle) { 53 'setWindowTitle': function (aWindow, aTitle) {
56 aWindow.document.title = aTitle; 54 aWindow.document.title = aTitle;
57 }, 55 },
58 56
59 'setWindowBody': function (aWindow, anHTML) { 57 'setWindowBody': function (aWindow, anHTML) {
60 aWindow.document.body.innerHTML = anHTML; 58 aWindow.document.body.innerHTML = anHTML;
61 }, 59 },
62 60
63 //============================================================================= 61 //=============================================================================
64 62
65 'initialWindowSetup': function (aWindow) { 63 'initialWindowSetup': function (aWindow) {
66 this.setWindowTitle(aWindow, "Loading Clipperz Direct Login"); 64 this.setWindowTitle(aWindow, "Loading Clipperz Direct Login");
67 this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3("Loading Clipperz Direct Login ..."))); 65 this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3("Loading Clipperz Direct Login ...")));
68 }, 66 },
69 67
70 //----------------------------------------------------------------------------- 68 //-----------------------------------------------------------------------------
71 69
72 'updateWindowWithDirectLoginLabel': function (aWindow, aLabel) { 70 'updateWindowWithDirectLoginLabel': function (aWindow, aLabel) {
73 var titleText; 71 var titleText;
74 var bodyText; 72 var bodyText;
75 73
76 titleText = "Loading '__label__' Direct Login".replace(/__label__/, aLabel) 74 titleText = "Loading '__label__' Direct Login".replace(/__label__/, aLabel)
77 bodyText = "Loading '__label__' Direct Login... ".replace(/__label__/, aLabel) 75 bodyText = "Loading '__label__' Direct Login... ".replace(/__label__/, aLabel)
78 76
79 this.setWindowTitle(aWindow, titleText); 77 this.setWindowTitle(aWindow, titleText);
80 this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3(bodyText))); 78 this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3(bodyText)));
81 }, 79 },
82 80
83 //----------------------------------------------------------------------------- 81 //-----------------------------------------------------------------------------
84 82
85 'updateWindowWithHTMLContent': function (aWindow, anHtml) { 83 'updateWindowWithHTMLContent': function (aWindow, anHtml) {
86 this.setWindowBody(aWindow, anHtml); 84 this.setWindowBody(aWindow, anHtml);
87 }, 85 },
88 86
89 //============================================================================= 87 //=============================================================================
90 88
91 'submitLoginForm': function(aWindow, aSubmitFunction) { 89 'submitLoginForm': function(aWindow, aSubmitFunction) {
92 MochiKit.DOM.withWindow(aWindow, MochiKit.Base.bind(function () { 90 MochiKit.DOM.withWindow(aWindow, MochiKit.Base.bind(function () {
93 var formElement; 91 var formElement;
94 var submitButtons; 92 var submitButtons;
95 93
96 formElement = MochiKit.DOM.getElement('directLoginForm'); 94 formElement = MochiKit.DOM.getElement('directLoginForm');
97 95
98 submitButtons = MochiKit.Base.filter(function(anInputElement) { 96 submitButtons = MochiKit.Base.filter(function(anInputElement) {
99 return ((anInputElement.tagName.toLowerCase() == 'input') && (anInputElement.getAttribute('type').toLowerCase() == 'submit')); 97 return ((anInputElement.tagName.toLowerCase() == 'input') && (anInputElement.getAttribute('type').toLowerCase() == 'submit'));
100 }, formElement.elements); 98 }, formElement.elements);
101 99
102 if (submitButtons.length == 0) { 100 if (submitButtons.length == 0) {
103 if (typeof(formElement.submit) == 'function') { 101 if (typeof(formElement.submit) == 'function') {
104 formElement.submit(); 102 formElement.submit();
105 } else { 103 } else {
106 aSubmitFunction.apply(formElement); 104 aSubmitFunction.apply(formElement);
107 } 105 }
108/* 106/*
109 varformSubmitFunction; 107 varformSubmitFunction;
110 108
111 formSubmitFunction = MochiKit.Base.method(formElement, 'submit'); 109 formSubmitFunction = MochiKit.Base.method(formElement, 'submit');
112 if (Clipperz_IEisBroken == true) { 110 if (Clipperz_IEisBroken == true) {
113 formElement.submit(); 111 formElement.submit();
114 } else { 112 } else {
115 formSubmitFunction(); 113 formSubmitFunction();
116 } 114 }
117*/ 115*/
118 } else { 116 } else {
119 submitButtons[0].click(); 117 submitButtons[0].click();
120 } 118 }
121 }, this)); 119 }, this));
122 }, 120 },
123 121
124 //------------------------------------------------------------------------- 122 //-------------------------------------------------------------------------
125 123
126 'runSubmitFormDirectLogin': function (aWindow, someAttributes) { 124 'runSubmitFormDirectLogin': function (aWindow, someAttributes) {
127 var html; 125 var html;
128 var formElement; 126 var formElement;
129 var submitFunction; 127 var submitFunction;
130 128
131 formElement = MochiKit.DOM.FORM({ 129 formElement = MochiKit.DOM.FORM({
132 'id':'directLoginForm', 130 'id':'directLoginForm',
133 'method':someAttributes['formAttributes']['method'], 131 'method':someAttributes['formAttributes']['method'],
134 'action':someAttributes['formAttributes']['action'] 132 'action':someAttributes['formAttributes']['action']
135 }); 133 });
136 134
137 submitFunction = formElement.submit; 135 submitFunction = formElement.submit;
138 136
139 MochiKit.DOM.appendChildNodes(formElement, MochiKit.Base.map(function (anInputAttributes) { 137 MochiKit.DOM.appendChildNodes(formElement, MochiKit.Base.map(function (anInputAttributes) {
140 return MochiKit.DOM.INPUT({'type':'hidden', 'name':anInputAttributes[0], 'value':anInputAttributes[1]}); 138 return MochiKit.DOM.INPUT({'type':'hidden', 'name':anInputAttributes[0], 'value':anInputAttributes[1]});
141 }, MochiKit.Base.items(someAttributes['inputValues']))); 139 }, MochiKit.Base.items(someAttributes['inputValues'])));
142 140
143 html =''; 141 html ='';
144 html += '<h3>Loading ' + someAttributes['label'] + ' ...</h3>'; 142 html += '<h3>Loading ' + someAttributes['label'] + ' ...</h3>';
145 html +=MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV(), MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV({style:'display:none; visibility:hidden;'}), formElement)).innerHTML; 143 html +=MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV(), MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV({style:'display:none; visibility:hidden;'}), formElement)).innerHTML;
146 144
147 this.updateWindowWithHTMLContent(aWindow, html); 145 this.updateWindowWithHTMLContent(aWindow, html);
148 this.submitLoginForm(aWindow, submitFunction); 146 this.submitLoginForm(aWindow, submitFunction);
149 }, 147 },
150 148
151 //------------------------------------------------------------------------- 149 //-------------------------------------------------------------------------
152 150
153 'runHttpAuthDirectLogin': function(aWindow, someAttributes) { 151 'runHttpAuthDirectLogin': function(aWindow, someAttributes) {
154 var completeUrl; 152 var completeUrl;
155 var url; 153 var url;
156 154
157//console.log("runHttpAuthDirectLogin", someAttributes);
158 url = someAttributes['inputValues']['url']; 155 url = someAttributes['inputValues']['url'];
159 156
160 if (/^https?\:\/\//.test(url) == false) { 157 if (/^https?\:\/\//.test(url) == false) {
161 url = 'http://' + url; 158 url = 'http://' + url;
162 } 159 }
163 160
164 if (Clipperz_IEisBroken === true) { 161 if (Clipperz_IEisBroken === true) {
165 completeUrl = url; 162 completeUrl = url;
166 } else { 163 } else {
167 var username; 164 var username;
168 var password; 165 var password;
169 166
170 username = someAttributes['inputValues']['username']; 167 username = someAttributes['inputValues']['username'];
171 password = someAttributes['inputValues']['password']; 168 password = someAttributes['inputValues']['password'];
172 /(^https?\:\/\/)?(.*)/.test(url); 169 /(^https?\:\/\/)?(.*)/.test(url);
173 170
174 completeUrl = RegExp.$1 + username + ':' + password + '@' + RegExp.$2; 171 completeUrl = RegExp.$1 + username + ':' + password + '@' + RegExp.$2;
175 } 172 }
176 173
177 window.open(completeUrl, this.target()); 174 window.open(completeUrl, this.target());
178 }, 175 },
179 176
180 //============================================================================= 177 //=============================================================================
181 178
182 'runDirectLogin': function (aWindow) { 179 'runDirectLogin': function (aWindow) {
183 var deferredResult; 180 var deferredResult;
184 181
185//console.log(">>> runDirectLogin");
186 deferredResult = new Clipperz.Async.Deferred("DirectLoginRunner.openDirectLogin", {trace:false}); 182 deferredResult = new Clipperz.Async.Deferred("DirectLoginRunner.openDirectLogin", {trace:false});
187 deferredResult.addMethod(this, 'initialWindowSetup', aWindow); 183 deferredResult.addMethod(this, 'initialWindowSetup', aWindow);
188 deferredResult.addMethod(this.directLogin(), 'label'); 184 deferredResult.addMethod(this.directLogin(), 'label');
189 deferredResult.addMethod(this, 'updateWindowWithDirectLoginLabel', aWindow); 185 deferredResult.addMethod(this, 'updateWindowWithDirectLoginLabel', aWindow);
190 deferredResult.collectResults({ 186 deferredResult.collectResults({
191 'type': MochiKit.Base.method(this.directLogin(), 'type'), 187 'type': MochiKit.Base.method(this.directLogin(), 'type'),
192 'label': MochiKit.Base.method(this.directLogin(), 'label'), 188 'label': MochiKit.Base.method(this.directLogin(), 'label'),
193 'formAttributes':MochiKit.Base.method(this.directLogin(), 'formAttributes'), 189 'formAttributes':MochiKit.Base.method(this.directLogin(), 'formAttributes'),
194 'inputValues': MochiKit.Base.method(this.directLogin(), 'inputValues') 190 'inputValues': MochiKit.Base.method(this.directLogin(), 'inputValues')
195 }); 191 });
196//deferredResult.addCallback(function (aValue) { console.log("SOME ATTRIBUTES", aValue); return aValue; });
197 deferredResult.addCallback(MochiKit.Base.bind(function (someAttributes) { 192 deferredResult.addCallback(MochiKit.Base.bind(function (someAttributes) {
198//console.log("SOME ATTRIBUTES", someAttributes);
199 switch (someAttributes['type']) { 193 switch (someAttributes['type']) {
200 case 'http_auth': 194 case 'http_auth':
201 this.runHttpAuthDirectLogin(aWindow, someAttributes); 195 this.runHttpAuthDirectLogin(aWindow, someAttributes);
202 break; 196 break;
203 case 'simple_url': 197 case 'simple_url':
204 this.runSimpleUrlDirectLogin(aWindow, someAttributes); 198 this.runSimpleUrlDirectLogin(aWindow, someAttributes);
205 break; 199 break;
206 default: 200 default:
207 this.runSubmitFormDirectLogin(aWindow, someAttributes); 201 this.runSubmitFormDirectLogin(aWindow, someAttributes);
208 break; 202 break;
209 } 203 }
210 }, this)); 204 }, this));
211 deferredResult.callback(); 205 deferredResult.callback();
212//console.log("<<< runDirectLogin");
213 206
214 return deferredResult; 207 return deferredResult;
215 }, 208 },
216 209
217 //============================================================================= 210 //=============================================================================
218 211
219 'run': function () { 212 'run': function () {
220 var newWindow; 213 var newWindow;
221 214
222 newWindow = window.open(Clipperz.PM.Strings.getValue('directLoginJumpPageUrl'), this.target()); 215 newWindow = window.open(Clipperz.PM.Strings.getValue('directLoginJumpPageUrl'), this.target());
223 216
224 return this.runDirectLogin(newWindow); 217 return this.runDirectLogin(newWindow);
225 }, 218 },
226 219
227 //============================================================================= 220 //=============================================================================
228 221
229 'test': function () { 222 'test': function () {
230 var iFrame; 223 var iFrame;
231 var newWindow; 224 var newWindow;
232 225
233 iFrame = MochiKit.DOM.createDOM('iframe'); 226 iFrame = MochiKit.DOM.createDOM('iframe');
234 MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, iFrame); 227 MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, iFrame);
235 228
236 newWindow = iFrame.contentWindow; 229 newWindow = iFrame.contentWindow;
237 230
238 return this.runDirectLogin(newWindow); 231 return this.runDirectLogin(newWindow);
239 }, 232 },
240 233
241 //============================================================================= 234 //=============================================================================
242 __syntaxFix__: "syntax fix" 235 __syntaxFix__: "syntax fix"
243}); 236});
244 237
245//----------------------------------------------------------------------------- 238//-----------------------------------------------------------------------------
246 239
247Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin = function (aDirectLogin) { 240Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.openDirectLogin = function (aDirectLogin) {
248 varrunner; 241 varrunner;
249 242
250 runner = new Clipperz.PM.UI.Common.Controllers.DirectLoginRunner({directLogin:aDirectLogin}); 243 runner = new Clipperz.PM.UI.Common.Controllers.DirectLoginRunner({directLogin:aDirectLogin});
251 return runner.run(); 244 return runner.run();
252}; 245};
253 246
254//----------------------------------------------------------------------------- 247//-----------------------------------------------------------------------------
255 248
256Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.testDirectLogin = function (aDirectLogin) { 249Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.testDirectLogin = function (aDirectLogin) {
257 varrunner; 250 varrunner;
258 251
259//console.log(">>>>>> TESTING DIRECT LOGIN");
260 runner = new Clipperz.PM.UI.Common.Controllers.DirectLoginRunner({directLogin:aDirectLogin}); 252 runner = new Clipperz.PM.UI.Common.Controllers.DirectLoginRunner({directLogin:aDirectLogin});
261 return runner.test(); 253 return runner.test();
262}; 254};
263 255
264//----------------------------------------------------------------------------- 256//-----------------------------------------------------------------------------
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js
index 41fe17f..52d81d4 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers');
27 25
28Clipperz.PM.UI.Common.Controllers.ProgressBarController = function(args) { 26Clipperz.PM.UI.Common.Controllers.ProgressBarController = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 this._numberOfSteps= 0; 29 this._numberOfSteps= 0;
32 this._currentStep= 0; 30 this._currentStep= 0;
33 31
34 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'initProgress', this, 'initProgressHandle'); 32 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'initProgress', this, 'initProgressHandle');
35 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'updateProgress',this, 'updateProgressHandle'); 33 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'updateProgress',this, 'updateProgressHandle');
36 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'advanceProgress',this, 'advanceProgressHandle'); 34 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'advanceProgress',this, 'advanceProgressHandle');
37 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'progressDone', this, 'progressDoneHandle'); 35 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'progressDone', this, 'progressDoneHandle');
38 36
39 return this; 37 return this;
40} 38}
41 39
42MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.ProgressBarController.prototype, { 40MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.ProgressBarController.prototype, {
43 41
44 'toString': function() { 42 'toString': function() {
45 return "Clipperz.PM.UI.Common.Controllers.ProgressBarController"; 43 return "Clipperz.PM.UI.Common.Controllers.ProgressBarController";
46 }, 44 },
47 45
48 //----------------------------------------------------------------------------- 46 //-----------------------------------------------------------------------------
49 47
50 'numberOfSteps': function() { 48 'numberOfSteps': function() {
51 return this._numberOfSteps; 49 return this._numberOfSteps;
52 }, 50 },
53 51
54 'setNumberOfSteps': function (aValue) { 52 'setNumberOfSteps': function (aValue) {
55 this._numberOfSteps = aValue; 53 this._numberOfSteps = aValue;
56 }, 54 },
57 55
58 'updateNumberOfSteps': function (aValue) { 56 'updateNumberOfSteps': function (aValue) {
59 this._numberOfSteps += aValue; 57 this._numberOfSteps += aValue;
60 }, 58 },
61 59
62 //----------------------------------------------------------------------------- 60 //-----------------------------------------------------------------------------
63 61
64 'currentStep': function() { 62 'currentStep': function() {
65 return this._currentStep; 63 return this._currentStep;
66 }, 64 },
67 65
68 'advanceCurrentStep': function () { 66 'advanceCurrentStep': function () {
69 this._currentStep ++; 67 this._currentStep ++;
70 }, 68 },
71 69
72 //----------------------------------------------------------------------------- 70 //-----------------------------------------------------------------------------
73 71
74 'completedPercentage': function () { 72 'completedPercentage': function () {
75 var result; 73 var result;
76//Clipperz.log(">>> completedPercentage" + this.currentStep() + "/" + this.numberOfSteps(), this.currentStep() / this.numberOfSteps()); 74//Clipperz.log(">>> completedPercentage" + this.currentStep() + "/" + this.numberOfSteps(), this.currentStep() / this.numberOfSteps());
77 if (this.numberOfSteps() == 0) { 75 if (this.numberOfSteps() == 0) {
78 result = 0; 76 result = 0;
79 } else { 77 } else {
80 result = (Math.min(100, 100 * (this.currentStep() / this.numberOfSteps()))); 78 result = (Math.min(100, 100 * (this.currentStep() / this.numberOfSteps())));
81 } 79 }
82//Clipperz.log("<<< completedPercentage", result); 80//Clipperz.log("<<< completedPercentage", result);
83 return result; 81 return result;
84 }, 82 },
85 83
86 //----------------------------------------------------------------------------- 84 //-----------------------------------------------------------------------------
87 85
88 'resetStatus': function () { 86 'resetStatus': function () {
89 this._numberOfSteps= 0; 87 this._numberOfSteps= 0;
90 this._currentStep= 0; 88 this._currentStep= 0;
91 }, 89 },
92 90
93 //----------------------------------------------------------------------------- 91 //-----------------------------------------------------------------------------
94 92
95 'updateProgress': function () { 93 'updateProgress': function () {
96//Clipperz.log(">>> updateProgress: " + this.completedPercentage() + "%"); 94//Clipperz.log(">>> updateProgress: " + this.completedPercentage() + "%");
97 MochiKit.Signal.signal(this, 'updateProgress', this.completedPercentage()); 95 MochiKit.Signal.signal(this, 'updateProgress', this.completedPercentage());
98 }, 96 },
99 97
100 //============================================================================= 98 //=============================================================================
101 99
102 'initProgressHandle': function (anEvent) { 100 'initProgressHandle': function (anEvent) {
103//Clipperz.log(">>> initProgressHandle - steps: " + (anEvent != null ? anEvent['steps'] : 0)); 101//Clipperz.log(">>> initProgressHandle - steps: " + (anEvent != null ? anEvent['steps'] : 0));
104 this.resetStatus(); 102 this.resetStatus();
105 if (anEvent != null) { 103 if (anEvent != null) {
106 this.setNumberOfSteps(anEvent['steps']); 104 this.setNumberOfSteps(anEvent['steps']);
107 } 105 }
108 MochiKit.Signal.signal(this, 'initProgress'); 106 MochiKit.Signal.signal(this, 'initProgress');
109 this.updateProgress(); 107 this.updateProgress();
110 }, 108 },
111 109
112 //............................................................................. 110 //.............................................................................
113 111
114 'updateProgressHandle': function (anEvent) { 112 'updateProgressHandle': function (anEvent) {
115 this.updateNumberOfSteps(anEvent['extraSteps']); 113 this.updateNumberOfSteps(anEvent['extraSteps']);
116//Clipperz.log("=== updateProgressHandle - steps: " + this.numberOfSteps() + " (extra " + anEvent['extraSteps'] + ")"); 114//Clipperz.log("=== updateProgressHandle - steps: " + this.numberOfSteps() + " (extra " + anEvent['extraSteps'] + ")");
117 this.updateProgress(); 115 this.updateProgress();
118 }, 116 },
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js
index 341fde9..d3e86de 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Controllers');
27 25
28Clipperz.PM.UI.Common.Controllers.TabPanelController = function(args) { 26Clipperz.PM.UI.Common.Controllers.TabPanelController = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 this._component = args.component; 29 this._component = args.component;
32 this._configuration = args.configuration; 30 this._configuration = args.configuration;
33 this._isEnabled = args.enabled || true; 31 this._isEnabled = args.enabled || true;
34 32
35 this._selectedTab = null; 33 this._selectedTab = null;
36 return this; 34 return this;
37} 35}
38 36
39MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.TabPanelController.prototype, { 37MochiKit.Base.update(Clipperz.PM.UI.Common.Controllers.TabPanelController.prototype, {
40 38
41 'toString': function() { 39 'toString': function() {
42 return "Clipperz.PM.UI.Common.Controllers.TabPanelController"; 40 return "Clipperz.PM.UI.Common.Controllers.TabPanelController";
43 }, 41 },
44 42
45 //----------------------------------------------------------------------------- 43 //-----------------------------------------------------------------------------
46 44
47 'component': function() { 45 'component': function() {
48 return this._component; 46 return this._component;
49 }, 47 },
50 48
51 'configuration': function() { 49 'configuration': function() {
52 return this._configuration; 50 return this._configuration;
53 }, 51 },
54 52
55 //----------------------------------------------------------------------------- 53 //-----------------------------------------------------------------------------
56 54
57 'getElement': function(anElementID) { 55 'getElement': function(anElementID) {
58 return this.component().getElement(anElementID); 56 return this.component().getElement(anElementID);
59 }, 57 },
60 58
61 'tabForTabElement': function(anElement) { 59 'tabForTabElement': function(anElement) {
62 varresult; 60 varresult;
63 61
64 for (result in this.configuration()) { 62 for (result in this.configuration()) {
65 if (this.getElement(this.configuration()[result]['tab']) == anElement) { 63 if (this.getElement(this.configuration()[result]['tab']) == anElement) {
66 break; 64 break;
67 } 65 }
68 } 66 }
69 67
70 return result; 68 return result;
71 }, 69 },
72 70
73 //----------------------------------------------------------------------------- 71 //-----------------------------------------------------------------------------
74 72
75 'setupTab': function(aConfiguration) { 73 'setupTab': function(aConfiguration) {
76 vartabElement; 74 vartabElement;
77 75
78 tabElement = this.getElement(aConfiguration['tab']); 76 tabElement = this.getElement(aConfiguration['tab']);
79 77
80 MochiKit.DOM.removeElementClass(tabElement, 'selected'); 78 MochiKit.DOM.removeElementClass(tabElement, 'selected');
81 MochiKit.Signal.connect(tabElement, 'onclick', this, 'handleTabClick') 79 MochiKit.Signal.connect(tabElement, 'onclick', this, 'handleTabClick')
82 }, 80 },
83 81
84 'setupPanel': function(aConfiguration) { 82 'setupPanel': function(aConfiguration) {
85 this.hidePanel(aConfiguration['panel']); 83 this.hidePanel(aConfiguration['panel']);
86 }, 84 },
87 85
88 'setup': function(args) { 86 'setup': function(args) {
89 args = args || {}; 87 args = args || {};
90 88
91 MochiKit.Base.map(MochiKit.Base.method(this, 'setupTab'),MochiKit.Base.values(this.configuration())); 89 MochiKit.Base.map(MochiKit.Base.method(this, 'setupTab'),MochiKit.Base.values(this.configuration()));
92 MochiKit.Base.map(MochiKit.Base.method(this, 'setupPanel'),MochiKit.Base.values(this.configuration())); 90 MochiKit.Base.map(MochiKit.Base.method(this, 'setupPanel'),MochiKit.Base.values(this.configuration()));
93 this.selectTab(args.selected); 91 this.selectTab(args.selected);
94 }, 92 },
95 93
96 //----------------------------------------------------------------------------- 94 //-----------------------------------------------------------------------------
97 95
98 'hidePanel': function(aPanel) { 96 'hidePanel': function(aPanel) {
99 MochiKit.DOM.removeElementClass(this.getElement(aPanel), 'selected'); 97 MochiKit.DOM.removeElementClass(this.getElement(aPanel), 'selected');
100 }, 98 },
101 99
102 'selectTab': function(aTab) { 100 'selectTab': function(aTab) {
103 if ((aTab != this.selectedTab()) && (this.isEnabled())) { 101 if ((aTab != this.selectedTab()) && (this.isEnabled())) {
104 if (this.selectedTab() != null) { 102 if (this.selectedTab() != null) {
105 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[this.selectedTab()]['tab']),'selected'); 103 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[this.selectedTab()]['tab']),'selected');
106 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[this.selectedTab()]['panel']),'selected'); 104 MochiKit.DOM.removeElementClass(this.getElement(this.configuration()[this.selectedTab()]['panel']),'selected');
107 } 105 }
108 106
109 if (aTab != null) { 107 if (aTab != null) {
110 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTab]['tab']),'selected'); 108 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTab]['tab']),'selected');
111 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTab]['panel']),'selected'); 109 MochiKit.DOM.addElementClass(this.getElement(this.configuration()[aTab]['panel']),'selected');
112 } 110 }
113 111
114 this.setSelectedTab(aTab); 112 this.setSelectedTab(aTab);
115 MochiKit.Signal.signal(this, 'tabSelected', aTab); 113 MochiKit.Signal.signal(this, 'tabSelected', aTab);
116 } 114 }
117 }, 115 },
118 116
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js
index ef38bc6..c13d96a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js
@@ -1,28 +1,26 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26 //Still empty, but here it should be reasonable to factor in code duplicated between 24 //Still empty, but here it should be reasonable to factor in code duplicated between
27 //- DirectLoginWizardController 25 //- DirectLoginWizardController
28 //- NewUserWizardController \ No newline at end of file 26 //- NewUserWizardController \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js b/frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js
index ea987cd..f0ccdfb 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js
@@ -1,56 +1,54 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Compact'); 24Clipperz.Base.module('Clipperz.PM.UI.Compact');
27 25
28Clipperz.PM.UI.Compact.MainController = function() { 26Clipperz.PM.UI.Compact.MainController = function() {
29 //this._loginPanel = null; 27 //this._loginPanel = null;
30 //this._user = null; 28 //this._user = null;
31// 29//
32 //this._isRunningCompact = false; 30 //this._isRunningCompact = false;
33 // 31 //
34 //Clipperz.NotificationCenter.register(null, 'userConnected', this, 'userConnectedCallback'); 32 //Clipperz.NotificationCenter.register(null, 'userConnected', this, 'userConnectedCallback');
35 //Clipperz.NotificationCenter.register(null, 'switchLanguage', this, 'switchLanguageHandler'); 33 //Clipperz.NotificationCenter.register(null, 'switchLanguage', this, 'switchLanguageHandler');
36// 34//
37 //Clipperz.NotificationCenter.register(null, 'EXCEPTION', this, 'reportException'); 35 //Clipperz.NotificationCenter.register(null, 'EXCEPTION', this, 'reportException');
38 36
39 return this; 37 return this;
40} 38}
41 39
42MochiKit.Base.update(Clipperz.PM.UI.Compact.MainController.prototype, { 40MochiKit.Base.update(Clipperz.PM.UI.Compact.MainController.prototype, {
43 41
44 'toString': function() { 42 'toString': function() {
45 return "Clipperz.PM.UI.Compact.MainController"; 43 return "Clipperz.PM.UI.Compact.MainController";
46 }, 44 },
47 45
48 //----------------------------------------------------------------------------- 46 //-----------------------------------------------------------------------------
49 47
50 'run': function(shouldShowRegistrationForm) { 48 'run': function(shouldShowRegistrationForm) {
51MochiKit.Logging.logDebug("running " + this.toString()); 49 Clipperz.logDebug("running " + this.toString());
52 }, 50 },
53 51
54 //----------------------------------------------------------------------------- 52 //-----------------------------------------------------------------------------
55 __syntaxFix__: "syntax fix" 53 __syntaxFix__: "syntax fix"
56}); \ No newline at end of file 54}); \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardDetail.js b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardDetail.js
index 32dfa63..abf4758 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardDetail.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardDetail.js
@@ -1,299 +1,293 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Mobile.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Mobile.Components');
27 25
28Clipperz.PM.UI.Mobile.Components.CardDetail = function(args) { 26Clipperz.PM.UI.Mobile.Components.CardDetail = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Mobile.Components.CardDetail.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Mobile.Components.CardDetail.superclass.constructor.apply(this, arguments);
32 30
33 //this._cardReference = null; 31 //this._cardReference = null;
34 32
35 return this; 33 return this;
36} 34}
37 35
38//============================================================================= 36//=============================================================================
39 37
40Clipperz.Base.extend(Clipperz.PM.UI.Mobile.Components.CardDetail, Clipperz.PM.UI.Common.Components.BaseComponent, { 38Clipperz.Base.extend(Clipperz.PM.UI.Mobile.Components.CardDetail, Clipperz.PM.UI.Common.Components.BaseComponent, {
41 39
42 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
43 41
44 'toString': function () { 42 'toString': function () {
45 return "Clipperz.PM.UI.Mobile.Components.CardDetail component"; 43 return "Clipperz.PM.UI.Mobile.Components.CardDetail component";
46 }, 44 },
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49/* 47/*
50 'cardReference': function () { 48 'cardReference': function () {
51 return this._cardReference; 49 return this._cardReference;
52 }, 50 },
53 51
54 'setCardReference': function (aValue) { 52 'setCardReference': function (aValue) {
55 this._cardReference = aValue; 53 this._cardReference = aValue;
56 }, 54 },
57*/ 55*/
58 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
59 57
60 'renderSelf': function () { 58 'renderSelf': function () {
61console.log("CardDetail.renderSelf");
62 this.append(this.element(), {tag:'div', cls:'cardDetail', children:[ 59 this.append(this.element(), {tag:'div', cls:'cardDetail', children:[
63 {tag:'div', cls:'toolbar', children:[ 60 {tag:'div', cls:'toolbar', children:[
64 {tag:'a', href:'#', cls:'back', html:"List"}, 61 {tag:'a', href:'#', cls:'back', html:"List"},
65 {tag:'h1', id:this.getId('cardTitle'), html:"…"} 62 {tag:'h1', id:this.getId('cardTitle'), html:"…"}
66 ]}, 63 ]},
67 {tag:'div', cls:'scroll', id:this.getId('cardDetails'), children:[ 64 {tag:'div', cls:'scroll', id:this.getId('cardDetails'), children:[
68 ]} 65 ]}
69 ]}); 66 ]});
70 }, 67 },
71/* 68/*
72 'renderSelf': function() { 69 'renderSelf': function() {
73 this.append(this.element(), [ 70 this.append(this.element(), [
74 {tag:'div', cls:'cardDetail', id:this.getId('cardDetail'), children:[ 71 {tag:'div', cls:'cardDetail', id:this.getId('cardDetail'), children:[
75 {tag:'div', id:this.getId('progressBar')} //, 72 {tag:'div', id:this.getId('progressBar')} //,
76 ]} 73 ]}
77 ]); 74 ]);
78 75
79 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')})); 76 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
80 MochiKit.Signal.signal(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', 0); 77 MochiKit.Signal.signal(Clipperz.PM.UI.Common.Controllers.ProgressBarController.defaultController, 'updateProgress', 0);
81 }, 78 },
82*/ 79*/
83 80
84 'setTitle': function (aValue) { 81 'setTitle': function (aValue) {
85 this.getElement('cardTitle').innerHTML = aValue; 82 this.getElement('cardTitle').innerHTML = aValue;
86 }, 83 },
87 84
88 'fieldListElement': function () { 85 'fieldListElement': function () {
89 varresult; 86 varresult;
90 87
91 result = this.getElement('fieldList'); 88 result = this.getElement('fieldList');
92 if (result == null) { 89 if (result == null) {
93 result = this.append(this.getElement('cardDetails'), {tag:'ul', cls:'rounded', id:this.getId('fieldList')}); 90 result = this.append(this.getElement('cardDetails'), {tag:'ul', cls:'rounded', id:this.getId('fieldList')});
94 } 91 }
95 92
96 return result; 93 return result;
97 }, 94 },
98 95
99 'renderFieldValues': function (someFieldValues) { 96 'renderFieldValues': function (someFieldValues) {
100 varfieldClass; 97 varfieldClass;
101 98
102 if ((someFieldValues['actionType'] != 'NONE') || (someFieldValues['label'] != '') && (someFieldValues['value'] != '')) { 99 if ((someFieldValues['actionType'] != 'NONE') || (someFieldValues['label'] != '') && (someFieldValues['value'] != '')) {
103 if (someFieldValues['isHidden'] == true) { 100 if (someFieldValues['isHidden'] == true) {
104 fieldClass = 'password'; 101 fieldClass = 'password';
105 } else { 102 } else {
106 fieldClass = ''; 103 fieldClass = '';
107 } 104 }
108 105
109 this.append(this.fieldListElement(), {tag:'li', cls:'cardField', children:[ 106 this.append(this.fieldListElement(), {tag:'li', cls:'cardField', children:[
110 {tag:'a', href:'#', cls:fieldClass, html:someFieldValues['value'], children:[ 107 {tag:'a', href:'#', cls:fieldClass, html:someFieldValues['value'], children:[
111 {tag:'small', cls:'label', html:someFieldValues['label']} 108 {tag:'small', cls:'label', html:someFieldValues['label']}
112 ]} 109 ]}
113 ]}) 110 ]})
114 } 111 }
115 }, 112 },
116 113
117 'addField': function (aField) { 114 'addField': function (aField) {
118 var deferredResult; 115 var deferredResult;
119 varfieldValues; 116 varfieldValues;
120 117
121 fieldValues = {}; 118 fieldValues = {};
122 deferredResult = new Clipperz.Async.Deferred("CardDetail.addField", {trace:false}); 119 deferredResult = new Clipperz.Async.Deferred("CardDetail.addField", {trace:false});
123 deferredResult.addMethod(aField, 'label'); 120 deferredResult.addMethod(aField, 'label');
124 deferredResult.addCallback(function (aValue) { fieldValues['label'] = aValue; }); 121 deferredResult.addCallback(function (aValue) { fieldValues['label'] = aValue; });
125 deferredResult.addMethod(aField, 'value'); 122 deferredResult.addMethod(aField, 'value');
126 deferredResult.addCallback(function (aValue) { fieldValues['value'] = aValue; }); 123 deferredResult.addCallback(function (aValue) { fieldValues['value'] = aValue; });
127 deferredResult.addMethod(aField, 'actionType'); 124 deferredResult.addMethod(aField, 'actionType');
128 deferredResult.addCallback(function (aValue) { fieldValues['actionType'] = aValue; }); 125 deferredResult.addCallback(function (aValue) { fieldValues['actionType'] = aValue; });
129 deferredResult.addMethod(aField, 'isHidden'); 126 deferredResult.addMethod(aField, 'isHidden');
130 deferredResult.addCallback(function (aValue) { fieldValues['isHidden'] = aValue; }); 127 deferredResult.addCallback(function (aValue) { fieldValues['isHidden'] = aValue; });
131 deferredResult.addMethod(this, 'renderFieldValues', fieldValues); 128 deferredResult.addMethod(this, 'renderFieldValues', fieldValues);
132 deferredResult.callback(); 129 deferredResult.callback();
133 130
134 return deferredResult; 131 return deferredResult;
135 }, 132 },
136 133
137 //------------------------------------------------------------------------- 134 //-------------------------------------------------------------------------
138 135
139 'directLoginElement': function () { 136 'directLoginElement': function () {
140 varresult; 137 varresult;
141 138
142 result = this.getElement('directLoginList'); 139 result = this.getElement('directLoginList');
143 if (result == null) { 140 if (result == null) {
144 this.append(this.getElement('cardDetails'), {tag:'h2', html:"Direct login"}); 141 this.append(this.getElement('cardDetails'), {tag:'h2', html:"Direct login"});
145 result = this.append(this.getElement('cardDetails'), {tag:'ul', cls:'rounded', id:this.getId('directLoginList')}); 142 result = this.append(this.getElement('cardDetails'), {tag:'ul', cls:'rounded', id:this.getId('directLoginList')});
146 } 143 }
147 144
148 return result; 145 return result;
149 }, 146 },
150 147
151 'addDirectLogin': function (aDirectLogin) { 148 'addDirectLogin': function (aDirectLogin) {
152 this.append(this.directLoginElement(), {tag:'li', cls:'directLogin forward', children:[ 149 this.append(this.directLoginElement(), {tag:'li', cls:'directLogin forward', children:[
153 {tag:'a', href:'#', html:"direct login", children:[ 150 {tag:'a', href:'#', html:"direct login", children:[
154 {tag:'small', cls:'favicon', children:[{tag:'img', cls:'favicon', src:'http://www.clipperz.com/favicon.ico'}]} 151 {tag:'small', cls:'favicon', children:[{tag:'img', cls:'favicon', src:'http://www.clipperz.com/favicon.ico'}]}
155 ]} 152 ]}
156 ]}) 153 ]})
157 154
158console.log("ADD DIRECT LOGIN", aDirectLogin);
159 }, 155 },
160 156
161 //========================================================================= 157 //=========================================================================
162 158
163 'showCard': function (aCard) { 159 'showCard': function (aCard) {
164 var deferredResult; 160 var deferredResult;
165 161
166 // this.render(); 162 // this.render();
167 163
168console.log("CardDetail.showCard", aCard);
169 deferredResult = new Clipperz.Async.Deferred("CardDetail.showCard", {trace:false}); 164 deferredResult = new Clipperz.Async.Deferred("CardDetail.showCard", {trace:false});
170 deferredResult.addMethod(aCard, 'label'); 165 deferredResult.addMethod(aCard, 'label');
171 deferredResult.addMethod(this, 'setTitle'); 166 deferredResult.addMethod(this, 'setTitle');
172 167
173 deferredResult.addMethod(aCard, 'fields'); 168 deferredResult.addMethod(aCard, 'fields');
174 deferredResult.addCallback(MochiKit.Base.values); 169 deferredResult.addCallback(MochiKit.Base.values);
175 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'addField')); 170 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'addField'));
176 171
177 deferredResult.addMethod(aCard, 'directLogins'); 172 deferredResult.addMethod(aCard, 'directLogins');
178 deferredResult.addCallback(MochiKit.Base.values); 173 deferredResult.addCallback(MochiKit.Base.values);
179 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'addDirectLogin')); 174 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'addDirectLogin'));
180 175
181 176
182 deferredResult.callback(); 177 deferredResult.callback();
183 178
184 return deferredResult; 179 return deferredResult;
185 // return Clipperz.Async.callbacks("CardDialogController.updateComponentState", [ 180 // return Clipperz.Async.callbacks("CardDialogController.updateComponentState", [
186 // MochiKit.Base.method(this.record(), 'hasPendingChanges'), 181 // MochiKit.Base.method(this.record(), 'hasPendingChanges'),
187 // MochiKit.Base.method(this.cardDialogComponent(), 'setShouldEnableSaving'), 182 // MochiKit.Base.method(this.cardDialogComponent(), 'setShouldEnableSaving'),
188 // 183 //
189 // MochiKit.Base.method(this.record(), 'label'), 184 // MochiKit.Base.method(this.record(), 'label'),
190 // MochiKit.Base.method(this.cardDialogComponent(), 'setTitle'), 185 // MochiKit.Base.method(this.cardDialogComponent(), 'setTitle'),
191 // MochiKit.Base.method(this.record(), 'notes'), 186 // MochiKit.Base.method(this.record(), 'notes'),
192 // MochiKit.Base.method(this.cardDialogComponent(), 'setNotes'), 187 // MochiKit.Base.method(this.cardDialogComponent(), 'setNotes'),
193 // 188 //
194 // MochiKit.Base.method(this.record(), 'fields'), 189 // MochiKit.Base.method(this.record(), 'fields'),
195 // MochiKit.Base.values, 190 // MochiKit.Base.values,
196 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithField')), 191 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithField')),
197// 192//
198 // MochiKit.Base.method(this.record(), 'directLogins'), 193 // MochiKit.Base.method(this.record(), 'directLogins'),
199 // MochiKit.Base.values, 194 // MochiKit.Base.values,
200 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithDirectLogin')), 195 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'addCardDialogComponentWithDirectLogin')),
201// 196//
202 // MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'), 197 // MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'),
203 // MochiKit.Base.noop 198 // MochiKit.Base.noop
204 // ], {trace:false}); 199 // ], {trace:false});
205 200
206 }, 201 },
207 202
208 //========================================================================= 203 //=========================================================================
209 204
210 'showCardDetails': function (someData) { 205 'showCardDetails': function (someData) {
211 this.element().innerHTML = ''; 206 this.element().innerHTML = '';
212 this.append(this.element(), [ 207 this.append(this.element(), [
213 {tag:'fieldset', id:this.getId('fields'), children:MochiKit.Base.map(function (aFieldData) { 208 {tag:'fieldset', id:this.getId('fields'), children:MochiKit.Base.map(function (aFieldData) {
214 return {tag:'div', cls:'row', children:[ 209 return {tag:'div', cls:'row', children:[
215 {tag:'label', html:aFieldData['label']}, 210 {tag:'label', html:aFieldData['label']},
216 // {tag:'span', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), html:aFieldData['value']} 211 // {tag:'span', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), html:aFieldData['value']}
217 {tag:'div', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), children:[ 212 {tag:'div', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), children:[
218 {tag:'div', children:[{tag:'p', html:aFieldData['value']}]} 213 {tag:'div', children:[{tag:'p', html:aFieldData['value']}]}
219 ]} 214 ]}
220 // {tag:'input', type:'text', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), value:aFieldData['value'], disabled:true} 215 // {tag:'input', type:'text', cls:('fieldValue ' + (aFieldData['isHidden']? 'password' : 'text')), value:aFieldData['value'], disabled:true}
221 216
222 ]} 217 ]}
223 }, someData['fields'])} 218 }, someData['fields'])}
224 ]); 219 ]);
225 220
226 MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.element(), ['span.password']), MochiKit.Base.bind(function (aPasswordElement) { 221 MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.element(), ['span.password']), MochiKit.Base.bind(function (aPasswordElement) {
227 MochiKit.Signal.connect(aPasswordElement, 'onclick', function (anEvent) { alert(MochiKit.DOM.scrapeText(anEvent.src())); }) 222 MochiKit.Signal.connect(aPasswordElement, 'onclick', function (anEvent) { alert(MochiKit.DOM.scrapeText(anEvent.src())); })
228 }, this)); 223 }, this));
229 224
230 if (someData['directLogins'].length > 0) { 225 if (someData['directLogins'].length > 0) {
231 this.append(this.element(), [ 226 this.append(this.element(), [
232 {tag:'h2', html:"Direct logins"}, 227 {tag:'h2', html:"Direct logins"},
233 {tag:'fieldset', id:this.getId('directLogins'), children:MochiKit.Base.map(function (aDirectLoginData) { 228 {tag:'fieldset', id:this.getId('directLogins'), children:MochiKit.Base.map(function (aDirectLoginData) {
234 return {tag:'div', cls:'row', id:('directLogin_' + aDirectLoginData['_reference']), children:[ 229 return {tag:'div', cls:'row', id:('directLogin_' + aDirectLoginData['_reference']), children:[
235 {tag:'img', cls:'favicon', src:aDirectLoginData['favicon']}, 230 {tag:'img', cls:'favicon', src:aDirectLoginData['favicon']},
236 // {tag:'input', cls:'directLogin', disabled:'disabled', type:'text', name:aDirectLoginData['label'], value:aDirectLoginData['label']} 231 // {tag:'input', cls:'directLogin', disabled:'disabled', type:'text', name:aDirectLoginData['label'], value:aDirectLoginData['label']}
237 {tag:'span', cls:'directLogin', html:aDirectLoginData['label']} 232 {tag:'span', cls:'directLogin', html:aDirectLoginData['label']}
238 ]} 233 ]}
239 }, someData['directLogins'])} 234 }, someData['directLogins'])}
240 ]); 235 ]);
241 236
242 MochiKit.Base.map(MochiKit.Base.bind(function (aRowNode) { 237 MochiKit.Base.map(MochiKit.Base.bind(function (aRowNode) {
243 MochiKit.Signal.connect(aRowNode, 'onclick', this, 'directLoginClickHandler'); 238 MochiKit.Signal.connect(aRowNode, 'onclick', this, 'directLoginClickHandler');
244 }, this), 239 }, this),
245 MochiKit.Selector.findChildElements(this.getElement('directLogins'), ['div.row']) 240 MochiKit.Selector.findChildElements(this.getElement('directLogins'), ['div.row'])
246 ) 241 )
247 }; 242 };
248 243
249 if (someData['notes'] != '') { 244 if (someData['notes'] != '') {
250 this.append(this.element(), [ 245 this.append(this.element(), [
251 {tag:'h2', html:"Notes"}, 246 {tag:'h2', html:"Notes"},
252 {tag:'fieldset', id:this.getId('fieldset'), children:[ 247 {tag:'fieldset', id:this.getId('fieldset'), children:[
253 {tag:'div', cls:'row notes', children:[ 248 {tag:'div', cls:'row notes', children:[
254 {tag:'span', html:someData['notes']} 249 {tag:'span', html:someData['notes']}
255 ]} 250 ]}
256 ]} 251 ]}
257 ]); 252 ]);
258 }; 253 };
259 254
260 return true; 255 return true;
261 }, 256 },
262 257
263 //------------------------------------------------------------------------- 258 //-------------------------------------------------------------------------
264/* 259/*
265 'toggleClickHandler': function (anEvent) { 260 'toggleClickHandler': function (anEvent) {
266 varnextState; 261 varnextState;
267 varfieldValue; 262 varfieldValue;
268 263
269//console.log("TOGGLE");
270 anEvent.preventDefault; 264 anEvent.preventDefault;
271 fieldValue = MochiKit.Selector.findChildElements(anEvent.src().parentNode.parentNode, ['span.password'])[0]; 265 fieldValue = MochiKit.Selector.findChildElements(anEvent.src().parentNode.parentNode, ['span.password'])[0];
272 266
273 nextState = (MochiKit.DOM.getNodeAttribute(anEvent.src(), 'toggled') != 'true'); 267 nextState = (MochiKit.DOM.getNodeAttribute(anEvent.src(), 'toggled') != 'true');
274 if (nextState) { 268 if (nextState) {
275 MochiKit.DOM.removeElementClass(fieldValue, 'clear'); 269 MochiKit.DOM.removeElementClass(fieldValue, 'clear');
276 } else { 270 } else {
277 MochiKit.DOM.addElementClass(fieldValue, 'clear'); 271 MochiKit.DOM.addElementClass(fieldValue, 'clear');
278 } 272 }
279 273
280 MochiKit.DOM.setNodeAttribute(anEvent.src(), 'toggled', nextState); 274 MochiKit.DOM.setNodeAttribute(anEvent.src(), 'toggled', nextState);
281 }, 275 },
282* / 276* /
283 //========================================================================= 277 //=========================================================================
284/* 278/*
285 'directLoginClickHandler': function (anEvent) { 279 'directLoginClickHandler': function (anEvent) {
286 anEvent.preventDefault(); 280 anEvent.preventDefault();
287 281
288 if (/(directLogin_)/.test(anEvent.src().id)) { 282 if (/(directLogin_)/.test(anEvent.src().id)) {
289 var directLoginReference; 283 var directLoginReference;
290 284
291 directLoginReference = anEvent.src().id.match(/(directLogin_)(.*)/)[2]; 285 directLoginReference = anEvent.src().id.match(/(directLogin_)(.*)/)[2];
292 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectedDirectLogin', {cardReference:this.cardReference(), directLoginReference:directLoginReference}); 286 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'selectedDirectLogin', {cardReference:this.cardReference(), directLoginReference:directLoginReference});
293 } 287 }
294 }, 288 },
295*/ 289*/
296 //========================================================================= 290 //=========================================================================
297 291
298 __syntaxFix__: "syntax fix" 292 __syntaxFix__: "syntax fix"
299}); 293});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardList.js b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardList.js
index a4aa212..a0e4879 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardList.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/CardList.js
@@ -1,254 +1,248 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Mobile.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Mobile.Components');
27 25
28Clipperz.PM.UI.Mobile.Components.CardList = function(args) { 26Clipperz.PM.UI.Mobile.Components.CardList = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Mobile.Components.CardList.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Mobile.Components.CardList.superclass.constructor.apply(this, arguments);
32 30
33 this._cardDetail = null; 31 this._cardDetail = null;
34 32
35 return this; 33 return this;
36} 34}
37 35
38//============================================================================= 36//=============================================================================
39 37
40Clipperz.Base.extend(Clipperz.PM.UI.Mobile.Components.CardList, Clipperz.PM.UI.Common.Components.BaseComponent, { 38Clipperz.Base.extend(Clipperz.PM.UI.Mobile.Components.CardList, Clipperz.PM.UI.Common.Components.BaseComponent, {
41 39
42 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
43 41
44 'toString': function () { 42 'toString': function () {
45 return "Clipperz.PM.UI.Mobile.Components.CardList component"; 43 return "Clipperz.PM.UI.Mobile.Components.CardList component";
46 }, 44 },
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'renderSelf': function () { 48 'renderSelf': function () {
51 this.append(this.element(), {tag:'div', cls:'cardList', children:[ 49 this.append(this.element(), {tag:'div', cls:'cardList', children:[
52 {tag:'div', cls:'toolbar', children:[ 50 {tag:'div', cls:'toolbar', children:[
53 {tag:'h1', html:"clipperz"}, 51 {tag:'h1', html:"clipperz"},
54 // {tag:'input', name:'search', type:'search', autocomplete:'off', placeholder:"search", id:this.getId('search')}, 52 // {tag:'input', name:'search', type:'search', autocomplete:'off', placeholder:"search", id:this.getId('search')},
55 {tag:'a', href:'#', id:'settings', cls:'button', html:"*"} 53 {tag:'a', href:'#', id:'settings', cls:'button', html:"*"}
56 ]}, 54 ]},
57 {tag:'div', cls:'scroll', id:this.getId('listBox'), children:[ 55 {tag:'div', cls:'scroll', id:this.getId('listBox'), children:[
58 {tag:'ul', cls:'rounded', id:this.getId('list'), children:[ 56 {tag:'ul', cls:'rounded', id:this.getId('list'), children:[
59 {tag:'li', html:'loading'} 57 {tag:'li', html:'loading'}
60 ]} 58 ]}
61 ]} 59 ]}
62 ]}); 60 ]});
63 61
64 MochiKit.Signal.connect(this.getElement('list'), 'onclick', this, 'cardSelectionHandler'); 62 MochiKit.Signal.connect(this.getElement('list'), 'onclick', this, 'cardSelectionHandler');
65 MochiKit.Signal.connect(this.getElement('list'), 'ontouchstart',this, 'cardSelectionHandler'); 63 MochiKit.Signal.connect(this.getElement('list'), 'ontouchstart',this, 'cardSelectionHandler');
66 // MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onsubmit', this,'searchHandler'); 64 // MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onsubmit', this,'searchHandler');
67 // MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeydown', this,'searchHandler'); 65 // MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeydown', this,'searchHandler');
68 // MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeyup', this,'searchHandler'); 66 // MochiKit.Signal.connect(this.getElement('cardListSearchForm'), 'onkeyup', this,'searchHandler');
69 67
70 // MochiKit.Signal.connect(this.getElement('cardListPanel'), 'onclick', this,'cardListClickHandler'); 68 // MochiKit.Signal.connect(this.getElement('cardListPanel'), 'onclick', this,'cardListClickHandler');
71 // MochiKit.Signal.connect('backButton', 'onclick', this,'backButtonClickHandler'); 69 // MochiKit.Signal.connect('backButton', 'onclick', this,'backButtonClickHandler');
72 70
73 // MochiKit.Style.hideElement('backButton'); 71 // MochiKit.Style.hideElement('backButton');
74 // MochiKit.Style.hideElement(this.getElement('cardDetail')); 72 // MochiKit.Style.hideElement(this.getElement('cardDetail'));
75 }, 73 },
76 74
77 'showCards': function (someCards) { 75 'showCards': function (someCards) {
78 varcardListElement; 76 varcardListElement;
79 if (this.isFullyRendered() == false) { 77 if (this.isFullyRendered() == false) {
80 this.render(); 78 this.render();
81 }; 79 };
82 80
83 cardListElement = this.getElement('list') 81 cardListElement = this.getElement('list')
84 82
85 cardInfo = { 83 cardInfo = {
86 '_rowObject': MochiKit.Async.succeed, 84 '_rowObject': MochiKit.Async.succeed,
87 '_reference': MochiKit.Base.methodcaller('reference'), 85 '_reference': MochiKit.Base.methodcaller('reference'),
88 '_searchableContent':MochiKit.Base.methodcaller('searchableContent'), 86 '_searchableContent':MochiKit.Base.methodcaller('searchableContent'),
89 'label': MochiKit.Base.methodcaller('label'), 87 'label': MochiKit.Base.methodcaller('label'),
90 'favicon': MochiKit.Base.methodcaller('favicon') 88 'favicon': MochiKit.Base.methodcaller('favicon')
91 }; 89 };
92 90
93//console.log("someCards", someCards);
94 deferredResult = new Clipperz.Async.Deferred("CardList.showCards", {trace:false}); 91 deferredResult = new Clipperz.Async.Deferred("CardList.showCards", {trace:false});
95 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("CardList.value - collectResults", cardInfo, {trace:false})); 92 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("CardList.value - collectResults", cardInfo, {trace:false}));
96 deferredResult.addCallback(Clipperz.Async.collectAll); 93 deferredResult.addCallback(Clipperz.Async.collectAll);
97 deferredResult.addCallback(MochiKit.Base.methodcaller('sort', Clipperz.Base.caseInsensitiveKeyComparator('label'))); 94 deferredResult.addCallback(MochiKit.Base.methodcaller('sort', Clipperz.Base.caseInsensitiveKeyComparator('label')));
98 deferredResult.addCallbackPass(MochiKit.DOM.replaceChildNodes, cardListElement); 95 deferredResult.addCallbackPass(MochiKit.DOM.replaceChildNodes, cardListElement);
99 // deferredResult.addCallbackPass(MochiKit.DOM.removeElementClass, cardListElement, 'loading'); 96 // deferredResult.addCallbackPass(MochiKit.DOM.removeElementClass, cardListElement, 'loading');
100 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'appendCardToList', cardListElement)); 97 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'appendCardToList', cardListElement));
101 deferredResult.callback(someCards); 98 deferredResult.callback(someCards);
102 }, 99 },
103 100
104 'appendCardToList': function (aCardListElement, aCardInfo) { 101 'appendCardToList': function (aCardListElement, aCardInfo) {
105//console.log("appendCardToList", aCardInfo);
106 this.append(aCardListElement, {tag:'li', cls:'cardListItem arrow', cardreference:aCardInfo['_reference'], children:[ 102 this.append(aCardListElement, {tag:'li', cls:'cardListItem arrow', cardreference:aCardInfo['_reference'], children:[
107 {tag:'a', href:'#', html:aCardInfo['label'], children:[ 103 {tag:'a', href:'#', html:aCardInfo['label'], children:[
108 {tag:'small', cls:'favicon', children:[{tag:'img', cls:'favicon', src:aCardInfo['favicon']}]} 104 {tag:'small', cls:'favicon', children:[{tag:'img', cls:'favicon', src:aCardInfo['favicon']}]}
109 ]} 105 ]}
110 ]}); 106 ]});
111 }, 107 },
112 108
113 'cardSelectionHandler': function (anEvent) { 109 'cardSelectionHandler': function (anEvent) {
114 var listElement; 110 var listElement;
115 varcardReference; 111 varcardReference;
116 112
117 anEvent.preventDefault(); 113 anEvent.preventDefault();
118 114
119 listElement = anEvent.target(); 115 listElement = anEvent.target();
120 if (MochiKit.DOM.getNodeAttribute(listElement, 'cardreference') == null) { 116 if (MochiKit.DOM.getNodeAttribute(listElement, 'cardreference') == null) {
121 listElement = MochiKit.DOM.getFirstParentByTagAndClassName(anEvent.target(), tagName='li', className='cardListItem'); 117 listElement = MochiKit.DOM.getFirstParentByTagAndClassName(anEvent.target(), tagName='li', className='cardListItem');
122 } 118 }
123 cardReference = MochiKit.DOM.getNodeAttribute(listElement, 'cardreference'); 119 cardReference = MochiKit.DOM.getNodeAttribute(listElement, 'cardreference');
124console.log("###", listElement, cardReference);
125 //TODO: Notify card with reference MochiKit.DOM.getNodeAttribute(listElement, 'cardreference') has been selected 120 //TODO: Notify card with reference MochiKit.DOM.getNodeAttribute(listElement, 'cardreference') has been selected
126 MochiKit.Signal.signal(this, 'selectedCard', cardReference); 121 MochiKit.Signal.signal(this, 'selectedCard', cardReference);
127 }, 122 },
128 123
129 //------------------------------------------------------------------------- 124 //-------------------------------------------------------------------------
130/* 125/*
131 'searchHandler': function (anEvent) { 126 'searchHandler': function (anEvent) {
132 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ENTER')) { //RETURN 127 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ENTER')) { //RETURN
133 anEvent.preventDefault(); 128 anEvent.preventDefault();
134 } else { 129 } else {
135 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ESCAPE')) { 130 if ((typeof(anEvent.key()) != 'undefined') && (anEvent.key().string == 'KEY_ESCAPE')) {
136 anEvent.target().value = ""; 131 anEvent.target().value = "";
137 } 132 }
138 133
139 if (anEvent.type() == 'keyup') { 134 if (anEvent.type() == 'keyup') {
140 MochiKit.Signal.signal(this, 'searchEvent', anEvent.target().value); 135 MochiKit.Signal.signal(this, 'searchEvent', anEvent.target().value);
141 } 136 }
142 } 137 }
143 }, 138 },
144 139
145 //------------------------------------------------------------------------- 140 //-------------------------------------------------------------------------
146 141
147 'update': function (someObjects) { 142 'update': function (someObjects) {
148 varcardListPanel; 143 varcardListPanel;
149 var i,c; 144 var i,c;
150 145
151 cardListPanel = this.getElement('cardListPanel'); 146 cardListPanel = this.getElement('cardListPanel');
152 cardListPanel.innerHTML = ''; 147 cardListPanel.innerHTML = '';
153 148
154 c = someObjects.length; 149 c = someObjects.length;
155 150
156 for (i=0; i<c; i++) { 151 for (i=0; i<c; i++) {
157 this.append(cardListPanel, {tag:'li', cls:'cardListItem', id:('cardListItem_' + someObjects[i]['_reference']), children:[ 152 this.append(cardListPanel, {tag:'li', cls:'cardListItem', id:('cardListItem_' + someObjects[i]['_reference']), children:[
158 {tag:'img', src:(someObjects[i]['favicon'] ? someObjects[i]['favicon'] : 'data:application/octet-stream;charset=utf-8;base64,AAABAAEAFxcAAAEAGAD8BgAAFgAAACgAAAAXAAAALgAAAAEAGAAAAAAAAAAAABIXAAASFwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////9zAC////////////////////////////////////////////////////////////////////////////////////////////9pAG////////////////////////////////////////////////////////////////////////////////////////////9rAC////////////////////////////////////////////////////////////////////////////////////////////9yAHP////////////////////////IyMizs7O6urrq6ur////////////Ozs6zs7Ozs7Pq6ur///////////////////////8AAAD////////////////////V1dWXl5eXl5eXl5elpaX4+Pj////Ozs6Xl5eXl5eXl5eenp7///////////////////////8AAAD////////////////////Ozs6Xl5eXl5eXl5eXl5fBwcHq6uqenp6Xl5eXl5eXl5eXl5f///////////////////////8AAAD////////////////////j4+OXl5eXl5eXl5eXl5eXl5elpaWXl5eXl5eXl5eXl5ezs7P///////////////////////8AAAD////////////////////////IyMiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eenp7x8fH////////////////////////////////////////////////////4+PilpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5fOzs7////////////////////////////////////////////////////////q6uq6urqXl5eXl5eXl5eXl5eXl5eXl5eenp7V1dX4+Pj///////////////////////8AAAD////////////4+PjOzs6lpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e6urrj4+P///////////////8AAAD////////////BwcGXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fx8fH///////////8AAAD///////////+zs7OXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fj4+P///////////8AAAD////////////IyMiXl5eXl5eXl5eXl5e6urqXl5eXl5eXl5eXl5esrKylpaWXl5eXl5eXl5eenp7x8fH///////////8AAAD////////////////Ozs7Ozs7V1dX4+Pj///+Xl5eXl5eXl5eXl5fOzs7////q6urOzs7Ozs7q6ur///////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD////////////////////////////////////IyMiXl5eXl5eenp7x8fH///////////////////////////////////8AAAD////////////////////////////////////////j4+Pj4+Px8fH///////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo=')}, 153 {tag:'img', src:(someObjects[i]['favicon'] ? someObjects[i]['favicon'] : 'data:application/octet-stream;charset=utf-8;base64,AAABAAEAFxcAAAEAGAD8BgAAFgAAACgAAAAXAAAALgAAAAEAGAAAAAAAAAAAABIXAAASFwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////9zAC////////////////////////////////////////////////////////////////////////////////////////////9pAG////////////////////////////////////////////////////////////////////////////////////////////9rAC////////////////////////////////////////////////////////////////////////////////////////////9yAHP////////////////////////IyMizs7O6urrq6ur////////////Ozs6zs7Ozs7Pq6ur///////////////////////8AAAD////////////////////V1dWXl5eXl5eXl5elpaX4+Pj////Ozs6Xl5eXl5eXl5eenp7///////////////////////8AAAD////////////////////Ozs6Xl5eXl5eXl5eXl5fBwcHq6uqenp6Xl5eXl5eXl5eXl5f///////////////////////8AAAD////////////////////j4+OXl5eXl5eXl5eXl5eXl5elpaWXl5eXl5eXl5eXl5ezs7P///////////////////////8AAAD////////////////////////IyMiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eenp7x8fH////////////////////////////////////////////////////4+PilpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5fOzs7////////////////////////////////////////////////////////q6uq6urqXl5eXl5eXl5eXl5eXl5eXl5eenp7V1dX4+Pj///////////////////////8AAAD////////////4+PjOzs6lpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e6urrj4+P///////////////8AAAD////////////BwcGXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fx8fH///////////8AAAD///////////+zs7OXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fj4+P///////////8AAAD////////////IyMiXl5eXl5eXl5eXl5e6urqXl5eXl5eXl5eXl5esrKylpaWXl5eXl5eXl5eenp7x8fH///////////8AAAD////////////////Ozs7Ozs7V1dX4+Pj///+Xl5eXl5eXl5eXl5fOzs7////q6urOzs7Ozs7q6ur///////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD////////////////////////////////////IyMiXl5eXl5eenp7x8fH///////////////////////////////////8AAAD////////////////////////////////////////j4+Pj4+Px8fH///////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo=')},
159 {tag:'a', id:('cardListReference_' + someObjects[i]['_reference']), href:'#', html:someObjects[i]['label']} 154 {tag:'a', id:('cardListReference_' + someObjects[i]['_reference']), href:'#', html:someObjects[i]['label']}
160 ]}) 155 ]})
161 156
162 MochiKit.Signal.connect('cardListItem_' + someObjects[i]['_reference'], 'onclick', this, 'cardListClickHandler'); 157 MochiKit.Signal.connect('cardListItem_' + someObjects[i]['_reference'], 'onclick', this, 'cardListClickHandler');
163 } 158 }
164 159
165 }, 160 },
166 161
167 'cardListClickHandler': function (anEvent) { 162 'cardListClickHandler': function (anEvent) {
168 anEvent.preventDefault(); 163 anEvent.preventDefault();
169 164
170 if (/(cardListReference_|cardListItem_)/.test(anEvent.target().id)) { 165 if (/(cardListReference_|cardListItem_)/.test(anEvent.target().id)) {
171 var cardListReference; 166 var cardListReference;
172 167
173 cardListReference = anEvent.target().id.match(/(cardListReference_|cardListItem_)(.*)/)[2]; 168 cardListReference = anEvent.target().id.match(/(cardListReference_|cardListItem_)(.*)/)[2];
174//console.log("Showing detail for card named", cardListReference);
175 MochiKit.Signal.signal(this, 'selectedCard', cardListReference); 169 MochiKit.Signal.signal(this, 'selectedCard', cardListReference);
176 } 170 }
177 }, 171 },
178 172
179 //========================================================================= 173 //=========================================================================
180 174
181 'cardDetail': function (someData) { 175 'cardDetail': function (someData) {
182 if (this._cardDetail == null) { 176 if (this._cardDetail == null) {
183 this._cardDetail = new Clipperz.PM.UI.Mobile.Components.CardDetail({element:this.getElement('cardDetail')}); 177 this._cardDetail = new Clipperz.PM.UI.Mobile.Components.CardDetail({element:this.getElement('cardDetail')});
184 } 178 }
185 179
186 return this._cardDetail; 180 return this._cardDetail;
187 }, 181 },
188 182
189 //------------------------------------------------------------------------- 183 //-------------------------------------------------------------------------
190 184
191 'removeCardDetail': function () { 185 'removeCardDetail': function () {
192 if (this._cardDetail != null) { 186 if (this._cardDetail != null) {
193 this._cardDetail.remove(); 187 this._cardDetail.remove();
194 this._cardDetail = null; 188 this._cardDetail = null;
195 } 189 }
196 }, 190 },
197 191
198 //========================================================================= 192 //=========================================================================
199 193
200 'showCard': function (someData) { 194 'showCard': function (someData) {
201 vardeferredResult; 195 vardeferredResult;
202 varoffset; 196 varoffset;
203 197
204 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480); 198 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480);
205 this.cardDetail().render(); 199 this.cardDetail().render();
206 this.cardDetail().setCardReference(someData['_reference']); 200 this.cardDetail().setCardReference(someData['_reference']);
207 MochiKit.Style.setElementPosition(this.cardDetail().element(), {x:offset}); 201 MochiKit.Style.setElementPosition(this.cardDetail().element(), {x:offset});
208 new MochiKit.Visual.Sequence([ 202 new MochiKit.Visual.Sequence([
209 // new MochiKit.Visual.Move(this.cardDetail().element(), {x:offset, y:45, mode:'absolute', duration:0, sync:true}), 203 // new MochiKit.Visual.Move(this.cardDetail().element(), {x:offset, y:45, mode:'absolute', duration:0, sync:true}),
210 new MochiKit.Visual.Parallel([ 204 new MochiKit.Visual.Parallel([
211 new MochiKit.Visual.Move(this.getElement('cardList'), {x:-offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}), 205 new MochiKit.Visual.Move(this.getElement('cardList'), {x:-offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
212 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:0, y:45, mode:'absolute',transition:MochiKit.Visual.Transitions.linear, sync:true}), 206 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:0, y:45, mode:'absolute',transition:MochiKit.Visual.Transitions.linear, sync:true}),
213 // new MochiKit.Visual.ScrollTo('toolbar', {sync:true}), 207 // new MochiKit.Visual.ScrollTo('toolbar', {sync:true}),
214 MochiKit.Visual.appear ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true}) 208 MochiKit.Visual.appear ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true})
215 ], {duration:1, sync:true}), 209 ], {duration:1, sync:true}),
216 MochiKit.Visual.fade(this.getElement('cardList'), {duration:0, sync:true}) 210 MochiKit.Visual.fade(this.getElement('cardList'), {duration:0, sync:true})
217 ], {}) 211 ], {})
218 212
219 MochiKit.DOM.getElement('pageTitle').innerHTML = someData['title']; 213 MochiKit.DOM.getElement('pageTitle').innerHTML = someData['title'];
220 214
221 return true; 215 return true;
222 }, 216 },
223 217
224 //------------------------------------------------------------------------- 218 //-------------------------------------------------------------------------
225 219
226 'showCardDetails': function (someData) { 220 'showCardDetails': function (someData) {
227 return this.cardDetail().showCardDetails(someData); 221 return this.cardDetail().showCardDetails(someData);
228 }, 222 },
229 223
230 //========================================================================= 224 //=========================================================================
231 225
232 'backButtonClickHandler': function (anEvent) { 226 'backButtonClickHandler': function (anEvent) {
233 varoffset; 227 varoffset;
234 228
235 anEvent.preventDefault(); 229 anEvent.preventDefault();
236 230
237 MochiKit.DOM.getElement('pageTitle').innerHTML = "cards"; 231 MochiKit.DOM.getElement('pageTitle').innerHTML = "cards";
238 232
239 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480); 233 offset = ((MochiKit.DOM.getNodeAttribute(MochiKit.DOM.currentDocument().body, 'orientation') == 'portrait') ? 320 : 480);
240 MochiKit.Style.setElementPosition(this.getElement('cardList'), {x:-offset}); 234 MochiKit.Style.setElementPosition(this.getElement('cardList'), {x:-offset});
241 MochiKit.DOM.showElement(this.getElement('cardList')); 235 MochiKit.DOM.showElement(this.getElement('cardList'));
242 236
243 new MochiKit.Visual.Parallel([ 237 new MochiKit.Visual.Parallel([
244 new MochiKit.Visual.Move(this.getElement('cardList'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}), 238 new MochiKit.Visual.Move(this.getElement('cardList'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
245 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}), 239 new MochiKit.Visual.Move(this.getElement('cardDetail'), {x:offset, y:0, mode:'relative',transition:MochiKit.Visual.Transitions.linear, sync:true}),
246 MochiKit.Visual.fade (this.getElement('cardDetail'), { transition:MochiKit.Visual.Transitions.linear, sync:true}), 240 MochiKit.Visual.fade (this.getElement('cardDetail'), { transition:MochiKit.Visual.Transitions.linear, sync:true}),
247 MochiKit.Visual.fade ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true}) 241 MochiKit.Visual.fade ('backButton', { transition:MochiKit.Visual.Transitions.linear, sync:true})
248 ], {duration:1, afterFinish:MochiKit.Base.method(this, 'removeCardDetail')}) 242 ], {duration:1, afterFinish:MochiKit.Base.method(this, 'removeCardDetail')})
249 243
250 }, 244 },
251*/ 245*/
252 //========================================================================= 246 //=========================================================================
253 __syntaxFix__: "syntax fix" 247 __syntaxFix__: "syntax fix"
254}); 248});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/LoginForm.js b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/LoginForm.js
index eafcdbc..3aeac0c 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/LoginForm.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Components/LoginForm.js
@@ -1,356 +1,347 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Mobile.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Mobile.Components');
27 25
28Clipperz.PM.UI.Mobile.Components.LoginForm = function(args) { 26Clipperz.PM.UI.Mobile.Components.LoginForm = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 this._pin = ''; 29 this._pin = '';
32 30
33 this._message = null; 31 this._message = null;
34 this._steps = 0; 32 this._steps = 0;
35 this._actualSteps = 0; 33 this._actualSteps = 0;
36 34
37 this._callback = null; 35 this._callback = null;
38 this._errorCallback = null; 36 this._errorCallback = null;
39 37
40 this._mode = 'CREDENTIALS'; 38 this._mode = 'CREDENTIALS';
41 39
42 Clipperz.PM.UI.Mobile.Components.LoginForm.superclass.constructor.apply(this, arguments); 40 Clipperz.PM.UI.Mobile.Components.LoginForm.superclass.constructor.apply(this, arguments);
43 41
44 return this; 42 return this;
45} 43}
46 44
47//============================================================================= 45//=============================================================================
48 46
49Clipperz.Base.extend(Clipperz.PM.UI.Mobile.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, { 47Clipperz.Base.extend(Clipperz.PM.UI.Mobile.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, {
50 48
51 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
52 50
53 'toString': function () { 51 'toString': function () {
54 return "Clipperz.PM.UI.Mobile.Components.LoginForm component"; 52 return "Clipperz.PM.UI.Mobile.Components.LoginForm component";
55 }, 53 },
56 54
57 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
58 56
59 'callback': function () { 57 'callback': function () {
60 return this._callback; 58 return this._callback;
61 }, 59 },
62 60
63 'errorCallback': function () { 61 'errorCallback': function () {
64 return this._errorCallback; 62 return this._errorCallback;
65 }, 63 },
66 64
67 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
68 66
69 'mode': function () { 67 'mode': function () {
70 return this._mode; 68 return this._mode;
71 }, 69 },
72 70
73 'setMode': function (aValue) { 71 'setMode': function (aValue) {
74 this._mode = aValue; 72 this._mode = aValue;
75 }, 73 },
76 74
77 //.......................................................................... 75 //..........................................................................
78 76
79 'pin': function () { 77 'pin': function () {
80 return this._pin; 78 return this._pin;
81 }, 79 },
82 80
83 'setPin': function (aValue) { 81 'setPin': function (aValue) {
84 this._pin = aValue; 82 this._pin = aValue;
85 }, 83 },
86 84
87 //.......................................................................... 85 //..........................................................................
88 86
89 'username': function () { 87 'username': function () {
90 return this._username; 88 return this._username;
91 }, 89 },
92 90
93 'setUsername': function (aValue) { 91 'setUsername': function (aValue) {
94 this._username = aValue; 92 this._username = aValue;
95 }, 93 },
96 94
97 //.......................................................................... 95 //..........................................................................
98 96
99 'passphrase': function () { 97 'passphrase': function () {
100 return this._passphrase; 98 return this._passphrase;
101 }, 99 },
102 100
103 'setPassphrase': function (aValue) { 101 'setPassphrase': function (aValue) {
104 this._passphrase = aValue; 102 this._passphrase = aValue;
105 }, 103 },
106 104
107 //------------------------------------------------------------------------- 105 //-------------------------------------------------------------------------
108 106
109 'message': function () { 107 'message': function () {
110 return this._message; 108 return this._message;
111 }, 109 },
112 110
113 '_setMessage': function (aValue) { 111 '_setMessage': function (aValue) {
114 this._message = aValue; 112 this._message = aValue;
115 113
116 if (aValue == null) { 114 if (aValue == null) {
117 MochiKit.Style.hideElement(this.getElement('credentialsMessage')); 115 MochiKit.Style.hideElement(this.getElement('credentialsMessage'));
118 } else { 116 } else {
119 this.getElement('message').innerHTML = aValue; 117 this.getElement('message').innerHTML = aValue;
120 MochiKit.Style.showElement(this.getElement('credentialsMessage')); 118 MochiKit.Style.showElement(this.getElement('credentialsMessage'));
121 } 119 }
122 }, 120 },
123 121
124 'setMessage': function (aValue) { 122 'setMessage': function (aValue) {
125 this._setMessage(aValue); 123 this._setMessage(aValue);
126 MochiKit.DOM.removeElementClass(this.getElement('credentialsMessage'), 'error'); 124 MochiKit.DOM.removeElementClass(this.getElement('credentialsMessage'), 'error');
127 }, 125 },
128 126
129 'setErrorMessage': function (aValue) { 127 'setErrorMessage': function (aValue) {
130 this._setMessage(aValue); 128 this._setMessage(aValue);
131 MochiKit.DOM.addElementClass(this.getElement('credentialsMessage'), 'error'); 129 MochiKit.DOM.addElementClass(this.getElement('credentialsMessage'), 'error');
132 }, 130 },
133 131
134 //------------------------------------------------------------------------- 132 //-------------------------------------------------------------------------
135 133
136 'setCallbacks': function (args) { 134 'setCallbacks': function (args) {
137 this._callback = args['callback']; 135 this._callback = args['callback'];
138 this._errorCallback = args['errorCallback']; 136 this._errorCallback = args['errorCallback'];
139 }, 137 },
140 138
141 'showErrors': function (args) { 139 'showErrors': function (args) {
142//console.log("LoginForm.showErrors", args);
143 if (args['previousFailedAttempt'] == 'LOGIN') { 140 if (args['previousFailedAttempt'] == 'LOGIN') {
144 this.setErrorMessage("Wrong credentials"); 141 this.setErrorMessage("Wrong credentials");
145 } else if (args['previousFailedAttempt'] == 'PIN') { 142 } else if (args['previousFailedAttempt'] == 'PIN') {
146 if (args['failedAttempts'] == -1) { 143 if (args['failedAttempts'] == -1) {
147 this.setErrorMessage("Wrong PIN - Resetted"); 144 this.setErrorMessage("Wrong PIN - Resetted");
148 } else { 145 } else {
149 this.setErrorMessage("Wrong PIN"); 146 this.setErrorMessage("Wrong PIN");
150 } 147 }
151 } else { 148 } else {
152 this.setMessage(null); 149 this.setMessage(null);
153 } 150 }
154 }, 151 },
155 152
156 'updateWithArgs': function (args) { 153 'updateWithArgs': function (args) {
157 this.renderIfNeeded(); 154 this.renderIfNeeded();
158 this.setCallbacks(args); 155 this.setCallbacks(args);
159 this.showErrors(args); 156 this.showErrors(args);
160 this.updateRendering(); 157 this.updateRendering();
161 }, 158 },
162 159
163 'showPinLogin': function (args) { 160 'showPinLogin': function (args) {
164 this.setPin(''); 161 this.setPin('');
165 this.setMode('PIN'); 162 this.setMode('PIN');
166 this.updateWithArgs(args); 163 this.updateWithArgs(args);
167 164
168 // $(this.getAnchor('PIN')).focus(); 165 // $(this.getAnchor('PIN')).focus();
169 this.getElement('PIN').focus(); 166 this.getElement('PIN').focus();
170 }, 167 },
171 168
172 'showCredentialsLogin': function (args) { 169 'showCredentialsLogin': function (args) {
173 this.setMode('CREDENTIALS'); 170 this.setMode('CREDENTIALS');
174 this.updateWithArgs(args); 171 this.updateWithArgs(args);
175 172
176 if (this.getElement('usernameField').value.length == 0) { 173 if (this.getElement('usernameField').value.length == 0) {
177 // $(this.getAnchor('usernameField')).focus(); 174 // $(this.getAnchor('usernameField')).focus();
178 this.getElement('usernameField').focus(); 175 this.getElement('usernameField').focus();
179 } else { 176 } else {
180 // $(this.getAnchor('passphraseField')).focus(); 177 // $(this.getAnchor('passphraseField')).focus();
181 this.getElement('passphraseField').focus(); 178 this.getElement('passphraseField').focus();
182 this.getElement('passphraseField').select(); 179 this.getElement('passphraseField').select();
183 } 180 }
184 }, 181 },
185 182
186 //------------------------------------------------------------------------- 183 //-------------------------------------------------------------------------
187 184
188 'renderIfNeeded': function () { 185 'renderIfNeeded': function () {
189 if (this.isFullyRendered() == false) { 186 if (this.isFullyRendered() == false) {
190 this.render(); 187 this.render();
191 }; 188 };
192 this.updateRendering(); 189 this.updateRendering();
193 }, 190 },
194 191
195 'updateRendering': function () { 192 'updateRendering': function () {
196 MochiKit.Style.showElement(this.getElement('credentialsBody')); 193 MochiKit.Style.showElement(this.getElement('credentialsBody'));
197 MochiKit.Style.hideElement(this.getElement('validating')); 194 MochiKit.Style.hideElement(this.getElement('validating'));
198 195
199 // this.hideAllPanes(); 196 // this.hideAllPanes();
200 MochiKit.Base.map(function (aNode) { MochiKit.Style.hideElement(aNode); }, MochiKit.Selector.findDocElements('div.credentialsBody > div')); 197 MochiKit.Base.map(function (aNode) { MochiKit.Style.hideElement(aNode); }, MochiKit.Selector.findDocElements('div.credentialsBody > div'));
201 if (this.mode() == 'CREDENTIALS') { 198 if (this.mode() == 'CREDENTIALS') {
202 selectedPanel = this.getElement('credentials') 199 selectedPanel = this.getElement('credentials')
203 } else if (this.mode() == 'PIN') { 200 } else if (this.mode() == 'PIN') {
204 selectedPanel = this.getElement('pin') 201 selectedPanel = this.getElement('pin')
205 // this.updatePinDisplay(); 202 // this.updatePinDisplay();
206 } else { 203 } else {
207 throw 'Unhandled login form mode'; 204 throw 'Unhandled login form mode';
208 } 205 }
209 MochiKit.Style.showElement(selectedPanel); 206 MochiKit.Style.showElement(selectedPanel);
210 207
211 MochiKit.Style.hideElement(this.getElement('validating')); 208 MochiKit.Style.hideElement(this.getElement('validating'));
212 }, 209 },
213 210
214 'renderSelf': function() { 211 'renderSelf': function() {
215 var selectedPanel; 212 var selectedPanel;
216 this.append(this.element(), {tag:'div', id:'login', children:[ 213 this.append(this.element(), {tag:'div', id:'login', children:[
217 {tag:'div', cls:'toolbar', children:[ 214 {tag:'div', cls:'toolbar', children:[
218 {tag:'h1', html:"clipperz"} 215 {tag:'h1', html:"clipperz"}
219 ]}, 216 ]},
220 {tag:'div', cls:'scroll', children:[ 217 {tag:'div', cls:'scroll', children:[
221 //================================================================== 218 //==================================================================
222 {tag:'div', cls:'credentialsMessage', id:this.getId('credentialsMessage'), children:[ 219 {tag:'div', cls:'credentialsMessage', id:this.getId('credentialsMessage'), children:[
223 {tag:'h1', cls:'message', id:this.getId('message'), html:"Message"} 220 {tag:'h1', cls:'message', id:this.getId('message'), html:"Message"}
224 ]}, 221 ]},
225 //================================================================== 222 //==================================================================
226 {tag:'div', cls:'credentialsBody', id:this.getId('credentialsBody'), children:[ 223 {tag:'div', cls:'credentialsBody', id:this.getId('credentialsBody'), children:[
227 //-------------------------------------------------------------- 224 //--------------------------------------------------------------
228 {tag:'div', cls:'pin', id:this.getId('pin'), children:[ 225 {tag:'div', cls:'pin', id:this.getId('pin'), children:[
229 {tag:'form', cls:'scroll', id:this.getId('pinForm'), children:[ 226 {tag:'form', cls:'scroll', id:this.getId('pinForm'), children:[
230 {tag:'ul', cls:'edit rounded', children:[ 227 {tag:'ul', cls:'edit rounded', children:[
231 {tag:'li', children:[{tag:'input', type:'number', name:'PIN', placeholder:"PIN", id:this.getId('PIN') }]}, 228 {tag:'li', children:[{tag:'input', type:'number', name:'PIN', placeholder:"PIN", id:this.getId('PIN') }]},
232 ]}, 229 ]},
233 {tag:'a', href:'#', cls:'greenButton', id:this.getId('pinSubmitButton'), html:"Login"} 230 {tag:'a', href:'#', cls:'greenButton', id:this.getId('pinSubmitButton'), html:"Login"}
234 ]} 231 ]}
235 ]}, 232 ]},
236 //-------------------------------------------------------------- 233 //--------------------------------------------------------------
237 {tag:'div', cls:'credentials', id:this.getId('credentials'), children:[ 234 {tag:'div', cls:'credentials', id:this.getId('credentials'), children:[
238 {tag:'form', cls:'scroll', id:this.getId('credentialsForm'), children:[ 235 {tag:'form', cls:'scroll', id:this.getId('credentialsForm'), children:[
239 {tag:'ul', cls:'edit rounded', children:[ 236 {tag:'ul', cls:'edit rounded', children:[
240 {tag:'li', children:[{tag:'input', type:'email', name:'name', /*value:'joe',*/ placeholder:"username", id:this.getId('usernameField') }]}, 237 {tag:'li', children:[{tag:'input', type:'email', name:'name', /*value:'joe',*/ placeholder:"username", id:this.getId('usernameField') }]},
241 {tag:'li', children:[{tag:'input', type:'password', name:'passphrase', /*value:'clipperz',*/placeholder:"passphrase", id:this.getId('passphraseField') }]} 238 {tag:'li', children:[{tag:'input', type:'password', name:'passphrase', /*value:'clipperz',*/placeholder:"passphrase", id:this.getId('passphraseField') }]}
242 ]}, 239 ]},
243 {tag:'a', href:'#', cls:'greenButton', id:this.getId('credentialsSubmitButton'), html:"Login"} 240 {tag:'a', href:'#', cls:'greenButton', id:this.getId('credentialsSubmitButton'), html:"Login"}
244 // {tag:'input', type:'submit', cls:'greenButton', id:this.getId('credentialsSubmitButton'), value:"Login"} 241 // {tag:'input', type:'submit', cls:'greenButton', id:this.getId('credentialsSubmitButton'), value:"Login"}
245 242
246 ]} 243 ]}
247 ]}, 244 ]},
248 //-------------------------------------------------------------- 245 //--------------------------------------------------------------
249 ]}, 246 ]},
250 //================================================================== 247 //==================================================================
251 {tag:'div', cls:'validating', id:this.getId('validating'), children:[ 248 {tag:'div', cls:'validating', id:this.getId('validating'), children:[
252 {tag:'div', cls:'loading', children:[ 249 {tag:'div', cls:'loading', children:[
253 {tag:'div', cls:'spinner', children:[ 250 {tag:'div', cls:'spinner', children:[
254 {tag:'div', cls:'bar01'}, 251 {tag:'div', cls:'bar01'},
255 {tag:'div', cls:'bar02'}, 252 {tag:'div', cls:'bar02'},
256 {tag:'div', cls:'bar03'}, 253 {tag:'div', cls:'bar03'},
257 {tag:'div', cls:'bar04'}, 254 {tag:'div', cls:'bar04'},
258 {tag:'div', cls:'bar05'}, 255 {tag:'div', cls:'bar05'},
259 {tag:'div', cls:'bar06'}, 256 {tag:'div', cls:'bar06'},
260 {tag:'div', cls:'bar07'}, 257 {tag:'div', cls:'bar07'},
261 {tag:'div', cls:'bar08'}, 258 {tag:'div', cls:'bar08'},
262 {tag:'div', cls:'bar09'}, 259 {tag:'div', cls:'bar09'},
263 {tag:'div', cls:'bar10'}, 260 {tag:'div', cls:'bar10'},
264 {tag:'div', cls:'bar11'}, 261 {tag:'div', cls:'bar11'},
265 {tag:'div', cls:'bar12'} 262 {tag:'div', cls:'bar12'}
266 ]} 263 ]}
267 ]}, 264 ]},
268 {tag:'div', id:this.getId('loadingMessage')}, 265 {tag:'div', id:this.getId('loadingMessage')},
269 {tag:'a', href:'#', cls:'grayButton', id:this.getId('loginCancelButton'), html:"Cancel"} 266 {tag:'a', href:'#', cls:'grayButton', id:this.getId('loginCancelButton'), html:"Cancel"}
270 ]} 267 ]}
271 //================================================================== 268 //==================================================================
272 ]} 269 ]}
273 ]}); 270 ]});
274 271
275 MochiKit.Signal.connect(this.getElement('credentialsForm'), 'onsubmit', this, 'submitCredentialsHandler'); 272 MochiKit.Signal.connect(this.getElement('credentialsForm'), 'onsubmit', this, 'submitCredentialsHandler');
276 MochiKit.Signal.connect(this.getElement('credentialsSubmitButton'), 'onclick', this, 'submitCredentialsHandler'); 273 MochiKit.Signal.connect(this.getElement('credentialsSubmitButton'), 'onclick', this, 'submitCredentialsHandler');
277 274
278 MochiKit.Signal.connect(this.getElement('pinForm'), 'onsubmit', this, 'submitPinHandler'); 275 MochiKit.Signal.connect(this.getElement('pinForm'), 'onsubmit', this, 'submitPinHandler');
279 MochiKit.Signal.connect(this.getElement('pinSubmitButton'), 'onclick', this, 'submitPinHandler'); 276 MochiKit.Signal.connect(this.getElement('pinSubmitButton'), 'onclick', this, 'submitPinHandler');
280 277
281 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'initProgress', this, 'initProgressHandle'); 278 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'initProgress', this, 'initProgressHandle');
282 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'updateProgress',this, 'updateProgressHandle'); 279 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'updateProgress',this, 'updateProgressHandle');
283 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'advanceProgress',this, 'advanceProgressHandle'); 280 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'advanceProgress',this, 'advanceProgressHandle');
284 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'progressDone', this, 'progressDoneHandle'); 281 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'progressDone', this, 'progressDoneHandle');
285 }, 282 },
286 283
287 //------------------------------------------------------------------------- 284 //-------------------------------------------------------------------------
288 285
289 'submitPinHandler': function (anEvent) { 286 'submitPinHandler': function (anEvent) {
290 varpin; 287 varpin;
291 288
292 this.setMessage(null); 289 this.setMessage(null);
293 pin = this.getElement('PIN').value; 290 pin = this.getElement('PIN').value;
294 // $(this.getAnchor('PIN')).blur(); 291 // $(this.getAnchor('PIN')).blur();
295 this.getElement('PIN').blur(); 292 this.getElement('PIN').blur();
296 293
297 credentials = Clipperz.PM.PIN.credentialsWithPIN(pin); 294 credentials = Clipperz.PM.PIN.credentialsWithPIN(pin);
298 this.loginWithCredentials(credentials); 295 this.loginWithCredentials(credentials);
299 }, 296 },
300 297
301 'submitCredentialsHandler': function (anEvent) { 298 'submitCredentialsHandler': function (anEvent) {
302//console.log("submitCredentialsHandler");
303 varcredentials; 299 varcredentials;
304 300
305 this.setMessage(null); 301 this.setMessage(null);
306 302
307 credentials = {}; 303 credentials = {};
308 credentials['username'] = this.getElement('usernameField').value; 304 credentials['username'] = this.getElement('usernameField').value;
309 credentials['passphrase'] = this.getElement('passphraseField').value; 305 credentials['passphrase'] = this.getElement('passphraseField').value;
310 // $(this.getAnchor('passphraseField')).blur(); 306 // $(this.getAnchor('passphraseField')).blur();
311 this.getElement('passphraseField').blur(); 307 this.getElement('passphraseField').blur();
312 308
313 this.loginWithCredentials(credentials); 309 this.loginWithCredentials(credentials);
314 }, 310 },
315 311
316 //------------------------------------------------------------------------- 312 //-------------------------------------------------------------------------
317 313
318 'loginWithCredentials': function (someCredentials) { 314 'loginWithCredentials': function (someCredentials) {
319 varargs; 315 varargs;
320 316
321 args = {}; 317 args = {};
322 args['credentials'] = someCredentials; 318 args['credentials'] = someCredentials;
323 args['errorCallback'] = this.errorCallback(); 319 args['errorCallback'] = this.errorCallback();
324 320
325 MochiKit.Style.hideElement(this.getElement('credentialsBody')); 321 MochiKit.Style.hideElement(this.getElement('credentialsBody'));
326 MochiKit.Style.showElement(this.getElement('validating')); 322 MochiKit.Style.showElement(this.getElement('validating'));
327 323
328 MochiKit.Async.callLater(0.1, this.callback(), args); 324 MochiKit.Async.callLater(0.1, this.callback(), args);
329 }, 325 },
330 326
331 //------------------------------------------------------------------------- 327 //-------------------------------------------------------------------------
332 328
333 'initProgressHandle': function (anEvent) { 329 'initProgressHandle': function (anEvent) {
334//console.log("** initProgressHandle", anEvent);
335 this._steps = anEvent['steps']; 330 this._steps = anEvent['steps'];
336 this._actualSteps = 0; 331 this._actualSteps = 0;
337 }, 332 },
338 333
339 'updateProgressHandle': function (anEvent) { 334 'updateProgressHandle': function (anEvent) {
340//console.log("** updateProgressHandle", anEvent);
341 this._steps += anEvent['extraSteps']; 335 this._steps += anEvent['extraSteps'];
342 }, 336 },
343 337
344 'advanceProgressHandle': function (anEvent) { 338 'advanceProgressHandle': function (anEvent) {
345//console.log("** advanceProgressHandle", anEvent);
346 this._actualSteps ++; 339 this._actualSteps ++;
347//console.log("STEPS: " + this._actualSteps + "/" + this._steps);
348 }, 340 },
349 341
350 'progressDoneHandle': function (anEvent) { 342 'progressDoneHandle': function (anEvent) {
351//console.log("** progressDoneHandle", anEvent);
352 }, 343 },
353 344
354 //------------------------------------------------------------------------- 345 //-------------------------------------------------------------------------
355 __syntaxFix__: "syntax fix" 346 __syntaxFix__: "syntax fix"
356}); 347});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Mobile/Controllers/MainController.js b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Controllers/MainController.js
index 12a61f7..9951f44 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Mobile/Controllers/MainController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Mobile/Controllers/MainController.js
@@ -1,393 +1,381 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Mobile.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Mobile.Controllers');
27 25
28Clipperz.PM.UI.Mobile.Controllers.MainController = function() { 26Clipperz.PM.UI.Mobile.Controllers.MainController = function() {
29 this._jQTouch = null; 27 // this._jQTouch = null;
30 this._user = null; 28 this._user = null;
31 this._proxy = null; 29 this._proxy = null;
32 this._loginForm = null; 30 this._loginForm = null;
33 this._cardList = null; 31 this._cardList = null;
34 this._cardDetail= null; 32 this._cardDetail= null;
35 33
36 return this; 34 return this;
37} 35}
38 36
39MochiKit.Base.update(Clipperz.PM.UI.Mobile.Controllers.MainController.prototype, { 37MochiKit.Base.update(Clipperz.PM.UI.Mobile.Controllers.MainController.prototype, {
40 38
41 'toString': function () { 39 'toString': function () {
42 return "Clipperz.PM.UI.Mobile.Controllers.MainController"; 40 return "Clipperz.PM.UI.Mobile.Controllers.MainController";
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'user': function () { 45 'user': function () {
48 return this._user; 46 return this._user;
49 }, 47 },
50 48
51 'setUser': function (aValue) { 49 'setUser': function (aValue) {
52 this._user = aValue; 50 this._user = aValue;
53 }, 51 },
54 52
55 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
56 54/*
57 'jQTouch': function () { 55 'jQTouch': function () {
58 return this._jQTouch; 56 return this._jQTouch;
59 }, 57 },
60 58
61 'setJQTouch': function (aValue) { 59 'setJQTouch': function (aValue) {
62 this._jQTouch = aValue; 60 this._jQTouch = aValue;
63 }, 61 },
64 62*/
65 //========================================================================= 63 //=========================================================================
66 64
67 'run': function () { 65 'run': function () {
68 console.log("MainController.run");
69
70 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'doLogin', MochiKit.Base.method(this, 'doLogin')); 66 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'doLogin', MochiKit.Base.method(this, 'doLogin'));
71 Clipperz.DOM.Helper.overwrite(MochiKit.DOM.currentDocument().body, {tag:'div', id:'jqt', children:[ 67 Clipperz.DOM.Helper.overwrite(MochiKit.DOM.currentDocument().body, {tag:'div', id:'jqt', children:[
72 {tag:'div', id:'loginForm'}, 68 {tag:'div', id:'loginForm'},
73 {tag:'div', id:'cardList'}, 69 {tag:'div', id:'cardList'},
74 {tag:'div', id:'cardDetail'}, 70 {tag:'div', id:'cardDetail'},
75 {tag:'div', id:'preferences'} 71 {tag:'div', id:'preferences'}
76 ]}); 72 ]});
77 73
78 this.showLoginForm(); 74 this.showLoginForm();
79 75
80 this.initjQTouch(); 76 // this.initjQTouch();
81 77
82 78
83 // this.showAddToHomeScreenBaloon(); 79 // this.showAddToHomeScreenBaloon();
84 // this.selectInitialProxy(); 80 // this.selectInitialProxy();
85 }, 81 },
86 82/*
87 'initjQTouch': function () { 83 'initjQTouch': function () {
88 var jqt; 84 var jqt;
89 85
90 jqt = new $.jQTouch({ 86 jqt = new $.jQTouch({
91 icon: 'data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAHIAAAByCAIAAAAAvxIqAAAD8GlDQ1BJQ0MgUHJvZmlsZQAAKJGNVd1v21QUP4lvXKQWP6Cxjg4Vi69VU1u5GxqtxgZJk6XpQhq5zdgqpMl1bhpT1za2021Vn/YCbwz4A4CyBx6QeEIaDMT2su0BtElTQRXVJKQ9dNpAaJP2gqpwrq9Tu13GuJGvfznndz7v0TVAx1ea45hJGWDe8l01n5GPn5iWO1YhCc9BJ/RAp6Z7TrpcLgIuxoVH1sNfIcHeNwfa6/9zdVappwMknkJsVz19HvFpgJSpO64PIN5G+fAp30Hc8TziHS4miFhheJbjLMMzHB8POFPqKGKWi6TXtSriJcT9MzH5bAzzHIK1I08t6hq6zHpRdu2aYdJYuk9Q/881bzZa8Xrx6fLmJo/iu4/VXnfH1BB/rmu5ScQvI77m+BkmfxXxvcZcJY14L0DymZp7pML5yTcW61PvIN6JuGr4halQvmjNlCa4bXJ5zj6qhpxrujeKPYMXEd+q00KR5yNAlWZzrF+Ie+uNsdC/MO4tTOZafhbroyXuR3Df08bLiHsQf+ja6gTPWVimZl7l/oUrjl8OcxDWLbNU5D6JRL2gxkDu16fGuC054OMhclsyXTOOFEL+kmMGs4i5kfNuQ62EnBuam8tzP+Q+tSqhz9SuqpZlvR1EfBiOJTSgYMMM7jpYsAEyqJCHDL4dcFFTAwNMlFDUUpQYiadhDmXteeWAw3HEmA2s15k1RmnP4RHuhBybdBOF7MfnICmSQ2SYjIBM3iRvkcMki9IRcnDTthyLz2Ld2fTzPjTQK+Mdg8y5nkZfFO+se9LQr3/09xZr+5GcaSufeAfAww60mAPx+q8u/bAr8rFCLrx7s+vqEkw8qb+p26n11Aruq6m1iJH6PbWGv1VIY25mkNE8PkaQhxfLIF7DZXx80HD/A3l2jLclYs061xNpWCfoB6WHJTjbH0mV35Q/lRXlC+W8cndbl9t2SfhU+Fb4UfhO+F74GWThknBZ+Em4InwjXIyd1ePnY/Psg3pb1TJNu15TMKWMtFt6ScpKL0ivSMXIn9QtDUlj0h7U7N48t3i8eC0GnMC91dX2sTivgloDTgUVeEGHLTizbf5Da9JLhkhh29QOs1luMcScmBXTIIt7xRFxSBxnuJWfuAd1I7jntkyd/pgKaIwVr3MgmDo2q8x6IdB5QH162mcX7ajtnHGN2bov71OU1+U0fqqoXLD0wX5ZM005UHmySz3qLtDqILDvIL+iH6jB9y2x83ok898GOPQX3lk3Itl0A+BrD6D7tUjWh3fis58BXDigN9yF8M5PJH4B8Gr79/F/XRm8m241mw/wvur4BGDj42bzn+Vmc+NL9L8GcMn8F1kAcXjEKMJAAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrlPw1BAAAd7klEQVR4nO19eZQV13nn797a3tr7yg5ikxCIHRohkACBEFqsJY4z8T52nPHYPp74JJ54bMfOsRMf2Z44OZ7EJ16iDLIsS5ZlydJY+2Ii1haiAQFCNGvTNHS/9/pt9Wq93/xRb+9u6OU1wif9O3Wq6223bv3qu7/vu9+9txqYwAQmMIEJTGACE5jABCbwnxTs/a4AHnjggY0bNwohxl4U5/xnP/tZe3v72Iv6g8fDDz9MlcOHP/zh9/uCAEB+vysA27YBkHAh7KK3aSRlMIDAFcZl13UrW73R4f2nNQvXYGYMjANUROkVyWXZvbBIDcLXOH4VHBGuGVoBgAMMYGAAERhAeekfyC8r+svA3n8nUYxrilYXxAFkScz6sKENlgHkfc5AYmSyMc64dmglEOW4pOyOUSlZxS9Y4RVjIHeEcjy+uGZoJYBErmlTdk/5V0NQxnLkUgXiswrimqEVAIkcTQU685+BioJsyikAkDXbCVqHABWslcpopcJfopIuTIFZMSECQ0GAWBGJA2j13mQspw8MeRumayJczeNaorVMW7MxVqkUgIEox6Yo7CdEYAhQji+UuKxyWgcFA0SWWbompODaoRUD7K40Hri8dJIgIVjRt99fXEu0FhNKpWabbfulYJTthjGAXLqW5PVapRUYwGyuj1AcGGTBQAJiQgQGotDFQkFkBwkGcpZbiAK8nqsgEsC10te6FmglAESCeZFAltPiMGvQSAtALhYAsrSSmLDWLIg8Wt0iQgdoa7nXKupm5TuvwgW5NEFrFp6kilyEVGAWGERSvT0rsWgwkEtZeZ2g1YNnX1llRIHNYlq9Dy6Tc4EgciHcPzwRuP/++9Pp9KuvvuoNk1QKRAQIKjBSrABFx9l2P2jvgIFcCAFyxyNunTVj2h/dt82nad/8zg+G+ZPh0ur3+7/70HdnXTdrz54927dvf+qpp7q7u0dbzxJkaaVSESjYbFHbz3NKJSksIOuySFTSZQX8/lvWrPjQg3dvWr92UktTV/eFH/30kYu9fcP57XBpXbOmbebMGURi1apVq1at+upX/9czTz+9/ZGf79q1a8yjciKrjCgKPEvcF8o7tRggBiRIuCQqE2DNnjXjvrs2P3jvHTfMn6sosmmayWSiqaF2w/q2X/zqt8MpYbi0Pvjgg4xzYaXgpIhrLY31f/aZP//EJz6+e/fu7du3P/3Ms5cuXRrlRQjynHhRp55KDgbpdJUIQDbf6hnsGKw1FAysu3nlnzxw94Z1bfX1dY5tO44BV6gwDVcmId+7dWMlaa2urr5j8+0kXLgW4yoTJukpwSQu+2+5Ze0t69Z9/aunnvnts9t//os9e/aO/MIIwi2JBMqZ9YS1zGXlDgRlIwHhQjijE4F5c2Y9eM8dH7hr8/Vzr+MSt03TTPerkutTuCSrINW2kpaptK1YNG3KpLNdV1a/YdG6fv26GTNnuJbByQWTwRQmSZKwyYoLMya4Nqml4bOf+++f/PhHd+7c9cijjz373O96+4alQQCIBIQrhFuqrQNsVgwwWO/TbEfLJRJCjEyOqsKhDevaPnT/tnVrVtbVVlu27ZhpmVl+iWRNYpIMcIDAFZU5KcdsrK3efNuan2z/1RVLHhatD95/Hxgn12CMgbw0vgBjjKuMXC4M0pOOLklycMNt6zZsuPXUyZO/efq3jz72RPv+t69culegtxXKH0DrQB3wDgi5/quLgt+7AhbMn/PgvVvu2bpp7uyZnDPbNKx0ROW2ooBzCVwCGIQAIxCBQ1EVltZdV7l787qfPvLkFVvklWltbGzccNt6YWUYOeBK9pqLXQqXGeOycMiOuWZEcN/USY3/44uf+/QnP/YfO3c98ugvf/fiy9FobKjyCUTCpWy/s6jkkoNSqS3skR0vIEFCkHAvf7011VWb1q/54/vvXLt6WU11tW2ZrpngyAS5KyscXAI4iCBcMMpOWgBBEJd9CqKm6Vu2aP6cWdOOd54ZK60bb1s/eXKrldEVr7kVsZGj2LMRxrgqMUcSGaEnbV1SpNDmjetu33jric7Op37z7GNP/Lrj0DuD8SqyXU+IrHqW8VvSNSjrdCH7KYmsvA4RCSxaMO/Be7bcs3XDdTOnc8ZsM+2kuzVmKpwYl8A4gKx5gmXbfvYAAIFLqkyGaVZXBbfc2lYBWh+47wMggrCYoiBvU0DBlLIXKbLHTOIS4+SQExHxXof5Zk5p/PKXPv+ZT33s9zvefPTxJ198+fX+eKLAKuWttcxlDTDYEmXIcQoAjMj1rLXMZdXX1tx+25oPfmDrmpVLqsJh28oIIyKTHuK2JDEwzzxF1iVmzbOYU++MHIIpisYyumPL226/+V8efsK5bFh5BVqnTpmybm2bbegcAkzKznIgKr0wkXtHZAc/iAAwLktMSCIjMklHl/xSeNuWW7du3nj8vfd+/fRzv3zymSPHjgPw4k0ityhuHZTZPK2D9LgYuQRBJNyc11qy6Po/uueOu7asnzl9GgM5ZkKkzviZoXABzzwJIBdMADyXEfemKnnH3mwwBpY9KVc0hSVM01w0f9YN82YdPPLe6GndvOm2pqYGQ0+qipQjseiCy7qSVEqHRzTjXFI4OYrb5yZ6BfPNmd70lb/8/H/79Eff2LHz4UceD/h9wnUgRDmVA5kt7hqIXMo1a7ACwhWO01BX88cf2PpfHty2avnicDDgWDrpFxSk/MzmHGBSzr95I7gsSxwxMAbGQBxEYLl9Yd4CgUk+hWUyZtAf2Lph9eVpvdyMMMbYs089dsfmjbaR0nwhICthOZPMbdmXOUdMBLjZg8KnORUWthC2Q7LLw5K/1rJhGBlVVbmTCIme3J27jPvK39ocoV7YKpwENTtyfSaTqQqHOBPCjMsirrGMxAisaNJc9oCVHGT3vGjPAF7yDpfITvdG01wJH363c+uffskwraGou5y1zr5u1uoVSy0jI3MGzpF3CESFrcRsaWhNyHk2xjlXVHIh+pxkrwyfxqtclzMigmBe4UPSivLj3I6RICJBIqQJnjmnIqkwh/Gcz/ES5IUpiGzAxnPdNZ4z5LywMoDAOASYrGk8plvW/FlTFi+YvXv/kdHQeueWjbU11YaelNRAzsGW+qtyTUCRBytuy6LoHuQsl0myRDLpqptwhOxCAs9rqyj9eZk4oLQO3idCdmM+iqtM53nz9NpNfg4s5ayVsQK/xLPBMssJQj6uyjLLCxVgkk9T0knDFwjcuWHVaGiVJeneu7Y4tsVATFJzjRrZRsGkrBV4zV84gAPk55rJhebPvD6lneUUZVwzzmWVuSCzkJwelNlifoGi9gGAGEOIp4rUMN8pYIWDPJtULAI5YSWWlVTPeIlyFFPhJUHVfFKy3zLljWsWPxTwp/TMyGi94fp5S2+60TIzmqqAK1lCyYGdgHEJ+jlkeqB3I9MFMwonBWHBixaYDK5BqYIShlYPtR5qPbQGyAFwDRAQTqny5oKY7LG4HLNsqN6Bd0fzg4zFhKJgsN5Bll9WOChQyQr+iigXJOReCmKy6pPchG3Omtq84qZ5r+06MDJa7966KRTwZwxD0kIw+hB/B5G30H8QyfeQPgs7CVE6U7d4CmUxOMBlKGH4WhCYjPBchGbBPwVKFZgMYQFOSc+isC8S2WJmB0lxFZ14YAWGVFWAeM6JFcWqlJvmhXw8kL/xAJP9fiWRMWUlsO225SOjVVXVbXdstB3B4wfZwR8jfgiZbm9MpETlhwlyYMZgxNB/FHgZnEFrRGg2ahai5kb4WsEVCCvX0Sp2WZcV2QKzrNxy84QWuGalNpu3guIDzzsxEM/63oIs5E4toGh+hfWZlrxu5Q211aFYPDVcWpfedOON82dbtu07sx3nXoAMMEAaNo8DwQrXCBCMS8hcQu9OyBpCs1G/HLVL4WsGOMgqUl5RwmNJQrbIa5U4MZQ2HFa6L9PWHJvFzT8byeZdmWe2yPcLmKT6VYrp1pTm2jVL5z/32iDLwAan6rOf+si6taudZLev8/uM9MtGt6NC3mLIRaYXsQ707kD6JJgMrR5czWW1Sw22oLmicFDwhKUDt1lac28ylN+M4o0V3R42YI+8TXg/55ysVNqQZcVx3f/3+lsDr28Qaw0GA1s23mLarhTbzY3eETT20cEr30mjdw/69iA0E03rUbccchCuVS61JRRjQGCAIXWgzGAHD12pYLnFCpv3ltnvQPUFVClhWmbb4tnNDTUX+/rLrmkQa13btvxzn/pTx3H8p34o6acrb6qDIn91Vj+iB9D/NiDga4akFSVSS0W2kJbNezYxiCWiKH4o2CYKRoqylyh6M49SlyjJZCXTGVETDhzpPH/kRFfZ1Qxiivdu3SjLEqwos/rAclW9avDsJnMBpx7Fse8hsjuX3i7rK3sKkGfcBTyP5w6yCe99J7sXInec/0L+uLgXXlaOyKVmBFxTljiERcLdesvCgYvCyq21vq7277/2xYBPcUmyGjba1ctJDjA3ye1EiQ8Yb3iWaycQexv6afiaoNYOYrPFCuvZLyu24sGkEwXnM0iSM29BeYvOvvT8mG0Z6VS8Pxrpj6dcIsZITGqpf+a1t+NJvbj65dpaU1PTr4sWpgb8ZJrMrl5pVa9mdkxJHVajv1fi+ySjuxCNjDe8U/QfReokmtajcT0kDcIq19ZiOkRx+82FBPluqxdpZV96LTUfsRYrbD4lyMEIwrIsR8/YaUOYFhPEOGc+nyakQHfMfvPAKcMub86DcOMPBJctWXzX1k0bb1k5e3qzyoVlmrZgIMacmJI8rMb+Q020S2bP1eMXgABC0zH5bgSmQtil6RgM5rtQFJaiaPVmPmWFLI8exWVJLAYIsmxHN9y0CdOWXMEkiWmaRrK/O+buPnT2+df37W7viEUHGQy9HCWBYGjZ0sXbNm/YtG7ldVMbFeaYpukIBjBmx+TUEV//m2qyXTIvXSV+CZA0tNyO+lUA5TJqZfkt76v5lFXRz7MdqhyhJblBno1bGSCEabm6ibTJTVcWgnHONE2D7L8QFzs7zjz/RvvetzqikcsNLQ+LiVAovHz50js337rx5uUzJ9fJcEzTyPOrpo9o8Z1a8m3J6h13fj2aapegdQskX26tvCgIAkoNtpjZgoWiQKuXnQFBkGmLtMl1SzZdxSUmsSybPQnadfDM82+8tbu9IxrpHU41R0ZAuKp6xfKl225ff9vNS6a31Mhk5+2X21FFP+KL79bSHZLVN778CiA4FVPugVoHYZcSStkeUZmdUqm1slyClYRpU9qS05ZquqogLnFoqgol0JOgXYfOvfBG++72jkjfsNgsPuFoUFVds3LF0m2333rr6oXTmqs4WZZh2h6/TlRNH/Un92rpg5IdGdt5hgYBai0m3w3/lFzWsTgILRNZrw4sqwwgEmTZSFtK2tZMVxPEOSefpkEO9CRo9+FzL/x+/659HZG+Uc6AGuvlVtfUrlq5bNumdetWLpjaFOaukbNfcCem6cd8qX0+/bBkRytxtlIQIPsx6S6EZmXDg9IkbHZNYtZIyWPTdFjaUnXbbwgtZ5sKU4IXE9j9zrnn39i/u72jr3e088lyqNiF1tTWrV65bNumW25ZccOUBj9cwzQMhyQQSU5Myxzzp9p9maOSE6vkaT0n1roFoTmlNlv8DUFCmLaUtrW07TeFTxCXGGmaytTgxQT2HDn//Bv7d+07MHY286i8+NXW1betXHbnprVrl82bXOeHq5uG6RAHSLKjmvFuIH3AZxyR3HhlzkcAV9C6BaHZEFbuLQJAwjVsnra1tBOwXJ8LLjFomsKU4KUk9h7pfmHH2zv3Hui9dLEyNSnCOMZEdfUNa1Yvv3PjzTcvnt1aq1qZpG074DKE3dLzkM94r6I2q6J1CwLTiz2YcO2uRH1a1HLmSpxrgareFPYevfDCjgM79x64dLGnQqcfBFcjlG9oaFq9atmXPrF1drNmu7y2/8ma+PPjo7NboTVCONm3GExTnE22giu9Kf7dR/fs2nfgYs+Fip54cIx31g8A+vouvXfkQLWccYgH0vuqEy+NSwLXyaDnFVj9YJRPoGiq0+S7IFwnLOvxC+9eHU4xtoz/cFFbFfzJ331mxtRWlulqivxUEplxaSQMcE1YUQSn5YYLCUQ+2XZs02Hhm2+asWP/yUhcv3JRY8a408oY+9YXP7ipbaFppJqjD2t29zgKDwPsFIQF/6RszhAEICDrKZ35/eEFsxqf33ncssd90fG40/qRe9d+/sO3G5Zbl3gmnNk/7mLOACsCOQC1Nve4IcE480vpaEqZ3FRXHVJff+vUOFdinGldcv2M7//Vh7ikBvX2huSzjF2tfLjRC18zJBVwvTFwWRYK9IjuWzS7uTemHz5ZsRB1UIwjrXXVwX/+2kcmN9dzs6s18XNO5vidqxzChZNCYFJhDJHIp9iObacs36oFre3HLlzoG2QgulIYL1o5Y9/6wn23rZxvGqnW5KOqc+kqpWU9MMBOg6vQaiGc7AgCQ1DNJHXGJf+S2Y0vt59OG5VcDlmM8aL1o/e0ffZD6zOW25j+Xdg8dFU59cAAKw5/E7iUHxtnHAFFj6TkxprQpMbgK+1nhRgXXRoXWpfdMP2hv7iPMTlk7G/KvPg+cOpBuCAbvgbAzU/LlWWhwuhLaXOn1tiOaD82LiJbeVrra0I//OsPtjTUSGbXJP1JjiHn1g4fBObCx71JicOHJwVqFSStMEWDyKfZruP069ryufXHz/Wf7kmOvYZlqDCtnLNvf+6utUuvs8zU5MyTmohc+TfDQIJd183XVtNJjhGGnEQQJnz12bHu7KA3hTQjlWGuUJfNrdtxsKc/VYF7X4wK0/qxu1f+2QOrM6bbYr4Udt6tSJk2AmfZBh2NAAujfKLDFcAA14AczAVb3ui3YJyCqh5JKOGgOnty+OX9F2ynkg8oqyStyxdM/fvP30lMqrY7mqw3KlXsebQl0crI1NHoR9THRphRJIAs+Gqy8oqcyCpC40ZvXJveHPCr0puHRzascnlUjNaGmuA//dU9TXXVitU9xXp2xDo4BGI0s4dukmVFVv2upaepqYadldhIAiMGuBYUPyRvAVQu3iLh1yzhuNGUsmhWuCdqvNtVMZGtDK0SZ9/+7Ja2hdMcMznV+q1K5VO9RgcLwTNiraJoz3ck955yls/UdJMsBGt5F8NIAiMCIKAGQE7OYL2NQj4jpTPDkpbPDe873t8br4zIVobWT9y97JP3LDFMp9V5vYoq1eNmZ90VGTREDPVLP3jx1Z2Hbm5b0RpIJu2QDCvEoyMpCRA2VB84gRzABhwv6mJMhLRMJKFqsnTjjMArB6KGVQGRrQCtqxZM+daf3yZIqnEONou9Yy/QQ8Sd2ePMUzXtO788tq/juOvYh08n7ly3ULEjSVEX5n0qN0ZQHBE4QeagHKdwAAfkyIrjk81Lca2lRmmslt84FB84aDtSjJXWxtrgD/5iS311UHW6p4lXRhwADQGTQqesFYqqvPKO+Y+PvE4kAPT1RVJUs2Fxo5nRdVFdJ1/gbNiWxQC4UBhgAhZgASZgAzbI8fsM4VJfUp0/WdNN9+DpseZkx0SrJPFvf+bWlTe0OlZqOr2soTKST2Cn7SWGqIrZvr/84Y54vOD63zl+dsacBTe0WClDEiTVKMN9GAQACIJsg9s5g/U2G8wCOeFAOq3L6Yy89DrtaFemKzKmdMGYBl0+vm3hllXTM4bZSrsDGMkVXha99rSY1aCoyv95uvPc+ZJhEhLOd37y4ul0k8rNi2ZzxGoaQc+YADu3uqx4E4AQnNmzWroVnpK58+X7aifVjekJYaO31tU3TvrGJ9oEsTpxpIV1jKUSxciI0CljoSrLb7wn/uHnO2jAv9DJ6OnOXtq6ZiYykYRTXadEZD68YM67AXLpxKwiyIrwK+bFqFwToBmN/LXDpjta7zVKWptrg//7C+trw37N7ZkuvclRmS4KgZ/M3GC4wYQT/PKP9sX6B4/8z3f3SOFpa+aqum4YQmvwRYdrsjQ0rQQQ/D4HwrnUL2Y2urIk9p4Y5XWNhlZZ4t/6dNuyeQ2ulZol7VBZhQbdGHrMKT3GJJ9P/YdnL7751rHLfLfj3a6FixbPDEcSpswhqrT0cM/C8wsrSk6dR1XQSet2Im0vnCbOR9E5qrkZo9HWj985f9Oy1kzGnCy95WeVifwBpJ3QeX2KT3Z3nMCTLw6+Oi8P28x8+2c7+9gMmTLnUnVxMzBckXUGW7UhChtjmDtFaDKRiy9sYXNaRnMtI7bWpddP/btPLXcsUxAx2CEek1gF+qkC/ERytumqKVH11z85FIld+W4lEvGLRvj2pXVWui9l+xr8aWk4Y2UMkIdeZMIAwsUI+uLMcRFWae7U0IsdrjvCbPeIrTWq4534ZH+4hgkjYk9512hLuA0jLaQcDN16c9wMaKr845d6T545P8zfvfjavicO+INBLWWIU7HwsAw299C9QWyWwbJw5CSOnWa2RTKRG75+b3SRSyNmacTW2h9PPPf7w0r93KXzW5lx0XDkqNMCICTHR9ZPz4MhaQVPJqZqktjdFfrez9tH8pQw6jjeu2rFTc3y6f4MfLIb0obhZNhgXoujP4nDJ1kkwRmRX9N6fau/+ZT79ItvjfSpZRidy3Jsa+e+g8f7fCuWLq6VopZlxp26tBsKyYnhxjpFcIkf759qOUxntV95+L2+yJBPzBoUlmUcvcC2tE3imZP9GdQHSLlixMkHLIslnL2Io6eZYUEiClQ37+xf/pV/e+/YuydGejkeRh+3njp99qW3umdcv2JOM3P0vrQTiNl1Gjf88uBPLhgcDOcS9Zf0kN+n/vOr9ut7j4+iJn19EV2etm6+m0kldIs1hYfxT8nywQCHaeHoaZy5yEmQwsFqb/zZ/inff2RvMj6SbE4pxtR5TSbiz+84bIfmLF8wVTZ7TIeiVp0jpLCS5nxY3iNu+Dr76zXJab9Q/71fHBLuKL3fkc7emfOWzavp6U/ZnKE2dKWVj7k1WdF+HOpk0QTjRH6fv0dr+8avjedebSd3TJ3XsaZaSDhvdRw90MWXLl3WpMYsI5mwwgk7EFJ0VboCR47g70ZqLUeYvP6rj1y41Dey5l9aD/dAp75+9Y1V7tlomlX74fddllkJRDjTjSNnmGlBAgVqWndEl3714WMnOk+OvhqF4iuB890XXth7rmX2iuunqK7ek3HkSCascCekmkN6Z4bTsWBvSgoElH/dob2yp3OMdcjo6dPx6s3L6p1UbyLDmqsgDXVxHIaNd07iTA8jQSpnVLfox+0t//iLPelkZcLwig26ZPT0SzuP9MszVy6aqVldluVEjYDh8CrNlAYKAkNMlzojiipnDvRO/u5jJ12nAhNMzl/oleuuXzU1nUzoloOmmsG+xHEphoOdLJZgnCjgD5z3tf3Nr1Mv7dhPojIDRajwyCuJw0dP7OmkhUtWTQpGLD2SsNRYRgkqtk8pinsYbAdHLjLbMS25+euPGT2XRu8cynD4RN/Cm5ZNVbqiCfKpqCoWWQZBONHFjp1llg0Z5K+d/Fp0ydf+/cjp06crVQEPlZ9+0dvb+7td56qmrVw0Q6X0qYzt9qXBmQj7Csv4Tvay3hQF/P5/293y0q5KTot0Xftwl7tx1Vw10xVNsoYqaJq3bAO6gYOd7HwfANIkJuoX/6i98YeP7zbSiSsWO1KMy2Qh28rs2HOsy565csnsoHPaMs1omqUtVPkgK+hLoLOXaRIO9c9+6JdnnUo0/2Ik4vE+0brhBl8mEUtnWEs9uISLEXScYHEdEigYCp1V277+ZPy1nW+P07+FG7+JmPRe55nfH8W8m9ZPr07YeiJlskiKSRyne5ltk6O2fuMJ58LFykx7KcPJsxfrpy++qSHSnzCFYLEEjp5ljoDCyF8/7YWLi/7m3w+eO3duPE7tYXynDff3x17YdU5qWr1kTg1Lnzcs9CWY7SDg9/3f/a0v7By/WdHU0RlbvWJJI85GkoimGAP5ZG7XLf2nndU//tVu0xjHya24CpPcXcfae+D48cSU5cuWVotuy7RUiR1NXvfQ4+ccp8Izn4phW8a7vcqWldOYfoERgqGqTrnta4/3vrn3ICqUdL8MrsZKFwBnz51/9VBm+oL1cxuMjKt+8zfifE/Fxr6GQl8kmvHNXD9HSP7a57pv/NvtHd3dw82N/SGBy75P/cmW//rA6qv1xAwwSf2fn77z3ttXXBP/FGiccTXW2L1/p5vABCYwgQlMYAL/2fH/AdkCEQl+/Ar/AAAAAElFTkSuQmCCCg==', 87 icon: 'data:image/png;charset=utf-8;base64,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',
92 // icon4: 'jqtouch4.png', 88 // icon4: 'jqtouch4.png',
93 // startupScreen: null, //Pass a string path to a 320px x 460px startup screen for full screen apps. 89 // startupScreen: null, //Pass a string path to a 320px x 460px startup screen for full screen apps.
94 statusBar: 'black-translucent', //Styles the status bar when running as a fullscreen app. Other options are `default`, `black`, and `black-translucent`. 90 statusBar: 'black-translucent', //Styles the status bar when running as a fullscreen app. Other options are `default`, `black`, and `black-translucent`.
95 // addGlossToIcon: true, //Set to 'false' to prevent automatic glossy button effect on icon. 91 // addGlossToIcon: true, //Set to 'false' to prevent automatic glossy button effect on icon.
96 preloadImages: false, //Pass an array of image paths to load them before page loads. Ex: `['images/link_over.png', 'images/link_select.png']` 92 preloadImages: false, //Pass an array of image paths to load them before page loads. Ex: `['images/link_over.png', 'images/link_select.png']`
97 fixedViewport: true, //Removes the user's ability to scale the page. Ensures the site behaves more like an application. 93 fixedViewport: true, //Removes the user's ability to scale the page. Ensures the site behaves more like an application.
98 // fullScreen: true, //The website will become a fullscreen application when saved to a user's home screen. Set to `false` to disable. 94 // fullScreen: true, //The website will become a fullscreen application when saved to a user's home screen. Set to `false` to disable.
99 // fullScreenClass: 'fullscreen' //Adds a class to the `<body>` when running in full-screen mode, to allow for easy detection and styling. Set to `false` to disable. 95 // fullScreenClass: 'fullscreen' //Adds a class to the `<body>` when running in full-screen mode, to allow for easy detection and styling. Set to `false` to disable.
100 // themeSelectionSelector: '#jqt #themes ul', //??? 96 // themeSelectionSelector: '#jqt #themes ul', //???
101 97
102 // useAnimations: true, //Set to `false` to disable all animations. 98 // useAnimations: true, //Set to `false` to disable all animations.
103 // useFastTouch: true, //Removes ~350ms onClick delay when tapping a link (use in conjunction with the .tap() event) **Experimental** 99 // useFastTouch: true, //Removes ~350ms onClick delay when tapping a link (use in conjunction with the .tap() event) **Experimental**
104 // useTouchScroll: true, //Adds support for iOS5 scrolling. Set to false to disable. **Experimental** 100 // useTouchScroll: true, //Adds support for iOS5 scrolling. Set to false to disable. **Experimental**
105 101
106 cacheGetRequests: false, //Automatically caches GET requests, so subsequent taps reference the pre-loaded views. (default: true) 102 cacheGetRequests: false, //Automatically caches GET requests, so subsequent taps reference the pre-loaded views. (default: true)
107 103
108 // backSelector: '.back, .cancel, .goback', //A CSS selector for back links/buttons. When clicked, the page history goes back one, automatically reversing whichever entrance animation was used. 104 // backSelector: '.back, .cancel, .goback', //A CSS selector for back links/buttons. When clicked, the page history goes back one, automatically reversing whichever entrance animation was used.
109 105
110 // cubeSelector: '.cube', //Link selector for a cube animation. 106 // cubeSelector: '.cube', //Link selector for a cube animation.
111 // dissolveSelector: '.dissolve', //Link selector for a dissolve animation. 107 // dissolveSelector: '.dissolve', //Link selector for a dissolve animation.
112 // fadeSelector: '.fade', //Link selector for a fade animation. 108 // fadeSelector: '.fade', //Link selector for a fade animation.
113 // flipSelector: '.flip', //Link selector for a 3d flip animation. 109 // flipSelector: '.flip', //Link selector for a 3d flip animation.
114 formSelector: null, //Sets which forms are automatically submitted via Ajax. (default: 'form') 110 formSelector: null, //Sets which forms are automatically submitted via Ajax. (default: 'form')
115 // popSelector: '.pop', //Link selector for a pop animation. (default: '.pop') 111 // popSelector: '.pop', //Link selector for a pop animation. (default: '.pop')
116 // slideSelector: 'body > * > ul li a', //Link selector for the default slide-left transition. By default applies to all links within an unordered list. Accepts any jQuery-capable selector `'li &gt; a, a:not(.dontslide)'`, etc. (default: 'body > * > ul li a') 112 // slideSelector: 'body > * > ul li a', //Link selector for the default slide-left transition. By default applies to all links within an unordered list. Accepts any jQuery-capable selector `'li &gt; a, a:not(.dontslide)'`, etc. (default: 'body > * > ul li a')
117 // slideupSelector: '.slideup', //Link selector for a slide up animation. (default: '.slideup') 113 // slideupSelector: '.slideup', //Link selector for a slide up animation. (default: '.slideup')
118 // submitSelector: '.submit', //Selector which, when clicked, will submit its parent form (and close keyboard if open). (default: '.submit') 114 // submitSelector: '.submit', //Selector which, when clicked, will submit its parent form (and close keyboard if open). (default: '.submit')
119 // swapSelector: '.swap', //Link selector for 3d swap animation. (default: '.swap') 115 // swapSelector: '.swap', //Link selector for 3d swap animation. (default: '.swap')
120 // touchSelector: 'a, .touch', //Selector for items which are automatically given expanded touch events. This makes ordinary links more responsive and provides trigger events like `swipe` (default: 'a, .touch') 116 // touchSelector: 'a, .touch', //Selector for items which are automatically given expanded touch events. This makes ordinary links more responsive and provides trigger events like `swipe` (default: 'a, .touch')
121 117
122 debug: false 118 debug: false
123 }); 119 });
124 120
125 this.setJQTouch(jqt); 121 this.setJQTouch(jqt);
126 }, 122 },
127 123*/
128 //========================================================================= 124 //=========================================================================
129 125
130 'showAddToHomeScreenBaloon': function () { 126 'showAddToHomeScreenBaloon': function () {
131console.log(">>> showAddToHomeScreenBaloon");
132 }, 127 },
133 128
134 //------------------------------------------------------------------------- 129 //-------------------------------------------------------------------------
135 130
136 'selectInitialProxy': function () { 131 'selectInitialProxy': function () {
137//console.log(">>> selectInitialProxy");
138 if (this.isOnline()) { 132 if (this.isOnline()) {
139//console.log("--- selectInitialProxy: using default proxy");
140 this._proxy = Clipperz.PM.Proxy.defaultProxy; 133 this._proxy = Clipperz.PM.Proxy.defaultProxy;
141 } else { 134 } else {
142 if (this.hasLocalData()) { 135 if (this.hasLocalData()) {
143//console.log("--- selectInitialProxy: using local cache proxy");
144 this._proxy = new Clipperz.PM.Proxy.OfflineCache({'shouldPayTolls':false}); 136 this._proxy = new Clipperz.PM.Proxy.OfflineCache({'shouldPayTolls':false});
145 } else { 137 } else {
146 this.showOfflineError(); 138 this.showOfflineError();
147 } 139 }
148 } 140 }
149 }, 141 },
150 142
151 //------------------------------------------------------------------------- 143 //-------------------------------------------------------------------------
152 144
153 'showLoginForm': function (args) { 145 'showLoginForm': function (args) {
154 args = args || {}; 146 args = args || {};
155 147
156 args['callback'] = MochiKit.Base.method(this, 'doLogin'); 148 args['callback'] = MochiKit.Base.method(this, 'doLogin');
157 149
158 if (Clipperz.PM.PIN.isSet()) { 150 if (Clipperz.PM.PIN.isSet()) {
159 args['errorCallback'] = MochiKit.Base.method(this, 'handleFailedPinLogin'); 151 args['errorCallback'] = MochiKit.Base.method(this, 'handleFailedPinLogin');
160 this.loginForm().showPinLogin(args); 152 this.loginForm().showPinLogin(args);
161 } else { 153 } else {
162 args['errorCallback'] = MochiKit.Base.method(this, 'handleFailedCredentialsLogin'); 154 args['errorCallback'] = MochiKit.Base.method(this, 'handleFailedCredentialsLogin');
163 this.loginForm().showCredentialsLogin(args); 155 this.loginForm().showCredentialsLogin(args);
164 } 156 }
165 }, 157 },
166 158
167 //......................................................................... 159 //.........................................................................
168 160
169 'handleFailedCredentialsLogin': function () { 161 'handleFailedCredentialsLogin': function () {
170console.log("LOGIN FAILED");
171 this.showLoginForm({'previousFailedAttempt':'LOGIN'}); 162 this.showLoginForm({'previousFailedAttempt':'LOGIN'});
172 }, 163 },
173 164
174 //......................................................................... 165 //.........................................................................
175 166
176 'handleFailedPinLogin': function () { 167 'handleFailedPinLogin': function () {
177 varfailedAttempts; 168 varfailedAttempts;
178 varstatus; 169 varstatus;
179 170
180 failedAttempts = Clipperz.PM.PIN.recordFailedAttempt(); 171 failedAttempts = Clipperz.PM.PIN.recordFailedAttempt();
181 this.showLoginForm({'previousFailedAttempt':'PIN', 'failedAttempts': failedAttempts}); 172 this.showLoginForm({'previousFailedAttempt':'PIN', 'failedAttempts': failedAttempts});
182 }, 173 },
183 174
184 //------------------------------------------------------------------------- 175 //-------------------------------------------------------------------------
185 176
186 'doLogin': function (someArgs) { 177 'doLogin': function (someArgs) {
187 var deferredResult; 178 var deferredResult;
188 var credentials; 179 var credentials;
189 var errorCallback; 180 var errorCallback;
190 var user; 181 var user;
191 var getPassphraseDelegate; 182 var getPassphraseDelegate;
192 183
193//console.log(">>> MainController.doLogin", someArgs);
194 credentials = someArgs['credentials']; 184 credentials = someArgs['credentials'];
195 errorCallback = someArgs['errorCallback'] || MochiKit.Base.noop; 185 errorCallback = someArgs['errorCallback'] || MochiKit.Base.noop;
196 186
197 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, credentials.passphrase); 187 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, credentials.passphrase);
198 user = new Clipperz.PM.DataModel.User({'username':credentials.username, 'getPassphraseFunction':getPassphraseDelegate}); 188 user = new Clipperz.PM.DataModel.User({'username':credentials.username, 'getPassphraseFunction':getPassphraseDelegate});
199 189
200 deferredResult = new Clipperz.Async.Deferred('MainController.doLogin', {trace:false}); 190 deferredResult = new Clipperz.Async.Deferred('MainController.doLogin', {trace:false});
201 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4}); 191 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4});
202 deferredResult.addCallback(MochiKit.Async.wait, 0.1); 192 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
203 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'); 193 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection');
204 deferredResult.addMethod(user, 'login'); 194 deferredResult.addMethod(user, 'login');
205 deferredResult.addCallbacks( 195 deferredResult.addCallbacks(
206 MochiKit.Base.method(this, 'processSuccessfulLogin', user), 196 MochiKit.Base.method(this, 'processSuccessfulLogin', user),
207 errorCallback 197 errorCallback
208 ); 198 );
209 deferredResult.callback(); 199 deferredResult.callback();
210 200
211 return deferredResult; 201 return deferredResult;
212 }, 202 },
213 203
214 //.......................................................................... 204 //..........................................................................
215 205
216 'processSuccessfulLogin': function (aUser) { 206 'processSuccessfulLogin': function (aUser) {
217 var deferredResult; 207 var deferredResult;
218 208
219 deferredResult = new Clipperz.Async.Deferred('MainController.processSuccessfulLogin', {trace:false}); 209 deferredResult = new Clipperz.Async.Deferred('MainController.processSuccessfulLogin', {trace:false});
220 deferredResult.addMethod(Clipperz.PM.PIN, 'resetFailedAttemptCount'); 210 deferredResult.addMethod(Clipperz.PM.PIN, 'resetFailedAttemptCount');
221 // deferredResult.addMethod(this, 'removeLoginForm'); 211 // deferredResult.addMethod(this, 'removeLoginForm');
222 deferredResult.addMethod(this, 'setUser', aUser); 212 deferredResult.addMethod(this, 'setUser', aUser);
223 deferredResult.addMethod(this, 'setupApplication'); 213 deferredResult.addMethod(this, 'setupApplication');
224 deferredResult.addMethod(this, 'runApplication'); 214 deferredResult.addMethod(this, 'runApplication');
225 deferredResult.callback(); 215 deferredResult.callback();
226 216
227 return deferredResult; 217 return deferredResult;
228 }, 218 },
229 219
230 //------------------------------------------------------------------------- 220 //-------------------------------------------------------------------------
231 221
232 'setupApplication': function () { 222 'setupApplication': function () {
233 vardeferredResult; 223 vardeferredResult;
234 224
235console.log(">>> setupApplication");
236 deferredResult = new Clipperz.Async.Deferred("MainController.setupApplication", {trace:false}); 225 deferredResult = new Clipperz.Async.Deferred("MainController.setupApplication", {trace:false});
237 deferredResult.addMethod(this, 'welcomeFirstTimeUser'); 226 deferredResult.addMethod(this, 'welcomeFirstTimeUser');
238 deferredResult.addMethod(this, 'showPaymentReminder'); 227 deferredResult.addMethod(this, 'showPaymentReminder');
239 deferredResult.addMethod(this, 'copyDataLocally'); 228 deferredResult.addMethod(this, 'copyDataLocally');
240 deferredResult.callback(arguments); 229 deferredResult.callback(arguments);
241 230
242 return deferredResult; 231 return deferredResult;
243 }, 232 },
244 233
245 234
246 //.......................................................................... 235 //..........................................................................
247 236
248 'isFirstTimeUser': function () { 237 'isFirstTimeUser': function () {
249 return false; 238 return false;
250 }, 239 },
251 240
252 'welcomeFirstTimeUser': function () { 241 'welcomeFirstTimeUser': function () {
253 vardeferredResult; 242 vardeferredResult;
254 243
255 deferredResult = new Clipperz.Async.Deferred('MainController.welcomeFirstTimeUser', {trace:false}); 244 deferredResult = new Clipperz.Async.Deferred('MainController.welcomeFirstTimeUser', {trace:false});
256 245
257 if (this.isFirstTimeUser()) { 246 if (this.isFirstTimeUser()) {
258 deferredResult.addCallback(function () { console.log("--> welcome"); }); 247 deferredResult.addCallback(function () { Clipperz.log("--> welcome"); });
259 } 248 }
260 deferredResult.callback(); 249 deferredResult.callback();
261 250
262 return deferredResult; 251 return deferredResult;
263 }, 252 },
264 253
265 //.......................................................................... 254 //..........................................................................
266 255
267 'shouldShowPaymentReminder': function () { 256 'shouldShowPaymentReminder': function () {
268 return true; 257 return true;
269 }, 258 },
270 259
271 'showPaymentReminder': function () { 260 'showPaymentReminder': function () {
272 vardeferredResult; 261 vardeferredResult;
273 262
274 deferredResult = new Clipperz.Async.Deferred('MainController.showPaymentReminder', {trace:false}); 263 deferredResult = new Clipperz.Async.Deferred('MainController.showPaymentReminder', {trace:false});
275 264
276 if (this.shouldShowPaymentReminder()) { 265 if (this.shouldShowPaymentReminder()) {
277 deferredResult.addCallback(function () { console.log("--> payment reminder"); }); 266 deferredResult.addCallback(function () { Clipperz.log("--> payment reminder"); });
278 } 267 }
279 deferredResult.callback(); 268 deferredResult.callback();
280 269
281 return deferredResult; 270 return deferredResult;
282 }, 271 },
283 272
284 //.......................................................................... 273 //..........................................................................
285 274
286 'canCopyDataLocally': function () { 275 'canCopyDataLocally': function () {
287 return false; 276 return false;
288 }, 277 },
289 278
290 'copyDataLocally': function () { 279 'copyDataLocally': function () {
291 vardeferredResult; 280 vardeferredResult;
292 281
293 deferredResult = new Clipperz.Async.Deferred('MainController.copyDataLocally', {trace:false}); 282 deferredResult = new Clipperz.Async.Deferred('MainController.copyDataLocally', {trace:false});
294 283
295 if (this.canCopyDataLocally()) { 284 if (this.canCopyDataLocally()) {
296 deferredResult.addCallback(function () { console.log("--> copy data locally"); }); 285 deferredResult.addCallback(function () { Clipperz.log("--> copy data locally"); });
297 } 286 }
298 deferredResult.callback(); 287 deferredResult.callback();
299 288
300 return deferredResult; 289 return deferredResult;
301 290
302 }, 291 },
303 292
304 //------------------------------------------------------------------------- 293 //-------------------------------------------------------------------------
305 294
306 'runApplication': function () { 295 'runApplication': function () {
307 var deferredResult; 296 var deferredResult;
308 297
309//console.log(">>> runApplication");
310 deferredResult = new Clipperz.Async.Deferred('MainController.runApplication', {trace:true}); 298 deferredResult = new Clipperz.Async.Deferred('MainController.runApplication', {trace:true});
311 deferredResult.addMethod(this.user(), 'getRecords'); 299 deferredResult.addMethod(this.user(), 'getRecords');
312 deferredResult.addMethod(this, 'showCards'); 300 deferredResult.addMethod(this, 'showCards');
313 deferredResult.callback(); 301 deferredResult.callback();
314 302
315 return deferredResult; 303 return deferredResult;
316 }, 304 },
317 305
318 //========================================================================= 306 //=========================================================================
319 307
320 'showOfflineError': function (anException) { 308 'showOfflineError': function (anException) {
321 alert("Error: " + anException); 309 alert("Error: " + anException);
322 throw anException; 310 throw anException;
323 }, 311 },
324 312
325 //========================================================================= 313 //=========================================================================
326 314
327 'isOnline': function() { 315 'isOnline': function() {
328 return navigator.onLine; 316 return navigator.onLine;
329 }, 317 },
330 318
331 'hasLocalData': function() { 319 'hasLocalData': function() {
332 return false; 320 return false;
333 }, 321 },
334 322
335 //========================================================================= 323 //=========================================================================
336 324
337 'loginForm': function() { 325 'loginForm': function() {
338 if (this._loginForm == null) { 326 if (this._loginForm == null) {
339 this._loginForm = new Clipperz.PM.UI.Mobile.Components.LoginForm({element:MochiKit.DOM.getElement('loginForm')}); 327 this._loginForm = new Clipperz.PM.UI.Mobile.Components.LoginForm({element:MochiKit.DOM.getElement('loginForm')});
340 } 328 }
341 329
342 return this._loginForm; 330 return this._loginForm;
343 }, 331 },
344 332
345 'removeLoginForm': function () { 333 'removeLoginForm': function () {
346 if (this._loginForm != null) { 334 if (this._loginForm != null) {
347 this._loginForm.remove(); 335 this._loginForm.remove();
348 this._loginForm = null; 336 this._loginForm = null;
349 } 337 }
350 }, 338 },
351 339
352 //------------------------------------------------------------------------- 340 //-------------------------------------------------------------------------
353 341
354 'cardList': function () { 342 'cardList': function () {
355 if (this._cardList == null) { 343 if (this._cardList == null) {
356 this._cardList = new Clipperz.PM.UI.Mobile.Components.CardList({element:MochiKit.DOM.getElement('cardList')}); 344 this._cardList = new Clipperz.PM.UI.Mobile.Components.CardList({element:MochiKit.DOM.getElement('cardList')});
357 MochiKit.Signal.connect(this._cardList, 'selectedCard', this, 'selectCardHandler'); 345 MochiKit.Signal.connect(this._cardList, 'selectedCard', this, 'selectCardHandler');
358 } 346 }
359 347
360 return this._cardList; 348 return this._cardList;
361 }, 349 },
362 350
363 'showCards': function (someCards) { 351 'showCards': function (someCards) {
364 this.cardList().showCards(someCards); 352 this.cardList().showCards(someCards);
365 this.jQTouch().goTo('#cardList', 'slideleft'); 353 // this.jQTouch().goTo('#cardList', 'slideleft');
366 }, 354 },
367 355
368 //------------------------------------------------------------------------- 356 //-------------------------------------------------------------------------
369 357
370 'cardDetail': function () { 358 'cardDetail': function () {
371 if (this._cardDetail == null) { 359 if (this._cardDetail == null) {
372 this._cardDetail = new Clipperz.PM.UI.Mobile.Components.CardDetail({element:MochiKit.DOM.getElement('cardDetail')}); 360 this._cardDetail = new Clipperz.PM.UI.Mobile.Components.CardDetail({element:MochiKit.DOM.getElement('cardDetail')});
373 } 361 }
374 362
375 return this._cardDetail; 363 return this._cardDetail;
376 }, 364 },
377 365
378 'selectCardHandler': function (aCardReference) { 366 'selectCardHandler': function (aCardReference) {
379 var deferredResult; 367 var deferredResult;
380 368
381 deferredResult = new Clipperz.Async.Deferred("MainController.selectCardHandler", {trace:true}); 369 deferredResult = new Clipperz.Async.Deferred("MainController.selectCardHandler", {trace:true});
382 deferredResult.addMethod(this.cardDetail(), 'render'); 370 deferredResult.addMethod(this.cardDetail(), 'render');
383 deferredResult.addMethod(this.jQTouch(), 'goTo', '#cardDetail', 'slideleft'); 371 // deferredResult.addMethod(this.jQTouch(), 'goTo', '#cardDetail', 'slideleft');
384 deferredResult.addMethod(this.user(), 'getRecord', aCardReference); 372 deferredResult.addMethod(this.user(), 'getRecord', aCardReference);
385 deferredResult.addMethod(this.cardDetail(), 'showCard'); 373 deferredResult.addMethod(this.cardDetail(), 'showCard');
386 deferredResult.callback(); 374 deferredResult.callback();
387 375
388 return deferredResult; 376 return deferredResult;
389 }, 377 },
390 378
391 //========================================================================= 379 //=========================================================================
392 __syntaxFix__: "syntax fix" 380 __syntaxFix__: "syntax fix"
393}); 381});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
index d6b0574..82c8dfd 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.AccountPanel = function(args) { 26Clipperz.PM.UI.Web.Components.AccountPanel = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.AccountPanel.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.AccountPanel.superclass.constructor.apply(this, arguments);
32 30
33 //this._initiallySelectedTab = args.selected || 'ACCOUNT'; 31 //this._initiallySelectedTab = args.selected || 'ACCOUNT';
34 this._initiallySelectedTab = args.selected || 'PASSPHRASE'; 32 this._initiallySelectedTab = args.selected || 'PASSPHRASE';
35 this._tabPanelControllerConfiguration = { 33 this._tabPanelControllerConfiguration = {
36 // 'ACCOUNT': { 34 // 'ACCOUNT': {
37 // tab:'accountTab', 35 // tab:'accountTab',
38 // panel:'accountPanel' 36 // panel:'accountPanel'
39 // }, 37 // },
40 'PASSPHRASE': { 38 'PASSPHRASE': {
41 tab:'passphraseTab', 39 tab:'passphraseTab',
42 panel:'passphrasePanel' 40 panel:'passphrasePanel'
43 }, 41 },
44 'OTP': { 42 'OTP': {
45 tab:'OTPTab', 43 tab:'OTPTab',
46 panel:'OTPPanel' 44 panel:'OTPPanel'
47 }, 45 },
48 'PREFERENCES': { 46 'PREFERENCES': {
49 tab:'preferencesTab', 47 tab:'preferencesTab',
50 panel:'preferencesPanel' 48 panel:'preferencesPanel'
51 }, 49 },
52 'LOGIN_HISTORY': { 50 'LOGIN_HISTORY': {
53 tab:'loginHistoryTab', 51 tab:'loginHistoryTab',
54 panel:'loginHistoryPanel' 52 panel:'loginHistoryPanel'
55 } 53 }
56 }; 54 };
57 55
58 return this; 56 return this;
59} 57}
60 58
61//============================================================================= 59//=============================================================================
62 60
63Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AccountPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 61Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AccountPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67 'toString': function () { 65 'toString': function () {
68 return "Clipperz.PM.UI.Web.Components.AccountPanel component"; 66 return "Clipperz.PM.UI.Web.Components.AccountPanel component";
69 }, 67 },
70 68
71 //------------------------------------------------------------------------- 69 //-------------------------------------------------------------------------
72 70
73 'renderSelf': function(/*aContainer, aPosition*/) { 71 'renderSelf': function(/*aContainer, aPosition*/) {
74//Clipperz.log("AccountPanel.renderSelf element", this.element()); 72//Clipperz.log("AccountPanel.renderSelf element", this.element());
75 this.append(this.element(), [ 73 this.append(this.element(), [
76 {tag:'div', cls:'header', children:[ 74 {tag:'div', cls:'header', children:[
77 {tag:'div', cls:'subPanelTabs', children:[ 75 {tag:'div', cls:'subPanelTabs', children:[
78 {tag:'ul', children:[ 76 {tag:'ul', children:[
79 // {tag:'li', id:this.getId('accountTab'), children:[{tag:'a', href:'#', html:'Account'}], cls:'first'}, 77 // {tag:'li', id:this.getId('accountTab'), children:[{tag:'a', href:'#', html:'Account'}], cls:'first'},
80 {tag:'li', id:this.getId('passphraseTab'), children:[{tag:'a', href:'#', html:'Passphrase'}], cls:'first'}, 78 {tag:'li', id:this.getId('passphraseTab'), children:[{tag:'a', href:'#', html:'Passphrase'}], cls:'first'},
81 {tag:'li', id:this.getId('OTPTab'), children:[{tag:'a', href:'#', html:'One Time Passwords'}]}, 79 {tag:'li', id:this.getId('OTPTab'), children:[{tag:'a', href:'#', html:'One Time Passwords'}]},
82 {tag:'li', id:this.getId('preferencesTab'), children:[{tag:'a', href:'#', html:'Preferences'}]}, 80 {tag:'li', id:this.getId('preferencesTab'), children:[{tag:'a', href:'#', html:'Preferences'}]},
83 {tag:'li', id:this.getId('loginHistoryTab'),children:[{tag:'a', href:'#', html:'Login history'}]} 81 {tag:'li', id:this.getId('loginHistoryTab'),children:[{tag:'a', href:'#', html:'Login history'}]}
84 ]} 82 ]}
85 ]} 83 ]}
86 ]}, 84 ]},
87 {tag:'div', cls:'body', children:[ 85 {tag:'div', cls:'body', children:[
88 {tag:'div', cls:'accountPanel', children:[ 86 {tag:'div', cls:'accountPanel', children:[
89 {tag:'div', cls:'subPanelContent', children:[ 87 {tag:'div', cls:'subPanelContent', children:[
90 {tag:'ul', children:[ 88 {tag:'ul', children:[
91 // {tag:'li', id:this.getId('accountPanel'),children:[ 89 // {tag:'li', id:this.getId('accountPanel'),children:[
92 // {tag:'h3', html:"-- Account --"} 90 // {tag:'h3', html:"-- Account --"}
93 // ]}, 91 // ]},
94 {tag:'li', id:this.getId('passphrasePanel'),children:[ 92 {tag:'li', id:this.getId('passphrasePanel'),children:[
95 {tag:'h3', cls:'changePassphrase', html:"Change passphrase"}, 93 {tag:'h3', cls:'changePassphrase', html:"Change passphrase"},
96 {tag:'form', id:this.getId('changePassphrase'), cls:'changePassphrase', children:[ 94 {tag:'form', id:this.getId('changePassphrase'), cls:'changePassphrase', children:[
97 {tag:'div', cls:'currentCredentials', children:[ 95 {tag:'div', cls:'currentCredentials', children:[
98 {tag:'div', cls:'field username', children:[ 96 {tag:'div', cls:'field username', children:[
99 {tag:'label', html:"username", 'for':this.getId('currentUsername')}, 97 {tag:'label', html:"username", 'for':this.getId('currentUsername')},
100 {tag:'input', id:this.getId('currentUsername')} 98 {tag:'input', id:this.getId('currentUsername')}
101 ]}, 99 ]},
102 {tag:'div', cls:'field passphrase', children:[ 100 {tag:'div', cls:'field passphrase', children:[
103 {tag:'label', html:"passphrase", 'for':this.getId('currentPassphrase')}, 101 {tag:'label', html:"passphrase", 'for':this.getId('currentPassphrase')},
104 {tag:'input', id:this.getId('currentPassphrase')} 102 {tag:'input', id:this.getId('currentPassphrase')}
105 ]} 103 ]}
106 ]}, 104 ]},
107 {tag:'div', cls:'newPassphrase', children:[ 105 {tag:'div', cls:'newPassphrase', children:[
108 {tag:'div', cls:'field', children:[ 106 {tag:'div', cls:'field', children:[
109 {tag:'label', html:"new passphrase", 'for':this.getId('newPassphrase')}, 107 {tag:'label', html:"new passphrase", 'for':this.getId('newPassphrase')},
110 {tag:'input', id:this.getId('newPassphrase')} 108 {tag:'input', id:this.getId('newPassphrase')}
111 ]}, 109 ]},
112 {tag:'div', cls:'field', children:[ 110 {tag:'div', cls:'field', children:[
113 {tag:'label', html:"re-new passphrase", 'for':this.getId('reNewPassphrase')}, 111 {tag:'label', html:"re-new passphrase", 'for':this.getId('reNewPassphrase')},
114 {tag:'input', id:this.getId('reNewPassphrase')} 112 {tag:'input', id:this.getId('reNewPassphrase')}
115 ]} 113 ]}
116 ]}, 114 ]},
117 {tag:'div', cls:'confirm', children:[ 115 {tag:'div', cls:'confirm', children:[
118 {tag:'input', type:'checkbox', id:this.getId('confirm')}, 116 {tag:'input', type:'checkbox', id:this.getId('confirm')},
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js
index 3b3c8b4..da5fd76 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js
@@ -1,75 +1,73 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.AppPage = function(args) { 26Clipperz.PM.UI.Web.Components.AppPage = function(args) {
29 args = args || {}; 27 args = args || {};
30 Clipperz.PM.UI.Web.Components.AppPage.superclass.constructor.call(this, args); 28 Clipperz.PM.UI.Web.Components.AppPage.superclass.constructor.call(this, args);
31 29
32 this._element = args.element || null; 30 this._element = args.element || null;
33 31
34 this._slots = { 32 this._slots = {
35 'cardGrid' : this.getId('cardGrid'), 33 'cardGrid' : this.getId('cardGrid'),
36 // 'directLoginGrid' : this.getId('directLoginGrid'), 34 // 'directLoginGrid' : this.getId('directLoginGrid'),
37 'accountPanel': this.getId('accountPanel'), 35 'accountPanel': this.getId('accountPanel'),
38 'dataPanel': this.getId('dataPanel'), 36 'dataPanel': this.getId('dataPanel'),
39 'toolsPanel': this.getId('toolsPanel'), 37 'toolsPanel': this.getId('toolsPanel'),
40 'userInfoBox': this.getId('userInfoBox'), 38 'userInfoBox': this.getId('userInfoBox'),
41 'tabSidePanel': this.getId('tabSidePanel') 39 'tabSidePanel': this.getId('tabSidePanel')
42 }; 40 };
43 41
44 return this; 42 return this;
45} 43}
46 44
47//============================================================================= 45//=============================================================================
48 46
49Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AppPage, Clipperz.PM.UI.Common.Components.BaseComponent, { 47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.AppPage, Clipperz.PM.UI.Common.Components.BaseComponent, {
50 48
51 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
52 50
53 'toString': function () { 51 'toString': function () {
54 return "Clipperz.PM.UI.Web.Components.AppPage component"; 52 return "Clipperz.PM.UI.Web.Components.AppPage component";
55 }, 53 },
56 54
57 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
58 56
59 'renderSelf': function(/*aContainer, aPosition*/) { 57 'renderSelf': function(/*aContainer, aPosition*/) {
60 this.append(this.element(), {tag:'div', id:this.getId('userInfoBox'), cls:'userInfoBox'}); 58 this.append(this.element(), {tag:'div', id:this.getId('userInfoBox'), cls:'userInfoBox'});
61 this.append(this.element(), {tag:'div', id:this.getId('sidePanels'), cls:'sidePanels'}); 59 this.append(this.element(), {tag:'div', id:this.getId('sidePanels'), cls:'sidePanels'});
62 this.append(this.getId('sidePanels'),{tag:'div', id:this.getId('tabSidePanel'), cls:'tabSidePanel', children:[]}); 60 this.append(this.getId('sidePanels'),{tag:'div', id:this.getId('tabSidePanel'), cls:'tabSidePanel', children:[]});
63 61
64 this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'}); 62 this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'});
65 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'}); 63 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'});
66 // this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('directLoginGrid'), cls:'gridComponent directLoginGrid'}); 64 // this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('directLoginGrid'), cls:'gridComponent directLoginGrid'});
67 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('accountPanel'), cls:'otherPanel'}); 65 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('accountPanel'), cls:'otherPanel'});
68 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('dataPanel'), cls:'otherPanel'}); 66 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('dataPanel'), cls:'otherPanel'});
69 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('toolsPanel'), cls:'otherPanel'}); 67 this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('toolsPanel'), cls:'otherPanel'});
70 }, 68 },
71 69
72 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
73 71
74 __syntaxFix__: "syntax fix" 72 __syntaxFix__: "syntax fix"
75}); 73});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js
index 1835ca9..4cfca32 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js
@@ -1,106 +1,104 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.BookmarkletComponent = function(args) { 26Clipperz.PM.UI.Web.Components.BookmarkletComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.BookmarkletComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.BookmarkletComponent.superclass.constructor.apply(this, arguments);
32 MochiKit.Signal.connect(Clipperz.PM.Strings.Languages, 'switchLanguage', this, 'updateBookmarkletURLs'); 30 MochiKit.Signal.connect(Clipperz.PM.Strings.Languages, 'switchLanguage', this, 'updateBookmarkletURLs');
33 31
34 return this; 32 return this;
35} 33}
36 34
37//============================================================================= 35//=============================================================================
38 36
39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.BookmarkletComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 37Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.BookmarkletComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
40 38
41 //------------------------------------------------------------------------- 39 //-------------------------------------------------------------------------
42 40
43 'toString': function () { 41 'toString': function () {
44 return "Clipperz.PM.UI.Web.Components.BookmarkletComponent component"; 42 return "Clipperz.PM.UI.Web.Components.BookmarkletComponent component";
45 }, 43 },
46 44
47 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
48 46
49 'renderSelf': function() { 47 'renderSelf': function() {
50 // var bookmarkletUrl; 48 // var bookmarkletUrl;
51// 49//
52 // if (Clipperz_IEisBroken == true) { 50 // if (Clipperz_IEisBroken == true) {
53 // bookmarkletUrl = bookmarklet_ie; 51 // bookmarkletUrl = bookmarklet_ie;
54 // } else { 52 // } else {
55 /// bookmarkletUrl = bookmarklet; 53 /// bookmarkletUrl = bookmarklet;
56 // bookmarkletUrl = Clipperz.PM.Strings['bookmarklet']; 54 // bookmarkletUrl = Clipperz.PM.Strings['bookmarklet'];
57 // } 55 // }
58 56
59 this.append(this.element(), {tag:'div', cls:'bookmarklet', children: [ 57 this.append(this.element(), {tag:'div', cls:'bookmarklet', children: [
60 {tag:'div', id:this.getId('linkBlock'), cls:'bookmarklet_link', children:[ 58 {tag:'div', id:this.getId('linkBlock'), cls:'bookmarklet_link', children:[
61 // {tag:'a', id:this.getId('link'), href:bookmarkletUrl, children:[ 59 // {tag:'a', id:this.getId('link'), href:bookmarkletUrl, children:[
62 {tag:'a', id:this.getId('link'), href:'#', children:[ 60 {tag:'a', id:this.getId('link'), href:'#', children:[
63 {tag:'div', cls:'icon'}, 61 {tag:'div', cls:'icon'},
64 {tag:'div', cls:'text', children:[ 62 {tag:'div', cls:'text', children:[
65 {tag:'span', html:"add to Clipperz"} 63 {tag:'span', html:"add to Clipperz"}
66 ]} 64 ]}
67 ]} 65 ]}
68 ]} 66 ]}
69 ]}); 67 ]});
70 68
71 new Clipperz.PM.UI.Common.Components.Tooltip({ 69 new Clipperz.PM.UI.Common.Components.Tooltip({
72 element:this.getElement('linkBlock'), 70 element:this.getElement('linkBlock'),
73 text: "Drag and drop the \"add to Clipperz\" link above to the bookmark bar.", 71 text: "Drag and drop the \"add to Clipperz\" link above to the bookmark bar.",
74 position:'BELOW' 72 position:'BELOW'
75 }); 73 });
76 74
77 MochiKit.Signal.connect(this.getId('link'), 'onclick', this, 'handleOnclick'); 75 MochiKit.Signal.connect(this.getId('link'), 'onclick', this, 'handleOnclick');
78 this.updateBookmarkletURLs(); 76 this.updateBookmarkletURLs();
79 }, 77 },
80 78
81 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
82 80
83 'handleOnclick': function (anEvent) { 81 'handleOnclick': function (anEvent) {
84 anEvent.preventDefault(); 82 anEvent.preventDefault();
85 83
86Clipperz.log("BOOKMARKLET CLICK"); 84Clipperz.log("BOOKMARKLET CLICK");
87 }, 85 },
88 86
89 //------------------------------------------------------------------------- 87 //-------------------------------------------------------------------------
90 88
91 'updateBookmarkletURLs': function () { 89 'updateBookmarkletURLs': function () {
92 var bookmarkletUrl; 90 var bookmarkletUrl;
93 91
94 if (Clipperz_IEisBroken == true) { 92 if (Clipperz_IEisBroken == true) {
95 bookmarkletUrl = bookmarklet_ie; 93 bookmarkletUrl = bookmarklet_ie;
96 } else { 94 } else {
97 // bookmarkletUrl = bookmarklet; 95 // bookmarkletUrl = bookmarklet;
98 bookmarkletUrl = Clipperz.PM.Strings.getValue('bookmarklet'); 96 bookmarkletUrl = Clipperz.PM.Strings.getValue('bookmarklet');
99 } 97 }
100 98
101 this.getElement('link').href = bookmarkletUrl; 99 this.getElement('link').href = bookmarkletUrl;
102 }, 100 },
103 101
104 //------------------------------------------------------------------------- 102 //-------------------------------------------------------------------------
105 __syntaxFix__: "syntax fix" 103 __syntaxFix__: "syntax fix"
106}); 104});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js
index af33d85..8bb64f5 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.CardDialogComponent = function(args) { 26Clipperz.PM.UI.Web.Components.CardDialogComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.CardDialogComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.CardDialogComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._tabPanelController = null; 31 this._tabPanelController = null;
34 32
35 this._tabPanelControllerConfiguration = { 33 this._tabPanelControllerConfiguration = {
36 'DETAILS': { 34 'DETAILS': {
37 tab:'detailTab', 35 tab:'detailTab',
38 panel:'detailTabpanel' 36 panel:'detailTabpanel'
39 }, 37 },
40 'DIRECT_LOGINS': { 38 'DIRECT_LOGINS': {
41 tab:'directLoginTab', 39 tab:'directLoginTab',
42 panel:'directLoginTabpanel' 40 panel:'directLoginTabpanel'
43 }, 41 },
44 'SHARING': { 42 'SHARING': {
45 tab:'sharingTab', 43 tab:'sharingTab',
46 panel:'sharingTabpanel' 44 panel:'sharingTabpanel'
47 } 45 }
48 }; 46 };
49 47
50 this._tooltips = null; 48 this._tooltips = null;
51 49
52 this._isSavingEnabled = false; 50 this._isSavingEnabled = false;
53 this._hintMode = 'OFF'; //'ON' 51 this._hintMode = 'OFF'; //'ON'
54 52
55 this._fieldComponents = {}; 53 this._fieldComponents = {};
56 this._directLoginComponents = {}; 54 this._directLoginComponents = {};
57 55
58 this._displayMode = 'fixed'; //'scrollable'; 56 this._displayMode = 'fixed'; //'scrollable';
59 57
60 return this; 58 return this;
61} 59}
62 60
63//============================================================================= 61//=============================================================================
64 62
65Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 63Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
66 64
67 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
68 66
69 'toString': function () { 67 'toString': function () {
70 return "Clipperz.PM.UI.Web.Components.CardDialogComponent component"; 68 return "Clipperz.PM.UI.Web.Components.CardDialogComponent component";
71 }, 69 },
72 70
73 //------------------------------------------------------------------------- 71 //-------------------------------------------------------------------------
74 72
75 'tabPanelController': function () { 73 'tabPanelController': function () {
76 if (this._tabPanelController == null) { 74 if (this._tabPanelController == null) {
77 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({ 75 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
78 component:this, 76 component:this,
79 configuration:this._tabPanelControllerConfiguration 77 configuration:this._tabPanelControllerConfiguration
80 }); 78 });
81 79
82 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected') 80 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
83 } 81 }
84 82
85 return this._tabPanelController; 83 return this._tabPanelController;
86 }, 84 },
87 85
88 //------------------------------------------------------------------------- 86 //-------------------------------------------------------------------------
89 87
90 'renderSelf': function() { 88 'renderSelf': function() {
91 this.append(this.element(), {tag:'div', cls:'CardDialog mainDialog loading', id:this.getId('panel'), children: [ 89 this.append(this.element(), {tag:'div', cls:'CardDialog mainDialog loading', id:this.getId('panel'), children: [
92 {tag:'form', id:this.getId('form'), children:[ 90 {tag:'form', id:this.getId('form'), children:[
93 // {tag:'input', type:'text', id:this.getId('hidden'), cls:'hidden'}, 91 // {tag:'input', type:'text', id:this.getId('hidden'), cls:'hidden'},
94 {tag:'div', cls:'header', children:[ 92 {tag:'div', cls:'header', children:[
95 {tag:'div', cls:'title', children:[ 93 {tag:'div', cls:'title', children:[
96 {tag:'input', type:'text', id:this.getId('title')} 94 {tag:'input', type:'text', id:this.getId('title')}
97 ]} 95 ]}
98 ]}, 96 ]},
99 {tag:'div', id:this.getId('body'), cls:'body', children:[ 97 {tag:'div', id:this.getId('body'), cls:'body', children:[
100 {tag:'div', cls:'tabs', children:[ 98 {tag:'div', cls:'tabs', children:[
101 {tag:'ul', cls:'tabs', children:[ 99 {tag:'ul', cls:'tabs', children:[
102 {tag:'li', id:this.getId('detailTab'), children:[{tag:'span', html:"details"}]}, 100 {tag:'li', id:this.getId('detailTab'), children:[{tag:'span', html:"details"}]},
103 {tag:'li', id:this.getId('directLoginTab'), children:[ 101 {tag:'li', id:this.getId('directLoginTab'), children:[
104 {tag:'span', html:"direct logins"}//, 102 {tag:'span', html:"direct logins"}//,
105 // {tag:'div', id:this.getId('addDirectLoginButton'), cls:'addDirectLoginButton', children:[ 103 // {tag:'div', id:this.getId('addDirectLoginButton'), cls:'addDirectLoginButton', children:[
106 // {tag:'span', html:"+"} 104 // {tag:'span', html:"+"}
107 // ]} 105 // ]}
108 ]}, 106 ]},
109 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'span', html:"sharing"}]} 107 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'span', html:"sharing"}]}
110 ]} 108 ]}
111 ]}, 109 ]},
112 {tag:'div', cls:'tabPanels', children:[ 110 {tag:'div', cls:'tabPanels', children:[
113 {tag:'ul', cls:'tabPanels', children:[ 111 {tag:'ul', cls:'tabPanels', children:[
114 {tag:'li', id:this.getId('detailTabpanel'), cls:'tabPanel', children:[ 112 {tag:'li', id:this.getId('detailTabpanel'), cls:'tabPanel', children:[
115 {tag:'div', id:this.getId('recordFields'), children:[ 113 {tag:'div', id:this.getId('recordFields'), children:[
116 {tag:'table', cls:'fields', cellpadding:'0', id:this.getId('fieldTable'), cellspacing:'0', children:[ 114 {tag:'table', cls:'fields', cellpadding:'0', id:this.getId('fieldTable'), cellspacing:'0', children:[
117 {tag:'thead', children:[ 115 {tag:'thead', children:[
118 {tag:'tr', children:[ 116 {tag:'tr', children:[
@@ -589,290 +587,286 @@ Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogComponent, Clipperz
589 //------------------------------------------------------------------------- 587 //-------------------------------------------------------------------------
590 588
591 'toggleLock': function (aFieldKey, anEvent) { 589 'toggleLock': function (aFieldKey, anEvent) {
592 var shouldRedrawAsLocked; 590 var shouldRedrawAsLocked;
593 var currentTRElement; 591 var currentTRElement;
594 592
595 anEvent.preventDefault(); 593 anEvent.preventDefault();
596 594
597 currentTRElement = Clipperz.DOM.get(aFieldKey); 595 currentTRElement = Clipperz.DOM.get(aFieldKey);
598 shouldRedrawAsLocked = (MochiKit.DOM.hasElementClass(currentTRElement, 'locked') ? false : true); 596 shouldRedrawAsLocked = (MochiKit.DOM.hasElementClass(currentTRElement, 'locked') ? false : true);
599 597
600 this.renderFieldTR(currentTRElement, { 598 this.renderFieldTR(currentTRElement, {
601 label:MochiKit.Selector.findChildElements(currentTRElement, ['td.fieldLabel input'])[0].value, 599 label:MochiKit.Selector.findChildElements(currentTRElement, ['td.fieldLabel input'])[0].value,
602 value:MochiKit.Selector.findChildElements(currentTRElement, ['td.fieldValue input'])[0].value 600 value:MochiKit.Selector.findChildElements(currentTRElement, ['td.fieldValue input'])[0].value
603 }, shouldRedrawAsLocked, MochiKit.DOM.hasElementClass(currentTRElement, 'new')); 601 }, shouldRedrawAsLocked, MochiKit.DOM.hasElementClass(currentTRElement, 'new'));
604 }, 602 },
605 603
606 //========================================================================= 604 //=========================================================================
607 605
608 'fixNotesHeight': function () { 606 'fixNotesHeight': function () {
609 var element; 607 var element;
610 608
611 element = this.getElement('recordNote'); 609 element = this.getElement('recordNote');
612 610
613 if (element.scrollHeight == 0) { 611 if (element.scrollHeight == 0) {
614 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'fixNotesHeight')); 612 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'fixNotesHeight'));
615 } else { 613 } else {
616 var textareaHeight; 614 var textareaHeight;
617 615
618 textareaHeight = Math.min(Math.max(50, element.scrollHeight), 500); 616 textareaHeight = Math.min(Math.max(50, element.scrollHeight), 500);
619 617
620 MochiKit.Style.setElementDimensions(element, {h:textareaHeight}, 'px'); 618 MochiKit.Style.setElementDimensions(element, {h:textareaHeight}, 'px');
621 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'fixRendering')); 619 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'fixRendering'));
622 } 620 }
623 }, 621 },
624 622
625 //------------------------------------------------------------------------- 623 //-------------------------------------------------------------------------
626 624
627 'fixRendering': function () { 625 'fixRendering': function () {
628 // varheight; 626 // varheight;
629 var y; 627 var y;
630 varscrollHeight; 628 varscrollHeight;
631 var viewportHeight; 629 var viewportHeight;
632 var viewportY; 630 var viewportY;
633 var footerElement; 631 var footerElement;
634 var footerElementPosition; 632 var footerElementPosition;
635 var footerElementDimensions; 633 var footerElementDimensions;
636 var footerComputedHeight; 634 var footerComputedHeight;
637 635
638 // height = MochiKit.Style.getElementDimensions(this.displayElement())['h']; 636 // height = MochiKit.Style.getElementDimensions(this.displayElement())['h'];
639 y = MochiKit.Style.getElementPosition(this.displayElement())['y']; 637 y = MochiKit.Style.getElementPosition(this.displayElement())['y'];
640 638
641 footerElement = MochiKit.Selector.findChildElements(this.displayElement(), ['div.footer'])[0]; 639 footerElement = MochiKit.Selector.findChildElements(this.displayElement(), ['div.footer'])[0];
642 footerElementPosition = MochiKit.Style.getElementPosition(footerElement); 640 footerElementPosition = MochiKit.Style.getElementPosition(footerElement);
643 footerElementDimensions = MochiKit.Style.getElementDimensions(footerElement); 641 footerElementDimensions = MochiKit.Style.getElementDimensions(footerElement);
644 footerComputedHeight = footerElementPosition['y'] + footerElementDimensions['h'] - y; 642 footerComputedHeight = footerElementPosition['y'] + footerElementDimensions['h'] - y;
645 643
646 // scrollHeight = this.displayElement().scrollHeight; 644 // scrollHeight = this.displayElement().scrollHeight;
647 scrollHeight = footerComputedHeight; 645 scrollHeight = footerComputedHeight;
648 646
649 viewportHeight = MochiKit.Style.getViewportDimensions()['h']; 647 viewportHeight = MochiKit.Style.getViewportDimensions()['h'];
650 viewportY = MochiKit.Style.getViewportPosition()['y']; 648 viewportY = MochiKit.Style.getViewportPosition()['y'];
651 649
652 if ((y + scrollHeight) > (viewportY + viewportHeight)) { 650 if ((y + scrollHeight) > (viewportY + viewportHeight)) {
653 this.setDisplayMode('scrollable'); 651 this.setDisplayMode('scrollable');
654 MochiKit.DOM.addElementClass(this.element(), 'scrollable'); 652 MochiKit.DOM.addElementClass(this.element(), 'scrollable');
655 MochiKit.DOM.removeElementClass(this.element(), 'fixed'); 653 MochiKit.DOM.removeElementClass(this.element(), 'fixed');
656 MochiKit.Style.setElementPosition(this.displayElement(), {y:Math.max(0, Math.min(y, (viewportY + viewportHeight) - scrollHeight))}, 'px'); 654 MochiKit.Style.setElementPosition(this.displayElement(), {y:Math.max(0, Math.min(y, (viewportY + viewportHeight) - scrollHeight))}, 'px');
657 MochiKit.Visual.ScrollTo(this.displayElement(), {duration:0.5}); 655 MochiKit.Visual.ScrollTo(this.displayElement(), {duration:0.5});
658 } else { 656 } else {
659 this.setDisplayMode('fixed'); 657 this.setDisplayMode('fixed');
660 MochiKit.DOM.removeElementClass(this.element(), 'scrollable'); 658 MochiKit.DOM.removeElementClass(this.element(), 'scrollable');
661 MochiKit.DOM.addElementClass(this.element(), 'fixed'); 659 MochiKit.DOM.addElementClass(this.element(), 'fixed');
662 } 660 }
663 }, 661 },
664 662
665 //========================================================================= 663 //=========================================================================
666 664
667 'unselectCurrentSelectedItems': function () { 665 'unselectCurrentSelectedItems': function () {
668 MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.displayElement(), ['.selectedField']), function (anElement) { 666 MochiKit.Iter.forEach(MochiKit.Selector.findChildElements(this.displayElement(), ['.selectedField']), function (anElement) {
669 MochiKit.DOM.removeElementClass(anElement, 'selectedField'); 667 MochiKit.DOM.removeElementClass(anElement, 'selectedField');
670 }); 668 });
671 }, 669 },
672 670
673 //========================================================================= 671 //=========================================================================
674 672
675 'hideProgressMask': function () { 673 'hideProgressMask': function () {
676 MochiKit.DOM.removeElementClass(this.getId('panel'), 'loading'); 674 MochiKit.DOM.removeElementClass(this.getId('panel'), 'loading');
677 }, 675 },
678 676
679 'showProgressMask': function () { 677 'showProgressMask': function () {
680 this.getElement('progressDescription').innerHTML = "Saving"; 678 this.getElement('progressDescription').innerHTML = "Saving";
681 MochiKit.DOM.addElementClass(this.getId('panel'), 'loading'); 679 MochiKit.DOM.addElementClass(this.getId('panel'), 'loading');
682 }, 680 },
683 681
684 'showError': function (anError) { 682 'showError': function (anError) {
685//console.log(">>> showError", anError);
686 MochiKit.Style.hideElement(this.getId('progress')); 683 MochiKit.Style.hideElement(this.getId('progress'));
687 this.getElement('errorMessage').innerHTML = Clipperz.PM.Strings.errorDescriptionForException(anError['message']); 684 this.getElement('errorMessage').innerHTML = Clipperz.PM.Strings.errorDescriptionForException(anError['message']);
688 MochiKit.Style.showElement(this.getId('error')); 685 MochiKit.Style.showElement(this.getId('error'));
689 }, 686 },
690 687
691 //------------------------------------------------------------------------- 688 //-------------------------------------------------------------------------
692 689
693 'cancel': function () { 690 'cancel': function () {
694/* 691/*
695 var deferredResult; 692 var deferredResult;
696 693
697 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.cancel", {trace:false}); 694 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.cancel", {trace:false});
698 deferredResult.addCallback(MochiKit.Base.method(this, 'isSavingEnabled')); 695 deferredResult.addCallback(MochiKit.Base.method(this, 'isSavingEnabled'));
699 deferredResult.addIf([ 696 deferredResult.addIf([
700 MochiKit.Base.method(this, 'askConfirmationForLoosingPendingChanges') 697 MochiKit.Base.method(this, 'askConfirmationForLoosingPendingChanges')
701 ], []); 698 ], []);
702 deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Signal.signal, this, 'cancel')); 699 deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Signal.signal, this, 'cancel'));
703 deferredResult.callback(); 700 deferredResult.callback();
704 701
705 return deferredResult; 702 return deferredResult;
706*/ 703*/
707 MochiKit.Signal.signal(this, 'cancel'); 704 MochiKit.Signal.signal(this, 'cancel');
708 }, 705 },
709 706
710 'handleCancelEvent': function (anEvent) { 707 'handleCancelEvent': function (anEvent) {
711 anEvent.preventDefault(); 708 anEvent.preventDefault();
712 this.cancel(); 709 this.cancel();
713 }, 710 },
714 711
715 //------------------------------------------------------------------------- 712 //-------------------------------------------------------------------------
716 713
717 'handleSaveEvent': function (anEvent) { 714 'handleSaveEvent': function (anEvent) {
718 anEvent.preventDefault(); 715 anEvent.preventDefault();
719 716
720 if (! MochiKit.DOM.hasElementClass(anEvent.src(), 'disabled')) { 717 if (! MochiKit.DOM.hasElementClass(anEvent.src(), 'disabled')) {
721 MochiKit.Signal.signal(this, 'save'); 718 MochiKit.Signal.signal(this, 'save');
722 } 719 }
723 }, 720 },
724 721
725 //------------------------------------------------------------------------- 722 //-------------------------------------------------------------------------
726 723
727 'handleAddDirectLogin': function (anEvent) { 724 'handleAddDirectLogin': function (anEvent) {
728 anEvent.preventDefault(); 725 anEvent.preventDefault();
729 726
730 MochiKit.Signal.signal(this, 'addDirectLogin'); 727 MochiKit.Signal.signal(this, 'addDirectLogin');
731 }, 728 },
732 729
733 //------------------------------------------------------------------------- 730 //-------------------------------------------------------------------------
734 731
735 'handleOnFocusEvent': function (anElement, anEvent) { 732 'handleOnFocusEvent': function (anElement, anEvent) {
736 this.unselectCurrentSelectedItems(); 733 this.unselectCurrentSelectedItems();
737 MochiKit.DOM.addElementClass(anElement, 'selectedField'); 734 MochiKit.DOM.addElementClass(anElement, 'selectedField');
738 }, 735 },
739 736
740 'handleLooseFocusEvent': function (anElement, anEvent) { 737 'handleLooseFocusEvent': function (anElement, anEvent) {
741 this.unselectCurrentSelectedItems(); 738 this.unselectCurrentSelectedItems();
742 }, 739 },
743 740
744 //------------------------------------------------------------------------- 741 //-------------------------------------------------------------------------
745 742
746 'handleTabSelected': function (aSelectedTab) { 743 'handleTabSelected': function (aSelectedTab) {
747 this.unselectCurrentSelectedItems(); 744 this.unselectCurrentSelectedItems();
748 745
749 switch (aSelectedTab) { 746 switch (aSelectedTab) {
750 case 'DETAILS': 747 case 'DETAILS':
751 // MochiKit.Style.hideElement(this.getElement('addDirectLoginButton')); 748 // MochiKit.Style.hideElement(this.getElement('addDirectLoginButton'));
752 break; 749 break;
753 case 'DIRECT_LOGINS': 750 case 'DIRECT_LOGINS':
754 // MochiKit.Style.showElement(this.getElement('addDirectLoginButton')); 751 // MochiKit.Style.showElement(this.getElement('addDirectLoginButton'));
755 break; 752 break;
756 case 'SHARING': 753 case 'SHARING':
757 // MochiKit.Style.hideElement(this.getElement('addDirectLoginButton')); 754 // MochiKit.Style.hideElement(this.getElement('addDirectLoginButton'));
758 break; 755 break;
759 } 756 }
760 }, 757 },
761 758
762 //------------------------------------------------------------------------- 759 //-------------------------------------------------------------------------
763 760
764 'handleKeyEvent': function (anEvent) { 761 'handleKeyEvent': function (anEvent) {
765//console.log("####", anEvent.key().string);
766 if (anEvent.key().string == 'KEY_ESCAPE') { 762 if (anEvent.key().string == 'KEY_ESCAPE') {
767 MochiKit.Signal.signal(this, 'changedValue'); 763 MochiKit.Signal.signal(this, 'changedValue');
768 this.cancel(); 764 this.cancel();
769 } else if (anEvent.key().string == 'KEY_ENTER') { 765 } else if (anEvent.key().string == 'KEY_ENTER') {
770 if (anEvent.target().nodeName == 'TEXTAREA') { 766 if (anEvent.target().nodeName == 'TEXTAREA') {
771 767
772 } else { 768 } else {
773 anEvent.preventDefault(); 769 anEvent.preventDefault();
774 } 770 }
775 } 771 }
776 }, 772 },
777 773
778 //========================================================================= 774 //=========================================================================
779 775
780 'askConfirmationForLoosingPendingChanges': function () { 776 'askConfirmationForLoosingPendingChanges': function () {
781 var deferredResult; 777 var deferredResult;
782 var confirmationDialog; 778 var confirmationDialog;
783 779
784 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({ 780 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
785 title:"Alert", 781 title:"Alert",
786 text:"Should lost pending changes?", 782 text:"Should lost pending changes?",
787 type:'ALERT', 783 type:'ALERT',
788 buttons: [ 784 buttons: [
789 {text:"Cancel",result:'CANCEL', isDefault:true}, 785 {text:"Cancel",result:'CANCEL', isDefault:true},
790 {text:"Ok", result:'OK'} 786 {text:"Ok", result:'OK'}
791 ] 787 ]
792 }); 788 });
793 789
794 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false}); 790 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false});
795 // deferredResult = confirmationDialog.deferredShow({openFromElement:anEvent.src(), onOkCloseToElement:MochiKit.DOM.currentDocument().body, onCancelCloseToElement:anEvent.src()}); 791 // deferredResult = confirmationDialog.deferredShow({openFromElement:anEvent.src(), onOkCloseToElement:MochiKit.DOM.currentDocument().body, onCancelCloseToElement:anEvent.src()});
796 deferredResult.addMethod(confirmationDialog, 'deferredShow', { 792 deferredResult.addMethod(confirmationDialog, 'deferredShow', {
797 'openFromElement': this.getElement('cancelButton'), 793 'openFromElement': this.getElement('cancelButton'),
798 'onOkCloseToElement': null, //this.getElement('cancelButton'), 794 'onOkCloseToElement': null, //this.getElement('cancelButton'),
799 'onCancelCloseToElement':this.getElement('cancelButton') 795 'onCancelCloseToElement':this.getElement('cancelButton')
800 }); 796 });
801 // deferredResult.addCallback(function () { console.log("DELETE: " + anObject.toString(), anObject); });
802 // deferredResult.addErrbackPass(function () { console.log("skip deletion: " + anObject.toString(), anObject); });
803 deferredResult.callback(); 797 deferredResult.callback();
804 798
805 return deferredResult; 799 return deferredResult;
806 }, 800 },
807 801
808 //========================================================================= 802 //=========================================================================
809 803
810 'showDirectLoginEditingComponent': function () { 804 'showDirectLoginEditingComponent': function () {
811 varwidth; 805 varwidth;
812 var transition; 806 var transition;
813 var duration; 807 var duration;
814 808
815 width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w']; 809 width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w'];
816 transition = MochiKit.Visual.Transitions.sinoidal; 810 transition = MochiKit.Visual.Transitions.sinoidal;
817 duration = 1; 811 duration = 1;
818 812
819 return Clipperz.Async.callbacks("CardDialogComponent.showDirectLoginEditingComponent", [ 813 return Clipperz.Async.callbacks("CardDialogComponent.showDirectLoginEditingComponent", [
820 MochiKit.Base.method(this, 'disableCardTitleEditing'), 814 MochiKit.Base.method(this, 'disableCardTitleEditing'),
821 MochiKit.Base.method(this.tabPanelController(), 'disable'), 815 MochiKit.Base.method(this.tabPanelController(), 'disable'),
822 816
823 MochiKit.Base.bind(function () { 817 MochiKit.Base.bind(function () {
824 MochiKit.Style.setElementPosition (this.getElement('directLoginEditDetail'), {x:width, y:-MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']}); 818 MochiKit.Style.setElementPosition (this.getElement('directLoginEditDetail'), {x:width, y:-MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']});
825 MochiKit.Style.setElementDimensions(this.getElement('directLoginEditDetail'), {w:width}); 819 MochiKit.Style.setElementDimensions(this.getElement('directLoginEditDetail'), {w:width});
826 MochiKit.Style.showElement(this.getElement('directLoginEditDetail')); 820 MochiKit.Style.showElement(this.getElement('directLoginEditDetail'));
827 MochiKit.Style.setOpacity(this.getElement('directLoginEditDetail'), 0); 821 MochiKit.Style.setOpacity(this.getElement('directLoginEditDetail'), 0);
828 MochiKit.Style.setElementDimensions(this.getElement('directLoginsComponentContainer'), { 822 MochiKit.Style.setElementDimensions(this.getElement('directLoginsComponentContainer'), {
829 h:Math.max( 823 h:Math.max(
830 MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h'], 824 MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h'],
831 MochiKit.Style.getElementDimensions(this.getElement('directLoginEditDetail'))['h'] 825 MochiKit.Style.getElementDimensions(this.getElement('directLoginEditDetail'))['h']
832 ) 826 )
833 }); 827 });
834 // MochiKit.Style.setElementDimensions(this.getElement('directLoginsComponentContainer'), {h:MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']}); 828 // MochiKit.Style.setElementDimensions(this.getElement('directLoginsComponentContainer'), {h:MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']});
835 }, this), 829 }, this),
836 MochiKit.Base.partial(Clipperz.Visual.deferredAnimations,MochiKit.Visual.Parallel, [ 830 MochiKit.Base.partial(Clipperz.Visual.deferredAnimations,MochiKit.Visual.Parallel, [
837 new MochiKit.Visual.Move(this.getElement('directLogins'), {x:-width, y:0, mode:'relative', transition:transition, sync:true}), 831 new MochiKit.Visual.Move(this.getElement('directLogins'), {x:-width, y:0, mode:'relative', transition:transition, sync:true}),
838 new MochiKit.Visual.Opacity(this.getElement('directLogins'), {from:1.0, to:0.0, transition:transition, sync:true}), 832 new MochiKit.Visual.Opacity(this.getElement('directLogins'), {from:1.0, to:0.0, transition:transition, sync:true}),
839 new MochiKit.Visual.Move(this.getElement('directLoginEditDetail'), {x:-width, y:0, mode:'relative', transition:transition, sync:true}), 833 new MochiKit.Visual.Move(this.getElement('directLoginEditDetail'), {x:-width, y:0, mode:'relative', transition:transition, sync:true}),
840 new MochiKit.Visual.Opacity(this.getElement('directLoginEditDetail'),{from:0.0, to:1.0, transition:transition, sync:true}) 834 new MochiKit.Visual.Opacity(this.getElement('directLoginEditDetail'),{from:0.0, to:1.0, transition:transition, sync:true})
841 ], {duration:duration}), 835 ], {duration:duration}),
842 836
843 MochiKit.Base.noop 837 MochiKit.Base.noop
844 ], {trace:false}); 838 ], {trace:false});
845 }, 839 },
846 840
847 //------------------------------------------------------------------------- 841 //-------------------------------------------------------------------------
848 842
849 'hideDirectLoginEditingComponent': function () { 843 'hideDirectLoginEditingComponent': function () {
850 varwidth; 844 varwidth;
851 var transition; 845 var transition;
852 var duration; 846 var duration;
853 847
854 width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w']; 848 width = MochiKit.Style.getElementDimensions(this.getElement('directLoginsComponentContainer'))['w'];
855 transition = MochiKit.Visual.Transitions.sinoidal; 849 transition = MochiKit.Visual.Transitions.sinoidal;
856 duration = 1; 850 duration = 1;
857 851
858 return Clipperz.Async.callbacks("CardDialogComponent.hideDirectLoginEditingComponent", [ 852 return Clipperz.Async.callbacks("CardDialogComponent.hideDirectLoginEditingComponent", [
859 MochiKit.Base.partial(Clipperz.Visual.deferredAnimations,MochiKit.Visual.Parallel, [ 853 MochiKit.Base.partial(Clipperz.Visual.deferredAnimations,MochiKit.Visual.Parallel, [
860 new MochiKit.Visual.Move(this.getElement('directLogins'), {x:width, y:0, mode:'relative', transition:transition, sync:true}), 854 new MochiKit.Visual.Move(this.getElement('directLogins'), {x:width, y:0, mode:'relative', transition:transition, sync:true}),
861 new MochiKit.Visual.Opacity(this.getElement('directLogins'), {from:0.0, to:1.0, transition:transition, sync:true}), 855 new MochiKit.Visual.Opacity(this.getElement('directLogins'), {from:0.0, to:1.0, transition:transition, sync:true}),
862 new MochiKit.Visual.Move(this.getElement('directLoginEditDetail'), {x:width, y:0, mode:'relative', transition:transition, sync:true}), 856 new MochiKit.Visual.Move(this.getElement('directLoginEditDetail'), {x:width, y:0, mode:'relative', transition:transition, sync:true}),
863 new MochiKit.Visual.Opacity(this.getElement('directLoginEditDetail'),{from:1.0, to:0.0, transition:transition, sync:true}) 857 new MochiKit.Visual.Opacity(this.getElement('directLoginEditDetail'),{from:1.0, to:0.0, transition:transition, sync:true})
864 ], {duration:duration}), 858 ], {duration:duration}),
865 // MochiKit.Base.partial(MochiKit.Visual.appear, this.getElement('addDirectLoginButton'), {duration:0.3}), 859 // MochiKit.Base.partial(MochiKit.Visual.appear, this.getElement('addDirectLoginButton'), {duration:0.3}),
866 Clipperz.Async.clearResult, 860 Clipperz.Async.clearResult,
867 MochiKit.Base.partial(MochiKit.Style.hideElement, this.getElement('directLoginEditDetail')), 861 MochiKit.Base.partial(MochiKit.Style.hideElement, this.getElement('directLoginEditDetail')),
868 // MochiKit.Base.partial(MochiKit.Style.showElement, this.getElement('directLogins')), 862 // MochiKit.Base.partial(MochiKit.Style.showElement, this.getElement('directLogins')),
869 MochiKit.Base.partial(MochiKit.Style.setElementDimensions, this.getElement('directLoginsComponentContainer'), {h:MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']}), 863 MochiKit.Base.partial(MochiKit.Style.setElementDimensions, this.getElement('directLoginsComponentContainer'), {h:MochiKit.Style.getElementDimensions(this.getElement('directLogins'))['h']}),
870 864
871 MochiKit.Base.method(this, 'enableCardTitleEditing'), 865 MochiKit.Base.method(this, 'enableCardTitleEditing'),
872 MochiKit.Base.method(this.tabPanelController(), 'enable') 866 MochiKit.Base.method(this.tabPanelController(), 'enable')
873 ], {trace:false}); 867 ], {trace:false});
874 }, 868 },
875 869
876 //========================================================================= 870 //=========================================================================
877 __syntaxFix__: "syntax fix" 871 __syntaxFix__: "syntax fix"
878}); 872});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js
index 2e61f5f..0cee650 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js
@@ -1,179 +1,173 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent = function(args) { 26Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter');
34 this._faviconComponent = null; 32 this._faviconComponent = null;
35 33
36 return this; 34 return this;
37} 35}
38 36
39//============================================================================= 37//=============================================================================
40 38
41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
42 40
43 //------------------------------------------------------------------------- 41 //-------------------------------------------------------------------------
44 42
45 'toString': function () { 43 'toString': function () {
46 return "Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent component"; 44 return "Clipperz.PM.UI.Web.Components.CardDialogRecordDirectLoginComponent component";
47 }, 45 },
48 46
49 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
50 48
51 'reference': function () { 49 'reference': function () {
52 return this._reference; 50 return this._reference;
53 }, 51 },
54 52
55 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
56 54
57 'renderSelf': function() { 55 'renderSelf': function() {
58//console.log(">>> CardDialogRecordDirectLoginComponent.renderSelf");
59 this.append(this.element(), [ 56 this.append(this.element(), [
60 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_favicon', children:[ 57 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_favicon', children:[
61 {tag:'img', cls:'favicon', id:this.getId('favicon')} 58 {tag:'img', cls:'favicon', id:this.getId('favicon')}
62 ]}, 59 ]},
63 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_label', children:[ 60 {tag:'div', cls:'cardDialogRecordDirectLoginComponent_label', children:[
64 {tag:'input', id:this.getId('label'), type:'text'} 61 {tag:'input', id:this.getId('label'), type:'text'}
65 ]}, 62 ]},
66 {tag:'div', cls:'open', children:[ 63 {tag:'div', cls:'open', children:[
67 {tag:'span', children:[ 64 {tag:'span', children:[
68 {tag:'a', href:'open', id:this.getId('open'), html:'&nbsp;'} 65 {tag:'a', href:'open', id:this.getId('open'), html:'&nbsp;'}
69 ]} 66 ]}
70 ]}, 67 ]},
71 {tag:'div', cls:'edit', children:[ 68 {tag:'div', cls:'edit', children:[
72 {tag:'span', children:[ 69 {tag:'span', children:[
73 {tag:'a', href:'edit', id:this.getId('edit'), html:"edit"} 70 {tag:'a', href:'edit', id:this.getId('edit'), html:"edit"}
74 ]} 71 ]}
75 ]}, 72 ]},
76 {tag:'div', cls:'delete', children:[ 73 {tag:'div', cls:'delete', children:[
77 {tag:'span', children:[ 74 {tag:'span', children:[
78 {tag:'a', href:'delete', id:this.getId('delete'), html:"delete"} 75 {tag:'a', href:'delete', id:this.getId('delete'), html:"delete"}
79 ]} 76 ]}
80 ]} 77 ]}
81/* 78/*
82 {tag:'td', cls:'fieldState'}, 79 {tag:'td', cls:'fieldState'},
83 {tag:'td', cls:'fieldLabel', children:[ 80 {tag:'td', cls:'fieldLabel', children:[
84 {tag:'input', cls:'label', id:this.getId('label')} 81 {tag:'input', cls:'label', id:this.getId('label')}
85 ]}, 82 ]},
86 {tag:'td', cls:'fieldLock', children:[ 83 {tag:'td', cls:'fieldLock', children:[
87 {tag:'div', cls:'unlocked', id:this.getId('isHidden')} 84 {tag:'div', cls:'unlocked', id:this.getId('isHidden')}
88 ]}, 85 ]},
89 {tag:'td', cls:'fieldValue', children:[ 86 {tag:'td', cls:'fieldValue', children:[
90 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[ 87 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[
91 {tag:'input', type:'text', cls:'value', id:this.getId('value')} 88 {tag:'input', type:'text', cls:'value', id:this.getId('value')}
92 ]} 89 ]}
93 ]}, 90 ]},
94 {tag:'td', cls:'fieldAddDelete', children:[ 91 {tag:'td', cls:'fieldAddDelete', children:[
95 {tag:'div', cls:'delete', children:[ 92 {tag:'div', cls:'delete', children:[
96 {tag:'span', children:[ 93 {tag:'span', children:[
97 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"} 94 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"}
98 ]} 95 ]}
99 ]} 96 ]}
100 ]} 97 ]}
101*/ 98*/
102 ]); 99 ]);
103 100
104 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 101 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
105 MochiKit.Signal.connect(this.getId('open'), 'onclick',this, 'openDirectLogin'); 102 MochiKit.Signal.connect(this.getId('open'), 'onclick',this, 'openDirectLogin');
106 MochiKit.Signal.connect(this.getId('edit'), 'onclick',this, 'editDirectLogin'); 103 MochiKit.Signal.connect(this.getId('edit'), 'onclick',this, 'editDirectLogin');
107 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteDirectLogin'); 104 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteDirectLogin');
108 }, 105 },
109 106
110 //------------------------------------------------------------------------- 107 //-------------------------------------------------------------------------
111 108
112 'shouldShowElementWhileRendering': function () { 109 'shouldShowElementWhileRendering': function () {
113 return false; 110 return false;
114 }, 111 },
115 112
116 //------------------------------------------------------------------------- 113 //-------------------------------------------------------------------------
117 114
118 'faviconComponent': function () { 115 'faviconComponent': function () {
119 if (this._faviconComponent == null) { 116 if (this._faviconComponent == null) {
120//console.log("created the FAVICON component");
121 this._faviconComponent = new Clipperz.PM.UI.Common.Components.FaviconComponent({element:this.getId('favicon')}); 117 this._faviconComponent = new Clipperz.PM.UI.Common.Components.FaviconComponent({element:this.getId('favicon')});
122 } 118 }
123 119
124 return this._faviconComponent; 120 return this._faviconComponent;
125 }, 121 },
126 122
127 //========================================================================= 123 //=========================================================================
128 124
129 'label': function () { 125 'label': function () {
130 return this.getElement('label').value; 126 return this.getElement('label').value;
131 }, 127 },
132 128
133 'setLabel': function (aValue) { 129 'setLabel': function (aValue) {
134 this.getElement('label').value = Clipperz.Base.sanitizeString(aValue); 130 this.getElement('label').value = Clipperz.Base.sanitizeString(aValue);
135 }, 131 },
136 132
137 //------------------------------------------------------------------------- 133 //-------------------------------------------------------------------------
138 134
139 'favicon': function () { 135 'favicon': function () {
140 // return this.getElement('favicon').src; 136 // return this.getElement('favicon').src;
141 return this.faviconComponent().src(); 137 return this.faviconComponent().src();
142 }, 138 },
143 139
144 'setFavicon': function (aValue) { 140 'setFavicon': function (aValue) {
145 // this.getElement('favicon').src = Clipperz.Base.sanitizeString(aValue); 141 // this.getElement('favicon').src = Clipperz.Base.sanitizeString(aValue);
146 this.faviconComponent().setSrc(Clipperz.Base.sanitizeString(aValue)); 142 this.faviconComponent().setSrc(Clipperz.Base.sanitizeString(aValue));
147 }, 143 },
148 144
149 //========================================================================= 145 //=========================================================================
150 146
151 'openDirectLogin': function (anEvent) { 147 'openDirectLogin': function (anEvent) {
152 anEvent.preventDefault(); 148 anEvent.preventDefault();
153 149
154 MochiKit.Signal.signal(this, 'openDirectLogin', this.reference()); 150 MochiKit.Signal.signal(this, 'openDirectLogin', this.reference());
155 }, 151 },
156 152
157 //------------------------------------------------------------------------- 153 //-------------------------------------------------------------------------
158 154
159 'editDirectLogin': function (anEvent) { 155 'editDirectLogin': function (anEvent) {
160 anEvent.preventDefault(); 156 anEvent.preventDefault();
161 157
162 MochiKit.Signal.signal(this, 'editDirectLogin', this.reference()); 158 MochiKit.Signal.signal(this, 'editDirectLogin', this.reference());
163//console.log("EDIT DIRECT LOGIN");
164 }, 159 },
165 160
166 //------------------------------------------------------------------------- 161 //-------------------------------------------------------------------------
167 162
168 'deleteDirectLogin': function (anEvent) { 163 'deleteDirectLogin': function (anEvent) {
169 anEvent.preventDefault(); 164 anEvent.preventDefault();
170 165
171 MochiKit.Signal.signal(this, 'deleteDirectLogin', this.reference()); 166 MochiKit.Signal.signal(this, 'deleteDirectLogin', this.reference());
172//console.log("DELETE DIRECT LOGIN");
173 }, 167 },
174 168
175 169
176 170
177 //========================================================================= 171 //=========================================================================
178 __syntaxFix__: "syntax fix" 172 __syntaxFix__: "syntax fix"
179}); 173});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js
index b58062c..689406a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js
@@ -1,187 +1,183 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent = function(args) { 26Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._reference = args.reference|| Clipperz.Base.exception.raise('MandatoryParameter');
34 this._actionType = null; 32 this._actionType = null;
35 33
36 return this; 34 return this;
37} 35}
38 36
39//============================================================================= 37//=============================================================================
40 38
41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
42 40
43 //------------------------------------------------------------------------- 41 //-------------------------------------------------------------------------
44 42
45 'toString': function () { 43 'toString': function () {
46 return "Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent component"; 44 return "Clipperz.PM.UI.Web.Components.CardDialogRecordFieldComponent component";
47 }, 45 },
48 46
49 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
50 48
51 'renderSelf': function() { 49 'renderSelf': function() {
52 this.append(this.element(), [ 50 this.append(this.element(), [
53 {tag:'td', cls:'fieldState'}, 51 {tag:'td', cls:'fieldState'},
54 {tag:'td', cls:'fieldLabel', children:[ 52 {tag:'td', cls:'fieldLabel', children:[
55 {tag:'input', cls:'label', id:this.getId('label')} 53 {tag:'input', cls:'label', id:this.getId('label')}
56 ]}, 54 ]},
57 {tag:'td', cls:'fieldLock', children:[ 55 {tag:'td', cls:'fieldLock', children:[
58 {tag:'div', cls:'unlocked', id:this.getId('isHidden')} 56 {tag:'div', cls:'unlocked', id:this.getId('isHidden')}
59 ]}, 57 ]},
60 {tag:'td', cls:'fieldValue', children:[ 58 {tag:'td', cls:'fieldValue', children:[
61 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[ 59 {tag:'div', cls:'unlocked', id:this.getId('valueWrapper'), children:[
62 {tag:'input', type:'text', cls:'value', id:this.getId('value')} 60 {tag:'input', type:'text', cls:'value', id:this.getId('value')}
63 ]} 61 ]}
64 ]}, 62 ]},
65 {tag:'td', cls:'fieldAction', children:[ 63 {tag:'td', cls:'fieldAction', children:[
66 {tag:'a', href:'#', id:this.getId('actionLink'), html:'&nbsp;'} 64 {tag:'a', href:'#', id:this.getId('actionLink'), html:'&nbsp;'}
67 ]}, 65 ]},
68 {tag:'td', cls:'fieldAddDelete', children:[ 66 {tag:'td', cls:'fieldAddDelete', children:[
69 {tag:'div', cls:'delete', children:[ 67 {tag:'div', cls:'delete', children:[
70 {tag:'span', children:[ 68 {tag:'span', children:[
71 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"} 69 {tag:'a', href:'#', id:this.getId('delete'), html:"delete"}
72 ]} 70 ]}
73 ]} 71 ]}
74 ]} 72 ]}
75 ]); 73 ]);
76 74
77 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 75 MochiKit.Signal.connect(this.getId('label'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
78 MochiKit.Signal.connect(this.getId('isHidden'), 'onclick',this, 'toggleIsHidden'); 76 MochiKit.Signal.connect(this.getId('isHidden'), 'onclick',this, 'toggleIsHidden');
79 MochiKit.Signal.connect(this.getId('value'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue')); 77 MochiKit.Signal.connect(this.getId('value'), 'onkeyup',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'changedValue'));
80 MochiKit.Signal.connect(this.getId('actionLink'), 'onclick',this, 'handleActionLink'); 78 MochiKit.Signal.connect(this.getId('actionLink'), 'onclick',this, 'handleActionLink');
81 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteField'); 79 MochiKit.Signal.connect(this.getId('delete'), 'onclick',this, 'deleteField');
82 // MochiKit.Signal.connect(this.getId('delete'), 'onclick',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'deleteField', this.reference())); 80 // MochiKit.Signal.connect(this.getId('delete'), 'onclick',MochiKit.Base.partial(MochiKit.Signal.signal, this, 'deleteField', this.reference()));
83 }, 81 },
84 82
85 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
86 84
87 'shouldShowElementWhileRendering': function () { 85 'shouldShowElementWhileRendering': function () {
88 return false; 86 return false;
89 }, 87 },
90 88
91 //========================================================================= 89 //=========================================================================
92 90
93 'reference': function () { 91 'reference': function () {
94 return this._reference; 92 return this._reference;
95 }, 93 },
96 94
97 //========================================================================= 95 //=========================================================================
98 96
99 'label': function () { 97 'label': function () {
100 return this.getElement('label').value; 98 return this.getElement('label').value;
101 }, 99 },
102 100
103 'setLabel': function (aValue) { 101 'setLabel': function (aValue) {
104 // this.getElement('label').value = Clipperz.Base.sanitizeString(aValue); 102 // this.getElement('label').value = Clipperz.Base.sanitizeString(aValue);
105 this.getElement('label').value = aValue; 103 this.getElement('label').value = aValue;
106 }, 104 },
107 105
108 //========================================================================= 106 //=========================================================================
109 107
110 'value': function () { 108 'value': function () {
111 return this.getElement('value').value; 109 return this.getElement('value').value;
112 }, 110 },
113 111
114 'setValue': function (aValue) { 112 'setValue': function (aValue) {
115 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue); 113 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue);
116 this.getElement('value').value = aValue; 114 this.getElement('value').value = aValue;
117 }, 115 },
118 116
119 //------------------------------------------------------------------------- 117 //-------------------------------------------------------------------------
120 118
121 'actionType': function () { 119 'actionType': function () {
122 return this._actionType; 120 return this._actionType;
123 }, 121 },
124 122
125 'setActionType': function (anActionType) { 123 'setActionType': function (anActionType) {
126 this._actionType = anActionType; 124 this._actionType = anActionType;
127 125
128 switch (this._actionType) { 126 switch (this._actionType) {
129 case 'NONE': 127 case 'NONE':
130 MochiKit.Style.hideElement(this.getId('actionLink')); 128 MochiKit.Style.hideElement(this.getId('actionLink'));
131 MochiKit.DOM.setElementClass(this.getId('actionLink'), ''); 129 MochiKit.DOM.setElementClass(this.getId('actionLink'), '');
132 break; 130 break;
133 case 'URL': 131 case 'URL':
134 MochiKit.Style.showElement(this.getId('actionLink')); 132 MochiKit.Style.showElement(this.getId('actionLink'));
135 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'url'); 133 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'url');
136 break; 134 break;
137 case 'EMAIL': 135 case 'EMAIL':
138 MochiKit.Style.showElement(this.getId('actionLink')); 136 MochiKit.Style.showElement(this.getId('actionLink'));
139 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'email'); 137 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'email');
140 break; 138 break;
141 case 'PASSWORD': 139 case 'PASSWORD':
142 MochiKit.Style.showElement(this.getId('actionLink')); 140 MochiKit.Style.showElement(this.getId('actionLink'));
143 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'password'); 141 MochiKit.DOM.setElementClass(this.getId('actionLink'), 'password');
144 break; 142 break;
145 } 143 }
146 }, 144 },
147 145
148 //========================================================================= 146 //=========================================================================
149 147
150 'isHidden': function () { 148 'isHidden': function () {
151 // return this.getElement('value').value; 149 // return this.getElement('value').value;
152 return MochiKit.DOM.hasElementClass(this.getElement('isHidden'), 'locked'); 150 return MochiKit.DOM.hasElementClass(this.getElement('isHidden'), 'locked');
153 }, 151 },
154 152
155 'setIsHidden': function (aValue) { 153 'setIsHidden': function (aValue) {
156 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue); 154 // this.getElement('value').value = Clipperz.Base.sanitizeString(aValue);
157 MochiKit.DOM.setElementClass(this.getElement('isHidden'), (aValue ? 'locked': 'unlocked')); 155 MochiKit.DOM.setElementClass(this.getElement('isHidden'), (aValue ? 'locked': 'unlocked'));
158 MochiKit.DOM.setElementClass(this.getElement('valueWrapper'), (aValue ? 'locked': 'unlocked')); 156 MochiKit.DOM.setElementClass(this.getElement('valueWrapper'), (aValue ? 'locked': 'unlocked'));
159 }, 157 },
160 158
161 'toggleIsHidden': function (anEvent) { 159 'toggleIsHidden': function (anEvent) {
162 anEvent.preventDefault(); 160 anEvent.preventDefault();
163 161
164 this.setIsHidden(! this.isHidden()); 162 this.setIsHidden(! this.isHidden());
165 MochiKit.Signal.signal(this, 'changedValue'); 163 MochiKit.Signal.signal(this, 'changedValue');
166 }, 164 },
167 165
168 //========================================================================= 166 //=========================================================================
169 167
170 'handleActionLink': function (anEvent) { 168 'handleActionLink': function (anEvent) {
171 anEvent.preventDefault(); 169 anEvent.preventDefault();
172
173//console.log("ACTION LINK - " + this.actionType());
174 MochiKit.Signal.signal(this, 'performAction', this.reference(), anEvent.target()); 170 MochiKit.Signal.signal(this, 'performAction', this.reference(), anEvent.target());
175 }, 171 },
176 172
177 //========================================================================= 173 //=========================================================================
178 174
179 'deleteField': function (anEvent) { 175 'deleteField': function (anEvent) {
180 anEvent.preventDefault(); 176 anEvent.preventDefault();
181 177
182 MochiKit.Signal.signal(this, 'deleteField', this.reference()); 178 MochiKit.Signal.signal(this, 'deleteField', this.reference());
183 }, 179 },
184 180
185 //========================================================================= 181 //=========================================================================
186 __syntaxFix__: "syntax fix" 182 __syntaxFix__: "syntax fix"
187}); 183});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js
index 391c379..41e32a0 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.ColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.ColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.ColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.ColumnManager.superclass.constructor.call(this, args);
33 31
34 this._name = args.name || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._name = args.name || Clipperz.Base.exception.raise('MandatoryParameter');
35 this._selector = args.selector|| Clipperz.Base.exception.raise('MandatoryParameter');; 33 this._selector = args.selector|| Clipperz.Base.exception.raise('MandatoryParameter');;
36 this._label = args.label || null; 34 this._label = args.label || null;
37 this._isSortable = args.sortable|| false; 35 this._isSortable = args.sortable|| false;
38 this._comparator = args.comparator|| null; 36 this._comparator = args.comparator|| null;
39 this._sorted = args.sorted || 'UNSORTED'; //'ASCENDING' | 'DESCENDING' | 'UNSORTED' 37 this._sorted = args.sorted || 'UNSORTED'; //'ASCENDING' | 'DESCENDING' | 'UNSORTED'
40 this._cssClass = args.cssClass|| ''; 38 this._cssClass = args.cssClass|| '';
41 39
42 this._signalIdentifiers = []; 40 this._signalIdentifiers = [];
43 41
44 return this; 42 return this;
45} 43}
46 44
47//============================================================================= 45//=============================================================================
48 46
49Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ColumnManager, Clipperz.PM.UI.Common.Components.BaseComponent, { 47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ColumnManager, Clipperz.PM.UI.Common.Components.BaseComponent, {
50 48
51 'toString': function () { 49 'toString': function () {
52 return "Clipperz.PM.UI.Web.Components.ColumnManager - " + this._name; 50 return "Clipperz.PM.UI.Web.Components.ColumnManager - " + this._name;
53 }, 51 },
54 52
55 'name': function () { 53 'name': function () {
56 return this._name; 54 return this._name;
57 }, 55 },
58 56
59 'label': function () { 57 'label': function () {
60 return this._label; 58 return this._label;
61 }, 59 },
62 60
63 'selector': function () { 61 'selector': function () {
64 return this._selector; 62 return this._selector;
65 }, 63 },
66 64
67 'comparator': function() { 65 'comparator': function() {
68 return this._comparator; 66 return this._comparator;
69 }, 67 },
70 68
71 'cssClass': function() { 69 'cssClass': function() {
72 return this._cssClass; 70 return this._cssClass;
73 }, 71 },
74 72
75 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
76 74
77 'isSortable': function () { 75 'isSortable': function () {
78 return this._isSortable; 76 return this._isSortable;
79 }, 77 },
80 78
81 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
82 80
83 'sorted': function () { 81 'sorted': function () {
84 return this._sorted; 82 return this._sorted;
85 }, 83 },
86 84
87 'isSorted': function () { 85 'isSorted': function () {
88 return (this.sorted() != 'UNSORTED'); 86 return (this.sorted() != 'UNSORTED');
89 }, 87 },
90 88
91 'setSorted': function(aValue) { 89 'setSorted': function(aValue) {
92 this._sorted = aValue; 90 this._sorted = aValue;
93 this.updateSortIcon(); 91 this.updateSortIcon();
94 }, 92 },
95 93
96 //------------------------------------------------------------------------- 94 //-------------------------------------------------------------------------
97 95
98 'signalIdentifiers': function () { 96 'signalIdentifiers': function () {
99 return this._signalIdentifiers; 97 return this._signalIdentifiers;
100 }, 98 },
101 99
102 'resetSignalIdentifiers': function () { 100 'resetSignalIdentifiers': function () {
103 this._signalIdentifiers = []; 101 this._signalIdentifiers = [];
104 }, 102 },
105 103
106 //------------------------------------------------------------------------- 104 //-------------------------------------------------------------------------
107 105
108 'disconnectRowsSignals': function () { 106 'disconnectRowsSignals': function () {
109 MochiKit.Base.map(MochiKit.Signal.disconnect, this.signalIdentifiers()); 107 MochiKit.Base.map(MochiKit.Signal.disconnect, this.signalIdentifiers());
110 this.resetSignalIdentifiers(); 108 this.resetSignalIdentifiers();
111 }, 109 },
112 110
113 'connectEvent': function () { 111 'connectEvent': function () {
114 var ident; 112 var ident;
115 113
116 ident = MochiKit.Signal.connect.apply(null, arguments); 114 ident = MochiKit.Signal.connect.apply(null, arguments);
117 this.signalIdentifiers().push(ident); 115 this.signalIdentifiers().push(ident);
118 }, 116 },
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js
index d3aa175..3d0ba76 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js
@@ -1,68 +1,66 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent = function(args) { 26Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent.superclass.constructor.apply(this, arguments);
32 30
33 return this; 31 return this;
34} 32}
35 33
36//============================================================================= 34//=============================================================================
37 35
38Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 36Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
39 37
40 //------------------------------------------------------------------------- 38 //-------------------------------------------------------------------------
41 39
42 'toString': function () { 40 'toString': function () {
43 return "Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent component"; 41 return "Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent component";
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'renderSelf': function() { 46 'renderSelf': function() {
49 this.append(this.element(), [ 47 this.append(this.element(), [
50 {tag:'div', cls:'createNewCardSplash', id:this.getId('button'), children:[ 48 {tag:'div', cls:'createNewCardSplash', id:this.getId('button'), children:[
51 {tag:'span', html:"Create New Card"} 49 {tag:'span', html:"Create New Card"}
52 ]} 50 ]}
53 ]); 51 ]);
54 52
55 MochiKit.Signal.connect(this.getElement('button'), 'onclick', this, 'handleClick'); 53 MochiKit.Signal.connect(this.getElement('button'), 'onclick', this, 'handleClick');
56 }, 54 },
57 55
58 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
59 57
60 'handleClick': function (anEvent) { 58 'handleClick': function (anEvent) {
61 anEvent.preventDefault(); 59 anEvent.preventDefault();
62 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'addCard', this.element()); 60 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'addCard', this.element());
63 }, 61 },
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67 __syntaxFix__: "syntax fix" 65 __syntaxFix__: "syntax fix"
68}); 66});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
index 462d864..23f6710 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js
@@ -1,116 +1,114 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.DataPanel = function(args) { 26Clipperz.PM.UI.Web.Components.DataPanel = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.DataPanel.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.DataPanel.superclass.constructor.apply(this, arguments);
32 30
33 this._initiallySelectedTab = args.selected || 'OFFLINE_COPY'; 31 this._initiallySelectedTab = args.selected || 'OFFLINE_COPY';
34 this._tabPanelControllerConfiguration = { 32 this._tabPanelControllerConfiguration = {
35 'OFFLINE_COPY': { 33 'OFFLINE_COPY': {
36 tab:'offlineCopyTab', 34 tab:'offlineCopyTab',
37 panel:'offlineCopyPanel' 35 panel:'offlineCopyPanel'
38 }, 36 },
39 'SHARING': { 37 'SHARING': {
40 tab:'sharingTab', 38 tab:'sharingTab',
41 panel:'sharingPanel' 39 panel:'sharingPanel'
42 }, 40 },
43 'IMPORT': { 41 'IMPORT': {
44 tab:'importTab', 42 tab:'importTab',
45 panel:'importPanel' 43 panel:'importPanel'
46 }, 44 },
47 'EXPORT': { 45 'EXPORT': {
48 tab:'exportTab', 46 tab:'exportTab',
49 panel:'exportPanel' 47 panel:'exportPanel'
50 } 48 }
51 }; 49 };
52 50
53 return this; 51 return this;
54} 52}
55 53
56//============================================================================= 54//=============================================================================
57 55
58Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DataPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 56Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DataPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'toString': function () { 60 'toString': function () {
63 return "Clipperz.PM.UI.Web.Components.DataPanel component"; 61 return "Clipperz.PM.UI.Web.Components.DataPanel component";
64 }, 62 },
65 63
66 //------------------------------------------------------------------------- 64 //-------------------------------------------------------------------------
67 65
68 'renderSelf': function(/*aContainer, aPosition*/) { 66 'renderSelf': function(/*aContainer, aPosition*/) {
69 this.append(this.element(), [ 67 this.append(this.element(), [
70 {tag:'div', cls:'header', children:[ 68 {tag:'div', cls:'header', children:[
71 {tag:'div', cls:'subPanelTabs', children:[ 69 {tag:'div', cls:'subPanelTabs', children:[
72 {tag:'ul', children:[ 70 {tag:'ul', children:[
73 {tag:'li', id:this.getId('offlineCopyTab'),children:[{tag:'a', href:'#', html:'Offline copy'}], cls:'first'}, 71 {tag:'li', id:this.getId('offlineCopyTab'),children:[{tag:'a', href:'#', html:'Offline copy'}], cls:'first'},
74 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'a', href:'#', html:'Sharing'}]}, 72 {tag:'li', id:this.getId('sharingTab'), children:[{tag:'a', href:'#', html:'Sharing'}]},
75 {tag:'li', id:this.getId('importTab'), children:[{tag:'a', href:'#', html:'Import'}]}, 73 {tag:'li', id:this.getId('importTab'), children:[{tag:'a', href:'#', html:'Import'}]},
76 {tag:'li', id:this.getId('exportTab'), children:[{tag:'a', href:'#', html:'Export'}]} 74 {tag:'li', id:this.getId('exportTab'), children:[{tag:'a', href:'#', html:'Export'}]}
77 ]} 75 ]}
78 ]} 76 ]}
79 ]}, 77 ]},
80 {tag:'div', cls:'body', children:[ 78 {tag:'div', cls:'body', children:[
81 {tag:'div', cls:'accountPanel', children:[ 79 {tag:'div', cls:'accountPanel', children:[
82 {tag:'div', cls:'subPanelContent', children:[ 80 {tag:'div', cls:'subPanelContent', children:[
83 {tag:'ul', children:[ 81 {tag:'ul', children:[
84 {tag:'li', id:this.getId('offlineCopyPanel'),children:[ 82 {tag:'li', id:this.getId('offlineCopyPanel'),children:[
85 // {tag:'h3', html:"Offline copy"}, 83 // {tag:'h3', html:"Offline copy"},
86 {tag:'p', html:"With just one click you can dump all your encrypted data from Clipperz servers to your hard disk and create a read-only offline version of Clipperz to be used when you are not connected to the Internet."}, 84 {tag:'p', html:"With just one click you can dump all your encrypted data from Clipperz servers to your hard disk and create a read-only offline version of Clipperz to be used when you are not connected to the Internet."},
87 {tag:'a', id:this.getId('offlineCopyDownloadLink'), href:'#', html:"Download", cls:'downloadOfflineCopy'} 85 {tag:'a', id:this.getId('offlineCopyDownloadLink'), href:'#', html:"Download", cls:'downloadOfflineCopy'}
88 ]}, 86 ]},
89 {tag:'li', id:this.getId('sharingPanel'),children:[ 87 {tag:'li', id:this.getId('sharingPanel'),children:[
90 // {tag:'h3', html:"Sharing"} 88 // {tag:'h3', html:"Sharing"}
91 ]}, 89 ]},
92 {tag:'li', id:this.getId('importPanel'), children:[ 90 {tag:'li', id:this.getId('importPanel'), children:[
93 // {tag:'h3', html:"Import"} 91 // {tag:'h3', html:"Import"}
94 ]}, 92 ]},
95 {tag:'li', id:this.getId('exportPanel'), children:[ 93 {tag:'li', id:this.getId('exportPanel'), children:[
96 // {tag:'h3', html:"Export"} 94 // {tag:'h3', html:"Export"}
97 ]} 95 ]}
98 ]} 96 ]}
99 ]} 97 ]}
100 ]} 98 ]}
101 ]}, 99 ]},
102 {tag:'div', cls:'footer'} 100 {tag:'div', cls:'footer'}
103 ]); 101 ]);
104 102
105 this.tabPanelController().setup({selected:this.initiallySelectedTab()}); 103 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
106 MochiKit.Signal.connect(this.getId('offlineCopyDownloadLink'), 'onclick', this, 'downloadOfflineCopy'); 104 MochiKit.Signal.connect(this.getId('offlineCopyDownloadLink'), 'onclick', this, 'downloadOfflineCopy');
107 }, 105 },
108 106
109 'downloadOfflineCopy': function (anEvent) { 107 'downloadOfflineCopy': function (anEvent) {
110 anEvent.preventDefault(); 108 anEvent.preventDefault();
111 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'downloadOfflineCopy', anEvent.src()); 109 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'downloadOfflineCopy', anEvent.src());
112 }, 110 },
113 111
114 //------------------------------------------------------------------------- 112 //-------------------------------------------------------------------------
115 __syntaxFix__: "syntax fix" 113 __syntaxFix__: "syntax fix"
116}); 114});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js
index ea55ba4..b305045 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js
@@ -1,69 +1,67 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.DateColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.DateColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.DateColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.DateColumnManager.superclass.constructor.call(this, args);
33 31
34 this._format = args.format|| Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._format = args.format|| Clipperz.Base.exception.raise('MandatoryParameter');
35 33
36 return this; 34 return this;
37} 35}
38 36
39//============================================================================= 37//=============================================================================
40 38
41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DateColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DateColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
42 40
43 'toString': function () { 41 'toString': function () {
44 return "Clipperz.PM.UI.Web.Components.DateColumnManager component"; 42 return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
45 }, 43 },
46 44
47 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
48 46
49 'format': function () { 47 'format': function () {
50 return this._format; 48 return this._format;
51 }, 49 },
52 50
53 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
54 52
55 'renderCell': function(aRowElement, anObject) { 53 'renderCell': function(aRowElement, anObject) {
56 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 54 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
57 { 55 {
58 tag:'span', 56 tag:'span',
59 title:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], "D, d M Y H:i:s"), 57 title:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], "D, d M Y H:i:s"),
60 html:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], this.format()) 58 html:Clipperz.PM.Date.formatDateWithTemplate(anObject[this.name()], this.format())
61 } 59 }
62 ]}); 60 ]});
63 }, 61 },
64 62
65 //----------------------------------------------------- 63 //-----------------------------------------------------
66 64
67 '__syntax_fix__' : 'syntax fix' 65 '__syntax_fix__' : 'syntax fix'
68}); 66});
69 67
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js
index fe59494..6efe4c6 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js
@@ -1,67 +1,65 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager.superclass.constructor.call(this, args);
33 31
34 return this; 32 return this;
35} 33}
36 34
37//============================================================================= 35//=============================================================================
38 36
39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager, Clipperz.PM.UI.Web.Components.LinkColumnManager, { 37Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager, Clipperz.PM.UI.Web.Components.LinkColumnManager, {
40 38
41 'toString': function () { 39 'toString': function () {
42 return "Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager component"; 40 return "Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager component";
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'renderCell': function(aRowElement, anObject) { 45 'renderCell': function(aRowElement, anObject) {
48 var tdElement; 46 var tdElement;
49 var linkElement; 47 var linkElement;
50 48
51 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 49 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
52 {tag:'div', cls:'delete', children:[ 50 {tag:'div', cls:'delete', children:[
53 {tag:'span', children:[ 51 {tag:'span', children:[
54 {tag:'a', href:'delete', html:"delete"} 52 {tag:'a', href:'delete', html:"delete"}
55 ]} 53 ]}
56 ]} 54 ]}
57 ]}); 55 ]});
58 56
59 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement); 57 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
60 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 58 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
61 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 59 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
62 }, 60 },
63 61
64 //----------------------------------------------------- 62 //-----------------------------------------------------
65 '__syntax_fix__' : 'syntax fix' 63 '__syntax_fix__' : 'syntax fix'
66}); 64});
67 65
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js
index a1f0f9f..2dad703 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js
@@ -1,87 +1,85 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26/* 24/*
27Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 25Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
28 26
29//############################################################################# 27//#############################################################################
30 28
31Clipperz.PM.UI.Web.Components.DirectLoginColumnManager = function(args) { 29Clipperz.PM.UI.Web.Components.DirectLoginColumnManager = function(args) {
32 args = args || {}; 30 args = args || {};
33 Clipperz.PM.UI.Web.Components.DirectLoginColumnManager.superclass.constructor.call(this, args); 31 Clipperz.PM.UI.Web.Components.DirectLoginColumnManager.superclass.constructor.call(this, args);
34 32
35 this._actionMethod = args.actionMethod || null; 33 this._actionMethod = args.actionMethod || null;
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
43 41
44 'toString': function () { 42 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.DateColumnManager component"; 43 return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
46 }, 44 },
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'actionMethod': function () { 48 'actionMethod': function () {
51 return this._actionMethod; 49 return this._actionMethod;
52 }, 50 },
53 51
54 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
55 53
56 'renderCell': function(aRowElement, anObject) { 54 'renderCell': function(aRowElement, anObject) {
57 vartdElement; 55 vartdElement;
58 varlinkElement; 56 varlinkElement;
59 57
60 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 58 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
61 {tag:'div', cls:'directLogin_directLogin', children:[ 59 {tag:'div', cls:'directLogin_directLogin', children:[
62 {tag:'div', cls:'directLogin_directLogin_body', children:[ 60 {tag:'div', cls:'directLogin_directLogin_body', children:[
63 {tag:'a', href:'#', html:anObject[this.name()]} 61 {tag:'a', href:'#', html:anObject[this.name()]}
64 ]} 62 ]}
65 ]} 63 ]}
66 ]}); 64 ]});
67 65
68 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement); 66 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
69 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 67 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
70 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 68 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
71 }, 69 },
72 70
73 //----------------------------------------------------- 71 //-----------------------------------------------------
74 72
75 'handleLinkClick': function (anObject, anEvent) { 73 'handleLinkClick': function (anObject, anEvent) {
76 anEvent.preventDefault(); 74 anEvent.preventDefault();
77 75
78 if (this.actionMethod() != null) { 76 if (this.actionMethod() != null) {
79 this.actionMethod()(anObject, anEvent); 77 this.actionMethod()(anObject, anEvent);
80 } 78 }
81 }, 79 },
82 80
83 //----------------------------------------------------- 81 //-----------------------------------------------------
84 '__syntax_fix__' : 'syntax fix' 82 '__syntax_fix__' : 'syntax fix'
85}); 83});
86 84
87*/ \ No newline at end of file 85*/ \ No newline at end of file
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js
index 1a76b0c..f5f99d4 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent = function(args) { 26Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter');
34 this._fields = args.fields || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._fields = args.fields || Clipperz.Base.exception.raise('MandatoryParameter');
35 this._initiallySelectedFieldKey = args.selectedFieldKey|| null; 33 this._initiallySelectedFieldKey = args.selectedFieldKey|| null;
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'toString': function () { 44 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent component"; 45 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent component";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'formFieldName': function () { 50 'formFieldName': function () {
53 return this._formFieldName; 51 return this._formFieldName;
54 }, 52 },
55 53
56 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
57 55
58 'fields': function () { 56 'fields': function () {
59 return this._fields; 57 return this._fields;
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'selectedValue': function () { 62 'selectedValue': function () {
65 var result; 63 var result;
66 64
67 result = this.getElement('select').value; 65 result = this.getElement('select').value;
68 66
69 if (result == '---') { 67 if (result == '---') {
70 result = null; 68 result = null;
71 } 69 }
72 70
73 return result; 71 return result;
74 }, 72 },
75 73
76 'initiallySelectedFieldKey': function () { 74 'initiallySelectedFieldKey': function () {
77 return this._initiallySelectedFieldKey; 75 return this._initiallySelectedFieldKey;
78 }, 76 },
79 77
80 //========================================================================= 78 //=========================================================================
81 79
82 'renderSelf': function() { 80 'renderSelf': function() {
83 var initiallySelectedOptions; 81 var initiallySelectedOptions;
84 82
85 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'binding', children:[ 83 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'binding', children:[
86 {tag:'span', cls:'formFieldName', html:this.formFieldName()}, 84 {tag:'span', cls:'formFieldName', html:this.formFieldName()},
87 {tag:'span', cls:'fieldLock', id:this.getId('isHidden'), children:[ 85 {tag:'span', cls:'fieldLock', id:this.getId('isHidden'), children:[
88 {tag:'a', href:'#', id:this.getId('showHide'), html:'&nbsp;'} 86 {tag:'a', href:'#', id:this.getId('showHide'), html:'&nbsp;'}
89 ]}, 87 ]},
90 {tag:'input', id:this.getId('input'), cls:'formFieldExampleValue', disabled:true, value:''}, 88 {tag:'input', id:this.getId('input'), cls:'formFieldExampleValue', disabled:true, value:''},
91 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children: 89 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children:
92 MochiKit.Base.flattenArguments( 90 MochiKit.Base.flattenArguments(
93 {tag:'option', value:'---', html:"---"}, 91 {tag:'option', value:'---', html:"---"},
94 MochiKit.Base.map( 92 MochiKit.Base.map(
95 MochiKit.Base.bind(function (aField) { return {tag:'option', value:aField['reference'], html:aField['label']}; }, this), 93 MochiKit.Base.bind(function (aField) { return {tag:'option', value:aField['reference'], html:aField['label']}; }, this),
96 this.fields() 94 this.fields()
97 ) 95 )
98 ) 96 )
99 } 97 }
100 ]}); 98 ]});
101 99
102 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange'); 100 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange');
103 MochiKit.Signal.connect(this.getElement('showHide'), 'onclick', this, 'handleShowHide'); 101 MochiKit.Signal.connect(this.getElement('showHide'), 'onclick', this, 'handleShowHide');
104 102
105 if (! MochiKit.Base.isUndefinedOrNull(this.initiallySelectedFieldKey())) { 103 if (! MochiKit.Base.isUndefinedOrNull(this.initiallySelectedFieldKey())) {
106 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initiallySelectedFieldKey() + ']']); 104 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initiallySelectedFieldKey() + ']']);
107 if (initiallySelectedOptions.length == 1) { 105 if (initiallySelectedOptions.length == 1) {
108 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true}); 106 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true});
109 this.handleSelectChange(); 107 this.handleSelectChange();
110 } 108 }
111 } 109 }
112 }, 110 },
113 111
114 //------------------------------------------------------------------------- 112 //-------------------------------------------------------------------------
115 113
116 'setFieldValue': function (aValue) { 114 'setFieldValue': function (aValue) {
117 this.getElement('input').value = aValue; 115 this.getElement('input').value = aValue;
118 }, 116 },
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js
index 5114b1d..55d2c01 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js
@@ -1,204 +1,201 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent = function(args) { 26Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._tabPanelController = null; 31 this._tabPanelController = null;
34 32
35 this._initiallySelectedTab = args.selected || 'TYPE'; 33 this._initiallySelectedTab = args.selected || 'TYPE';
36 this._tabPanelControllerConfiguration = { 34 this._tabPanelControllerConfiguration = {
37 'LABEL': { 35 'LABEL': {
38 tab:'labelTab', 36 tab:'labelTab',
39 panel:'labelTabpanel' 37 panel:'labelTabpanel'
40 }, 38 },
41 'TYPE': { 39 'TYPE': {
42 tab:'typeTab', 40 tab:'typeTab',
43 panel:'typeTabpanel' 41 panel:'typeTabpanel'
44 }, 42 },
45 'CONFIGURATION': { 43 'CONFIGURATION': {
46 tab:'configurationTab', 44 tab:'configurationTab',
47 panel:'configurationTabpanel' 45 panel:'configurationTabpanel'
48 }, 46 },
49 'BINDINGS': { 47 'BINDINGS': {
50 tab:'bindingsTab', 48 tab:'bindingsTab',
51 panel:'bindingsTabpanel' 49 panel:'bindingsTabpanel'
52 }, 50 },
53 'FAVICON': { 51 'FAVICON': {
54 tab:'faviconTab', 52 tab:'faviconTab',
55 panel:'faviconTabpanel' 53 panel:'faviconTabpanel'
56 }, 54 },
57 'DONE': { 55 'DONE': {
58 tab:'doneTab', 56 tab:'doneTab',
59 panel:'doneTabpanel' 57 panel:'doneTabpanel'
60 } 58 }
61 }; 59 };
62 60
63 this._directLoginReference = null; 61 this._directLoginReference = null;
64 62
65 this._directLoginFavicon = null; 63 this._directLoginFavicon = null;
66 64
67 this._updateFaviconCounter = 0; 65 this._updateFaviconCounter = 0;
68 this._faviconComponent = null; 66 this._faviconComponent = null;
69 67
70 this._bindingComponents= []; 68 this._bindingComponents= [];
71 this._formValueComponents = []; 69 this._formValueComponents = [];
72 70
73 return this; 71 return this;
74} 72}
75 73
76//============================================================================= 74//=============================================================================
77 75
78//Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 76//Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
79Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 77Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
80 78
81 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
82 80
83 'toString': function () { 81 'toString': function () {
84 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent component"; 82 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingComponent component";
85 }, 83 },
86 84
87 //========================================================================= 85 //=========================================================================
88 86
89 'directLoginReference': function () { 87 'directLoginReference': function () {
90 return this._directLoginReference; 88 return this._directLoginReference;
91 }, 89 },
92 90
93 //------------------------------------------------------------------------- 91 //-------------------------------------------------------------------------
94 92
95 'setDirectLoginReference': function (aDirectLoginReference) { 93 'setDirectLoginReference': function (aDirectLoginReference) {
96 this._directLoginReference = aDirectLoginReference; 94 this._directLoginReference = aDirectLoginReference;
97 95
98 return this._directLoginReference; 96 return this._directLoginReference;
99 }, 97 },
100 98
101 //========================================================================= 99 //=========================================================================
102 100
103 'label': function () { 101 'label': function () {
104 return this.getElement('label').value 102 return this.getElement('label').value
105 }, 103 },
106 104
107 'setLabel': function (aValue) { 105 'setLabel': function (aValue) {
108//console.log("##> LABEL: " + aValue);
109 this.getElement('label').value = (aValue ? aValue : ''); 106 this.getElement('label').value = (aValue ? aValue : '');
110 }, 107 },
111 108
112 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
113 110
114 'favicon': function () { 111 'favicon': function () {
115 return this.getElement('faviconURL').value; 112 return this.getElement('faviconURL').value;
116 }, 113 },
117 114
118 'setFavicon': function (aValue) { 115 'setFavicon': function (aValue) {
119 var regexp; 116 var regexp;
120 var displayValue; 117 var displayValue;
121 118
122 regexp = new RegExp('^data\:\/\/.*', 'i'); 119 regexp = new RegExp('^data\:\/\/.*', 'i');
123 if (regexp.test(aValue)) { 120 if (regexp.test(aValue)) {
124 displayValue = '' 121 displayValue = ''
125 } else { 122 } else {
126 displayValue = (aValue ? aValue : ''); 123 displayValue = (aValue ? aValue : '');
127 } 124 }
128 125
129 this.getElement('faviconURL').value = displayValue; 126 this.getElement('faviconURL').value = displayValue;
130 this.faviconComponent().setSrc(aValue); 127 this.faviconComponent().setSrc(aValue);
131 }, 128 },
132 129
133 //'setFaviconData': function (aValue) { 130 //'setFaviconData': function (aValue) {
134 // this.getElement('faviconIcon').src = aValue; 131 // this.getElement('faviconIcon').src = aValue;
135 //}, 132 //},
136 133
137 'directLoginFavicon': function () { 134 'directLoginFavicon': function () {
138 return this._directLoginFavicon; 135 return this._directLoginFavicon;
139 }, 136 },
140 137
141 'setDirectLoginFavicon': function (aValue) { 138 'setDirectLoginFavicon': function (aValue) {
142 this._directLoginFavicon = aValue; 139 this._directLoginFavicon = aValue;
143 this.setFavicon(aValue); 140 this.setFavicon(aValue);
144 }, 141 },
145 142
146 //------------------------------------------------------------------------- 143 //-------------------------------------------------------------------------
147 144
148 'bookmarkletConfiguration': function () { 145 'bookmarkletConfiguration': function () {
149 return this.getElement('bookmarkletConfiguration').value 146 return this.getElement('bookmarkletConfiguration').value
150 }, 147 },
151 148
152 'setBookmarkletConfiguration': function (aValue) { 149 'setBookmarkletConfiguration': function (aValue) {
153 this.getElement('bookmarkletConfiguration').value = aValue; 150 this.getElement('bookmarkletConfiguration').value = aValue;
154 }, 151 },
155 152
156 'highlightConfigurationSyntaxError': function () { 153 'highlightConfigurationSyntaxError': function () {
157 MochiKit.DOM.addElementClass(this.getElement('bookmarkletConfiguration'), 'error'); 154 MochiKit.DOM.addElementClass(this.getElement('bookmarkletConfiguration'), 'error');
158 }, 155 },
159 156
160 'removeHighlightConfigurationSyntaxError': function () { 157 'removeHighlightConfigurationSyntaxError': function () {
161 MochiKit.DOM.removeElementClass(this.getElement('bookmarkletConfiguration'), 'error'); 158 MochiKit.DOM.removeElementClass(this.getElement('bookmarkletConfiguration'), 'error');
162 }, 159 },
163 160
164 //========================================================================= 161 //=========================================================================
165 162
166 'disableAllPanels': function () { 163 'disableAllPanels': function () {
167 this.getElement('label').disabled = true; 164 this.getElement('label').disabled = true;
168 MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled'); 165 MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled');
169 166
170 this.tabPanelController().selectTab(null); 167 this.tabPanelController().selectTab(null);
171 }, 168 },
172 169
173 //------------------------------------------------------------------------- 170 //-------------------------------------------------------------------------
174 171
175 //'disableLabelField': function () { 172 //'disableLabelField': function () {
176 // this.getElement('label').disabled = true; 173 // this.getElement('label').disabled = true;
177 // MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled'); 174 // MochiKit.DOM.addElementClass(this.getElement('label').parentNode, 'disabled');
178 //}, 175 //},
179 176
180 'enableLabelField': function () { 177 'enableLabelField': function () {
181 this.getElement('label').disabled = false; 178 this.getElement('label').disabled = false;
182 MochiKit.DOM.removeElementClass(this.getElement('label').parentNode, 'disabled'); 179 MochiKit.DOM.removeElementClass(this.getElement('label').parentNode, 'disabled');
183 this.tabPanelController().selectTab('LABEL'); 180 this.tabPanelController().selectTab('LABEL');
184 }, 181 },
185 182
186 //------------------------------------------------------------------------- 183 //-------------------------------------------------------------------------
187 184
188 //'disableTypeField': function () { 185 //'disableTypeField': function () {
189 // this.tabPanelController().selectTab(null); 186 // this.tabPanelController().selectTab(null);
190 //}, 187 //},
191 188
192 'enableTypeField': function () { 189 'enableTypeField': function () {
193 this.tabPanelController().selectTab('TYPE'); 190 this.tabPanelController().selectTab('TYPE');
194 }, 191 },
195 192
196 //------------------------------------------------------------------------- 193 //-------------------------------------------------------------------------
197 194
198 //'disableConfigurationField': function () { 195 //'disableConfigurationField': function () {
199 // this.tabPanelController().selectTab(null); 196 // this.tabPanelController().selectTab(null);
200 //}, 197 //},
201 198
202 'enableConfigurationField': function () { 199 'enableConfigurationField': function () {
203 this.tabPanelController().selectTab('CONFIGURATION'); 200 this.tabPanelController().selectTab('CONFIGURATION');
204 }, 201 },
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js
index fa57233..58b5b26 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js
@@ -1,176 +1,169 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent = function(args) { 26Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._formFieldName = args.formFieldName|| Clipperz.Base.exception.raise('MandatoryParameter');
34 this._fieldOptions = args.fieldOptions || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._fieldOptions = args.fieldOptions || Clipperz.Base.exception.raise('MandatoryParameter');
35 this._initialValue = args.initialValue || null; 33 this._initialValue = args.initialValue || null;
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'toString': function () { 44 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent component"; 45 return "Clipperz.PM.UI.Web.Components.DirectLoginEditingFormValueComponent component";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'formFieldName': function () { 50 'formFieldName': function () {
53 return this._formFieldName; 51 return this._formFieldName;
54 }, 52 },
55 53
56 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
57 55
58 'fieldOptions': function () { 56 'fieldOptions': function () {
59 return this._fieldOptions; 57 return this._fieldOptions;
60 }, 58 },
61 59
62 'fieldType': function () { 60 'fieldType': function () {
63 return this.fieldOptions()['type']; 61 return this.fieldOptions()['type'];
64 }, 62 },
65 63
66 'optionValues': function () { 64 'optionValues': function () {
67 return MochiKit.Base.map(function (anOptionValue) { 65 return MochiKit.Base.map(function (anOptionValue) {
68 return { 66 return {
69 'label': anOptionValue['label'] || anOptionValue['value'], 67 'label': anOptionValue['label'] || anOptionValue['value'],
70 'value': anOptionValue['value'] 68 'value': anOptionValue['value']
71 } 69 }
72 }, this.fieldOptions()['options']); 70 }, this.fieldOptions()['options']);
73 }, 71 },
74 72
75 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
76 74
77 'selectedValue': function () { 75 'selectedValue': function () {
78 var result; 76 var result;
79 77
80 result = this.getElement('select').value; 78 result = this.getElement('select').value;
81 79
82 if (result == '---') { 80 if (result == '---') {
83 result = null; 81 result = null;
84 } 82 }
85 83
86 return result; 84 return result;
87 }, 85 },
88 86
89 'initialValue': function () { 87 'initialValue': function () {
90 return this._initialValue; 88 return this._initialValue;
91 }, 89 },
92 90
93 //========================================================================= 91 //=========================================================================
94 92
95 'renderSelf': function() { 93 'renderSelf': function() {
96//console.log(">>> DirectLoginEditingFormValueComponent.renderSelf");
97//console.log("FIELD OPTIONS", this.fieldOptions());
98//console.log("OPTION VALUES", this.optionValues());
99 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'formValue', children:[ 94 this.append(this.element(), {tag:'div', id:this.getId('div'), cls:'formValue', children:[
100 {tag:'span', cls:'formFieldName', html:this.formFieldName()}, 95 {tag:'span', cls:'formFieldName', html:this.formFieldName()},
101 {tag:'div', id:this.getId('values')} 96 {tag:'div', id:this.getId('values')}
102 ]}); 97 ]});
103 98
104 if ((this.fieldType() == 'radio') || (this.fieldType() == 'select')) { 99 if ((this.fieldType() == 'radio') || (this.fieldType() == 'select')) {
105 this.append(this.getElement('values'), 100 this.append(this.getElement('values'),
106 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children: 101 {tag:'select', name:this.formFieldName(), id:this.getId('select'), cls:'formFieldMatchinCardField', children:
107 MochiKit.Base.flattenArguments( 102 MochiKit.Base.flattenArguments(
108 // {tag:'option', value:'---', html:"---"}, 103 // {tag:'option', value:'---', html:"---"},
109 MochiKit.Base.map( 104 MochiKit.Base.map(
110 MochiKit.Base.bind(function (aValue) { return {tag:'option', value:aValue['value'], html:aValue['label']}; }, this), 105 MochiKit.Base.bind(function (aValue) { return {tag:'option', value:aValue['value'], html:aValue['label']}; }, this),
111 this.optionValues() 106 this.optionValues()
112 ) 107 )
113 ) 108 )
114 } 109 }
115 ); 110 );
116 111
117 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange'); 112 MochiKit.Signal.connect(this.getElement('select'), 'onchange', this, 'handleSelectChange');
118 113
119 if (! MochiKit.Base.isUndefinedOrNull(this.initialValue())) { 114 if (! MochiKit.Base.isUndefinedOrNull(this.initialValue())) {
120 var initiallySelectedOptions; 115 var initiallySelectedOptions;
121 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initialValue() + ']']); 116 initiallySelectedOptions = MochiKit.Selector.findChildElements(this.element(), ['option[value=' + this.initialValue() + ']']);
122 if (initiallySelectedOptions.length == 1) { 117 if (initiallySelectedOptions.length == 1) {
123 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true}); 118 MochiKit.DOM.updateNodeAttributes(initiallySelectedOptions[0], {selected:true});
124 this.handleSelectChange(); 119 this.handleSelectChange();
125 } else { 120 } else {
126 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true}); 121 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true});
127 } 122 }
128 } else { 123 } else {
129 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true}); 124 Clipperz.DOM.Helper.insertBefore(this.getElement('select').childNodes[0], {tag:'option', value:'---', html:"", selected:true});
130 } 125 }
131 } else if (this.fieldType() == 'checkbox') { 126 } else if (this.fieldType() == 'checkbox') {
132 this.append(this.getElement('values'), 127 this.append(this.getElement('values'),
133 {tag:'input', type:'checkbox', name:this.formFieldName(), id:this.getId('checkbox'), cls:'formFieldMatchinCardField'} 128 {tag:'input', type:'checkbox', name:this.formFieldName(), id:this.getId('checkbox'), cls:'formFieldMatchinCardField'}
134 ); 129 );
135 130
136 MochiKit.Signal.connect(this.getElement('checkbox'), 'onchange', this, 'handleSelectChange'); 131 MochiKit.Signal.connect(this.getElement('checkbox'), 'onchange', this, 'handleSelectChange');
137 132
138 if (this.initialValue()) { 133 if (this.initialValue()) {
139 MochiKit.DOM.updateNodeAttributes(this.getElement('checkbox'), {checked:true}); 134 MochiKit.DOM.updateNodeAttributes(this.getElement('checkbox'), {checked:true});
140 } 135 }
141 } else { 136 } else {
142 WTF = TODO; 137 WTF = TODO;
143 } 138 }
144//console.log("<<< DirectLoginEditingFormValueComponent.renderSelf");
145 }, 139 },
146 140
147 //========================================================================= 141 //=========================================================================
148 142
149 'handleSelectChange': function (anEvent) { 143 'handleSelectChange': function (anEvent) {
150//console.log("handleSelectChange", anEvent, anEvent.src(), anEvent.src().value);
151 var options; 144 var options;
152 145
153 options = {}; 146 options = {};
154 147
155 options['fieldName'] = this.formFieldName(); 148 options['fieldName'] = this.formFieldName();
156 149
157 if (this.fieldType() == 'checkbox') { 150 if (this.fieldType() == 'checkbox') {
158 options['selectedValue'] = (this.getElement('checkbox').checked ? 1 : null); 151 options['selectedValue'] = (this.getElement('checkbox').checked ? 1 : null);
159 } else { 152 } else {
160 options['selectedValue'] = this.selectedValue(); 153 options['selectedValue'] = this.selectedValue();
161 } 154 }
162 155
163 MochiKit.Signal.signal(this, 'formValueChange', options); 156 MochiKit.Signal.signal(this, 'formValueChange', options);
164 }, 157 },
165 158
166 //========================================================================= 159 //=========================================================================
167 __syntaxFix__: "syntax fix" 160 __syntaxFix__: "syntax fix"
168}); 161});
169 162
170 163
171 164
172 165
173 166
174 167
175 168
176 169
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js
index d8dc941..b4fc24e 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.constructor.call(this, args);
33 31
34 this._enterLeaveCounter = 0; 32 this._enterLeaveCounter = 0;
35 this._selectedRowObject = null; 33 this._selectedRowObject = null;
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
43 41
44 'toString': function () { 42 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager component"; 43 return "Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager component";
46 }, 44 },
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'renderHeader': function(aTRElement) { 48 'renderHeader': function(aTRElement) {
51 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.renderHeader.call(this, aTRElement); 49 Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager.superclass.renderHeader.call(this, aTRElement);
52 50
53 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, {tag:'div', cls:'DirectLoginListPopup', id:this.getId('DirectLoginListPopup'), children:[ 51 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, {tag:'div', cls:'DirectLoginListPopup', id:this.getId('DirectLoginListPopup'), children:[
54 {tag:'div', cls:'DirectLoginListPopup_body', children:[ 52 {tag:'div', cls:'DirectLoginListPopup_body', children:[
55 {tag:'ul', id:this.getId('DirectLoginListPopup_list'), children:[ 53 {tag:'ul', id:this.getId('DirectLoginListPopup_list'), children:[
56 // {tag:'li', children:[ 54 // {tag:'li', children:[
57 // {tag:'img', cls:'favicon', src:'http://www.microsoft.com/favicon.ico'}, 55 // {tag:'img', cls:'favicon', src:'http://www.microsoft.com/favicon.ico'},
58 // {tag:'a', href:'#', html:"Google Mail"} 56 // {tag:'a', href:'#', html:"Google Mail"}
59 // ]}, 57 // ]},
60 // ... 58 // ...
61 ]} 59 ]}
62 ]}, 60 ]},
63 {tag:'div', cls:'DirectLoginListPopup_footer'} 61 {tag:'div', cls:'DirectLoginListPopup_footer'}
64 ]}); 62 ]});
65 63
66 MochiKit.Style.hideElement(this.getId('DirectLoginListPopup')); 64 MochiKit.Style.hideElement(this.getId('DirectLoginListPopup'));
67 65
68 //BEWARE: use MochiKit.Signal.connect instead of this.connectEvent, as the HEADER is NOT redrawn after each refresh 66 //BEWARE: use MochiKit.Signal.connect instead of this.connectEvent, as the HEADER is NOT redrawn after each refresh
69 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseenter', this, 'handleDirectLoginListPopupEnter'); 67 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseenter', this, 'handleDirectLoginListPopupEnter');
70 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseleave', this, 'handleDirectLoginListPopupLeave'); 68 MochiKit.Signal.connect(this.getId('DirectLoginListPopup'), 'onmouseleave', this, 'handleDirectLoginListPopupLeave');
71 }, 69 },
72 70
73 //------------------------------------------------------------------------- 71 //-------------------------------------------------------------------------
74 72
75 'renderCell': function(aRowElement, anObject) { 73 'renderCell': function(aRowElement, anObject) {
76 var i,c; 74 var i,c;
77 var directLoginsInfo; 75 var directLoginsInfo;
78 76
79 directLoginsInfo = anObject[this.name()]; 77 directLoginsInfo = anObject[this.name()];
80 78
81 TDElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:'card_directLogins'}); 79 TDElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:'card_directLogins'});
82 80
83 c = Math.min(2, directLoginsInfo.length); 81 c = Math.min(2, directLoginsInfo.length);
84 for (i=0; i<c; i++) { 82 for (i=0; i<c; i++) {
85 var elementID; 83 var elementID;
86 84
87 elementID = 'directLogin_' + directLoginsInfo[i]['_reference']; 85 elementID = 'directLogin_' + directLoginsInfo[i]['_reference'];
88 86
89 Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin', children:[ 87 Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin', children:[
90 {tag:'div', cls:'card_directLogin_body', children:[ 88 {tag:'div', cls:'card_directLogin_body', children:[
91 {tag:'a', href:'#', id:elementID, html:directLoginsInfo[i]['label']} 89 {tag:'a', href:'#', id:elementID, html:directLoginsInfo[i]['label']}
92 ]} 90 ]}
93 ]}); 91 ]});
94 // MochiKit.Signal.connect(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject'])); 92 // MochiKit.Signal.connect(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
95 this.connectEvent(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject'])); 93 this.connectEvent(elementID, 'onclick', MochiKit.Base.method(this, 'handleDirectLoginClick', directLoginsInfo[i]['_rowObject']));
96 } 94 }
97 95
98 if (directLoginsInfo.length > 2) { 96 if (directLoginsInfo.length > 2) {
99 var ellipsesElement; 97 var ellipsesElement;
100 98
101 ellipsesElement = Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin_ellipses', children:[ 99 ellipsesElement = Clipperz.DOM.Helper.append(TDElement, {tag:'div', cls:'card_directLogin_ellipses', children:[
102 {tag:'div', cls:'card_directLogin_ellipses_body', children:[ 100 {tag:'div', cls:'card_directLogin_ellipses_body', children:[
103 {tag:'span', html:'&hellip;'} 101 {tag:'span', html:'&hellip;'}
104 ]} 102 ]}
105 ]}); 103 ]});
106 104
107 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseenter', MochiKit.Base.method(this, 'handleEllipsesEnter', anObject)); 105 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseenter', MochiKit.Base.method(this, 'handleEllipsesEnter', anObject));
108 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseleave', MochiKit.Base.method(this, 'handleEllipsesLeave')); 106 /// MochiKit.Signal.connect(ellipsesElement, 'onmouseleave', MochiKit.Base.method(this, 'handleEllipsesLeave'));
109 // MochiKit.Signal.connect(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave')); 107 // MochiKit.Signal.connect(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave'));
110 this.connectEvent(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave')); 108 this.connectEvent(TDElement, 'onmouseleave', MochiKit.Base.method(this, 'handleTDLeave'));
111 } 109 }
112 // MochiKit.Signal.connect(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject)); 110 // MochiKit.Signal.connect(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject));
113 this.connectEvent(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject)); 111 this.connectEvent(TDElement, 'onmouseenter', MochiKit.Base.method(this, 'handleTDEnter', anObject));
114 112
115 }, 113 },
116 114
117 //========================================================================= 115 //=========================================================================
118/* 116/*
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js
index 6297002..bdb044a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js
@@ -1,86 +1,84 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.FaviconColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.FaviconColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.FaviconColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.FaviconColumnManager.superclass.constructor.call(this, args);
33 31
34 return this; 32 return this;
35} 33}
36 34
37//============================================================================= 35//=============================================================================
38 36
39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.FaviconColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 37Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.FaviconColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
40 38
41 'toString': function () { 39 'toString': function () {
42 return "Clipperz.PM.UI.Web.Components.FaviconColumnManager component"; 40 return "Clipperz.PM.UI.Web.Components.FaviconColumnManager component";
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'renderCell': function(aRowElement, anObject) { 45 'renderCell': function(aRowElement, anObject) {
48 varfaviconImageElement; 46 varfaviconImageElement;
49 var faviconUrl; 47 var faviconUrl;
50 48
51 faviconImageElement = this.getId('favicon'); 49 faviconImageElement = this.getId('favicon');
52 faviconUrl = anObject[this.name()]; 50 faviconUrl = anObject[this.name()];
53 51
54 if (faviconUrl == null) { 52 if (faviconUrl == null) {
55 faviconUrl = Clipperz.PM.Strings.getValue('defaultFaviconUrl'); 53 faviconUrl = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
56 } 54 }
57 55
58 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 56 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
59 {tag:'img', id:faviconImageElement, src:faviconUrl} 57 {tag:'img', id:faviconImageElement, src:faviconUrl}
60 ]}); 58 ]});
61 59
62 MochiKit.Signal.connect(faviconImageElement, 'onload', this, 'handleLoadedFaviconImage'); 60 MochiKit.Signal.connect(faviconImageElement, 'onload', this, 'handleLoadedFaviconImage');
63 MochiKit.Signal.connect(faviconImageElement, 'onerror', this, 'handleMissingFaviconImage'); 61 MochiKit.Signal.connect(faviconImageElement, 'onerror', this, 'handleMissingFaviconImage');
64 MochiKit.Signal.connect(faviconImageElement, 'onabort', this, 'handleMissingFaviconImage'); 62 MochiKit.Signal.connect(faviconImageElement, 'onabort', this, 'handleMissingFaviconImage');
65 }, 63 },
66 64
67 //----------------------------------------------------- 65 //-----------------------------------------------------
68 66
69 'handleLoadedFaviconImage': function(anEvent) { 67 'handleLoadedFaviconImage': function(anEvent) {
70 MochiKit.Signal.disconnectAllTo(anEvent.src()); 68 MochiKit.Signal.disconnectAllTo(anEvent.src());
71 if (anEvent.src().complete == false) { 69 if (anEvent.src().complete == false) {
72 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl'); 70 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
73 } 71 }
74 }, 72 },
75 73
76 //----------------------------------------------------- 74 //-----------------------------------------------------
77 75
78 'handleMissingFaviconImage': function(anEvent) { 76 'handleMissingFaviconImage': function(anEvent) {
79 MochiKit.Signal.disconnectAllTo(anEvent.src()); 77 MochiKit.Signal.disconnectAllTo(anEvent.src());
80 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl'); 78 anEvent.src().src = Clipperz.PM.Strings.getValue('defaultFaviconUrl');
81 }, 79 },
82 80
83 //----------------------------------------------------- 81 //-----------------------------------------------------
84 '__syntax_fix__' : 'syntax fix' 82 '__syntax_fix__' : 'syntax fix'
85}); 83});
86 84
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js
index 51d55f4..21dddc9 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js
@@ -1,230 +1,226 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.GridComponent = function(args) { 26Clipperz.PM.UI.Web.Components.GridComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.GridComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.GridComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._columnsManagers = args.columnsManagers; 31 this._columnsManagers = args.columnsManagers;
34 32
35 this._rowsObjects = []; 33 this._rowsObjects = [];
36 this._noRowsGridComponent = null; 34 this._noRowsGridComponent = null;
37 35
38 this._slots = { 36 this._slots = {
39 'headerSlot':this.getId('headerSlot') 37 'headerSlot':this.getId('headerSlot')
40 }; 38 };
41 39
42 return this; 40 return this;
43} 41}
44 42
45//============================================================================= 43//=============================================================================
46 44
47Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.GridComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 45Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.GridComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
48 46
49 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
50 48
51 'toString': function () { 49 'toString': function () {
52 return "Clipperz.PM.UI.Web.Components.GridComponent component"; 50 return "Clipperz.PM.UI.Web.Components.GridComponent component";
53 }, 51 },
54 52
55 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
56 54
57 'rows': function () { 55 'rows': function () {
58 throw Clipperz.Base.exception.AbstractMethod; 56 throw Clipperz.Base.exception.AbstractMethod;
59 // return this._rows; 57 // return this._rows;
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'columnsManagers': function () { 62 'columnsManagers': function () {
65 return this._columnsManagers; 63 return this._columnsManagers;
66 }, 64 },
67 65
68 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
69 67
70 'renderSelf': function(/*aContainer, aPosition*/) { 68 'renderSelf': function(/*aContainer, aPosition*/) {
71 this.append(this.element(), [ 69 this.append(this.element(), [
72 {tag:'div', cls:'header', children:[ 70 {tag:'div', cls:'header', children:[
73 {tag:'form', id:this.getId('searchForm'), cls:'search', children:[ 71 {tag:'form', id:this.getId('searchForm'), cls:'search', children:[
74 {tag:'div', cls:'search', children:[ 72 {tag:'div', cls:'search', children:[
75 {tag:'input', type:'text', id:this.getId('search'), cls:'search', placeholder:"search", name:'textToSearch'/*, value:"clipperz"*/} 73 {tag:'input', type:'text', id:this.getId('search'), cls:'search', placeholder:"search", name:'textToSearch'/*, value:"clipperz"*/}
76 ]}, 74 ]},
77 {tag:'div', cls:'clearSearchButton', id:this.getId('clearSearch')}, 75 {tag:'div', cls:'clearSearchButton', id:this.getId('clearSearch')},
78 // {tag:'input', type:'button', cls:'searchButton', name:'searchButton', value:"search"}, 76 // {tag:'input', type:'button', cls:'searchButton', name:'searchButton', value:"search"},
79 {tag:'div', cls:'headerSlot', id:this.getId('headerSlot')} 77 {tag:'div', cls:'headerSlot', id:this.getId('headerSlot')}
80 ]} 78 ]}
81 ]}, 79 ]},
82 {tag:'div', cls:'body', children:[ 80 {tag:'div', cls:'body', children:[
83 {tag:'div', cls:'rows', id:this.getId('rows'), children:[ 81 {tag:'div', cls:'rows', id:this.getId('rows'), children:[
84 {tag:'table', cellpadding:'0', cellspacing:'0', cls:'rows', children:[ 82 {tag:'table', cellpadding:'0', cellspacing:'0', cls:'rows', children:[
85 {tag:'thead', children:[ 83 {tag:'thead', children:[
86 {tag:'tr', id:this.getId('thead_tr'), children:[]} 84 {tag:'tr', id:this.getId('thead_tr'), children:[]}
87 ]}, 85 ]},
88 {tag:'tbody', id:this.getId('gridRows'), children:[]} 86 {tag:'tbody', id:this.getId('gridRows'), children:[]}
89 ]} 87 ]}
90 ]}, 88 ]},
91 {tag:'div', cls:'noRowsBlock', id:this.getId('noRowsBlock'), children:[]} 89 {tag:'div', cls:'noRowsBlock', id:this.getId('noRowsBlock'), children:[]}
92 ]}, 90 ]},
93 {tag:'div', cls:'footer'} 91 {tag:'div', cls:'footer'}
94 ]); 92 ]);
95 93
96 this.renderHeader(); 94 this.renderHeader();
97 MochiKit.Signal.connect(this.getId('clearSearch'), 'onclick', this, 'clearSearchHandler'); 95 MochiKit.Signal.connect(this.getId('clearSearch'), 'onclick', this, 'clearSearchHandler');
98 }, 96 },
99 97
100 //------------------------------------------------------------------------- 98 //-------------------------------------------------------------------------
101 99
102 'renderHeader': function () { 100 'renderHeader': function () {
103 var headerElement; 101 var headerElement;
104 102
105 headerElement = this.getElement('thead_tr'); 103 headerElement = this.getElement('thead_tr');
106 headerElement.innerHTML = ""; 104 headerElement.innerHTML = "";
107 105
108 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) { 106 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
109 aColumnManager.renderHeader(headerElement); 107 aColumnManager.renderHeader(headerElement);
110 }); 108 });
111 }, 109 },
112 110
113 //------------------------------------------------------------------------- 111 //-------------------------------------------------------------------------
114 112
115 'update': function (someObjects) { 113 'update': function (someObjects) {
116 this._rowsObjects = someObjects 114 this._rowsObjects = someObjects
117 this.refresh(); 115 this.refresh();
118 this.focus(); 116 this.focus();
119 }, 117 },
120 118
121 'focus': function () { 119 'focus': function () {
122 this.getElement('search').focus(); 120 this.getElement('search').focus();
123 }, 121 },
124 122
125 //------------------------------------------------------------------------- 123 //-------------------------------------------------------------------------
126 124
127 'startSearch': function () { 125 'startSearch': function () {
128//console.log("--> startSearch");
129 MochiKit.DOM.addElementClass(this.getElement('search'), 'running'); 126 MochiKit.DOM.addElementClass(this.getElement('search'), 'running');
130 }, 127 },
131 128
132 'endSearch': function () { 129 'endSearch': function () {
133 MochiKit.DOM.removeElementClass(this.getElement('search'), 'running'); 130 MochiKit.DOM.removeElementClass(this.getElement('search'), 'running');
134//console.log("<-- startSearch");
135 }, 131 },
136 132
137 //------------------------------------------------------------------------- 133 //-------------------------------------------------------------------------
138 134
139 'disconnectColumnManagersRowsSignals': function () { 135 'disconnectColumnManagersRowsSignals': function () {
140 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) { 136 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
141 aColumnManager.disconnectRowsSignals(); 137 aColumnManager.disconnectRowsSignals();
142 }); 138 });
143 }, 139 },
144 140
145 //------------------------------------------------------------------------- 141 //-------------------------------------------------------------------------
146 142
147 'refresh': function () { 143 'refresh': function () {
148 var gridRowsElement; 144 var gridRowsElement;
149 var rowClass; 145 var rowClass;
150 146
151 this.disconnectColumnManagersRowsSignals(); 147 this.disconnectColumnManagersRowsSignals();
152 148
153 { 149 {
154 MochiKit.DOM.removeElementClass(this.getElement('search'), 'disabled'); 150 MochiKit.DOM.removeElementClass(this.getElement('search'), 'disabled');
155 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', null); 151 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', null);
156 MochiKit.DOM.removeElementClass(this.element(), 'empty'); 152 MochiKit.DOM.removeElementClass(this.element(), 'empty');
157 MochiKit.DOM.removeElementClass(this.element(), 'noRows'); 153 MochiKit.DOM.removeElementClass(this.element(), 'noRows');
158 } 154 }
159 155
160 156
161 gridRowsElement = this.getElement('gridRows'); 157 gridRowsElement = this.getElement('gridRows');
162 gridRowsElement.innerHTML = ""; 158 gridRowsElement.innerHTML = "";
163 159
164 MochiKit.DOM.removeElementClass(this.element(), 'empty'); 160 MochiKit.DOM.removeElementClass(this.element(), 'empty');
165 161
166 rowClass = 'odd'; 162 rowClass = 'odd';
167 MochiKit.Iter.forEach(this._rowsObjects, MochiKit.Base.bind(function (aRowObject) { 163 MochiKit.Iter.forEach(this._rowsObjects, MochiKit.Base.bind(function (aRowObject) {
168 var cardRowElement; 164 var cardRowElement;
169 165
170 cardRowElement = this.append(gridRowsElement, {tag:'tr', id:this.getId(aRowObject['_reference']), cls:rowClass}); 166 cardRowElement = this.append(gridRowsElement, {tag:'tr', id:this.getId(aRowObject['_reference']), cls:rowClass});
171 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) { 167 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
172 aColumnManager.renderCell(cardRowElement, aRowObject); 168 aColumnManager.renderCell(cardRowElement, aRowObject);
173 }); 169 });
174 170
175 rowClass = (rowClass == 'odd') ? 'even' : 'odd'; 171 rowClass = (rowClass == 'odd') ? 'even' : 'odd';
176 }, this)); 172 }, this));
177 }, 173 },
178 174
179 //----------------------------------------------------------------------------- 175 //-----------------------------------------------------------------------------
180 176
181 'filterElement': function () { 177 'filterElement': function () {
182 return this.getElement('search'); 178 return this.getElement('search');
183 }, 179 },
184 180
185 //------------------------------------------------------------------------- 181 //-------------------------------------------------------------------------
186 182
187 'shouldShowElementWhileRendering': function () { 183 'shouldShowElementWhileRendering': function () {
188 return false; 184 return false;
189 }, 185 },
190 186
191 //------------------------------------------------------------------------- 187 //-------------------------------------------------------------------------
192 188
193 'selectRow': function (aRowObject) { 189 'selectRow': function (aRowObject) {
194 MochiKit.DOM.addElementClass(this.getId(aRowObject['_reference']), 'selected'); 190 MochiKit.DOM.addElementClass(this.getId(aRowObject['_reference']), 'selected');
195 }, 191 },
196 192
197 'unselectRow': function (aRowObject) { 193 'unselectRow': function (aRowObject) {
198 MochiKit.DOM.removeElementClass(this.getId(aRowObject['_reference']), 'selected'); 194 MochiKit.DOM.removeElementClass(this.getId(aRowObject['_reference']), 'selected');
199 }, 195 },
200 196
201 //------------------------------------------------------------------------- 197 //-------------------------------------------------------------------------
202 /* 198 /*
203 'passOpenDirectLogin': function(aDirectLoginReferenceId) { 199 'passOpenDirectLogin': function(aDirectLoginReferenceId) {
204 MochiKit.Signal.signal(this, 'openDirectLogin', aDirectLoginReferenceId); 200 MochiKit.Signal.signal(this, 'openDirectLogin', aDirectLoginReferenceId);
205 }, 201 },
206 */ 202 */
207 //------------------------------------------------------------------------- 203 //-------------------------------------------------------------------------
208 204
209 'clearSearchHandler': function (anEvent) { 205 'clearSearchHandler': function (anEvent) {
210 var searchElement; 206 var searchElement;
211 207
212 anEvent.preventDefault(); 208 anEvent.preventDefault();
213 209
214 searchElement = this.getElement('search'); 210 searchElement = this.getElement('search');
215 searchElement.value = ""; 211 searchElement.value = "";
216 searchElement.focus(); 212 searchElement.focus();
217 }, 213 },
218 214
219 //------------------------------------------------------------------------- 215 //-------------------------------------------------------------------------
220 216
221 'drawEmpty': function () { 217 'drawEmpty': function () {
222 this.disconnectColumnManagersRowsSignals(); 218 this.disconnectColumnManagersRowsSignals();
223 MochiKit.DOM.addElementClass(this.getElement('search'), 'disabled'); 219 MochiKit.DOM.addElementClass(this.getElement('search'), 'disabled');
224 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', 'disabled'); 220 // MochiKit.DOM.setNodeAttribute(this.getElement('search'), 'disabled', 'disabled');
225 221
226 gridRowsElement = this.getElement('gridRows'); 222 gridRowsElement = this.getElement('gridRows');
227 gridRowsElement.innerHTML = ""; 223 gridRowsElement.innerHTML = "";
228 MochiKit.DOM.addElementClass(this.element(), 'empty'); 224 MochiKit.DOM.addElementClass(this.element(), 'empty');
229 }, 225 },
230 226
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js
index 3e03fcf..d1d9d7f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js
@@ -1,65 +1,63 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.ImageColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.ImageColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.ImageColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.ImageColumnManager.superclass.constructor.call(this, args);
33 31
34 return this; 32 return this;
35} 33}
36 34
37//============================================================================= 35//=============================================================================
38 36
39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ImageColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 37Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ImageColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
40 38
41 'toString': function () { 39 'toString': function () {
42 return "Clipperz.PM.UI.Web.Components.ImageColumnManager component"; 40 return "Clipperz.PM.UI.Web.Components.ImageColumnManager component";
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'renderCell': function(aRowElement, anObject) { 45 'renderCell': function(aRowElement, anObject) {
48 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 46 Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
49 {tag:'img', src:anObject[this.name()]} 47 {tag:'img', src:anObject[this.name()]}
50 ]}); 48 ]});
51 49
52 // return Clipperz.Async.callbacks("ImageColumnManager.renderCell", [ 50 // return Clipperz.Async.callbacks("ImageColumnManager.renderCell", [
53 // this.selector(), 51 // this.selector(),
54 // MochiKit.Base.bind(function (aValue) { 52 // MochiKit.Base.bind(function (aValue) {
55 // Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 53 // Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
56 // {tag:'img', src:aValue} 54 // {tag:'img', src:aValue}
57 // ]}); 55 // ]});
58 // }, this) 56 // }, this)
59 // ], {trace:false}, anObject); 57 // ], {trace:false}, anObject);
60 }, 58 },
61 59
62 //----------------------------------------------------- 60 //-----------------------------------------------------
63 '__syntax_fix__' : 'syntax fix' 61 '__syntax_fix__' : 'syntax fix'
64}); 62});
65 63
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js
index f3f9cd5..69f735b 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js
@@ -1,89 +1,87 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.LinkColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.LinkColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.LinkColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.LinkColumnManager.superclass.constructor.call(this, args);
33 31
34 this._actionMethod = args.actionMethod || null; 32 this._actionMethod = args.actionMethod || null;
35 33
36 return this; 34 return this;
37} 35}
38 36
39//============================================================================= 37//=============================================================================
40 38
41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LinkColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LinkColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
42 40
43 'toString': function () { 41 'toString': function () {
44 return "Clipperz.PM.UI.Web.Components.DateColumnManager component"; 42 return "Clipperz.PM.UI.Web.Components.DateColumnManager component";
45 }, 43 },
46 44
47 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
48 46
49 'actionMethod': function () { 47 'actionMethod': function () {
50 return this._actionMethod; 48 return this._actionMethod;
51 }, 49 },
52 50
53 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
54 52
55 'renderCell': function(aRowElement, anObject) { 53 'renderCell': function(aRowElement, anObject) {
56 vartdElement; 54 vartdElement;
57 varlinkElement; 55 varlinkElement;
58 56
59 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[ 57 tdElement = Clipperz.DOM.Helper.append(aRowElement, {tag:'td', cls:this.cssClass(), children:[
60 {tag:'span', children:[ 58 {tag:'span', children:[
61 {tag:'a', href:'#', html:anObject[this.name()]} 59 {tag:'a', href:'#', html:anObject[this.name()]}
62 ]} 60 ]}
63 ]}); 61 ]});
64 62
65 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement); 63 linkElement = MochiKit.DOM.getFirstElementByTagAndClassName('a', null, tdElement);
66 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 64 // MochiKit.Signal.connect(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
67 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject'])); 65 this.connectEvent(linkElement, 'onclick', MochiKit.Base.method(this, 'handleLinkClick', anObject['_rowObject']));
68 }, 66 },
69 67
70 //----------------------------------------------------- 68 //-----------------------------------------------------
71 69
72 'handleLinkClick': function (anObject, anEvent) { 70 'handleLinkClick': function (anObject, anEvent) {
73 anEvent.preventDefault(); 71 anEvent.preventDefault();
74 72
75 if (this.actionMethod() != null) { 73 if (this.actionMethod() != null) {
76 var deferredResult; 74 var deferredResult;
77 75
78 deferredResult = new Clipperz.Async.Deferred("LinkColumnManager.handleLinkClick", {trace:false}); 76 deferredResult = new Clipperz.Async.Deferred("LinkColumnManager.handleLinkClick", {trace:false});
79 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'selectRow', anObject); 77 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'selectRow', anObject);
80 deferredResult.addCallback(this.actionMethod(), anObject, anEvent); 78 deferredResult.addCallback(this.actionMethod(), anObject, anEvent);
81 // deferredResult.addBothPass(MochiKit.Signal.signal, this, 'unselectRow', anObject); 79 // deferredResult.addBothPass(MochiKit.Signal.signal, this, 'unselectRow', anObject);
82 deferredResult.callback(); 80 deferredResult.callback();
83 } 81 }
84 }, 82 },
85 83
86 //----------------------------------------------------- 84 //-----------------------------------------------------
87 '__syntax_fix__' : 'syntax fix' 85 '__syntax_fix__' : 'syntax fix'
88}); 86});
89 87
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
index a10ba4f..38a9421 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.LoginForm = function(args) { 26Clipperz.PM.UI.Web.Components.LoginForm = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 this._autocomplete = args.autocomplete || 'off'; 29 this._autocomplete = args.autocomplete || 'off';
32 30
33 Clipperz.PM.UI.Web.Components.LoginForm.superclass.constructor.apply(this, arguments); 31 Clipperz.PM.UI.Web.Components.LoginForm.superclass.constructor.apply(this, arguments);
34 32
35 this._slots = { 33 this._slots = {
36 'passphraseEntropy':this.getId('passphraseEntropy') 34 'passphraseEntropy':this.getId('passphraseEntropy')
37 }; 35 };
38 36
39 return this; 37 return this;
40} 38}
41 39
42//============================================================================= 40//=============================================================================
43 41
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginForm, Clipperz.PM.UI.Common.Components.BaseComponent, {
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'toString': function () { 46 'toString': function () {
49 return "Clipperz.PM.UI.Web.Components.LoginForm component"; 47 return "Clipperz.PM.UI.Web.Components.LoginForm component";
50 }, 48 },
51 49
52 'autocomplete': function () { 50 'autocomplete': function () {
53 return this._autocomplete; 51 return this._autocomplete;
54 }, 52 },
55 53
56 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
57 55
58 'renderSelf': function() { 56 'renderSelf': function() {
59 this.append(this.element(), {tag:'div', id:'loginBox', children:[ 57 this.append(this.element(), {tag:'div', id:'loginBox', children:[
60 {tag:'div', cls:'header'}, 58 {tag:'div', cls:'header'},
61 {tag:'div', cls:'body', id:this.getId('body'), children:[ 59 {tag:'div', cls:'body', id:this.getId('body'), children:[
62 {tag:'div', id:this.getId('loginForm'), children:[ 60 {tag:'div', id:this.getId('loginForm'), children:[
63 {tag:'div', children:[ 61 {tag:'div', children:[
64 {tag:'h4', html:'Login'}, 62 {tag:'h4', html:'Login'},
65 // {tag:'form', cls:'loginForm', autocomplete:this.autocomplete(), children:[ 63 // {tag:'form', cls:'loginForm', autocomplete:this.autocomplete(), children:[
66 {tag:'form', id:this.getId('form'), cls:'loginForm', children:[ 64 {tag:'form', id:this.getId('form'), cls:'loginForm', children:[
67 {tag:'label', html:'username', 'for':this.getId('usernameField')}, 65 {tag:'label', html:'username', 'for':this.getId('usernameField')},
68 {tag:'input', id:this.getId('usernameField'), type:'text', cls:'username'}, 66 {tag:'input', id:this.getId('usernameField'), type:'text', cls:'username'},
69 {tag:'label', html:'passphrase / OTP', 'for':this.getId('passphraseField')}, 67 {tag:'label', html:'passphrase / OTP', 'for':this.getId('passphraseField')},
70 {tag:'input', id:this.getId('passphraseField'), type:'password', cls:'password'}, 68 {tag:'input', id:this.getId('passphraseField'), type:'password', cls:'password'},
71 69
72 {tag:'div', cls:'translations', children:[ 70 {tag:'div', cls:'translations', children:[
73 {tag:'h4', html:'choose your language'}, 71 {tag:'h4', html:'choose your language'},
74 {tag:'ul', children:[ 72 {tag:'ul', children:[
75 {tag:'li', cls:'selected', html:'english'}, 73 {tag:'li', cls:'selected', html:'english'},
76 {tag:'li', html:'italiano'}, 74 {tag:'li', html:'italiano'},
77 {tag:'li', html:'dutch'}, 75 {tag:'li', html:'dutch'},
78 {tag:'li', html:'french'}, 76 {tag:'li', html:'french'},
79 {tag:'li', html:'spanish'}, 77 {tag:'li', html:'spanish'},
80 {tag:'li', html:'chinese'}, 78 {tag:'li', html:'chinese'},
81 {tag:'li', html:'japanese'}, 79 {tag:'li', html:'japanese'},
82 {tag:'li', html:'portugal'}, 80 {tag:'li', html:'portugal'},
83 {tag:'li', html:'arabic'} 81 {tag:'li', html:'arabic'}
84 ]} 82 ]}
85 ]}, 83 ]},
86 84
87 {tag:'input', id:this.getId('submitButton'), type:'submit', value:'login', cls:'submit'} 85 {tag:'input', id:this.getId('submitButton'), type:'submit', value:'login', cls:'submit'}
88 ]} 86 ]}
89 ]} 87 ]}
90 ]} 88 ]}
91 ]}, 89 ]},
92 {tag:'div', cls:'footer'} 90 {tag:'div', cls:'footer'}
93 ]}); 91 ]});
94 92
95 if (this.autocomplete() == 'off') { 93 if (this.autocomplete() == 'off') {
96 MochiKit.DOM.updateNodeAttributes(this.getElement('form'), {autocomplete:'off'}); 94 MochiKit.DOM.updateNodeAttributes(this.getElement('form'), {autocomplete:'off'});
97 } 95 }
98 96
99 // Clipperz.Style.setBackgroundGradient(this.getElement('body'), {from:"#ff9955", to:"#ff6622"}) 97 // Clipperz.Style.setBackgroundGradient(this.getElement('body'), {from:"#ff9955", to:"#ff6622"})
100 98
101 // this.setEntropyDisplay(new Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay(this.getElement('passphraseField'))); 99 // this.setEntropyDisplay(new Clipperz.PM.UI.Common.Components.PasswordEntropyDisplay(this.getElement('passphraseField')));
102 100
103 // MochiKit.Signal.connect(this.getId('otpCheckbox'), 'onclick', this, 'togglePasswordFields'); 101 // MochiKit.Signal.connect(this.getId('otpCheckbox'), 'onclick', this, 'togglePasswordFields');
104 // this.showPassphraseField(); 102 // this.showPassphraseField();
105 103
106 this.getElement('usernameField').focus(); 104 this.getElement('usernameField').focus();
107 105
108 MochiKit.Signal.connect(this.getElement('loginForm'), 'onsubmit', this, 'loginEventHandler'); 106 MochiKit.Signal.connect(this.getElement('loginForm'), 'onsubmit', this, 'loginEventHandler');
109 }, 107 },
110 108
111 //----------------------------------------------------------------------------- 109 //-----------------------------------------------------------------------------
112/* 110/*
113 'togglePasswordFields': function(anEvent) { 111 'togglePasswordFields': function(anEvent) {
114 var shouldUseOTP; 112 var shouldUseOTP;
115 113
116 shouldUseOTP = this.getElement('otpCheckbox').checked; 114 shouldUseOTP = this.getElement('otpCheckbox').checked;
117 115
118 if (shouldUseOTP == false) { 116 if (shouldUseOTP == false) {
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js
index 2894af8..3498e3f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.LoginPage = function(args) { 26Clipperz.PM.UI.Web.Components.LoginPage = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.LoginPage.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.LoginPage.superclass.constructor.apply(this, arguments);
32 30
33 this._slots = { 31 this._slots = {
34 'loginForm':this.getId('loginBoxSlot') 32 'loginForm':this.getId('loginBoxSlot')
35 }; 33 };
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginPage, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginPage, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'toString': function () { 44 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.LoginPage component"; 45 return "Clipperz.PM.UI.Web.Components.LoginPage component";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'renderSelf': function(/*aContainer, aPosition*/) { 50 'renderSelf': function(/*aContainer, aPosition*/) {
53 this.append(this.element(), [ 51 this.append(this.element(), [
54 {tag:'div', id:this.getId('loginBoxSlot')}, 52 {tag:'div', id:this.getId('loginBoxSlot')},
55 {tag:'div', id:'main', children:[ 53 {tag:'div', id:'main', children:[
56 {tag:'div', id:'featurePoints', children:[ 54 {tag:'div', id:'featurePoints', children:[
57 {tag:'table', children:[ 55 {tag:'table', children:[
58 {tag:'tr', children:[ 56 {tag:'tr', children:[
59 {tag:'td', children:[ 57 {tag:'td', children:[
60 {tag:'div', cls:'block', children:[ 58 {tag:'div', cls:'block', children:[
61 {tag:'h3', html:'Clipperz is:'}, 59 {tag:'h3', html:'Clipperz is:'},
62 {tag:'ul', children:[ 60 {tag:'ul', children:[
63 {tag:'li', html:'a secure and simple password manager'}, 61 {tag:'li', html:'a secure and simple password manager'},
64 {tag:'li', html:'an effective single sign-on solution'}, 62 {tag:'li', html:'an effective single sign-on solution'},
65 {tag:'li', html:'a digital vault for your personal data'} 63 {tag:'li', html:'a digital vault for your personal data'}
66 ]} 64 ]}
67 ]}, 65 ]},
68 {tag:'div', cls:'block', children:[ 66 {tag:'div', cls:'block', children:[
69 {tag:'h3', html:'Clipperz benefits:'}, 67 {tag:'h3', html:'Clipperz benefits:'},
70 {tag:'ul', children:[ 68 {tag:'ul', children:[
71 {tag:'li', html:'free and completely anonymous'}, 69 {tag:'li', html:'free and completely anonymous'},
72 {tag:'li', html:'access it any time from any computer'}, 70 {tag:'li', html:'access it any time from any computer'},
73 {tag:'li', html:'no software to download and nothing to install'}, 71 {tag:'li', html:'no software to download and nothing to install'},
74 {tag:'li', html:'avoid keeping secrets on your PC or on paper'} 72 {tag:'li', html:'avoid keeping secrets on your PC or on paper'}
75 ]} 73 ]}
76 ]} 74 ]}
77 ]}, {tag:'td', children:[ 75 ]}, {tag:'td', children:[
78 {tag:'div', cls:'block', children:[ 76 {tag:'div', cls:'block', children:[
79 {tag:'h3', html:'Clipperz security:'}, 77 {tag:'h3', html:'Clipperz security:'},
80 {tag:'ul', children:[ 78 {tag:'ul', children:[
81 {tag:'li', html:'your secretes are locally encrypted by your browser before being uploaded to Clipperz'}, 79 {tag:'li', html:'your secretes are locally encrypted by your browser before being uploaded to Clipperz'},
82 {tag:'li', html:'the encryption key is a passphrase known only to you'}, 80 {tag:'li', html:'the encryption key is a passphrase known only to you'},
83 {tag:'li', html:'Clipperz hosts your sensitive data in an encrypted form and could never access the data in its plain form'}, 81 {tag:'li', html:'Clipperz hosts your sensitive data in an encrypted form and could never access the data in its plain form'},
84 {tag:'li', html:'Clipperz is built upon standard encryption schemes, nothing fancies of homemade'}, 82 {tag:'li', html:'Clipperz is built upon standard encryption schemes, nothing fancies of homemade'},
85 {tag:'li', html:'you can review the source code anytime you like, but you need to know nothing about cryptography to be an happy user!'} 83 {tag:'li', html:'you can review the source code anytime you like, but you need to know nothing about cryptography to be an happy user!'}
86 ]} 84 ]}
87 ]} 85 ]}
88 ]} 86 ]}
89 ]} 87 ]}
90 ]} 88 ]}
91 ]}, 89 ]},
92 {tag:'div', cls:'activeFeatures', children:[ 90 {tag:'div', cls:'activeFeatures', children:[
93 {tag:'div', id:this.getId('registerButton'), cls:'createAccountLink', children:[ 91 {tag:'div', id:this.getId('registerButton'), cls:'createAccountLink', children:[
94 {tag:'canvas', id:this.getId('registerButtonIcon')}, 92 {tag:'canvas', id:this.getId('registerButtonIcon')},
95 {tag:'a', href:'#', id:this.getId('createAccountLink'), cls:'createAccountLink', children:[ 93 {tag:'a', href:'#', id:this.getId('createAccountLink'), cls:'createAccountLink', children:[
96 {tag:'span', cls:'payoff', html:"Free sign up!"}, 94 {tag:'span', cls:'payoff', html:"Free sign up!"},
97 {tag:'span', cls:'link', html:"Create account >>"} 95 {tag:'span', cls:'link', html:"Create account >>"}
98 ]} 96 ]}
99 ]}, 97 ]},
100 {tag:'div', cls:'keepTogether', children:[ 98 {tag:'div', cls:'keepTogether', children:[
101 {tag:'div', id:this.getId('screenshotLink'), cls:'screenshotLink', children:[ 99 {tag:'div', id:this.getId('screenshotLink'), cls:'screenshotLink', children:[
102 {tag:'canvas', id:this.getId('lookIcon')}, 100 {tag:'canvas', id:this.getId('lookIcon')},
103 {tag:'a', href:'#', cls:'screenshotLink', children:[ 101 {tag:'a', href:'#', cls:'screenshotLink', children:[
104 {tag:'span', cls:'payoff', html:"Look Clipperz!"}, 102 {tag:'span', cls:'payoff', html:"Look Clipperz!"},
105 {tag:'span', cls:'link', html:"screenshot tour >>"} 103 {tag:'span', cls:'link', html:"screenshot tour >>"}
106 ]} 104 ]}
107 ]}, 105 ]},
108 {tag:'div', id:this.getId('offlineLink'), cls:'offlineLink', children:[ 106 {tag:'div', id:this.getId('offlineLink'), cls:'offlineLink', children:[
109 {tag:'canvas', id:this.getId('downloadIcon')}, 107 {tag:'canvas', id:this.getId('downloadIcon')},
110 {tag:'a', href:'#', cls:'offlineLink', children:[ 108 {tag:'a', href:'#', cls:'offlineLink', children:[
111 {tag:'span', cls:'payoff', html:"Download!"}, 109 {tag:'span', cls:'payoff', html:"Download!"},
112 {tag:'span', cls:'link', html:"Offline version >>"} 110 {tag:'span', cls:'link', html:"Offline version >>"}
113 ]} 111 ]}
114 ]} 112 ]}
115 ]} 113 ]}
116 ]} 114 ]}
117 ]} 115 ]}
118 ]); 116 ]);
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
index 26506e7..3fef6c5 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js
@@ -1,156 +1,153 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.LoginProgress = function(args) { 26Clipperz.PM.UI.Web.Components.LoginProgress = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.LoginProgress.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.LoginProgress.superclass.constructor.apply(this, arguments);
32 30
33 this._deferred = null; 31 this._deferred = null;
34 32
35 return this; 33 return this;
36} 34}
37 35
38//============================================================================= 36//=============================================================================
39 37
40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginProgress, Clipperz.PM.UI.Common.Components.BaseComponent, { 38Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.LoginProgress, Clipperz.PM.UI.Common.Components.BaseComponent, {
41 39
42 //------------------------------------------------------------------------- 40 //-------------------------------------------------------------------------
43 41
44 'toString': function () { 42 'toString': function () {
45 return "Clipperz.PM.UI.Web.Components.LoginProgress component"; 43 return "Clipperz.PM.UI.Web.Components.LoginProgress component";
46 }, 44 },
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'deferred': function() { 48 'deferred': function() {
51 return this._deferred; 49 return this._deferred;
52 }, 50 },
53 51
54 'setDeferred': function(aValue) { 52 'setDeferred': function(aValue) {
55 this._deferred = aValue; 53 this._deferred = aValue;
56 }, 54 },
57 55
58 //------------------------------------------------------------------------- 56 //-------------------------------------------------------------------------
59 57
60 'renderSelf': function() { 58 'renderSelf': function() {
61 // var loginProgressElement; 59 // var loginProgressElement;
62 // 60 //
63 // loginProgressElement = MochiKit.DOM.getElement('loginProgress'); 61 // loginProgressElement = MochiKit.DOM.getElement('loginProgress');
64 // 62 //
65 // if (loginProgressElement == null) { 63 // if (loginProgressElement == null) {
66 // loginProgressElement = this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress'}, true); 64 // loginProgressElement = this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress'}, true);
67 // } 65 // }
68 66
69//console.log(">> LoginProgress.renderSelf", this.element());
70 this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress', children: [ 67 this.append(this.element(), {tag:'div', id:'loginProgress', cls:'LoginProgress', children: [
71 // this.append(loginProgressElement, [ 68 // this.append(loginProgressElement, [
72 {tag:'div', cls:'header', children:[ 69 {tag:'div', cls:'header', children:[
73 {tag:'h3', id:this.getId('title'), html:"login progress"} 70 {tag:'h3', id:this.getId('title'), html:"login progress"}
74 ]}, 71 ]},
75 {tag:'div', cls:'body', children:[ 72 {tag:'div', cls:'body', children:[
76 {tag:'div', id:this.getId('progressBar')}, 73 {tag:'div', id:this.getId('progressBar')},
77 {tag:'div', id:this.getId('errorBox'), cls:'errorBox', children:[ 74 {tag:'div', id:this.getId('errorBox'), cls:'errorBox', children:[
78 // {tag:'div',cls:'img ALERT', children:[{tag:'div'}]}, 75 // {tag:'div',cls:'img ALERT', children:[{tag:'div'}]},
79 {tag:'div',cls:'img ALERT', children:[{tag:'canvas', id:this.getId('canvas')}]}, 76 {tag:'div',cls:'img ALERT', children:[{tag:'canvas', id:this.getId('canvas')}]},
80 {tag:'p', html:"Login failed"} 77 {tag:'p', html:"Login failed"}
81 ]} 78 ]}
82 ]}, 79 ]},
83 {tag:'div', cls:'footer', children:[ 80 {tag:'div', cls:'footer', children:[
84 {tag:'div', cls:'buttonArea', id:this.getId('buttonArea'), children:[ 81 {tag:'div', cls:'buttonArea', id:this.getId('buttonArea'), children:[
85 // {tag:'div', cls:'button', id:this.getId('button'), children:[ 82 // {tag:'div', cls:'button', id:this.getId('button'), children:[
86 // {tag:'a', href:'#', id:this.getId('buttonLink'), html:"cancel"} 83 // {tag:'a', href:'#', id:this.getId('buttonLink'), html:"cancel"}
87 // ]} 84 // ]}
88 {tag:'a', cls:'button', id:this.getId('button'), html:"cancel"} 85 {tag:'a', cls:'button', id:this.getId('button'), html:"cancel"}
89 ]} 86 ]}
90 ]} 87 ]}
91 ]}); 88 ]});
92 // ]); 89 // ]);
93 90
94 Clipperz.PM.UI.Canvas.marks['!'](this.getElement('canvas'), "#ffffff"); 91 Clipperz.PM.UI.Canvas.marks['!'](this.getElement('canvas'), "#ffffff");
95 92
96 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')})); 93 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':this.getElement('progressBar')}));
97 MochiKit.Style.hideElement(this.getElement('errorBox')); 94 MochiKit.Style.hideElement(this.getElement('errorBox'));
98 95
99 // MochiKit.Signal.connect(this.getId('buttonLink'), 'onclick', this, 'cancelEventHandler'); 96 // MochiKit.Signal.connect(this.getId('buttonLink'), 'onclick', this, 'cancelEventHandler');
100 MochiKit.Signal.connect(this.getId('button'), 'onclick', this, 'cancelEventHandler'); 97 MochiKit.Signal.connect(this.getId('button'), 'onclick', this, 'cancelEventHandler');
101 }, 98 },
102 99
103 //------------------------------------------------------------------------- 100 //-------------------------------------------------------------------------
104 101
105 'displayElement': function() { 102 'displayElement': function() {
106 return MochiKit.DOM.getElement('loginProgress'); 103 return MochiKit.DOM.getElement('loginProgress');
107 }, 104 },
108 105
109 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
110 107
111 'cancelEventHandler': function(anEvent) { 108 'cancelEventHandler': function(anEvent) {
112 anEvent.preventDefault(); 109 anEvent.preventDefault();
113 110
114 MochiKit.Signal.signal(this, 'cancelEvent'); 111 MochiKit.Signal.signal(this, 'cancelEvent');
115 }, 112 },
116 113
117 //------------------------------------------------------------------------- 114 //-------------------------------------------------------------------------
118 115
119 'disableCancel': function() { 116 'disableCancel': function() {
120 MochiKit.Style.hideElement(this.getElement('buttonArea')); 117 MochiKit.Style.hideElement(this.getElement('buttonArea'));
121 }, 118 },
122 119
123 //------------------------------------------------------------------------- 120 //-------------------------------------------------------------------------
124 121
125 'showErrorMessage': function() { 122 'showErrorMessage': function() {
126 // this.getElement('buttonLink').innerHTML = "close"; 123 // this.getElement('buttonLink').innerHTML = "close";
127 this.getElement('button').innerHTML = "close"; 124 this.getElement('button').innerHTML = "close";
128 MochiKit.DOM.addElementClass(this.getElement('button'), 'default'); 125 MochiKit.DOM.addElementClass(this.getElement('button'), 'default');
129 126
130 MochiKit.Style.hideElement(this.getElement('progressBar')); 127 MochiKit.Style.hideElement(this.getElement('progressBar'));
131 128
132 this.getElement('title').innerHTML = "Error"; 129 this.getElement('title').innerHTML = "Error";
133 MochiKit.Style.showElement(this.getElement('errorBox')); 130 MochiKit.Style.showElement(this.getElement('errorBox'));
134 MochiKit.Style.showElement(this.getElement('buttonArea')); 131 MochiKit.Style.showElement(this.getElement('buttonArea'));
135 }, 132 },
136 133
137 //------------------------------------------------------------------------- 134 //-------------------------------------------------------------------------
138 135
139 'deferredHideModalAndRemove': function(someParameters, aResult) { 136 'deferredHideModalAndRemove': function(someParameters, aResult) {
140 vardeferredResult; 137 vardeferredResult;
141 138
142 deferredResult = new Clipperz.Async.Deferred("LoginProgress.deferredHideModalAndRemove", {trace:false}); 139 deferredResult = new Clipperz.Async.Deferred("LoginProgress.deferredHideModalAndRemove", {trace:false});
143 deferredResult.addMethod(this, 'deferredHideModal'); 140 deferredResult.addMethod(this, 'deferredHideModal');
144 deferredResult.addMethod(this, 'remove'); 141 deferredResult.addMethod(this, 'remove');
145 deferredResult.addCallback(function () { 142 deferredResult.addCallback(function () {
146 return aResult; 143 return aResult;
147 }); 144 });
148 deferredResult.callback(someParameters); 145 deferredResult.callback(someParameters);
149 146
150 return deferredResult; 147 return deferredResult;
151 }, 148 },
152 149
153 //------------------------------------------------------------------------- 150 //-------------------------------------------------------------------------
154 151
155 __syntaxFix__: "syntax fix" 152 __syntaxFix__: "syntax fix"
156}); 153});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
index feb16ad..06746d1 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
@@ -1,223 +1,219 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.NewUserCreationComponent = function(args) { 26Clipperz.PM.UI.Web.Components.NewUserCreationComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._tabPanelController = null; 31 this._tabPanelController = null;
34 32
35 this._initiallySelectedTab = args.selected || 'CREDENTIALS'; 33 this._initiallySelectedTab = args.selected || 'CREDENTIALS';
36 this._tabPanelControllerConfiguration = { 34 this._tabPanelControllerConfiguration = {
37 'CREDENTIALS': { 35 'CREDENTIALS': {
38 tab:'credentialsTab', 36 tab:'credentialsTab',
39 panel:'credentialsTabpanel' 37 panel:'credentialsTabpanel'
40 }, 38 },
41 'CHECK_CREDENTIALS': { 39 'CHECK_CREDENTIALS': {
42 tab:'checkCredentialsTab', 40 tab:'checkCredentialsTab',
43 panel:'checkCredentialsTabpanel' 41 panel:'checkCredentialsTabpanel'
44 }, 42 },
45 'TERMS_OF_SERVICE': { 43 'TERMS_OF_SERVICE': {
46 tab:'termsOfServiceTab', 44 tab:'termsOfServiceTab',
47 panel:'termsOfServiceTabpanel' 45 panel:'termsOfServiceTabpanel'
48 }, 46 },
49 'CREATE_USER': { 47 'CREATE_USER': {
50 tab:'createUserTab', 48 tab:'createUserTab',
51 panel:'createUserTabpanel' 49 panel:'createUserTabpanel'
52 }//, 50 }//,
53/* 51/*
54 'LOGIN': { 52 'LOGIN': {
55 tab:'loginTab', 53 tab:'loginTab',
56 panel:'loginTabpanel' 54 panel:'loginTabpanel'
57 } 55 }
58*/ 56*/
59 }; 57 };
60 58
61 return this; 59 return this;
62} 60}
63 61
64//============================================================================= 62//=============================================================================
65 63
66Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.NewUserCreationComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 64Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.NewUserCreationComponent, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
67 65
68 //------------------------------------------------------------------------- 66 //-------------------------------------------------------------------------
69 67
70 'toString': function () { 68 'toString': function () {
71 return "Clipperz.PM.UI.Web.Components.NewUserCreationComponent component"; 69 return "Clipperz.PM.UI.Web.Components.NewUserCreationComponent component";
72 }, 70 },
73 71
74 //========================================================================= 72 //=========================================================================
75 73
76 'disableAllPanels': function () { 74 'disableAllPanels': function () {
77 this.tabPanelController().selectTab(null); 75 this.tabPanelController().selectTab(null);
78 }, 76 },
79 77
80 //------------------------------------------------------------------------- 78 //-------------------------------------------------------------------------
81 79
82 'enableCredentialsPanel': function () { 80 'enableCredentialsPanel': function () {
83 this.tabPanelController().selectTab('CREDENTIALS'); 81 this.tabPanelController().selectTab('CREDENTIALS');
84 }, 82 },
85 83
86 'enableCheckCredentialsPanel': function () { 84 'enableCheckCredentialsPanel': function () {
87 this.tabPanelController().selectTab('CHECK_CREDENTIALS'); 85 this.tabPanelController().selectTab('CHECK_CREDENTIALS');
88 }, 86 },
89 87
90 'enableTermsOfServicePanel': function () { 88 'enableTermsOfServicePanel': function () {
91 this.tabPanelController().selectTab('TERMS_OF_SERVICE'); 89 this.tabPanelController().selectTab('TERMS_OF_SERVICE');
92 }, 90 },
93 91
94 'enableCreateUserPanel': function () { 92 'enableCreateUserPanel': function () {
95 this.tabPanelController().selectTab('CREATE_USER'); 93 this.tabPanelController().selectTab('CREATE_USER');
96 }, 94 },
97 95
98 //'enableLoginPanel': function () { 96 //'enableLoginPanel': function () {
99 // this.tabPanelController().selectTab('LOGIN'); 97 // this.tabPanelController().selectTab('LOGIN');
100 //}, 98 //},
101 99
102 //========================================================================= 100 //=========================================================================
103 101
104 'shouldShowElementWhileRendering': function() { 102 'shouldShowElementWhileRendering': function() {
105 return false; 103 return false;
106 }, 104 },
107 105
108 //========================================================================= 106 //=========================================================================
109 107
110 'tabPanelController': function () { 108 'tabPanelController': function () {
111 if (this._tabPanelController == null) { 109 if (this._tabPanelController == null) {
112 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({ 110 this._tabPanelController = new Clipperz.PM.UI.Common.Controllers.TabPanelController({
113 component:this, 111 component:this,
114 configuration:this._tabPanelControllerConfiguration 112 configuration:this._tabPanelControllerConfiguration
115 }); 113 });
116 114
117 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected') 115 MochiKit.Signal.connect(this._tabPanelController, 'tabSelected', this, 'handleTabSelected')
118 } 116 }
119 117
120 return this._tabPanelController; 118 return this._tabPanelController;
121 }, 119 },
122 120
123 //------------------------------------------------------------------------- 121 //-------------------------------------------------------------------------
124 122
125 'renderSelf': function() { 123 'renderSelf': function() {
126//console.log('** Clipperz.targetModalDimensionsAndPosition', Clipperz.Base.serializeJSON(Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition));
127
128 this.append(this.element(), {tag:'div', cls:'NewUserCreation mainDialog', id:this.getId('panel'), children: [ 124 this.append(this.element(), {tag:'div', cls:'NewUserCreation mainDialog', id:this.getId('panel'), children: [
129 {tag:'form', id:this.getId('form'), cls:'newUserCreationForm', children:[ 125 {tag:'form', id:this.getId('form'), cls:'newUserCreationForm', children:[
130 {tag:'div', cls:'header', children:[ 126 {tag:'div', cls:'header', children:[
131 {tag:'div', cls:'title', children:[ 127 {tag:'div', cls:'title', children:[
132 {tag:'h3', id:this.getId('title'), html:"Create new user"} 128 {tag:'h3', id:this.getId('title'), html:"Create new user"}
133 ]} 129 ]}
134 ]}, 130 ]},
135 {tag:'div', id:this.getId('body'), cls:'body', children:[ 131 {tag:'div', id:this.getId('body'), cls:'body', children:[
136 {tag:'div', cls:'tabContainer', children:[ 132 {tag:'div', cls:'tabContainer', children:[
137 {tag:'ul', cls:'tabs', children:[ 133 {tag:'ul', cls:'tabs', children:[
138 {tag:'li', id:this.getId('credentialsTab'), children:[{tag:'span', html:"credentials"}]}, 134 {tag:'li', id:this.getId('credentialsTab'), children:[{tag:'span', html:"credentials"}]},
139 {tag:'li', id:this.getId('checkCredentialsTab'),children:[{tag:'span', html:"credentials check"}]}, 135 {tag:'li', id:this.getId('checkCredentialsTab'),children:[{tag:'span', html:"credentials check"}]},
140 {tag:'li', id:this.getId('termsOfServiceTab'), children:[{tag:'span', html:"terms of service"}]}, 136 {tag:'li', id:this.getId('termsOfServiceTab'), children:[{tag:'span', html:"terms of service"}]},
141 {tag:'li', id:this.getId('createUserTab'), children:[{tag:'span', html:"create user"}]}//, 137 {tag:'li', id:this.getId('createUserTab'), children:[{tag:'span', html:"create user"}]}//,
142 // {tag:'li', id:this.getId('loginTab'), children:[{tag:'span', html:"login"}]}, 138 // {tag:'li', id:this.getId('loginTab'), children:[{tag:'span', html:"login"}]},
143 ]}, 139 ]},
144 {tag:'ul', cls:'tabPanels', children:[ 140 {tag:'ul', cls:'tabPanels', children:[
145 {tag:'li', id:this.getId('credentialsTabpanel'), cls:'tabPanel credentials', children:[ 141 {tag:'li', id:this.getId('credentialsTabpanel'), cls:'tabPanel credentials', children:[
146 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREDENTIALS.description')}]}, 142 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREDENTIALS.description')}]},
147 {tag:'ul', cls:'credentials', children:[ 143 {tag:'ul', cls:'credentials', children:[
148 {tag:'li', children:[{tag:'span', cls:'label', html:"username"},{tag:'input', type:'text', id:this.getId('username')/*, value:'test'*/}]}, 144 {tag:'li', children:[{tag:'span', cls:'label', html:"username"},{tag:'input', type:'text', id:this.getId('username')/*, value:'test'*/}]},
149 {tag:'li', children:[{tag:'span', cls:'label', html:"passphrase"},{tag:'input', type:'password', id:this.getId('passphrase')/*, value:'test'*/}]} 145 {tag:'li', children:[{tag:'span', cls:'label', html:"passphrase"},{tag:'input', type:'password', id:this.getId('passphrase')/*, value:'test'*/}]}
150 ]} 146 ]}
151 ]}, 147 ]},
152 {tag:'li', id:this.getId('checkCredentialsTabpanel'), cls:'tabPanel checkCredentials', children:[ 148 {tag:'li', id:this.getId('checkCredentialsTabpanel'), cls:'tabPanel checkCredentials', children:[
153 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CHECK_CREDENTIALS.description')}]}, 149 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CHECK_CREDENTIALS.description')}]},
154 {tag:'ul', cls:'credentials', children:[ 150 {tag:'ul', cls:'credentials', children:[
155 {tag:'li', children:[{tag:'span', cls:'label', html:"re-passphrase"},{tag:'input', type:'password', id:this.getId('re-passphrase')/*, value:'test'*/}]} 151 {tag:'li', children:[{tag:'span', cls:'label', html:"re-passphrase"},{tag:'input', type:'password', id:this.getId('re-passphrase')/*, value:'test'*/}]}
156 ]} 152 ]}
157 ]}, 153 ]},
158 {tag:'li', id:this.getId('termsOfServiceTabpanel'), cls:'tabPanel termsOfService', children:[ 154 {tag:'li', id:this.getId('termsOfServiceTabpanel'), cls:'tabPanel termsOfService', children:[
159 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.TERMS_OF_SERVICE.description')}]}, 155 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.TERMS_OF_SERVICE.description')}]},
160 {tag:'ul', cls:'termsOfService', children:[ 156 {tag:'ul', cls:'termsOfService', children:[
161 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('awareOfUnrecoverablePassphrase')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('awareOfUnrecoverablePassphrase'), html:"I understand that Clipperz will not be able to recover a lost passphrase."}]}, 157 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('awareOfUnrecoverablePassphrase')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('awareOfUnrecoverablePassphrase'), html:"I understand that Clipperz will not be able to recover a lost passphrase."}]},
162 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('readTermsOfService')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('readTermsOfService'), htmlString:"I have read and agreed to the <a href='http://www.clipperz.com/terms_of_service' target='_blank'>Terms of Service</a>."}]} 158 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('readTermsOfService')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('readTermsOfService'), htmlString:"I have read and agreed to the <a href='http://www.clipperz.com/terms_of_service' target='_blank'>Terms of Service</a>."}]}
163 ]} 159 ]}
164 ]}, 160 ]},
165 {tag:'li', id:this.getId('createUserTabpanel'), cls:'tabPanel createUser', children:[ 161 {tag:'li', id:this.getId('createUserTabpanel'), cls:'tabPanel createUser', children:[
166 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREATE_USER.description')}]}, 162 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREATE_USER.description')}]},
167 {tag:'ul', cls:'createUserStates', children:[ 163 {tag:'ul', cls:'createUserStates', children:[
168 {tag:'li', cls:'creating', id:this.getId('creatingRegistering'), children:[{tag:'span', html:"registering user"}]}, 164 {tag:'li', cls:'creating', id:this.getId('creatingRegistering'), children:[{tag:'span', html:"registering user"}]},
169 {tag:'li', cls:'done', id:this.getId('creatingDone'), children:[{tag:'span', html:"done"}]}, 165 {tag:'li', cls:'done', id:this.getId('creatingDone'), children:[{tag:'span', html:"done"}]},
170 {tag:'li', cls:'fail', id:this.getId('creatingFailed'), children:[{tag:'span', html:"fail"}]} 166 {tag:'li', cls:'fail', id:this.getId('creatingFailed'), children:[{tag:'span', html:"fail"}]}
171 ]} 167 ]}
172 ]}//, 168 ]}//,
173 // {tag:'li', id:this.getId('loginTabpanel'), cls:'tabPanel login', children:[ 169 // {tag:'li', id:this.getId('loginTabpanel'), cls:'tabPanel login', children:[
174 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.LOGIN.description')}]}, 170 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.LOGIN.description')}]},
175 // ]} 171 // ]}
176 ]} 172 ]}
177 ]} 173 ]}
178 ]}, 174 ]},
179 {tag:'div', id:this.getId('footer'), cls:'footer', children:[ 175 {tag:'div', id:this.getId('footer'), cls:'footer', children:[
180 {tag:'div', cls:'buttonArea', children:[ 176 {tag:'div', cls:'buttonArea', children:[
181 // {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"}, 177 // {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"},
182 // {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"} 178 // {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"}
183 ]} 179 ]}
184 ]} 180 ]}
185 ]}, 181 ]},
186 {tag:'div', cls:'clear'} 182 {tag:'div', cls:'clear'}
187 ]}); 183 ]});
188 184
189 this.tabPanelController().setup(); 185 this.tabPanelController().setup();
190 // MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'handleKeyEvent'); 186 // MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'handleKeyEvent');
191 MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown', this, 'handleKeyEvent'); 187 MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown', this, 'handleKeyEvent');
192 MochiKit.Signal.connect(this.getId('awareOfUnrecoverablePassphrase'), 'onchange', this, 'handleTermsOfServiceCheckboxChange'); 188 MochiKit.Signal.connect(this.getId('awareOfUnrecoverablePassphrase'), 'onchange', this, 'handleTermsOfServiceCheckboxChange');
193 MochiKit.Signal.connect(this.getId('readTermsOfService'), 'onchange', this, 'handleTermsOfServiceCheckboxChange'); 189 MochiKit.Signal.connect(this.getId('readTermsOfService'), 'onchange', this, 'handleTermsOfServiceCheckboxChange');
194 }, 190 },
195 191
196 //------------------------------------------------------------------------- 192 //-------------------------------------------------------------------------
197/* 193/*
198 'resetContent': function () { 194 'resetContent': function () {
199 this.getElement('username').value = ''; 195 this.getElement('username').value = '';
200 this.getElement('passphrase').value = ''; 196 this.getElement('passphrase').value = '';
201 }, 197 },
202*/ 198*/
203 //------------------------------------------------------------------------- 199 //-------------------------------------------------------------------------
204 200
205 'displayElement': function() { 201 'displayElement': function() {
206 return this.getElement('panel'); 202 return this.getElement('panel');
207 }, 203 },
208 204
209 //------------------------------------------------------------------------- 205 //-------------------------------------------------------------------------
210 206
211 'handleTabSelected': function (aSelectedTab) { 207 'handleTabSelected': function (aSelectedTab) {
212/* 208/*
213 switch (aSelectedTab) { 209 switch (aSelectedTab) {
214 case 'DETAILS': 210 case 'DETAILS':
215 break; 211 break;
216 case 'DIRECT_LOGINS': 212 case 'DIRECT_LOGINS':
217 MochiKit.Style.hideElement(this.getElement('backToDirectLoginList')); 213 MochiKit.Style.hideElement(this.getElement('backToDirectLoginList'));
218 break; 214 break;
219 case 'SHARING': 215 case 'SHARING':
220 break; 216 break;
221 } 217 }
222*/ 218*/
223 }, 219 },
@@ -240,188 +236,184 @@ Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.NewUserCreationComponent, Cli
240 return this.getElement('re-passphrase').value; 236 return this.getElement('re-passphrase').value;
241 }, 237 },
242 238
243 'awareOfUnrecoverablePassphrase': function () { 239 'awareOfUnrecoverablePassphrase': function () {
244 return this.getElement('awareOfUnrecoverablePassphrase').value; 240 return this.getElement('awareOfUnrecoverablePassphrase').value;
245 }, 241 },
246 242
247 'readTermsOfService': function () { 243 'readTermsOfService': function () {
248 return this.getElement('readTermsOfService').value; 244 return this.getElement('readTermsOfService').value;
249 }, 245 },
250 246
251 //========================================================================= 247 //=========================================================================
252/* 248/*
253 'incrementUpdateFaviconCounter': function () { 249 'incrementUpdateFaviconCounter': function () {
254 this._updateFaviconCounter ++; 250 this._updateFaviconCounter ++;
255 }, 251 },
256 252
257 'decrementUpdateFaviconCounter': function () { 253 'decrementUpdateFaviconCounter': function () {
258 this._updateFaviconCounter --; 254 this._updateFaviconCounter --;
259 }, 255 },
260 256
261 'updateFaviconCounter': function () { 257 'updateFaviconCounter': function () {
262 return this._updateFaviconCounter; 258 return this._updateFaviconCounter;
263 }, 259 },
264 */ 260 */
265 //------------------------------------------------------------------------- 261 //-------------------------------------------------------------------------
266/* 262/*
267 'updateFavicon': function () { 263 'updateFavicon': function () {
268 this.decrementUpdateFaviconCounter(); 264 this.decrementUpdateFaviconCounter();
269 265
270 if (this.updateFaviconCounter() == 0) { 266 if (this.updateFaviconCounter() == 0) {
271 this.setFavicon(this.favicon()); 267 this.setFavicon(this.favicon());
272 } 268 }
273 }, 269 },
274*/ 270*/
275 //========================================================================= 271 //=========================================================================
276/* 272/*
277 'bindingComponents': function () { 273 'bindingComponents': function () {
278 return this._bindingComponents; 274 return this._bindingComponents;
279 }, 275 },
280 276
281 'clearAllBindingsComponents': function () { 277 'clearAllBindingsComponents': function () {
282 MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove')); 278 MochiKit.Iter.forEach(this.bindingComponents(), MochiKit.Base.methodcaller('remove'));
283 this._bindingComponents = []; 279 this._bindingComponents = [];
284 this.getElement('bindings').innerHTML = ''; 280 this.getElement('bindings').innerHTML = '';
285 }, 281 },
286 282
287 'addBindingComponent': function (aBindingComponent) { 283 'addBindingComponent': function (aBindingComponent) {
288 this.bindingComponents().push(aBindingComponent); 284 this.bindingComponents().push(aBindingComponent);
289 aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'})); 285 aBindingComponent.renderInNode(this.append(this.getElement('bindings'), {tag:'div'}));
290 }, 286 },
291*/ 287*/
292 //========================================================================= 288 //=========================================================================
293/* 289/*
294 'formValueComponents': function () { 290 'formValueComponents': function () {
295 return this._formValueComponents; 291 return this._formValueComponents;
296 }, 292 },
297 293
298 'clearAllFormValueComponents': function () { 294 'clearAllFormValueComponents': function () {
299 MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove')); 295 MochiKit.Iter.forEach(this.formValueComponents(), MochiKit.Base.methodcaller('remove'));
300 this._formValueComponents = []; 296 this._formValueComponents = [];
301 this.getElement('formValues').innerHTML = ''; 297 this.getElement('formValues').innerHTML = '';
302 }, 298 },
303 299
304 'addFormValueComponent': function (aFormValueComponent) { 300 'addFormValueComponent': function (aFormValueComponent) {
305 this.formValueComponents().push(aFormValueComponent); 301 this.formValueComponents().push(aFormValueComponent);
306 aFormValueComponent.renderInNode(this.append(this.getElement('formValues'), {tag:'div'})); 302 aFormValueComponent.renderInNode(this.append(this.getElement('formValues'), {tag:'div'}));
307 }, 303 },
308*/ 304*/
309 //========================================================================= 305 //=========================================================================
310 306
311 'changedValue': function (anEvent) { 307 'changedValue': function (anEvent) {
312 MochiKit.Signal.signal(this, 'changedValue', anEvent); 308 MochiKit.Signal.signal(this, 'changedValue', anEvent);
313 309
314 this.incrementUpdateFaviconCounter(); 310 this.incrementUpdateFaviconCounter();
315 MochiKit.Async.callLater(1, MochiKit.Base.method(this, 'updateFavicon')); 311 MochiKit.Async.callLater(1, MochiKit.Base.method(this, 'updateFavicon'));
316 }, 312 },
317 313
318 //------------------------------------------------------------------------- 314 //-------------------------------------------------------------------------
319 315
320 'handleBackClick': function (anEvent) { 316 'handleBackClick': function (anEvent) {
321 anEvent.preventDefault(); 317 anEvent.preventDefault();
322 318
323 MochiKit.Signal.signal(this, 'back'); 319 MochiKit.Signal.signal(this, 'back');
324 }, 320 },
325 321
326 //========================================================================= 322 //=========================================================================
327 323
328 'bottomMargin': function () { 324 'bottomMargin': function () {
329 var result; 325 var result;
330 326
331 //TODO: WTF!!! 327 //TODO: WTF!!!
332 // result =MochiKit.Style.getElementPosition(this.element())['y'] + 328 // result =MochiKit.Style.getElementPosition(this.element())['y'] +
333 // MochiKit.Style.getElementDimensions(this.element())['h']; 329 // MochiKit.Style.getElementDimensions(this.element())['h'];
334 330
335 // result =MochiKit.Style.getElementPosition(this.getElement('footer'))['y']; 331 // result =MochiKit.Style.getElementPosition(this.getElement('footer'))['y'];
336//console.log("### bottomMargin");
337//console.log('displayElement', this.displayElement());
338//console.log('-- Clipperz.targetModalDimensionsAndPosition', Clipperz.Base.serializeJSON(Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition));
339//console.log('element', MochiKit.Style.getElementPosition('modalDialog') ['y'], MochiKit.Style.getElementDimensions('modalDialog')['h']);
340 // result = 450; 332 // result = 450;
341 333
342 result =Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['position']['y'] + 334 result =Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['position']['y'] +
343 Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['dimensions']['h'] - 335 Clipperz.PM.UI.Common.Components.BaseComponent.targetModalDimensionsAndPosition['dimensions']['h'] -
344 60; 336 60;
345 337
346 return result; 338 return result;
347 }, 339 },
348 340
349 //========================================================================= 341 //=========================================================================
350 342
351 'focusOnUsernameElement': function () { 343 'focusOnUsernameElement': function () {
352 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('username'), 'focus')); 344 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('username'), 'focus'));
353 }, 345 },
354 346
355 'focusOnRePassphraseElement': function () { 347 'focusOnRePassphraseElement': function () {
356 this.getElement('re-passphrase').focus(); 348 this.getElement('re-passphrase').focus();
357 }, 349 },
358 /* 350 /*
359 'focusOnBookmarkletConfigurationElement': function () { 351 'focusOnBookmarkletConfigurationElement': function () {
360 this.getElement('bookmarkletConfiguration').focus(); 352 this.getElement('bookmarkletConfiguration').focus();
361 }, 353 },
362 354
363 'focusOnFaviconElement': function () { 355 'focusOnFaviconElement': function () {
364 this.getElement('faviconURL').focus(); 356 this.getElement('faviconURL').focus();
365 }, 357 },
366*/ 358*/
367 359
368 //========================================================================= 360 //=========================================================================
369 361
370 'hideAllProgeressStates': function () { 362 'hideAllProgeressStates': function () {
371 MochiKit.Style.hideElement(this.getElement('creatingRegistering')); 363 MochiKit.Style.hideElement(this.getElement('creatingRegistering'));
372 MochiKit.Style.hideElement(this.getElement('creatingDone')); 364 MochiKit.Style.hideElement(this.getElement('creatingDone'));
373 MochiKit.Style.hideElement(this.getElement('creatingFailed')); 365 MochiKit.Style.hideElement(this.getElement('creatingFailed'));
374 }, 366 },
375 367
376 'showProgressOnUserCreation': function () { 368 'showProgressOnUserCreation': function () {
377//Clipperz.log(">>> NewUserCreationComponent.showProgressOnUserCreation"); 369//Clipperz.log(">>> NewUserCreationComponent.showProgressOnUserCreation");
378 this.hideAllProgeressStates(); 370 this.hideAllProgeressStates();
379 MochiKit.Style.showElement(this.getElement('creatingRegistering')); 371 MochiKit.Style.showElement(this.getElement('creatingRegistering'));
380 }, 372 },
381 373
382 'showUserCreationDone': function () { 374 'showUserCreationDone': function () {
383//Clipperz.log(">>> NewUserCreationComponent.showUserCreationDone"); 375//Clipperz.log(">>> NewUserCreationComponent.showUserCreationDone");
384 this.hideAllProgeressStates(); 376 this.hideAllProgeressStates();
385 MochiKit.Style.showElement(this.getElement('creatingDone')); 377 MochiKit.Style.showElement(this.getElement('creatingDone'));
386//Clipperz.log("<<< NewUserCreationComponent.showUserCreationDone"); 378//Clipperz.log("<<< NewUserCreationComponent.showUserCreationDone");
387 }, 379 },
388 380
389 'showUserCreationFailed': function () { 381 'showUserCreationFailed': function () {
390//Clipperz.log(">>> NewUserCreationComponent.showUserCreationFailed"); 382//Clipperz.log(">>> NewUserCreationComponent.showUserCreationFailed");
391 this.hideAllProgeressStates(); 383 this.hideAllProgeressStates();
392 MochiKit.Style.showElement(this.getElement('creatingFailed')); 384 MochiKit.Style.showElement(this.getElement('creatingFailed'));
393 }, 385 },
394 386
395 //========================================================================= 387 //=========================================================================
396 388
397 'handleKeyEvent': function (anEvent) { 389 'handleKeyEvent': function (anEvent) {
398 MochiKit.Signal.signal(this, 'keyPressed', anEvent); 390 MochiKit.Signal.signal(this, 'keyPressed', anEvent);
399/* 391/*
400 if (anEvent.key().string == 'KEY_ENTER') { 392 if (anEvent.key().string == 'KEY_ENTER') {
401 if (anEvent.target().nodeName != 'TEXTAREA') { 393 if (anEvent.target().nodeName != 'TEXTAREA') {
402 MochiKit.Signal.signal(this, 'moveForward'); 394 MochiKit.Signal.signal(this, 'moveForward');
403 anEvent.preventDefault(); 395 anEvent.preventDefault();
404 } 396 }
405 } else if (anEvent.key().string == 'KEY_TAB') { 397 } else if (anEvent.key().string == 'KEY_TAB') {
406 if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) { 398 if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) {
407 MochiKit.Signal.signal(this, 'moveForward'); 399 MochiKit.Signal.signal(this, 'moveForward');
408 anEvent.preventDefault(); 400 anEvent.preventDefault();
409 } 401 }
410 } 402 }
411*/ 403*/
412 }, 404 },
413 405
414 'handleTermsOfServiceCheckboxChange': function (anEvent) { 406 'handleTermsOfServiceCheckboxChange': function (anEvent) {
415 MochiKit.Signal.signal(this, 'changedValue'); 407 MochiKit.Signal.signal(this, 'changedValue');
416 }, 408 },
417 409
418 //========================================================================= 410 //=========================================================================
419 411
420 'clear': function () { 412 'clear': function () {
421 this.tabPanelController().selectTab(null); 413 this.tabPanelController().selectTab(null);
422 Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.clear.apply(this, arguments); 414 Clipperz.PM.UI.Web.Components.NewUserCreationComponent.superclass.clear.apply(this, arguments);
423 }, 415 },
424 416
425 //========================================================================= 417 //=========================================================================
426 __syntaxFix__: "syntax fix" 418 __syntaxFix__: "syntax fix"
427}); 419});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js
index 3cc5a37..30cbeb2 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js
@@ -1,68 +1,66 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.Page = function(args) { 26Clipperz.PM.UI.Web.Components.Page = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.Page.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.Page.superclass.constructor.apply(this, arguments);
32 30
33 this._slots = { 31 this._slots = {
34 'header':'pageHeader', 32 'header':'pageHeader',
35 'body': 'pageBody', 33 'body': 'pageBody',
36 'footer':'pageFooter' 34 'footer':'pageFooter'
37 }; 35 };
38 36
39 return this; 37 return this;
40} 38}
41 39
42//============================================================================= 40//=============================================================================
43 41
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.Page, Clipperz.PM.UI.Common.Components.BaseComponent, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.Page, Clipperz.PM.UI.Common.Components.BaseComponent, {
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'toString': function () { 46 'toString': function () {
49 return "Clipperz.PM.UI.Web.Components.Page component"; 47 return "Clipperz.PM.UI.Web.Components.Page component";
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'renderSelf': function(/*aContainer, aPosition*/) { 52 'renderSelf': function(/*aContainer, aPosition*/) {
55 this.append(this.element(), [ 53 this.append(this.element(), [
56 {tag:'div', id:'pageHeaderAndBody', cls:'pageHeaderAndBody', children:[ 54 {tag:'div', id:'pageHeaderAndBody', cls:'pageHeaderAndBody', children:[
57 {tag:'div', id:'pageHeader', cls:'pageHeader'}, 55 {tag:'div', id:'pageHeader', cls:'pageHeader'},
58 {tag:'div', id:'pageBody', cls:'pageBody'} 56 {tag:'div', id:'pageBody', cls:'pageBody'}
59 ]}, 57 ]},
60 {tag:'div', id:'pageFooter', cls:'pageFooter'} 58 {tag:'div', id:'pageFooter', cls:'pageFooter'}
61 ]); 59 ]);
62 60
63 }, 61 },
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67 __syntaxFix__: "syntax fix" 65 __syntaxFix__: "syntax fix"
68}); 66});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
index dcf506f..df3ca0c 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
@@ -1,67 +1,65 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.PageFooter = function(args) { 26Clipperz.PM.UI.Web.Components.PageFooter = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.PageFooter.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.PageFooter.superclass.constructor.apply(this, arguments);
32 30
33 return this; 31 return this;
34} 32}
35 33
36//============================================================================= 34//=============================================================================
37 35
38Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageFooter, Clipperz.PM.UI.Common.Components.BaseComponent, { 36Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageFooter, Clipperz.PM.UI.Common.Components.BaseComponent, {
39 37
40 //------------------------------------------------------------------------- 38 //-------------------------------------------------------------------------
41 39
42 'toString': function () { 40 'toString': function () {
43 return "Clipperz.PM.UI.Web.Components.PageFooter component"; 41 return "Clipperz.PM.UI.Web.Components.PageFooter component";
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'renderSelf': function(/*aContainer, aPosition*/) { 46 'renderSelf': function(/*aContainer, aPosition*/) {
49 this.append(this.element(), [ 47 this.append(this.element(), [
50 {tag:'div', cls:'footerWrapper', children:[ 48 {tag:'div', cls:'footerWrapper', children:[
51 {tag:'div', cls:'footerContent', children:[ 49 {tag:'div', cls:'footerContent', children:[
52 {tag:'canvas', id:this.getId('footerStarIcon'), cls:'footerStarIcon'}, 50 {tag:'canvas', id:this.getId('footerStarIcon'), cls:'footerStarIcon'},
53 {tag:'span', cls:'copyright', html:'Copyright &copy; 2009-2013 Clipperz Srl'}, 51 {tag:'span', cls:'copyright', html:'Copyright &copy; 2009-2013 Clipperz Srl'},
54 {tag:'a', href:'http://www.clipperz.com/terms_of_service',target:'_blank', html:'terms of service'}, 52 {tag:'a', href:'http://www.clipperz.com/terms_of_service',target:'_blank', html:'terms of service'},
55 {tag:'a', href:'http://www.clipperz.com/privacy_policy',target:'_blank', html:'privacy policy'}, 53 {tag:'a', href:'http://www.clipperz.com/privacy_policy',target:'_blank', html:'privacy policy'},
56 {tag:'div', cls:'applicationVersion', htmlString:'application version: <a href="https://github.com/clipperz/password-manager/tree/' + Clipperz_version + '" target="github">' + Clipperz_version + '</a>'} 54 {tag:'div', cls:'applicationVersion', htmlString:'application version: <a href="https://github.com/clipperz/password-manager/tree/' + Clipperz_version + '" target="github">' + Clipperz_version + '</a>'}
57 ]} 55 ]}
58 ]} 56 ]}
59 ]); 57 ]);
60 58
61 Clipperz.PM.UI.Canvas.star.normal(this.getElement('footerStarIcon'), "#7e7e7e"); 59 Clipperz.PM.UI.Canvas.star.normal(this.getElement('footerStarIcon'), "#7e7e7e");
62 }, 60 },
63 61
64 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
65 63
66 __syntaxFix__: "syntax fix" 64 __syntaxFix__: "syntax fix"
67}); 65});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js
index b8f3b05..5e49fb5 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.PageHeader = function(args) { 26Clipperz.PM.UI.Web.Components.PageHeader = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.PageHeader.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.PageHeader.superclass.constructor.apply(this, arguments);
32 this._newsIsOpen = args.newsIsOpen || false; 30 this._newsIsOpen = args.newsIsOpen || false;
33 this._animationDuration = args.animationDuration || 0.5; 31 this._animationDuration = args.animationDuration || 0.5;
34 32
35 this._offset = 82; 33 this._offset = 82;
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageHeader, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageHeader, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'toString': function () { 44 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.PageHeader component"; 45 return "Clipperz.PM.UI.Web.Components.PageHeader component";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'iframeURL': function () { 50 'iframeURL': function () {
53 // return './rss_view.html'; 51 // return './rss_view.html';
54 return 'http://www.clipperz.com/files/clipperz.com/appTips/index.html'; 52 return 'http://www.clipperz.com/files/clipperz.com/appTips/index.html';
55 }, 53 },
56 54
57 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
58 56
59 'renderSelf': function(/*aContainer, aPosition*/) { 57 'renderSelf': function(/*aContainer, aPosition*/) {
60 this.append(this.element(), [ 58 this.append(this.element(), [
61 {tag:'div', id:'miscLinks', children:[ 59 {tag:'div', id:'miscLinks', children:[
62 {tag:'ul', children:[ 60 {tag:'ul', children:[
63 {tag:'li', children:[{tag:'a', id:'donateHeaderLink', stringID:'pageHeader.donation', href:'http://www.clipperz.com/donations', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.donation')}]}, 61 {tag:'li', children:[{tag:'a', id:'donateHeaderLink', stringID:'pageHeader.donation', href:'http://www.clipperz.com/donations', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.donation')}]},
64 {tag:'li', children:[{tag:'a', id:'forumHeaderLink', stringID:'pageHeader.forum', href:'http://www.clipperz.com/forum', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.forum')}]}, 62 {tag:'li', children:[{tag:'a', id:'forumHeaderLink', stringID:'pageHeader.forum', href:'http://www.clipperz.com/forum', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.forum')}]},
65 {tag:'li', children:[{tag:'a', id:'creditsHeaderLink', stringID:'pageHeader.credits', href:'http://www.clipperz.com/credits', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.credits')}]}, 63 {tag:'li', children:[{tag:'a', id:'creditsHeaderLink', stringID:'pageHeader.credits', href:'http://www.clipperz.com/credits', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.credits')}]},
66 {tag:'li', children:[{tag:'a', id:'feedbackHeaderLink', stringID:'pageHeader.feedback', href:'http://www.clipperz.com/contact', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.feedback')}]}, 64 {tag:'li', children:[{tag:'a', id:'feedbackHeaderLink', stringID:'pageHeader.feedback', href:'http://www.clipperz.com/contact', target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.feedback')}]},
67 {tag:'li', children:[{tag:'a', id:'helpHeaderLink', stringID:'pageHeader.help', href:'http://www.clipperz.com/support/user_guide',target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.help')}]} 65 {tag:'li', children:[{tag:'a', id:'helpHeaderLink', stringID:'pageHeader.help', href:'http://www.clipperz.com/support/user_guide',target:'_blank', html:Clipperz.PM.Strings.getValue('pageHeader.help')}]}
68 ]} 66 ]}
69 ]}, 67 ]},
70 {tag:'div', id:'logoFrame', children:[ 68 {tag:'div', id:'logoFrame', children:[
71 {tag:'a', href:'http://www.clipperz.com', target:'_blank', children:[ 69 {tag:'a', href:'http://www.clipperz.com', target:'_blank', children:[
72 // {tag:'h1', cls:'logo', html:"clipperz"}, 70 // {tag:'h1', cls:'logo', html:"clipperz"},
73 {tag:'canvas', id:this.getId('logo'), cls:'logo'}, 71 {tag:'canvas', id:this.getId('logo'), cls:'logo'},
74 {tag:'h5', cls:'clipperzPayoff', html:"keep it to yourself!"} 72 {tag:'h5', cls:'clipperzPayoff', html:"keep it to yourself!"}
75 ]} 73 ]}
76 ]}, 74 ]},
77 {tag:'div', id:'news', cls:'hidden', children:[ 75 {tag:'div', id:'news', cls:'hidden', children:[
78 // {tag:'div', cls:'close', children:[ 76 // {tag:'div', cls:'close', children:[
79 // {tag:'a', href:'#', id:this.getId('closeTips'), html:'x'} 77 // {tag:'a', href:'#', id:this.getId('closeTips'), html:'x'}
80 // ]}, 78 // ]},
81 {tag:'div', id:'newsframe', children:[ 79 {tag:'div', id:'newsframe', children:[
82 {tag:'iframe', id:this.getId('iframe'), src:this.iframeURL()} 80 {tag:'iframe', id:this.getId('iframe'), src:this.iframeURL()}
83 ]}, 81 ]},
84 {tag:'div', id:this.getId('newsGrip'), cls:'grip', children:[ 82 {tag:'div', id:this.getId('newsGrip'), cls:'grip', children:[
85 {tag:'div', cls:'gripHandler', children:[]} 83 {tag:'div', cls:'gripHandler', children:[]}
86 ]} 84 ]}
87 ]}, 85 ]},
88 {tag:'div', id:'featureTabs', children:[ 86 {tag:'div', id:'featureTabs', children:[
89 {tag:'table', children:[{tag:'tr', children:[ 87 {tag:'table', children:[{tag:'tr', children:[
90 {tag:'td', children:[{tag:'div', id:'feature_store', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('storeIcon')}, {tag:'span', html:"Store and manage your password and online credentials"}]}]}, 88 {tag:'td', children:[{tag:'div', id:'feature_store', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('storeIcon')}, {tag:'span', html:"Store and manage your password and online credentials"}]}]},
91 {tag:'td', children:[{tag:'div', id:'feature_protect', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('protectIcon')}, {tag:'span', html:"Protect all your sensitive data"}]}]}, 89 {tag:'td', children:[{tag:'div', id:'feature_protect', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('protectIcon')}, {tag:'span', html:"Protect all your sensitive data"}]}]},
92 {tag:'td', children:[{tag:'div', id:'feature_directLogin', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('directLoginIcon')},{tag:'span', html:"Login to your web services without entering any username or password"}]}]}, 90 {tag:'td', children:[{tag:'div', id:'feature_directLogin', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('directLoginIcon')},{tag:'span', html:"Login to your web services without entering any username or password"}]}]},
93 {tag:'td', children:[{tag:'div', id:'feature_share', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('shareIcon')}, {tag:'span', html:"Share secret with family members and associates"}]}]} 91 {tag:'td', children:[{tag:'div', id:'feature_share', children:[{tag:'canvas', cls:'featureIcon', id:this.getId('shareIcon')}, {tag:'span', html:"Share secret with family members and associates"}]}]}
94 ]}]} 92 ]}]}
95 ]} 93 ]}
96 ]); 94 ]);
97 95
98 Clipperz.PM.UI.Canvas.features.store(this.getElement('storeIcon'), "#ffffff"); 96 Clipperz.PM.UI.Canvas.features.store(this.getElement('storeIcon'), "#ffffff");
99 Clipperz.PM.UI.Canvas.features.protect(this.getElement('protectIcon'), "#ffffff"); 97 Clipperz.PM.UI.Canvas.features.protect(this.getElement('protectIcon'), "#ffffff");
100 Clipperz.PM.UI.Canvas.features.directLogin(this.getElement('directLoginIcon'), "#ffffff"); 98 Clipperz.PM.UI.Canvas.features.directLogin(this.getElement('directLoginIcon'), "#ffffff");
101 Clipperz.PM.UI.Canvas.features.share(this.getElement('shareIcon'), "#ffffff", "#ffffff", "#ff0000"); 99 Clipperz.PM.UI.Canvas.features.share(this.getElement('shareIcon'), "#ffffff", "#ffffff", "#ff0000");
102 100
103 MochiKit.Signal.connect(this.getElement('newsGrip'), 'onclick', this, 'toggleTips'); 101 MochiKit.Signal.connect(this.getElement('newsGrip'), 'onclick', this, 'toggleTips');
104 MochiKit.Signal.connect(this.getElement('iframe'), 'onload', this, 'handleIframeDidLoad'); 102 MochiKit.Signal.connect(this.getElement('iframe'), 'onload', this, 'handleIframeDidLoad');
105 this.setLogoDefaultColors(); 103 this.setLogoDefaultColors();
106 }, 104 },
107 105
108 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
109 107
110 'switchToLoggedMode': function() { 108 'switchToLoggedMode': function() {
111 // MochiKit.Style.addElementClass(this.element(), 'logged'); 109 // MochiKit.Style.addElementClass(this.element(), 'logged');
112 MochiKit.Style.hideElement('featureTabs'); 110 MochiKit.Style.hideElement('featureTabs');
113 }, 111 },
114 112
115 //------------------------------------------------------------------------- 113 //-------------------------------------------------------------------------
116 114
117 'animationDuration': function () { 115 'animationDuration': function () {
118 return this._animationDuration; 116 return this._animationDuration;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js
index 987e51e..5eb0c1f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Common.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Common.Components');
27 25
28Clipperz.PM.UI.Web.Components.PasswordTooltip = function(args) { 26Clipperz.PM.UI.Web.Components.PasswordTooltip = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.PasswordTooltip.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.PasswordTooltip.superclass.constructor.apply(this, arguments);
32 30
33 this._referenceElement = args.referenceElement|| Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._referenceElement = args.referenceElement|| Clipperz.Base.exception.raise('MandatoryParameter');
34 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._text = args.text || Clipperz.Base.exception.raise('MandatoryParameter');
35 33
36 this._boxDimensions = null; 34 this._boxDimensions = null;
37 this._isVisible = false; 35 this._isVisible = false;
38 36
39 this.renderSelf(); 37 this.renderSelf();
40 38
41 return this; 39 return this;
42} 40}
43 41
44//============================================================================= 42//=============================================================================
45 43
46Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PasswordTooltip, Clipperz.PM.UI.Common.Components.BaseComponent, { 44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PasswordTooltip, Clipperz.PM.UI.Common.Components.BaseComponent, {
47 45
48 //------------------------------------------------------------------------- 46 //-------------------------------------------------------------------------
49 47
50 'toString': function () { 48 'toString': function () {
51 return "Clipperz.PM.UI.Web.Components.PasswordTooltip component"; 49 return "Clipperz.PM.UI.Web.Components.PasswordTooltip component";
52 }, 50 },
53 51
54 //------------------------------------------------------------------------- 52 //-------------------------------------------------------------------------
55 53
56 'referenceElement': function () { 54 'referenceElement': function () {
57 return this._referenceElement; 55 return this._referenceElement;
58 }, 56 },
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'text': function () { 60 'text': function () {
63 return this._text; 61 return this._text;
64 }, 62 },
65 63
66 'setText': function (aValue) { 64 'setText': function (aValue) {
67 this._text = aValue; 65 this._text = aValue;
68 }, 66 },
69 67
70 //------------------------------------------------------------------------- 68 //-------------------------------------------------------------------------
71 69
72 'isVisible': function () { 70 'isVisible': function () {
73 return this._isVisible; 71 return this._isVisible;
74 }, 72 },
75 73
76 'setIsVisible': function (aValue) { 74 'setIsVisible': function (aValue) {
77 this._isVisible = aValue; 75 this._isVisible = aValue;
78 }, 76 },
79 77
80 //------------------------------------------------------------------------- 78 //-------------------------------------------------------------------------
81 79
82 'renderSelf': function() { 80 'renderSelf': function() {
83 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'passwordTooltip', children:[ 81 this.append(MochiKit.DOM.getElement('Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode'), {tag:'div', id:this.getId('tooltip'), cls:'passwordTooltip', children:[
84 {tag:'div', id:this.getId('body'), cls:'passwordTooltip_body', children:[ 82 {tag:'div', id:this.getId('body'), cls:'passwordTooltip_body', children:[
85 {tag:'div', cls:'passwordTooltip_text', children:[ 83 {tag:'div', cls:'passwordTooltip_text', children:[
86 {tag:'span', html:this.text()} 84 {tag:'span', html:this.text()}
87 ]}, 85 ]},
88 {tag:'div', id:this.getId('footer'), cls:'passwordTooltip_footer'} 86 {tag:'div', id:this.getId('footer'), cls:'passwordTooltip_footer'}
89 ]}, 87 ]},
90 {tag:'div', id:this.getId('arrow'), cls:'passwordTooltip_arrow'} 88 {tag:'div', id:this.getId('arrow'), cls:'passwordTooltip_arrow'}
91 ]}); 89 ]});
92 90
93 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body')); 91 this._boxDimensions = MochiKit.Style.getElementDimensions(this.getId('body'));
94 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h; 92 // this._boxDimensions.h += MochiKit.Style.getElementDimensions(this.getId('footer')).h;
95 93
96 MochiKit.Style.hideElement(this.displayElement()); 94 MochiKit.Style.hideElement(this.displayElement());
97 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show'); 95 MochiKit.Signal.connect(this.element(), 'onmouseenter', this, 'show');
98 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide'); 96 MochiKit.Signal.connect(this.element(), 'onmouseleave', this, 'hide');
99 }, 97 },
100 98
101 //----------------------------------------------------- 99 //-----------------------------------------------------
102 100
103 'displayElement': function() { 101 'displayElement': function() {
104 return this.getElement('tooltip'); 102 return this.getElement('tooltip');
105 }, 103 },
106 104
107 //------------------------------------------------------------------------- 105 //-------------------------------------------------------------------------
108 106
109 'boxDimensions': function () { 107 'boxDimensions': function () {
110 return this._boxDimensions; 108 return this._boxDimensions;
111 }, 109 },
112 110
113 //------------------------------------------------------------------------- 111 //-------------------------------------------------------------------------
114 112
115 'show': function () { 113 'show': function () {
116 var elementSizeAndPosition; 114 var elementSizeAndPosition;
117 var arrowPosition; 115 var arrowPosition;
118 var bodyPosition; 116 var bodyPosition;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js
index 69c1ede..ad8d677 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js
@@ -1,211 +1,208 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.RulerComponent = function(args) { 26Clipperz.PM.UI.Web.Components.RulerComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 Clipperz.PM.UI.Web.Components.RulerComponent.superclass.constructor.apply(this, arguments); 28 Clipperz.PM.UI.Web.Components.RulerComponent.superclass.constructor.apply(this, arguments);
31 29
32 this._translationContext = args.translationContext|| Clipperz.Base.exception.raise('MandatoryParameter'); 30 this._translationContext = args.translationContext|| Clipperz.Base.exception.raise('MandatoryParameter');
33 // this._steps = args.steps || Clipperz.Base.exception.raise('MandatoryParameter'); 31 // this._steps = args.steps || Clipperz.Base.exception.raise('MandatoryParameter');
34 this._steps = args.steps; 32 this._steps = args.steps;
35 33
36 this._currentStep = -1; 34 this._currentStep = -1;
37 35
38 return this; 36 return this;
39} 37}
40 38
41//============================================================================= 39//=============================================================================
42 40
43Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.RulerComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 41Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.RulerComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'toString': function () { 45 'toString': function () {
48 return "Clipperz.PM.UI.Web.Components.RulerComponent component"; 46 return "Clipperz.PM.UI.Web.Components.RulerComponent component";
49 }, 47 },
50 48
51 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
52 50
53 'resetStatus': function (args) { 51 'resetStatus': function (args) {
54 args = args || {}; 52 args = args || {};
55 53
56 if (this.currentStep() != 0) { 54 if (this.currentStep() != 0) {
57 var shouldAnimateTransition; 55 var shouldAnimateTransition;
58 56
59 shouldAnimateTransition = args.animateTransition || false; 57 shouldAnimateTransition = args.animateTransition || false;
60 58
61 if (shouldAnimateTransition) { 59 if (shouldAnimateTransition) {
62 this.moveToFirstStep(MochiKit.Base.method(this, 'cursorMoved')); 60 this.moveToFirstStep(MochiKit.Base.method(this, 'cursorMoved'));
63 } else { 61 } else {
64 this._currentStep = 0; 62 this._currentStep = 0;
65 this.cursorMoved(); 63 this.cursorMoved();
66 } 64 }
67 } 65 }
68 }, 66 },
69 67
70 //------------------------------------------------------------------------- 68 //-------------------------------------------------------------------------
71 69
72 'translationContext': function () { 70 'translationContext': function () {
73 return this._translationContext; 71 return this._translationContext;
74 }, 72 },
75 73
76 'steps': function () { 74 'steps': function () {
77 return this._steps; 75 return this._steps;
78 }, 76 },
79 77
80 'setSteps': function (aValue) { 78 'setSteps': function (aValue) {
81 this._steps = aValue; 79 this._steps = aValue;
82 this.renderStepsComponents(); 80 this.renderStepsComponents();
83 this.resetStatus(); 81 this.resetStatus();
84 }, 82 },
85 83
86 'translatedStepDescription': function (aStep) { 84 'translatedStepDescription': function (aStep) {
87 return Clipperz.PM.Strings.getValue(this.translationContext() + '.' + aStep + '.' + 'name'); 85 return Clipperz.PM.Strings.getValue(this.translationContext() + '.' + aStep + '.' + 'name');
88 }, 86 },
89 87
90 //------------------------------------------------------------------------- 88 //-------------------------------------------------------------------------
91 89
92 'renderSelf': function(/*aContainer, aPosition*/) { 90 'renderSelf': function(/*aContainer, aPosition*/) {
93 this.setElement(this.append(MochiKit.DOM.currentDocument().body, [ 91 this.setElement(this.append(MochiKit.DOM.currentDocument().body, [
94 {tag:'div', id:this.getId('rulerWrapper'), cls:'rulerWrapper fixed', children:[ 92 {tag:'div', id:this.getId('rulerWrapper'), cls:'rulerWrapper fixed', children:[
95 {tag:'div', cls:'ruler', children:[ 93 {tag:'div', cls:'ruler', children:[
96 {tag:'a', href:'#', id:this.getId('exit'), cls:'exit', html:'&nbsp;'}, 94 {tag:'a', href:'#', id:this.getId('exit'), cls:'exit', html:'&nbsp;'},
97 {tag:'a', href:'#', id:this.getId('smallPreviousButton'),cls:'smallButton previous', html:'&nbsp;'}, 95 {tag:'a', href:'#', id:this.getId('smallPreviousButton'),cls:'smallButton previous', html:'&nbsp;'},
98 {tag:'a', href:'#', id:this.getId('smallNextButton'), cls:'smallButton next', html:'&nbsp;'}, 96 {tag:'a', href:'#', id:this.getId('smallNextButton'), cls:'smallButton next', html:'&nbsp;'},
99 {tag:'div', cls:'marker', id:this.getId('marker'), children:[ 97 {tag:'div', cls:'marker', id:this.getId('marker'), children:[
100 {tag:'div', cls:'previous', id:this.getId('previousButton')}, 98 {tag:'div', cls:'previous', id:this.getId('previousButton')},
101 {tag:'div', cls:'markerBody'}, 99 {tag:'div', cls:'markerBody'},
102 {tag:'div', cls:'next', id:this.getId('nextButton')} 100 {tag:'div', cls:'next', id:this.getId('nextButton')}
103 ]}, 101 ]},
104 {tag:'div', cls:'steps', id:this.getId('stepsFrame')}, 102 {tag:'div', cls:'steps', id:this.getId('stepsFrame')},
105 // {tag:'div', cls:'steps' + ' ' + 'steps_' + this.steps().length, children:[ 103 // {tag:'div', cls:'steps' + ' ' + 'steps_' + this.steps().length, children:[
106 // {tag:'ul', id:this.getId('steps'), children:MochiKit.Base.map(MochiKit.Base.bind(function (aStep) { return {tag:'li', children:[{tag:'span', html:this.translatedStepDescription(aStep)}]}}, this), this.steps())} 104 // {tag:'ul', id:this.getId('steps'), children:MochiKit.Base.map(MochiKit.Base.bind(function (aStep) { return {tag:'li', children:[{tag:'span', html:this.translatedStepDescription(aStep)}]}}, this), this.steps())}
107 // ]}, 105 // ]},
108 {tag:'div', cls:'dots', id:this.getId('dotsFrame')} 106 {tag:'div', cls:'dots', id:this.getId('dotsFrame')}
109 // {tag:'div', cls:'dots' + ' ' + 'steps_' + this.steps().length, children:[ 107 // {tag:'div', cls:'dots' + ' ' + 'steps_' + this.steps().length, children:[
110 // {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}}, this.steps())} 108 // {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}}, this.steps())}
111 // ]} 109 // ]}
112 ]} 110 ]}
113 ]} 111 ]}
114 ])); 112 ]));
115//console.log("ELEMENT", this.element());
116 113
117 MochiKit.Signal.connect(this.getElement('exit'), 'onclick', this, 'handleExit'); 114 MochiKit.Signal.connect(this.getElement('exit'), 'onclick', this, 'handleExit');
118 115
119 MochiKit.Signal.connect(this.getElement('previousButton'), 'onclick', this, 'handlePrevious'); 116 MochiKit.Signal.connect(this.getElement('previousButton'), 'onclick', this, 'handlePrevious');
120 MochiKit.Signal.connect(this.getElement('smallPreviousButton'),'onclick', this, 'handlePrevious'); 117 MochiKit.Signal.connect(this.getElement('smallPreviousButton'),'onclick', this, 'handlePrevious');
121 118
122 MochiKit.Signal.connect(this.getElement('nextButton'), 'onclick', this, 'handleNext'); 119 MochiKit.Signal.connect(this.getElement('nextButton'), 'onclick', this, 'handleNext');
123 MochiKit.Signal.connect(this.getElement('smallNextButton'), 'onclick', this, 'handleNext'); 120 MochiKit.Signal.connect(this.getElement('smallNextButton'), 'onclick', this, 'handleNext');
124 121
125 this.enablePrevious(false); 122 this.enablePrevious(false);
126 this.enableNext(false); 123 this.enableNext(false);
127 124
128 // this.cursorMoved(); 125 // this.cursorMoved();
129 }, 126 },
130 127
131 //......................................................................... 128 //.........................................................................
132 129
133 'renderStepsComponents': function () { 130 'renderStepsComponents': function () {
134 varstepsFrame; 131 varstepsFrame;
135 var dotsFrame; 132 var dotsFrame;
136 133
137 stepsFrames = this.getElement('stepsFrame'); 134 stepsFrames = this.getElement('stepsFrame');
138 MochiKit.DOM.setElementClass(stepsFrames, 'steps'); 135 MochiKit.DOM.setElementClass(stepsFrames, 'steps');
139 MochiKit.DOM.addElementClass(stepsFrames, 'steps_' + this.steps().length); 136 MochiKit.DOM.addElementClass(stepsFrames, 'steps_' + this.steps().length);
140 137
141 stepsFrames.innerHTML = ""; 138 stepsFrames.innerHTML = "";
142 this.append(stepsFrames, {tag:'ul', id:this.getId('steps'), children:MochiKit.Base.map( 139 this.append(stepsFrames, {tag:'ul', id:this.getId('steps'), children:MochiKit.Base.map(
143 MochiKit.Base.bind(function (aStep) { return {tag:'li', children:[{tag:'span', html:this.translatedStepDescription(aStep)}]}}, this), 140 MochiKit.Base.bind(function (aStep) { return {tag:'li', children:[{tag:'span', html:this.translatedStepDescription(aStep)}]}}, this),
144 this.steps())} 141 this.steps())}
145 ); 142 );
146 143
147 dotsFrames = this.getElement('dotsFrame'); 144 dotsFrames = this.getElement('dotsFrame');
148 MochiKit.DOM.setElementClass(dotsFrames, 'dots'); 145 MochiKit.DOM.setElementClass(dotsFrames, 'dots');
149 MochiKit.DOM.addElementClass(dotsFrames, 'steps_' + this.steps().length); 146 MochiKit.DOM.addElementClass(dotsFrames, 'steps_' + this.steps().length);
150 147
151 dotsFrames.innerHTML = ""; 148 dotsFrames.innerHTML = "";
152 this.append(dotsFrames, {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map( 149 this.append(dotsFrames, {tag:'ul', id:this.getId('dots'), children:MochiKit.Base.map(
153 function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}; }, 150 function (aStep) { return {tag:'li', children:[{tag:'span', html:'*'}]}; },
154 this.steps())} 151 this.steps())}
155 ); 152 );
156 }, 153 },
157 154
158 //------------------------------------------------------------------------- 155 //-------------------------------------------------------------------------
159 156
160 'handleExit': function (anEvent) { 157 'handleExit': function (anEvent) {
161 anEvent.preventDefault(); 158 anEvent.preventDefault();
162 159
163 MochiKit.Signal.signal(this, 'exit'); 160 MochiKit.Signal.signal(this, 'exit');
164 }, 161 },
165 162
166 //------------------------------------------------------------------------- 163 //-------------------------------------------------------------------------
167 164
168 'handlePrevious': function (anEvent) { 165 'handlePrevious': function (anEvent) {
169 anEvent.preventDefault(); 166 anEvent.preventDefault();
170 167
171 // if (!MochiKit.DOM.hasElementClass(this.getElement('previousButton'), 'disabled')) { 168 // if (!MochiKit.DOM.hasElementClass(this.getElement('previousButton'), 'disabled')) {
172 // this.moveBackward(); 169 // this.moveBackward();
173 // } 170 // }
174 171
175 MochiKit.Signal.signal(this, 'moveBackward'); 172 MochiKit.Signal.signal(this, 'moveBackward');
176 }, 173 },
177 174
178 'handleNext': function (anEvent) { 175 'handleNext': function (anEvent) {
179 anEvent.preventDefault(); 176 anEvent.preventDefault();
180 177
181 // if (!MochiKit.DOM.hasElementClass(this.getElement('nextButton'), 'disabled')) { 178 // if (!MochiKit.DOM.hasElementClass(this.getElement('nextButton'), 'disabled')) {
182 // this.moveForward(); 179 // this.moveForward();
183 // } 180 // }
184 181
185 MochiKit.Signal.signal(this, 'moveForward'); 182 MochiKit.Signal.signal(this, 'moveForward');
186 }, 183 },
187 184
188 //------------------------------------------------------------------------- 185 //-------------------------------------------------------------------------
189 186
190 'currentStep': function () { 187 'currentStep': function () {
191 return this._currentStep; 188 return this._currentStep;
192 }, 189 },
193 190
194 'markerInitialOffset': function () { 191 'markerInitialOffset': function () {
195 return -246; 192 return -246;
196 }, 193 },
197 194
198 'markerStepOffset': function () { 195 'markerStepOffset': function () {
199 return 410 / (this.steps().length - 1); 196 return 410 / (this.steps().length - 1);
200 // return 100; 197 // return 100;
201 }, 198 },
202 199
203 //------------------------------------------------------------------------- 200 //-------------------------------------------------------------------------
204 201
205 'moveToFirstStep': function (aCallback) { 202 'moveToFirstStep': function (aCallback) {
206 varstepsToMove; 203 varstepsToMove;
207 204
208 stepsToMove = this._currentStep; 205 stepsToMove = this._currentStep;
209 this._currentStep = 0; 206 this._currentStep = 0;
210 207
211 this.enablePrevious(false); 208 this.enablePrevious(false);
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js
index 666afe9..edcdb62 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.TabSidePanel = function(args) { 26Clipperz.PM.UI.Web.Components.TabSidePanel = function(args) {
29 args = args || {}; 27 args = args || {};
30 Clipperz.PM.UI.Web.Components.TabSidePanel.superclass.constructor.call(this, args); 28 Clipperz.PM.UI.Web.Components.TabSidePanel.superclass.constructor.call(this, args);
31 29
32 this._element = args.element || null; 30 this._element = args.element || null;
33 31
34 this._slots = { 32 this._slots = {
35 }; 33 };
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TabSidePanel, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TabSidePanel, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'toString': function () { 44 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.TabSidePanel component"; 45 return "Clipperz.PM.UI.Web.Components.TabSidePanel component";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'deselectAllTabs': function() { 50 'deselectAllTabs': function() {
53 var tabListItems; 51 var tabListItems;
54 52
55 tabListItems = [ 53 tabListItems = [
56 'cardsLI', 54 'cardsLI',
57 // 'directLoginLI', 55 // 'directLoginLI',
58 'accountLI', 56 'accountLI',
59 'dataLI', 57 'dataLI',
60 'toolsLI' 58 'toolsLI'
61 ]; 59 ];
62 60
63//Clipperz.log("=== TabSidePanel.tabSelected anEvent.src().id", anEvent.src().id); 61//Clipperz.log("=== TabSidePanel.tabSelected anEvent.src().id", anEvent.src().id);
64 for (var i in tabListItems) { 62 for (var i in tabListItems) {
65//Clipperz.log("=== TabSidePanel.tabSelected aTabListItem", tabListItems[i]); 63//Clipperz.log("=== TabSidePanel.tabSelected aTabListItem", tabListItems[i]);
66 MochiKit.DOM.removeElementClass(this.getId(tabListItems[i]), 'selected'); 64 MochiKit.DOM.removeElementClass(this.getId(tabListItems[i]), 'selected');
67 } 65 }
68 }, 66 },
69 67
70 'selectTab': function(aTabName) { 68 'selectTab': function(aTabName) {
71 this.deselectAllTabs(); 69 this.deselectAllTabs();
72 MochiKit.DOM.addElementClass(this.getId(this.listItemIdForTabNamed(aTabName)), 'selected'); 70 MochiKit.DOM.addElementClass(this.getId(this.listItemIdForTabNamed(aTabName)), 'selected');
73 MochiKit.Signal.signal(this, 'tabSelected', aTabName); 71 MochiKit.Signal.signal(this, 'tabSelected', aTabName);
74 }, 72 },
75 73
76 'tabNameForAnchorId': function(anId) { 74 'tabNameForAnchorId': function(anId) {
77 var result; 75 var result;
78 76
79 switch(anId) { 77 switch(anId) {
80 case 'cards_tabSidePanel': 78 case 'cards_tabSidePanel':
81 result = 'cards'; 79 result = 'cards';
82 break; 80 break;
83 // case 'directLogins_tabSidePanel': 81 // case 'directLogins_tabSidePanel':
84 // result = 'directLogins'; 82 // result = 'directLogins';
85 // break; 83 // break;
86 case 'account_tabSidePanel': 84 case 'account_tabSidePanel':
87 result = 'account'; 85 result = 'account';
88 break; 86 break;
89 case 'data_tabSidePanel': 87 case 'data_tabSidePanel':
90 result = 'data'; 88 result = 'data';
91 break; 89 break;
92 case 'tools_tabSidePanel': 90 case 'tools_tabSidePanel':
93 result = 'tools'; 91 result = 'tools';
94 break; 92 break;
95 } 93 }
96 94
97 return result; 95 return result;
98 }, 96 },
99 97
100 'listItemIdForTabNamed': function(aTabName) { 98 'listItemIdForTabNamed': function(aTabName) {
101 var result; 99 var result;
102 100
103 switch (aTabName) { 101 switch (aTabName) {
104 case 'cards': 102 case 'cards':
105 result = 'cardsLI'; 103 result = 'cardsLI';
106 break; 104 break;
107 // case 'directLogins': 105 // case 'directLogins':
108 // result = 'directLoginLI'; 106 // result = 'directLoginLI';
109 // break; 107 // break;
110 case 'account': 108 case 'account':
111 result = 'accountLI'; 109 result = 'accountLI';
112 break; 110 break;
113 case 'data': 111 case 'data':
114 result = 'dataLI'; 112 result = 'dataLI';
115 break; 113 break;
116 case 'tools': 114 case 'tools':
117 result = 'toolsLI'; 115 result = 'toolsLI';
118 break; 116 break;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js
index 3dc9ce9..9b1796a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js
@@ -1,50 +1,48 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28//############################################################################# 26//#############################################################################
29 27
30Clipperz.PM.UI.Web.Components.TextColumnManager = function(args) { 28Clipperz.PM.UI.Web.Components.TextColumnManager = function(args) {
31 args = args || {}; 29 args = args || {};
32 Clipperz.PM.UI.Web.Components.TextColumnManager.superclass.constructor.call(this, args); 30 Clipperz.PM.UI.Web.Components.TextColumnManager.superclass.constructor.call(this, args);
33 31
34 return this; 32 return this;
35} 33}
36 34
37//============================================================================= 35//=============================================================================
38 36
39Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TextColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, { 37Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.TextColumnManager, Clipperz.PM.UI.Web.Components.ColumnManager, {
40 38
41 'toString': function () { 39 'toString': function () {
42 return "Clipperz.PM.UI.Web.Components.TextColumnManager component"; 40 return "Clipperz.PM.UI.Web.Components.TextColumnManager component";
43 }, 41 },
44 42
45 //----------------------------------------------------- 43 //-----------------------------------------------------
46 44
47 '__syntax_fix__' : 'syntax fix' 45 '__syntax_fix__' : 'syntax fix'
48 46
49}); 47});
50 48
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
index 0fa369f..034ed91 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js
@@ -1,110 +1,108 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.ToolsPanel = function(args) { 26Clipperz.PM.UI.Web.Components.ToolsPanel = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.ToolsPanel.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.ToolsPanel.superclass.constructor.apply(this, arguments);
32 30
33 this._initiallySelectedTab = args.selected || 'PASSWORD_GENERATOR'; 31 this._initiallySelectedTab = args.selected || 'PASSWORD_GENERATOR';
34 this._tabPanelControllerConfiguration = { 32 this._tabPanelControllerConfiguration = {
35 'PASSWORD_GENERATOR': { 33 'PASSWORD_GENERATOR': {
36 tab:'passwordGeneratorTab', 34 tab:'passwordGeneratorTab',
37 panel:'passwordGeneratorPanel' 35 panel:'passwordGeneratorPanel'
38 }, 36 },
39 'BOOKMARKLET': { 37 'BOOKMARKLET': {
40 tab:'bookmarkletTab', 38 tab:'bookmarkletTab',
41 panel:'bookmarkletPanel' 39 panel:'bookmarkletPanel'
42 }, 40 },
43 'COMPACT_EDITION': { 41 'COMPACT_EDITION': {
44 tab:'compactEditionTab', 42 tab:'compactEditionTab',
45 panel:'compactEditionPanel' 43 panel:'compactEditionPanel'
46 }, 44 },
47 'HTTP_AUTH': { 45 'HTTP_AUTH': {
48 tab:'httpAuthTab', 46 tab:'httpAuthTab',
49 panel:'httpAuthPanel' 47 panel:'httpAuthPanel'
50 } 48 }
51 }; 49 };
52 50
53 return this; 51 return this;
54} 52}
55 53
56//============================================================================= 54//=============================================================================
57 55
58Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ToolsPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, { 56Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.ToolsPanel, Clipperz.PM.UI.Common.Components.TabPanelComponent, {
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'toString': function () { 60 'toString': function () {
63 return "Clipperz.PM.UI.Web.Components.ToolsPanel component"; 61 return "Clipperz.PM.UI.Web.Components.ToolsPanel component";
64 }, 62 },
65 63
66 //------------------------------------------------------------------------- 64 //-------------------------------------------------------------------------
67 65
68 'renderSelf': function(/*aContainer, aPosition*/) { 66 'renderSelf': function(/*aContainer, aPosition*/) {
69 this.append(this.element(), [ 67 this.append(this.element(), [
70 {tag:'div', cls:'header', children:[ 68 {tag:'div', cls:'header', children:[
71 {tag:'div', cls:'subPanelTabs', children:[ 69 {tag:'div', cls:'subPanelTabs', children:[
72 {tag:'ul', children:[ 70 {tag:'ul', children:[
73 {tag:'li', id:this.getId('passwordGeneratorTab'),children:[{tag:'a', href:'#', html:'Password generator'}], cls:'first'}, 71 {tag:'li', id:this.getId('passwordGeneratorTab'),children:[{tag:'a', href:'#', html:'Password generator'}], cls:'first'},
74 {tag:'li', id:this.getId('bookmarkletTab'), children:[{tag:'a', href:'#', html:'Bookmarklet'}]}, 72 {tag:'li', id:this.getId('bookmarkletTab'), children:[{tag:'a', href:'#', html:'Bookmarklet'}]},
75 {tag:'li', id:this.getId('compactEditionTab'), children:[{tag:'a', href:'#', html:'Compact edition'}]}, 73 {tag:'li', id:this.getId('compactEditionTab'), children:[{tag:'a', href:'#', html:'Compact edition'}]},
76 {tag:'li', id:this.getId('httpAuthTab'), children:[{tag:'a', href:'#', html:'HTTP Auth'}]} 74 {tag:'li', id:this.getId('httpAuthTab'), children:[{tag:'a', href:'#', html:'HTTP Auth'}]}
77 ]} 75 ]}
78 ]} 76 ]}
79 ]}, 77 ]},
80 {tag:'div', cls:'body', children:[ 78 {tag:'div', cls:'body', children:[
81 {tag:'div', cls:'accountPanel', children:[ 79 {tag:'div', cls:'accountPanel', children:[
82 {tag:'div', cls:'subPanelContent', children:[ 80 {tag:'div', cls:'subPanelContent', children:[
83 {tag:'ul', children:[ 81 {tag:'ul', children:[
84 {tag:'li', id:this.getId('passwordGeneratorPanel'),children:[ 82 {tag:'li', id:this.getId('passwordGeneratorPanel'),children:[
85 // {tag:'h3', html:"Password generator"} 83 // {tag:'h3', html:"Password generator"}
86 ]}, 84 ]},
87 {tag:'li', id:this.getId('bookmarkletPanel'),children:[ 85 {tag:'li', id:this.getId('bookmarkletPanel'),children:[
88 // {tag:'h3', html:"Bookmarklet"} 86 // {tag:'h3', html:"Bookmarklet"}
89 ]}, 87 ]},
90 {tag:'li', id:this.getId('compactEditionPanel'), children:[ 88 {tag:'li', id:this.getId('compactEditionPanel'), children:[
91 // {tag:'h3', html:"Compact edition"} 89 // {tag:'h3', html:"Compact edition"}
92 ]}, 90 ]},
93 {tag:'li', id:this.getId('httpAuthPanel'), children:[ 91 {tag:'li', id:this.getId('httpAuthPanel'), children:[
94 // {tag:'h3', html:"HTTP Auth"} 92 // {tag:'h3', html:"HTTP Auth"}
95 ]} 93 ]}
96 ]} 94 ]}
97 ]} 95 ]}
98 ]} 96 ]}
99 ]}, 97 ]},
100 {tag:'div', cls:'footer'} 98 {tag:'div', cls:'footer'}
101 ]); 99 ]);
102 100
103 this.tabPanelController().setup({selected:this.initiallySelectedTab()}); 101 this.tabPanelController().setup({selected:this.initiallySelectedTab()});
104 }, 102 },
105 103
106 //------------------------------------------------------------------------- 104 //-------------------------------------------------------------------------
107 105
108 106
109 __syntaxFix__: "syntax fix" 107 __syntaxFix__: "syntax fix"
110}); 108});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js
index 21ccf2a..fe46729 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js
@@ -1,181 +1,178 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.UnlockPasswordComponent = function(args) { 26Clipperz.PM.UI.Web.Components.UnlockPasswordComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.constructor.apply(this, arguments);
32 30
33 this._openFromElement = args.openFromElement || null; 31 this._openFromElement = args.openFromElement || null;
34 this._onOkCloseToElement = args.onOkCloseToElement || null; 32 this._onOkCloseToElement = args.onOkCloseToElement || null;
35 this._onCancelCloseToElement = args.onCancelCloseToElement|| null; 33 this._onCancelCloseToElement = args.onCancelCloseToElement|| null;
36 34
37 this._progressBarComponent = null; 35 this._progressBarComponent = null;
38 36
39 return this; 37 return this;
40} 38}
41 39
42//============================================================================= 40//=============================================================================
43 41
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent, Clipperz.PM.UI.Common.Components.SimpleMessagePanel, {
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'toString': function () { 46 'toString': function () {
49 return "Clipperz.PM.UI.Web.Components.UnlockPasswordComponent component"; 47 return "Clipperz.PM.UI.Web.Components.UnlockPasswordComponent component";
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'getPassphrase': function () { 52 'getPassphrase': function () {
55 /* var deferredResult; 53 /* var deferredResult;
56 54
57 if (this.passphrase() == null) { 55 if (this.passphrase() == null) {
58 this.deferredShowModal({'openFromElement': this.openFromElement()}); 56 this.deferredShowModal({'openFromElement': this.openFromElement()});
59 deferredResult = this.deferred(); 57 deferredResult = this.deferred();
60 } else { 58 } else {
61 deferredResult = MochiKit.Async.succeed(this.passphrase()); 59 deferredResult = MochiKit.Async.succeed(this.passphrase());
62 } 60 }
63 61
64 return deferredResult; 62 return deferredResult;
65*/ 63*/
66 64
67 this.deferredShowModal({'openFromElement': this.openFromElement()}); 65 this.deferredShowModal({'openFromElement': this.openFromElement()});
68 66
69 return this.deferred(); 67 return this.deferred();
70 }, 68 },
71 69
72 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
73 71
74 'deferredShowModal': function (someParameters) { 72 'deferredShowModal': function (someParameters) {
75 return Clipperz.Async.callbacks("UnlockPasswordComponent.deferredShowModal", [ 73 return Clipperz.Async.callbacks("UnlockPasswordComponent.deferredShowModal", [
76 MochiKit.Base.bind(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.deferredShowModal, this, someParameters), 74 MochiKit.Base.bind(Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.deferredShowModal, this, someParameters),
77 MochiKit.Base.method(this, 'getElement', 'passphrase'), 75 MochiKit.Base.method(this, 'getElement', 'passphrase'),
78 MochiKit.Base.methodcaller('focus') 76 MochiKit.Base.methodcaller('focus')
79 ], {trace:false}) 77 ], {trace:false})
80 }, 78 },
81 79
82 //------------------------------------------------------------------------- 80 //-------------------------------------------------------------------------
83 81
84 'openFromElement': function () { 82 'openFromElement': function () {
85 return this._openFromElement; 83 return this._openFromElement;
86 }, 84 },
87 85
88 'onOkCloseToElement': function () { 86 'onOkCloseToElement': function () {
89 return this._onOkCloseToElement; 87 return this._onOkCloseToElement;
90 }, 88 },
91 89
92 'onCancelCloseToElement': function () { 90 'onCancelCloseToElement': function () {
93 return this._onCancelCloseToElement; 91 return this._onCancelCloseToElement;
94 }, 92 },
95 93
96 //------------------------------------------------------------------------- 94 //-------------------------------------------------------------------------
97 95
98 'renderSelf': function() { 96 'renderSelf': function() {
99 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.renderSelf.apply(this, arguments); 97 Clipperz.PM.UI.Web.Components.UnlockPasswordComponent.superclass.renderSelf.apply(this, arguments);
100 98
101 this.append(this.getElement('container'), {tag:'div', cls:'passphrase', children: [ 99 this.append(this.getElement('container'), {tag:'div', cls:'passphrase', children: [
102 // {tag:'form', id:this.getId('passphraseForm'), children:[ 100 // {tag:'form', id:this.getId('passphraseForm'), children:[
103 {tag:'input', id:this.getId('passphrase'), type:'password', name:'passphrase', value:''} 101 {tag:'input', id:this.getId('passphrase'), type:'password', name:'passphrase', value:''}
104 // ]} 102 // ]}
105 ]}); 103 ]});
106 104
107 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn', this, 'userSuccessfullyLoggedInHandler'); 105 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn', this, 'userSuccessfullyLoggedInHandler');
108 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userLoginFailed', this, 'userLoginFailedHandler'); 106 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userLoginFailed', this, 'userLoginFailedHandler');
109 107
110 108
111 // MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('passphrase'), 'focus')); 109 // MochiKit.Async.callLater(0.1, MochiKit.Base.method(this.getElement('passphrase'), 'focus'));
112 // this.getElement('passphrase').select(); 110 // this.getElement('passphrase').select();
113 }, 111 },
114 112
115 //------------------------------------------------------------------------- 113 //-------------------------------------------------------------------------
116 114
117 'showProgressBar': function () { 115 'showProgressBar': function () {
118 varprogressBarElement; 116 varprogressBarElement;
119 117
120 this.getElement('container').innerHTML = ''; 118 this.getElement('container').innerHTML = '';
121 119
122 progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'}); 120 progressBarElement = this.append(this.getElement('container'), {tag:'div', cls:'progressBarWrapper'});
123 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement})); 121 this.addComponent(new Clipperz.PM.UI.Common.Components.ProgressBar({'element':progressBarElement}));
124 122
125 this.setButtons([{text:"Cancel", result:'CANCEL'}]); 123 this.setButtons([{text:"Cancel", result:'CANCEL'}]);
126 }, 124 },
127 125
128 //------------------------------------------------------------------------- 126 //-------------------------------------------------------------------------
129 127
130 'showFailure': function () { 128 'showFailure': function () {
131 this.setType('ALERT'); 129 this.setType('ALERT');
132 this.setTitle("Login failed"); 130 this.setTitle("Login failed");
133 this.setText("Wrong passphrase; the unlock has failed."); 131 this.setText("Wrong passphrase; the unlock has failed.");
134 this.getElement('container').innerHTML = ''; 132 this.getElement('container').innerHTML = '';
135 this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]); 133 this.setButtons([{text:"Close", result:'CANCEL', isDefault:true}]);
136 }, 134 },
137 135
138 //------------------------------------------------------------------------- 136 //-------------------------------------------------------------------------
139 137
140 'closeOk': function () { 138 'closeOk': function () {
141 var passphrase; 139 var passphrase;
142 140
143 passphrase = this.getElement('passphrase').value; 141 passphrase = this.getElement('passphrase').value;
144 this.showProgressBar(); 142 this.showProgressBar();
145 // this.deferred().callback(passphrase); 143 // this.deferred().callback(passphrase);
146 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback', passphrase)); 144 MochiKit.Async.callLater(0.5, MochiKit.Base.method(this.deferred(), 'callback', passphrase));
147 this._deferred = null; 145 this._deferred = null;
148 }, 146 },
149 147
150 'closeCancel': function () { 148 'closeCancel': function () {
151 this.deferredHideModal({closeToElement:this.onCancelCloseToElement()}); 149 this.deferredHideModal({closeToElement:this.onCancelCloseToElement()});
152 this.deferred().cancel(); 150 this.deferred().cancel();
153 this._deferred = null; 151 this._deferred = null;
154 }, 152 },
155 153
156 //------------------------------------------------------------------------- 154 //-------------------------------------------------------------------------
157 155
158 'userSuccessfullyLoggedInHandler': function (anEvent) { 156 'userSuccessfullyLoggedInHandler': function (anEvent) {
159 this.deferredHideModal({closeToElement:this.onOkCloseToElement()}); 157 this.deferredHideModal({closeToElement:this.onOkCloseToElement()});
160 }, 158 },
161 159
162 'userLoginFailedHandler': function (anEvent) { 160 'userLoginFailedHandler': function (anEvent) {
163//console.log("############### FAILED LOGIN ################");
164 this.showFailure(); 161 this.showFailure();
165 }, 162 },
166 163
167 //------------------------------------------------------------------------- 164 //-------------------------------------------------------------------------
168/* 165/*
169 'deferredShow': function (someArgs, aResult) { 166 'deferredShow': function (someArgs, aResult) {
170 this.deferredShowModal(someArgs); 167 this.deferredShowModal(someArgs);
171 168
172 // this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement }); 169 // this.deferred().addMethod(this, 'deferredHideModal', {closeToElement:someArgs.onOkCloseToElement });
173 // this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement })); 170 // this.deferred().addErrback (MochiKit.Base.method(this, 'deferredHideModal', {closeToElement:someArgs.onCancelCloseToElement }));
174 // this.deferred().addCallback(MochiKit.Async.succeed, aResult); 171 // this.deferred().addCallback(MochiKit.Async.succeed, aResult);
175 172
176 return this.deferred(); 173 return this.deferred();
177 }, 174 },
178*/ 175*/
179 //------------------------------------------------------------------------- 176 //-------------------------------------------------------------------------
180 __syntaxFix__: "syntax fix" 177 __syntaxFix__: "syntax fix"
181}); 178});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js
index d699dc6..fbf58e0 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js
@@ -1,245 +1,239 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
27 25
28Clipperz.PM.UI.Web.Components.UserInfoBox = function(args) { 26Clipperz.PM.UI.Web.Components.UserInfoBox = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Components.UserInfoBox.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.UserInfoBox.superclass.constructor.apply(this, arguments);
32 30
33 this._slots = {}; 31 this._slots = {};
34 this._isLocked = false; 32 this._isLocked = false;
35 this._lockTooltip = null; 33 this._lockTooltip = null;
36 34
37 return this; 35 return this;
38} 36}
39 37
40//============================================================================= 38//=============================================================================
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UserInfoBox, Clipperz.PM.UI.Common.Components.BaseComponent, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.UserInfoBox, Clipperz.PM.UI.Common.Components.BaseComponent, {
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'toString': function () { 44 'toString': function () {
47 return "Clipperz.PM.UI.Web.Components.UserInfoBox component"; 45 return "Clipperz.PM.UI.Web.Components.UserInfoBox component";
48 }, 46 },
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'handleLogout': function(anEvent) { 50 'handleLogout': function(anEvent) {
53//Clipperz.log(">>> UserInfoBox.handleLogout"); 51//Clipperz.log(">>> UserInfoBox.handleLogout");
54 anEvent.preventDefault(); 52 anEvent.preventDefault();
55 MochiKit.Signal.signal(this, 'logout'); 53 MochiKit.Signal.signal(this, 'logout');
56//Clipperz.log("<<< UserInfoBox.handleLogout"); 54//Clipperz.log("<<< UserInfoBox.handleLogout");
57 }, 55 },
58 56
59 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
60 58
61 'lockTooltip': function () { 59 'lockTooltip': function () {
62 return this._lockTooltip; 60 return this._lockTooltip;
63 }, 61 },
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67 'isLocked': function () { 65 'isLocked': function () {
68 return this._isLocked; 66 return this._isLocked;
69 }, 67 },
70 68
71 'setIsLocked': function (aValue) { 69 'setIsLocked': function (aValue) {
72 this._isLocked = aValue; 70 this._isLocked = aValue;
73 }, 71 },
74 72
75 'toggleLock': function(anEvent) { 73 'toggleLock': function(anEvent) {
76 var deferredResult; 74 var deferredResult;
77 var shouldLock; 75 var shouldLock;
78 76
79//console.log(">>> UserInfoBox.toggleLock [locked: " + this.isLocked() + "]");
80 anEvent.preventDefault(); 77 anEvent.preventDefault();
81 this.lockTooltip().hide(); 78 this.lockTooltip().hide();
82 79
83 shouldLock = (this.isLocked() == false); 80 shouldLock = (this.isLocked() == false);
84 81
85 if (shouldLock) { 82 if (shouldLock) {
86 var maskElement; 83 var maskElement;
87 84
88 this.setIsLocked(true); 85 this.setIsLocked(true);
89 maskElement = this.getId('modalDialogMask'); 86 maskElement = this.getId('modalDialogMask');
90 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [lock]", [ 87 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [lock]", [
91 MochiKit.Base.partial(MochiKit.DOM.addElementClass, this.element(), 'locked'), 88 MochiKit.Base.partial(MochiKit.DOM.addElementClass, this.element(), 'locked'),
92 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.appear, maskElement, {from:0.0, to:0.75, duration:0.5}), 89 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.appear, maskElement, {from:0.0, to:0.75, duration:0.5}),
93 MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this, 'askForPassphrase')), 90 MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this, 'askForPassphrase')),
94 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'lock') 91 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'lock')
95 ], {trace:false}); 92 ], {trace:false});
96 } else { 93 } else {
97 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [unlock]", [ 94 deferredResult = Clipperz.Async.callbacks("UserInfoBox.toggleLock [unlock]", [
98 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'unlock') 95 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'unlock')
99 ], {trace:false}); 96 ], {trace:false});
100 } 97 }
101//console.log("<<< UserInfoBox.toggleLock");
102 98
103 return deferredResult; 99 return deferredResult;
104 }, 100 },
105 101
106 //------------------------------------------------------------------------- 102 //-------------------------------------------------------------------------
107 103
108 'unlock': function () { 104 'unlock': function () {
109 var deferredResult; 105 var deferredResult;
110 var maskElement; 106 var maskElement;
111 107
112 this.setIsLocked(false); 108 this.setIsLocked(false);
113 maskElement = this.getId('modalDialogMask'); 109 maskElement = this.getId('modalDialogMask');
114 110
115 deferredResult = Clipperz.Async.callbacks("UserInfoBox.unlock", [ 111 deferredResult = Clipperz.Async.callbacks("UserInfoBox.unlock", [
116 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}), 112 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}),
117 // Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}), 113 // Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, maskElement, {from:0.75, to:0.0, duration:0.5}),
118 MochiKit.Base.partial(MochiKit.DOM.removeElementClass, this.element(), 'locked') 114 MochiKit.Base.partial(MochiKit.DOM.removeElementClass, this.element(), 'locked')
119 ], {trace:false}); 115 ], {trace:false});
120 }, 116 },
121 117
122 //------------------------------------------------------------------------- 118 //-------------------------------------------------------------------------
123 119
124 'askForPassphrase': function () { 120 'askForPassphrase': function () {
125 varunlockPasswordComponent; 121 varunlockPasswordComponent;
126/* 122/*
127 vardeferredResult; 123 vardeferredResult;
128 124
129 deferredResult = new Clipperz.Async.Deferred("UserInfoBox.askForPassphrase", {trace:false}); 125 deferredResult = new Clipperz.Async.Deferred("UserInfoBox.askForPassphrase", {trace:false});
130 deferredResult.addCallback(MochiKit.Async.succeed, 'test'); 126 deferredResult.addCallback(MochiKit.Async.succeed, 'test');
131 127
132 deferredResult.callback(); 128 deferredResult.callback();
133 129
134 return deferredResult; 130 return deferredResult;
135*/ 131*/
136//console.log(">>> UserInfoBox.askForPassphrase");
137 unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({ 132 unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({
138 'title':"Unlock account", 133 'title':"Unlock account",
139 'text': "Insert the passprase to unlock the account", 134 'text': "Insert the passprase to unlock the account",
140 'type': 'INFO', 135 'type': 'INFO',
141 'buttons': [ 136 'buttons': [
142 {text:"Cancel",result:'CANCEL'}, 137 {text:"Cancel",result:'CANCEL'},
143 {text:"Unlock", result:'OK',isDefault:true} 138 {text:"Unlock", result:'OK',isDefault:true}
144 ], 139 ],
145 'openFromElement': this.getElement('lock'), 140 'openFromElement': this.getElement('lock'),
146 'onOkCloseToElement': null, 141 'onOkCloseToElement': null,
147 'onCancelCloseToElement':this.getId('lock') 142 'onCancelCloseToElement':this.getId('lock')
148 }); 143 });
149//console.log("<<< UserInfoBox.askForPassphrase");
150 144
151 return unlockPasswordComponent.getPassphrase(); 145 return unlockPasswordComponent.getPassphrase();
152 }, 146 },
153 147
154 //========================================================================= 148 //=========================================================================
155 149
156 'renderSelf': function(/*aContainer, aPosition*/) { 150 'renderSelf': function(/*aContainer, aPosition*/) {
157 this.append(this.element(), [ 151 this.append(this.element(), [
158 // {tag:'canvas', id:this.getId('canvas'), cls:'canvas', width:'188', height:'154'}, 152 // {tag:'canvas', id:this.getId('canvas'), cls:'canvas', width:'188', height:'154'},
159 {tag:'div', cls:'header', children:[ 153 {tag:'div', cls:'header', children:[
160 {tag:'h1', html:"Welcome"}, 154 {tag:'h1', html:"Welcome"},
161 {tag:'a', cls:'lockButton', href:'#', id:this.getId('lock'), html:'&nbsp;'} 155 {tag:'a', cls:'lockButton', href:'#', id:this.getId('lock'), html:'&nbsp;'}
162 ]}, 156 ]},
163 {tag:'div', cls:'body', children:[ 157 {tag:'div', cls:'body', children:[
164 {tag:'h3', id:this.getId('username'), html:""}, 158 {tag:'h3', id:this.getId('username'), html:""},
165 {tag:'ul', children:[ 159 {tag:'ul', children:[
166 {tag:'li', id:this.getId('cards'), children:[ 160 {tag:'li', id:this.getId('cards'), children:[
167 {tag:'span', id:this.getId('cardsNumber'), cls:'number', html:"-"}, 161 {tag:'span', id:this.getId('cardsNumber'), cls:'number', html:"-"},
168 {tag:'span', id:this.getId('cardsLabel'), html:"cards"} 162 {tag:'span', id:this.getId('cardsLabel'), html:"cards"}
169 ]}, 163 ]},
170 {tag:'li', id:this.getId('directLogins'), children:[ 164 {tag:'li', id:this.getId('directLogins'), children:[
171 {tag:'span', id:this.getId('directLoginsNumber'), cls:'number', html:"-"}, 165 {tag:'span', id:this.getId('directLoginsNumber'), cls:'number', html:"-"},
172 {tag:'span', id:this.getId('directLoginsLabel'), html:"direct logins"} 166 {tag:'span', id:this.getId('directLoginsLabel'), html:"direct logins"}
173 ]} 167 ]}
174 ]}, 168 ]},
175 {tag:'a', href:'#', id:this.getId('logout'), html:"logout >"} 169 {tag:'a', href:'#', id:this.getId('logout'), html:"logout >"}
176 ]}, 170 ]},
177 {tag:'div', cls:'footer'} 171 {tag:'div', cls:'footer'}
178 ]); 172 ]);
179 173
180 MochiKit.Signal.connect(this.getElement('logout'), 'onclick', this, 'handleLogout'); 174 MochiKit.Signal.connect(this.getElement('logout'), 'onclick', this, 'handleLogout');
181 MochiKit.Signal.connect(this.getElement('lock'), 'onclick', this, 'toggleLock'); 175 MochiKit.Signal.connect(this.getElement('lock'), 'onclick', this, 'toggleLock');
182 176
183 this._lockTooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ 177 this._lockTooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
184 element:this.getElement('lock'), 178 element:this.getElement('lock'),
185 text: "Click here to lock/unlock your account.", 179 text: "Click here to lock/unlock your account.",
186 position:'RIGHT' 180 position:'RIGHT'
187 }); 181 });
188 182
189 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body, 183 Clipperz.DOM.Helper.append(MochiKit.DOM.currentDocument().body,
190 {tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper', children:[ 184 {tag:'div', id:this.getId('modalDialogWrapper'), cls:'modalDialogWrapper', children:[
191 {tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask userInfoBoxMask'} 185 {tag:'div', id:this.getId('modalDialogMask'), cls:'modalDialogMask userInfoBoxMask'}
192 ]} 186 ]}
193 ); 187 );
194 MochiKit.Style.hideElement(this.getId('modalDialogMask')); 188 MochiKit.Style.hideElement(this.getId('modalDialogMask'));
195 189
196 // this.drawUserInfoBackground(this.getElement('canvas')); 190 // this.drawUserInfoBackground(this.getElement('canvas'));
197 }, 191 },
198 192
199 //------------------------------------------------------------------------- 193 //-------------------------------------------------------------------------
200/* 194/*
201 'drawUserInfoBackground': function (canvas) { 195 'drawUserInfoBackground': function (canvas) {
202 var kMyDrawingFunctionWidth = 188.0; 196 var kMyDrawingFunctionWidth = 188.0;
203 var kMyDrawingFunctionHeight = 154.0; 197 var kMyDrawingFunctionHeight = 154.0;
204 198
205 var context = canvas.getContext("2d"); 199 var context = canvas.getContext("2d");
206 var color; 200 var color;
207 var resolution; 201 var resolution;
208 var alignStroke; 202 var alignStroke;
209 var path; 203 var path;
210 var pointX; 204 var pointX;
211 var pointY; 205 var pointY;
212 var controlPoint1X; 206 var controlPoint1X;
213 var controlPoint1Y; 207 var controlPoint1Y;
214 var controlPoint2X; 208 var controlPoint2X;
215 var controlPoint2Y; 209 var controlPoint2Y;
216 var gradient; 210 var gradient;
217 if (window.devicePixelRatio) 211 if (window.devicePixelRatio)
218 resolution = window.devicePixelRatio; 212 resolution = window.devicePixelRatio;
219 else 213 else
220 resolution = 1.0; 214 resolution = 1.0;
221 resolution *= 0.5 * (canvas.width / kMyDrawingFunctionWidth + canvas.height / kMyDrawingFunctionHeight); 215 resolution *= 0.5 * (canvas.width / kMyDrawingFunctionWidth + canvas.height / kMyDrawingFunctionHeight);
222 216
223 context.save(); 217 context.save();
224 context.scale(canvas.width / kMyDrawingFunctionWidth, canvas.height / kMyDrawingFunctionHeight); 218 context.scale(canvas.width / kMyDrawingFunctionWidth, canvas.height / kMyDrawingFunctionHeight);
225 context.clearRect(0.0, 0.0, kMyDrawingFunctionWidth, kMyDrawingFunctionHeight); 219 context.clearRect(0.0, 0.0, kMyDrawingFunctionWidth, kMyDrawingFunctionHeight);
226 220
227 // Setup for Shadow Effect 221 // Setup for Shadow Effect
228 color = "rgba(0.0%, 0.0%, 0.0%, 0.667)"; 222 color = "rgba(0.0%, 0.0%, 0.0%, 0.667)";
229 context.save(); 223 context.save();
230 context.shadowColor = color; 224 context.shadowColor = color;
231 context.shadowBlur = 3.0; 225 context.shadowBlur = 3.0;
232 context.shadowOffsetX = 5.729 * Math.cos(7.592) * resolution; 226 context.shadowOffsetX = 5.729 * Math.cos(7.592) * resolution;
233 context.shadowOffsetY = 5.729 * Math.sin(7.592) * resolution; 227 context.shadowOffsetY = 5.729 * Math.sin(7.592) * resolution;
234 228
235 // Layer 1 229 // Layer 1
236 230
237 alignStroke = 0.0; 231 alignStroke = 0.0;
238 context.beginPath(); 232 context.beginPath();
239 pointX = 169.5; 233 pointX = 169.5;
240 pointY = 141.5; 234 pointY = 141.5;
241 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution; 235 pointX = (Math.round(resolution * pointX + alignStroke) - alignStroke) / resolution;
242 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution; 236 pointY = (Math.round(resolution * pointY + alignStroke) - alignStroke) / resolution;
243 context.moveTo(pointX, pointY); 237 context.moveTo(pointX, pointY);
244 pointX = 177.5; 238 pointX = 177.5;
245 pointY = 133.5; 239 pointY = 133.5;
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js
index 1ab2e69..3d9d6d3 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.AppController = function(args) { 26Clipperz.PM.UI.Web.Controllers.AppController = function(args) {
29 27
30 this._user = null; 28 this._user = null;
31 this._tabSlotNames = { 29 this._tabSlotNames = {
32 //tabName: slotName 30 //tabName: slotName
33 'cards': 'cardGrid', 31 'cards': 'cardGrid',
34 // 'directLogins':'directLoginGrid', 32 // 'directLogins':'directLoginGrid',
35 'account': 'accountPanel', 33 'account': 'accountPanel',
36 'data': 'dataPanel', 34 'data': 'dataPanel',
37 'tools': 'toolsPanel' 35 'tools': 'toolsPanel'
38 }; 36 };
39 37
40 //controllers 38 //controllers
41 this._cardsController= null; 39 this._cardsController= null;
42 //this._directLoginsController = null; 40 //this._directLoginsController = null;
43 this._filterController = null; //new Clipperz.PM.UI.Web.Controllers.FilterController(); 41 this._filterController = null; //new Clipperz.PM.UI.Web.Controllers.FilterController();
44 42
45 //components 43 //components
46 this._appPage = null; 44 this._appPage = null;
47 this._userInfoBox = null; 45 this._userInfoBox = null;
48 this._tabSidePanel = null; 46 this._tabSidePanel = null;
49 47
50 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'editCard', this, 'handleEditCard'); 48 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'editCard', this, 'handleEditCard');
51 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'deleteCard',this, 'handleDeleteCard'); 49 // MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'deleteCard',this, 'handleDeleteCard');
52 50
53 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved',this, 'userDataSuccessfullySavedHandler'); 51 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved',this, 'userDataSuccessfullySavedHandler');
54 52
55 return this; 53 return this;
56} 54}
57 55
58MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.AppController.prototype, { 56MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.AppController.prototype, {
59 57
60 'toString': function() { 58 'toString': function() {
61 return "Clipperz.PM.UI.Web.Controllers.AppController"; 59 return "Clipperz.PM.UI.Web.Controllers.AppController";
62 }, 60 },
63 61
64 //----------------------------------------------------------------------------- 62 //-----------------------------------------------------------------------------
65 63
66 'setUser': function(anUser) { 64 'setUser': function(anUser) {
67 this._user = anUser; 65 this._user = anUser;
68 }, 66 },
69 67
70 'user': function() { 68 'user': function() {
71 return this._user; 69 return this._user;
72 }, 70 },
73 71
74 //----------------------------------------------------------------------------- 72 //-----------------------------------------------------------------------------
75 /* 73 /*
76 'tabSlotNames': function() { 74 'tabSlotNames': function() {
77 return this._tabSlotNames; 75 return this._tabSlotNames;
78 }, 76 },
79*/ 77*/
80 'slotNameForTab': function(aTabName) { 78 'slotNameForTab': function(aTabName) {
81 return this._tabSlotNames[aTabName]; 79 return this._tabSlotNames[aTabName];
82 }, 80 },
83 81
84 'hideAllAppPageTabSlots': function() { 82 'hideAllAppPageTabSlots': function() {
85 var aTabName; 83 var aTabName;
86 84
87 for (aTabName in this._tabSlotNames) { 85 for (aTabName in this._tabSlotNames) {
88 this.appPage().hideSlot(this.slotNameForTab(aTabName)); 86 this.appPage().hideSlot(this.slotNameForTab(aTabName));
89 } 87 }
90 }, 88 },
91 89
92 //----------------------------------------------------------------------------- 90 //-----------------------------------------------------------------------------
93 91
94 'appPage': function() { 92 'appPage': function() {
95 if (this._appPage == null) { 93 if (this._appPage == null) {
96 this._appPage = new Clipperz.PM.UI.Web.Components.AppPage(); 94 this._appPage = new Clipperz.PM.UI.Web.Components.AppPage();
97 } 95 }
98 96
99 return this._appPage; 97 return this._appPage;
100 }, 98 },
101 99
102 //----------------------------------------------------------------------------- 100 //-----------------------------------------------------------------------------
103 101
104 'tabSidePanel': function() { 102 'tabSidePanel': function() {
105 if (this._tabSidePanel == null) { 103 if (this._tabSidePanel == null) {
106 this._tabSidePanel = new Clipperz.PM.UI.Web.Components.TabSidePanel(); 104 this._tabSidePanel = new Clipperz.PM.UI.Web.Components.TabSidePanel();
107 } 105 }
108 106
109 return this._tabSidePanel; 107 return this._tabSidePanel;
110 }, 108 },
111 109
112 //----------------------------------------------------------------------------- 110 //-----------------------------------------------------------------------------
113 111
114 'userInfoBox': function() { 112 'userInfoBox': function() {
115 if (this._userInfoBox == null) { 113 if (this._userInfoBox == null) {
116 this._userInfoBox = new Clipperz.PM.UI.Web.Components.UserInfoBox(); 114 this._userInfoBox = new Clipperz.PM.UI.Web.Components.UserInfoBox();
117 115
118 MochiKit.Signal.connect(this._userInfoBox, 'logout',this, 'handleLogout'); 116 MochiKit.Signal.connect(this._userInfoBox, 'logout',this, 'handleLogout');
@@ -231,121 +229,120 @@ MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.AppController.prototype, {
231 this.hideAllAppPageTabSlots(); 229 this.hideAllAppPageTabSlots();
232 this.appPage().showSlot(this.slotNameForTab('cards')); 230 this.appPage().showSlot(this.slotNameForTab('cards'));
233 231
234 MochiKit.Signal.connect(this.tabSidePanel(), 'tabSelected', this, 'handleTabSelected'); 232 MochiKit.Signal.connect(this.tabSidePanel(), 'tabSelected', this, 'handleTabSelected');
235 MochiKit.Signal.connect(this.tabSidePanel(), 'addCard', this, 'handleAddCard'); 233 MochiKit.Signal.connect(this.tabSidePanel(), 'addCard', this, 'handleAddCard');
236 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'addCard', this, 'handleAddCard'); 234 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'addCard', this, 'handleAddCard');
237 235
238 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'downloadOfflineCopy',this, 'handleDownloadOfflineCopy'); 236 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'downloadOfflineCopy',this, 'handleDownloadOfflineCopy');
239 237
240 deferredResult = new Clipperz.Async.Deferred("AppController.run", {trace:false}); 238 deferredResult = new Clipperz.Async.Deferred("AppController.run", {trace:false});
241 239
242 deferredResult.addMethod(this.cardsController(), 'run', {slot:this.appPage().slotNamed('cardGrid'), user:user}); 240 deferredResult.addMethod(this.cardsController(), 'run', {slot:this.appPage().slotNamed('cardGrid'), user:user});
243 // deferredResult.addMethod(this.directLoginsController(), 'run', {slot:this.appPage().slotNamed('directLoginGrid'), user:user}); 241 // deferredResult.addMethod(this.directLoginsController(), 'run', {slot:this.appPage().slotNamed('directLoginGrid'), user:user});
244 deferredResult.addMethod(this, 'populateUserInfo'); 242 deferredResult.addMethod(this, 'populateUserInfo');
245 243
246 deferredResult.addCallback(MochiKit.Visual.ScrollTo, 'miscLinks', {duration:0}); 244 deferredResult.addCallback(MochiKit.Visual.ScrollTo, 'miscLinks', {duration:0});
247 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN'); 245 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN');
248 deferredResult.addMethod(this.tabSidePanel(), 'selectTab', 'cards'); 246 deferredResult.addMethod(this.tabSidePanel(), 'selectTab', 'cards');
249 deferredResult.callback(); 247 deferredResult.callback();
250 }, 248 },
251 249
252 //----------------------------------------------------------------------------- 250 //-----------------------------------------------------------------------------
253 251
254 'handleTabSelected': function (selectedTabName) { 252 'handleTabSelected': function (selectedTabName) {
255 var aTabName; 253 var aTabName;
256 var aSlotName; 254 var aSlotName;
257 255
258//Clipperz.log(">>> AppController.handleTabSelected", selectedTabName); 256//Clipperz.log(">>> AppController.handleTabSelected", selectedTabName);
259 this.hideAllAppPageTabSlots(); 257 this.hideAllAppPageTabSlots();
260 this.appPage().showSlot(this.slotNameForTab(selectedTabName)); 258 this.appPage().showSlot(this.slotNameForTab(selectedTabName));
261 259
262 switch (selectedTabName) { 260 switch (selectedTabName) {
263 case 'cards': 261 case 'cards':
264 this.cardsController().focus(); 262 this.cardsController().focus();
265 break; 263 break;
266 // case 'directLogins': 264 // case 'directLogins':
267 // this.directLoginsController().focus(); 265 // this.directLoginsController().focus();
268 // break; 266 // break;
269 case 'data': 267 case 'data':
270 break; 268 break;
271 case 'account': 269 case 'account':
272 break; 270 break;
273 case 'tools': 271 case 'tools':
274 break; 272 break;
275 } 273 }
276//Clipperz.log("<-- AppController.handleTabSelected", aTabName); 274//Clipperz.log("<-- AppController.handleTabSelected", aTabName);
277 }, 275 },
278 276
279 //============================================================================= 277 //=============================================================================
280 278
281 'handleAddCard': function (aSourceElement) { 279 'handleAddCard': function (aSourceElement) {
282//Clipperz.log("=== AppController.addCard", aSourceElement); 280//Clipperz.log("=== AppController.addCard", aSourceElement);
283 this.cardsController().addCard(aSourceElement); 281 this.cardsController().addCard(aSourceElement);
284 }, 282 },
285 283
286 //============================================================================= 284 //=============================================================================
287 285
288 'userDataSuccessfullySavedHandler': function (anEvent) { 286 'userDataSuccessfullySavedHandler': function (anEvent) {
289 this.populateUserInfo(); 287 this.populateUserInfo();
290 }, 288 },
291 289
292 //============================================================================= 290 //=============================================================================
293 291
294 'handleLogout': function(anEvent) { 292 'handleLogout': function(anEvent) {
295 var deferredResult; 293 var deferredResult;
296 294
297 deferredResult = new Clipperz.Async.Deferred("AppController.handleLogout", {trace:false}); 295 deferredResult = new Clipperz.Async.Deferred("AppController.handleLogout", {trace:false});
298 deferredResult.addMethod(this.user(), 'logout'); 296 deferredResult.addMethod(this.user(), 'logout');
299 deferredResult.addCallback(MochiKit.Signal.signal, this, 'logout'); 297 deferredResult.addCallback(MochiKit.Signal.signal, this, 'logout');
300 deferredResult.callback(); 298 deferredResult.callback();
301 299
302 return deferredResult; 300 return deferredResult;
303 }, 301 },
304 302
305 //----------------------------------------------------------------------------- 303 //-----------------------------------------------------------------------------
306 304
307 'handleLock': function (anEvent) { 305 'handleLock': function (anEvent) {
308 return Clipperz.Async.callbacks("AppController.handleLock", [ 306 return Clipperz.Async.callbacks("AppController.handleLock", [
309 MochiKit.Base.method(this.cardsController(), 'deleteAllCleanTextData'), 307 MochiKit.Base.method(this.cardsController(), 'deleteAllCleanTextData'),
310 MochiKit.Base.method(this.user(), 'lock') 308 MochiKit.Base.method(this.user(), 'lock')
311 ], {trace:false}); 309 ], {trace:false});
312 }, 310 },
313 311
314 //............................................................................. 312 //.............................................................................
315 313
316 'handleUnlock': function (anEvent) { 314 'handleUnlock': function (anEvent) {
317 return Clipperz.Async.callbacks("AppController.handleUnock", [ 315 return Clipperz.Async.callbacks("AppController.handleUnock", [
318 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress'), 316 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress'),
319 MochiKit.Base.method(this.user(), 'login'), 317 MochiKit.Base.method(this.user(), 'login'),
320 MochiKit.Base.method(this.cardsController(), 'focus'), 318 MochiKit.Base.method(this.cardsController(), 'focus'),
321 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone'), 319 MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'progressDone'),
322 MochiKit.Base.method(this.userInfoBox(), 'unlock') 320 MochiKit.Base.method(this.userInfoBox(), 'unlock')
323 ], {trace:false}); 321 ], {trace:false});
324 }, 322 },
325 323
326 'handleDownloadOfflineCopy': function (anEvent) { 324 'handleDownloadOfflineCopy': function (anEvent) {
327console.log("AppController.handleDownloadOfflineCopy");
328 var downloadHref; 325 var downloadHref;
329 326
330 downloadHref = window.location.href.replace(/\/[^\/]*$/,'') + Clipperz_dumpUrl; 327 downloadHref = window.location.href.replace(/\/[^\/]*$/,'') + Clipperz_dumpUrl;
331 328
332 if (Clipperz_IEisBroken == true) { 329 if (Clipperz_IEisBroken == true) {
333 window.open(downloadHref, ""); 330 window.open(downloadHref, "");
334 } else { 331 } else {
335 vardeferredResult; 332 vardeferredResult;
336 var newWindow; 333 var newWindow;
337 334
338 newWindow = window.open("", ""); 335 newWindow = window.open("", "");
339 336
340 deferredResult = new Clipperz.Async.Deferred("AppController.handleDownloadOfflineCopy", {trace:true}); 337 deferredResult = new Clipperz.Async.Deferred("AppController.handleDownloadOfflineCopy", {trace:true});
341 deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'echo', {'echo':"echo"}); 338 deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'echo', {'echo':"echo"});
342 deferredResult.addCallback(function(aWindow) { 339 deferredResult.addCallback(function(aWindow) {
343 aWindow.location.href = downloadHref; 340 aWindow.location.href = downloadHref;
344 }, newWindow); 341 }, newWindow);
345 deferredResult.callback(); 342 deferredResult.callback();
346 } 343 }
347 }, 344 },
348 345
349 //============================================================================= 346 //=============================================================================
350 __syntaxFix__: "syntax fix" 347 __syntaxFix__: "syntax fix"
351}); 348});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js
index effde31..b1ff81f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.CardDialogController = function(args) { 26Clipperz.PM.UI.Web.Controllers.CardDialogController = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Controllers.CardDialogController.superclass.constructor.call(this, args); 29 Clipperz.PM.UI.Web.Controllers.CardDialogController.superclass.constructor.call(this, args);
32 30
33 this._record = args.record || Clipperz.Base.exception.raise('MandatoryParameter'); 31 this._record = args.record || Clipperz.Base.exception.raise('MandatoryParameter');
34 this._delegate = args.delegate || Clipperz.Base.exception.raise('MandatoryParameter'); 32 this._delegate = args.delegate || Clipperz.Base.exception.raise('MandatoryParameter');
35 33
36 this._referenceElement = null; 34 this._referenceElement = null;
37 this._cardDialogComponent = null; 35 this._cardDialogComponent = null;
38 36
39 this._fieldsReferences = {}; 37 this._fieldsReferences = {};
40 this._directLoginReferences = {}; 38 this._directLoginReferences = {};
41 39
42 this._directLoginWizardController = null; 40 this._directLoginWizardController = null;
43 this._directLoginEditingComponent = null; 41 this._directLoginEditingComponent = null;
44 this._isDirectLoginEditingComponentVisible = false; 42 this._isDirectLoginEditingComponentVisible = false;
45 43
46 return this; 44 return this;
47}; 45};
48 46
49Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardDialogController, Object, { 47Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardDialogController, Object, {
50 48
51 'toString': function() { 49 'toString': function() {
52 return "Clipperz.PM.UI.Web.Controllers.CardDialogController"; 50 return "Clipperz.PM.UI.Web.Controllers.CardDialogController";
53 }, 51 },
54 52
55 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
56 54
57 'record': function () { 55 'record': function () {
58 return this._record; 56 return this._record;
59 }, 57 },
60 58
61 'delegate': function () { 59 'delegate': function () {
62 return this._delegate; 60 return this._delegate;
63 }, 61 },
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67 'fieldsReferences': function () { 65 'fieldsReferences': function () {
68 return this._fieldsReferences; 66 return this._fieldsReferences;
69 }, 67 },
70 68
71 'directLoginReferences': function () { 69 'directLoginReferences': function () {
72 return this._directLoginReferences; 70 return this._directLoginReferences;
73 }, 71 },
74 72
75 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
76 74
77 'referenceElement': function () { 75 'referenceElement': function () {
78 return this._referenceElement; 76 return this._referenceElement;
79 }, 77 },
80 78
81 'setReferenceElement': function (anElement) { 79 'setReferenceElement': function (anElement) {
82 this._referenceElement = anElement; 80 this._referenceElement = anElement;
83 }, 81 },
84 82
85 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
86 84
87 'cardDialogComponent': function () { 85 'cardDialogComponent': function () {
88 if (this._cardDialogComponent == null) { 86 if (this._cardDialogComponent == null) {
89 this._cardDialogComponent = new Clipperz.PM.UI.Web.Components.CardDialogComponent(); 87 this._cardDialogComponent = new Clipperz.PM.UI.Web.Components.CardDialogComponent();
90 88
91 MochiKit.Signal.connect(this._cardDialogComponent, 'cancel', this, 'handleCancel'); 89 MochiKit.Signal.connect(this._cardDialogComponent, 'cancel', this, 'handleCancel');
92 MochiKit.Signal.connect(this._cardDialogComponent, 'save', this, 'handleSave'); 90 MochiKit.Signal.connect(this._cardDialogComponent, 'save', this, 'handleSave');
93 91
94 MochiKit.Signal.connect(this._cardDialogComponent, 'addField', this, 'handleAddField'); 92 MochiKit.Signal.connect(this._cardDialogComponent, 'addField', this, 'handleAddField');
95 MochiKit.Signal.connect(this._cardDialogComponent, 'changedValue',this, 'handleChangedValue'); 93 MochiKit.Signal.connect(this._cardDialogComponent, 'changedValue',this, 'handleChangedValue');
96 94
97 MochiKit.Signal.connect(this._cardDialogComponent, 'addDirectLogin',this, 'handleAddDirectLogin'); 95 MochiKit.Signal.connect(this._cardDialogComponent, 'addDirectLogin',this, 'handleAddDirectLogin');
98 MochiKit.Signal.connect(this._cardDialogComponent, 'keyPressed',this, 'handleCardDialogComponentKeyPressed'); 96 MochiKit.Signal.connect(this._cardDialogComponent, 'keyPressed',this, 'handleCardDialogComponentKeyPressed');
99 } 97 }
100 98
101 return this._cardDialogComponent; 99 return this._cardDialogComponent;
102 }, 100 },
103 101
104 //========================================================================= 102 //=========================================================================
105 103
106 'directLoginWizardController': function () { 104 'directLoginWizardController': function () {
107 if (this._directLoginWizardController == null) { 105 if (this._directLoginWizardController == null) {
108 this._directLoginWizardController = new Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController({ 106 this._directLoginWizardController = new Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController({
109 'cardLabel': this.cardDialogComponent().title(), 107 'cardLabel': this.cardDialogComponent().title(),
110 'directLoginEditingComponent': this.directLoginEditingComponent() 108 'directLoginEditingComponent': this.directLoginEditingComponent()
111 }) 109 })
112 110
113 MochiKit.Signal.connect(this._directLoginWizardController, 'exit',this, 'handleHideDirectLoginEditingComponent'); 111 MochiKit.Signal.connect(this._directLoginWizardController, 'exit',this, 'handleHideDirectLoginEditingComponent');
114 MochiKit.Signal.connect(this._directLoginWizardController, 'done',this, 'handleCompleteDirectLoginEditingComponent'); 112 MochiKit.Signal.connect(this._directLoginWizardController, 'done',this, 'handleCompleteDirectLoginEditingComponent');
115 } 113 }
116 114
117 return this._directLoginWizardController; 115 return this._directLoginWizardController;
118 }, 116 },
@@ -281,193 +279,192 @@ Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardDialogController, Object
281 279
282 MochiKit.Base.method(this, 'fieldsReferences'), 280 MochiKit.Base.method(this, 'fieldsReferences'),
283 MochiKit.Base.values, 281 MochiKit.Base.values,
284 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordFieldValues')), 282 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordFieldValues')),
285 283
286 MochiKit.Base.method(this, 'directLoginReferences'), 284 MochiKit.Base.method(this, 'directLoginReferences'),
287 MochiKit.Base.values, 285 MochiKit.Base.values,
288 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordDirectLoginValues')), 286 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordDirectLoginValues')),
289 287
290 MochiKit.Base.method(this.directLoginEditingComponent(), 'directLoginReference'), 288 MochiKit.Base.method(this.directLoginEditingComponent(), 'directLoginReference'),
291 MochiKit.Base.method(this.record(), 'directLoginWithReference'), 289 MochiKit.Base.method(this.record(), 'directLoginWithReference'),
292 MochiKit.Base.method(this, 'updateRecordDirectLoginDetails'), 290 MochiKit.Base.method(this, 'updateRecordDirectLoginDetails'),
293 291
294 MochiKit.Base.noop 292 MochiKit.Base.noop
295 ], {trace:false}); 293 ], {trace:false});
296 }, 294 },
297 295
298 //------------------------------------------------------------------------- 296 //-------------------------------------------------------------------------
299 297
300 'updateRecordFieldValues': function (aFieldReference) { 298 'updateRecordFieldValues': function (aFieldReference) {
301 var deferredResult; 299 var deferredResult;
302 300
303 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordFieldValues', [ 301 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordFieldValues', [
304 MochiKit.Base.method(aFieldReference['component'],'label'), 302 MochiKit.Base.method(aFieldReference['component'],'label'),
305 MochiKit.Base.method(aFieldReference['field'], 'setLabel'), 303 MochiKit.Base.method(aFieldReference['field'], 'setLabel'),
306 304
307 MochiKit.Base.method(aFieldReference['component'],'value'), 305 MochiKit.Base.method(aFieldReference['component'],'value'),
308 MochiKit.Base.method(aFieldReference['field'], 'setValue'), 306 MochiKit.Base.method(aFieldReference['field'], 'setValue'),
309 307
310 MochiKit.Base.method(aFieldReference['component'],'isHidden'), 308 MochiKit.Base.method(aFieldReference['component'],'isHidden'),
311 MochiKit.Base.method(aFieldReference['field'], 'setIsHidden'), 309 MochiKit.Base.method(aFieldReference['field'], 'setIsHidden'),
312 310
313 MochiKit.Base.method(aFieldReference['field'], 'actionType'), 311 MochiKit.Base.method(aFieldReference['field'], 'actionType'),
314 MochiKit.Base.method(aFieldReference['component'],'setActionType') 312 MochiKit.Base.method(aFieldReference['component'],'setActionType')
315 ], {trace:false}); 313 ], {trace:false});
316 314
317 return deferredResult; 315 return deferredResult;
318 }, 316 },
319 317
320 //------------------------------------------------------------------------- 318 //-------------------------------------------------------------------------
321 319
322 'updateRecordDirectLoginValues': function (aDirectLoginReference) { 320 'updateRecordDirectLoginValues': function (aDirectLoginReference) {
323 var deferredResult; 321 var deferredResult;
324 322
325 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordDirectLoginValues', [ 323 deferredResult = Clipperz.Async.callbacks('CardDialogController.updateRecordDirectLoginValues', [
326 MochiKit.Base.method(aDirectLoginReference['component'], 'label'), 324 MochiKit.Base.method(aDirectLoginReference['component'], 'label'),
327 MochiKit.Base.method(aDirectLoginReference['directLogin'], 'setLabel') 325 MochiKit.Base.method(aDirectLoginReference['directLogin'], 'setLabel')
328 ], {trace:false}); 326 ], {trace:false});
329 327
330 return deferredResult; 328 return deferredResult;
331 }, 329 },
332 330
333 //------------------------------------------------------------------------- 331 //-------------------------------------------------------------------------
334 332
335 'updateRecordDirectLoginDetails': function (aDirectLogin) { 333 'updateRecordDirectLoginDetails': function (aDirectLogin) {
336 var result; 334 var result;
337 335
338 if (MochiKit.Base.isUndefinedOrNull(aDirectLogin)) { 336 if (MochiKit.Base.isUndefinedOrNull(aDirectLogin)) {
339 result = MochiKit.Async.succeed(); 337 result = MochiKit.Async.succeed();
340 } else { 338 } else {
341 result = Clipperz.Async.callbacks("CardDialogController.updateRecordDirectLoginDetails", [ 339 result = Clipperz.Async.callbacks("CardDialogController.updateRecordDirectLoginDetails", [
342 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'), 340 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'),
343 MochiKit.Base.method(aDirectLogin, 'setLabel'), 341 MochiKit.Base.method(aDirectLogin, 'setLabel'),
344 MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'), 342 MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'),
345 MochiKit.Base.method(aDirectLogin, 'setFavicon') 343 MochiKit.Base.method(aDirectLogin, 'setFavicon')
346 ], {trace:false}); 344 ], {trace:false});
347 } 345 }
348 346
349 return result; 347 return result;
350 }, 348 },
351 349
352 //========================================================================= 350 //=========================================================================
353 351
354 'addField': function () { 352 'addField': function () {
355 return this.record().addField({ 353 return this.record().addField({
356 'label':this.cardDialogComponent().newFieldLabel(), 354 'label':this.cardDialogComponent().newFieldLabel(),
357 'value':this.cardDialogComponent().newFieldValue(), 355 'value':this.cardDialogComponent().newFieldValue(),
358 'isHidden':this.cardDialogComponent().newFieldIsHidden() 356 'isHidden':this.cardDialogComponent().newFieldIsHidden()
359 }); 357 });
360 }, 358 },
361 359
362 'handleAddField': function () { 360 'handleAddField': function () {
363 return Clipperz.Async.callbacks("CardDialogController.handleAddField", [ 361 return Clipperz.Async.callbacks("CardDialogController.handleAddField", [
364 MochiKit.Base.method(this, 'addField'), 362 MochiKit.Base.method(this, 'addField'),
365 363
366 MochiKit.Base.method(this, 'addCardDialogComponentWithField'), 364 MochiKit.Base.method(this, 'addCardDialogComponentWithField'),
367 MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'), 365 MochiKit.Base.method(this.cardDialogComponent(), 'resetNewFieldInputs'),
368 366
369 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'), 367 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
370 MochiKit.Base.method(this, 'handleChangedValue') 368 MochiKit.Base.method(this, 'handleChangedValue')
371 ], {trace:false}) 369 ], {trace:false})
372 }, 370 },
373 371
374 //------------------------------------------------------------------------- 372 //-------------------------------------------------------------------------
375 373
376 'handlePerformFieldAction': function (aFieldID, aTargetElement) { 374 'handlePerformFieldAction': function (aFieldID, aTargetElement) {
377//console.log("### targetElement", aTargetElement);
378 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [ 375 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [
379 MochiKit.Base.method(this.record(), 'fields'), 376 MochiKit.Base.method(this.record(), 'fields'),
380 MochiKit.Base.itemgetter(aFieldID), 377 MochiKit.Base.itemgetter(aFieldID),
381 Clipperz.Async.collectResults("CardDialogController.handleDeleteField <collect results>", { 378 Clipperz.Async.collectResults("CardDialogController.handleDeleteField <collect results>", {
382 'value':MochiKit.Base.methodcaller('value'), 379 'value':MochiKit.Base.methodcaller('value'),
383 'type': MochiKit.Base.methodcaller('actionType') 380 'type': MochiKit.Base.methodcaller('actionType')
384 }, {trace:false}), 381 }, {trace:false}),
385 MochiKit.Base.bind(function (someValues) { 382 MochiKit.Base.bind(function (someValues) {
386 switch (someValues['type']) { 383 switch (someValues['type']) {
387 case 'NONE': 384 case 'NONE':
388 throw "this event handler should not be triggered for fields with type 'NONE'"; 385 throw "this event handler should not be triggered for fields with type 'NONE'";
389 break; 386 break;
390 case 'URL': 387 case 'URL':
391 var url; 388 var url;
392 389
393 url = someValues['value']; 390 url = someValues['value'];
394 if (/^https?\:\/\//.test(url) == false) { 391 if (/^https?\:\/\//.test(url) == false) {
395 url = 'http://' + url; 392 url = 'http://' + url;
396 } 393 }
397 394
398 window.open(url); 395 window.open(url);
399 break; 396 break;
400 case 'EMAIL': 397 case 'EMAIL':
401 var url; 398 var url;
402 399
403 url = 'mailto:' + someValues['value']; 400 url = 'mailto:' + someValues['value'];
404 401
405 MochiKit.DOM.currentWindow().location = url; 402 MochiKit.DOM.currentWindow().location = url;
406 break; 403 break;
407 case 'PASSWORD': 404 case 'PASSWORD':
408//Clipperz.log("SHOW PASSWORD " + someValues['value']); 405//Clipperz.log("SHOW PASSWORD " + someValues['value']);
409 this.showPasswordTooltip(someValues['value'], aTargetElement); 406 this.showPasswordTooltip(someValues['value'], aTargetElement);
410 break; 407 break;
411 } 408 }
412 }, this) 409 }, this)
413 ], {trace:false}); 410 ], {trace:false});
414 }, 411 },
415 412
416 //------------------------------------------------------------------------- 413 //-------------------------------------------------------------------------
417 414
418 'handleDeleteField': function (aFieldID) { 415 'handleDeleteField': function (aFieldID) {
419 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [ 416 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField", [
420 MochiKit.Base.method(this.record(), 'fields'), 417 MochiKit.Base.method(this.record(), 'fields'),
421 MochiKit.Base.itemgetter(aFieldID), 418 MochiKit.Base.itemgetter(aFieldID),
422 MochiKit.Base.method(this.record(), 'removeField'), 419 MochiKit.Base.method(this.record(), 'removeField'),
423 420
424 MochiKit.Base.method(this, 'fieldsReferences'), 421 MochiKit.Base.method(this, 'fieldsReferences'),
425 MochiKit.Base.itemgetter(aFieldID), 422 MochiKit.Base.itemgetter(aFieldID),
426 MochiKit.Base.itemgetter('component'), 423 MochiKit.Base.itemgetter('component'),
427 424
428 function (aComponent) { 425 function (aComponent) {
429 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField [fade and remove]", [ 426 return Clipperz.Async.callbacks("CardDialogController.handleDeleteField [fade and remove]", [
430 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}), 427 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),
431 // Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}), 428 // Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),
432 MochiKit.Base.method(aComponent, 'remove') 429 MochiKit.Base.method(aComponent, 'remove')
433 ], {trace:false}); 430 ], {trace:false});
434 }, 431 },
435 432
436 MochiKit.Base.bind(function () { 433 MochiKit.Base.bind(function () {
437 delete this.fieldsReferences()[aFieldID]; 434 delete this.fieldsReferences()[aFieldID];
438 }, this), 435 }, this),
439 436
440 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'), 437 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
441 MochiKit.Base.method(this, 'handleChangedValue') 438 MochiKit.Base.method(this, 'handleChangedValue')
442 ], {trace:false}); 439 ], {trace:false});
443 }, 440 },
444 441
445 //========================================================================= 442 //=========================================================================
446 443
447 'handleDeleteDirectLogin': function(aDirectLoginReference) { 444 'handleDeleteDirectLogin': function(aDirectLoginReference) {
448 var cardDialogComponent; 445 var cardDialogComponent;
449 446
450 cardDialogComponent = this.cardDialogComponent(); 447 cardDialogComponent = this.cardDialogComponent();
451 448
452 return Clipperz.Async.callbacks("CardDialogController.handleDeleteDirectLogin", [ 449 return Clipperz.Async.callbacks("CardDialogController.handleDeleteDirectLogin", [
453 MochiKit.Base.method(this.record(), 'directLogins'), 450 MochiKit.Base.method(this.record(), 'directLogins'),
454 MochiKit.Base.itemgetter(aDirectLoginReference), 451 MochiKit.Base.itemgetter(aDirectLoginReference),
455 MochiKit.Base.methodcaller('remove'), 452 MochiKit.Base.methodcaller('remove'),
456 453
457 MochiKit.Base.method(this, 'directLoginReferences'), 454 MochiKit.Base.method(this, 'directLoginReferences'),
458 MochiKit.Base.itemgetter(aDirectLoginReference), 455 MochiKit.Base.itemgetter(aDirectLoginReference),
459 MochiKit.Base.itemgetter('component'), 456 MochiKit.Base.itemgetter('component'),
460 457
461 function (aComponent) { 458 function (aComponent) {
462 return Clipperz.Async.callbacks("CardDialogController.handleDeleteDirectLogin [fade and remove]", [ 459 return Clipperz.Async.callbacks("CardDialogController.handleDeleteDirectLogin [fade and remove]", [
463 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),// Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}), 460 MochiKit.Base.partial(Clipperz.Visual.deferredAnimation, MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),// Clipperz.Visual.deferredAnimation(MochiKit.Visual.fade, aComponent.element(), {from:1.0, to:0.0, duration:0.5}),
464 /// MochiKit.Base.method(aComponent, 'remove') 461 /// MochiKit.Base.method(aComponent, 'remove')
465 MochiKit.Base.method(cardDialogComponent, 'removeDirectLoginComponent', aComponent) 462 MochiKit.Base.method(cardDialogComponent, 'removeDirectLoginComponent', aComponent)
466 ], {trace:false}); 463 ], {trace:false});
467 }, 464 },
468 465
469 MochiKit.Base.bind(function () { 466 MochiKit.Base.bind(function () {
470 delete this.directLoginReferences()[aDirectLoginReference]; 467 delete this.directLoginReferences()[aDirectLoginReference];
471 }, this), 468 }, this),
472 469
473 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'), 470 MochiKit.Base.method(this.cardDialogComponent(), 'fixRendering'),
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js
index f58f0b8..68b5b9f 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.CardsController = function() { 26Clipperz.PM.UI.Web.Controllers.CardsController = function() {
29 Clipperz.PM.UI.Web.Controllers.CardsController.superclass.constructor.apply(this, arguments); 27 Clipperz.PM.UI.Web.Controllers.CardsController.superclass.constructor.apply(this, arguments);
30 28
31 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'cardDialogComponentClosed', this, 'handleHideCard'); 29 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'cardDialogComponentClosed', this, 'handleHideCard');
32 30
33 return this; 31 return this;
34} 32}
35 33
36Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardsController, Clipperz.PM.UI.Web.Controllers.GridController, { 34Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.CardsController, Clipperz.PM.UI.Web.Controllers.GridController, {
37 35
38 'toString': function() { 36 'toString': function() {
39 return "Clipperz.PM.UI.Web.Controllers.CardsController"; 37 return "Clipperz.PM.UI.Web.Controllers.CardsController";
40 }, 38 },
41 39
42 'createGrid': function () { 40 'createGrid': function () {
43 var grid; 41 var grid;
44 42
45 grid = new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [ 43 grid = new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [
46 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({ 44 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({
47 'name': 'Cards.favicon', 45 'name': 'Cards.favicon',
48 'selector': MochiKit.Base.methodcaller('favicon'), 46 'selector': MochiKit.Base.methodcaller('favicon'),
49 'cssClass': 'favicon' 47 'cssClass': 'favicon'
50 }), 48 }),
51 new Clipperz.PM.UI.Web.Components.LinkColumnManager({ 49 new Clipperz.PM.UI.Web.Components.LinkColumnManager({
52 'name': 'Cards.title', 50 'name': 'Cards.title',
53 'selector': MochiKit.Base.methodcaller('label'), 51 'selector': MochiKit.Base.methodcaller('label'),
54 'label': 'title', 52 'label': 'title',
55 'cssClass': 'title', 53 'cssClass': 'title',
56 'comparator': Clipperz.Base.caseInsensitiveCompare, 54 'comparator': Clipperz.Base.caseInsensitiveCompare,
57 'sortable': true, 55 'sortable': true,
58 'sorted': 'ASCENDING', 56 'sorted': 'ASCENDING',
59 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'editCard', {objectData:anObject, element:anEvent.src()})} 57 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'editCard', {objectData:anObject, element:anEvent.src()})}
60 'actionMethod': MochiKit.Base.method(this, 'handleShowCard') 58 'actionMethod': MochiKit.Base.method(this, 'handleShowCard')
61 }), 59 }),
62 new Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager({ 60 new Clipperz.PM.UI.Web.Components.DirectLoginsColumnManager({
63 'name': 'Cards.directLogins', 61 'name': 'Cards.directLogins',
64 'selector': MochiKit.Base.methodcaller('directLoginReferences'), 62 'selector': MochiKit.Base.methodcaller('directLoginReferences'),
65 'label': 'direct logins', 63 'label': 'direct logins',
66 'cssClass': 'directLogin' 64 'cssClass': 'directLogin'
67 }), 65 }),
68 new Clipperz.PM.UI.Web.Components.DateColumnManager({ 66 new Clipperz.PM.UI.Web.Components.DateColumnManager({
69 'name': 'Cards.latestUpdate', 67 'name': 'Cards.latestUpdate',
70 'selector': MochiKit.Base.methodcaller('updateDate'), 68 'selector': MochiKit.Base.methodcaller('updateDate'),
71 'label': 'latest update', 69 'label': 'latest update',
72 'cssClass': 'latestUpdate', 70 'cssClass': 'latestUpdate',
73 'format': 'd-m-Y', 71 'format': 'd-m-Y',
74 'comparator': MochiKit.Base.compare, 72 'comparator': MochiKit.Base.compare,
75 'sortable': true, 73 'sortable': true,
76 'sorted': 'UNSORTED' 74 'sorted': 'UNSORTED'
77 }), 75 }),
78 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({ 76 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({
79 'name': 'Cards.delete', 77 'name': 'Cards.delete',
80 'selector': MochiKit.Base.noop, 78 'selector': MochiKit.Base.noop,
81 'cssClass': 'delete', 79 'cssClass': 'delete',
82 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteCard', {objectData:anObject, element:anEvent.src()})} 80 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteCard', {objectData:anObject, element:anEvent.src()})}
83 'actionMethod': MochiKit.Base.method(this, 'handleDeleteCard') 81 'actionMethod': MochiKit.Base.method(this, 'handleDeleteCard')
84 }) 82 })
85 ]}); 83 ]});
86 84
87 grid.setComponentForSlotNamed(new Clipperz.PM.UI.Web.Components.BookmarkletComponent(), 'headerSlot'); 85 grid.setComponentForSlotNamed(new Clipperz.PM.UI.Web.Components.BookmarkletComponent(), 'headerSlot');
88 86
89 return grid; 87 return grid;
90 }, 88 },
91 89
92 //----------------------------------------------------------------------------- 90 //-----------------------------------------------------------------------------
93 91
94 'getRows': function () { 92 'getRows': function () {
95 //TODO relying on user() in GridController, bad code smell :| 93 //TODO relying on user() in GridController, bad code smell :|
96 return this.user().getRecords(); 94 return this.user().getRecords();
97 }, 95 },
98 96
99 //============================================================================= 97 //=============================================================================
100 98
101 'displayEmptyContent': function () { 99 'displayEmptyContent': function () {
102 varemptyGridComponent; 100 varemptyGridComponent;
103 101
104 emptyGridComponent = new Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent(); 102 emptyGridComponent = new Clipperz.PM.UI.Web.Components.CreateNewCardSplashComponent();
105 103
106 return Clipperz.Async.callbacks("CardsController.displayEmptyContent", [ 104 return Clipperz.Async.callbacks("CardsController.displayEmptyContent", [
107 MochiKit.Base.method(this.grid(), 'setNoRowsGridComponent', emptyGridComponent), 105 MochiKit.Base.method(this.grid(), 'setNoRowsGridComponent', emptyGridComponent),
108 MochiKit.Base.bind(Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displayEmptyContent, this) 106 MochiKit.Base.bind(Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displayEmptyContent, this)
109 ], {trace:false}); 107 ], {trace:false});
110 }, 108 },
111 109
112 'displaySelectedRows': function (aFilter) { 110 'displaySelectedRows': function (aFilter) {
113 this.columnManagerWithName('Cards.directLogins').hideDirectLoginListPopup(); 111 this.columnManagerWithName('Cards.directLogins').hideDirectLoginListPopup();
114 112
115 return Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displaySelectedRows.apply(this, arguments); 113 return Clipperz.PM.UI.Web.Controllers.CardsController.superclass.displaySelectedRows.apply(this, arguments);
116 }, 114 },
117 115
118 //============================================================================= 116 //=============================================================================
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js
index c025a51..92ed6e3 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js
@@ -1,262 +1,259 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController = function(args) { 26Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController = function(args) {
29 this._directLoginEditingComponent = args.directLoginEditingComponent|| Clipperz.Base.exception.raise('MandatoryParameter'); 27 this._directLoginEditingComponent = args.directLoginEditingComponent|| Clipperz.Base.exception.raise('MandatoryParameter');
30 this._cardLabel = args.cardLabel || Clipperz.Base.exception.raise('MandatoryParameter'); 28 this._cardLabel = args.cardLabel || Clipperz.Base.exception.raise('MandatoryParameter');
31 29
32 MochiKit.Signal.connect(this._directLoginEditingComponent, 'changedValue',this, 'handleChangedValue'); 30 MochiKit.Signal.connect(this._directLoginEditingComponent, 'changedValue',this, 'handleChangedValue');
33 MochiKit.Signal.connect(this._directLoginEditingComponent, 'moveForward',this, 'handleMoveForward'); 31 MochiKit.Signal.connect(this._directLoginEditingComponent, 'moveForward',this, 'handleMoveForward');
34 MochiKit.Signal.connect(this._directLoginEditingComponent, 'keyPressed',this, 'handleDirectLoginEditingComponentKeyPressed'); 32 MochiKit.Signal.connect(this._directLoginEditingComponent, 'keyPressed',this, 'handleDirectLoginEditingComponentKeyPressed');
35 33
36 this._directLogin = null; 34 this._directLogin = null;
37 this._directLoginHasJustBeenAdded = false; 35 this._directLoginHasJustBeenAdded = false;
38 36
39 this._rulerComponent = null; 37 this._rulerComponent = null;
40 38
41 this._steps = null; 39 this._steps = null;
42 this._currentStepIndex = 0; 40 this._currentStepIndex = 0;
43 this._isNextEnabled = false; 41 this._isNextEnabled = false;
44 42
45 this._recordFields = null; 43 this._recordFields = null;
46 this._originalBindings = null; 44 this._originalBindings = null;
47 45
48 this._bindingComponents = []; 46 this._bindingComponents = [];
49 this._formValueComponents = []; 47 this._formValueComponents = [];
50 48
51 return this; 49 return this;
52} 50}
53 51
54MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController.prototype, { 52MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController.prototype, {
55 53
56 'toString': function() { 54 'toString': function() {
57 return "Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController"; 55 return "Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController";
58 }, 56 },
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'directLogin': function () { 60 'directLogin': function () {
63 return this._directLogin; 61 return this._directLogin;
64 }, 62 },
65 63
66 //------------------------------------------------------------------------- 64 //-------------------------------------------------------------------------
67 65
68 'directLoginHasJustBeenAdded': function () { 66 'directLoginHasJustBeenAdded': function () {
69 return this._directLoginHasJustBeenAdded; 67 return this._directLoginHasJustBeenAdded;
70 }, 68 },
71 69
72 'setDirectLoginHasJustBeenAdded': function (aValue) { 70 'setDirectLoginHasJustBeenAdded': function (aValue) {
73 this._directLoginHasJustBeenAdded = aValue; 71 this._directLoginHasJustBeenAdded = aValue;
74 }, 72 },
75 73
76 //------------------------------------------------------------------------- 74 //-------------------------------------------------------------------------
77 75
78 'directLoginEditingComponent': function () { 76 'directLoginEditingComponent': function () {
79 return this._directLoginEditingComponent; 77 return this._directLoginEditingComponent;
80 }, 78 },
81 79
82 //============================================================================= 80 //=============================================================================
83 81
84 'cardLabel': function () { 82 'cardLabel': function () {
85 return this._cardLabel; 83 return this._cardLabel;
86 }, 84 },
87 85
88 //============================================================================= 86 //=============================================================================
89 87
90 'resetCurrentStepIndex': function () { 88 'resetCurrentStepIndex': function () {
91 this._currentStepIndex = 0; 89 this._currentStepIndex = 0;
92 this.rulerComponent().resetStatus(); 90 this.rulerComponent().resetStatus();
93 }, 91 },
94 92
95 //----------------------------------------------------------------------------- 93 //-----------------------------------------------------------------------------
96 94
97 'enableNext': function (aValue) { 95 'enableNext': function (aValue) {
98 this.rulerComponent().enableNext(aValue); 96 this.rulerComponent().enableNext(aValue);
99 this._isNextEnabled = aValue; 97 this._isNextEnabled = aValue;
100 }, 98 },
101 99
102 'isNextEnabled': function () { 100 'isNextEnabled': function () {
103 return this._isNextEnabled; 101 return this._isNextEnabled;
104 }, 102 },
105 103
106 //----------------------------------------------------------------------------- 104 //-----------------------------------------------------------------------------
107 105
108 'enablePrevious': function (aValue) { 106 'enablePrevious': function (aValue) {
109 this.rulerComponent().enablePrevious(aValue); 107 this.rulerComponent().enablePrevious(aValue);
110 }, 108 },
111 109
112 //============================================================================= 110 //=============================================================================
113 111
114 'bindingComponents': function () { 112 'bindingComponents': function () {
115 return this._bindingComponents; 113 return this._bindingComponents;
116 }, 114 },
117 115
118 'resetBindingComponents': function () { 116 'resetBindingComponents': function () {
119 this.directLoginEditingComponent().clearAllBindingsComponents(); 117 this.directLoginEditingComponent().clearAllBindingsComponents();
120 this._bindingComponents = []; 118 this._bindingComponents = [];
121 }, 119 },
122 120
123 //============================================================================= 121 //=============================================================================
124 122
125 'formValueComponents': function () { 123 'formValueComponents': function () {
126 return this._formValueComponents; 124 return this._formValueComponents;
127 }, 125 },
128 126
129 'resetFormValueComponents': function () { 127 'resetFormValueComponents': function () {
130 this.directLoginEditingComponent().clearAllFormValueComponents(); 128 this.directLoginEditingComponent().clearAllFormValueComponents();
131 this._formValueComponents = []; 129 this._formValueComponents = [];
132 }, 130 },
133 131
134 //============================================================================= 132 //=============================================================================
135 133
136 'recordFields': function () { 134 'recordFields': function () {
137 return this._recordFields; 135 return this._recordFields;
138 }, 136 },
139 137
140 'setRecordFields': function (aValue) { 138 'setRecordFields': function (aValue) {
141 this._recordFields = aValue; 139 this._recordFields = aValue;
142 }, 140 },
143 141
144 'recordFieldWithReference': function (aReference) { 142 'recordFieldWithReference': function (aReference) {
145 var matchingValues; 143 var matchingValues;
146 var result; 144 var result;
147 145
148 matchingValues = MochiKit.Base.filter(function (aField) { return aField['reference'] == aReference; }, this.recordFields()); 146 matchingValues = MochiKit.Base.filter(function (aField) { return aField['reference'] == aReference; }, this.recordFields());
149 147
150 if (matchingValues.length == 0) { 148 if (matchingValues.length == 0) {
151 result = null; 149 result = null;
152 } else { 150 } else {
153 result = matchingValues[0]; 151 result = matchingValues[0];
154 } 152 }
155 153
156 return result; 154 return result;
157 }, 155 },
158 156
159 //----------------------------------------------------------------------------- 157 //-----------------------------------------------------------------------------
160 158
161 'originalBindings': function () { 159 'originalBindings': function () {
162 return this._originalBindings; 160 return this._originalBindings;
163 }, 161 },
164 162
165 'setOriginalBindings': function (aValue) { 163 'setOriginalBindings': function (aValue) {
166//console.log("BINDINGS", aValue);
167 this._originalBindings = aValue; 164 this._originalBindings = aValue;
168 }, 165 },
169 166
170 //============================================================================= 167 //=============================================================================
171 168
172 'rulerComponent': function () { 169 'rulerComponent': function () {
173 if (this._rulerComponent == null) { 170 if (this._rulerComponent == null) {
174 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({ 171 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({
175 translationContext:'Wizards.DirectLoginWizard' 172 translationContext:'Wizards.DirectLoginWizard'
176 }); 173 });
177 this._rulerComponent.render(); 174 this._rulerComponent.render();
178 175
179 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit'); 176 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit');
180 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done'); 177 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done');
181 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward'); 178 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward');
182 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward'); 179 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward');
183 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved'); 180 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved');
184 } 181 }
185 182
186 return this._rulerComponent; 183 return this._rulerComponent;
187 }, 184 },
188 185
189 //----------------------------------------------------------------------------- 186 //-----------------------------------------------------------------------------
190 187
191 'showRuler': function (someSteps) { 188 'showRuler': function (someSteps) {
192 var rulerElement; 189 var rulerElement;
193 190
194 this.setSteps(someSteps); 191 this.setSteps(someSteps);
195 192
196 rulerElement = this.rulerComponent().element(); 193 rulerElement = this.rulerComponent().element();
197 this.directLoginEditingComponent().disableAllPanels(); 194 this.directLoginEditingComponent().disableAllPanels();
198 195
199 MochiKit.Style.showElement(rulerElement); 196 MochiKit.Style.showElement(rulerElement);
200 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.directLoginEditingComponent().bottomMargin()}); 197 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.directLoginEditingComponent().bottomMargin()});
201 new MochiKit.Visual.Move(rulerElement, { 198 new MochiKit.Visual.Move(rulerElement, {
202 x:0, y:this.directLoginEditingComponent().bottomMargin(), 199 x:0, y:this.directLoginEditingComponent().bottomMargin(),
203 mode:'absolute', 200 mode:'absolute',
204 duration:1, 201 duration:1,
205 afterFinish:MochiKit.Base.method(this, 'handleCursorMoved') 202 afterFinish:MochiKit.Base.method(this, 'handleCursorMoved')
206 }); 203 });
207 }, 204 },
208 205
209 'fixRulerRendering': function (aValue) { 206 'fixRulerRendering': function (aValue) {
210 this.rulerComponent().setDisplayMode(aValue); 207 this.rulerComponent().setDisplayMode(aValue);
211 }, 208 },
212 209
213 //----------------------------------------------------------------------------- 210 //-----------------------------------------------------------------------------
214 211
215 'hideRuler': function () { 212 'hideRuler': function () {
216 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:1}); 213 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:1});
217 }, 214 },
218 215
219 'doneWithRuler': function () { 216 'doneWithRuler': function () {
220 var rulerComponentElement; 217 var rulerComponentElement;
221 218
222 rulerComponentElement = this.rulerComponent().element(); 219 rulerComponentElement = this.rulerComponent().element();
223 new MochiKit.Visual.Move(this.rulerComponent().element(), { 220 new MochiKit.Visual.Move(this.rulerComponent().element(), {
224 x:1000, 221 x:1000,
225 mode:'relative', 222 mode:'relative',
226 duration:1, 223 duration:1,
227 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement) 224 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement)
228 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); } 225 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); }
229 }); 226 });
230 }, 227 },
231 228
232 //============================================================================= 229 //=============================================================================
233 230
234 'addNewDirectLoginRulerSteps': function () { 231 'addNewDirectLoginRulerSteps': function () {
235 return MochiKit.Base.concat([ 'LABEL'], this.editDirectLoginRulerSteps()); 232 return MochiKit.Base.concat([ 'LABEL'], this.editDirectLoginRulerSteps());
236 233
237 }, 234 },
238 235
239 'editDirectLoginRulerSteps': function () { 236 'editDirectLoginRulerSteps': function () {
240 return [ /*'TYPE',*/ 'CONFIGURATION', 'BINDINGS','FAVICON', 'DONE']; 237 return [ /*'TYPE',*/ 'CONFIGURATION', 'BINDINGS','FAVICON', 'DONE'];
241 }, 238 },
242 239
243 //------------------------------------------------------------------------- 240 //-------------------------------------------------------------------------
244 241
245 'runWithDirectLogin': function (aDirectLogin, hasJustBeenAdded) { 242 'runWithDirectLogin': function (aDirectLogin, hasJustBeenAdded) {
246 this._directLogin = aDirectLogin; 243 this._directLogin = aDirectLogin;
247 this.setDirectLoginHasJustBeenAdded(hasJustBeenAdded); 244 this.setDirectLoginHasJustBeenAdded(hasJustBeenAdded);
248 245
249 return Clipperz.Async.callbacks("DirectLoginWizardController.runWithDirectLogin", [ 246 return Clipperz.Async.callbacks("DirectLoginWizardController.runWithDirectLogin", [
250 MochiKit.Base.method(aDirectLogin, 'label'), 247 MochiKit.Base.method(aDirectLogin, 'label'),
251 MochiKit.Base.method(this.directLoginEditingComponent(), 'setLabel'), 248 MochiKit.Base.method(this.directLoginEditingComponent(), 'setLabel'),
252 249
253 MochiKit.Base.method(aDirectLogin, 'favicon'), 250 MochiKit.Base.method(aDirectLogin, 'favicon'),
254 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'), 251 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'),
255 252
256 MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), 253 MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'),
257 MochiKit.Base.method(this.directLoginEditingComponent(), 'setBookmarkletConfiguration'), 254 MochiKit.Base.method(this.directLoginEditingComponent(), 'setBookmarkletConfiguration'),
258 255
259 MochiKit.Base.method(aDirectLogin, 'bindings'), 256 MochiKit.Base.method(aDirectLogin, 'bindings'),
260 MochiKit.Base.method(this, 'setOriginalBindings'), 257 MochiKit.Base.method(this, 'setOriginalBindings'),
261 258
262 MochiKit.Base.method(aDirectLogin, 'record'), 259 MochiKit.Base.method(aDirectLogin, 'record'),
@@ -314,194 +311,192 @@ MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.DirectLoginWizardController.
314 if (enableNext == true) { 311 if (enableNext == true) {
315 try { 312 try {
316 Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(this.directLoginEditingComponent().bookmarkletConfiguration()); 313 Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(this.directLoginEditingComponent().bookmarkletConfiguration());
317 this.directLoginEditingComponent().removeHighlightConfigurationSyntaxError(); 314 this.directLoginEditingComponent().removeHighlightConfigurationSyntaxError();
318 } catch (e) { 315 } catch (e) {
319 this.directLoginEditingComponent().highlightConfigurationSyntaxError(); 316 this.directLoginEditingComponent().highlightConfigurationSyntaxError();
320 enableNext = false; 317 enableNext = false;
321 } 318 }
322 } 319 }
323 break; 320 break;
324 case 'BINDINGS': 321 case 'BINDINGS':
325 enableNext = MochiKit.Iter.every(this.bindingComponents(), function (aBindingComponent) { return aBindingComponent.selectedValue() != null; }) 322 enableNext = MochiKit.Iter.every(this.bindingComponents(), function (aBindingComponent) { return aBindingComponent.selectedValue() != null; })
326 this.directLoginEditingComponent().enableBindingFields(); 323 this.directLoginEditingComponent().enableBindingFields();
327 break; 324 break;
328 case 'FAVICON': 325 case 'FAVICON':
329 enableNext = true; 326 enableNext = true;
330 this.directLoginEditingComponent().enableFaviconField(); 327 this.directLoginEditingComponent().enableFaviconField();
331 break; 328 break;
332 case 'DONE': 329 case 'DONE':
333 enableNext = true; 330 enableNext = true;
334 this.directLoginEditingComponent().enableDonePanel(); 331 this.directLoginEditingComponent().enableDonePanel();
335 break; 332 break;
336 } 333 }
337 334
338 if (this.currentStepIndex() > 0) { 335 if (this.currentStepIndex() > 0) {
339 this.enablePrevious(enablePrevious); 336 this.enablePrevious(enablePrevious);
340 } else { 337 } else {
341 this.enablePrevious(false); 338 this.enablePrevious(false);
342 } 339 }
343 this.enableNext(enableNext); 340 this.enableNext(enableNext);
344 }, 341 },
345 342
346 //----------------------------------------------------------------------------- 343 //-----------------------------------------------------------------------------
347 344
348 'setFocus': function () { 345 'setFocus': function () {
349 switch(this.currentStep()) { 346 switch(this.currentStep()) {
350 case 'LABEL': 347 case 'LABEL':
351 this.directLoginEditingComponent().focusOnLabelElement(); 348 this.directLoginEditingComponent().focusOnLabelElement();
352 break; 349 break;
353 case 'TYPE': 350 case 'TYPE':
354 break; 351 break;
355 case 'CONFIGURATION': 352 case 'CONFIGURATION':
356 this.directLoginEditingComponent().focusOnBookmarkletConfigurationElement(); 353 this.directLoginEditingComponent().focusOnBookmarkletConfigurationElement();
357 break; 354 break;
358 case 'BINDINGS': 355 case 'BINDINGS':
359 // this.directLoginEditingComponent().getElement('???').focus(); 356 // this.directLoginEditingComponent().getElement('???').focus();
360 break; 357 break;
361 case 'FAVICON': 358 case 'FAVICON':
362 this.directLoginEditingComponent().focusOnFaviconElement(); 359 this.directLoginEditingComponent().focusOnFaviconElement();
363 break; 360 break;
364 case 'DONE': 361 case 'DONE':
365 break; 362 break;
366 } 363 }
367 }, 364 },
368 365
369 //============================================================================= 366 //=============================================================================
370 367
371 'steps': function () { 368 'steps': function () {
372 return this._steps; 369 return this._steps;
373 }, 370 },
374 371
375 'setSteps': function (aValue) { 372 'setSteps': function (aValue) {
376 this._steps = aValue; 373 this._steps = aValue;
377 374
378 this.rulerComponent().setSteps(aValue); 375 this.rulerComponent().setSteps(aValue);
379 this.resetCurrentStepIndex(); 376 this.resetCurrentStepIndex();
380 }, 377 },
381 378
382 'currentStepIndex': function () { 379 'currentStepIndex': function () {
383 return this._currentStepIndex; 380 return this._currentStepIndex;
384 }, 381 },
385 382
386 'currentStep': function () { 383 'currentStep': function () {
387 return this.steps()[this.currentStepIndex()]; 384 return this.steps()[this.currentStepIndex()];
388 }, 385 },
389 386
390 //============================================================================= 387 //=============================================================================
391 388
392 'handleExit': function () { 389 'handleExit': function () {
393 MochiKit.Signal.signal(this, 'exit'); 390 MochiKit.Signal.signal(this, 'exit');
394 }, 391 },
395 392
396 'done': function () { 393 'done': function () {
397 this.doneWithRuler(); 394 this.doneWithRuler();
398 395
399 Clipperz.Async.callbacks("DirectLoginWizardController.done", [ 396 Clipperz.Async.callbacks("DirectLoginWizardController.done", [
400 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'), 397 MochiKit.Base.method(this.directLoginEditingComponent(), 'label'),
401 MochiKit.Base.method(this.directLogin(), 'setLabel'), 398 MochiKit.Base.method(this.directLogin(), 'setLabel'),
402 399
403 MochiKit.Base.method(this.directLoginEditingComponent(), 'bookmarkletConfiguration'), 400 MochiKit.Base.method(this.directLoginEditingComponent(), 'bookmarkletConfiguration'),
404 MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration'), 401 MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration'),
405 402
406 //Bindings 403 //Bindings
407 MochiKit.Base.method(this.directLoginEditingComponent(), 'bindingComponents'), 404 MochiKit.Base.method(this.directLoginEditingComponent(), 'bindingComponents'),
408 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.bind(function (aBindingComponent) { 405 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.bind(function (aBindingComponent) {
409 Clipperz.Async.forEach(MochiKit.Base.bind(function (aBindingComponent) { 406 Clipperz.Async.forEach(MochiKit.Base.bind(function (aBindingComponent) {
410//console.log("aBindingComponent", aBindingComponent);
411 // this.directLogin().
412 return Clipperz.Async.callbacks("DirectLoginWizardController.done - update directLogin bindings", [ 407 return Clipperz.Async.callbacks("DirectLoginWizardController.done - update directLogin bindings", [
413 MochiKit.Base.method(this.directLogin(), 'bindings'), 408 MochiKit.Base.method(this.directLogin(), 'bindings'),
414 MochiKit.Base.itemgetter(aBindingComponent.formFieldName()), 409 MochiKit.Base.itemgetter(aBindingComponent.formFieldName()),
415 MochiKit.Base.methodcaller('setFieldKey', aBindingComponent.selectedValue()) 410 MochiKit.Base.methodcaller('setFieldKey', aBindingComponent.selectedValue())
416 ], {trace:false}); 411 ], {trace:false});
417 }, this)), 412 }, this)),
418 413
419 MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'), 414 MochiKit.Base.method(this.directLoginEditingComponent(), 'favicon'),
420 MochiKit.Base.method(this.directLogin(), 'setFavicon'), 415 MochiKit.Base.method(this.directLogin(), 'setFavicon'),
421 416
422 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'done', { 417 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'done', {
423 'directLogin': this.directLogin(), 418 'directLogin': this.directLogin(),
424 'hasJustBeenAdded':this.directLoginHasJustBeenAdded() 419 'hasJustBeenAdded':this.directLoginHasJustBeenAdded()
425 }) 420 })
426 ], {trace:false}); 421 ], {trace:false});
427 }, 422 },
428 423
429 //============================================================================= 424 //=============================================================================
430 425
431 'handleMoveBackward': function () { 426 'handleMoveBackward': function () {
432 if (this._currentStepIndex > 0) { 427 if (this._currentStepIndex > 0) {
433 varafterMoveAction; 428 varafterMoveAction;
434 429
435 this._currentStepIndex --; 430 this._currentStepIndex --;
436 afterMoveAction = MochiKit.Base.noop; 431 afterMoveAction = MochiKit.Base.noop;
437 432
438 switch(this.currentStep()) { 433 switch(this.currentStep()) {
439 case 'LABEL': 434 case 'LABEL':
440 break; 435 break;
441 case 'TYPE': 436 case 'TYPE':
442 break; 437 break;
443 case 'CONFIGURATION': 438 case 'CONFIGURATION':
444 break; 439 break;
445 case 'BINDINGS': 440 case 'BINDINGS':
446 break; 441 break;
447 case 'FAVICON': 442 case 'FAVICON':
448 break; 443 break;
449 case 'DONE': 444 case 'DONE':
450 break; 445 break;
451 }; 446 };
452 447
453 this.rulerComponent().moveBackward(afterMoveAction); 448 this.rulerComponent().moveBackward(afterMoveAction);
454 } 449 }
455 450
456 if (this._currentStepIndex == 0) { 451 if (this._currentStepIndex == 0) {
457 this.enablePrevious(false); 452 this.enablePrevious(false);
458 } 453 }
459 }, 454 },
460 455
461 'handleMoveForward': function () { 456 'handleMoveForward': function () {
462 if (this.isNextEnabled()) { 457 if (this.isNextEnabled()) {
463 varafterMoveAction; 458 varafterMoveAction;
464 459
465 this._currentStepIndex ++; 460 this._currentStepIndex ++;
466 afterMoveAction = MochiKit.Base.noop; 461 afterMoveAction = MochiKit.Base.noop;
467 462
468 switch(this.currentStep()) { 463 switch(this.currentStep()) {
469 case 'LABEL': 464 case 'LABEL':
470 break; 465 break;
471 case 'TYPE': 466 case 'TYPE':
472 break; 467 break;
473 case 'CONFIGURATION': 468 case 'CONFIGURATION':
474 break; 469 break;
475 case 'BINDINGS': 470 case 'BINDINGS':
476 this.resetBindingComponents(); 471 this.resetBindingComponents();
477 this.resetFormValueComponents(); 472 this.resetFormValueComponents();
478 473
479 afterMoveAction = MochiKit.Base.partial(Clipperz.Async.callbacks, "DirectLoginWizardController.handleMoveForward - BINDINGS", [ 474 afterMoveAction = MochiKit.Base.partial(Clipperz.Async.callbacks, "DirectLoginWizardController.handleMoveForward - BINDINGS", [
480 MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration', this.directLoginEditingComponent().bookmarkletConfiguration()), 475 MochiKit.Base.method(this.directLogin(), 'setBookmarkletConfiguration', this.directLoginEditingComponent().bookmarkletConfiguration()),
481 476
482 MochiKit.Base.method(this.directLogin(), 'favicon'), 477 MochiKit.Base.method(this.directLogin(), 'favicon'),
483 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'), 478 MochiKit.Base.method(this.directLoginEditingComponent(), 'setDirectLoginFavicon'),
484 479
485 MochiKit.Base.method(this.directLogin(), 'bindings'), 480 MochiKit.Base.method(this.directLogin(), 'bindings'),
486 MochiKit.Base.values, 481 MochiKit.Base.values,
487 Clipperz.Async.forEach(MochiKit.Base.bind(function (aBinding) { 482 Clipperz.Async.forEach(MochiKit.Base.bind(function (aBinding) {
488 var bindingComponent; 483 var bindingComponent;
489 484
490 bindingComponent = new Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent({ 485 bindingComponent = new Clipperz.PM.UI.Web.Components.DirectLoginEditingBindingComponent({
491 formFieldName: aBinding.key(), 486 formFieldName: aBinding.key(),
492 fields: this.recordFields(), 487 fields: this.recordFields(),
493 selectedFieldKey: aBinding.fieldKey() 488 selectedFieldKey: aBinding.fieldKey()
494 }); 489 });
495 490
496 this.bindingComponents().push(bindingComponent); 491 this.bindingComponents().push(bindingComponent);
497 492
498 MochiKit.Signal.connect(bindingComponent, 'bindChange', this, 'handleBindChange', bindingComponent); 493 MochiKit.Signal.connect(bindingComponent, 'bindChange', this, 'handleBindChange', bindingComponent);
499 this.directLoginEditingComponent().addBindingComponent(bindingComponent); 494 this.directLoginEditingComponent().addBindingComponent(bindingComponent);
500 495
501 }, this)), 496 }, this)),
502 497
503 MochiKit.Base.method(this.directLogin(), 'formValues'), 498 MochiKit.Base.method(this.directLogin(), 'formValues'),
504 MochiKit.Base.values, 499 MochiKit.Base.values,
505 Clipperz.Async.forEach(MochiKit.Base.bind(function (aFormValue) { 500 Clipperz.Async.forEach(MochiKit.Base.bind(function (aFormValue) {
506 var formValueComponent; 501 var formValueComponent;
507 502
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js
index 6ca3be4..7ab512a 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26/* 24/*
27Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 25Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
28 26
29Clipperz.PM.UI.Web.Controllers.DirectLoginsController = function() { 27Clipperz.PM.UI.Web.Controllers.DirectLoginsController = function() {
30 Clipperz.PM.UI.Web.Controllers.DirectLoginsController.superclass.constructor.apply(this, arguments); 28 Clipperz.PM.UI.Web.Controllers.DirectLoginsController.superclass.constructor.apply(this, arguments);
31 29
32 return this; 30 return this;
33}; 31};
34 32
35Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.DirectLoginsController, Clipperz.PM.UI.Web.Controllers.GridController, { 33Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.DirectLoginsController, Clipperz.PM.UI.Web.Controllers.GridController, {
36 34
37 'createGrid': function () { 35 'createGrid': function () {
38 return new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [ 36 return new Clipperz.PM.UI.Web.Components.GridComponent({columnsManagers: [
39 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({ 37 new Clipperz.PM.UI.Web.Components.FaviconColumnManager({
40 'name': 'DirectLogins.favicon', 38 'name': 'DirectLogins.favicon',
41 'selector': MochiKit.Base.methodcaller('favicon'), 39 'selector': MochiKit.Base.methodcaller('favicon'),
42 'cssClass': 'favicon' 40 'cssClass': 'favicon'
43 }), 41 }),
44 // new Clipperz.PM.UI.Web.Components.LinkColumnManager({ 42 // new Clipperz.PM.UI.Web.Components.LinkColumnManager({
45 new Clipperz.PM.UI.Web.Components.DirectLoginColumnManager({ 43 new Clipperz.PM.UI.Web.Components.DirectLoginColumnManager({
46 'name': 'DirectLogins.title', 44 'name': 'DirectLogins.title',
47 'selector': MochiKit.Base.methodcaller('label'), 45 'selector': MochiKit.Base.methodcaller('label'),
48 'label': 'title', 46 'label': 'title',
49 'cssClass': 'title', 47 'cssClass': 'title',
50 'comparator': Clipperz.Base.caseInsensitiveCompare, 48 'comparator': Clipperz.Base.caseInsensitiveCompare,
51 'sortable': true, 49 'sortable': true,
52 'sorted': 'ASCENDING', 50 'sorted': 'ASCENDING',
53 'actionMethod': MochiKit.Base.methodcaller('runDirectLogin') 51 'actionMethod': MochiKit.Base.methodcaller('runDirectLogin')
54 }), 52 }),
55 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager 53 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager
56 // 'label':'strength', 54 // 'label':'strength',
57 // 'cssClass':'title', 55 // 'cssClass':'title',
58 // 'selector': MochiKit.Base.methodcaller('label') //should be 'strength' or a strenght evaluation function 56 // 'selector': MochiKit.Base.methodcaller('label') //should be 'strength' or a strenght evaluation function
59 // }), 57 // }),
60 new Clipperz.PM.UI.Web.Components.LinkColumnManager({ 58 new Clipperz.PM.UI.Web.Components.LinkColumnManager({
61 'name': 'DirectLogins.cardTitle', 59 'name': 'DirectLogins.cardTitle',
62 'selector': MochiKit.Base.compose(MochiKit.Base.methodcaller('label'), MochiKit.Base.methodcaller('record')), 60 'selector': MochiKit.Base.compose(MochiKit.Base.methodcaller('label'), MochiKit.Base.methodcaller('record')),
63 'label': 'card', 61 'label': 'card',
64 'cssClass': 'cardTitle', 62 'cssClass': 'cardTitle',
65 'comparator': Clipperz.Base.caseInsensitiveCompare, 63 'comparator': Clipperz.Base.caseInsensitiveCompare,
66 'sortable': true, 64 'sortable': true,
67 'sorted': 'UNSORTED', 65 'sorted': 'UNSORTED',
68 'actionMethod': MochiKit.Base.method(this, 'handleShowCard') 66 'actionMethod': MochiKit.Base.method(this, 'handleShowCard')
69 }), 67 }),
70 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager 68 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ //should be StrengthColumnManager
71 // 'label':'last access', 69 // 'label':'last access',
72 // 'cssClass':'title', 70 // 'cssClass':'title',
73 // 'selector': MochiKit.Base.methodcaller('label') 71 // 'selector': MochiKit.Base.methodcaller('label')
74 // // 'sortable': true, 72 // // 'sortable': true,
75 // // 'sorted': 'UNSORTED' 73 // // 'sorted': 'UNSORTED'
76 // }), 74 // }),
77 // new Clipperz.PM.UI.Web.Components.TextColumnManager({ 75 // new Clipperz.PM.UI.Web.Components.TextColumnManager({
78 // 'label':'commands', 76 // 'label':'commands',
79 // 'cssClass':'title', 77 // 'cssClass':'title',
80 // 'selector': MochiKit.Base.methodcaller('label'), //should be a function for commands display 78 // 'selector': MochiKit.Base.methodcaller('label'), //should be a function for commands display
81 // }), 79 // }),
82 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({ 80 new Clipperz.PM.UI.Web.Components.DeleteObjectColumnManager({
83 'name': 'DirectLogins.delete', 81 'name': 'DirectLogins.delete',
84 'selector': MochiKit.Base.noop, 82 'selector': MochiKit.Base.noop,
85 'cssClass': 'delete', 83 'cssClass': 'delete',
86 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteDirectLogin', {objectData:anObject, element:anEvent.src()})} 84 // 'actionMethod': function(anObject, anEvent) { MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'deleteDirectLogin', {objectData:anObject, element:anEvent.src()})}
87 'actionMethod': MochiKit.Base.method(this, 'handleDeleteDirectLogin') 85 'actionMethod': MochiKit.Base.method(this, 'handleDeleteDirectLogin')
88 }) 86 })
89 ]}); 87 ]});
90 88
91 }, 89 },
92 90
93 //----------------------------------------------------------------------------- 91 //-----------------------------------------------------------------------------
94 92
95 'getRows': function () { 93 'getRows': function () {
96 //TODO: relying on user() in GridController, bad code smell :| 94 //TODO: relying on user() in GridController, bad code smell :|
97 return this.user().getDirectLogins(); 95 return this.user().getDirectLogins();
98 }, 96 },
99 97
100 //----------------------------------------------------------------------------- 98 //-----------------------------------------------------------------------------
101 99
102 'handleShowCard': function (anObject, anEvent) { 100 'handleShowCard': function (anObject, anEvent) {
103 var cardDialogController; 101 var cardDialogController;
104 102
105 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:anObject.record()}) 103 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:anObject.record()})
106 cardDialogController.run(anEvent.src()); 104 cardDialogController.run(anEvent.src());
107 }, 105 },
108 106
109 //----------------------------------------------------------------------------- 107 //-----------------------------------------------------------------------------
110 108
111 'handleDeleteDirectLogin': function (anObject, anEvent) { 109 'handleDeleteDirectLogin': function (anObject, anEvent) {
112 var deferredResult; 110 var deferredResult;
113 var confirmationDialog; 111 var confirmationDialog;
114 112
115 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({ 113 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
116 title:"Delete DirectLogin", 114 title:"Delete DirectLogin",
117 text:"Do you want to delete …", 115 text:"Do you want to delete …",
118 type:'ALERT', 116 type:'ALERT',
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js
index bfc093a..de59ec3 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.FilterController = function(args) { 26Clipperz.PM.UI.Web.Controllers.FilterController = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Controllers.FilterController.superclass.constructor.call(this, args); 29 Clipperz.PM.UI.Web.Controllers.FilterController.superclass.constructor.call(this, args);
32 30
33 this._filterElements = []; 31 this._filterElements = [];
34 this._filter = ""; 32 this._filter = "";
35 33
36 this._pendingSearchClicks = 0; 34 this._pendingSearchClicks = 0;
37 35
38 return this; 36 return this;
39}; 37};
40 38
41 39
42Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.FilterController, Object, { 40Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.FilterController, Object, {
43 41
44 //----------------------------------------------------------------------------- 42 //-----------------------------------------------------------------------------
45 43
46 'getFilter': function () { 44 'getFilter': function () {
47 return this._filter; 45 return this._filter;
48 }, 46 },
49 47
50 '_setFilter': function (aFilterElement, aFilter) { 48 '_setFilter': function (aFilterElement, aFilter) {
51 if (aFilter != this._filter) { 49 if (aFilter != this._filter) {
52 this._filter = aFilter; 50 this._filter = aFilter;
53 MochiKit.Signal.signal(this, 'filterUpdated', aFilter); 51 MochiKit.Signal.signal(this, 'filterUpdated', aFilter);
54 this.updateFilterElements(aFilterElement, aFilter); 52 this.updateFilterElements(aFilterElement, aFilter);
55 } 53 }
56 }, 54 },
57 55
58 'setFilter': function (aFilter) { 56 'setFilter': function (aFilter) {
59 this._setFilter(null, aFilter); 57 this._setFilter(null, aFilter);
60 }, 58 },
61 59
62 //----------------------------------------------------------------------------- 60 //-----------------------------------------------------------------------------
63 61
64 'filterElements': function () { 62 'filterElements': function () {
65 return this._filterElements; 63 return this._filterElements;
66 }, 64 },
67 65
68 'registerFilterElement': function (aFilterElement) { 66 'registerFilterElement': function (aFilterElement) {
69//Clipperz.log("=== FilterController.registerFilterElement", aFilterElement); 67//Clipperz.log("=== FilterController.registerFilterElement", aFilterElement);
70 this._filterElements.push(aFilterElement); 68 this._filterElements.push(aFilterElement);
71 MochiKit.Signal.connect(aFilterElement, 'onkeydown', this, 'searchClickHandler'); 69 MochiKit.Signal.connect(aFilterElement, 'onkeydown', this, 'searchClickHandler');
72 MochiKit.Signal.connect(aFilterElement, 'onfocus', this, 'searchClickHandler'); 70 MochiKit.Signal.connect(aFilterElement, 'onfocus', this, 'searchClickHandler');
73 }, 71 },
74 72
75 'removeFilterElement': function (aFilterElement) { 73 'removeFilterElement': function (aFilterElement) {
76 var i; 74 var i;
77 var filterElements; 75 var filterElements;
78 for (i=0; i < filterElements; i++) { 76 for (i=0; i < filterElements; i++) {
79 if (filterElements[i] == aFilterElement); 77 if (filterElements[i] == aFilterElement);
80 filterElements.splice(i, 1); 78 filterElements.splice(i, 1);
81 // TODO unregister/disconnect filterElement ??MochiKit.Signal.disconnect(this.grid().filterElement(), 'updateFilter', this.filterController(), 'handleUpdateFilter'); 79 // TODO unregister/disconnect filterElement ??MochiKit.Signal.disconnect(this.grid().filterElement(), 'updateFilter', this.filterController(), 'handleUpdateFilter');
82 } 80 }
83 }, 81 },
84 82
85 'updateFilterElements': function (aSourceElement, aFilterString) { 83 'updateFilterElements': function (aSourceElement, aFilterString) {
86 MochiKit.Iter.forEach(this.filterElements(), 84 MochiKit.Iter.forEach(this.filterElements(),
87 function (aFilterElement) { 85 function (aFilterElement) {
88 if (aFilterElement != aSourceElement) { 86 if (aFilterElement != aSourceElement) {
89 aFilterElement.value = aFilterString; 87 aFilterElement.value = aFilterString;
90 } 88 }
91 } 89 }
92 ); 90 );
93 91
94 if (aSourceElement != null) { 92 if (aSourceElement != null) {
95 aSourceElement.focus(); 93 aSourceElement.focus();
96 } 94 }
97 }, 95 },
98 96
99 //----------------------------------------------------------------------------- 97 //-----------------------------------------------------------------------------
100 98
101 'run': function () { 99 'run': function () {
102//Clipperz.log("=== FilterController.run"); 100//Clipperz.log("=== FilterController.run");
103 }, 101 },
104 102
105 //----------------------------------------------------------------------------- 103 //-----------------------------------------------------------------------------
106 104
107 'pendingSearchClicks': function () { 105 'pendingSearchClicks': function () {
108 return this._pendingSearchClicks; 106 return this._pendingSearchClicks;
109 }, 107 },
110 108
111 'incrementPendingSearchClicks': function () { 109 'incrementPendingSearchClicks': function () {
112 this._pendingSearchClicks++; 110 this._pendingSearchClicks++;
113 }, 111 },
114 112
115 'decrementPendingSearchClicks': function () { 113 'decrementPendingSearchClicks': function () {
116 this._pendingSearchClicks--; 114 this._pendingSearchClicks--;
117 }, 115 },
118 116
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js
index 8bb3016..44fbdef 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.GridController = function(args) { 26Clipperz.PM.UI.Web.Controllers.GridController = function(args) {
29 args = args || {}; 27 args = args || {};
30 28
31 Clipperz.PM.UI.Web.Controllers.GridController.superclass.constructor.call(this, args); 29 Clipperz.PM.UI.Web.Controllers.GridController.superclass.constructor.call(this, args);
32 30
33 this._grid = null; 31 this._grid = null;
34 this._user = null; 32 this._user = null;
35 this._sortedColumnManager = null; 33 this._sortedColumnManager = null;
36 this._cachedObjects = null; 34 this._cachedObjects = null;
37 this._filterController = args.filterController || null; 35 this._filterController = args.filterController || null;
38 36
39 this._deferredDisplaySelectedRowsInvocation = null; 37 this._deferredDisplaySelectedRowsInvocation = null;
40 38
41 return this; 39 return this;
42}; 40};
43 41
44Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.GridController, Object, { 42Clipperz.Base.extend(Clipperz.PM.UI.Web.Controllers.GridController, Object, {
45 43
46 'toString': function() { 44 'toString': function() {
47 return "Clipperz.PM.UI.Web.Controllers.GridController"; 45 return "Clipperz.PM.UI.Web.Controllers.GridController";
48 }, 46 },
49 47
50 //----------------------------------------------------------------------------- 48 //-----------------------------------------------------------------------------
51 49
52 'createGrid': function () { 50 'createGrid': function () {
53 throw Clipperz.Base.exception.AbstractMethod; 51 throw Clipperz.Base.exception.AbstractMethod;
54 }, 52 },
55 53
56 'setupWithGrid': function (aGrid) { 54 'setupWithGrid': function (aGrid) {
57 this._grid = aGrid; 55 this._grid = aGrid;
58 56
59 if (this._grid != null) { 57 if (this._grid != null) {
60 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) { 58 MochiKit.Iter.forEach(this.columnsManagers(), function (aColumnManager) {
61 if (aColumnManager.isSortable()) { 59 if (aColumnManager.isSortable()) {
62 if (aColumnManager.isSorted()) { 60 if (aColumnManager.isSorted()) {
63 this.setSortedColumnManager(aColumnManager); 61 this.setSortedColumnManager(aColumnManager);
64 } 62 }
65 MochiKit.Signal.connect(aColumnManager, 'sort', this, 'handleColumnManagerSort'); 63 MochiKit.Signal.connect(aColumnManager, 'sort', this, 'handleColumnManagerSort');
66 } 64 }
67 MochiKit.Signal.connect(aColumnManager, 'selectRow', this, 'handleColumnManagerSelectRow'); 65 MochiKit.Signal.connect(aColumnManager, 'selectRow', this, 'handleColumnManagerSelectRow');
68 MochiKit.Signal.connect(aColumnManager, 'unselectRow', this, 'handleColumnManagerUnselectRow'); 66 MochiKit.Signal.connect(aColumnManager, 'unselectRow', this, 'handleColumnManagerUnselectRow');
69 }, this); 67 }, this);
70 } 68 }
71 }, 69 },
72 70
73 'grid': function() { 71 'grid': function() {
74 if (this._grid == null) { 72 if (this._grid == null) {
75 this.setupWithGrid(this.createGrid()); 73 this.setupWithGrid(this.createGrid());
76 } 74 }
77 75
78 return this._grid; 76 return this._grid;
79 }, 77 },
80 78
81 'filterController': function () { 79 'filterController': function () {
82//Clipperz.log('GridController.filterController >>>', this._filterController); 80//Clipperz.log('GridController.filterController >>>', this._filterController);
83 if (this._filterController == null) { 81 if (this._filterController == null) {
84 this._filterController = new Clipperz.PM.UI.Web.Controllers.FilterController(); 82 this._filterController = new Clipperz.PM.UI.Web.Controllers.FilterController();
85 } 83 }
86//Clipperz.log('GridController.filterController <<<', this._filterController); 84//Clipperz.log('GridController.filterController <<<', this._filterController);
87 return this._filterController; 85 return this._filterController;
88 }, 86 },
89 87
90 //----------------------------------------------------------------------------- 88 //-----------------------------------------------------------------------------
91 89
92 'columnsManagers': function () { 90 'columnsManagers': function () {
93 return this.grid().columnsManagers(); 91 return this.grid().columnsManagers();
94 }, 92 },
95 93
96 'columnManagerWithName': function (aName) { 94 'columnManagerWithName': function (aName) {
97 varmanagers; 95 varmanagers;
98 var result; 96 var result;
99 97
100 managers = MochiKit.Base.filter(function (aManager) { return aManager.name() == aName; } , this.columnsManagers()); 98 managers = MochiKit.Base.filter(function (aManager) { return aManager.name() == aName; } , this.columnsManagers());
101 99
102 if (managers.length == 1) { 100 if (managers.length == 1) {
103 result = managers[0]; 101 result = managers[0];
104 } else if (managers.length == 0) { 102 } else if (managers.length == 0) {
105 result = null; 103 result = null;
106 } else { 104 } else {
107 throw "WTF!!!"; 105 throw "WTF!!!";
108 } 106 }
109 107
110 return result; 108 return result;
111 }, 109 },
112 110
113 'sortedColumnManager': function () { 111 'sortedColumnManager': function () {
114 return this._sortedColumnManager; 112 return this._sortedColumnManager;
115 }, 113 },
116 114
117 'setSortedColumnManager': function(aValue) { 115 'setSortedColumnManager': function(aValue) {
118 if (aValue.sorted() != 'UNSORTED') { 116 if (aValue.sorted() != 'UNSORTED') {
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
index a57152d..ac85d36 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js
@@ -1,250 +1,246 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.LoginController = function(args) { 26Clipperz.PM.UI.Web.Controllers.LoginController = function(args) {
29 this._args = args || {}; 27 this._args = args || {};
30 28
31 this._loginPage = null; 29 this._loginPage = null;
32 30
33 this._newUserWizardController = null; 31 this._newUserWizardController = null;
34 this._newUserCreationComponent = null; 32 this._newUserCreationComponent = null;
35 33
36 return this; 34 return this;
37} 35}
38 36
39MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.LoginController.prototype, { 37MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.LoginController.prototype, {
40 38
41 'toString': function() { 39 'toString': function() {
42 return "Clipperz.PM.UI.Web.Controllers.LoginController"; 40 return "Clipperz.PM.UI.Web.Controllers.LoginController";
43 }, 41 },
44 42
45 'args': function () { 43 'args': function () {
46 return this._args; 44 return this._args;
47 }, 45 },
48 46
49 //----------------------------------------------------------------------------- 47 //-----------------------------------------------------------------------------
50 48
51 'loginPage': function() { 49 'loginPage': function() {
52 if (this._loginPage == null) { 50 if (this._loginPage == null) {
53 this._loginPage = new Clipperz.PM.UI.Web.Components.LoginPage(); 51 this._loginPage = new Clipperz.PM.UI.Web.Components.LoginPage();
54 52
55 MochiKit.Signal.connect(this._loginPage, 'createNewAccountClick', this, 'handleCreateNewAccountClick') 53 MochiKit.Signal.connect(this._loginPage, 'createNewAccountClick', this, 'handleCreateNewAccountClick')
56 } 54 }
57 55
58 return this._loginPage; 56 return this._loginPage;
59 }, 57 },
60 58
61 //----------------------------------------------------------------------------- 59 //-----------------------------------------------------------------------------
62 60
63 'run': function(args) { 61 'run': function(args) {
64 varslot; 62 varslot;
65 varloginPage; 63 varloginPage;
66 varloginForm; 64 varloginForm;
67 65
68 slot = args.slot; 66 slot = args.slot;
69 67
70 loginForm =new Clipperz.PM.UI.Web.Components.LoginForm({'autocomplete': this.args()['autocomplete']}); 68 loginForm =new Clipperz.PM.UI.Web.Components.LoginForm({'autocomplete': this.args()['autocomplete']});
71 69
72 slot.setContent(this.loginPage()); 70 slot.setContent(this.loginPage());
73 this.loginPage().slotNamed('loginForm').setContent(loginForm); 71 this.loginPage().slotNamed('loginForm').setContent(loginForm);
74 72
75 MochiKit.Signal.connect(loginForm, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm)); 73 MochiKit.Signal.connect(loginForm, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm));
76 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm)); 74 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'doLogin', MochiKit.Base.method(this, 'doLogin', loginForm));
77 }, 75 },
78 76
79 //----------------------------------------------------------------------------- 77 //-----------------------------------------------------------------------------
80 78
81 'doLogin': function(aLoginForm, anEvent) { 79 'doLogin': function(aLoginForm, anEvent) {
82 var deferredResult; 80 var deferredResult;
83 varparameters; 81 varparameters;
84 var loginProgress; 82 var loginProgress;
85 varuser; 83 varuser;
86 var getPassphraseDelegate; 84 var getPassphraseDelegate;
87 85
88 parameters = anEvent; 86 parameters = anEvent;
89 87
90 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase); 88 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, parameters.passphrase);
91 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase')}); 89 user = new Clipperz.PM.DataModel.User({'username':parameters.username, 'getPassphraseFunction':MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase')});
92 90
93 loginProgress = new Clipperz.PM.UI.Web.Components.LoginProgress(); 91 loginProgress = new Clipperz.PM.UI.Web.Components.LoginProgress();
94 92
95 deferredResult = new Clipperz.Async.Deferred("LoginController.doLogin", {trace:false}); 93 deferredResult = new Clipperz.Async.Deferred("LoginController.doLogin", {trace:false});
96 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4}); 94 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'initProgress', {'steps':4});
97 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', getPassphraseDelegate); 95 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', getPassphraseDelegate);
98 deferredResult.addMethod(loginProgress, 'deferredShowModal', {deferredObject:deferredResult, openFromElement:aLoginForm.submitButtonElement()}); 96 deferredResult.addMethod(loginProgress, 'deferredShowModal', {deferredObject:deferredResult, openFromElement:aLoginForm.submitButtonElement()});
99 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'); 97 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection');
100 deferredResult.addMethod(user, 'login'); 98 deferredResult.addMethod(user, 'login');
101 deferredResult.addCallback(function(aLoginProgress, res) { 99 deferredResult.addCallback(function(aLoginProgress, res) {
102 aLoginProgress.disableCancel(); 100 aLoginProgress.disableCancel();
103 return res; 101 return res;
104 }, loginProgress); 102 }, loginProgress);
105 deferredResult.addCallback(function () { 103 deferredResult.addCallback(function () {
106 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:MochiKit.DOM.currentDocument().body})); 104 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:MochiKit.DOM.currentDocument().body}));
107 }) 105 })
108 deferredResult.addMethod(this, 'userLoggedIn', user, loginProgress, aLoginForm); 106 deferredResult.addMethod(this, 'userLoggedIn', user, loginProgress, aLoginForm);
109 deferredResult.addErrback (MochiKit.Base.method(this, 'handleFailedLogin', loginProgress)); 107 deferredResult.addErrback (MochiKit.Base.method(this, 'handleFailedLogin', loginProgress));
110 108
111 deferredResult.addErrback (MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:aLoginForm.submitButtonElement()})); 109 deferredResult.addErrback (MochiKit.Base.method(loginProgress, 'deferredHideModalAndRemove', {closeToElement:aLoginForm.submitButtonElement()}));
112 deferredResult.addErrbackPass (MochiKit.Base.method(aLoginForm, 'focusOnPassphraseField')); 110 deferredResult.addErrbackPass (MochiKit.Base.method(aLoginForm, 'focusOnPassphraseField'));
113 deferredResult.addBoth(MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'removePassphraseDelegate', getPassphraseDelegate)); 111 deferredResult.addBoth(MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'removePassphraseDelegate', getPassphraseDelegate));
114 deferredResult.callback(); 112 deferredResult.callback();
115 113
116 MochiKit.Signal.connect(loginProgress, 'cancelEvent', deferredResult, 'cancel'); 114 MochiKit.Signal.connect(loginProgress, 'cancelEvent', deferredResult, 'cancel');
117 115
118 return deferredResult; 116 return deferredResult;
119 }, 117 },
120 118
121 //----------------------------------------------------------------------------- 119 //-----------------------------------------------------------------------------
122 120
123 'userLoggedIn': function(aUser) { 121 'userLoggedIn': function(aUser) {
124//Clipperz.log(">>> LoginController.userLoggedIn"); 122//Clipperz.log(">>> LoginController.userLoggedIn");
125 MochiKit.Signal.signal(this, 'userLoggedIn', {user: aUser}); 123 MochiKit.Signal.signal(this, 'userLoggedIn', {user: aUser});
126//Clipperz.log("<<< LoginController.userLoggedIn"); 124//Clipperz.log("<<< LoginController.userLoggedIn");
127 }, 125 },
128 126
129 //========================================================================= 127 //=========================================================================
130 128
131 'handleCreateNewAccountClick': function (aComponent) { 129 'handleCreateNewAccountClick': function (aComponent) {
132 // return Clipperz.PM.DataModel.User.registerNewAccount("new", "user"); 130 // return Clipperz.PM.DataModel.User.registerNewAccount("new", "user");
133 return Clipperz.Async.callbacks("LoginController.handleCreateNewAccountClick", [ 131 return Clipperz.Async.callbacks("LoginController.handleCreateNewAccountClick", [
134 //' MochiKit.Base.method(this, 'newUserCreationComponent'), 132 //' MochiKit.Base.method(this, 'newUserCreationComponent'),
135 // MochiKit.Base.methodcaller('deferredShowModal', {openFromElement:aComponent}), 133 // MochiKit.Base.methodcaller('deferredShowModal', {openFromElement:aComponent}),
136 // MochiKit.Base.method(this.newUserWizardController(), 'run') 134 // MochiKit.Base.method(this.newUserWizardController(), 'run')
137 135
138 136
139 MochiKit.Base.method(this, 'newUserCreationComponent'), 137 MochiKit.Base.method(this, 'newUserCreationComponent'),
140 Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", [ 138 Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", [
141 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredShowModal', {openFromElement:aComponent, duration:0.5}), 139 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredShowModal', {openFromElement:aComponent, duration:0.5}),
142 MochiKit.Base.method(this.newUserWizardController(), 'run') 140 MochiKit.Base.method(this.newUserWizardController(), 'run')
143 ], {trace:false}), 141 ], {trace:false}),
144 // MochiKit.Base.method(this.newUserCreationComponent(), 'enableCredentialsField') 142 // MochiKit.Base.method(this.newUserCreationComponent(), 'enableCredentialsField')
145 ], {trace:false}); 143 ], {trace:false});
146 }, 144 },
147 145
148 //----------------------------------------------------------------------------- 146 //-----------------------------------------------------------------------------
149 147
150 'newUserWizardController': function () { 148 'newUserWizardController': function () {
151 if (this._newUserWizardController == null) { 149 if (this._newUserWizardController == null) {
152 this._newUserWizardController = new Clipperz.PM.UI.Web.Controllers.NewUserWizardController({ 150 this._newUserWizardController = new Clipperz.PM.UI.Web.Controllers.NewUserWizardController({
153 'newUserCreationComponent': this.newUserCreationComponent() 151 'newUserCreationComponent': this.newUserCreationComponent()
154 }) 152 })
155 153
156 // MochiKit.Signal.connect(this._newUserWizardController, 'exit',this, 'handleHideNewUserCreationComponent'); 154 // MochiKit.Signal.connect(this._newUserWizardController, 'exit',this, 'handleHideNewUserCreationComponent');
157 MochiKit.Signal.connect(this._newUserWizardController, 'done',this, 'handleCompleteNewUserCreationComponent'); 155 MochiKit.Signal.connect(this._newUserWizardController, 'done',this, 'handleCompleteNewUserCreationComponent');
158 } 156 }
159 157
160 return this._newUserWizardController; 158 return this._newUserWizardController;
161 }, 159 },
162 160
163 //------------------------------------------------------------------------- 161 //-------------------------------------------------------------------------
164 162
165 'newUserCreationComponent': function () { 163 'newUserCreationComponent': function () {
166 if (this._newUserCreationComponent == null) { 164 if (this._newUserCreationComponent == null) {
167 this._newUserCreationComponent = new Clipperz.PM.UI.Web.Components.NewUserCreationComponent(); 165 this._newUserCreationComponent = new Clipperz.PM.UI.Web.Components.NewUserCreationComponent();
168 } 166 }
169 167
170 return this._newUserCreationComponent; 168 return this._newUserCreationComponent;
171 }, 169 },
172 170
173 'clearNewUserCreationComponent': function () { 171 'clearNewUserCreationComponent': function () {
174 if (this._newUserCreationComponent != null) { 172 if (this._newUserCreationComponent != null) {
175 this._newUserCreationComponent.clear(); 173 this._newUserCreationComponent.clear();
176 } 174 }
177 this._newUserCreationComponent = null; 175 this._newUserCreationComponent = null;
178 }, 176 },
179 177
180 //------------------------------------------------------------------------- 178 //-------------------------------------------------------------------------
181 179
182 'handleHideNewUserCreationComponent': function () { 180 'handleHideNewUserCreationComponent': function () {
183 this.clearNewUserCreationComponent(); 181 this.clearNewUserCreationComponent();
184 }, 182 },
185 183
186 'handleCompleteNewUserCreationComponent': function (someParameters) { 184 'handleCompleteNewUserCreationComponent': function (someParameters) {
187 vardeferredResult; 185 vardeferredResult;
188 varuser; 186 varuser;
189 varnewUserCreationComponent; 187 varnewUserCreationComponent;
190 188
191 user = someParameters.user; 189 user = someParameters.user;
192 newUserCreationComponent = this.newUserCreationComponent(); 190 newUserCreationComponent = this.newUserCreationComponent();
193 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(newUserCreationComponent, 'deferredHideModal', {closeToElement:MochiKit.DOM.currentDocument().body})), 191 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'CARDS_CONTROLLER_DID_RUN',MochiKit.Base.method(newUserCreationComponent, 'deferredHideModal', {closeToElement:MochiKit.DOM.currentDocument().body})),
194 192
195 deferredResult = new Clipperz.Async.Deferred("LoginController.handleCompleteNewUserCreationComponent", {trace:false}); 193 deferredResult = new Clipperz.Async.Deferred("LoginController.handleCompleteNewUserCreationComponent", {trace:false});
196 194
197 deferredResult.addCallbackList([ 195 deferredResult.addCallbackList([
198 MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'), 196 MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection'),
199 MochiKit.Base.method(user, 'login'), 197 MochiKit.Base.method(user, 'login'),
200 MochiKit.Base.method(this, 'userLoggedIn', user), 198 MochiKit.Base.method(this, 'userLoggedIn', user),
201 MochiKit.Base.method(this, 'clearNewUserCreationComponent') 199 MochiKit.Base.method(this, 'clearNewUserCreationComponent')
202 ]); 200 ]);
203 deferredResult.addErrback(function (aValue) { Clipperz.log("WTF!! Error doing the login after creating a new user" + aValue)}); 201 deferredResult.addErrback(function (aValue) { Clipperz.log("WTF!! Error doing the login after creating a new user" + aValue)});
204 deferredResult.callback(); 202 deferredResult.callback();
205 203
206 return deferredResult; 204 return deferredResult;
207 }, 205 },
208 206
209 207
210 //========================================================================= 208 //=========================================================================
211 209
212 'handleFailedLogin': function(aLoginProgress, anError) { 210 'handleFailedLogin': function(aLoginProgress, anError) {
213 var result; 211 var result;
214 212
215//console.log("anError", anError);
216 if (anError instanceof MochiKit.Async.CancelledError) { 213 if (anError instanceof MochiKit.Async.CancelledError) {
217 result = anError; 214 result = anError;
218 } else { 215 } else {
219 var deferredResult; 216 var deferredResult;
220 217
221MochiKit.Logging.logError("## MainController - FAILED LOGIN: " + anError); 218Clipperz.logError("## MainController - FAILED LOGIN: " + anError);
222 deferredResult = new MochiKit.Async.Deferred(); 219 deferredResult = new MochiKit.Async.Deferred();
223 220
224 aLoginProgress.showErrorMessage("failed login"); 221 aLoginProgress.showErrorMessage("failed login");
225 // Clipperz.NotificationCenter.register(loginProgress, 'cancelEvent', deferredResult, 'callback'); 222 // Clipperz.NotificationCenter.register(loginProgress, 'cancelEvent', deferredResult, 'callback');
226 MochiKit.Signal.connect(aLoginProgress, 'cancelEvent', deferredResult, 'callback'); 223 MochiKit.Signal.connect(aLoginProgress, 'cancelEvent', deferredResult, 'callback');
227 deferredResult.addCallback(MochiKit.Async.fail, anError) 224 deferredResult.addCallback(MochiKit.Async.fail, anError)
228 result = deferredResult; 225 result = deferredResult;
229 } 226 }
230 227
231 return result; 228 return result;
232 }, 229 },
233 230
234 'handleGenericError': function(anError) { 231 'handleGenericError': function(anError) {
235 var result; 232 var result;
236 233
237 if (anError instanceof MochiKit.Async.CancelledError) { 234 if (anError instanceof MochiKit.Async.CancelledError) {
238 result = anError; 235 result = anError;
239 } else { 236 } else {
240MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack); 237Clipperz.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
241//console.log(anError);
242 result = new MochiKit.Async.CancelledError(anError); 238 result = new MochiKit.Async.CancelledError(anError);
243 } 239 }
244 240
245 return result; 241 return result;
246 }, 242 },
247 243
248 //----------------------------------------------------------------------------- 244 //-----------------------------------------------------------------------------
249 __syntaxFix__: "syntax fix" 245 __syntaxFix__: "syntax fix"
250}); 246});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js
index c83e3c0..9194125 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js
@@ -1,215 +1,207 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.MainController = function(args) { 26Clipperz.PM.UI.Web.Controllers.MainController = function(args) {
29 this._args = args; 27 this._args = args;
30 28
31 //controllers 29 //controllers
32 this._loginController =null; 30 this._loginController =null;
33 this._appController =null; 31 this._appController =null;
34 32
35 //components 33 //components
36 this._headerComponent = null; 34 this._headerComponent = null;
37 this._pageComponent =null; 35 this._pageComponent =null;
38 this._footerComponent = null; 36 this._footerComponent = null;
39 37
40 this._passphraseDelegateLock = new MochiKit.Async.DeferredLock(); 38 this._passphraseDelegateLock = new MochiKit.Async.DeferredLock();
41 this._passphraseDelegateLock.acquire(); 39 this._passphraseDelegateLock.acquire();
42//Clipperz.log('MainController init _passphraseDelegateLock', this._passphraseDelegateLock); 40//Clipperz.log('MainController init _passphraseDelegateLock', this._passphraseDelegateLock);
43 this._passphraseDelegate = null; 41 this._passphraseDelegate = null;
44 42
45 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestSent', this, 'handleRemoteRequestSent'); 43 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestSent', this, 'handleRemoteRequestSent');
46 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestReceived',this, 'handleRemoteRequestReceived'); 44 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, 'remoteRequestReceived',this, 'handleRemoteRequestReceived');
47 45
48 return this; 46 return this;
49} 47}
50 48
51MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.MainController.prototype, { 49MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.MainController.prototype, {
52 50
53 'toString': function() { 51 'toString': function() {
54 return "Clipperz.PM.UI.Web.Controllers.MainController"; 52 return "Clipperz.PM.UI.Web.Controllers.MainController";
55 }, 53 },
56 54
57 'args': function () { 55 'args': function () {
58 return this._args; 56 return this._args;
59 }, 57 },
60 58
61 //----------------------------------------------------------------------------- 59 //-----------------------------------------------------------------------------
62 60
63 'headerComponent': function() { 61 'headerComponent': function() {
64 if (this._headerComponent == null) { 62 if (this._headerComponent == null) {
65 this._headerComponent = new Clipperz.PM.UI.Web.Components.PageHeader(); 63 this._headerComponent = new Clipperz.PM.UI.Web.Components.PageHeader();
66 } 64 }
67 65
68 return this._headerComponent; 66 return this._headerComponent;
69 }, 67 },
70 68
71 'footerComponent': function() { 69 'footerComponent': function() {
72 if (this._footerComponent == null) { 70 if (this._footerComponent == null) {
73 this._footerComponent = new Clipperz.PM.UI.Web.Components.PageFooter(); 71 this._footerComponent = new Clipperz.PM.UI.Web.Components.PageFooter();
74 } 72 }
75 73
76 return this._footerComponent; 74 return this._footerComponent;
77 }, 75 },
78 76
79 //----------------------------------------------------------------------------- 77 //-----------------------------------------------------------------------------
80 78
81 'pageComponent': function() { 79 'pageComponent': function() {
82 if (this._pageComponent == null) { 80 if (this._pageComponent == null) {
83 this._pageComponent = new Clipperz.PM.UI.Web.Components.Page({element:MochiKit.DOM.getElement('mainDiv')}); 81 this._pageComponent = new Clipperz.PM.UI.Web.Components.Page({element:MochiKit.DOM.getElement('mainDiv')});
84 } 82 }
85 83
86 return this._pageComponent; 84 return this._pageComponent;
87 }, 85 },
88 86
89 //----------------------------------------------------------------------------- 87 //-----------------------------------------------------------------------------
90 88
91 'loginController': function() { 89 'loginController': function() {
92 if (this._loginController == null) { 90 if (this._loginController == null) {
93 this._loginController = new Clipperz.PM.UI.Web.Controllers.LoginController(this.args()); 91 this._loginController = new Clipperz.PM.UI.Web.Controllers.LoginController(this.args());
94 92
95 MochiKit.Signal.connect(this._loginController, 'userLoggedIn', this, 'loginControllerUserLoggedInCallback'); 93 MochiKit.Signal.connect(this._loginController, 'userLoggedIn', this, 'loginControllerUserLoggedInCallback');
96 } 94 }
97 95
98 return this._loginController; 96 return this._loginController;
99 }, 97 },
100 98
101 'appController': function() { 99 'appController': function() {
102 if (this._appController == null) { 100 if (this._appController == null) {
103 this._appController = new Clipperz.PM.UI.Web.Controllers.AppController(); 101 this._appController = new Clipperz.PM.UI.Web.Controllers.AppController();
104 102
105 MochiKit.Signal.connect(this._appController, 'logout', this, 'handleLogout'); 103 MochiKit.Signal.connect(this._appController, 'logout', this, 'handleLogout');
106 } 104 }
107 105
108 return this._appController; 106 return this._appController;
109 }, 107 },
110 108
111 //----------------------------------------------------------------------------- 109 //-----------------------------------------------------------------------------
112 110
113 'run': function(shoudShowRegistrationForm) { 111 'run': function(shoudShowRegistrationForm) {
114 this.pageComponent().slotNamed('header').setContent(this.headerComponent()); 112 this.pageComponent().slotNamed('header').setContent(this.headerComponent());
115 this.pageComponent().slotNamed('footer').setContent(this.footerComponent()); 113 this.pageComponent().slotNamed('footer').setContent(this.footerComponent());
116 114
117 this.pageComponent().render(); 115 this.pageComponent().render();
118 116
119 this.loginController().run({slot:this.pageComponent().slotNamed('body')}); 117 this.loginController().run({slot:this.pageComponent().slotNamed('body')});
120 118
121 if (shoudShowRegistrationForm) { 119 if (shoudShowRegistrationForm) {
122 MochiKit.Signal.signal(this.loginController().loginPage(), 'createNewAccountClick'); 120 MochiKit.Signal.signal(this.loginController().loginPage(), 'createNewAccountClick');
123 // this.loginController().handleCreateNewAccountClick(); 121 // this.loginController().handleCreateNewAccountClick();
124 } 122 }
125 }, 123 },
126 124
127 //----------------------------------------------------------------------------- 125 //-----------------------------------------------------------------------------
128 126
129 'getPassphrase': function () { 127 'getPassphrase': function () {
130 var deferredResult; 128 var deferredResult;
131 129
132 deferredResult = new Clipperz.Async.Deferred("MainController.getPassphrase", {trace:false}); 130 deferredResult = new Clipperz.Async.Deferred("MainController.getPassphrase", {trace:false});
133 131
134 deferredResult.acquireLock(this._passphraseDelegateLock); 132 deferredResult.acquireLock(this._passphraseDelegateLock);
135 deferredResult.addMethod(this, 'invokePassphraseDelegate'); 133 deferredResult.addMethod(this, 'invokePassphraseDelegate');
136 deferredResult.releaseLock(this._passphraseDelegateLock); 134 deferredResult.releaseLock(this._passphraseDelegateLock);
137 deferredResult.callback(); 135 deferredResult.callback();
138 136
139 return deferredResult; 137 return deferredResult;
140 }, 138 },
141 139
142 //......................................................................... 140 //.........................................................................
143 141
144 'invokePassphraseDelegate': function () { 142 'invokePassphraseDelegate': function () {
145 return this._passphraseDelegate(); 143 return this._passphraseDelegate();
146 }, 144 },
147 145
148 'passphraseDelegateLock': function () { 146 'passphraseDelegateLock': function () {
149 return this._passphraseDelegateLock; 147 return this._passphraseDelegateLock;
150 }, 148 },
151 149
152 //......................................................................... 150 //.........................................................................
153 151
154 'setPassphraseDelegate': function (aDelegate) { 152 'setPassphraseDelegate': function (aDelegate) {
155 var shouldReleaseLock; 153 var shouldReleaseLock;
156 154
157 shouldReleaseLock = (this._passphraseDelegate == null); 155 shouldReleaseLock = (this._passphraseDelegate == null);
158 156
159 this._passphraseDelegate = aDelegate; 157 this._passphraseDelegate = aDelegate;
160 158
161 if (shouldReleaseLock) { 159 if (shouldReleaseLock) {
162 this._passphraseDelegateLock.release(); 160 this._passphraseDelegateLock.release();
163 } 161 }
164 }, 162 },
165 163
166 //......................................................................... 164 //.........................................................................
167 165
168 'removePassphraseDelegate': function (aDelegate) { 166 'removePassphraseDelegate': function (aDelegate) {
169 if (this._passphraseDelegate == aDelegate) { 167 if (this._passphraseDelegate == aDelegate) {
170 this._passphraseDelegate = null; 168 this._passphraseDelegate = null;
171 this._passphraseDelegateLock.acquire(); 169 this._passphraseDelegateLock.acquire();
172 } 170 }
173 }, 171 },
174 172
175 //------------------------------------------------------------------------- 173 //-------------------------------------------------------------------------
176 174
177 'loginControllerUserLoggedInCallback': function(anEvent) { 175 'loginControllerUserLoggedInCallback': function(anEvent) {
178//Clipperz.log(">>> loginControllerUserLoggedInCallback", anEvent);
179 // this.setUser(anEvent.parameters()['user']);
180//console.log("--- loginControllerUserLoggedInCallback - 1");
181
182//console.log("--- loginControllerUserLoggedInCallback - 2");
183 this.headerComponent().switchToLoggedMode(); 176 this.headerComponent().switchToLoggedMode();
184 this.appController().run({slot:this.pageComponent().slotNamed('body'), user:anEvent['user']}); 177 this.appController().run({slot:this.pageComponent().slotNamed('body'), user:anEvent['user']});
185//Clipperz.log("<<< loginControllerUserLoggedInCallback");
186 }, 178 },
187 179
188 //----------------------------------------------------------------------------- 180 //-----------------------------------------------------------------------------
189 181
190 'handleRemoteRequestSent': function () { 182 'handleRemoteRequestSent': function () {
191//Clipperz.log("REMOTE REQUEST sent >>>"); 183//Clipperz.log("REMOTE REQUEST sent >>>");
192 }, 184 },
193 185
194 'handleRemoteRequestReceived': function () { 186 'handleRemoteRequestReceived': function () {
195//Clipperz.log("REMOTE REQUEST received <<<"); 187//Clipperz.log("REMOTE REQUEST received <<<");
196 }, 188 },
197 189
198 //----------------------------------------------------------------------------- 190 //-----------------------------------------------------------------------------
199 191
200 'handleLogout': function(anEvent) { 192 'handleLogout': function(anEvent) {
201 this.exit('logout.html'); 193 this.exit('logout.html');
202 }, 194 },
203 195
204 //----------------------------------------------------------------------------- 196 //-----------------------------------------------------------------------------
205 197
206 'exit': function(aPageName) { 198 'exit': function(aPageName) {
207//Clipperz.log("### exit " + aPageName); 199//Clipperz.log("### exit " + aPageName);
208 MochiKit.Async.wait(0).addCallback(function() { 200 MochiKit.Async.wait(0).addCallback(function() {
209 window.location.href = "./" + aPageName + "?ln=" + Clipperz.PM.Strings.selectedLanguage; 201 window.location.href = "./" + aPageName + "?ln=" + Clipperz.PM.Strings.selectedLanguage;
210 }); 202 });
211 }, 203 },
212 204
213 //----------------------------------------------------------------------------- 205 //-----------------------------------------------------------------------------
214 __syntaxFix__: "syntax fix" 206 __syntaxFix__: "syntax fix"
215}); 207});
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js
index 7db6888..b70aa17 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js
@@ -1,466 +1,458 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Controllers');
27 25
28Clipperz.PM.UI.Web.Controllers.NewUserWizardController = function(args) { 26Clipperz.PM.UI.Web.Controllers.NewUserWizardController = function(args) {
29 this._newUserCreationComponent = args.newUserCreationComponent|| Clipperz.Base.exception.raise('MandatoryParameter'); 27 this._newUserCreationComponent = args.newUserCreationComponent|| Clipperz.Base.exception.raise('MandatoryParameter');
30 28
31 MochiKit.Signal.connect(this._newUserCreationComponent, 'changedValue',this, 'handleChangedValue'); 29 MochiKit.Signal.connect(this._newUserCreationComponent, 'changedValue',this, 'handleChangedValue');
32 MochiKit.Signal.connect(this._newUserCreationComponent, 'moveForward',this, 'handleMoveForward'); 30 MochiKit.Signal.connect(this._newUserCreationComponent, 'moveForward',this, 'handleMoveForward');
33 MochiKit.Signal.connect(this._newUserCreationComponent, 'keyPressed',this, 'handleNewUserCreationComponentKeyPressed'); 31 MochiKit.Signal.connect(this._newUserCreationComponent, 'keyPressed',this, 'handleNewUserCreationComponentKeyPressed');
34 32
35 this._rulerComponent = null; 33 this._rulerComponent = null;
36 34
37 this._steps = null; 35 this._steps = null;
38 this._currentStepIndex = 0; 36 this._currentStepIndex = 0;
39 this._isNextEnabled = false; 37 this._isNextEnabled = false;
40 38
41 this._userCreationState = 'IDLE'; //'IN PROGRESS', 'DONE', 'FAILED' 39 this._userCreationState = 'IDLE'; //'IN PROGRESS', 'DONE', 'FAILED'
42 this._user = null; 40 this._user = null;
43 return this; 41 return this;
44} 42}
45 43
46MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.NewUserWizardController.prototype, { 44MochiKit.Base.update(Clipperz.PM.UI.Web.Controllers.NewUserWizardController.prototype, {
47 45
48 'toString': function() { 46 'toString': function() {
49 return "Clipperz.PM.UI.Web.Controllers.NewUserWizardController"; 47 return "Clipperz.PM.UI.Web.Controllers.NewUserWizardController";
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'newUserCreationComponent': function () { 52 'newUserCreationComponent': function () {
55 return this._newUserCreationComponent; 53 return this._newUserCreationComponent;
56 }, 54 },
57 55
58 //============================================================================= 56 //=============================================================================
59 57
60 'user': function () { 58 'user': function () {
61 return this._user; 59 return this._user;
62 }, 60 },
63 61
64 'setUser': function (aValue) { 62 'setUser': function (aValue) {
65 this._user = aValue; 63 this._user = aValue;
66 }, 64 },
67 65
68 //----------------------------------------------------------------------------- 66 //-----------------------------------------------------------------------------
69 67
70 'userCreationState': function () { 68 'userCreationState': function () {
71 return this._userCreationState; 69 return this._userCreationState;
72 }, 70 },
73 71
74 'setUserCreationState': function (aValue) { 72 'setUserCreationState': function (aValue) {
75//console.log("+++ NewUserWizardController.setUserCreationState", aValue);
76 this._userCreationState = aValue; 73 this._userCreationState = aValue;
77 this.checkState(); 74 this.checkState();
78 }, 75 },
79 76
80 //============================================================================= 77 //=============================================================================
81 78
82 'resetCurrentStepIndex': function () { 79 'resetCurrentStepIndex': function () {
83 this._currentStepIndex = 0; 80 this._currentStepIndex = 0;
84 this.rulerComponent().resetStatus({animateTransition:true}); 81 this.rulerComponent().resetStatus({animateTransition:true});
85 }, 82 },
86 83
87 //----------------------------------------------------------------------------- 84 //-----------------------------------------------------------------------------
88 85
89 'enableNext': function (aValue) { 86 'enableNext': function (aValue) {
90 this.rulerComponent().enableNext(aValue); 87 this.rulerComponent().enableNext(aValue);
91 this._isNextEnabled = aValue; 88 this._isNextEnabled = aValue;
92 }, 89 },
93 90
94 'isNextEnabled': function () { 91 'isNextEnabled': function () {
95 return this._isNextEnabled; 92 return this._isNextEnabled;
96 }, 93 },
97 94
98 //----------------------------------------------------------------------------- 95 //-----------------------------------------------------------------------------
99 96
100 'enablePrevious': function (aValue) { 97 'enablePrevious': function (aValue) {
101 this.rulerComponent().enablePrevious(aValue); 98 this.rulerComponent().enablePrevious(aValue);
102 }, 99 },
103 100
104 //============================================================================= 101 //=============================================================================
105 102
106 'rulerComponent': function () { 103 'rulerComponent': function () {
107 if (this._rulerComponent == null) { 104 if (this._rulerComponent == null) {
108 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({ 105 this._rulerComponent = new Clipperz.PM.UI.Web.Components.RulerComponent({
109 translationContext:'Wizards.NewUserWizard' 106 translationContext:'Wizards.NewUserWizard'
110 }); 107 });
111 this._rulerComponent.render(); 108 this._rulerComponent.render();
112 109
113 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit'); 110 MochiKit.Signal.connect(this._rulerComponent, 'exit', this, 'handleExit');
114 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done'); 111 MochiKit.Signal.connect(this._rulerComponent, 'done', this, 'done');
115 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward'); 112 MochiKit.Signal.connect(this._rulerComponent, 'moveForward',this, 'handleMoveForward');
116 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward'); 113 MochiKit.Signal.connect(this._rulerComponent, 'moveBackward',this, 'handleMoveBackward');
117 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved'); 114 MochiKit.Signal.connect(this._rulerComponent, 'cursorMoved',this, 'handleCursorMoved');
118 } 115 }
119 116
120 return this._rulerComponent; 117 return this._rulerComponent;
121 }, 118 },
122 119
123 'resetRuler': function () { 120 'resetRuler': function () {
124 // if (this._rulerComponent != null) { 121 // if (this._rulerComponent != null) {
125 // this._rulerComponent.clear(); 122 // this._rulerComponent.clear();
126 // } 123 // }
127 // this._rulerComponent = null; 124 // this._rulerComponent = null;
128 }, 125 },
129 126
130 //----------------------------------------------------------------------------- 127 //-----------------------------------------------------------------------------
131 128
132 'showRuler': function (someSteps) { 129 'showRuler': function (someSteps) {
133 var rulerElement; 130 var rulerElement;
134 131
135 this.setSteps(someSteps); 132 this.setSteps(someSteps);
136 133
137 rulerElement = this.rulerComponent().element(); 134 rulerElement = this.rulerComponent().element();
138 this.newUserCreationComponent().disableAllPanels(); 135 this.newUserCreationComponent().disableAllPanels();
139 136
140 MochiKit.Style.showElement(rulerElement); 137 MochiKit.Style.showElement(rulerElement);
141 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.newUserCreationComponent().bottomMargin()}); 138 MochiKit.Style.setElementPosition(rulerElement, {x:-1000, y:this.newUserCreationComponent().bottomMargin()});
142 new MochiKit.Visual.Move(rulerElement, { 139 new MochiKit.Visual.Move(rulerElement, {
143 x:0, y:this.newUserCreationComponent().bottomMargin(), 140 x:0, y:this.newUserCreationComponent().bottomMargin(),
144 mode:'absolute', 141 mode:'absolute',
145 duration:0.5, 142 duration:0.5,
146 // afterFinish:MochiKit.Base.method(this, 'handleCursorMoved') 143 // afterFinish:MochiKit.Base.method(this, 'handleCursorMoved')
147 afterFinish:MochiKit.Base.method(this, 'handleRulerShowed') 144 afterFinish:MochiKit.Base.method(this, 'handleRulerShowed')
148 }); 145 });
149 }, 146 },
150 147
151 //----------------------------------------------------------------------------- 148 //-----------------------------------------------------------------------------
152 149
153 'handleRulerShowed':function () { 150 'handleRulerShowed':function () {
154 return Clipperz.Async.callbacks("NewUserWizardController.handlerRulerShowed", [ 151 return Clipperz.Async.callbacks("NewUserWizardController.handlerRulerShowed", [
155 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'), 152 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'),
156 MochiKit.Base.method(this, 'handleCursorMoved') 153 MochiKit.Base.method(this, 'handleCursorMoved')
157 ], {trace:false}); 154 ], {trace:false});
158 }, 155 },
159 156
160 //----------------------------------------------------------------------------- 157 //-----------------------------------------------------------------------------
161 158
162 'hideRuler': function () { 159 'hideRuler': function () {
163 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:0.5}); 160 new MochiKit.Visual.Move(this.rulerComponent().element(), {x:-1000, mode:'relative', duration:0.5});
164 }, 161 },
165 162
166 'doneWithRuler': function () { 163 'doneWithRuler': function () {
167 var rulerComponentElement; 164 var rulerComponentElement;
168 165
169 rulerComponentElement = this.rulerComponent().element(); 166 rulerComponentElement = this.rulerComponent().element();
170 new MochiKit.Visual.Move(this.rulerComponent().element(), { 167 new MochiKit.Visual.Move(this.rulerComponent().element(), {
171 x:1000, 168 x:1000,
172 mode:'relative', 169 mode:'relative',
173 duration:1, 170 duration:1,
174 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement) 171 // afterFinish:MochiKit.Base.partial(MochiKit.Style.hideElement, rulerComponentElement)
175 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); } 172 afterFinish:function () { MochiKit.Style.hideElement(rulerComponentElement); }
176 }); 173 });
177 }, 174 },
178 175
179 //============================================================================= 176 //=============================================================================
180 177
181 'createNewUserRulerSteps': function () { 178 'createNewUserRulerSteps': function () {
182 return [ 'CREDENTIALS', 'CHECK_CREDENTIALS', 'TERMS_OF_SERVICE', 'CREATE_USER'/*, 'LOGIN' */]; 179 return [ 'CREDENTIALS', 'CHECK_CREDENTIALS', 'TERMS_OF_SERVICE', 'CREATE_USER'/*, 'LOGIN' */];
183 }, 180 },
184 181
185 //------------------------------------------------------------------------- 182 //-------------------------------------------------------------------------
186 183
187 'run': function () { 184 'run': function () {
188 return Clipperz.Async.callbacks("NewUserWizardController.run", [ 185 return Clipperz.Async.callbacks("NewUserWizardController.run", [
189 MochiKit.Base.method(this, 'createNewUserRulerSteps'), 186 MochiKit.Base.method(this, 'createNewUserRulerSteps'),
190 MochiKit.Base.method(this, 'showRuler') 187 MochiKit.Base.method(this, 'showRuler')
191 ], {trace:false}); 188 ], {trace:false});
192 }, 189 },
193 190
194 //----------------------------------------------------------------------------- 191 //-----------------------------------------------------------------------------
195 192
196 'checkState': function () { 193 'checkState': function () {
197 var enablePrevious; 194 var enablePrevious;
198 var enableNext; 195 var enableNext;
199 196
200 enablePrevious = true; 197 enablePrevious = true;
201 enableNext = false; 198 enableNext = false;
202 199
203 this.newUserCreationComponent().disableAllPanels(); 200 this.newUserCreationComponent().disableAllPanels();
204 201
205 switch(this.currentStep()) { 202 switch(this.currentStep()) {
206 case 'CREDENTIALS': 203 case 'CREDENTIALS':
207 this.newUserCreationComponent().enableCredentialsPanel(); 204 this.newUserCreationComponent().enableCredentialsPanel();
208 205
209 enableNext = ( 206 enableNext = (
210 (this.newUserCreationComponent().username() != '') 207 (this.newUserCreationComponent().username() != '')
211 && 208 &&
212 (this.newUserCreationComponent().passphrase() != '') 209 (this.newUserCreationComponent().passphrase() != '')
213 ); 210 );
214 // enablePrevious = false; 211 // enablePrevious = false;
215 break; 212 break;
216 case 'CHECK_CREDENTIALS': 213 case 'CHECK_CREDENTIALS':
217 this.newUserCreationComponent().enableCheckCredentialsPanel(); 214 this.newUserCreationComponent().enableCheckCredentialsPanel();
218 215
219 enableNext = (this.newUserCreationComponent().passphrase() == this.newUserCreationComponent().rePassphrase()); 216 enableNext = (this.newUserCreationComponent().passphrase() == this.newUserCreationComponent().rePassphrase());
220 // enablePrevious = true; 217 // enablePrevious = true;
221 break 218 break
222 case 'TERMS_OF_SERVICE': 219 case 'TERMS_OF_SERVICE':
223 this.newUserCreationComponent().enableTermsOfServicePanel(); 220 this.newUserCreationComponent().enableTermsOfServicePanel();
224 221
225//console.log("awareOfUnrecoverablePassphrase", this.newUserCreationComponent().awareOfUnrecoverablePassphrase());
226//console.log("readTermsOfService", this.newUserCreationComponent().readTermsOfService());
227 enableNext = ( 222 enableNext = (
228 (this.newUserCreationComponent().awareOfUnrecoverablePassphrase() == 'on') 223 (this.newUserCreationComponent().awareOfUnrecoverablePassphrase() == 'on')
229 && 224 &&
230 (this.newUserCreationComponent().readTermsOfService() == 'on') 225 (this.newUserCreationComponent().readTermsOfService() == 'on')
231 ) 226 )
232 break; 227 break;
233 case 'CREATE_USER': 228 case 'CREATE_USER':
234//console.log(">>> CREATE_USER", this.userCreationState());
235 this.newUserCreationComponent().enableCreateUserPanel(); 229 this.newUserCreationComponent().enableCreateUserPanel();
236 230
237 switch (this.userCreationState()) { 231 switch (this.userCreationState()) {
238 case 'IDLE': 232 case 'IDLE':
239 this.setUserCreationState('IN PROGRESS'); 233 this.setUserCreationState('IN PROGRESS');
240 this.preformActualUserRegistration(); 234 this.preformActualUserRegistration();
241 235
242 enablePrevious = false; 236 enablePrevious = false;
243 enableNext = false; 237 enableNext = false;
244 break; 238 break;
245 case 'IN PROGRESS': 239 case 'IN PROGRESS':
246 enablePrevious = false; 240 enablePrevious = false;
247 enableNext = false; 241 enableNext = false;
248 break; 242 break;
249 case 'DONE': 243 case 'DONE':
250 enablePrevious = false; 244 enablePrevious = false;
251 enableNext = true; 245 enableNext = true;
252 break; 246 break;
253 case 'FAILED': 247 case 'FAILED':
254 enablePrevious = true; 248 enablePrevious = true;
255 enableNext = false; 249 enableNext = false;
256 break; 250 break;
257 }; 251 };
258 break; 252 break;
259 // case 'LOGIN': 253 // case 'LOGIN':
260 // this.newUserCreationComponent().enableLoginPanel(); 254 // this.newUserCreationComponent().enableLoginPanel();
261 // break; 255 // break;
262 } 256 }
263 257
264 if (this.currentStepIndex() > 0) { 258 if (this.currentStepIndex() > 0) {
265 this.enablePrevious(enablePrevious); 259 this.enablePrevious(enablePrevious);
266 } else { 260 } else {
267 this.enablePrevious(false); 261 this.enablePrevious(false);
268 } 262 }
269 this.enableNext(enableNext); 263 this.enableNext(enableNext);
270 }, 264 },
271 265
272 //----------------------------------------------------------------------------- 266 //-----------------------------------------------------------------------------
273 267
274 'setFocus': function () { 268 'setFocus': function () {
275 switch(this.currentStep()) { 269 switch(this.currentStep()) {
276 case 'CREDENTIALS': 270 case 'CREDENTIALS':
277 this.newUserCreationComponent().focusOnUsernameElement(); 271 this.newUserCreationComponent().focusOnUsernameElement();
278 break; 272 break;
279 case 'CHECK_CREDENTIALS': 273 case 'CHECK_CREDENTIALS':
280 this.newUserCreationComponent().focusOnRePassphraseElement(); 274 this.newUserCreationComponent().focusOnRePassphraseElement();
281 break 275 break
282 case 'TERMS_OF_SERVICE': 276 case 'TERMS_OF_SERVICE':
283 break; 277 break;
284 case 'CREATE_USER': 278 case 'CREATE_USER':
285 break; 279 break;
286 // case 'LOGIN': 280 // case 'LOGIN':
287 // break; 281 // break;
288 } 282 }
289 }, 283 },
290 284
291 //============================================================================= 285 //=============================================================================
292 286
293 'steps': function () { 287 'steps': function () {
294 return this._steps; 288 return this._steps;
295 }, 289 },
296 290
297 'setSteps': function (aValue) { 291 'setSteps': function (aValue) {
298 this._steps = aValue; 292 this._steps = aValue;
299 293
300 this.rulerComponent().setSteps(aValue); 294 this.rulerComponent().setSteps(aValue);
301 this.resetCurrentStepIndex(); 295 this.resetCurrentStepIndex();
302 }, 296 },
303 297
304 'currentStepIndex': function () { 298 'currentStepIndex': function () {
305 return this._currentStepIndex; 299 return this._currentStepIndex;
306 }, 300 },
307 301
308 'currentStep': function () { 302 'currentStep': function () {
309 return this.steps()[this.currentStepIndex()]; 303 return this.steps()[this.currentStepIndex()];
310 }, 304 },
311 305
312 //============================================================================= 306 //=============================================================================
313 307
314 'handleExit': function () { 308 'handleExit': function () {
315 return Clipperz.Async.callbacks("NewUserWizardController.handleExit", [ 309 return Clipperz.Async.callbacks("NewUserWizardController.handleExit", [
316 // MochiKit.Base.method(this.newUserCreationComponent(), 'resetContent'), 310 // MochiKit.Base.method(this.newUserCreationComponent(), 'resetContent'),
317 Clipperz.Async.forkAndJoin("NewUserWizardController.handleExit - fork and join", [ 311 Clipperz.Async.forkAndJoin("NewUserWizardController.handleExit - fork and join", [
318 MochiKit.Base.method(this, 'hideRuler'), 312 MochiKit.Base.method(this, 'hideRuler'),
319 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredHideModal') 313 MochiKit.Base.method(this.newUserCreationComponent(), 'deferredHideModal')
320 ], {trace:false}), 314 ], {trace:false}),
321 MochiKit.Base.method(this, 'resetRuler'), 315 MochiKit.Base.method(this, 'resetRuler'),
322 // MochiKit.Base.method(this.newUserCreationComponent(), 'reset'), 316 // MochiKit.Base.method(this.newUserCreationComponent(), 'reset'),
323 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'exit') 317 MochiKit.Base.partial(MochiKit.Signal.signal, this, 'exit')
324 ], {trace:false}) 318 ], {trace:false})
325 }, 319 },
326 320
327 'done': function () { 321 'done': function () {
328 this.doneWithRuler(); 322 this.doneWithRuler();
329 MochiKit.Signal.signal(this, 'done', {'user': this.user()}); 323 MochiKit.Signal.signal(this, 'done', {'user': this.user()});
330 }, 324 },
331 325
332 //============================================================================= 326 //=============================================================================
333 327
334 'handleMoveBackward': function () { 328 'handleMoveBackward': function () {
335 if (this._currentStepIndex > 0) { 329 if (this._currentStepIndex > 0) {
336 varafterMoveAction; 330 varafterMoveAction;
337 331
338 afterMoveAction = MochiKit.Base.noop; 332 afterMoveAction = MochiKit.Base.noop;
339 333
340//console.log("<-- backward", this.currentStep());
341 switch(this.currentStep()) { 334 switch(this.currentStep()) {
342 case 'CREDENTIALS': 335 case 'CREDENTIALS':
343 case 'CHECK_CREDENTIALS': 336 case 'CHECK_CREDENTIALS':
344 case 'TERMS_OF_SERVICE': 337 case 'TERMS_OF_SERVICE':
345 this._currentStepIndex --; 338 this._currentStepIndex --;
346 this.rulerComponent().moveBackward(afterMoveAction); 339 this.rulerComponent().moveBackward(afterMoveAction);
347 break; 340 break;
348 case 'CREATE_USER': 341 case 'CREATE_USER':
349 this.setUser(null); 342 this.setUser(null);
350 this.newUserCreationComponent().hideAllProgeressStates(); 343 this.newUserCreationComponent().hideAllProgeressStates();
351 this.resetCurrentStepIndex(); 344 this.resetCurrentStepIndex();
352 this.setUserCreationState('IDLE'); 345 this.setUserCreationState('IDLE');
353 break; 346 break;
354 // case 'LOGIN': 347 // case 'LOGIN':
355 // break; 348 // break;
356 }; 349 };
357 350
358 } 351 }
359 352
360 if (this._currentStepIndex == 0) { 353 if (this._currentStepIndex == 0) {
361 this.enablePrevious(false); 354 this.enablePrevious(false);
362 } 355 }
363 }, 356 },
364 357
365 'handleMoveForward': function () { 358 'handleMoveForward': function () {
366 if (this.isNextEnabled()) { 359 if (this.isNextEnabled()) {
367 varafterMoveAction; 360 varafterMoveAction;
368 361
369 this._currentStepIndex ++; 362 this._currentStepIndex ++;
370 afterMoveAction = MochiKit.Base.noop; 363 afterMoveAction = MochiKit.Base.noop;
371 364
372 switch(this.currentStep()) { 365 switch(this.currentStep()) {
373 case 'CREDENTIALS': 366 case 'CREDENTIALS':
374 break; 367 break;
375 case 'CHECK_CREDENTIALS': 368 case 'CHECK_CREDENTIALS':
376 break 369 break
377 case 'TERMS_OF_SERVICE': 370 case 'TERMS_OF_SERVICE':
378 break; 371 break;
379 case 'CREATE_USER': 372 case 'CREATE_USER':
380 break; 373 break;
381 // case 'LOGIN': 374 // case 'LOGIN':
382 // break; 375 // break;
383 }; 376 };
384 377
385 this.rulerComponent().moveForward(afterMoveAction); 378 this.rulerComponent().moveForward(afterMoveAction);
386 }; 379 };
387 }, 380 },
388 381
389 'handleCursorMoved': function () { 382 'handleCursorMoved': function () {
390 // this.checkState(); 383 // this.checkState();
391 // this.setFocus(); 384 // this.setFocus();
392 385
393 return Clipperz.Async.callbacks("NewUserWizardController.handleCursorMoved", [ 386 return Clipperz.Async.callbacks("NewUserWizardController.handleCursorMoved", [
394 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'), 387 MochiKit.Base.method(this.newUserCreationComponent(), 'waitUntilFullyRendered'),
395 MochiKit.Base.method(this, 'checkState'), 388 MochiKit.Base.method(this, 'checkState'),
396 MochiKit.Base.method(this, 'setFocus') 389 MochiKit.Base.method(this, 'setFocus')
397 ], {trace:false}); 390 ], {trace:false});
398 }, 391 },
399 392
400 //------------------------------------------------------------------------- 393 //-------------------------------------------------------------------------
401 394
402 'handleChangedValue': function (anEvent) { 395 'handleChangedValue': function (anEvent) {
403 this.checkState(); 396 this.checkState();
404 }, 397 },
405 398
406 //------------------------------------------------------------------------- 399 //-------------------------------------------------------------------------
407 400
408 'handleNewUserCreationComponentKeyPressed': function (anEvent) { 401 'handleNewUserCreationComponentKeyPressed': function (anEvent) {
409//console.log(">>> handleNewUserCreationComponentKeyPressed", anEvent.key().string);
410 if (anEvent.key().string == 'KEY_ENTER') { 402 if (anEvent.key().string == 'KEY_ENTER') {
411 if (anEvent.target().nodeName != 'TEXTAREA') { 403 if (anEvent.target().nodeName != 'TEXTAREA') {
412 anEvent.preventDefault(); 404 anEvent.preventDefault();
413 this.handleMoveForward(); 405 this.handleMoveForward();
414 } 406 }
415 } else if (anEvent.key().string == 'KEY_TAB') { 407 } else if (anEvent.key().string == 'KEY_TAB') {
416 if (anEvent.target() == this.newUserCreationComponent().usernameElement()) { 408 if (anEvent.target() == this.newUserCreationComponent().usernameElement()) {
417 } else { 409 } else {
418 this.handleMoveForward(); 410 this.handleMoveForward();
419 if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) { 411 if ((anEvent.target().nodeName == 'INPUT') || (anEvent.target().nodeName == 'TEXTAREA')) {
420 anEvent.preventDefault(); 412 anEvent.preventDefault();
421 } 413 }
422 } 414 }
423 } else if ((anEvent.key().string == 'KEY_ARROW_RIGHT') && (anEvent.modifier().meta == true)) { 415 } else if ((anEvent.key().string == 'KEY_ARROW_RIGHT') && (anEvent.modifier().meta == true)) {
424 this.handleMoveForward(); 416 this.handleMoveForward();
425 } else if ((anEvent.key().string == 'KEY_ARROW_LEFT') && (anEvent.modifier().meta == true)) { 417 } else if ((anEvent.key().string == 'KEY_ARROW_LEFT') && (anEvent.modifier().meta == true)) {
426 this.handleMoveBackward(); 418 this.handleMoveBackward();
427 } else if (anEvent.key().string == 'KEY_ESCAPE') { 419 } else if (anEvent.key().string == 'KEY_ESCAPE') {
428 anEvent.stop(); 420 anEvent.stop();
429 this.handleExit(); 421 this.handleExit();
430 } else { 422 } else {
431 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'checkState')); 423 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'checkState'));
432 } 424 }
433 }, 425 },
434 426
435 //============================================================================= 427 //=============================================================================
436 428
437 'preformActualUserRegistration': function () { 429 'preformActualUserRegistration': function () {
438 vardeferredResult; 430 vardeferredResult;
439 431
440 deferredResult = new Clipperz.Async.Deferred("NewUSerWizardController.preformActualUserRegistration", {trace:false}); 432 deferredResult = new Clipperz.Async.Deferred("NewUSerWizardController.preformActualUserRegistration", {trace:false});
441 deferredResult.addMethod(this.newUserCreationComponent(), 'showProgressOnUserCreation'); 433 deferredResult.addMethod(this.newUserCreationComponent(), 'showProgressOnUserCreation');
442 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this.newUserCreationComponent(), 'passphrase')); 434 deferredResult.addMethod(Clipperz.PM.RunTime.mainController, 'setPassphraseDelegate', MochiKit.Base.method(this.newUserCreationComponent(), 'passphrase'));
443 deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, 435 deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount,
444 this.newUserCreationComponent().username(), 436 this.newUserCreationComponent().username(),
445 MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase') 437 MochiKit.Base.method(Clipperz.PM.RunTime.mainController, 'getPassphrase')
446 ); 438 );
447 deferredResult.addMethod(this, 'setUser'); 439 deferredResult.addMethod(this, 'setUser');
448 deferredResult.addMethod(this.newUserCreationComponent(), 'showUserCreationDone'); 440 deferredResult.addMethod(this.newUserCreationComponent(), 'showUserCreationDone');
449 deferredResult.addMethod(this, 'setUserCreationState', 'DONE'); 441 deferredResult.addMethod(this, 'setUserCreationState', 'DONE');
450 442
451 // deferredResult.addErrback(MochiKit.Base.method(this.newUserCreationComponent(), 'showUserCreationFailed')); 443 // deferredResult.addErrback(MochiKit.Base.method(this.newUserCreationComponent(), 'showUserCreationFailed'));
452 // deferredResult.addErrback(MochiKit.Base.method(this, 'setUser', null)); 444 // deferredResult.addErrback(MochiKit.Base.method(this, 'setUser', null));
453 // deferredResult.addErrback(MochiKit.Base.method(this, 'setUserCreationState', 'FAILED')); 445 // deferredResult.addErrback(MochiKit.Base.method(this, 'setUserCreationState', 'FAILED'));
454 deferredResult.addErrback(MochiKit.Base.bind(function (aValue) { 446 deferredResult.addErrback(MochiKit.Base.bind(function (aValue) {
455 this.newUserCreationComponent().showUserCreationFailed(); 447 this.newUserCreationComponent().showUserCreationFailed();
456 this.setUser(null); 448 this.setUser(null);
457 this.setUserCreationState('FAILED'); 449 this.setUserCreationState('FAILED');
458 }, this)); 450 }, this));
459 deferredResult.callback(); 451 deferredResult.callback();
460 452
461 return deferredResult; 453 return deferredResult;
462 }, 454 },
463 455
464 //============================================================================= 456 //=============================================================================
465 __syntaxFix__: "syntax fix" 457 __syntaxFix__: "syntax fix"
466}); 458});
diff --git a/frontend/gamma/js/Clipperz/Set.js b/frontend/gamma/js/Clipperz/Set.js
index 7023888..b3831a4 100644
--- a/frontend/gamma/js/Clipperz/Set.js
+++ b/frontend/gamma/js/Clipperz/Set.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26 24
27if (typeof(Clipperz) == 'undefined') { 25if (typeof(Clipperz) == 'undefined') {
28 Clipperz = {}; 26 Clipperz = {};
29} 27}
30 28
31//############################################################################# 29//#############################################################################
32 30
33Clipperz.Set = function(args) { 31Clipperz.Set = function(args) {
34 args = args || {}; 32 args = args || {};
35 //MochiKit.Base.bindMethods(this); 33 //MochiKit.Base.bindMethods(this);
36 34
37 if (args.items != null) { 35 if (args.items != null) {
38 this._items = args.items.slice(); 36 this._items = args.items.slice();
39 } else { 37 } else {
40 this._items = []; 38 this._items = [];
41 } 39 }
42 40
43 return this; 41 return this;
44} 42}
45 43
46//============================================================================= 44//=============================================================================
47 45
48Clipperz.Set.prototype = MochiKit.Base.update(null, { 46Clipperz.Set.prototype = MochiKit.Base.update(null, {
49 47
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'toString': function() { 50 'toString': function() {
53 return "Clipperz.Set"; 51 return "Clipperz.Set";
54 }, 52 },
55 53
56 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
57 55
58 'items': function() { 56 'items': function() {
59 return this._items; 57 return this._items;
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'popAnItem': function() { 62 'popAnItem': function() {
65 var result; 63 var result;
66 64
67 if (this.size() > 0) { 65 if (this.size() > 0) {
68 result = this.items().pop(); 66 result = this.items().pop();
69 } else { 67 } else {
70 result = null; 68 result = null;
71 } 69 }
72 70
73 return result; 71 return result;
74 }, 72 },
75 73
76 //------------------------------------------------------------------------- 74 //-------------------------------------------------------------------------
77 75
78 'allItems': function() { 76 'allItems': function() {
79 return this.items(); 77 return this.items();
80 }, 78 },
81 79
82 //------------------------------------------------------------------------- 80 //-------------------------------------------------------------------------
83 81
84 'contains': function(anItem) { 82 'contains': function(anItem) {
85 return (this.indexOf(anItem) != -1); 83 return (this.indexOf(anItem) != -1);
86 }, 84 },
87 85
88 //------------------------------------------------------------------------- 86 //-------------------------------------------------------------------------
89 87
90 'indexOf': function(anItem) { 88 'indexOf': function(anItem) {
91 varresult; 89 varresult;
92 vari, c; 90 vari, c;
93 91
94 result = -1; 92 result = -1;
95 93
96 c = this.items().length; 94 c = this.items().length;
97 for (i=0; (i<c) && (result == -1); i++) { 95 for (i=0; (i<c) && (result == -1); i++) {
98 if (this.items()[i] === anItem) { 96 if (this.items()[i] === anItem) {
99 result = i; 97 result = i;
100 } 98 }
101 } 99 }
102 100
103 return result; 101 return result;
104 }, 102 },
105 103
106 //------------------------------------------------------------------------- 104 //-------------------------------------------------------------------------
107 105
108 'add': function(anItem) { 106 'add': function(anItem) {
109 if (anItem.constructor == Array) { 107 if (anItem.constructor == Array) {
110 MochiKit.Base.map(MochiKit.Base.bind(this,add, this), anItem); 108 MochiKit.Base.map(MochiKit.Base.bind(this,add, this), anItem);
111 } else { 109 } else {
112 if (! this.contains(anItem)) { 110 if (! this.contains(anItem)) {
113 this.items().push(anItem); 111 this.items().push(anItem);
114 } 112 }
115 } 113 }
116 }, 114 },
117 115
118 //------------------------------------------------------------------------- 116 //-------------------------------------------------------------------------
diff --git a/frontend/gamma/js/Clipperz/Signal.js b/frontend/gamma/js/Clipperz/Signal.js
index ca3e322..f9b74c9 100644
--- a/frontend/gamma/js/Clipperz/Signal.js
+++ b/frontend/gamma/js/Clipperz/Signal.js
@@ -1,68 +1,66 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.Signal) == 'undefined') { Clipperz.Signal = {}; } 25if (typeof(Clipperz.Signal) == 'undefined') { Clipperz.Signal = {}; }
28 26
29Clipperz.Signal.VERSION = "0.1"; 27Clipperz.Signal.VERSION = "0.1";
30Clipperz.Signal.NAME = "Clipperz.Signal"; 28Clipperz.Signal.NAME = "Clipperz.Signal";
31 29
32MochiKit.Base.update(Clipperz.Signal, { 30MochiKit.Base.update(Clipperz.Signal, {
33 31
34 //------------------------------------------------------------------------- 32 //-------------------------------------------------------------------------
35 33
36 '__repr__': function () { 34 '__repr__': function () {
37 return "[" + this.NAME + " " + this.VERSION + "]"; 35 return "[" + this.NAME + " " + this.VERSION + "]";
38 }, 36 },
39 37
40 //------------------------------------------------------------------------- 38 //-------------------------------------------------------------------------
41 39
42 'toString': function () { 40 'toString': function () {
43 return this.__repr__(); 41 return this.__repr__();
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'fireNativeEvent': function(element, eventName) { 46 'fireNativeEvent': function(element, eventName) {
49 if (element.fireEvent) { 47 if (element.fireEvent) {
50 // MSIE 48 // MSIE
51 element.fireEvent(eventName); 49 element.fireEvent(eventName);
52 } else { 50 } else {
53 // W3C 51 // W3C
54 var event; 52 var event;
55 53
56 event = document.createEvent("HTMLEvents"); 54 event = document.createEvent("HTMLEvents");
57 event.initEvent(eventName.replace(/^on/, ""), true, true); 55 event.initEvent(eventName.replace(/^on/, ""), true, true);
58 element.dispatchEvent(event); 56 element.dispatchEvent(event);
59 } 57 }
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 __syntaxFix__: "syntax fix" 61 __syntaxFix__: "syntax fix"
64 62
65}); 63});
66 64
67Clipperz.Signal.NotificationCenter = {}; 65Clipperz.Signal.NotificationCenter = {};
68 66
diff --git a/frontend/gamma/js/Clipperz/Style.js b/frontend/gamma/js/Clipperz/Style.js
index d377893..acbe71b 100644
--- a/frontend/gamma/js/Clipperz/Style.js
+++ b/frontend/gamma/js/Clipperz/Style.js
@@ -1,91 +1,89 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.Style) == 'undefined') { Clipperz.Style = {}; } 25if (typeof(Clipperz.Style) == 'undefined') { Clipperz.Style = {}; }
28 26
29Clipperz.Style.VERSION = "0.1"; 27Clipperz.Style.VERSION = "0.1";
30Clipperz.Style.NAME = "Clipperz.DOM"; 28Clipperz.Style.NAME = "Clipperz.DOM";
31 29
32MochiKit.Base.update(Clipperz.Style, { 30MochiKit.Base.update(Clipperz.Style, {
33 31
34 //------------------------------------------------------------------------- 32 //-------------------------------------------------------------------------
35 33
36 '__repr__': function () { 34 '__repr__': function () {
37 return "[" + this.NAME + " " + this.VERSION + "]"; 35 return "[" + this.NAME + " " + this.VERSION + "]";
38 }, 36 },
39 37
40 //------------------------------------------------------------------------- 38 //-------------------------------------------------------------------------
41 39
42 'toString': function () { 40 'toString': function () {
43 return this.__repr__(); 41 return this.__repr__();
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'applyZebraStylesToTable': function(aTable) { 46 'applyZebraStylesToTable': function(aTable) {
49 var tbody; 47 var tbody;
50 var tbodyRows; 48 var tbodyRows;
51 var i,c; 49 var i,c;
52 50
53 tbody = MochiKit.DOM.getFirstElementByTagAndClassName('tbody', null, aTable); 51 tbody = MochiKit.DOM.getFirstElementByTagAndClassName('tbody', null, aTable);
54 tbodyRows = tbody.childNodes; 52 tbodyRows = tbody.childNodes;
55 // tbodyRows = MochiKit.DOM.getElementsByTagAndClassName('tr', null, tbody) 53 // tbodyRows = MochiKit.DOM.getElementsByTagAndClassName('tr', null, tbody)
56 c = tbodyRows.length; 54 c = tbodyRows.length;
57 for (i=0; i<c; i++) { 55 for (i=0; i<c; i++) {
58 var element; 56 var element;
59 57
60 element = YAHOO.Element.get(tbodyRows[i]); 58 element = YAHOO.Element.get(tbodyRows[i]);
61 element.addClass(((i%2 == 0) ? "zebra_odd": "zebra_even")); 59 element.addClass(((i%2 == 0) ? "zebra_odd": "zebra_even"));
62 element.removeClass(((i%2 == 1) ? "zebra_odd": "zebra_even")); 60 element.removeClass(((i%2 == 1) ? "zebra_odd": "zebra_even"));
63 } 61 }
64 }, 62 },
65 63
66 //------------------------------------------------------------------------- 64 //-------------------------------------------------------------------------
67 65
68 'getSizeAndPosition': function (anElement) { 66 'getSizeAndPosition': function (anElement) {
69 var result; 67 var result;
70 68
71 if (anElement != null) { 69 if (anElement != null) {
72 result ={ dimensions:MochiKit.Style.getElementDimensions(anElement), position:MochiKit.Style.getElementPosition(anElement)}; 70 result ={ dimensions:MochiKit.Style.getElementDimensions(anElement), position:MochiKit.Style.getElementPosition(anElement)};
73 } else { 71 } else {
74 result ={ dimensions:MochiKit.Style.getViewportDimensions(), position:MochiKit.Style.getViewportPosition()}; 72 result ={ dimensions:MochiKit.Style.getViewportDimensions(), position:MochiKit.Style.getViewportPosition()};
75 } 73 }
76 74
77 return result; 75 return result;
78 }, 76 },
79 77
80 'setBackgroundGradient': function (anElement, someParameters) { 78 'setBackgroundGradient': function (anElement, someParameters) {
81 // background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333)); 79 // background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333));
82 // background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955); 80 // background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955);
83 MochiKit.Style.setStyle(anElement, {'background': '-webkit-gradient(linear, 0% 0%, 0% 100%, from(' + someParameters['from'] + '), to(' + someParameters['to'] + '), color-stop(1,#333333))'}); 81 MochiKit.Style.setStyle(anElement, {'background': '-webkit-gradient(linear, 0% 0%, 0% 100%, from(' + someParameters['from'] + '), to(' + someParameters['to'] + '), color-stop(1,#333333))'});
84 MochiKit.Style.setStyle(anElement, {'background': '-moz-linear-gradient(0% 100% 90deg,' + someParameters['to'] + ', ' + someParameters['from'] + ')'}); 82 MochiKit.Style.setStyle(anElement, {'background': '-moz-linear-gradient(0% 100% 90deg,' + someParameters['to'] + ', ' + someParameters['from'] + ')'});
85 }, 83 },
86 84
87 //------------------------------------------------------------------------- 85 //-------------------------------------------------------------------------
88 __syntaxFix__: "syntax fix" 86 __syntaxFix__: "syntax fix"
89 87
90}); 88});
91 89
diff --git a/frontend/gamma/js/Clipperz/Visual.js b/frontend/gamma/js/Clipperz/Visual.js
index c2da3b7..93ed725 100644
--- a/frontend/gamma/js/Clipperz/Visual.js
+++ b/frontend/gamma/js/Clipperz/Visual.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.Visual) == 'undefined') { Clipperz.Visual = {}; } 25if (typeof(Clipperz.Visual) == 'undefined') { Clipperz.Visual = {}; }
28 26
29Clipperz.Visual.VERSION = "0.1"; 27Clipperz.Visual.VERSION = "0.1";
30Clipperz.Visual.NAME = "Clipperz.Visual"; 28Clipperz.Visual.NAME = "Clipperz.Visual";
31 29
32MochiKit.Base.update(Clipperz.Visual, { 30MochiKit.Base.update(Clipperz.Visual, {
33 31
34 //------------------------------------------------------------------------- 32 //-------------------------------------------------------------------------
35 33
36 '__repr__': function () { 34 '__repr__': function () {
37 return "[" + this.NAME + " " + this.VERSION + "]"; 35 return "[" + this.NAME + " " + this.VERSION + "]";
38 }, 36 },
39 37
40 //------------------------------------------------------------------------- 38 //-------------------------------------------------------------------------
41 39
42 'toString': function () { 40 'toString': function () {
43 return this.__repr__(); 41 return this.__repr__();
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'deferredResize': function (anElement, someOptions) { 46 'deferredResize': function (anElement, someOptions) {
49 var deferredResult; 47 var deferredResult;
50 var moveTransition; 48 var moveTransition;
51 var scaleTransition; 49 var scaleTransition;
52 var duration; 50 var duration;
53 51
54 duration = someOptions.duration || 0.5; 52 duration = someOptions.duration || 0.5;
55 53
56 deferredResult = new Clipperz.Async.Deferred("Visual.deferredResize", {trace:false}); 54 deferredResult = new Clipperz.Async.Deferred("Visual.deferredResize", {trace:false});
57 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]); 55 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
58 56
59 moveTransition = MochiKit.Visual.Transitions.linear;//MochiKit.Visual.Transitions.sinoidal; 57 moveTransition = MochiKit.Visual.Transitions.linear;//MochiKit.Visual.Transitions.sinoidal;
60 scaleTransition = MochiKit.Visual.Transitions.linear;//MochiKit.Visual.Transitions.sinoidal; 58 scaleTransition = MochiKit.Visual.Transitions.linear;//MochiKit.Visual.Transitions.sinoidal;
61 59
62 MochiKit.Style.setElementPosition(anElement, {x:someOptions.from.position.x, y:someOptions.from.position.y }, 'px'); 60 MochiKit.Style.setElementPosition(anElement, {x:someOptions.from.position.x, y:someOptions.from.position.y }, 'px');
63 61
64 new MochiKit.Visual.Parallel([ 62 new MochiKit.Visual.Parallel([
65 new MochiKit.Visual.Move(anElement, {x:someOptions.to.position.x, y:someOptions.to.position.y, mode:'absolute', transition:moveTransition, sync:true}), 63 new MochiKit.Visual.Move(anElement, {x:someOptions.to.position.x, y:someOptions.to.position.y, mode:'absolute', transition:moveTransition, sync:true}),
66 new Clipperz.Visual.Resize(anElement, {fromSize:{h:someOptions.from.dimensions.h, w:someOptions.from.dimensions.w}, toSize:{h:someOptions.to.dimensions.h, w:someOptions.to.dimensions.w}, transition:scaleTransition, scaleContent:false, scaleFromCenter:false, restoreAfterFinish:true, sync:true}) 64 new Clipperz.Visual.Resize(anElement, {fromSize:{h:someOptions.from.dimensions.h, w:someOptions.from.dimensions.w}, toSize:{h:someOptions.to.dimensions.h, w:someOptions.to.dimensions.w}, transition:scaleTransition, scaleContent:false, scaleFromCenter:false, restoreAfterFinish:true, sync:true})
67 ], {duration:duration, afterFinish:MochiKit.Base.method(deferredResult, 'callback')}) 65 ], {duration:duration, afterFinish:MochiKit.Base.method(deferredResult, 'callback')})
68 66
69 return deferredResult; 67 return deferredResult;
70 }, 68 },
71 69
72 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
73 71
74 'deferredAnimation': function (anAnimation, someParameters, someOptions) { 72 'deferredAnimation': function (anAnimation, someParameters, someOptions) {
75 vardeferredResult; 73 vardeferredResult;
76 var afterFinishCallback; 74 var afterFinishCallback;
77 var options; 75 var options;
78 76
79 deferredResult = new Clipperz.Async.Deferred("Clipperz.Visual.deferredAnimation", {trace:false}); 77 deferredResult = new Clipperz.Async.Deferred("Clipperz.Visual.deferredAnimation", {trace:false});
80 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]); 78 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
81 79
82 if (MochiKit.Base.isUndefinedOrNull(someOptions)) { 80 if (MochiKit.Base.isUndefinedOrNull(someOptions)) {
83 options = {} 81 options = {}
84 } else { 82 } else {
85 options = someOptions; 83 options = someOptions;
86 } 84 }
87 85
88 if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) { 86 if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) {
89 options['afterFinish'] = MochiKit.Base.noop; 87 options['afterFinish'] = MochiKit.Base.noop;
90 } 88 }
91 89
92 MochiKit.Base.update(options, { 90 MochiKit.Base.update(options, {
93 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback')) 91 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback'))
94 }); 92 });
95 93
96 new anAnimation(someParameters, options); 94 new anAnimation(someParameters, options);
97 95
98 return deferredResult; 96 return deferredResult;
99 }, 97 },
100 98
101 //------------------------------------------------------------------------- 99 //-------------------------------------------------------------------------
102 100
103 'deferredAnimations': function (aSinchronizationType, someAnimations, someOptions) { 101 'deferredAnimations': function (aSinchronizationType, someAnimations, someOptions) {
104 var deferredResult; 102 var deferredResult;
105 varoptions; 103 varoptions;
106 104
107 deferredResult = new Clipperz.Async.Deferred("Visual.deferredParallelAnimations", {trace:false}); 105 deferredResult = new Clipperz.Async.Deferred("Visual.deferredParallelAnimations", {trace:false});
108 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]); 106 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
109 107
110 options = someOptions; 108 options = someOptions;
111 if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) { 109 if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) {
112 options['afterFinish'] = MochiKit.Base.noop; 110 options['afterFinish'] = MochiKit.Base.noop;
113 } 111 }
114 MochiKit.Base.update(options, { 112 MochiKit.Base.update(options, {
115 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback')) 113 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback'))
116 }); 114 });
117 115
118 new aSinchronizationType(someAnimations, options) 116 new aSinchronizationType(someAnimations, options)
diff --git a/frontend/gamma/js/Clipperz/YUI/DomHelper.js b/frontend/gamma/js/Clipperz/YUI/DomHelper.js
index 87c74f5..0a1f9fe 100644
--- a/frontend/gamma/js/Clipperz/YUI/DomHelper.js
+++ b/frontend/gamma/js/Clipperz/YUI/DomHelper.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; } 25if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; }
28 26
29 27
30/** 28/**
31 * @class Clipperz.ext.DomHelper 29 * @class Clipperz.ext.DomHelper
32 * Utility class for working with DOM and/or Templates. It transparently supports using HTML fragments or DOM. 30 * Utility class for working with DOM and/or Templates. It transparently supports using HTML fragments or DOM.
33 * For more information see <a href="http://www.jackslocum.com/yui/2006/10/06/domhelper-create-elements-using-dom-html-fragments-or-templates/">this blog post with examples</a>. 31 * For more information see <a href="http://www.jackslocum.com/yui/2006/10/06/domhelper-create-elements-using-dom-html-fragments-or-templates/">this blog post with examples</a>.
34 * @singleton 32 * @singleton
35 */ 33 */
36Clipperz.YUI.DomHelper = new function(){ 34Clipperz.YUI.DomHelper = new function(){
37 /**@private*/ 35 /**@private*/
38 var d = document; 36 var d = document;
39 var tempTableEl = null; 37 var tempTableEl = null;
40 /** True to force the use of DOM instead of html fragments @type Boolean */ 38 /** True to force the use of DOM instead of html fragments @type Boolean */
41 this.useDom = false; 39 this.useDom = false;
42 var emptyTags = /^(?:base|basefont|br|frame|hr|img|input|isindex|link|meta|nextid|range|spacer|wbr|audioscope|area|param|keygen|col|limittext|spot|tab|over|right|left|choose|atop|of)$/i; 40 var emptyTags = /^(?:base|basefont|br|frame|hr|img|input|isindex|link|meta|nextid|range|spacer|wbr|audioscope|area|param|keygen|col|limittext|spot|tab|over|right|left|choose|atop|of)$/i;
43 /** 41 /**
44 * Applies a style specification to an element 42 * Applies a style specification to an element
45 * @param {String/HTMLElement} el The element to apply styles to 43 * @param {String/HTMLElement} el The element to apply styles to
46 * @param {String/Object/Function} styles A style specification string eg "width:100px", or object in the form {width:"100px"}, or 44 * @param {String/Object/Function} styles A style specification string eg "width:100px", or object in the form {width:"100px"}, or
47 * a function which returns such a specification. 45 * a function which returns such a specification.
48 */ 46 */
49 this.applyStyles = function(el, styles){ 47 this.applyStyles = function(el, styles){
50 if(styles){ 48 if(styles){
51 var D = YAHOO.util.Dom; 49 var D = YAHOO.util.Dom;
52 if (typeof styles == "string"){ 50 if (typeof styles == "string"){
53 var re = /\s?([a-z\-]*)\:([^;]*);?/gi; 51 var re = /\s?([a-z\-]*)\:([^;]*);?/gi;
54 var matches; 52 var matches;
55 while ((matches = re.exec(styles)) != null){ 53 while ((matches = re.exec(styles)) != null){
56 D.setStyle(el, matches[1], matches[2]); 54 D.setStyle(el, matches[1], matches[2]);
57 } 55 }
58 }else if (typeof styles == "object"){ 56 }else if (typeof styles == "object"){
59 for (var style in styles){ 57 for (var style in styles){
60 D.setStyle(el, style, styles[style]); 58 D.setStyle(el, style, styles[style]);
61 } 59 }
62 }else if (typeof styles == "function"){ 60 }else if (typeof styles == "function"){
63 Clipperz.YUI.DomHelper.applyStyles(el, styles.call()); 61 Clipperz.YUI.DomHelper.applyStyles(el, styles.call());
64 } 62 }
65 } 63 }
66 }; 64 };
67 65
68 // build as innerHTML where available 66 // build as innerHTML where available
69 /** @ignore */ 67 /** @ignore */
70 var createHtml = function(o){ 68 var createHtml = function(o){
71 var b = ''; 69 var b = '';
72 70
73 if(typeof(o['html']) != 'undefined') { 71 if(typeof(o['html']) != 'undefined') {
74 o['html'] = Clipperz.Base.sanitizeString(o['html']); 72 o['html'] = Clipperz.Base.sanitizeString(o['html']);
75 } else if (typeof(o['htmlString']) != 'undefined') { 73 } else if (typeof(o['htmlString']) != 'undefined') {
76 o['html'] = o['htmlString']; 74 o['html'] = o['htmlString'];
77 delete o.htmlString; 75 delete o.htmlString;
78 } 76 }
79 77
80 if (MochiKit.Base.isArrayLike(o)) { 78 if (MochiKit.Base.isArrayLike(o)) {
81 for (var i = 0, l = o.length; i < l; i++) { 79 for (var i = 0, l = o.length; i < l; i++) {
82 b += createHtml(o[i]); 80 b += createHtml(o[i]);
83 } 81 }
84 return b; 82 return b;
85 } 83 }
86 84
87 b += '<' + o.tag; 85 b += '<' + o.tag;
88 for(var attr in o){ 86 for(var attr in o){
89 if(attr == 'tag' || attr == 'children' || attr == 'html' || typeof o[attr] == 'function') continue; 87 if(attr == 'tag' || attr == 'children' || attr == 'html' || typeof o[attr] == 'function') continue;
90 if(attr == 'style'){ 88 if(attr == 'style'){
91 var s = o['style']; 89 var s = o['style'];
92 if(typeof s == 'function'){ 90 if(typeof s == 'function'){
93 s = s.call(); 91 s = s.call();
94 } 92 }
95 if(typeof s == 'string'){ 93 if(typeof s == 'string'){
96 b += ' style="' + s + '"'; 94 b += ' style="' + s + '"';
97 }else if(typeof s == 'object'){ 95 }else if(typeof s == 'object'){
98 b += ' style="'; 96 b += ' style="';
99 for(var key in s){ 97 for(var key in s){
100 if(typeof s[key] != 'function'){ 98 if(typeof s[key] != 'function'){
101 b += key + ':' + s[key] + ';'; 99 b += key + ':' + s[key] + ';';
102 } 100 }
103 } 101 }
104 b += '"'; 102 b += '"';
105 } 103 }
106 }else{ 104 }else{
107 if(attr == 'cls'){ 105 if(attr == 'cls'){
108 b += ' class="' + o['cls'] + '"'; 106 b += ' class="' + o['cls'] + '"';
109 }else if(attr == 'htmlFor'){ 107 }else if(attr == 'htmlFor'){
110 b += ' for="' + o['htmlFor'] + '"'; 108 b += ' for="' + o['htmlFor'] + '"';
111 }else{ 109 }else{
112 b += ' ' + attr + '="' + o[attr] + '"'; 110 b += ' ' + attr + '="' + o[attr] + '"';
113 } 111 }
114 } 112 }
115 } 113 }
116 if(emptyTags.test(o.tag)){ 114 if(emptyTags.test(o.tag)){
117 b += ' />'; 115 b += ' />';
118 }else{ 116 }else{
@@ -347,132 +345,127 @@ Clipperz.YUI.DomHelper = new function(){
347}(); 345}();
348 346
349/** 347/**
350* @class Clipperz.YUI.DomHelper.Template 348* @class Clipperz.YUI.DomHelper.Template
351* Represents an HTML fragment template. 349* Represents an HTML fragment template.
352* For more information see <a href="http://www.jackslocum.com/yui/2006/10/06/domhelper-create-elements-using-dom-html-fragments-or-templates/">this blog post with examples</a>. 350* For more information see <a href="http://www.jackslocum.com/yui/2006/10/06/domhelper-create-elements-using-dom-html-fragments-or-templates/">this blog post with examples</a>.
353* <br> 351* <br>
354* <b>This class is also available as Clipperz.YUI.Template</b>. 352* <b>This class is also available as Clipperz.YUI.Template</b>.
355* @constructor 353* @constructor
356* @param {String/Array} html The HTML fragment or an array of fragments to join('') or multiple arguments to join('') 354* @param {String/Array} html The HTML fragment or an array of fragments to join('') or multiple arguments to join('')
357*/ 355*/
358Clipperz.YUI.DomHelper.Template = function(html){ 356Clipperz.YUI.DomHelper.Template = function(html){
359 if(html instanceof Array){ 357 if(html instanceof Array){
360 html = html.join(''); 358 html = html.join('');
361 }else if(arguments.length > 1){ 359 }else if(arguments.length > 1){
362 html = Array.prototype.join.call(arguments, ''); 360 html = Array.prototype.join.call(arguments, '');
363 } 361 }
364 /**@private*/ 362 /**@private*/
365 this.html = html; 363 this.html = html;
366}; 364};
367Clipperz.YUI.DomHelper.Template.prototype = { 365Clipperz.YUI.DomHelper.Template.prototype = {
368 /** 366 /**
369 * Returns an HTML fragment of this template with the specified values applied 367 * Returns an HTML fragment of this template with the specified values applied
370 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'}) 368 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
371 * @return {String} 369 * @return {String}
372 */ 370 */
373 applyTemplate : function(values){ 371 applyTemplate : function(values){
374 if(this.compiled){ 372 if(this.compiled){
375 return this.compiled(values); 373 return this.compiled(values);
376 } 374 }
377 var empty = ''; 375 var empty = '';
378 var fn = function(match, index){ 376 var fn = function(match, index){
379 if(typeof values[index] != 'undefined'){ 377 if(typeof values[index] != 'undefined'){
380 return values[index]; 378 return values[index];
381 }else{ 379 }else{
382 return empty; 380 return empty;
383 } 381 }
384 } 382 }
385 return this.html.replace(this.re, fn); 383 return this.html.replace(this.re, fn);
386 }, 384 },
387 385
388 /** 386 /**
389 * The regular expression used to match template variables 387 * The regular expression used to match template variables
390 * @type RegExp 388 * @type RegExp
391 * @property 389 * @property
392 */ 390 */
393 re : /\{([\w|-]+)\}/g, 391 re : /\{([\w|-]+)\}/g,
394 392
395 /** 393 /**
396 * Compiles the template into an internal function, eliminating the RegEx overhead 394 * Compiles the template into an internal function, eliminating the RegEx overhead
397 */ 395 */
398 compile : function(){ 396 compile : function(){
399 var body = ["this.compiled = function(values){ return ['"]; 397 var body = ["this.compiled = function(values){ return ['"];
400 body.push(this.html.replace(this.re, "', values['$1'], '")); 398 body.push(this.html.replace(this.re, "', values['$1'], '"));
401 body.push("'].join('');};"); 399 body.push("'].join('');};");
402 eval(body.join('')); 400 eval(body.join(''));
403 return this; 401 return this;
404 }, 402 },
405 403
406 /** 404 /**
407 * Applies the supplied values to the template and inserts the new node(s) before el 405 * Applies the supplied values to the template and inserts the new node(s) before el
408 * @param {String/HTMLElement/Element} el The context element 406 * @param {String/HTMLElement/Element} el The context element
409 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'}) 407 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
410 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element 408 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
411 * @return {HTMLElement} The new node 409 * @return {HTMLElement} The new node
412 */ 410 */
413 insertBefore: function(el, values, returnElement){ 411 insertBefore: function(el, values, returnElement){
414 el = el.dom ? el.dom : YAHOO.util.Dom.get(el); 412 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
415 var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeBegin', el, this.applyTemplate(values)); 413 var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeBegin', el, this.applyTemplate(values));
416 return returnElement ? YAHOO.Element.get(newNode, true) : newNode; 414 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
417 }, 415 },
418 416
419 /** 417 /**
420 * Applies the supplied values to the template and inserts the new node(s) after el 418 * Applies the supplied values to the template and inserts the new node(s) after el
421 * @param {String/HTMLElement/Element} el The context element 419 * @param {String/HTMLElement/Element} el The context element
422 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'}) 420 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
423 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element 421 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
424 * @return {HTMLElement} The new node 422 * @return {HTMLElement} The new node
425 */ 423 */
426 insertAfter : function(el, values, returnElement){ 424 insertAfter : function(el, values, returnElement){
427 el = el.dom ? el.dom : YAHOO.util.Dom.get(el); 425 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
428 var newNode = Clipperz.YUI.DomHelper.insertHtml('afterEnd', el, this.applyTemplate(values)); 426 var newNode = Clipperz.YUI.DomHelper.insertHtml('afterEnd', el, this.applyTemplate(values));
429 return returnElement ? YAHOO.Element.get(newNode, true) : newNode; 427 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
430 }, 428 },
431 429
432 /** 430 /**
433 * Applies the supplied values to the template and append the new node(s) to el 431 * Applies the supplied values to the template and append the new node(s) to el
434 * @param {String/HTMLElement/Element} el The context element 432 * @param {String/HTMLElement/Element} el The context element
435 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'}) 433 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
436 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element 434 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
437 * @return {HTMLElement} The new node 435 * @return {HTMLElement} The new node
438 */ 436 */
439 append : function(el, values, returnElement){ 437 append : function(el, values, returnElement){
440 var sanitizedValues; 438 var sanitizedValues;
441 var key; 439 var key;
442 440
443 // sanitizedValues = MochiKit.Base.map(sanitizedValues)
444//console.log("values", values);
445 sanitizedValues = {}; 441 sanitizedValues = {};
446 for (key in values) { 442 for (key in values) {
447 sanitizedValues[key] = Clipperz.Base.sanitizeString(values[key]); 443 sanitizedValues[key] = Clipperz.Base.sanitizeString(values[key]);
448 } 444 }
449//console.log("sanitizedValues", sanitizedValues);
450// el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
451 el = (typeof el == 'string') ? YAHOO.util.Dom.get(el) : el; 445 el = (typeof el == 'string') ? YAHOO.util.Dom.get(el) : el;
452//Clipperz.log(this.applyTemplate(sanitizedValues));
453 var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(sanitizedValues)); 446 var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(sanitizedValues));
454// return returnElement ? YAHOO.Element.get(newNode, true) : newNode; 447
455 return newNode; 448 return newNode;
456 }, 449 },
457 450
458 /** 451 /**
459 * Applies the supplied values to the template and overwrites the content of el with the new node(s) 452 * Applies the supplied values to the template and overwrites the content of el with the new node(s)
460 * @param {String/HTMLElement/Element} el The context element 453 * @param {String/HTMLElement/Element} el The context element
461 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'}) 454 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
462 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element 455 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
463 * @return {HTMLElement} The new node 456 * @return {HTMLElement} The new node
464 */ 457 */
465 overwrite : function(el, values, returnElement){ 458 overwrite : function(el, values, returnElement){
466 el = el.dom ? el.dom : YAHOO.util.Dom.get(el); 459 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
467 el.innerHTML = ''; 460 el.innerHTML = '';
468 var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values)); 461 var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values));
469 return returnElement ? YAHOO.Element.get(newNode, true) : newNode; 462 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
470 } 463 }
471}; 464};
472/** 465/**
473 * Alias for applyTemplate 466 * Alias for applyTemplate
474 * @method 467 * @method
475 */ 468 */
476Clipperz.YUI.DomHelper.Template.prototype.apply = Clipperz.YUI.DomHelper.Template.prototype.applyTemplate; 469Clipperz.YUI.DomHelper.Template.prototype.apply = Clipperz.YUI.DomHelper.Template.prototype.applyTemplate;
477 470
478Clipperz.YUI.Template = Clipperz.YUI.DomHelper.Template; 471Clipperz.YUI.Template = Clipperz.YUI.DomHelper.Template;
diff --git a/frontend/gamma/js/Clipperz/YUI/DomQuery.js b/frontend/gamma/js/Clipperz/YUI/DomQuery.js
index 76d0fae..c1af0ca 100644
--- a/frontend/gamma/js/Clipperz/YUI/DomQuery.js
+++ b/frontend/gamma/js/Clipperz/YUI/DomQuery.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } 24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
27if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; } 25if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; }
28 26
29 27
30/* 28/*
31 * yui-ext 0.40 29 * yui-ext 0.40
32 * Copyright(c) 2006, Jack Slocum. 30 * Copyright(c) 2006, Jack Slocum.
33 */ 31 */
34 32
35/** 33/**
36 * @class Clipperz.YUI.DomQuery 34 * @class Clipperz.YUI.DomQuery
37 * Provides high performance selector/xpath processing by compiling queries into reusable functions. 35 * Provides high performance selector/xpath processing by compiling queries into reusable functions.
38 * New pseudo classes and matchers can be plugged. It works on HTML and XML documents (if a content node is passed in). 36 * New pseudo classes and matchers can be plugged. It works on HTML and XML documents (if a content node is passed in).
39 * @singleton 37 * @singleton
40 */ 38 */
41Clipperz.YUI.DomQuery = function(){ 39Clipperz.YUI.DomQuery = function(){
42 var cache = {}, simpleCache = {}, valueCache = {}; 40 var cache = {}, simpleCache = {}, valueCache = {};
43 var nonSpace = /\S/; 41 var nonSpace = /\S/;
44 var trimRe = /^\s*(.*?)\s*$/; 42 var trimRe = /^\s*(.*?)\s*$/;
45 var tplRe = /\{(\d+)\}/g; 43 var tplRe = /\{(\d+)\}/g;
46 var modeRe = /^(\s?[\/>]\s?|\s|$)/; 44 var modeRe = /^(\s?[\/>]\s?|\s|$)/;
47 var clsRes = {}; 45 var clsRes = {};
48 46
49 function child(p, index){ 47 function child(p, index){
50 var i = 0; 48 var i = 0;
51 var n = p.firstChild; 49 var n = p.firstChild;
52 while(n){ 50 while(n){
53 if(n.nodeType == 1){ 51 if(n.nodeType == 1){
54 i++; 52 i++;
55 if(i == index){ 53 if(i == index){
56 return n; 54 return n;
57 } 55 }
58 } 56 }
59 n = n.nextSibling; 57 n = n.nextSibling;
60 } 58 }
61 return null; 59 return null;
62 }; 60 };
63 61
64 function next(d){ 62 function next(d){
65 var n = d.nextSibling; 63 var n = d.nextSibling;
66 while(n && n.nodeType != 1){ 64 while(n && n.nodeType != 1){
67 n = n.nextSibling; 65 n = n.nextSibling;
68 } 66 }
69 return n; 67 return n;
70 }; 68 };
71 69
72 function prev(d){ 70 function prev(d){
73 var n = d.previousSibling; 71 var n = d.previousSibling;
74 while(n && n.nodeType != 1){ 72 while(n && n.nodeType != 1){
75 n = n.previousSibling; 73 n = n.previousSibling;
76 } 74 }
77 return n; 75 return n;
78 }; 76 };
79 77
80 function clean(d){ 78 function clean(d){
81 var n = d.firstChild, ni = -1; 79 var n = d.firstChild, ni = -1;
82 while(n){ 80 while(n){
83 var nx = n.nextSibling; 81 var nx = n.nextSibling;
84 if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){ 82 if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){
85 d.removeChild(n); 83 d.removeChild(n);
86 }else{ 84 }else{
87 n.nodeIndex = ++ni; 85 n.nodeIndex = ++ni;
88 } 86 }
89 n = nx; 87 n = nx;
90 } 88 }
91 return this; 89 return this;
92 }; 90 };
93 91
94 function byClassName(c, a, v){ 92 function byClassName(c, a, v){
95 if(!v){ 93 if(!v){
96 return c; 94 return c;
97 } 95 }
98 var re = clsRes[v]; 96 var re = clsRes[v];
99 if(!re){ 97 if(!re){
100 re = new RegExp('(?:^|\\s)(?:' + v + ')(?:\\s|$)'); 98 re = new RegExp('(?:^|\\s)(?:' + v + ')(?:\\s|$)');
101 clsRes[v] = re; 99 clsRes[v] = re;
102 } 100 }
103 var r = []; 101 var r = [];
104 for(var i = 0, ci; ci = c[i]; i++){ 102 for(var i = 0, ci; ci = c[i]; i++){
105 if(re.test(ci.className)){ 103 if(re.test(ci.className)){
106 r[r.length] = ci; 104 r[r.length] = ci;
107 } 105 }
108 } 106 }
109 return r; 107 return r;
110 }; 108 };
111 109
112 function convert(c){ 110 function convert(c){
113 if(c.slice){ 111 if(c.slice){
114 return c; 112 return c;
115 } 113 }
116 var r = []; 114 var r = [];
117 for(var i = 0, l = c.length; i < l; i++){ 115 for(var i = 0, l = c.length; i < l; i++){
118 r[r.length] = c[i]; 116 r[r.length] = c[i];
diff --git a/frontend/gamma/js/Clipperz/YUI/Utils.js b/frontend/gamma/js/Clipperz/YUI/Utils.js
index e9929fc..4def842 100644
--- a/frontend/gamma/js/Clipperz/YUI/Utils.js
+++ b/frontend/gamma/js/Clipperz/YUI/Utils.js
@@ -1,95 +1,93 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26if (typeof YAHOO == 'undefined') { YAHOO = {}; }; 24if (typeof YAHOO == 'undefined') { YAHOO = {}; };
27if (typeof YAHOO.util == 'undefined') { YAHOO.util = {}; }; 25if (typeof YAHOO.util == 'undefined') { YAHOO.util = {}; };
28if (typeof YAHOO.util.Dom == 'undefined') { YAHOO.util.Dom = {}; }; 26if (typeof YAHOO.util.Dom == 'undefined') { YAHOO.util.Dom = {}; };
29 27
30YAHOO.extend = function(subc, superc, overrides) { 28YAHOO.extend = function(subc, superc, overrides) {
31 var F = function() {}; 29 var F = function() {};
32 F.prototype=superc.prototype; 30 F.prototype=superc.prototype;
33 subc.prototype=new F(); 31 subc.prototype=new F();
34 subc.prototype.constructor=subc; 32 subc.prototype.constructor=subc;
35 subc.superclass=superc.prototype; 33 subc.superclass=superc.prototype;
36 if (superc.prototype.constructor == Object.prototype.constructor) { 34 if (superc.prototype.constructor == Object.prototype.constructor) {
37 superc.prototype.constructor=superc; 35 superc.prototype.constructor=superc;
38 } 36 }
39 37
40 if (overrides) { 38 if (overrides) {
41 for (var i in overrides) { 39 for (var i in overrides) {
42 subc.prototype[i]=overrides[i]; 40 subc.prototype[i]=overrides[i];
43 } 41 }
44 } 42 }
45}; 43};
46 44
47YAHOO.override = function(origclass, overrides){ 45YAHOO.override = function(origclass, overrides){
48 if(overrides){ 46 if(overrides){
49 var p = origclass.prototype; 47 var p = origclass.prototype;
50 for(var method in overrides){ 48 for(var method in overrides){
51 p[method] = overrides[method]; 49 p[method] = overrides[method];
52 } 50 }
53 } 51 }
54}; 52};
55 53
56YAHOO.extendX = function(subclass, superclass, overrides){ 54YAHOO.extendX = function(subclass, superclass, overrides){
57 YAHOO.extend(subclass, superclass); 55 YAHOO.extend(subclass, superclass);
58 subclass.override = function(o){ 56 subclass.override = function(o){
59 YAHOO.override(subclass, o); 57 YAHOO.override(subclass, o);
60 }; 58 };
61 if(!subclass.prototype.override){ 59 if(!subclass.prototype.override){
62 subclass.prototype.override = function(o){ 60 subclass.prototype.override = function(o){
63 for(var method in o){ 61 for(var method in o){
64 this[method] = o[method]; 62 this[method] = o[method];
65 } 63 }
66 }; 64 };
67 } 65 }
68 if(overrides){ 66 if(overrides){
69 subclass.override(overrides); 67 subclass.override(overrides);
70 }; 68 };
71 69
72}; 70};
73 71
74YAHOO.util.Dom.get = function(el) { 72YAHOO.util.Dom.get = function(el) {
75 if (!el) { return null; } // nothing to work with 73 if (!el) { return null; } // nothing to work with
76 74
77 if (typeof el != 'string' && !(el instanceof Array) ) { // assuming HTMLElement or HTMLCollection, so pass back as is 75 if (typeof el != 'string' && !(el instanceof Array) ) { // assuming HTMLElement or HTMLCollection, so pass back as is
78 return el; 76 return el;
79 } 77 }
80 78
81 if (typeof el == 'string') { // ID 79 if (typeof el == 'string') { // ID
82 return document.getElementById(el); 80 return document.getElementById(el);
83 } 81 }
84 else { // array of ID's and/or elements 82 else { // array of ID's and/or elements
85 var collection = []; 83 var collection = [];
86 for (var i = 0, len = el.length; i < len; ++i) { 84 for (var i = 0, len = el.length; i < len; ++i) {
87 collection[collection.length] = YAHOO.util.Dom.get(el[i]); 85 collection[collection.length] = YAHOO.util.Dom.get(el[i]);
88 } 86 }
89 87
90 return collection; 88 return collection;
91 } 89 }
92 90
93 return null; // safety, should never happen 91 return null; // safety, should never happen
94}; 92};
95 93
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/AES.js b/frontend/gamma/js/ClipperzCryptoLibrary/AES.js
new file mode 100644
index 0000000..cbbbb13
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/AES.js
@@ -0,0 +1,864 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.AES depends on Clipperz.ByteArray!";
26}
27
28 //Dependency commented to avoid a circular reference
29//try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.AES depends on Clipperz.Crypto.PRNG!";
31//}
32
33if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; }
34
35//#############################################################################
36
37Clipperz.Crypto.AES.DeferredExecutionContext = function(args) {
38 args = args || {};
39
40 this._key = args.key;
41 this._message = args.message;
42 this._result = args.message.clone();
43 this._nonce = args.nonce;
44 this._messageLength = this._message.length();
45
46 this._messageArray = this._message.arrayValues();
47 this._resultArray = this._result.arrayValues();
48 this._nonceArray = this._nonce.arrayValues();
49
50 this._executionStep = 0;
51
52 // this._elaborationChunkSize = 1024; // 4096; // 16384; //4096;
53 this._elaborationChunks = 10;
54 this._pauseTime = 0.02; // 0.02 //0.2;
55
56 return this;
57}
58
59Clipperz.Crypto.AES.DeferredExecutionContext.prototype = MochiKit.Base.update(null, {
60
61 'key': function() {
62 return this._key;
63 },
64
65 'message': function() {
66 return this._message;
67 },
68
69 'messageLength': function() {
70 return this._messageLength;
71 },
72
73 'result': function() {
74 return new Clipperz.ByteArray(this.resultArray());
75 },
76
77 'nonce': function() {
78 return this._nonce;
79 },
80
81 'messageArray': function() {
82 return this._messageArray;
83 },
84
85 'resultArray': function() {
86 return this._resultArray;
87 },
88
89 'nonceArray': function() {
90 return this._nonceArray;
91 },
92
93 'elaborationChunkSize': function() {
94 // return Clipperz.Crypto.AES.DeferredExecution.chunkSize;
95 // return this._elaborationChunkSize;
96 return (this._elaborationChunks * 1024);
97 },
98
99 'executionStep': function() {
100 return this._executionStep;
101 },
102
103 'setExecutionStep': function(aValue) {
104 this._executionStep = aValue;
105 },
106
107 'tuneExecutionParameters': function (anElapsedTime) {
108//var originalChunks = this._elaborationChunks;
109 if (anElapsedTime > 0) {
110 this._elaborationChunks = Math.round(this._elaborationChunks * ((anElapsedTime + 1000)/(anElapsedTime * 2)));
111 }
112//Clipperz.log("tuneExecutionParameters - elapsedTime: " + anElapsedTime + /*originalChunks,*/ " chunks # " + this._elaborationChunks + " [" + this._executionStep + " / " + this._messageLength + "]");
113 },
114
115 'pause': function(aValue) {
116 // return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue);
117 return MochiKit.Async.wait(this._pauseTime, aValue);
118 },
119
120 'isDone': function () {
121//console.log("isDone", this.executionStep(), this.messageLength());
122 return (this._executionStep >= this._messageLength);
123 },
124
125 //-----------------------------------------------------------------------------
126 __syntaxFix__: "syntax fix"
127
128});
129
130//#############################################################################
131
132Clipperz.Crypto.AES.Key = function(args) {
133 args = args || {};
134
135 this._key = args.key;
136 this._keySize = args.keySize || this.key().length();
137
138 if (this.keySize() == 128/8) {
139 this._b = 176;
140 this._numberOfRounds = 10;
141 } else if (this.keySize() == 256/8) {
142 this._b = 240;
143 this._numberOfRounds = 14;
144 } else {
145 MochiKit.Logging.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits");
146 throw Clipperz.Crypto.AES.exception.UnsupportedKeySize;
147 }
148
149 this._stretchedKey = null;
150
151 return this;
152}
153
154Clipperz.Crypto.AES.Key.prototype = MochiKit.Base.update(null, {
155
156 'asString': function() {
157 return "Clipperz.Crypto.AES.Key (" + this.key().toHexString() + ")";
158 },
159
160 //-----------------------------------------------------------------------------
161
162 'key': function() {
163 return this._key;
164 },
165
166 'keySize': function() {
167 return this._keySize;
168 },
169
170 'b': function() {
171 return this._b;
172 },
173
174 'numberOfRounds': function() {
175 return this._numberOfRounds;
176 },
177 //=========================================================================
178
179 'keyScheduleCore': function(aWord, aRoundConstantsIndex) {
180 varresult;
181 var sbox;
182
183 sbox = Clipperz.Crypto.AES.sbox();
184
185 result = [sbox[aWord[1]] ^ Clipperz.Crypto.AES.roundConstants()[aRoundConstantsIndex],
186 sbox[aWord[2]],
187 sbox[aWord[3]],
188 sbox[aWord[0]]];
189
190 return result;
191 },
192
193 //-----------------------------------------------------------------------------
194
195 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) {
196 varresult;
197 var i,c;
198
199 result = [];
200 c = 4;
201 for (i=0; i<c; i++) {
202 result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i);
203 }
204
205 return result;
206 },
207
208 //-----------------------------------------------------------------------------
209
210 'sboxShakeup': function(aWord) {
211 var result;
212 var sbox;
213 var i,c;
214
215 result = [];
216 sbox = Clipperz.Crypto.AES.sbox();
217 c =4;
218 for (i=0; i<c; i++) {
219 result[i] = sbox[aWord[i]];
220 }
221
222 return result;
223 },
224
225 //-----------------------------------------------------------------------------
226
227 'stretchKey': function(aKey) {
228 varcurrentWord;
229 varkeyLength;
230 varpreviousStretchIndex;
231 var i,c;
232
233 keyLength = aKey.length();
234 previousStretchIndex = keyLength - this.keySize();
235
236 currentWord = [aKey.byteAtIndex(keyLength - 4),
237 aKey.byteAtIndex(keyLength - 3),
238 aKey.byteAtIndex(keyLength - 2),
239 aKey.byteAtIndex(keyLength - 1)];
240 currentWord = this.keyScheduleCore(currentWord, keyLength / this.keySize());
241
242 if (this.keySize() == 256/8) {
243 c = 8;
244 } else if (this.keySize() == 128/8){
245 c = 4;
246 }
247
248 for (i=0; i<c; i++) {
249 if (i == 4) {
250 //fifth streatch word
251 currentWord = this.sboxShakeup(currentWord);
252 }
253
254 currentWord = this.xorWithPreviousStretchValues(aKey, currentWord, previousStretchIndex + (i*4));
255 aKey.appendBytes(currentWord);
256 }
257
258 return aKey;
259 },
260
261 //-----------------------------------------------------------------------------
262
263 'stretchedKey': function() {
264 if (this._stretchedKey == null) {
265 var stretchedKey;
266
267 stretchedKey = this.key().clone();
268
269 while (stretchedKey.length() < this.keySize()) {
270 stretchedKey.appendByte(0);
271 }
272
273 while (stretchedKey.length() < this.b()) {
274 stretchedKey = this.stretchKey(stretchedKey);
275 }
276
277 this._stretchedKey = stretchedKey.split(0, this.b());
278 }
279
280 return this._stretchedKey;
281 },
282
283 //=========================================================================
284 __syntaxFix__: "syntax fix"
285});
286
287//#############################################################################
288
289Clipperz.Crypto.AES.State = function(args) {
290 args = args || {};
291
292 this._data = args.block;
293 this._key = args.key;
294
295 return this;
296}
297
298Clipperz.Crypto.AES.State.prototype = MochiKit.Base.update(null, {
299
300 'key': function() {
301 return this._key;
302 },
303
304 //-----------------------------------------------------------------------------
305
306 'data': function() {
307 return this._data;
308 },
309
310 'setData': function(aValue) {
311 this._data = aValue;
312 },
313
314 //=========================================================================
315
316 'addRoundKey': function(aRoundNumber) {
317 //each byte of the state is combined with the round key; each round key is derived from the cipher key using a key schedule.
318 vardata;
319 varstretchedKey;
320 varfirstStretchedKeyIndex;
321 var i,c;
322
323 data = this.data();
324 stretchedKey = this.key().stretchedKey();
325 firstStretchedKeyIndex = aRoundNumber * (128/8);
326 c = 128/8;
327 for (i=0; i<c; i++) {
328 data[i] = data[i] ^ stretchedKey.byteAtIndex(firstStretchedKeyIndex + i);
329 }
330 },
331
332 //-----------------------------------------------------------------------------
333
334 'subBytes': function() {
335 // a non-linear substitution step where each byte is replaced with another according to a lookup table.
336 var i,c;
337 vardata;
338 var sbox;
339
340 data = this.data();
341 sbox = Clipperz.Crypto.AES.sbox();
342
343 c = 16;
344 for (i=0; i<c; i++) {
345 data[i] = sbox[data[i]];
346 }
347 },
348
349 //-----------------------------------------------------------------------------
350
351 'shiftRows': function() {
352 //a transposition step where each row of the state is shifted cyclically a certain number of steps.
353 varnewValue;
354 vardata;
355 varshiftMapping;
356 vari,c;
357
358 newValue = new Array(16);
359 data = this.data();
360 shiftMapping = Clipperz.Crypto.AES.shiftRowMapping();
361 // [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11];
362 c = 16;
363 for (i=0; i<c; i++) {
364 newValue[i] = data[shiftMapping[i]];
365 }
366 for (i=0; i<c; i++) {
367 data[i] = newValue[i];
368 }
369 },
370
371 //-----------------------------------------------------------------------------
372/*
373 'mixColumnsWithValues': function(someValues) {
374 varresult;
375 vara;
376 var i,c;
377
378 c = 4;
379 result = [];
380 a = [];
381 for (i=0; i<c; i++) {
382 a[i] = [];
383 a[i][1] = someValues[i]
384 if ((a[i][1] & 0x80) == 0x80) {
385 a[i][2] = (a[i][1] << 1) ^ 0x11b;
386 } else {
387 a[i][2] = a[i][1] << 1;
388 }
389
390 a[i][3] = a[i][2] ^ a[i][1];
391 }
392
393 for (i=0; i<c; i++) {
394 varx;
395
396 x = Clipperz.Crypto.AES.mixColumnsMatrix()[i];
397 result[i] = a[0][x[0]] ^ a[1][x[1]] ^ a[2][x[2]] ^ a[3][x[3]];
398 }
399
400 return result;
401 },
402
403 'mixColumns': function() {
404 //a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation.
405 var data;
406 var i, c;
407
408 data = this.data();
409 c = 4;
410 for(i=0; i<c; i++) {
411 varblockIndex;
412 var mixedValues;
413
414 blockIndex = i * 4;
415 mixedValues = this.mixColumnsWithValues([data[blockIndex + 0],
416 data[blockIndex + 1],
417 data[blockIndex + 2],
418 data[blockIndex + 3]]);
419 data[blockIndex + 0] = mixedValues[0];
420 data[blockIndex + 1] = mixedValues[1];
421 data[blockIndex + 2] = mixedValues[2];
422 data[blockIndex + 3] = mixedValues[3];
423 }
424 },
425*/
426
427 'mixColumns': function() {
428 //a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation.
429 var data;
430 var i, c;
431 var a_1;
432 var a_2;
433
434 a_1 = new Array(4);
435 a_2 = new Array(4);
436
437 data = this.data();
438 c = 4;
439 for(i=0; i<c; i++) {
440 varblockIndex;
441 var ii, cc;
442
443 blockIndex = i * 4;
444
445 cc = 4;
446 for (ii=0; ii<cc; ii++) {
447 var value;
448
449 value = data[blockIndex + ii];
450 a_1[ii] = value;
451 a_2[ii] = (value & 0x80) ? ((value << 1) ^ 0x011b) : (value << 1);
452 }
453
454 data[blockIndex + 0] = a_2[0] ^ a_1[1] ^ a_2[1] ^ a_1[2] ^ a_1[3];
455 data[blockIndex + 1] = a_1[0] ^ a_2[1] ^ a_1[2] ^ a_2[2] ^ a_1[3];
456 data[blockIndex + 2] = a_1[0] ^ a_1[1] ^ a_2[2] ^ a_1[3] ^ a_2[3];
457 data[blockIndex + 3] = a_1[0] ^ a_2[0] ^ a_1[1] ^ a_1[2] ^ a_2[3];
458 }
459 },
460
461 //=========================================================================
462
463 'spinRound': function(aRoundNumber) {
464 this.addRoundKey(aRoundNumber);
465 this.subBytes();
466 this.shiftRows();
467 this.mixColumns();
468 },
469
470 'spinLastRound': function() {
471 this.addRoundKey(this.key().numberOfRounds() - 1);
472 this.subBytes();
473 this.shiftRows();
474 this.addRoundKey(this.key().numberOfRounds());
475 },
476
477 //=========================================================================
478
479 'encrypt': function() {
480 vari,c;
481
482 c = this.key().numberOfRounds() - 1;
483 for (i=0; i<c; i++) {
484 this.spinRound(i);
485 }
486
487 this.spinLastRound();
488 },
489
490 //=========================================================================
491 __syntaxFix__: "syntax fix"
492});
493
494//#############################################################################
495
496Clipperz.Crypto.AES.VERSION = "0.1";
497Clipperz.Crypto.AES.NAME = "Clipperz.Crypto.AES";
498
499MochiKit.Base.update(Clipperz.Crypto.AES, {
500
501 //http://www.cs.eku.edu/faculty/styer/460/Encrypt/JS-AES.html
502 //http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
503 //http://en.wikipedia.org/wiki/Rijndael_key_schedule
504 //http://en.wikipedia.org/wiki/Rijndael_S-box
505
506 '__repr__': function () {
507 return "[" + this.NAME + " " + this.VERSION + "]";
508 },
509
510 'toString': function () {
511 return this.__repr__();
512 },
513
514 //=============================================================================
515
516 '_sbox': null,
517 'sbox': function() {
518 if (Clipperz.Crypto.AES._sbox == null) {
519 Clipperz.Crypto.AES._sbox = [
5200x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
5210xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
5220xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
5230x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
5240x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
5250x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
5260xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
5270x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
5280xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
5290x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
5300xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
5310xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
5320xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
5330x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
5340xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
5350x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
536 ];
537 }
538
539 return Clipperz.Crypto.AES._sbox;
540 },
541
542 //-----------------------------------------------------------------------------
543 //
544 // 0 4 8 12 0 4 812
545 // 1 5 9 13 => 5 9 131
546 // 2 6 10 14 10 14 26
547 // 3 7 11 15 15 3 711
548 //
549 '_shiftRowMapping': null,
550 'shiftRowMapping': function() {
551 if (Clipperz.Crypto.AES._shiftRowMapping == null) {
552 Clipperz.Crypto.AES._shiftRowMapping = [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11];
553 }
554
555 return Clipperz.Crypto.AES._shiftRowMapping;
556 },
557
558 //-----------------------------------------------------------------------------
559
560 '_mixColumnsMatrix': null,
561 'mixColumnsMatrix': function() {
562 if (Clipperz.Crypto.AES._mixColumnsMatrix == null) {
563 Clipperz.Crypto.AES._mixColumnsMatrix = [[2, 3, 1 ,1],
564 [1, 2, 3, 1],
565 [1, 1, 2, 3],
566 [3, 1, 1, 2] ];
567 }
568
569 return Clipperz.Crypto.AES._mixColumnsMatrix;
570 },
571
572 '_roundConstants': null,
573 'roundConstants': function() {
574 if (Clipperz.Crypto.AES._roundConstants == null) {
575 Clipperz.Crypto.AES._roundConstants = [ , 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154];
576 // Clipperz.Crypto.AES._roundConstants = [ , 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a];
577 }
578
579 return Clipperz.Crypto.AES._roundConstants;
580 },
581
582 //=============================================================================
583
584 'incrementNonce': function(aNonce) {
585//Clipperz.Profile.start("Clipperz.Crypto.AES.incrementNonce");
586 var i;
587 var done;
588
589 done = false;
590 i = aNonce.length - 1;
591
592 while ((i>=0) && (done == false)) {
593 var currentByteValue;
594
595 currentByteValue = aNonce[i];
596
597 if (currentByteValue == 0xff) {
598 aNonce[i] = 0;
599 if (i>= 0) {
600 i --;
601 } else {
602 done = true;
603 }
604 } else {
605 aNonce[i] = currentByteValue + 1;
606 done = true;
607 }
608 }
609//Clipperz.Profile.stop("Clipperz.Crypto.AES.incrementNonce");
610 },
611
612 //-----------------------------------------------------------------------------
613
614 'encryptBlock': function(aKey, aBlock) {
615 varresult;
616 varstate;
617
618 state = new Clipperz.Crypto.AES.State({block:aBlock, key:aKey});
619//is(state.data(), 'before');
620 state.encrypt();
621 result = state.data();
622
623 return result;
624 },
625
626 //-----------------------------------------------------------------------------
627
628 'encryptBlocks': function(aKey, aMessage, aNonce) {
629 varresult;
630 var nonce;
631 var self;
632 varmessageIndex;
633 varmessageLength;
634 var blockSize;
635
636 self = Clipperz.Crypto.AES;
637 blockSize = 128/8;
638 messageLength = aMessage.length;
639 nonce = aNonce;
640
641 result = aMessage;
642 messageIndex = 0;
643 while (messageIndex < messageLength) {
644 var encryptedBlock;
645 var i,c;
646
647 self.incrementNonce(nonce);
648 encryptedBlock = self.encryptBlock(aKey, nonce);
649
650 if ((messageLength - messageIndex) > blockSize) {
651 c = blockSize;
652 } else {
653 c = messageLength - messageIndex;
654 }
655
656 for (i=0; i<c; i++) {
657 result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i];
658 }
659
660 messageIndex += blockSize;
661 }
662
663 return result;
664 },
665
666 //-----------------------------------------------------------------------------
667
668 'encrypt': function(aKey, someData, aNonce) {
669 var result;
670 var nonce;
671 varencryptedData;
672 var key;
673
674 key = new Clipperz.Crypto.AES.Key({key:aKey});
675 nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8);
676
677 encryptedData = Clipperz.Crypto.AES.encryptBlocks(key, someData.arrayValues(), nonce.arrayValues());
678
679 result = nonce.appendBytes(encryptedData);
680
681 return result;
682 },
683
684 //-----------------------------------------------------------------------------
685
686 'decrypt': function(aKey, someData) {
687 var result;
688 var nonce;
689 var encryptedData;
690 var decryptedData;
691 vardataIterator;
692 var key;
693
694 key = new Clipperz.Crypto.AES.Key({key:aKey});
695
696 encryptedData = someData.arrayValues();
697 nonce = encryptedData.slice(0, (128/8));
698 encryptedData = encryptedData.slice(128/8);
699 decryptedData = Clipperz.Crypto.AES.encryptBlocks(key, encryptedData, nonce);
700
701 result = new Clipperz.ByteArray(decryptedData);
702
703 return result;
704 },
705
706 //=============================================================================
707
708 'deferredEncryptExecutionChunk': function(anExecutionContext) {
709 varresult;
710 var nonce;
711 var self;
712 varmessageIndex;
713 varmessageLength;
714 var blockSize;
715 var executionLimit;
716 var startTime, endTime;
717
718 self = Clipperz.Crypto.AES;
719 startTime = new Date();
720 blockSize = 128/8;
721 messageLength = anExecutionContext.messageArray().length;
722 nonce = anExecutionContext.nonceArray();
723 result = anExecutionContext.resultArray();
724
725 messageIndex = anExecutionContext.executionStep();
726 executionLimit = messageIndex + anExecutionContext.elaborationChunkSize();
727 executionLimit = Math.min(executionLimit, messageLength);
728
729 while (messageIndex < executionLimit) {
730 var encryptedBlock;
731 var i,c;
732
733 self.incrementNonce(nonce);
734 encryptedBlock = self.encryptBlock(anExecutionContext.key(), nonce);
735
736 if ((executionLimit - messageIndex) > blockSize) {
737 c = blockSize;
738 } else {
739 c = executionLimit - messageIndex;
740 }
741
742 for (i=0; i<c; i++) {
743 result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i];
744 }
745
746 messageIndex += blockSize;
747 }
748 anExecutionContext.setExecutionStep(messageIndex);
749 endTime = new Date();
750 anExecutionContext.tuneExecutionParameters(endTime - startTime);
751
752 return anExecutionContext;
753 },
754
755 //-----------------------------------------------------------------------------
756/*
757 'deferredEncryptBlocks': function(anExecutionContext) {
758 vardeferredResult;
759 varmessageSize;
760 var i,c;
761
762 messageSize = anExecutionContext.messageLength();
763
764 deferredResult = new Clipperz.Async.Deferred("AES.deferredEncryptBloks");
765
766 c = Math.ceil(messageSize / anExecutionContext.elaborationChunkSize());
767 for (i=0; i<c; i++) {
768 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptExecutionChunk);
769 deferredResult.addMethod(anExecutionContext, 'pause');
770 }
771
772 deferredResult.callback(anExecutionContext);
773
774 return deferredResult;
775 },
776*/
777
778 'deferredEncryptBlocks': function(anExecutionContext) {
779 vardeferredResult;
780
781 if (! anExecutionContext.isDone()) {
782 deferredResult = Clipperz.Async.callbacks("Clipperz.Crypto.AES.deferredEncryptBloks", [
783 Clipperz.Crypto.AES.deferredEncryptExecutionChunk,
784 MochiKit.Base.method(anExecutionContext, 'pause'),
785 Clipperz.Crypto.AES.deferredEncryptBlocks
786 ], {trace:false}, anExecutionContext);
787 } else {
788 deferredResult = MochiKit.Async.succeed(anExecutionContext);
789 }
790
791 return deferredResult;
792 },
793
794 //-----------------------------------------------------------------------------
795
796 'deferredEncrypt': function(aKey, someData, aNonce) {
797 var deferredResult;
798 varexecutionContext;
799 var result;
800 var nonce;
801 var key;
802
803 key = new Clipperz.Crypto.AES.Key({key:aKey});
804 nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8);
805
806 executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:someData, nonce:nonce});
807
808 deferredResult = new Clipperz.Async.Deferred("AES.deferredEncrypt");
809//deferredResult.addCallback(function (aValue) { console.log(">>> deferredEncrypt"); return aValue; });
810 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks);
811 deferredResult.addCallback(function(anExecutionContext) {
812 var result;
813
814 result = anExecutionContext.nonce().clone();
815 result.appendBytes(anExecutionContext.resultArray());
816
817 return result;
818 });
819//deferredResult.addCallback(function (aValue) { console.log("<<< deferredEncrypt"); return aValue; });
820 deferredResult.callback(executionContext)
821
822 return deferredResult;
823 },
824
825 //-----------------------------------------------------------------------------
826
827 'deferredDecrypt': function(aKey, someData) {
828 var deferredResult
829 var nonce;
830 var message;
831 var key;
832
833 key = new Clipperz.Crypto.AES.Key({key:aKey});
834 nonce = someData.split(0, (128/8));
835 message = someData.split(128/8);
836 executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:message, nonce:nonce});
837
838 deferredResult = new Clipperz.Async.Deferred("AES.deferredDecrypt");
839//deferredResult.addCallback(function (aValue) { console.log(">>> deferredDecrypt"); return aValue; });
840 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks);
841 deferredResult.addCallback(function(anExecutionContext) {
842 return anExecutionContext.result();
843 });
844//deferredResult.addCallback(function (aValue) { console.log("<<< deferredDecrypt"); return aValue; });
845 deferredResult.callback(executionContext);
846
847 return deferredResult;
848 },
849
850 //-----------------------------------------------------------------------------
851 __syntaxFix__: "syntax fix"
852
853});
854
855//#############################################################################
856
857//Clipperz.Crypto.AES.DeferredExecution = {
858 // 'chunkSize': 16384, // 4096, // 1024 4096 8192 1638432768;
859 // 'pauseTime': 0.02 //0.2
860//}
861
862Clipperz.Crypto.AES.exception = {
863 'UnsupportedKeySize': new MochiKit.Base.NamedError("Clipperz.Crypto.AES.exception.UnsupportedKeySize")
864};
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/Base.js b/frontend/gamma/js/ClipperzCryptoLibrary/Base.js
new file mode 100644
index 0000000..9acfc49
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/Base.js
@@ -0,0 +1,1847 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.Base) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.Base depends on Clipperz.Base!";
26}
27
28if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
29if (typeof(Clipperz.Crypto.Base) == 'undefined') { Clipperz.Crypto.Base = {}; }
30
31Clipperz.Crypto.Base.VERSION = "0.1";
32Clipperz.Crypto.Base.NAME = "Clipperz.Crypto.Base";
33
34//#############################################################################
35 //Downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip (jsSha2/sha256.js)
36//#############################################################################
37
38/* A JavaScript implementation of the Secure Hash Algorithm, SHA-256
39 * Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/
40 * Distributed under the BSD License
41 * Some bits taken from Paul Johnston's SHA-1 implementation
42 */
43var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
44function safe_add (x, y) {
45 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
46 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
47 return (msw << 16) | (lsw & 0xFFFF);
48}
49function S (X, n) {return ( X >>> n ) | (X << (32 - n));}
50function R (X, n) {return ( X >>> n );}
51function Ch(x, y, z) {return ((x & y) ^ ((~x) & z));}
52function Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));}
53function Sigma0256(x) {return (S(x, 2) ^ S(x, 13) ^ S(x, 22));}
54function Sigma1256(x) {return (S(x, 6) ^ S(x, 11) ^ S(x, 25));}
55function Gamma0256(x) {return (S(x, 7) ^ S(x, 18) ^ R(x, 3));}
56function Gamma1256(x) {return (S(x, 17) ^ S(x, 19) ^ R(x, 10));}
57function core_sha256 (m, l) {
58 var K = new Array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2);
59 var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
60 var W = new Array(64);
61 var a, b, c, d, e, f, g, h, i, j;
62 var T1, T2;
63 /* append padding */
64 m[l >> 5] |= 0x80 << (24 - l % 32);
65 m[((l + 64 >> 9) << 4) + 15] = l;
66 for ( var i = 0; i<m.length; i+=16 ) {
67 a = HASH[0]; b = HASH[1]; c = HASH[2]; d = HASH[3]; e = HASH[4]; f = HASH[5]; g = HASH[6]; h = HASH[7];
68 for ( var j = 0; j<64; j++) {
69 if (j < 16) W[j] = m[j + i];
70 else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
71 T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
72 T2 = safe_add(Sigma0256(a), Maj(a, b, c));
73 h = g; g = f; f = e; e = safe_add(d, T1); d = c; c = b; b = a; a = safe_add(T1, T2);
74 }
75 HASH[0] = safe_add(a, HASH[0]); HASH[1] = safe_add(b, HASH[1]); HASH[2] = safe_add(c, HASH[2]); HASH[3] = safe_add(d, HASH[3]); HASH[4] = safe_add(e, HASH[4]); HASH[5] = safe_add(f, HASH[5]); HASH[6] = safe_add(g, HASH[6]); HASH[7] = safe_add(h, HASH[7]);
76 }
77 return HASH;
78}
79function str2binb (str) {
80 var bin = Array();
81 var mask = (1 << chrsz) - 1;
82 for(var i = 0; i < str.length * chrsz; i += chrsz)
83 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
84 return bin;
85}
86function binb2hex (binarray) {
87 var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
88 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
89 var str = "";
90 for (var i = 0; i < binarray.length * 4; i++) {
91 str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
92 }
93 return str;
94}
95function hex_sha256(s){return binb2hex(core_sha256(str2binb(s),s.length * chrsz));}
96
97
98
99//#############################################################################
100 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (entropy.js)
101//#############################################################################
102
103 // Entropy collection utilities
104
105 /*Start by declaring static storage and initialise
106 the entropy vector from the time we come through
107 here. */
108
109 var entropyData = new Array(); // Collected entropy data
110 var edlen = 0; // Keyboard array data length
111
112 addEntropyTime(); // Start entropy collection with page load time
113 ce(); // Roll milliseconds into initial entropy
114
115 //Add a byte to the entropy vector
116
117 function addEntropyByte(b) {
118 entropyData[edlen++] = b;
119 }
120
121 /*Capture entropy. When the user presses a key or performs
122 various other events for which we can request
123 notification, add the time in 255ths of a second to the
124 entropyData array. The name of the function is short
125 so it doesn't bloat the form object declarations in
126 which it appears in various "onXXX" events. */
127
128 function ce() {
129 addEntropyByte(Math.floor((((new Date).getMilliseconds()) * 255) / 999));
130 }
131
132 //Add a 32 bit quantity to the entropy vector
133
134 function addEntropy32(w) {
135 var i;
136
137 for (i = 0; i < 4; i++) {
138 addEntropyByte(w & 0xFF);
139 w >>= 8;
140 }
141 }
142
143 /*Add the current time and date (milliseconds since the epoch,
144 truncated to 32 bits) to the entropy vector. */
145
146 function addEntropyTime() {
147 addEntropy32((new Date()).getTime());
148 }
149
150 /* Start collection of entropy from mouse movements. The
151 argument specifies the number of entropy items to be
152 obtained from mouse motion, after which mouse motion
153 will be ignored. Note that you can re-enable mouse
154 motion collection at any time if not already underway. */
155
156 var mouseMotionCollect = 0;
157 var oldMoveHandler; // For saving and restoring mouse move handler in IE4
158
159 function mouseMotionEntropy(maxsamp) {
160 if (mouseMotionCollect <= 0) {
161 mouseMotionCollect = maxsamp;
162 if ((document.implementation.hasFeature("Events", "2.0")) &&
163 document.addEventListener) {
164 // Browser supports Document Object Model (DOM) 2 events
165 document.addEventListener("mousemove", mouseMoveEntropy, false);
166 } else {
167 if (document.attachEvent) {
168 // Internet Explorer 5 and above event model
169 document.attachEvent("onmousemove", mouseMoveEntropy);
170 } else {
171 //Internet Explorer 4 event model
172 oldMoveHandler = document.onmousemove;
173 document.onmousemove = mouseMoveEntropy;
174 }
175 }
176//dump("Mouse enable", mouseMotionCollect);
177 }
178 }
179
180 /*Collect entropy from mouse motion events. Note that
181 this is craftily coded to work with either DOM2 or Internet
182 Explorer style events. Note that we don't use every successive
183 mouse movement event. Instead, we XOR the three bytes collected
184 from the mouse and use that to determine how many subsequent
185 mouse movements we ignore before capturing the next one. */
186
187 var mouseEntropyTime = 0; // Delay counter for mouse entropy collection
188
189 function mouseMoveEntropy(e) {
190 if (!e) {
191 e = window.event; // Internet Explorer event model
192 }
193 if (mouseMotionCollect > 0) {
194 if (mouseEntropyTime-- <= 0) {
195 addEntropyByte(e.screenX & 0xFF);
196 addEntropyByte(e.screenY & 0xFF);
197 ce();
198 mouseMotionCollect--;
199 mouseEntropyTime = (entropyData[edlen - 3] ^ entropyData[edlen - 2] ^
200 entropyData[edlen - 1]) % 19;
201//dump("Mouse Move", byteArrayToHex(entropyData.slice(-3)));
202 }
203 if (mouseMotionCollect <= 0) {
204 if (document.removeEventListener) {
205 document.removeEventListener("mousemove", mouseMoveEntropy, false);
206 } else if (document.detachEvent) {
207 document.detachEvent("onmousemove", mouseMoveEntropy);
208 } else {
209 document.onmousemove = oldMoveHandler;
210 }
211//dump("Spung!", 0);
212 }
213 }
214 }
215
216 /*Compute a 32 byte key value from the entropy vector.
217 We compute the value by taking the MD5 sum of the even
218 and odd bytes respectively of the entropy vector, then
219 concatenating the two MD5 sums. */
220
221 function keyFromEntropy() {
222 var i, k = new Array(32);
223
224 if (edlen == 0) {
225 alert("Blooie! Entropy vector void at call to keyFromEntropy.");
226 }
227//dump("Entropy bytes", edlen);
228
229 md5_init();
230 for (i = 0; i < edlen; i += 2) {
231 md5_update(entropyData[i]);
232 }
233 md5_finish();
234 for (i = 0; i < 16; i++) {
235 k[i] = digestBits[i];
236 }
237
238 md5_init();
239 for (i = 1; i < edlen; i += 2) {
240 md5_update(entropyData[i]);
241 }
242 md5_finish();
243 for (i = 0; i < 16; i++) {
244 k[i + 16] = digestBits[i];
245 }
246
247//dump("keyFromEntropy", byteArrayToHex(k));
248 return k;
249 }
250
251//#############################################################################
252 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (aesprng.js)
253//#############################################################################
254
255
256 // AES based pseudorandom number generator
257
258 /* Constructor. Called with an array of 32 byte (0-255) values
259 containing the initial seed. */
260
261 function AESprng(seed) {
262 this.key = new Array();
263 this.key = seed;
264 this.itext = hexToByteArray("9F489613248148F9C27945C6AE62EECA3E3367BB14064E4E6DC67A9F28AB3BD1");
265 this.nbytes = 0; // Bytes left in buffer
266
267 this.next = AESprng_next;
268 this.nextbits = AESprng_nextbits;
269 this.nextInt = AESprng_nextInt;
270 this.round = AESprng_round;
271
272 /* Encrypt the initial text with the seed key
273 three times, feeding the output of the encryption
274 back into the key for the next round. */
275
276 bsb = blockSizeInBits;
277 blockSizeInBits = 256;
278 var i, ct;
279 for (i = 0; i < 3; i++) {
280 this.key = rijndaelEncrypt(this.itext, this.key, "ECB");
281 }
282
283 /* Now make between one and four additional
284 key-feedback rounds, with the number determined
285 by bits from the result of the first three
286 rounds. */
287
288 var n = 1 + (this.key[3] & 2) + (this.key[9] & 1);
289 for (i = 0; i < n; i++) {
290 this.key = rijndaelEncrypt(this.itext, this.key, "ECB");
291 }
292 blockSizeInBits = bsb;
293 }
294
295 function AESprng_round() {
296 bsb = blockSizeInBits;
297 blockSizeInBits = 256;
298 this.key = rijndaelEncrypt(this.itext, this.key, "ECB");
299 this.nbytes = 32;
300 blockSizeInBits = bsb;
301 }
302
303 //Return next byte from the generator
304
305 function AESprng_next() {
306 if (this.nbytes <= 0) {
307 this.round();
308 }
309 return(this.key[--this.nbytes]);
310 }
311
312 //Return n bit integer value (up to maximum integer size)
313
314 function AESprng_nextbits(n) {
315 var i, w = 0, nbytes = Math.floor((n + 7) / 8);
316
317 for (i = 0; i < nbytes; i++) {
318 w = (w << 8) | this.next();
319 }
320 return w & ((1 << n) - 1);
321 }
322
323 // Return integer between 0 and n inclusive
324
325 function AESprng_nextInt(n) {
326 var p = 1, nb = 0;
327
328 // Determine smallest p, 2^p > n
329 // nb = log_2 p
330
331 while (n >= p) {
332 p <<= 1;
333 nb++;
334 }
335 p--;
336
337 /* Generate values from 0 through n by first generating
338 values v from 0 to (2^p)-1, then discarding any results v > n.
339 For the rationale behind this (and why taking
340 values mod (n + 1) is biased toward smaller values, see
341 Ferguson and Schneier, "Practical Cryptography",
342 ISBN 0-471-22357-3, section 10.8). */
343
344 while (true) {
345 var v = this.nextbits(nb) & p;
346
347 if (v <= n) {
348 return v;
349 }
350 }
351 }
352
353//#############################################################################
354 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (md5.js)
355//#############################################################################
356
357/*
358 * md5.jvs 1.0b 27/06/96
359 *
360 * Javascript implementation of the RSA Data Security, Inc. MD5
361 * Message-Digest Algorithm.
362 *
363 * Copyright (c) 1996 Henri Torgemane. All Rights Reserved.
364 *
365 * Permission to use, copy, modify, and distribute this software
366 * and its documentation for any purposes and without
367 * fee is hereby granted provided that this copyright notice
368 * appears in all copies.
369 *
370 * Of course, this soft is provided "as is" without express or implied
371 * warranty of any kind.
372
373 This version contains some trivial reformatting modifications
374 by John Walker.
375
376 */
377
378function array(n) {
379 for (i = 0; i < n; i++) {
380 this[i] = 0;
381 }
382 this.length = n;
383}
384
385/* Some basic logical functions had to be rewritten because of a bug in
386 * Javascript.. Just try to compute 0xffffffff >> 4 with it..
387 * Of course, these functions are slower than the original would be, but
388 * at least, they work!
389 */
390
391function integer(n) {
392 return n % (0xffffffff + 1);
393}
394
395function shr(a, b) {
396 a = integer(a);
397 b = integer(b);
398 if (a - 0x80000000 >= 0) {
399 a = a % 0x80000000;
400 a >>= b;
401 a += 0x40000000 >> (b - 1);
402 } else {
403 a >>= b;
404 }
405 return a;
406}
407
408function shl1(a) {
409 a = a % 0x80000000;
410 if (a & 0x40000000 == 0x40000000) {
411 a -= 0x40000000;
412 a *= 2;
413 a += 0x80000000;
414 } else {
415 a *= 2;
416 }
417 return a;
418}
419
420function shl(a, b) {
421 a = integer(a);
422 b = integer(b);
423 for (var i = 0; i < b; i++) {
424 a = shl1(a);
425 }
426 return a;
427}
428
429function and(a, b) {
430 a = integer(a);
431 b = integer(b);
432 var t1 = a - 0x80000000;
433 var t2 = b - 0x80000000;
434 if (t1 >= 0) {
435 if (t2 >= 0) {
436 return ((t1 & t2) + 0x80000000);
437 } else {
438 return (t1 & b);
439 }
440 } else {
441 if (t2 >= 0) {
442 return (a & t2);
443 } else {
444 return (a & b);
445 }
446 }
447}
448
449function or(a, b) {
450 a = integer(a);
451 b = integer(b);
452 var t1 = a - 0x80000000;
453 var t2 = b - 0x80000000;
454 if (t1 >= 0) {
455 if (t2 >= 0) {
456 return ((t1 | t2) + 0x80000000);
457 } else {
458 return ((t1 | b) + 0x80000000);
459 }
460 } else {
461 if (t2 >= 0) {
462 return ((a | t2) + 0x80000000);
463 } else {
464 return (a | b);
465 }
466 }
467}
468
469function xor(a, b) {
470 a = integer(a);
471 b = integer(b);
472 var t1 = a - 0x80000000;
473 var t2 = b - 0x80000000;
474 if (t1 >= 0) {
475 if (t2 >= 0) {
476 return (t1 ^ t2);
477 } else {
478 return ((t1 ^ b) + 0x80000000);
479 }
480 } else {
481 if (t2 >= 0) {
482 return ((a ^ t2) + 0x80000000);
483 } else {
484 return (a ^ b);
485 }
486 }
487}
488
489function not(a) {
490 a = integer(a);
491 return 0xffffffff - a;
492}
493
494/* Here begin the real algorithm */
495
496var state = new array(4);
497var count = new array(2);
498 count[0] = 0;
499 count[1] = 0;
500var buffer = new array(64);
501var transformBuffer = new array(16);
502var digestBits = new array(16);
503
504var S11 = 7;
505var S12 = 12;
506var S13 = 17;
507var S14 = 22;
508var S21 = 5;
509var S22 = 9;
510var S23 = 14;
511var S24 = 20;
512var S31 = 4;
513var S32 = 11;
514var S33 = 16;
515var S34 = 23;
516var S41 = 6;
517var S42 = 10;
518var S43 = 15;
519var S44 = 21;
520
521function F(x, y, z) {
522 return or(and(x, y), and(not(x), z));
523}
524
525function G(x, y, z) {
526 return or(and(x, z), and(y, not(z)));
527}
528
529function H(x, y, z) {
530 return xor(xor(x, y), z);
531}
532
533function I(x, y, z) {
534 return xor(y ,or(x , not(z)));
535}
536
537function rotateLeft(a, n) {
538 return or(shl(a, n), (shr(a, (32 - n))));
539}
540
541function FF(a, b, c, d, x, s, ac) {
542 a = a + F(b, c, d) + x + ac;
543 a = rotateLeft(a, s);
544 a = a + b;
545 return a;
546}
547
548function GG(a, b, c, d, x, s, ac) {
549 a = a + G(b, c, d) + x + ac;
550 a = rotateLeft(a, s);
551 a = a + b;
552 return a;
553}
554
555function HH(a, b, c, d, x, s, ac) {
556 a = a + H(b, c, d) + x + ac;
557 a = rotateLeft(a, s);
558 a = a + b;
559 return a;
560}
561
562function II(a, b, c, d, x, s, ac) {
563 a = a + I(b, c, d) + x + ac;
564 a = rotateLeft(a, s);
565 a = a + b;
566 return a;
567}
568
569function transform(buf, offset) {
570 var a = 0, b = 0, c = 0, d = 0;
571 var x = transformBuffer;
572
573 a = state[0];
574 b = state[1];
575 c = state[2];
576 d = state[3];
577
578 for (i = 0; i < 16; i++) {
579 x[i] = and(buf[i * 4 + offset], 0xFF);
580 for (j = 1; j < 4; j++) {
581 x[i] += shl(and(buf[i * 4 + j + offset] ,0xFF), j * 8);
582 }
583 }
584
585 /* Round 1 */
586 a = FF( a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
587 d = FF( d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
588 c = FF( c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
589 b = FF( b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
590 a = FF( a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
591 d = FF( d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
592 c = FF( c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
593 b = FF( b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
594 a = FF( a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
595 d = FF( d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
596 c = FF( c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
597 b = FF( b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
598 a = FF( a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
599 d = FF( d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
600 c = FF( c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
601 b = FF( b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
602
603 /* Round 2 */
604 a = GG( a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
605 d = GG( d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
606 c = GG( c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
607 b = GG( b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
608 a = GG( a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
609 d = GG( d, a, b, c, x[10], S22, 0x2441453); /* 22 */
610 c = GG( c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
611 b = GG( b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
612 a = GG( a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
613 d = GG( d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
614 c = GG( c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
615 b = GG( b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
616 a = GG( a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
617 d = GG( d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
618 c = GG( c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
619 b = GG( b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
620
621 /* Round 3 */
622 a = HH( a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
623 d = HH( d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
624 c = HH( c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
625 b = HH( b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
626 a = HH( a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
627 d = HH( d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
628 c = HH( c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
629 b = HH( b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
630 a = HH( a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
631 d = HH( d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
632 c = HH( c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
633 b = HH( b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
634 a = HH( a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
635 d = HH( d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
636 c = HH( c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
637 b = HH( b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
638
639 /* Round 4 */
640 a = II( a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
641 d = II( d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
642 c = II( c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
643 b = II( b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
644 a = II( a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
645 d = II( d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
646 c = II( c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
647 b = II( b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
648 a = II( a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
649 d = II( d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
650 c = II( c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
651 b = II( b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
652 a = II( a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
653 d = II( d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
654 c = II( c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
655 b = II( b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
656
657 state[0] += a;
658 state[1] += b;
659 state[2] += c;
660 state[3] += d;
661
662}
663
664function md5_init() {
665 count[0] = count[1] = 0;
666 state[0] = 0x67452301;
667 state[1] = 0xefcdab89;
668 state[2] = 0x98badcfe;
669 state[3] = 0x10325476;
670 for (i = 0; i < digestBits.length; i++) {
671 digestBits[i] = 0;
672 }
673}
674
675function md5_update(b) {
676 var index, i;
677
678 index = and(shr(count[0],3) , 0x3F);
679 if (count[0] < 0xFFFFFFFF - 7) {
680 count[0] += 8;
681 } else {
682 count[1]++;
683 count[0] -= 0xFFFFFFFF + 1;
684 count[0] += 8;
685 }
686 buffer[index] = and(b, 0xff);
687 if (index >= 63) {
688 transform(buffer, 0);
689 }
690}
691
692function md5_finish() {
693 var bits = new array(8);
694 var padding;
695 var i = 0, index = 0, padLen = 0;
696
697 for (i = 0; i < 4; i++) {
698 bits[i] = and(shr(count[0], (i * 8)), 0xFF);
699 }
700 for (i = 0; i < 4; i++) {
701 bits[i + 4] = and(shr(count[1], (i * 8)), 0xFF);
702 }
703 index = and(shr(count[0], 3), 0x3F);
704 padLen = (index < 56) ? (56 - index) : (120 - index);
705 padding = new array(64);
706 padding[0] = 0x80;
707 for (i = 0; i < padLen; i++) {
708 md5_update(padding[i]);
709 }
710 for (i = 0; i < 8; i++) {
711 md5_update(bits[i]);
712 }
713
714 for (i = 0; i < 4; i++) {
715 for (j = 0; j < 4; j++) {
716 digestBits[i * 4 + j] = and(shr(state[i], (j * 8)) , 0xFF);
717 }
718 }
719}
720
721/* End of the MD5 algorithm */
722
723//#############################################################################
724 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (aes.js)
725//#############################################################################
726
727
728/* rijndael.js Rijndael Reference Implementation
729
730 This is a modified version of the software described below,
731 produced in September 2003 by John Walker for use in the
732 JavsScrypt browser-based encryption package. The principal
733 changes are replacing the original getRandomBytes function with
734 one which calls our pseudorandom generator (which must
735 be instantiated and seeded before the first call on getRandomBytes),
736 and changing keySizeInBits to 256. Some code not required by the
737 JavsScrypt application has been commented out. Please see
738 http://www.fourmilab.ch/javascrypt/ for further information on
739 JavaScrypt.
740
741 The following is the original copyright and application
742 information.
743
744 Copyright (c) 2001 Fritz Schneider
745
746 This software is provided as-is, without express or implied warranty.
747 Permission to use, copy, modify, distribute or sell this software, with or
748 without fee, for any purpose and by any individual or organization, is hereby
749 granted, provided that the above copyright notice and this paragraph appear
750 in all copies. Distribution as a part of an application or binary must
751 include the above copyright notice in the documentation and/or other materials
752 provided with the application or distribution.
753
754 As the above disclaimer notes, you are free to use this code however you
755 want. However, I would request that you send me an email
756 (fritz /at/ cs /dot/ ucsd /dot/ edu) to say hi if you find this code useful
757 or instructional. Seeing that people are using the code acts as
758 encouragement for me to continue development. If you *really* want to thank
759 me you can buy the book I wrote with Thomas Powell, _JavaScript:
760 _The_Complete_Reference_ :)
761
762 This code is an UNOPTIMIZED REFERENCE implementation of Rijndael.
763 If there is sufficient interest I can write an optimized (word-based,
764 table-driven) version, although you might want to consider using a
765 compiled language if speed is critical to your application. As it stands,
766 one run of the monte carlo test (10,000 encryptions) can take up to
767 several minutes, depending upon your processor. You shouldn't expect more
768 than a few kilobytes per second in throughput.
769
770 Also note that there is very little error checking in these functions.
771 Doing proper error checking is always a good idea, but the ideal
772 implementation (using the instanceof operator and exceptions) requires
773 IE5+/NS6+, and I've chosen to implement this code so that it is compatible
774 with IE4/NS4.
775
776 And finally, because JavaScript doesn't have an explicit byte/char data
777 type (although JavaScript 2.0 most likely will), when I refer to "byte"
778 in this code I generally mean "32 bit integer with value in the interval
779 [0,255]" which I treat as a byte.
780
781 See http://www-cse.ucsd.edu/~fritz/rijndael.html for more documentation
782 of the (very simple) API provided by this code.
783
784 Fritz Schneider
785 fritz at cs.ucsd.edu
786
787*/
788
789
790// Rijndael parameters -- Valid values are 128, 192, or 256
791
792var keySizeInBits = 256;
793var blockSizeInBits = 128;
794
795//
796// Note: in the following code the two dimensional arrays are indexed as
797// you would probably expect, as array[row][column]. The state arrays
798// are 2d arrays of the form state[4][Nb].
799
800
801// The number of rounds for the cipher, indexed by [Nk][Nb]
802var roundsArray = [ ,,,,[,,,,10,, 12,, 14],,
803 [,,,,12,, 12,, 14],,
804 [,,,,14,, 14,, 14] ];
805
806// The number of bytes to shift by in shiftRow, indexed by [Nb][row]
807var shiftOffsets = [ ,,,,[,1, 2, 3],,[,1, 2, 3],,[,1, 3, 4] ];
808
809// The round constants used in subkey expansion
810var Rcon = [
8110x01, 0x02, 0x04, 0x08, 0x10, 0x20,
8120x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
8130xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc,
8140x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4,
8150xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 ];
816
817// Precomputed lookup table for the SBox
818var SBox = [
819 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171,
820118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164,
821114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113,
822216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226,
823235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214,
824179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203,
825190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69,
826249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245,
827188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68,
82823, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42,
829144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73,
830 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109,
831141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37,
832 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62,
833181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225,
834248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223,
835140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187,
836 22 ];
837
838// Precomputed lookup table for the inverse SBox
839var SBoxInverse = [
840 82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215,
841251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222,
842233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66,
843250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73,
844109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92,
845204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21,
846 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247,
847228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2,
848193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220,
849234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173,
850 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29,
851 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75,
852198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168,
853 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81,
854127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160,
855224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97,
856 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12,
857125 ];
858
859// This method circularly shifts the array left by the number of elements
860// given in its parameter. It returns the resulting array and is used for
861// the ShiftRow step. Note that shift() and push() could be used for a more
862// elegant solution, but they require IE5.5+, so I chose to do it manually.
863
864function cyclicShiftLeft(theArray, positions) {
865 var temp = theArray.slice(0, positions);
866 theArray = theArray.slice(positions).concat(temp);
867 return theArray;
868}
869
870// Cipher parameters ... do not change these
871var Nk = keySizeInBits / 32;
872var Nb = blockSizeInBits / 32;
873var Nr = roundsArray[Nk][Nb];
874
875// Multiplies the element "poly" of GF(2^8) by x. See the Rijndael spec.
876
877function xtime(poly) {
878 poly <<= 1;
879 return ((poly & 0x100) ? (poly ^ 0x11B) : (poly));
880}
881
882// Multiplies the two elements of GF(2^8) together and returns the result.
883// See the Rijndael spec, but should be straightforward: for each power of
884// the indeterminant that has a 1 coefficient in x, add y times that power
885// to the result. x and y should be bytes representing elements of GF(2^8)
886
887function mult_GF256(x, y) {
888 var bit, result = 0;
889
890 for (bit = 1; bit < 256; bit *= 2, y = xtime(y)) {
891 if (x & bit)
892 result ^= y;
893 }
894 return result;
895}
896
897// Performs the substitution step of the cipher. State is the 2d array of
898// state information (see spec) and direction is string indicating whether
899// we are performing the forward substitution ("encrypt") or inverse
900// substitution (anything else)
901
902function byteSub(state, direction) {
903 var S;
904 if (direction == "encrypt") // Point S to the SBox we're using
905 S = SBox;
906 else
907 S = SBoxInverse;
908 for (var i = 0; i < 4; i++) // Substitute for every byte in state
909 for (var j = 0; j < Nb; j++)
910 state[i][j] = S[state[i][j]];
911}
912
913// Performs the row shifting step of the cipher.
914
915function shiftRow(state, direction) {
916 for (var i=1; i<4; i++) // Row 0 never shifts
917 if (direction == "encrypt")
918 state[i] = cyclicShiftLeft(state[i], shiftOffsets[Nb][i]);
919 else
920 state[i] = cyclicShiftLeft(state[i], Nb - shiftOffsets[Nb][i]);
921
922}
923
924// Performs the column mixing step of the cipher. Most of these steps can
925// be combined into table lookups on 32bit values (at least for encryption)
926// to greatly increase the speed.
927
928function mixColumn(state, direction) {
929 var b = []; // Result of matrix multiplications
930 for (var j = 0; j < Nb; j++) { // Go through each column...
931 for (var i = 0; i < 4; i++) { // and for each row in the column...
932 if (direction == "encrypt")
933 b[i] = mult_GF256(state[i][j], 2) ^ // perform mixing
934 mult_GF256(state[(i+1)%4][j], 3) ^
935 state[(i+2)%4][j] ^
936 state[(i+3)%4][j];
937 else
938 b[i] = mult_GF256(state[i][j], 0xE) ^
939 mult_GF256(state[(i+1)%4][j], 0xB) ^
940 mult_GF256(state[(i+2)%4][j], 0xD) ^
941 mult_GF256(state[(i+3)%4][j], 9);
942 }
943 for (var i = 0; i < 4; i++) // Place result back into column
944 state[i][j] = b[i];
945 }
946}
947
948// Adds the current round key to the state information. Straightforward.
949
950function addRoundKey(state, roundKey) {
951 for (var j = 0; j < Nb; j++) { // Step through columns...
952 state[0][j] ^= (roundKey[j] & 0xFF); // and XOR
953 state[1][j] ^= ((roundKey[j]>>8) & 0xFF);
954 state[2][j] ^= ((roundKey[j]>>16) & 0xFF);
955 state[3][j] ^= ((roundKey[j]>>24) & 0xFF);
956 }
957}
958
959// This function creates the expanded key from the input (128/192/256-bit)
960// key. The parameter key is an array of bytes holding the value of the key.
961// The returned value is an array whose elements are the 32-bit words that
962// make up the expanded key.
963
964function keyExpansion(key) {
965 var expandedKey = new Array();
966 var temp;
967
968 // in case the key size or parameters were changed...
969 Nk = keySizeInBits / 32;
970 Nb = blockSizeInBits / 32;
971 Nr = roundsArray[Nk][Nb];
972
973 for (var j=0; j < Nk; j++) // Fill in input key first
974 expandedKey[j] =
975 (key[4*j]) | (key[4*j+1]<<8) | (key[4*j+2]<<16) | (key[4*j+3]<<24);
976
977 // Now walk down the rest of the array filling in expanded key bytes as
978 // per Rijndael's spec
979 for (j = Nk; j < Nb * (Nr + 1); j++) { // For each word of expanded key
980 temp = expandedKey[j - 1];
981 if (j % Nk == 0)
982 temp = ( (SBox[(temp>>8) & 0xFF]) |
983 (SBox[(temp>>16) & 0xFF]<<8) |
984 (SBox[(temp>>24) & 0xFF]<<16) |
985 (SBox[temp & 0xFF]<<24) ) ^ Rcon[Math.floor(j / Nk) - 1];
986 else if (Nk > 6 && j % Nk == 4)
987 temp = (SBox[(temp>>24) & 0xFF]<<24) |
988 (SBox[(temp>>16) & 0xFF]<<16) |
989 (SBox[(temp>>8) & 0xFF]<<8) |
990 (SBox[temp & 0xFF]);
991 expandedKey[j] = expandedKey[j-Nk] ^ temp;
992 }
993 return expandedKey;
994}
995
996// Rijndael's round functions...
997
998function Round(state, roundKey) {
999 byteSub(state, "encrypt");
1000 shiftRow(state, "encrypt");
1001 mixColumn(state, "encrypt");
1002 addRoundKey(state, roundKey);
1003}
1004
1005function InverseRound(state, roundKey) {
1006 addRoundKey(state, roundKey);
1007 mixColumn(state, "decrypt");
1008 shiftRow(state, "decrypt");
1009 byteSub(state, "decrypt");
1010}
1011
1012function FinalRound(state, roundKey) {
1013 byteSub(state, "encrypt");
1014 shiftRow(state, "encrypt");
1015 addRoundKey(state, roundKey);
1016}
1017
1018function InverseFinalRound(state, roundKey){
1019 addRoundKey(state, roundKey);
1020 shiftRow(state, "decrypt");
1021 byteSub(state, "decrypt");
1022}
1023
1024// encrypt is the basic encryption function. It takes parameters
1025// block, an array of bytes representing a plaintext block, and expandedKey,
1026// an array of words representing the expanded key previously returned by
1027// keyExpansion(). The ciphertext block is returned as an array of bytes.
1028
1029function encrypt(block, expandedKey) {
1030 var i;
1031 if (!block || block.length*8 != blockSizeInBits)
1032 return;
1033 if (!expandedKey)
1034 return;
1035
1036 block = packBytes(block);
1037 addRoundKey(block, expandedKey);
1038 for (i=1; i<Nr; i++)
1039 Round(block, expandedKey.slice(Nb*i, Nb*(i+1)));
1040 FinalRound(block, expandedKey.slice(Nb*Nr));
1041 return unpackBytes(block);
1042}
1043
1044// decrypt is the basic decryption function. It takes parameters
1045// block, an array of bytes representing a ciphertext block, and expandedKey,
1046// an array of words representing the expanded key previously returned by
1047// keyExpansion(). The decrypted block is returned as an array of bytes.
1048
1049function decrypt(block, expandedKey) {
1050 var i;
1051 if (!block || block.length*8 != blockSizeInBits)
1052 return;
1053 if (!expandedKey)
1054 return;
1055
1056 block = packBytes(block);
1057 InverseFinalRound(block, expandedKey.slice(Nb*Nr));
1058 for (i = Nr - 1; i>0; i--)
1059 InverseRound(block, expandedKey.slice(Nb*i, Nb*(i+1)));
1060 addRoundKey(block, expandedKey);
1061 return unpackBytes(block);
1062}
1063
1064/* !NEEDED
1065// This method takes a byte array (byteArray) and converts it to a string by
1066// applying String.fromCharCode() to each value and concatenating the result.
1067// The resulting string is returned. Note that this function SKIPS zero bytes
1068// under the assumption that they are padding added in formatPlaintext().
1069// Obviously, do not invoke this method on raw data that can contain zero
1070// bytes. It is really only appropriate for printable ASCII/Latin-1
1071// values. Roll your own function for more robust functionality :)
1072
1073function byteArrayToString(byteArray) {
1074 var result = "";
1075 for(var i=0; i<byteArray.length; i++)
1076 if (byteArray[i] != 0)
1077 result += String.fromCharCode(byteArray[i]);
1078 return result;
1079}
1080*/
1081
1082// This function takes an array of bytes (byteArray) and converts them
1083// to a hexadecimal string. Array element 0 is found at the beginning of
1084// the resulting string, high nibble first. Consecutive elements follow
1085// similarly, for example [16, 255] --> "10ff". The function returns a
1086// string.
1087
1088function byteArrayToHex(byteArray) {
1089 var result = "";
1090 if (!byteArray)
1091 return;
1092 for (var i=0; i<byteArray.length; i++)
1093 result += ((byteArray[i]<16) ? "0" : "") + byteArray[i].toString(16);
1094
1095 return result;
1096}
1097
1098// This function converts a string containing hexadecimal digits to an
1099// array of bytes. The resulting byte array is filled in the order the
1100// values occur in the string, for example "10FF" --> [16, 255]. This
1101// function returns an array.
1102
1103function hexToByteArray(hexString) {
1104 var byteArray = [];
1105 if (hexString.length % 2) // must have even length
1106 return;
1107 if (hexString.indexOf("0x") == 0 || hexString.indexOf("0X") == 0)
1108 hexString = hexString.substring(2);
1109 for (var i = 0; i<hexString.length; i += 2)
1110 byteArray[Math.floor(i/2)] = parseInt(hexString.slice(i, i+2), 16);
1111 return byteArray;
1112}
1113
1114// This function packs an array of bytes into the four row form defined by
1115// Rijndael. It assumes the length of the array of bytes is divisible by
1116// four. Bytes are filled in according to the Rijndael spec (starting with
1117// column 0, row 0 to 3). This function returns a 2d array.
1118
1119function packBytes(octets) {
1120 var state = new Array();
1121 if (!octets || octets.length % 4)
1122 return;
1123
1124 state[0] = new Array(); state[1] = new Array();
1125 state[2] = new Array(); state[3] = new Array();
1126 for (var j=0; j<octets.length; j+= 4) {
1127 state[0][j/4] = octets[j];
1128 state[1][j/4] = octets[j+1];
1129 state[2][j/4] = octets[j+2];
1130 state[3][j/4] = octets[j+3];
1131 }
1132 return state;
1133}
1134
1135// This function unpacks an array of bytes from the four row format preferred
1136// by Rijndael into a single 1d array of bytes. It assumes the input "packed"
1137// is a packed array. Bytes are filled in according to the Rijndael spec.
1138// This function returns a 1d array of bytes.
1139
1140function unpackBytes(packed) {
1141 var result = new Array();
1142 for (var j=0; j<packed[0].length; j++) {
1143 result[result.length] = packed[0][j];
1144 result[result.length] = packed[1][j];
1145 result[result.length] = packed[2][j];
1146 result[result.length] = packed[3][j];
1147 }
1148 return result;
1149}
1150
1151// This function takes a prospective plaintext (string or array of bytes)
1152// and pads it with pseudorandom bytes if its length is not a multiple of the block
1153// size. If plaintext is a string, it is converted to an array of bytes
1154// in the process. The type checking can be made much nicer using the
1155// instanceof operator, but this operator is not available until IE5.0 so I
1156// chose to use the heuristic below.
1157
1158function formatPlaintext(plaintext) {
1159 var bpb = blockSizeInBits / 8; // bytes per block
1160 var fillWithRandomBits;
1161 var i;
1162
1163 // if primitive string or String instance
1164 if ((!((typeof plaintext == "object") &&
1165 ((typeof (plaintext[0])) == "number"))) &&
1166 ((typeof plaintext == "string") || plaintext.indexOf))
1167 {
1168 plaintext = plaintext.split("");
1169 // Unicode issues here (ignoring high byte)
1170 for (i=0; i<plaintext.length; i++) {
1171 plaintext[i] = plaintext[i].charCodeAt(0) & 0xFF;
1172 }
1173 }
1174
1175 i = plaintext.length % bpb;
1176 if (i > 0) {
1177//alert("adding " + (bpb - 1) + " bytes");
1178 // plaintext = plaintext.concat(getRandomBytes(bpb - i));
1179 {
1180 varpaddingBytes;
1181 var ii,cc;
1182
1183 paddingBytes = new Array();
1184 cc = bpb - i;
1185 for (ii=0; ii<cc; ii++) {
1186 paddingBytes[ii] = cc;
1187 }
1188
1189//is("cc", cc);
1190//is(getRandomBytes(bpb - i) + "", paddingBytes + "");
1191 plaintext = plaintext.concat(paddingBytes);
1192 }
1193 }
1194
1195 return plaintext;
1196}
1197
1198// Returns an array containing "howMany" random bytes.
1199
1200function getRandomBytes(howMany) {
1201 var i, bytes = new Array();
1202
1203//alert("getting some random bytes");
1204 for (i = 0; i < howMany; i++) {
1205 bytes[i] = prng.nextInt(255);
1206 }
1207 return bytes;
1208}
1209
1210// rijndaelEncrypt(plaintext, key, mode)
1211// Encrypts the plaintext using the given key and in the given mode.
1212// The parameter "plaintext" can either be a string or an array of bytes.
1213// The parameter "key" must be an array of key bytes. If you have a hex
1214// string representing the key, invoke hexToByteArray() on it to convert it
1215// to an array of bytes. The third parameter "mode" is a string indicating
1216// the encryption mode to use, either "ECB" or "CBC". If the parameter is
1217// omitted, ECB is assumed.
1218//
1219// An array of bytes representing the cihpertext is returned. To convert
1220// this array to hex, invoke byteArrayToHex() on it.
1221
1222function rijndaelEncrypt(plaintext, key, mode) {
1223 var expandedKey, i, aBlock;
1224 var bpb = blockSizeInBits / 8; // bytes per block
1225 var ct; // ciphertext
1226
1227 if (!plaintext || !key)
1228 return;
1229 if (key.length*8 != keySizeInBits)
1230 return;
1231 if (mode == "CBC") {
1232 ct = getRandomBytes(bpb); // get IV
1233//dump("IV", byteArrayToHex(ct));
1234 } else {
1235 mode = "ECB";
1236 ct = new Array();
1237 }
1238
1239 // convert plaintext to byte array and pad with zeros if necessary.
1240 plaintext = formatPlaintext(plaintext);
1241
1242 expandedKey = keyExpansion(key);
1243
1244 for (var block = 0; block < plaintext.length / bpb; block++) {
1245 aBlock = plaintext.slice(block * bpb, (block + 1) * bpb);
1246 if (mode == "CBC") {
1247 for (var i = 0; i < bpb; i++) {
1248 aBlock[i] ^= ct[(block * bpb) + i];
1249 }
1250 }
1251 ct = ct.concat(encrypt(aBlock, expandedKey));
1252 }
1253
1254 return ct;
1255}
1256
1257// rijndaelDecrypt(ciphertext, key, mode)
1258// Decrypts the using the given key and mode. The parameter "ciphertext"
1259// must be an array of bytes. The parameter "key" must be an array of key
1260// bytes. If you have a hex string representing the ciphertext or key,
1261// invoke hexToByteArray() on it to convert it to an array of bytes. The
1262// parameter "mode" is a string, either "CBC" or "ECB".
1263//
1264// An array of bytes representing the plaintext is returned. To convert
1265// this array to a hex string, invoke byteArrayToHex() on it. To convert it
1266// to a string of characters, you can use byteArrayToString().
1267
1268function rijndaelDecrypt(ciphertext, key, mode) {
1269 var expandedKey;
1270 var bpb = blockSizeInBits / 8; // bytes per block
1271 var pt = new Array(); // plaintext array
1272 var aBlock; // a decrypted block
1273 var block; // current block number
1274
1275 if (!ciphertext || !key || typeof ciphertext == "string")
1276 return;
1277 if (key.length*8 != keySizeInBits)
1278 return;
1279 if (!mode) {
1280 mode = "ECB"; // assume ECB if mode omitted
1281 }
1282
1283 expandedKey = keyExpansion(key);
1284
1285 // work backwards to accomodate CBC mode
1286 for (block=(ciphertext.length / bpb)-1; block>0; block--) {
1287 aBlock =
1288 decrypt(ciphertext.slice(block*bpb,(block+1)*bpb), expandedKey);
1289 if (mode == "CBC")
1290 for (var i=0; i<bpb; i++)
1291 pt[(block-1)*bpb + i] = aBlock[i] ^ ciphertext[(block-1)*bpb + i];
1292 else
1293 pt = aBlock.concat(pt);
1294 }
1295
1296 // do last block if ECB (skips the IV in CBC)
1297 if (mode == "ECB")
1298 pt = decrypt(ciphertext.slice(0, bpb), expandedKey).concat(pt);
1299
1300 return pt;
1301}
1302
1303//#############################################################################
1304 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (utf-8.js)
1305//#############################################################################
1306
1307
1308 /*Encoding and decoding of Unicode character strings as
1309 UTF-8 byte streams. */
1310
1311 //UNICODE_TO_UTF8 -- Encode Unicode argument string as UTF-8 return value
1312
1313 function unicode_to_utf8(s) {
1314 var utf8 = "";
1315
1316 for (var n = 0; n < s.length; n++) {
1317 var c = s.charCodeAt(n);
1318
1319 if (c <= 0x7F) {
1320 // 0x00 - 0x7F: Emit as single byte, unchanged
1321 utf8 += String.fromCharCode(c);
1322 } else if ((c >= 0x80) && (c <= 0x7FF)) {
1323 // 0x80 - 0x7FF: Output as two byte code, 0xC0 in first byte
1324 // 0x80 in second byte
1325 utf8 += String.fromCharCode((c >> 6) | 0xC0);
1326 utf8 += String.fromCharCode((c & 0x3F) | 0x80);
1327 } else {
1328 // 0x800 - 0xFFFF: Output as three bytes, 0xE0 in first byte
1329 // 0x80 in second byte
1330 // 0x80 in third byte
1331 utf8 += String.fromCharCode((c >> 12) | 0xE0);
1332 utf8 += String.fromCharCode(((c >> 6) & 0x3F) | 0x80);
1333 utf8 += String.fromCharCode((c & 0x3F) | 0x80);
1334 }
1335 }
1336 return utf8;
1337 }
1338
1339 //UTF8_TO_UNICODE -- Decode UTF-8 argument into Unicode string return value
1340
1341 function utf8_to_unicode(utf8) {
1342 var s = "", i = 0, b1, b2, b2;
1343
1344 while (i < utf8.length) {
1345 b1 = utf8.charCodeAt(i);
1346 if (b1 < 0x80) { // One byte code: 0x00 0x7F
1347 s += String.fromCharCode(b1);
1348 i++;
1349 } else if((b1 >= 0xC0) && (b1 < 0xE0)) {// Two byte code: 0x80 - 0x7FF
1350 b2 = utf8.charCodeAt(i + 1);
1351 s += String.fromCharCode(((b1 & 0x1F) << 6) | (b2 & 0x3F));
1352 i += 2;
1353 } else { // Three byte code: 0x800 - 0xFFFF
1354 b2 = utf8.charCodeAt(i + 1);
1355 b3 = utf8.charCodeAt(i + 2);
1356 s += String.fromCharCode(((b1 & 0xF) << 12) |
1357 ((b2 & 0x3F) << 6) |
1358 (b3 & 0x3F));
1359 i += 3;
1360 }
1361 }
1362 return s;
1363 }
1364
1365 /*ENCODE_UTF8 -- Encode string as UTF8 only if it contains
1366 a character of 0x9D (Unicode OPERATING
1367 SYSTEM COMMAND) or a character greater
1368 than 0xFF. This permits all strings
1369 consisting exclusively of 8 bit
1370 graphic characters to be encoded as
1371 themselves. We choose 0x9D as the sentinel
1372 character as opposed to one of the more
1373 logical PRIVATE USE characters because 0x9D
1374 is not overloaded by the regrettable
1375 "Windows-1252" character set. Now such characters
1376 don't belong in JavaScript strings, but you never
1377 know what somebody is going to paste into a
1378 text box, so this choice keeps Windows-encoded
1379 strings from bloating to UTF-8 encoding. */
1380
1381 function encode_utf8(s) {
1382 var i, necessary = false;
1383
1384 for (i = 0; i < s.length; i++) {
1385 if ((s.charCodeAt(i) == 0x9D) ||
1386 (s.charCodeAt(i) > 0xFF)) {
1387 necessary = true;
1388 break;
1389 }
1390 }
1391 if (!necessary) {
1392 return s;
1393 }
1394 return String.fromCharCode(0x9D) + unicode_to_utf8(s);
1395 }
1396
1397 /* DECODE_UTF8 -- Decode a string encoded with encode_utf8
1398 above. If the string begins with the
1399 sentinel character 0x9D (OPERATING
1400 SYSTEM COMMAND), then we decode the
1401 balance as a UTF-8 stream. Otherwise,
1402 the string is output unchanged, as
1403 it's guaranteed to contain only 8 bit
1404 characters excluding 0x9D. */
1405
1406 function decode_utf8(s) {
1407 if ((s.length > 0) && (s.charCodeAt(0) == 0x9D)) {
1408 return utf8_to_unicode(s.substring(1));
1409 }
1410 return s;
1411 }
1412
1413
1414//#############################################################################
1415 //Downloaded on April 26, 2006 from http://pajhome.org.uk/crypt/md5/md5.js
1416//#############################################################################
1417
1418/*
1419 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
1420 * Digest Algorithm, as defined in RFC 1321.
1421 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
1422 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
1423 * Distributed under the BSD License
1424 * See http://pajhome.org.uk/crypt/md5 for more info.
1425 */
1426
1427/*
1428 * Configurable variables. You may need to tweak these to be compatible with
1429 * the server-side, but the defaults work in most cases.
1430 */
1431var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
1432var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
1433var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
1434
1435/*
1436 * These are the functions you'll usually want to call
1437 * They take string arguments and return either hex or base-64 encoded strings
1438 */
1439function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
1440function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
1441function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
1442function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
1443function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
1444function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
1445
1446/*
1447 * Perform a simple self-test to see if the VM is working
1448 */
1449function md5_vm_test()
1450{
1451 return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
1452}
1453
1454/*
1455 * Calculate the MD5 of an array of little-endian words, and a bit length
1456 */
1457function core_md5(x, len)
1458{
1459 /* append padding */
1460 x[len >> 5] |= 0x80 << ((len) % 32);
1461 x[(((len + 64) >>> 9) << 4) + 14] = len;
1462
1463 var a = 1732584193;
1464 var b = -271733879;
1465 var c = -1732584194;
1466 var d = 271733878;
1467
1468 for(var i = 0; i < x.length; i += 16)
1469 {
1470 var olda = a;
1471 var oldb = b;
1472 var oldc = c;
1473 var oldd = d;
1474
1475 a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
1476 d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
1477 c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
1478 b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
1479 a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
1480 d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
1481 c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
1482 b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
1483 a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
1484 d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
1485 c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
1486 b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
1487 a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
1488 d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
1489 c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
1490 b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
1491
1492 a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
1493 d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
1494 c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
1495 b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
1496 a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
1497 d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
1498 c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
1499 b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
1500 a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
1501 d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
1502 c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
1503 b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
1504 a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
1505 d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
1506 c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
1507 b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
1508
1509 a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
1510 d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
1511 c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
1512 b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
1513 a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
1514 d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
1515 c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
1516 b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
1517 a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
1518 d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
1519 c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
1520 b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
1521 a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
1522 d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
1523 c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
1524 b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
1525
1526 a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
1527 d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
1528 c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
1529 b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
1530 a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
1531 d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
1532 c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
1533 b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
1534 a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
1535 d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
1536 c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
1537 b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
1538 a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
1539 d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
1540 c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
1541 b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
1542
1543 a = safe_add(a, olda);
1544 b = safe_add(b, oldb);
1545 c = safe_add(c, oldc);
1546 d = safe_add(d, oldd);
1547 }
1548 return Array(a, b, c, d);
1549
1550}
1551
1552/*
1553 * These functions implement the four basic operations the algorithm uses.
1554 */
1555function md5_cmn(q, a, b, x, s, t)
1556{
1557 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
1558}
1559function md5_ff(a, b, c, d, x, s, t)
1560{
1561 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
1562}
1563function md5_gg(a, b, c, d, x, s, t)
1564{
1565 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
1566}
1567function md5_hh(a, b, c, d, x, s, t)
1568{
1569 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
1570}
1571function md5_ii(a, b, c, d, x, s, t)
1572{
1573 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
1574}
1575
1576/*
1577 * Calculate the HMAC-MD5, of a key and some data
1578 */
1579function core_hmac_md5(key, data)
1580{
1581 var bkey = str2binl(key);
1582 if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
1583
1584 var ipad = Array(16), opad = Array(16);
1585 for(var i = 0; i < 16; i++)
1586 {
1587 ipad[i] = bkey[i] ^ 0x36363636;
1588 opad[i] = bkey[i] ^ 0x5C5C5C5C;
1589 }
1590
1591 var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
1592 return core_md5(opad.concat(hash), 512 + 128);
1593}
1594
1595/*
1596 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
1597 * to work around bugs in some JS interpreters.
1598 */
1599function safe_add(x, y)
1600{
1601 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
1602 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
1603 return (msw << 16) | (lsw & 0xFFFF);
1604}
1605
1606/*
1607 * Bitwise rotate a 32-bit number to the left.
1608 */
1609function bit_rol(num, cnt)
1610{
1611 return (num << cnt) | (num >>> (32 - cnt));
1612}
1613
1614/*
1615 * Convert a string to an array of little-endian words
1616 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
1617 */
1618function str2binl(str)
1619{
1620 var bin = Array();
1621 var mask = (1 << chrsz) - 1;
1622 for(var i = 0; i < str.length * chrsz; i += chrsz)
1623 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
1624 return bin;
1625}
1626
1627/*
1628 * Convert an array of little-endian words to a string
1629 */
1630function binl2str(bin)
1631{
1632 var str = "";
1633 var mask = (1 << chrsz) - 1;
1634 for(var i = 0; i < bin.length * 32; i += chrsz)
1635 str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
1636 return str;
1637}
1638
1639/*
1640 * Convert an array of little-endian words to a hex string.
1641 */
1642function binl2hex(binarray)
1643{
1644 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
1645 var str = "";
1646 for(var i = 0; i < binarray.length * 4; i++)
1647 {
1648 str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
1649 hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
1650 }
1651 return str;
1652}
1653
1654/*
1655 * Convert an array of little-endian words to a base-64 string
1656 */
1657function binl2b64(binarray)
1658{
1659 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1660 var str = "";
1661 for(var i = 0; i < binarray.length * 4; i += 3)
1662 {
1663 var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
1664 | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
1665 | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
1666 for(var j = 0; j < 4; j++)
1667 {
1668 if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
1669 else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
1670 }
1671 }
1672 return str;
1673}
1674
1675
1676//#############################################################################
1677//#############################################################################
1678//#############################################################################
1679
1680
1681
1682MochiKit.Base.update(Clipperz.Crypto.Base, {
1683
1684 '__repr__': function () {
1685 return "[" + this.NAME + " " + this.VERSION + "]";
1686 },
1687
1688 'toString': function () {
1689 return this.__repr__();
1690 },
1691
1692 //-----------------------------------------------------------------------------
1693
1694 'encryptUsingSecretKey': function (aKey, aMessage) {
1695//Clipperz.Profile.start("Clipperz.Crypto.Base.encryptUsingSecretKey");
1696 var result;
1697 var plaintext;
1698 varheader;
1699 varkey;
1700
1701 key = hexToByteArray(Clipperz.Crypto.Base.computeHashValue(aKey));
1702
1703 addEntropyTime();
1704 prng = new AESprng(keyFromEntropy());
1705
1706 plaintext = encode_utf8(aMessage);
1707
1708 header = Clipperz.Base.byteArrayToString(hexToByteArray(Clipperz.Crypto.Base.computeMD5HashValue(plaintext)));
1709
1710 // Add message length in bytes to header
1711 i = plaintext.length;
1712 header += String.fromCharCode(i >>> 24);
1713 header += String.fromCharCode(i >>> 16);
1714 header += String.fromCharCode(i >>> 8);
1715 header += String.fromCharCode(i & 0xFF);
1716
1717 //The format of the actual message passed to rijndaelEncrypt
1718 //is:
1719 //
1720 // Bytes Content
1721 // 0-15 MD5 signature of plaintext
1722 // 16-19 Length of plaintext, big-endian order
1723 // 20-end Plaintext
1724 //
1725 //Note that this message will be padded with zero bytes
1726 //to an integral number of AES blocks (blockSizeInBits / 8).
1727 //This does not include the initial vector for CBC
1728 //encryption, which is added internally by rijndaelEncrypt.
1729 result = byteArrayToHex(rijndaelEncrypt(header + plaintext, key, "CBC"));
1730
1731 delete prng;
1732
1733//Clipperz.Profile.stop("Clipperz.Crypto.Base.encryptUsingSecretKey");
1734 return result;
1735 },
1736
1737 //.............................................................................
1738
1739 'decryptUsingSecretKey': function (aKey, aMessage) {
1740//Clipperz.Profile.start("Clipperz.Crypto.Base.decryptUsingSecretKey");
1741 varkey;
1742 var decryptedText;
1743 vartextLength;
1744 varheader;
1745 varheaderDigest;
1746 var plaintext;
1747 var i;
1748
1749 key = hexToByteArray(Clipperz.Crypto.Base.computeHashValue(aKey));
1750
1751 decryptedText = rijndaelDecrypt(hexToByteArray(aMessage), key, "CBC");
1752
1753 header = decryptedText.slice(0, 20);
1754 decryptedText = decryptedText.slice(20);
1755
1756 headerDigest = byteArrayToHex(header.slice(0,16));
1757 textLength = (header[16] << 24) | (header[17] << 16) | (header[18] << 8) | header[19];
1758
1759 if ((textLength < 0) || (textLength > decryptedText.length)) {
1760 // jslog.warning("Message (length " + decryptedText.length + ") truncated. " + textLength + " characters expected.");
1761 //Try to sauve qui peut by setting length to entire message
1762 textLength = decryptedText.length;
1763 }
1764
1765 plainText = "";
1766
1767 for (i=0; i<textLength; i++) {
1768 plainText += String.fromCharCode(decryptedText[i]);
1769 }
1770
1771 if (Clipperz.Crypto.Base.computeMD5HashValue(plainText) != headerDigest) {
1772 // jslog.warning("Message corrupted. Checksum of decrypted message does not match.");
1773 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
1774 // throw new Error("Message corrupted. Checksum of decrypted message does not match. Parsed result: " + decode_utf8(plainText));
1775 }
1776
1777 // That's it; plug plaintext into the result field
1778
1779 result = decode_utf8(plainText);
1780
1781//Clipperz.Profile.stop("Clipperz.Crypto.Base.decryptUsingSecretKey");
1782 return result;
1783 },
1784
1785 //-----------------------------------------------------------------------------
1786
1787 'computeHashValue': function (aMessage) {
1788//Clipperz.Profile.start("Clipperz.Crypto.Base.computeHashValue");
1789 varresult;
1790
1791 result = hex_sha256(aMessage);
1792//Clipperz.Profile.stop("Clipperz.Crypto.Base.computeHashValue");
1793
1794 return result;
1795 },
1796
1797 //.........................................................................
1798
1799 'computeMD5HashValue': function (aMessage) {
1800 varresult;
1801//Clipperz.Profile.start("Clipperz.Crypto.Base.computeMD5HashValue");
1802 result = hex_md5(aMessage);
1803//Clipperz.Profile.stop("Clipperz.Crypto.Base.computeMD5HashValue");
1804
1805 return result;
1806 },
1807
1808 //-----------------------------------------------------------------------------
1809
1810 'generateRandomSeed': function () {
1811//Clipperz.Profile.start("Clipperz.Crypto.Base.generateRandomSeed");
1812 varresult;
1813 var seed;
1814 var prng;
1815 var charA;
1816 var i;
1817
1818 addEntropyTime();
1819
1820 seed = keyFromEntropy();
1821 prng = new AESprng(seed);
1822
1823 result = "";
1824 charA = ("A").charCodeAt(0);
1825
1826 for (i = 0; i < 64; i++) {
1827 result += String.fromCharCode(charA + prng.nextInt(25));
1828 }
1829
1830 delete prng;
1831
1832 result = Clipperz.Crypto.Base.computeHashValue(result);
1833
1834//Clipperz.Profile.stop("Clipperz.Crypto.Base.generateRandomSeed");
1835 return result;
1836 },
1837
1838 //-----------------------------------------------------------------------------
1839
1840 'exception': {
1841 'CorruptedMessage': new MochiKit.Base.NamedError("Clipperz.Crypto.Base.exception.CorruptedMessage")
1842 },
1843
1844 //.........................................................................
1845 __syntaxFix__: "syntax fix"
1846});
1847
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/BigInt.js b/frontend/gamma/js/ClipperzCryptoLibrary/BigInt.js
new file mode 100644
index 0000000..197cd9a
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/BigInt.js
@@ -0,0 +1,1755 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
26
27//#############################################################################
28 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js
29//#############################################################################
30
31
32////////////////////////////////////////////////////////////////////////////////////////
33// Big Integer Library v. 5.0
34// Created 2000, last modified 2006
35// Leemon Baird
36// www.leemon.com
37//
38// This file is public domain. You can use it for any purpose without restriction.
39// I do not guarantee that it is correct, so use it at your own risk. If you use
40// it for something interesting, I'd appreciate hearing about it. If you find
41// any bugs or make any improvements, I'd appreciate hearing about those too.
42// It would also be nice if my name and address were left in the comments.
43// But none of that is required.
44//
45// This code defines a bigInt library for arbitrary-precision integers.
46// A bigInt is an array of integers storing the value in chunks of bpe bits,
47// little endian (buff[0] is the least significant word).
48// Negative bigInts are stored two's complement.
49// Some functions assume their parameters have at least one leading zero element.
50// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow,
51// so the caller must make sure overflow won't happen.
52// For each function where a parameter is modified, that same
53// variable must not be used as another argument too.
54// So, you cannot square x by doing multMod_(x,x,n).
55// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n).
56//
57// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.
58// For most functions, if it needs a BigInt as a local variable it will actually use
59// a global, and will only allocate to it when it's not the right size. This ensures
60// that when a function is called repeatedly with same-sized parameters, it only allocates
61// memory on the first call.
62//
63// Note that for cryptographic purposes, the calls to Math.random() must
64// be replaced with calls to a better pseudorandom number generator.
65//
66// In the following, "bigInt" means a bigInt with at least one leading zero element,
67// and "integer" means a nonnegative integer less than radix. In some cases, integer
68// can be negative. Negative bigInts are 2s complement.
69//
70// The following functions do not modify their inputs, but dynamically allocate memory every time they are called:
71//
72// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95
73// function dup(x) //returns a copy of bigInt x
74// function findPrimes(n) //return array of all primes less than integer n
75// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements
76// function int2bigInt(s,b,n,m) //convert string s in base b to a bigInt with at least n bits and m array elements
77// function trim(x,k) //return a copy of x with exactly k leading zero elements
78//
79// The following functions do not modify their inputs, so there is never a problem with the result being too big:
80//
81// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros
82// function equals(x,y) //is the bigInt x equal to the bigint y?
83// function equalsInt(x,y) //is bigint x equal to integer y?
84// function greater(x,y) //is x>y? (x and y are nonnegative bigInts)
85// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?
86// function isZero(x) //is the bigInt x equal to zero?
87// function millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime (as opposed to definitely composite)?
88// function modInt(x,n) //return x mod n for bigInt x and integer n.
89// function negative(x) //is bigInt x negative?
90//
91// The following functions do not modify their inputs, but allocate memory and call functions with underscores
92//
93// function add(x,y) //return (x+y) for bigInts x and y.
94// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.
95// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed
96// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
97// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.
98// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.
99// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
100// function powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
101// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm.
102// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement
103//
104// The following functions write a bigInt result to one of the parameters, but
105// the result is never bigger than the original, so there can't be overflow problems:
106//
107// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder
108// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed).
109// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
110// function mod_(x,n) //do x=x mod n for bigInts x and n.
111// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe.
112//
113// The following functions write a bigInt result to one of the parameters. The caller is responsible for
114// ensuring it is large enough to hold the result.
115//
116// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer
117// function add_(x,y) //do x=x+y for bigInts x and y
118// function addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))
119// function copy_(x,y) //do x=y on bigInts x and y
120// function copyInt_(x,n) //do x=n on bigInt x and integer n
121// function carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.
122// function divide_(x,y,q,r) //divide_ x by y giving quotient q and remainder r
123// function eGCD_(x,y,d,a,b) //sets a,b,d to positive big integers such that d = GCD_(x,y) = a*x-b*y
124// function inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist
125// function inverseModInt_(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
126// function leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.
127// function linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b
128// function linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys
129// function mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)
130// function mult_(x,y) //do x=x*y for bigInts x and y.
131// function multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.
132// function multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.
133// function powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.
134// function randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.
135// function randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.
136// function squareMod_(x,n) //do x=x*x mod n for bigInts x,n
137// function sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.
138// function subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.
139//
140// The following functions are based on algorithms from the _Handbook of Applied Cryptography_
141// powMod_() = algorithm 14.94, Montgomery exponentiation
142// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_
143// GCD_() = algorothm 14.57, Lehmer's algorithm
144// mont_() = algorithm 14.36, Montgomery multiplication
145// divide_() = algorithm 14.20 Multiple-precision division
146// squareMod_() = algorithm 14.16 Multiple-precision squaring
147// randTruePrime_() = algorithm 4.62, Maurer's algorithm
148// millerRabin() = algorithm 4.24, Miller-Rabin algorithm
149//
150// Profiling shows:
151// randTruePrime_() spends:
152// 10% of its time in calls to powMod_()
153// 85% of its time in calls to millerRabin()
154// millerRabin() spends:
155// 99% of its time in calls to powMod_() (always with a base of 2)
156// powMod_() spends:
157// 94% of its time in calls to mont_() (almost always with x==y)
158//
159// This suggests there are several ways to speed up this library slightly:
160// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)
161// -- this should especially focus on being fast when raising 2 to a power mod n
162// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test
163// - tune the parameters in randTruePrime_(), including c, m, and recLimit
164// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking
165// within the loop when all the parameters are the same length.
166//
167// There are several ideas that look like they wouldn't help much at all:
168// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)
169// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32)
170// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square
171// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that
172// method would be slower. This is unfortunate because the code currently spends almost all of its time
173// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring
174// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded
175// sentences that seem to imply it's faster to do a non-modular square followed by a single
176// Montgomery reduction, but that's obviously wrong.
177////////////////////////////////////////////////////////////////////////////////////////
178
179//globals
180bpe=0; //bits stored per array element
181mask=0; //AND this with an array element to chop it down to bpe bits
182radix=mask+1; //equals 2^bpe. A single 1 bit to the left of the last bit of mask.
183
184//the digits for converting to different bases
185digitsStr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-';
186
187//initialize the global variables
188for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform
189bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt
190mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits
191radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask
192one=int2bigInt(1,1,1); //constant used in powMod_()
193
194//the following global variables are scratchpad memory to
195//reduce dynamic memory allocation in the inner loop
196t=new Array(0);
197ss=t; //used in mult_()
198s0=t; //used in multMod_(), squareMod_()
199s1=t; //used in powMod_(), multMod_(), squareMod_()
200s2=t; //used in powMod_(), multMod_()
201s3=t; //used in powMod_()
202s4=t; s5=t; //used in mod_()
203s6=t; //used in bigInt2str()
204s7=t; //used in powMod_()
205T=t; //used in GCD_()
206sa=t; //used in mont_()
207mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin()
208eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_()
209md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_()
210
211primes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t;
212 s_a=t; s_r2=t; s_n=t; s_b=t; s_d=t; s_x1=t; s_x2=t, s_aa=t; //used in randTruePrime_()
213
214////////////////////////////////////////////////////////////////////////////////////////
215
216//return array of all primes less than integer n
217function findPrimes(n) {
218 var i,s,p,ans;
219 s=new Array(n);
220 for (i=0;i<n;i++)
221 s[i]=0;
222 s[0]=2;
223 p=0; //first p elements of s are primes, the rest are a sieve
224 for(;s[p]<n;) { //s[p] is the pth prime
225 for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p]
226 s[i]=1;
227 p++;
228 s[p]=s[p-1]+1;
229 for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)
230 }
231 ans=new Array(p);
232 for(i=0;i<p;i++)
233 ans[i]=s[i];
234 return ans;
235}
236
237//does a single round of Miller-Rabin base b consider x to be a possible prime?
238//x is a bigInt, and b is an integer
239function millerRabin(x,b) {
240 var i,j,k,s;
241
242 if (mr_x1.length!=x.length) {
243 mr_x1=dup(x);
244 mr_r=dup(x);
245 mr_a=dup(x);
246 }
247
248 copyInt_(mr_a,b);
249 copy_(mr_r,x);
250 copy_(mr_x1,x);
251
252 addInt_(mr_r,-1);
253 addInt_(mr_x1,-1);
254
255 //s=the highest power of two that divides mr_r
256 k=0;
257 for (i=0;i<mr_r.length;i++)
258 for (j=1;j<mask;j<<=1)
259 if (x[i] & j) {
260 s=(k<mr_r.length+bpe ? k : 0);
261 i=mr_r.length;
262 j=mask;
263 } else
264 k++;
265
266 if (s)
267 rightShift_(mr_r,s);
268
269 powMod_(mr_a,mr_r,x);
270
271 if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) {
272 j=1;
273 while (j<=s-1 && !equals(mr_a,mr_x1)) {
274 squareMod_(mr_a,x);
275 if (equalsInt(mr_a,1)) {
276 return 0;
277 }
278 j++;
279 }
280 if (!equals(mr_a,mr_x1)) {
281 return 0;
282 }
283 }
284 return 1;
285}
286
287//returns how many bits long the bigInt is, not counting leading zeros.
288function bitSize(x) {
289 var j,z,w;
290 for (j=x.length-1; (x[j]==0) && (j>0); j--);
291 for (z=0,w=x[j]; w; (w>>=1),z++);
292 z+=bpe*j;
293 return z;
294}
295
296//return a copy of x with at least n elements, adding leading zeros if needed
297function expand(x,n) {
298 var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0);
299 copy_(ans,x);
300 return ans;
301}
302
303//return a k-bit true random prime using Maurer's algorithm.
304function randTruePrime(k) {
305 var ans=int2bigInt(0,k,0);
306 randTruePrime_(ans,k);
307 return trim(ans,1);
308}
309
310//return a new bigInt equal to (x mod n) for bigInts x and n.
311function mod(x,n) {
312 var ans=dup(x);
313 mod_(ans,n);
314 return trim(ans,1);
315}
316
317//return (x+n) where x is a bigInt and n is an integer.
318function addInt(x,n) {
319 var ans=expand(x,x.length+1);
320 addInt_(ans,n);
321 return trim(ans,1);
322}
323
324//return x*y for bigInts x and y. This is faster when y<x.
325function mult(x,y) {
326 var ans=expand(x,x.length+y.length);
327 mult_(ans,y);
328 return trim(ans,1);
329}
330
331//return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
332function powMod(x,y,n) {
333 var ans=expand(x,n.length);
334 powMod_(ans,trim(y,2),trim(n,2),0); //this should work without the trim, but doesn't
335 return trim(ans,1);
336}
337
338//return (x-y) for bigInts x and y. Negative answers will be 2s complement
339function sub(x,y) {
340 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
341 sub_(ans,y);
342 return trim(ans,1);
343}
344
345//return (x+y) for bigInts x and y.
346function add(x,y) {
347 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
348 add_(ans,y);
349 return trim(ans,1);
350}
351
352//return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
353function inverseMod(x,n) {
354 var ans=expand(x,n.length);
355 var s;
356 s=inverseMod_(ans,n);
357 return s ? trim(ans,1) : null;
358}
359
360//return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
361function multMod(x,y,n) {
362 var ans=expand(x,n.length);
363 multMod_(ans,y,n);
364 return trim(ans,1);
365}
366
367//generate a k-bit true random prime using Maurer's algorithm,
368//and put it into ans. The bigInt ans must be large enough to hold it.
369function randTruePrime_(ans,k) {
370 var c,m,pm,dd,j,r,B,divisible,z,zz,recSize;
371
372 if (primes.length==0)
373 primes=findPrimes(30000); //check for divisibility by primes <=30000
374
375 if (pows.length==0) {
376 pows=new Array(512);
377 for (j=0;j<512;j++) {
378 pows[j]=Math.pow(2,j/511.-1.);
379 }
380 }
381
382 //c and m should be tuned for a particular machine and value of k, to maximize speed
383 //this was: c=primes[primes.length-1]/k/k; //check using all the small primes. (c=0.1 in HAC)
384 c=0.1;
385 m=20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
386 recLimit=20; /*must be at least 2 (was 29)*/ //stop recursion when k <=recLimit
387
388 if (s_i2.length!=ans.length) {
389 s_i2=dup(ans);
390 s_R =dup(ans);
391 s_n1=dup(ans);
392 s_r2=dup(ans);
393 s_d =dup(ans);
394 s_x1=dup(ans);
395 s_x2=dup(ans);
396 s_b =dup(ans);
397 s_n =dup(ans);
398 s_i =dup(ans);
399 s_rm=dup(ans);
400 s_q =dup(ans);
401 s_a =dup(ans);
402 s_aa=dup(ans);
403 }
404
405 if (k <= recLimit) { //generate small random primes by trial division up to its square root
406 pm=(1<<((k+2)>>1))-1; //pm is binary number with all ones, just over sqrt(2^k)
407 copyInt_(ans,0);
408 for (dd=1;dd;) {
409 dd=0;
410 ans[0]= 1 | (1<<(k-1)) | Math.floor(Math.random()*(1<<k)); //random, k-bit, odd integer, with msb 1
411 for (j=1;(j<primes.length) && ((primes[j]&pm)==primes[j]);j++) { //trial division by all primes 3...sqrt(2^k)
412 if (0==(ans[0]%primes[j])) {
413 dd=1;
414 break;
415 }
416 }
417 }
418 carry_(ans);
419 return;
420 }
421
422 B=c*k*k; //try small primes up to B (or all the primes[] array if the largest is less than B).
423 if (k>2*m) //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
424 for (r=1; k-k*r<=m; )
425 r=pows[Math.floor(Math.random()*512)]; //r=Math.pow(2,Math.random()-1);
426 else
427 r=.5;
428
429 //simulation suggests the more complex algorithm using r=.333 is only slightly faster.
430
431 recSize=Math.floor(r*k)+1;
432
433 randTruePrime_(s_q,recSize);
434 copyInt_(s_i2,0);
435 s_i2[Math.floor((k-2)/bpe)] |= (1<<((k-2)%bpe)); //s_i2=2^(k-2)
436 divide_(s_i2,s_q,s_i,s_rm); //s_i=floor((2^(k-1))/(2q))
437
438 z=bitSize(s_i);
439
440 for (;;) {
441 for (;;) { //generate z-bit numbers until one falls in the range [0,s_i-1]
442 randBigInt_(s_R,z,0);
443 if (greater(s_i,s_R))
444 break;
445 } //now s_R is in the range [0,s_i-1]
446 addInt_(s_R,1); //now s_R is in the range [1,s_i]
447 add_(s_R,s_i); //now s_R is in the range [s_i+1,2*s_i]
448
449 copy_(s_n,s_q);
450 mult_(s_n,s_R);
451 multInt_(s_n,2);
452 addInt_(s_n,1); //s_n=2*s_R*s_q+1
453
454 copy_(s_r2,s_R);
455 multInt_(s_r2,2); //s_r2=2*s_R
456
457 //check s_n for divisibility by small primes up to B
458 for (divisible=0,j=0; (j<primes.length) && (primes[j]<B); j++)
459 if (modInt(s_n,primes[j])==0) {
460 divisible=1;
461 break;
462 }
463
464 if (!divisible) //if it passes small primes check, then try a single Miller-Rabin base 2
465 if (!millerRabin(s_n,2)) //this line represents 75% of the total runtime for randTruePrime_
466 divisible=1;
467
468 if (!divisible) { //if it passes that test, continue checking s_n
469 addInt_(s_n,-3);
470 for (j=s_n.length-1;(s_n[j]==0) && (j>0); j--); //strip leading zeros
471 for (zz=0,w=s_n[j]; w; (w>>=1),zz++);
472 zz+=bpe*j; //zz=number of bits in s_n, ignoring leading zeros
473 for (;;) { //generate z-bit numbers until one falls in the range [0,s_n-1]
474 randBigInt_(s_a,zz,0);
475 if (greater(s_n,s_a))
476 break;
477 } //now s_a is in the range [0,s_n-1]
478 addInt_(s_n,3); //now s_a is in the range [0,s_n-4]
479 addInt_(s_a,2); //now s_a is in the range [2,s_n-2]
480 copy_(s_b,s_a);
481 copy_(s_n1,s_n);
482 addInt_(s_n1,-1);
483 powMod_(s_b,s_n1,s_n); //s_b=s_a^(s_n-1) modulo s_n
484 addInt_(s_b,-1);
485 if (isZero(s_b)) {
486 copy_(s_b,s_a);
487 powMod_(s_b,s_r2,s_n);
488 addInt_(s_b,-1);
489 copy_(s_aa,s_n);
490 copy_(s_d,s_b);
491 GCD_(s_d,s_n); //if s_b and s_n are relatively prime, then s_n is a prime
492 if (equalsInt(s_d,1)) {
493 copy_(ans,s_aa);
494 return; //if we've made it this far, then s_n is absolutely guaranteed to be prime
495 }
496 }
497 }
498 }
499}
500
501//set b to an n-bit random BigInt. If s=1, then nth bit (most significant bit) is set to 1.
502//array b must be big enough to hold the result. Must have n>=1
503function randBigInt_(b,n,s) {
504 var i,a;
505 for (i=0;i<b.length;i++)
506 b[i]=0;
507 a=Math.floor((n-1)/bpe)+1; //# array elements to hold the BigInt
508 for (i=0;i<a;i++) {
509 b[i]=Math.floor(Math.random()*(1<<(bpe-1)));
510 }
511 b[a-1] &= (2<<((n-1)%bpe))-1;
512 if (s)
513 b[a-1] |= (1<<((n-1)%bpe));
514}
515
516//set x to the greatest common divisor of x and y.
517//x,y are bigInts with the same number of elements. y is destroyed.
518function GCD_(x,y) {
519 var i,xp,yp,A,B,C,D,q,sing;
520 if (T.length!=x.length)
521 T=dup(x);
522
523 sing=1;
524 while (sing) { //while y has nonzero elements other than y[0]
525 sing=0;
526 for (i=1;i<y.length;i++) //check if y has nonzero elements other than 0
527 if (y[i]) {
528 sing=1;
529 break;
530 }
531 if (!sing) break; //quit when y all zero elements except possibly y[0]
532
533 for (i=x.length;!x[i] && i>=0;i--); //find most significant element of x
534 xp=x[i];
535 yp=y[i];
536 A=1; B=0; C=0; D=1;
537 while ((yp+C) && (yp+D)) {
538 q =Math.floor((xp+A)/(yp+C));
539 qp=Math.floor((xp+B)/(yp+D));
540 if (q!=qp)
541 break;
542 t= A-q*C; A=C; C=t; // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)
543 t= B-q*D; B=D; D=t;
544 t=xp-q*yp; xp=yp; yp=t;
545 }
546 if (B) {
547 copy_(T,x);
548 linComb_(x,y,A,B); //x=A*x+B*y
549 linComb_(y,T,D,C); //y=D*y+C*T
550 } else {
551 mod_(x,y);
552 copy_(T,x);
553 copy_(x,y);
554 copy_(y,T);
555 }
556 }
557 if (y[0]==0)
558 return;
559 t=modInt(x,y[0]);
560 copyInt_(x,y[0]);
561 y[0]=t;
562 while (y[0]) {
563 x[0]%=y[0];
564 t=x[0]; x[0]=y[0]; y[0]=t;
565 }
566}
567
568//do x=x**(-1) mod n, for bigInts x and n.
569//If no inverse exists, it sets x to zero and returns 0, else it returns 1.
570//The x array must be at least as large as the n array.
571function inverseMod_(x,n) {
572 var k=1+2*Math.max(x.length,n.length);
573
574 if(!(x[0]&1) && !(n[0]&1)) { //if both inputs are even, then inverse doesn't exist
575 copyInt_(x,0);
576 return 0;
577 }
578
579 if (eg_u.length!=k) {
580 eg_u=new Array(k);
581 eg_v=new Array(k);
582 eg_A=new Array(k);
583 eg_B=new Array(k);
584 eg_C=new Array(k);
585 eg_D=new Array(k);
586 }
587
588 copy_(eg_u,x);
589 copy_(eg_v,n);
590 copyInt_(eg_A,1);
591 copyInt_(eg_B,0);
592 copyInt_(eg_C,0);
593 copyInt_(eg_D,1);
594 for (;;) {
595 while(!(eg_u[0]&1)) { //while eg_u is even
596 halve_(eg_u);
597 if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if eg_A==eg_B==0 mod 2
598 halve_(eg_A);
599 halve_(eg_B);
600 } else {
601 add_(eg_A,n); halve_(eg_A);
602 sub_(eg_B,x); halve_(eg_B);
603 }
604 }
605
606 while (!(eg_v[0]&1)) { //while eg_v is even
607 halve_(eg_v);
608 if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if eg_C==eg_D==0 mod 2
609 halve_(eg_C);
610 halve_(eg_D);
611 } else {
612 add_(eg_C,n); halve_(eg_C);
613 sub_(eg_D,x); halve_(eg_D);
614 }
615 }
616
617 if (!greater(eg_v,eg_u)) { //eg_v <= eg_u
618 sub_(eg_u,eg_v);
619 sub_(eg_A,eg_C);
620 sub_(eg_B,eg_D);
621 } else { //eg_v > eg_u
622 sub_(eg_v,eg_u);
623 sub_(eg_C,eg_A);
624 sub_(eg_D,eg_B);
625 }
626
627 if (equalsInt(eg_u,0)) {
628 if (negative(eg_C)) //make sure answer is nonnegative
629 add_(eg_C,n);
630 copy_(x,eg_C);
631
632 if (!equalsInt(eg_v,1)) { //if GCD_(x,n)!=1, then there is no inverse
633 copyInt_(x,0);
634 return 0;
635 }
636 return 1;
637 }
638 }
639}
640
641//return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
642function inverseModInt_(x,n) {
643 var a=1,b=0,t;
644 for (;;) {
645 if (x==1) return a;
646 if (x==0) return 0;
647 b-=a*Math.floor(n/x);
648 n%=x;
649
650 if (n==1) return b; //to avoid negatives, change this b to n-b, and each -= to +=
651 if (n==0) return 0;
652 a-=b*Math.floor(x/n);
653 x%=n;
654 }
655}
656
657//Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:
658// v = GCD_(x,y) = a*x-b*y
659//The bigInts v, a, b, must have exactly as many elements as the larger of x and y.
660function eGCD_(x,y,v,a,b) {
661 var g=0;
662 var k=Math.max(x.length,y.length);
663 if (eg_u.length!=k) {
664 eg_u=new Array(k);
665 eg_A=new Array(k);
666 eg_B=new Array(k);
667 eg_C=new Array(k);
668 eg_D=new Array(k);
669 }
670 while(!(x[0]&1) && !(y[0]&1)) { //while x and y both even
671 halve_(x);
672 halve_(y);
673 g++;
674 }
675 copy_(eg_u,x);
676 copy_(v,y);
677 copyInt_(eg_A,1);
678 copyInt_(eg_B,0);
679 copyInt_(eg_C,0);
680 copyInt_(eg_D,1);
681 for (;;) {
682 while(!(eg_u[0]&1)) { //while u is even
683 halve_(eg_u);
684 if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if A==B==0 mod 2
685 halve_(eg_A);
686 halve_(eg_B);
687 } else {
688 add_(eg_A,y); halve_(eg_A);
689 sub_(eg_B,x); halve_(eg_B);
690 }
691 }
692
693 while (!(v[0]&1)) { //while v is even
694 halve_(v);
695 if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if C==D==0 mod 2
696 halve_(eg_C);
697 halve_(eg_D);
698 } else {
699 add_(eg_C,y); halve_(eg_C);
700 sub_(eg_D,x); halve_(eg_D);
701 }
702 }
703
704 if (!greater(v,eg_u)) { //v<=u
705 sub_(eg_u,v);
706 sub_(eg_A,eg_C);
707 sub_(eg_B,eg_D);
708 } else { //v>u
709 sub_(v,eg_u);
710 sub_(eg_C,eg_A);
711 sub_(eg_D,eg_B);
712 }
713 if (equalsInt(eg_u,0)) {
714 if (negative(eg_C)) { //make sure a (C)is nonnegative
715 add_(eg_C,y);
716 sub_(eg_D,x);
717 }
718 multInt_(eg_D,-1); ///make sure b (D) is nonnegative
719 copy_(a,eg_C);
720 copy_(b,eg_D);
721 leftShift_(v,g);
722 return;
723 }
724 }
725}
726
727
728//is bigInt x negative?
729function negative(x) {
730 return ((x[x.length-1]>>(bpe-1))&1);
731}
732
733
734//is (x << (shift*bpe)) > y?
735//x and y are nonnegative bigInts
736//shift is a nonnegative integer
737function greaterShift(x,y,shift) {
738 var kx=x.length, ky=y.length;
739 k=((kx+shift)<ky) ? (kx+shift) : ky;
740 for (i=ky-1-shift; i<kx && i>=0; i++)
741 if (x[i]>0)
742 return 1; //if there are nonzeros in x to the left of the first column of y, then x is bigger
743 for (i=kx-1+shift; i<ky; i++)
744 if (y[i]>0)
745 return 0; //if there are nonzeros in y to the left of the first column of x, then x is not bigger
746 for (i=k-1; i>=shift; i--)
747 if (x[i-shift]>y[i]) return 1;
748 else if (x[i-shift]<y[i]) return 0;
749 return 0;
750}
751
752//is x > y? (x and y both nonnegative)
753function greater(x,y) {
754 var i;
755 var k=(x.length<y.length) ? x.length : y.length;
756
757 for (i=x.length;i<y.length;i++)
758 if (y[i])
759 return 0; //y has more digits
760
761 for (i=y.length;i<x.length;i++)
762 if (x[i])
763 return 1; //x has more digits
764
765 for (i=k-1;i>=0;i--)
766 if (x[i]>y[i])
767 return 1;
768 else if (x[i]<y[i])
769 return 0;
770 return 0;
771}
772
773//divide_ x by y giving quotient q and remainder r. (q=floor(x/y), r=x mod y). All 4 are bigints.
774//x must have at least one leading zero element.
775//y must be nonzero.
776//q and r must be arrays that are exactly the same length as x.
777//the x array must have at least as many elements as y.
778function divide_(x,y,q,r) {
779 var kx, ky;
780 var i,j,y1,y2,c,a,b;
781 copy_(r,x);
782 for (ky=y.length;y[ky-1]==0;ky--); //kx,ky is number of elements in x,y, not including leading zeros
783 for (kx=r.length;r[kx-1]==0 && kx>ky;kx--);
784
785 //normalize: ensure the most significant element of y has its highest bit set
786 b=y[ky-1];
787 for (a=0; b; a++)
788 b>>=1;
789 a=bpe-a; //a is how many bits to shift so that the high order bit of y is leftmost in its array element
790 leftShift_(y,a); //multiply both by 1<<a now, then divide_ both by that at the end
791 leftShift_(r,a);
792
793 copyInt_(q,0); // q=0
794 while (!greaterShift(y,r,kx-ky)) { // while (leftShift_(y,kx-ky) <= r) {
795 subShift_(r,y,kx-ky); // r=r-leftShift_(y,kx-ky)
796 q[kx-ky]++; // q[kx-ky]++;
797 } // }
798
799 for (i=kx-1; i>=ky; i--) {
800 if (r[i]==y[ky-1])
801 q[i-ky]=mask;
802 else
803 q[i-ky]=Math.floor((r[i]*radix+r[i-1])/y[ky-1]);
804
805 //The following for(;;) loop is equivalent to the commented while loop,
806 //except that the uncommented version avoids overflow.
807 //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0
808 // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])
809 // q[i-ky]--;
810 for (;;) {
811 y2=(ky>1 ? y[ky-2] : 0)*q[i-ky];
812 c=y2>>bpe;
813 y2=y2 & mask;
814 y1=c+q[i-ky]*y[ky-1];
815 c=y1>>bpe;
816 y1=y1 & mask;
817
818 if (c==r[i] ? y1==r[i-1] ? y2>(i>1 ? r[i-2] : 0) : y1>r[i-1] : c>r[i])
819 q[i-ky]--;
820 else
821 break;
822 }
823
824 linCombShift_(r,y,-q[i-ky],i-ky); //r=r-q[i-ky]*leftShift_(y,i-ky)
825 if (negative(r)) {
826 addShift_(r,y,i-ky); //r=r+leftShift_(y,i-ky)
827 q[i-ky]--;
828 }
829 }
830
831 rightShift_(y,a); //undo the normalization step
832 rightShift_(r,a); //undo the normalization step
833}
834
835//do carries and borrows so each element of the bigInt x fits in bpe bits.
836function carry_(x) {
837 var i,k,c,b;
838 k=x.length;
839 c=0;
840 for (i=0;i<k;i++) {
841 c+=x[i];
842 b=0;
843 if (c<0) {
844 b=-(c>>bpe);
845 c+=b*radix;
846 }
847 x[i]=c & mask;
848 c=(c>>bpe)-b;
849 }
850}
851
852//return x mod n for bigInt x and integer n.
853function modInt(x,n) {
854 var i,c=0;
855 for (i=x.length-1; i>=0; i--)
856 c=(c*radix+x[i])%n;
857 return c;
858}
859
860//convert the integer t into a bigInt with at least the given number of bits.
861//the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)
862//Pad the array with leading zeros so that it has at least minSize elements.
863//There will always be at least one leading 0 element.
864function int2bigInt(t,bits,minSize) {
865 var i,k;
866 k=Math.ceil(bits/bpe)+1;
867 k=minSize>k ? minSize : k;
868 buff=new Array(k);
869 copyInt_(buff,t);
870 return buff;
871}
872
873//return the bigInt given a string representation in a given base.
874//Pad the array with leading zeros so that it has at least minSize elements.
875//If base=-1, then it reads in a space-separated list of array elements in decimal.
876//The array will always have at least one leading zero, unless base=-1.
877function str2bigInt(s,base,minSize) {
878 var d, i, j, x, y, kk;
879 var k=s.length;
880 if (base==-1) { //comma-separated list of array elements in decimal
881 x=new Array(0);
882 for (;;) {
883 y=new Array(x.length+1);
884 for (i=0;i<x.length;i++)
885 y[i+1]=x[i];
886 y[0]=parseInt(s,10);
887 x=y;
888 d=s.indexOf(',',0);
889 if (d<1)
890 break;
891 s=s.substring(d+1);
892 if (s.length==0)
893 break;
894 }
895 if (x.length<minSize) {
896 y=new Array(minSize);
897 copy_(y,x);
898 return y;
899 }
900 return x;
901 }
902
903 x=int2bigInt(0,base*k,0);
904 for (i=0;i<k;i++) {
905 d=digitsStr.indexOf(s.substring(i,i+1),0);
906 if (base<=36 && d>=36) //convert lowercase to uppercase if base<=36
907 d-=26;
908 if (d<base && d>=0) { //ignore illegal characters
909 multInt_(x,base);
910 addInt_(x,d);
911 }
912 }
913
914 for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros
915 k=minSize>k+1 ? minSize : k+1;
916 y=new Array(k);
917 kk=k<x.length ? k : x.length;
918 for (i=0;i<kk;i++)
919 y[i]=x[i];
920 for (;i<k;i++)
921 y[i]=0;
922 return y;
923}
924
925//is bigint x equal to integer y?
926//y must have less than bpe bits
927function equalsInt(x,y) {
928 var i;
929 if (x[0]!=y)
930 return 0;
931 for (i=1;i<x.length;i++)
932 if (x[i])
933 return 0;
934 return 1;
935}
936
937//are bigints x and y equal?
938//this works even if x and y are different lengths and have arbitrarily many leading zeros
939function equals(x,y) {
940 var i;
941 var k=x.length<y.length ? x.length : y.length;
942 for (i=0;i<k;i++)
943 if (x[i]!=y[i])
944 return 0;
945 if (x.length>y.length) {
946 for (;i<x.length;i++)
947 if (x[i])
948 return 0;
949 } else {
950 for (;i<y.length;i++)
951 if (y[i])
952 return 0;
953 }
954 return 1;
955}
956
957//is the bigInt x equal to zero?
958function isZero(x) {
959 var i;
960 for (i=0;i<x.length;i++)
961 if (x[i])
962 return 0;
963 return 1;
964}
965
966//convert a bigInt into a string in a given base, from base 2 up to base 95.
967//Base -1 prints the contents of the array representing the number.
968function bigInt2str(x,base) {
969 var i,t,s="";
970
971 if (s6.length!=x.length)
972 s6=dup(x);
973 else
974 copy_(s6,x);
975
976 if (base==-1) { //return the list of array contents
977 for (i=x.length-1;i>0;i--)
978 s+=x[i]+',';
979 s+=x[0];
980 }
981 else { //return it in the given base
982 while (!isZero(s6)) {
983 t=divInt_(s6,base); //t=s6 % base; s6=floor(s6/base);
984 s=digitsStr.substring(t,t+1)+s;
985 }
986 }
987 if (s.length==0)
988 s="0";
989 return s;
990}
991
992//returns a duplicate of bigInt x
993function dup(x) {
994 var i;
995 buff=new Array(x.length);
996 copy_(buff,x);
997 return buff;
998}
999
1000//do x=y on bigInts x and y. x must be an array at least as big as y (not counting the leading zeros in y).
1001function copy_(x,y) {
1002 var i;
1003 var k=x.length<y.length ? x.length : y.length;
1004 for (i=0;i<k;i++)
1005 x[i]=y[i];
1006 for (i=k;i<x.length;i++)
1007 x[i]=0;
1008}
1009
1010//do x=y on bigInt x and integer y.
1011function copyInt_(x,n) {
1012 var i,c;
1013 for (c=n,i=0;i<x.length;i++) {
1014 x[i]=c & mask;
1015 c>>=bpe;
1016 }
1017}
1018
1019//do x=x+n where x is a bigInt and n is an integer.
1020//x must be large enough to hold the result.
1021function addInt_(x,n) {
1022 var i,k,c,b;
1023 x[0]+=n;
1024 k=x.length;
1025 c=0;
1026 for (i=0;i<k;i++) {
1027 c+=x[i];
1028 b=0;
1029 if (c<0) {
1030 b=-(c>>bpe);
1031 c+=b*radix;
1032 }
1033 x[i]=c & mask;
1034 c=(c>>bpe)-b;
1035 if (!c) return; //stop carrying as soon as the carry_ is zero
1036 }
1037}
1038
1039//right shift bigInt x by n bits. 0 <= n < bpe.
1040function rightShift_(x,n) {
1041 var i;
1042 var k=Math.floor(n/bpe);
1043 if (k) {
1044 for (i=0;i<x.length-k;i++) //right shift x by k elements
1045 x[i]=x[i+k];
1046 for (;i<x.length;i++)
1047 x[i]=0;
1048 n%=bpe;
1049 }
1050 for (i=0;i<x.length-1;i++) {
1051 x[i]=mask & ((x[i+1]<<(bpe-n)) | (x[i]>>n));
1052 }
1053 x[i]>>=n;
1054}
1055
1056//do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
1057function halve_(x) {
1058 var i;
1059 for (i=0;i<x.length-1;i++) {
1060 x[i]=mask & ((x[i+1]<<(bpe-1)) | (x[i]>>1));
1061 }
1062 x[i]=(x[i]>>1) | (x[i] & (radix>>1)); //most significant bit stays the same
1063}
1064
1065//left shift bigInt x by n bits.
1066function leftShift_(x,n) {
1067 var i;
1068 var k=Math.floor(n/bpe);
1069 if (k) {
1070 for (i=x.length; i>=k; i--) //left shift x by k elements
1071 x[i]=x[i-k];
1072 for (;i>=0;i--)
1073 x[i]=0;
1074 n%=bpe;
1075 }
1076 if (!n)
1077 return;
1078 for (i=x.length-1;i>0;i--) {
1079 x[i]=mask & ((x[i]<<n) | (x[i-1]>>(bpe-n)));
1080 }
1081 x[i]=mask & (x[i]<<n);
1082}
1083
1084//do x=x*n where x is a bigInt and n is an integer.
1085//x must be large enough to hold the result.
1086function multInt_(x,n) {
1087 var i,k,c,b;
1088 if (!n)
1089 return;
1090 k=x.length;
1091 c=0;
1092 for (i=0;i<k;i++) {
1093 c+=x[i]*n;
1094 b=0;
1095 if (c<0) {
1096 b=-(c>>bpe);
1097 c+=b*radix;
1098 }
1099 x[i]=c & mask;
1100 c=(c>>bpe)-b;
1101 }
1102}
1103
1104//do x=floor(x/n) for bigInt x and integer n, and return the remainder
1105function divInt_(x,n) {
1106 var i,r=0,s;
1107 for (i=x.length-1;i>=0;i--) {
1108 s=r*radix+x[i];
1109 x[i]=Math.floor(s/n);
1110 r=s%n;
1111 }
1112 return r;
1113}
1114
1115//do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.
1116//x must be large enough to hold the answer.
1117function linComb_(x,y,a,b) {
1118 var i,c,k,kk;
1119 k=x.length<y.length ? x.length : y.length;
1120 kk=x.length;
1121 for (c=0,i=0;i<k;i++) {
1122 c+=a*x[i]+b*y[i];
1123 x[i]=c & mask;
1124 c>>=bpe;
1125 }
1126 for (i=k;i<kk;i++) {
1127 c+=a*x[i];
1128 x[i]=c & mask;
1129 c>>=bpe;
1130 }
1131}
1132
1133//do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.
1134//x must be large enough to hold the answer.
1135function linCombShift_(x,y,b,ys) {
1136 var i,c,k,kk;
1137 k=x.length<ys+y.length ? x.length : ys+y.length;
1138 kk=x.length;
1139 for (c=0,i=ys;i<k;i++) {
1140 c+=x[i]+b*y[i-ys];
1141 x[i]=c & mask;
1142 c>>=bpe;
1143 }
1144 for (i=k;c && i<kk;i++) {
1145 c+=x[i];
1146 x[i]=c & mask;
1147 c>>=bpe;
1148 }
1149}
1150
1151//do x=x+(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.
1152//x must be large enough to hold the answer.
1153function addShift_(x,y,ys) {
1154 var i,c,k,kk;
1155 k=x.length<ys+y.length ? x.length : ys+y.length;
1156 kk=x.length;
1157 for (c=0,i=ys;i<k;i++) {
1158 c+=x[i]+y[i-ys];
1159 x[i]=c & mask;
1160 c>>=bpe;
1161 }
1162 for (i=k;c && i<kk;i++) {
1163 c+=x[i];
1164 x[i]=c & mask;
1165 c>>=bpe;
1166 }
1167}
1168
1169//do x=x-(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.
1170//x must be large enough to hold the answer.
1171function subShift_(x,y,ys) {
1172 var i,c,k,kk;
1173 k=x.length<ys+y.length ? x.length : ys+y.length;
1174 kk=x.length;
1175 for (c=0,i=ys;i<k;i++) {
1176 c+=x[i]-y[i-ys];
1177 x[i]=c & mask;
1178 c>>=bpe;
1179 }
1180 for (i=k;c && i<kk;i++) {
1181 c+=x[i];
1182 x[i]=c & mask;
1183 c>>=bpe;
1184 }
1185}
1186
1187//do x=x-y for bigInts x and y.
1188//x must be large enough to hold the answer.
1189//negative answers will be 2s complement
1190function sub_(x,y) {
1191 var i,c,k,kk;
1192 k=x.length<y.length ? x.length : y.length;
1193 for (c=0,i=0;i<k;i++) {
1194 c+=x[i]-y[i];
1195 x[i]=c & mask;
1196 c>>=bpe;
1197 }
1198 for (i=k;c && i<x.length;i++) {
1199 c+=x[i];
1200 x[i]=c & mask;
1201 c>>=bpe;
1202 }
1203}
1204
1205//do x=x+y for bigInts x and y.
1206//x must be large enough to hold the answer.
1207function add_(x,y) {
1208 var i,c,k,kk;
1209 k=x.length<y.length ? x.length : y.length;
1210 for (c=0,i=0;i<k;i++) {
1211 c+=x[i]+y[i];
1212 x[i]=c & mask;
1213 c>>=bpe;
1214 }
1215 for (i=k;c && i<x.length;i++) {
1216 c+=x[i];
1217 x[i]=c & mask;
1218 c>>=bpe;
1219 }
1220}
1221
1222//do x=x*y for bigInts x and y. This is faster when y<x.
1223function mult_(x,y) {
1224 var i;
1225 if (ss.length!=2*x.length)
1226 ss=new Array(2*x.length);
1227 copyInt_(ss,0);
1228 for (i=0;i<y.length;i++)
1229 if (y[i])
1230 linCombShift_(ss,x,y[i],i); //ss=1*ss+y[i]*(x<<(i*bpe))
1231 copy_(x,ss);
1232}
1233
1234//do x=x mod n for bigInts x and n.
1235function mod_(x,n) {
1236 if (s4.length!=x.length)
1237 s4=dup(x);
1238 else
1239 copy_(s4,x);
1240 if (s5.length!=x.length)
1241 s5=dup(x);
1242 divide_(s4,n,s5,x); //x = remainder of s4 / n
1243}
1244
1245//do x=x*y mod n for bigInts x,y,n.
1246//for greater speed, let y<x.
1247function multMod_(x,y,n) {
1248 var i;
1249 if (s0.length!=2*x.length)
1250 s0=new Array(2*x.length);
1251 copyInt_(s0,0);
1252 for (i=0;i<y.length;i++)
1253 if (y[i])
1254 linCombShift_(s0,x,y[i],i); //s0=1*s0+y[i]*(x<<(i*bpe))
1255 mod_(s0,n);
1256 copy_(x,s0);
1257}
1258
1259//do x=x*x mod n for bigInts x,n.
1260function squareMod_(x,n) {
1261 var i,j,d,c,kx,kn,k;
1262 for (kx=x.length; kx>0 && !x[kx-1]; kx--); //ignore leading zeros in x
1263 k=kx>n.length ? 2*kx : 2*n.length; //k=# elements in the product, which is twice the elements in the larger of x and n
1264 if (s0.length!=k)
1265 s0=new Array(k);
1266 copyInt_(s0,0);
1267 for (i=0;i<kx;i++) {
1268 c=s0[2*i]+x[i]*x[i];
1269 s0[2*i]=c & mask;
1270 c>>=bpe;
1271 for (j=i+1;j<kx;j++) {
1272 c=s0[i+j]+2*x[i]*x[j]+c;
1273 s0[i+j]=(c & mask);
1274 c>>=bpe;
1275 }
1276 s0[i+kx]=c;
1277 }
1278 mod_(s0,n);
1279 copy_(x,s0);
1280}
1281
1282//return x with exactly k leading zero elements
1283function trim(x,k) {
1284 var i,y;
1285 for (i=x.length; i>0 && !x[i-1]; i--);
1286 y=new Array(i+k);
1287 copy_(y,x);
1288 return y;
1289}
1290
1291//do x=x**y mod n, where x,y,n are bigInts and ** is exponentiation. 0**0=1.
1292//this is faster when n is odd. x usually needs to have as many elements as n.
1293function powMod_(x,y,n) {
1294 var k1,k2,kn,np;
1295 if(s7.length!=n.length)
1296 s7=dup(n);
1297
1298 //for even modulus, use a simple square-and-multiply algorithm,
1299 //rather than using the more complex Montgomery algorithm.
1300 if ((n[0]&1)==0) {
1301 copy_(s7,x);
1302 copyInt_(x,1);
1303 while(!equalsInt(y,0)) {
1304 if (y[0]&1)
1305 multMod_(x,s7,n);
1306 divInt_(y,2);
1307 squareMod_(s7,n);
1308 }
1309 return;
1310 }
1311
1312 //calculate np from n for the Montgomery multiplications
1313 copyInt_(s7,0);
1314 for (kn=n.length;kn>0 && !n[kn-1];kn--);
1315 np=radix-inverseModInt_(modInt(n,radix),radix);
1316 s7[kn]=1;
1317 multMod_(x ,s7,n); // x = x * 2**(kn*bp) mod n
1318
1319 if (s3.length!=x.length)
1320 s3=dup(x);
1321 else
1322 copy_(s3,x);
1323
1324 for (k1=y.length-1;k1>0 & !y[k1]; k1--); //k1=first nonzero element of y
1325 if (y[k1]==0) { //anything to the 0th power is 1
1326 copyInt_(x,1);
1327 return;
1328 }
1329 for (k2=1<<(bpe-1);k2 && !(y[k1] & k2); k2>>=1); //k2=position of first 1 bit in y[k1]
1330 for (;;) {
1331 if (!(k2>>=1)) { //look at next bit of y
1332 k1--;
1333 if (k1<0) {
1334 mont_(x,one,n,np);
1335 return;
1336 }
1337 k2=1<<(bpe-1);
1338 }
1339 mont_(x,x,n,np);
1340
1341 if (k2 & y[k1]) //if next bit is a 1
1342 mont_(x,s3,n,np);
1343 }
1344}
1345
1346//do x=x*y*Ri mod n for bigInts x,y,n,
1347// where Ri = 2**(-kn*bpe) mod n, and kn is the
1348// number of elements in the n array, not
1349// counting leading zeros.
1350//x must be large enough to hold the answer.
1351//It's OK if x and y are the same variable.
1352//must have:
1353// x,y < n
1354// n is odd
1355// np = -(n^(-1)) mod radix
1356function mont_(x,y,n,np) {
1357 var i,j,c,ui,t;
1358 var kn=n.length;
1359 var ky=y.length;
1360
1361 if (sa.length!=kn)
1362 sa=new Array(kn);
1363
1364 for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n
1365 //this function sometimes gives wrong answers when the next line is uncommented
1366 //for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y
1367
1368 copyInt_(sa,0);
1369
1370 //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large keys
1371 for (i=0; i<kn; i++) {
1372 t=sa[0]+x[i]*y[0];
1373 ui=((t & mask) * np) & mask; //the inner "& mask" is needed on Macintosh MSIE, but not windows MSIE
1374 c=(t+ui*n[0]) >> bpe;
1375 t=x[i];
1376
1377 //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe
1378 for (j=1;j<ky;j++) {
1379 c+=sa[j]+t*y[j]+ui*n[j];
1380 sa[j-1]=c & mask;
1381 c>>=bpe;
1382 }
1383 for (;j<kn;j++) {
1384 c+=sa[j]+ui*n[j];
1385 sa[j-1]=c & mask;
1386 c>>=bpe;
1387 }
1388 sa[j-1]=c & mask;
1389 }
1390
1391 if (!greater(n,sa))
1392 sub_(sa,n);
1393 copy_(x,sa);
1394}
1395
1396
1397
1398
1399//#############################################################################
1400//#############################################################################
1401//#############################################################################
1402//#############################################################################
1403//#############################################################################
1404//#############################################################################
1405//#############################################################################
1406
1407
1408
1409
1410
1411//#############################################################################
1412
1413Clipperz.Crypto.BigInt = function (aValue, aBase) {
1414 varbase;
1415 varvalue;
1416
1417 if (typeof(aValue) == 'object') {
1418 this._internalValue = aValue;
1419 } else {
1420 if (typeof(aValue) == 'undefined') {
1421 value = "0";
1422 } else {
1423 value = aValue + "";
1424 }
1425
1426 if (typeof(aBase) == 'undefined') {
1427 base = 10;
1428 } else {
1429 base = aBase;
1430 }
1431
1432 this._internalValue = str2bigInt(value, base, 1, 1);
1433 }
1434
1435 return this;
1436}
1437
1438//=============================================================================
1439
1440MochiKit.Base.update(Clipperz.Crypto.BigInt.prototype, {
1441
1442 'clone': function() {
1443 return new Clipperz.Crypto.BigInt(this.internalValue());
1444 },
1445
1446 //-------------------------------------------------------------------------
1447
1448 'internalValue': function () {
1449 return this._internalValue;
1450 },
1451
1452 //-------------------------------------------------------------------------
1453
1454 'isBigInt': true,
1455
1456 //-------------------------------------------------------------------------
1457
1458 'toString': function(aBase) {
1459 return this.asString(aBase);
1460 },
1461
1462 //-------------------------------------------------------------------------
1463
1464 'asString': function (aBase, minimumLength) {
1465 varresult;
1466 varbase;
1467
1468 if (typeof(aBase) == 'undefined') {
1469 base = 10;
1470 } else {
1471 base = aBase;
1472 }
1473
1474 result = bigInt2str(this.internalValue(), base).toLowerCase();
1475
1476 if ((typeof(minimumLength) != 'undefined') && (result.length < minimumLength)) {
1477 var i, c;
1478 //MochiKit.Logging.logDebug(">>> FIXING BigInt.asString length issue")
1479 c = (minimumLength - result.length);
1480 for (i=0; i<c; i++) {
1481 result = '0' + result;
1482 }
1483 }
1484
1485 return result;
1486 },
1487
1488 //-------------------------------------------------------------------------
1489
1490 'asByteArray': function() {
1491 return new Clipperz.ByteArray("0x" + this.asString(16), 16);
1492 },
1493
1494 //-------------------------------------------------------------------------
1495
1496 'equals': function (aValue) {
1497 var result;
1498
1499 if (aValue.isBigInt) {
1500 result = equals(this.internalValue(), aValue.internalValue());
1501 } else if (typeof(aValue) == "number") {
1502 result = equalsInt(this.internalValue(), aValue);
1503 } else {
1504 throw Clipperz.Crypt.BigInt.exception.UnknownType;
1505 }
1506
1507 return result;
1508 },
1509
1510 //-------------------------------------------------------------------------
1511
1512 'compare': function(aValue) {
1513/*
1514 var result;
1515 var thisAsString;
1516 var aValueAsString;
1517
1518 thisAsString = this.asString(10);
1519 aValueAsString = aValue.asString(10);
1520
1521 result = MochiKit.Base.compare(thisAsString.length, aValueAsString.length);
1522 if (result == 0) {
1523 result = MochiKit.Base.compare(thisAsString, aValueAsString);
1524 }
1525
1526 return result;
1527*/
1528 var result;
1529
1530 if (equals(this.internalValue(), aValue.internalValue())) {
1531 result = 0;
1532 } else if (greater(this.internalValue(), aValue.internalValue())) {
1533 result = 1;
1534 } else {
1535 result = -1;
1536 }
1537
1538 return result;
1539 },
1540
1541 //-------------------------------------------------------------------------
1542
1543 'add': function (aValue) {
1544 var result;
1545
1546 if (aValue.isBigInt) {
1547 result = add(this.internalValue(), aValue.internalValue());
1548 } else {
1549 result = addInt(this.internalValue(), aValue);
1550 }
1551
1552 return new Clipperz.Crypto.BigInt(result);
1553 },
1554
1555 //-------------------------------------------------------------------------
1556
1557 'subtract': function (aValue) {
1558 var result;
1559 var value;
1560
1561 if (aValue.isBigInt) {
1562 value = aValue;
1563 } else {
1564 value = new Clipperz.Crypto.BigInt(aValue);
1565 }
1566
1567 result = sub(this.internalValue(), value.internalValue());
1568
1569 return new Clipperz.Crypto.BigInt(result);
1570 },
1571
1572 //-------------------------------------------------------------------------
1573
1574 'multiply': function (aValue, aModule) {
1575 var result;
1576 var value;
1577
1578 if (aValue.isBigInt) {
1579 value = aValue;
1580 } else {
1581 value = new Clipperz.Crypto.BigInt(aValue);
1582 }
1583
1584 if (typeof(aModule) == 'undefined') {
1585 result = mult(this.internalValue(), value.internalValue());
1586 } else {
1587 if (greater(this.internalValue(), value.internalValue())) {
1588 result = multMod(this.internalValue(), value.internalValue(), aModule);
1589 } else {
1590 result = multMod(value.internalValue(), this.internalValue(), aModule);
1591 }
1592 }
1593
1594 return new Clipperz.Crypto.BigInt(result);
1595 },
1596
1597 //-------------------------------------------------------------------------
1598
1599 'module': function (aModule) {
1600 varresult;
1601 var module;
1602
1603 if (aModule.isBigInt) {
1604 module = aModule;
1605 } else {
1606 module = new Clipperz.Crypto.BigInt(aModule);
1607 }
1608
1609 result = mod(this.internalValue(), module.internalValue());
1610
1611 return new Clipperz.Crypto.BigInt(result);
1612 },
1613
1614 //-------------------------------------------------------------------------
1615
1616 'powerModule': function(aValue, aModule) {
1617 varresult;
1618 varvalue;
1619 var module;
1620
1621 if (aValue.isBigInt) {
1622 value = aValue;
1623 } else {
1624 value = new Clipperz.Crypto.BigInt(aValue);
1625 }
1626
1627 if (aModule.isBigInt) {
1628 module = aModule;
1629 } else {
1630 module = new Clipperz.Crypto.BigInt(aModule);
1631 }
1632
1633 if (aValue == -1) {
1634 result = inverseMod(this.internalValue(), module.internalValue());
1635 } else {
1636 result = powMod(this.internalValue(), value.internalValue(), module.internalValue());
1637 }
1638
1639 return new Clipperz.Crypto.BigInt(result);
1640 },
1641
1642 //-------------------------------------------------------------------------
1643
1644 'xor': function(aValue) {
1645 var result;
1646 varthisByteArray;
1647 var aValueByteArray;
1648 var xorArray;
1649
1650 thisByteArray = new Clipperz.ByteArray("0x" + this.asString(16), 16);
1651 aValueByteArray = new Clipperz.ByteArray("0x" + aValue.asString(16), 16);
1652 xorArray = thisByteArray.xorMergeWithBlock(aValueByteArray, 'right');
1653 result = new Clipperz.Crypto.BigInt(xorArray.toHexString(), 16);
1654
1655 return result;
1656 },
1657
1658 //-------------------------------------------------------------------------
1659
1660 'shiftLeft': function(aNumberOfBitsToShift) {
1661 var result;
1662 var internalResult;
1663 var wholeByteToShift;
1664 var bitsLeftToShift;
1665
1666 wholeByteToShift = Math.floor(aNumberOfBitsToShift / 8);
1667 bitsLeftToShift = aNumberOfBitsToShift % 8;
1668
1669 if (wholeByteToShift == 0) {
1670 internalResult = this.internalValue();
1671 } else {
1672 var hexValue;
1673 var i,c;
1674
1675 hexValue = this.asString(16);
1676 c = wholeByteToShift;
1677 for (i=0; i<c; i++) {
1678 hexValue += "00";
1679 }
1680 internalResult = str2bigInt(hexValue, 16, 1, 1);
1681 }
1682
1683 if (bitsLeftToShift > 0) {
1684 leftShift_(internalResult, bitsLeftToShift);
1685 }
1686 result = new Clipperz.Crypto.BigInt(internalResult);
1687
1688 return result;
1689 },
1690
1691 //-------------------------------------------------------------------------
1692
1693 'bitSize': function() {
1694 return bitSize(this.internalValue());
1695 },
1696
1697 //-------------------------------------------------------------------------
1698
1699 'isBitSet': function(aBitPosition) {
1700 var result;
1701
1702 if (this.asByteArray().bitAtIndex(aBitPosition) == 0) {
1703 result = false;
1704 } else {
1705 result = true;
1706 };
1707
1708 return result;
1709 },
1710
1711 //-------------------------------------------------------------------------
1712 __syntaxFix__: "syntax fix"
1713
1714});
1715
1716//#############################################################################
1717
1718Clipperz.Crypto.BigInt.randomPrime = function(aBitSize) {
1719 return new Clipperz.Crypto.BigInt(randTruePrime(aBitSize));
1720}
1721
1722//#############################################################################
1723//#############################################################################
1724
1725Clipperz.Crypto.BigInt.ZERO = new Clipperz.Crypto.BigInt(0);
1726
1727//#############################################################################
1728
1729Clipperz.Crypto.BigInt.equals = function(a, b) {
1730 return a.equals(b);
1731}
1732
1733Clipperz.Crypto.BigInt.add = function(a, b) {
1734 return a.add(b);
1735}
1736
1737Clipperz.Crypto.BigInt.subtract = function(a, b) {
1738 return a.subtract(b);
1739}
1740
1741Clipperz.Crypto.BigInt.multiply = function(a, b, module) {
1742 return a.multiply(b, module);
1743}
1744
1745Clipperz.Crypto.BigInt.module = function(a, module) {
1746 return a.module(module);
1747}
1748
1749Clipperz.Crypto.BigInt.powerModule = function(a, b, module) {
1750 return a.powerModule(b, module);
1751}
1752
1753Clipperz.Crypto.BigInt.exception = {
1754 UnknownType: new MochiKit.Base.NamedError("Clipperz.Crypto.BigInt.exception.UnknownType")
1755}
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/BigInt_scoped.js b/frontend/gamma/js/ClipperzCryptoLibrary/BigInt_scoped.js
new file mode 100644
index 0000000..bc60330
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/BigInt_scoped.js
@@ -0,0 +1,1644 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
26
27if (typeof(Leemon) == 'undefined') { Leemon = {}; }
28if (typeof(Baird.Crypto) == 'undefined') { Baird.Crypto = {}; }
29if (typeof(Baird.Crypto.BigInt) == 'undefined') { Baird.Crypto.BigInt = {}; }
30
31
32//#############################################################################
33 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js
34//#############################################################################
35
36////////////////////////////////////////////////////////////////////////////////////////
37// Big Integer Library v. 5.0
38// Created 2000, last modified 2006
39// Leemon Baird
40// www.leemon.com
41//
42// This file is public domain. You can use it for any purpose without restriction.
43// I do not guarantee that it is correct, so use it at your own risk. If you use
44// it for something interesting, I'd appreciate hearing about it. If you find
45// any bugs or make any improvements, I'd appreciate hearing about those too.
46// It would also be nice if my name and address were left in the comments.
47// But none of that is required.
48//
49// This code defines a bigInt library for arbitrary-precision integers.
50// A bigInt is an array of integers storing the value in chunks of bpe bits,
51// little endian (buff[0] is the least significant word).
52// Negative bigInts are stored two's complement.
53// Some functions assume their parameters have at least one leading zero element.
54// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow,
55// so the caller must make sure overflow won't happen.
56// For each function where a parameter is modified, that same
57// variable must not be used as another argument too.
58// So, you cannot square x by doing multMod_(x,x,n).
59// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n).
60//
61// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.
62// For most functions, if it needs a BigInt as a local variable it will actually use
63// a global, and will only allocate to it when it's not the right size. This ensures
64// that when a function is called repeatedly with same-sized parameters, it only allocates
65// memory on the first call.
66//
67// Note that for cryptographic purposes, the calls to Math.random() must
68// be replaced with calls to a better pseudorandom number generator.
69//
70// In the following, "bigInt" means a bigInt with at least one leading zero element,
71// and "integer" means a nonnegative integer less than radix. In some cases, integer
72// can be negative. Negative bigInts are 2s complement.
73//
74// The following functions do not modify their inputs, but dynamically allocate memory every time they are called:
75//
76// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95
77// function dup(x) //returns a copy of bigInt x
78// function findPrimes(n) //return array of all primes less than integer n
79// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements
80// function str2bigInt(s,b,n,m) //convert string s in base b to a bigInt with at least n bits and m array elements
81// function trim(x,k) //return a copy of x with exactly k leading zero elements
82//
83// The following functions do not modify their inputs, so there is never a problem with the result being too big:
84//
85// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros
86// function equals(x,y) //is the bigInt x equal to the bigint y?
87// function equalsInt(x,y) //is bigint x equal to integer y?
88// function greater(x,y) //is x>y? (x and y are nonnegative bigInts)
89// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?
90// function isZero(x) //is the bigInt x equal to zero?
91// function millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime (as opposed to definitely composite)?
92// function modInt(x,n) //return x mod n for bigInt x and integer n.
93// function negative(x) //is bigInt x negative?
94//
95// The following functions do not modify their inputs, but allocate memory and call functions with underscores
96//
97// function add(x,y) //return (x+y) for bigInts x and y.
98// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.
99// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed
100// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
101// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.
102// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.
103// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
104// function powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
105// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm.
106// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement
107//
108// The following functions write a bigInt result to one of the parameters, but
109// the result is never bigger than the original, so there can't be overflow problems:
110//
111// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder
112// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed).
113// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
114// function mod_(x,n) //do x=x mod n for bigInts x and n.
115// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe.
116//
117// The following functions write a bigInt result to one of the parameters. The caller is responsible for
118// ensuring it is large enough to hold the result.
119//
120// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer
121// function add_(x,y) //do x=x+y for bigInts x and y
122// function addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))
123// function copy_(x,y) //do x=y on bigInts x and y
124// function copyInt_(x,n) //do x=n on bigInt x and integer n
125// function carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.
126// function divide_(x,y,q,r) //divide_ x by y giving quotient q and remainder r
127// function eGCD_(x,y,d,a,b) //sets a,b,d to positive big integers such that d = GCD_(x,y) = a*x-b*y
128// function inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist
129// function inverseModInt_(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
130// function leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.
131// function linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b
132// function linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys
133// function mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)
134// function mult_(x,y) //do x=x*y for bigInts x and y.
135// function multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.
136// function multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.
137// function powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.
138// function randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.
139// function randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.
140// function squareMod_(x,n) //do x=x*x mod n for bigInts x,n
141// function sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.
142// function subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.
143//
144// The following functions are based on algorithms from the _Handbook of Applied Cryptography_
145// powMod_() = algorithm 14.94, Montgomery exponentiation
146// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_
147// GCD_() = algorothm 14.57, Lehmer's algorithm
148// mont_() = algorithm 14.36, Montgomery multiplication
149// divide_() = algorithm 14.20 Multiple-precision division
150// squareMod_() = algorithm 14.16 Multiple-precision squaring
151// randTruePrime_() = algorithm 4.62, Maurer's algorithm
152// millerRabin() = algorithm 4.24, Miller-Rabin algorithm
153//
154// Profiling shows:
155// randTruePrime_() spends:
156// 10% of its time in calls to powMod_()
157// 85% of its time in calls to millerRabin()
158// millerRabin() spends:
159// 99% of its time in calls to powMod_() (always with a base of 2)
160// powMod_() spends:
161// 94% of its time in calls to mont_() (almost always with x==y)
162//
163// This suggests there are several ways to speed up this library slightly:
164// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)
165// -- this should especially focus on being fast when raising 2 to a power mod n
166// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test
167// - tune the parameters in randTruePrime_(), including c, m, and recLimit
168// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking
169// within the loop when all the parameters are the same length.
170//
171// There are several ideas that look like they wouldn't help much at all:
172// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)
173// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32)
174// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square
175// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that
176// method would be slower. This is unfortunate because the code currently spends almost all of its time
177// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring
178// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded
179// sentences that seem to imply it's faster to do a non-modular square followed by a single
180// Montgomery reduction, but that's obviously wrong.
181////////////////////////////////////////////////////////////////////////////////////////
182
183//
184 //The whole library has been moved into the Baird.Crypto.BigInt scope by Giulio Cesare Solaroli <giulio.cesare@clipperz.com>
185//
186Baird.Crypto.BigInt.VERSION = "5.0";
187Baird.Crypto.BigInt.NAME = "Baird.Crypto.BigInt";
188
189MochiKit.Base.update(Baird.Crypto.BigInt, {
190 //globals
191 'bpe': 0, //bits stored per array element
192 'mask': 0, //AND this with an array element to chop it down to bpe bits
193 'radix': Baird.Crypto.BigInt.mask + 1,//equals 2^bpe. A single 1 bit to the left of the last bit of mask.
194
195 //the digits for converting to different bases
196 'digitsStr': '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-',
197
198//initialize the global variables
199for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform
200bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt
201mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits
202radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask
203one=int2bigInt(1,1,1); //constant used in powMod_()
204
205//the following global variables are scratchpad memory to
206//reduce dynamic memory allocation in the inner loop
207t=new Array(0);
208ss=t; //used in mult_()
209s0=t; //used in multMod_(), squareMod_()
210s1=t; //used in powMod_(), multMod_(), squareMod_()
211s2=t; //used in powMod_(), multMod_()
212s3=t; //used in powMod_()
213s4=t; s5=t; //used in mod_()
214s6=t; //used in bigInt2str()
215s7=t; //used in powMod_()
216T=t; //used in GCD_()
217sa=t; //used in mont_()
218mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin()
219eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_()
220md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_()
221
222primes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t;
223 s_a=t; s_r2=t; s_n=t; s_b=t; s_d=t; s_x1=t; s_x2=t, s_aa=t; //used in randTruePrime_()
224
225////////////////////////////////////////////////////////////////////////////////////////
226
227 //return array of all primes less than integer n
228 'findPrimes': function(n) {
229 var i,s,p,ans;
230 s=new Array(n);
231 for (i=0;i<n;i++)
232 s[i]=0;
233 s[0]=2;
234 p=0; //first p elements of s are primes, the rest are a sieve
235 for(;s[p]<n;) { //s[p] is the pth prime
236 for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p]
237 s[i]=1;
238 p++;
239 s[p]=s[p-1]+1;
240 for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)
241 }
242 ans=new Array(p);
243 for(i=0;i<p;i++)
244 ans[i]=s[i];
245 return ans;
246 },
247
248 //does a single round of Miller-Rabin base b consider x to be a possible prime?
249 //x is a bigInt, and b is an integer
250 'millerRabin': function(x,b) {
251 var i,j,k,s;
252
253 if (mr_x1.length!=x.length) {
254 mr_x1=dup(x);
255 mr_r=dup(x);
256 mr_a=dup(x);
257 }
258
259 copyInt_(mr_a,b);
260 copy_(mr_r,x);
261 copy_(mr_x1,x);
262
263 addInt_(mr_r,-1);
264 addInt_(mr_x1,-1);
265
266 //s=the highest power of two that divides mr_r
267 k=0;
268 for (i=0;i<mr_r.length;i++)
269 for (j=1;j<mask;j<<=1)
270 if (x[i] & j) {
271 s=(k<mr_r.length+bpe ? k : 0);
272 i=mr_r.length;
273 j=mask;
274 } else
275 k++;
276
277 if (s)
278 rightShift_(mr_r,s);
279
280 powMod_(mr_a,mr_r,x);
281
282 if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) {
283 j=1;
284 while (j<=s-1 && !equals(mr_a,mr_x1)) {
285 squareMod_(mr_a,x);
286 if (equalsInt(mr_a,1)) {
287 return 0;
288 }
289 j++;
290 }
291 if (!equals(mr_a,mr_x1)) {
292 return 0;
293 }
294 }
295
296 return 1;
297 },
298
299 //returns how many bits long the bigInt is, not counting leading zeros.
300 'bitSize': function(x) {
301 var j,z,w;
302 for (j=x.length-1; (x[j]==0) && (j>0); j--);
303 for (z=0,w=x[j]; w; (w>>=1),z++);
304 z+=bpe*j;
305 return z;
306 },
307
308 //return a copy of x with at least n elements, adding leading zeros if needed
309 'expand': function(x,n) {
310 var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0);
311 copy_(ans,x);
312 return ans;
313 },
314
315 //return a k-bit true random prime using Maurer's algorithm.
316 'randTruePrime': function(k) {
317 var ans=int2bigInt(0,k,0);
318 randTruePrime_(ans,k);
319 return trim(ans,1);
320 },
321
322 //return a new bigInt equal to (x mod n) for bigInts x and n.
323 'mod': function(x,n) {
324 var ans=dup(x);
325 mod_(ans,n);
326 return trim(ans,1);
327 },
328
329 //return (x+n) where x is a bigInt and n is an integer.
330 'addInt': function(x,n) {
331 var ans=expand(x,x.length+1);
332 addInt_(ans,n);
333 return trim(ans,1);
334 },
335
336 //return x*y for bigInts x and y. This is faster when y<x.
337 'mult': function(x,y) {
338 var ans=expand(x,x.length+y.length);
339 mult_(ans,y);
340 return trim(ans,1);
341 },
342
343 //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
344 'powMod': function(x,y,n) {
345 var ans=expand(x,n.length);
346 powMod_(ans,trim(y,2),trim(n,2),0); //this should work without the trim, but doesn't
347 return trim(ans,1);
348 },
349
350 //return (x-y) for bigInts x and y. Negative answers will be 2s complement
351 'sub': function(x,y) {
352 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
353 sub_(ans,y);
354 return trim(ans,1);
355 },
356
357 //return (x+y) for bigInts x and y.
358 'add': function(x,y) {
359 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
360 add_(ans,y);
361 return trim(ans,1);
362 },
363
364 //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
365 'inverseMod': function(x,n) {
366 var ans=expand(x,n.length);
367 var s;
368 s=inverseMod_(ans,n);
369 return s ? trim(ans,1) : null;
370 },
371
372 //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
373 'multMod': function(x,y,n) {
374 var ans=expand(x,n.length);
375 multMod_(ans,y,n);
376 return trim(ans,1);
377 },
378
379 //generate a k-bit true random prime using Maurer's algorithm,
380 //and put it into ans. The bigInt ans must be large enough to hold it.
381 'randTruePrime_': function(ans,k) {
382 var c,m,pm,dd,j,r,B,divisible,z,zz,recSize;
383
384 if (primes.length==0)
385 primes=findPrimes(30000); //check for divisibility by primes <=30000
386
387 if (pows.length==0) {
388 pows=new Array(512);
389 for (j=0;j<512;j++) {
390 pows[j]=Math.pow(2,j/511.-1.);
391 }
392 }
393
394 //c and m should be tuned for a particular machine and value of k, to maximize speed
395 //this was: c=primes[primes.length-1]/k/k; //check using all the small primes. (c=0.1 in HAC)
396 c=0.1;
397 m=20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
398 recLimit=20; /*must be at least 2 (was 29)*/ //stop recursion when k <=recLimit
399
400 if (s_i2.length!=ans.length) {
401 s_i2=dup(ans);
402 s_R =dup(ans);
403 s_n1=dup(ans);
404 s_r2=dup(ans);
405 s_d =dup(ans);
406 s_x1=dup(ans);
407 s_x2=dup(ans);
408 s_b =dup(ans);
409 s_n =dup(ans);
410 s_i =dup(ans);
411 s_rm=dup(ans);
412 s_q =dup(ans);
413 s_a =dup(ans);
414 s_aa=dup(ans);
415 }
416
417 if (k <= recLimit) { //generate small random primes by trial division up to its square root
418 pm=(1<<((k+2)>>1))-1; //pm is binary number with all ones, just over sqrt(2^k)
419 copyInt_(ans,0);
420 for (dd=1;dd;) {
421 dd=0;
422 ans[0]= 1 | (1<<(k-1)) | Math.floor(Math.random()*(1<<k)); //random, k-bit, odd integer, with msb 1
423 for (j=1;(j<primes.length) && ((primes[j]&pm)==primes[j]);j++) { //trial division by all primes 3...sqrt(2^k)
424 if (0==(ans[0]%primes[j])) {
425 dd=1;
426 break;
427 }
428 }
429 }
430 carry_(ans);
431 return;
432 }
433
434 B=c*k*k; //try small primes up to B (or all the primes[] array if the largest is less than B).
435 if (k>2*m) //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
436 for (r=1; k-k*r<=m; )
437 r=pows[Math.floor(Math.random()*512)]; //r=Math.pow(2,Math.random()-1);
438 else
439 r=.5;
440
441 //simulation suggests the more complex algorithm using r=.333 is only slightly faster.
442
443 recSize=Math.floor(r*k)+1;
444
445 randTruePrime_(s_q,recSize);
446 copyInt_(s_i2,0);
447 s_i2[Math.floor((k-2)/bpe)] |= (1<<((k-2)%bpe)); //s_i2=2^(k-2)
448 divide_(s_i2,s_q,s_i,s_rm); //s_i=floor((2^(k-1))/(2q))
449
450 z=bitSize(s_i);
451
452 for (;;) {
453 for (;;) { //generate z-bit numbers until one falls in the range [0,s_i-1]
454 randBigInt_(s_R,z,0);
455 if (greater(s_i,s_R))
456 break;
457 } //now s_R is in the range [0,s_i-1]
458 addInt_(s_R,1); //now s_R is in the range [1,s_i]
459 add_(s_R,s_i); //now s_R is in the range [s_i+1,2*s_i]
460
461 copy_(s_n,s_q);
462 mult_(s_n,s_R);
463 multInt_(s_n,2);
464 addInt_(s_n,1); //s_n=2*s_R*s_q+1
465
466 copy_(s_r2,s_R);
467 multInt_(s_r2,2); //s_r2=2*s_R
468
469 //check s_n for divisibility by small primes up to B
470 for (divisible=0,j=0; (j<primes.length) && (primes[j]<B); j++)
471 if (modInt(s_n,primes[j])==0) {
472 divisible=1;
473 break;
474 }
475
476 if (!divisible) //if it passes small primes check, then try a single Miller-Rabin base 2
477 if (!millerRabin(s_n,2)) //this line represents 75% of the total runtime for randTruePrime_
478 divisible=1;
479
480 if (!divisible) { //if it passes that test, continue checking s_n
481 addInt_(s_n,-3);
482 for (j=s_n.length-1;(s_n[j]==0) && (j>0); j--); //strip leading zeros
483 for (zz=0,w=s_n[j]; w; (w>>=1),zz++);
484 zz+=bpe*j; //zz=number of bits in s_n, ignoring leading zeros
485 for (;;) { //generate z-bit numbers until one falls in the range [0,s_n-1]
486 randBigInt_(s_a,zz,0);
487 if (greater(s_n,s_a))
488 break;
489 } //now s_a is in the range [0,s_n-1]
490 addInt_(s_n,3); //now s_a is in the range [0,s_n-4]
491 addInt_(s_a,2); //now s_a is in the range [2,s_n-2]
492 copy_(s_b,s_a);
493 copy_(s_n1,s_n);
494 addInt_(s_n1,-1);
495 powMod_(s_b,s_n1,s_n); //s_b=s_a^(s_n-1) modulo s_n
496 addInt_(s_b,-1);
497 if (isZero(s_b)) {
498 copy_(s_b,s_a);
499 powMod_(s_b,s_r2,s_n);
500 addInt_(s_b,-1);
501 copy_(s_aa,s_n);
502 copy_(s_d,s_b);
503 GCD_(s_d,s_n); //if s_b and s_n are relatively prime, then s_n is a prime
504 if (equalsInt(s_d,1)) {
505 copy_(ans,s_aa);
506 return; //if we've made it this far, then s_n is absolutely guaranteed to be prime
507 }
508 }
509 }
510 }
511 },
512
513 //set b to an n-bit random BigInt. If s=1, then nth bit (most significant bit) is set to 1.
514 //array b must be big enough to hold the result. Must have n>=1
515 'randBigInt_': function(b,n,s) {
516 var i,a;
517 for (i=0;i<b.length;i++)
518 b[i]=0;
519 a=Math.floor((n-1)/bpe)+1; //# array elements to hold the BigInt
520 for (i=0;i<a;i++) {
521 b[i]=Math.floor(Math.random()*(1<<(bpe-1)));
522 }
523 b[a-1] &= (2<<((n-1)%bpe))-1;
524 if (s)
525 b[a-1] |= (1<<((n-1)%bpe));
526 },
527
528 //set x to the greatest common divisor of x and y.
529 //x,y are bigInts with the same number of elements. y is destroyed.
530 'GCD_': function(x,y) {
531 var i,xp,yp,A,B,C,D,q,sing;
532 if (T.length!=x.length)
533 T=dup(x);
534
535 sing=1;
536 while (sing) { //while y has nonzero elements other than y[0]
537 sing=0;
538 for (i=1;i<y.length;i++) //check if y has nonzero elements other than 0
539 if (y[i]) {
540 sing=1;
541 break;
542 }
543 if (!sing) break; //quit when y all zero elements except possibly y[0]
544
545 for (i=x.length;!x[i] && i>=0;i--); //find most significant element of x
546 xp=x[i];
547 yp=y[i];
548 A=1; B=0; C=0; D=1;
549 while ((yp+C) && (yp+D)) {
550 q =Math.floor((xp+A)/(yp+C));
551 qp=Math.floor((xp+B)/(yp+D));
552 if (q!=qp)
553 break;
554 t= A-q*C; A=C; C=t; // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)
555 t= B-q*D; B=D; D=t;
556 t=xp-q*yp; xp=yp; yp=t;
557 }
558 if (B) {
559 copy_(T,x);
560 linComb_(x,y,A,B); //x=A*x+B*y
561 linComb_(y,T,D,C); //y=D*y+C*T
562 } else {
563 mod_(x,y);
564 copy_(T,x);
565 copy_(x,y);
566 copy_(y,T);
567 }
568 }
569 if (y[0]==0)
570 return;
571 t=modInt(x,y[0]);
572 copyInt_(x,y[0]);
573 y[0]=t;
574 while (y[0]) {
575 x[0]%=y[0];
576 t=x[0]; x[0]=y[0]; y[0]=t;
577 }
578 },
579
580//do x=x**(-1) mod n, for bigInts x and n.
581//If no inverse exists, it sets x to zero and returns 0, else it returns 1.
582//The x array must be at least as large as the n array.
583function inverseMod_(x,n) {
584 var k=1+2*Math.max(x.length,n.length);
585
586 if(!(x[0]&1) && !(n[0]&1)) { //if both inputs are even, then inverse doesn't exist
587 copyInt_(x,0);
588 return 0;
589 }
590
591 if (eg_u.length!=k) {
592 eg_u=new Array(k);
593 eg_v=new Array(k);
594 eg_A=new Array(k);
595 eg_B=new Array(k);
596 eg_C=new Array(k);
597 eg_D=new Array(k);
598 }
599
600 copy_(eg_u,x);
601 copy_(eg_v,n);
602 copyInt_(eg_A,1);
603 copyInt_(eg_B,0);
604 copyInt_(eg_C,0);
605 copyInt_(eg_D,1);
606 for (;;) {
607 while(!(eg_u[0]&1)) { //while eg_u is even
608 halve_(eg_u);
609 if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if eg_A==eg_B==0 mod 2
610 halve_(eg_A);
611 halve_(eg_B);
612 } else {
613 add_(eg_A,n); halve_(eg_A);
614 sub_(eg_B,x); halve_(eg_B);
615 }
616 }
617
618 while (!(eg_v[0]&1)) { //while eg_v is even
619 halve_(eg_v);
620 if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if eg_C==eg_D==0 mod 2
621 halve_(eg_C);
622 halve_(eg_D);
623 } else {
624 add_(eg_C,n); halve_(eg_C);
625 sub_(eg_D,x); halve_(eg_D);
626 }
627 }
628
629 if (!greater(eg_v,eg_u)) { //eg_v <= eg_u
630 sub_(eg_u,eg_v);
631 sub_(eg_A,eg_C);
632 sub_(eg_B,eg_D);
633 } else { //eg_v > eg_u
634 sub_(eg_v,eg_u);
635 sub_(eg_C,eg_A);
636 sub_(eg_D,eg_B);
637 }
638
639 if (equalsInt(eg_u,0)) {
640 if (negative(eg_C)) //make sure answer is nonnegative
641 add_(eg_C,n);
642 copy_(x,eg_C);
643
644 if (!equalsInt(eg_v,1)) { //if GCD_(x,n)!=1, then there is no inverse
645 copyInt_(x,0);
646 return 0;
647 }
648 return 1;
649 }
650 }
651}
652
653//return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
654function inverseModInt_(x,n) {
655 var a=1,b=0,t;
656 for (;;) {
657 if (x==1) return a;
658 if (x==0) return 0;
659 b-=a*Math.floor(n/x);
660 n%=x;
661
662 if (n==1) return b; //to avoid negatives, change this b to n-b, and each -= to +=
663 if (n==0) return 0;
664 a-=b*Math.floor(x/n);
665 x%=n;
666 }
667}
668
669//Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:
670// v = GCD_(x,y) = a*x-b*y
671//The bigInts v, a, b, must have exactly as many elements as the larger of x and y.
672function eGCD_(x,y,v,a,b) {
673 var g=0;
674 var k=Math.max(x.length,y.length);
675 if (eg_u.length!=k) {
676 eg_u=new Array(k);
677 eg_A=new Array(k);
678 eg_B=new Array(k);
679 eg_C=new Array(k);
680 eg_D=new Array(k);
681 }
682 while(!(x[0]&1) && !(y[0]&1)) { //while x and y both even
683 halve_(x);
684 halve_(y);
685 g++;
686 }
687 copy_(eg_u,x);
688 copy_(v,y);
689 copyInt_(eg_A,1);
690 copyInt_(eg_B,0);
691 copyInt_(eg_C,0);
692 copyInt_(eg_D,1);
693 for (;;) {
694 while(!(eg_u[0]&1)) { //while u is even
695 halve_(eg_u);
696 if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if A==B==0 mod 2
697 halve_(eg_A);
698 halve_(eg_B);
699 } else {
700 add_(eg_A,y); halve_(eg_A);
701 sub_(eg_B,x); halve_(eg_B);
702 }
703 }
704
705 while (!(v[0]&1)) { //while v is even
706 halve_(v);
707 if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if C==D==0 mod 2
708 halve_(eg_C);
709 halve_(eg_D);
710 } else {
711 add_(eg_C,y); halve_(eg_C);
712 sub_(eg_D,x); halve_(eg_D);
713 }
714 }
715
716 if (!greater(v,eg_u)) { //v<=u
717 sub_(eg_u,v);
718 sub_(eg_A,eg_C);
719 sub_(eg_B,eg_D);
720 } else { //v>u
721 sub_(v,eg_u);
722 sub_(eg_C,eg_A);
723 sub_(eg_D,eg_B);
724 }
725 if (equalsInt(eg_u,0)) {
726 if (negative(eg_C)) { //make sure a (C)is nonnegative
727 add_(eg_C,y);
728 sub_(eg_D,x);
729 }
730 multInt_(eg_D,-1); ///make sure b (D) is nonnegative
731 copy_(a,eg_C);
732 copy_(b,eg_D);
733 leftShift_(v,g);
734 return;
735 }
736 }
737}
738
739
740//is bigInt x negative?
741function negative(x) {
742 return ((x[x.length-1]>>(bpe-1))&1);
743}
744
745
746//is (x << (shift*bpe)) > y?
747//x and y are nonnegative bigInts
748//shift is a nonnegative integer
749function greaterShift(x,y,shift) {
750 var kx=x.length, ky=y.length;
751 k=((kx+shift)<ky) ? (kx+shift) : ky;
752 for (i=ky-1-shift; i<kx && i>=0; i++)
753 if (x[i]>0)
754 return 1; //if there are nonzeros in x to the left of the first column of y, then x is bigger
755 for (i=kx-1+shift; i<ky; i++)
756 if (y[i]>0)
757 return 0; //if there are nonzeros in y to the left of the first column of x, then x is not bigger
758 for (i=k-1; i>=shift; i--)
759 if (x[i-shift]>y[i]) return 1;
760 else if (x[i-shift]<y[i]) return 0;
761 return 0;
762}
763
764//is x > y? (x and y both nonnegative)
765function greater(x,y) {
766 var i;
767 var k=(x.length<y.length) ? x.length : y.length;
768
769 for (i=x.length;i<y.length;i++)
770 if (y[i])
771 return 0; //y has more digits
772
773 for (i=y.length;i<x.length;i++)
774 if (x[i])
775 return 1; //x has more digits
776
777 for (i=k-1;i>=0;i--)
778 if (x[i]>y[i])
779 return 1;
780 else if (x[i]<y[i])
781 return 0;
782 return 0;
783}
784
785//divide_ x by y giving quotient q and remainder r. (q=floor(x/y), r=x mod y). All 4 are bigints.
786//x must have at least one leading zero element.
787//y must be nonzero.
788//q and r must be arrays that are exactly the same length as x.
789//the x array must have at least as many elements as y.
790function divide_(x,y,q,r) {
791 var kx, ky;
792 var i,j,y1,y2,c,a,b;
793 copy_(r,x);
794 for (ky=y.length;y[ky-1]==0;ky--); //kx,ky is number of elements in x,y, not including leading zeros
795 for (kx=r.length;r[kx-1]==0 && kx>ky;kx--);
796
797 //normalize: ensure the most significant element of y has its highest bit set
798 b=y[ky-1];
799 for (a=0; b; a++)
800 b>>=1;
801 a=bpe-a; //a is how many bits to shift so that the high order bit of y is leftmost in its array element
802 leftShift_(y,a); //multiply both by 1<<a now, then divide_ both by that at the end
803 leftShift_(r,a);
804
805 copyInt_(q,0); // q=0
806 while (!greaterShift(y,r,kx-ky)) { // while (leftShift_(y,kx-ky) <= r) {
807 subShift_(r,y,kx-ky); // r=r-leftShift_(y,kx-ky)
808 q[kx-ky]++; // q[kx-ky]++;
809 } // }
810
811 for (i=kx-1; i>=ky; i--) {
812 if (r[i]==y[ky-1])
813 q[i-ky]=mask;
814 else
815 q[i-ky]=Math.floor((r[i]*radix+r[i-1])/y[ky-1]);
816
817 //The following for(;;) loop is equivalent to the commented while loop,
818 //except that the uncommented version avoids overflow.
819 //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0
820 // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])
821 // q[i-ky]--;
822 for (;;) {
823 y2=(ky>1 ? y[ky-2] : 0)*q[i-ky];
824 c=y2>>bpe;
825 y2=y2 & mask;
826 y1=c+q[i-ky]*y[ky-1];
827 c=y1>>bpe;
828 y1=y1 & mask;
829
830 if (c==r[i] ? y1==r[i-1] ? y2>(i>1 ? r[i-2] : 0) : y1>r[i-1] : c>r[i])
831 q[i-ky]--;
832 else
833 break;
834 }
835
836 linCombShift_(r,y,-q[i-ky],i-ky); //r=r-q[i-ky]*leftShift_(y,i-ky)
837 if (negative(r)) {
838 addShift_(r,y,i-ky); //r=r+leftShift_(y,i-ky)
839 q[i-ky]--;
840 }
841 }
842
843 rightShift_(y,a); //undo the normalization step
844 rightShift_(r,a); //undo the normalization step
845}
846
847//do carries and borrows so each element of the bigInt x fits in bpe bits.
848function carry_(x) {
849 var i,k,c,b;
850 k=x.length;
851 c=0;
852 for (i=0;i<k;i++) {
853 c+=x[i];
854 b=0;
855 if (c<0) {
856 b=-(c>>bpe);
857 c+=b*radix;
858 }
859 x[i]=c & mask;
860 c=(c>>bpe)-b;
861 }
862}
863
864//return x mod n for bigInt x and integer n.
865function modInt(x,n) {
866 var i,c=0;
867 for (i=x.length-1; i>=0; i--)
868 c=(c*radix+x[i])%n;
869 return c;
870}
871
872//convert the integer t into a bigInt with at least the given number of bits.
873//the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)
874//Pad the array with leading zeros so that it has at least minSize elements.
875//There will always be at least one leading 0 element.
876function int2bigInt(t,bits,minSize) {
877 var i,k;
878 k=Math.ceil(bits/bpe)+1;
879 k=minSize>k ? minSize : k;
880 buff=new Array(k);
881 copyInt_(buff,t);
882 return buff;
883}
884
885//return the bigInt given a string representation in a given base.
886//Pad the array with leading zeros so that it has at least minSize elements.
887//If base=-1, then it reads in a space-separated list of array elements in decimal.
888//The array will always have at least one leading zero, unless base=-1.
889function str2bigInt(s,base,minSize) {
890 var d, i, j, x, y, kk;
891 var k=s.length;
892 if (base==-1) { //comma-separated list of array elements in decimal
893 x=new Array(0);
894 for (;;) {
895 y=new Array(x.length+1);
896 for (i=0;i<x.length;i++)
897 y[i+1]=x[i];
898 y[0]=parseInt(s,10);
899 x=y;
900 d=s.indexOf(',',0);
901 if (d<1)
902 break;
903 s=s.substring(d+1);
904 if (s.length==0)
905 break;
906 }
907 if (x.length<minSize) {
908 y=new Array(minSize);
909 copy_(y,x);
910 return y;
911 }
912 return x;
913 }
914
915 x=int2bigInt(0,base*k,0);
916 for (i=0;i<k;i++) {
917 d=digitsStr.indexOf(s.substring(i,i+1),0);
918 if (base<=36 && d>=36) //convert lowercase to uppercase if base<=36
919 d-=26;
920 if (d<base && d>=0) { //ignore illegal characters
921 multInt_(x,base);
922 addInt_(x,d);
923 }
924 }
925
926 for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros
927 k=minSize>k+1 ? minSize : k+1;
928 y=new Array(k);
929 kk=k<x.length ? k : x.length;
930 for (i=0;i<kk;i++)
931 y[i]=x[i];
932 for (;i<k;i++)
933 y[i]=0;
934 return y;
935}
936
937//is bigint x equal to integer y?
938//y must have less than bpe bits
939function equalsInt(x,y) {
940 var i;
941 if (x[0]!=y)
942 return 0;
943 for (i=1;i<x.length;i++)
944 if (x[i])
945 return 0;
946 return 1;
947}
948
949//are bigints x and y equal?
950//this works even if x and y are different lengths and have arbitrarily many leading zeros
951function equals(x,y) {
952 var i;
953 var k=x.length<y.length ? x.length : y.length;
954 for (i=0;i<k;i++)
955 if (x[i]!=y[i])
956 return 0;
957 if (x.length>y.length) {
958 for (;i<x.length;i++)
959 if (x[i])
960 return 0;
961 } else {
962 for (;i<y.length;i++)
963 if (y[i])
964 return 0;
965 }
966 return 1;
967}
968
969//is the bigInt x equal to zero?
970function isZero(x) {
971 var i;
972 for (i=0;i<x.length;i++)
973 if (x[i])
974 return 0;
975 return 1;
976}
977
978//convert a bigInt into a string in a given base, from base 2 up to base 95.
979//Base -1 prints the contents of the array representing the number.
980function bigInt2str(x,base) {
981 var i,t,s="";
982
983 if (s6.length!=x.length)
984 s6=dup(x);
985 else
986 copy_(s6,x);
987
988 if (base==-1) { //return the list of array contents
989 for (i=x.length-1;i>0;i--)
990 s+=x[i]+',';
991 s+=x[0];
992 }
993 else { //return it in the given base
994 while (!isZero(s6)) {
995 t=divInt_(s6,base); //t=s6 % base; s6=floor(s6/base);
996 s=digitsStr.substring(t,t+1)+s;
997 }
998 }
999 if (s.length==0)
1000 s="0";
1001 return s;
1002}
1003
1004//returns a duplicate of bigInt x
1005function dup(x) {
1006 var i;
1007 buff=new Array(x.length);
1008 copy_(buff,x);
1009 return buff;
1010}
1011
1012//do x=y on bigInts x and y. x must be an array at least as big as y (not counting the leading zeros in y).
1013function copy_(x,y) {
1014 var i;
1015 var k=x.length<y.length ? x.length : y.length;
1016 for (i=0;i<k;i++)
1017 x[i]=y[i];
1018 for (i=k;i<x.length;i++)
1019 x[i]=0;
1020}
1021
1022//do x=y on bigInt x and integer y.
1023function copyInt_(x,n) {
1024 var i,c;
1025 for (c=n,i=0;i<x.length;i++) {
1026 x[i]=c & mask;
1027 c>>=bpe;
1028 }
1029}
1030
1031//do x=x+n where x is a bigInt and n is an integer.
1032//x must be large enough to hold the result.
1033function addInt_(x,n) {
1034 var i,k,c,b;
1035 x[0]+=n;
1036 k=x.length;
1037 c=0;
1038 for (i=0;i<k;i++) {
1039 c+=x[i];
1040 b=0;
1041 if (c<0) {
1042 b=-(c>>bpe);
1043 c+=b*radix;
1044 }
1045 x[i]=c & mask;
1046 c=(c>>bpe)-b;
1047 if (!c) return; //stop carrying as soon as the carry_ is zero
1048 }
1049}
1050
1051//right shift bigInt x by n bits. 0 <= n < bpe.
1052function rightShift_(x,n) {
1053 var i;
1054 var k=Math.floor(n/bpe);
1055 if (k) {
1056 for (i=0;i<x.length-k;i++) //right shift x by k elements
1057 x[i]=x[i+k];
1058 for (;i<x.length;i++)
1059 x[i]=0;
1060 n%=bpe;
1061 }
1062 for (i=0;i<x.length-1;i++) {
1063 x[i]=mask & ((x[i+1]<<(bpe-n)) | (x[i]>>n));
1064 }
1065 x[i]>>=n;
1066}
1067
1068//do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
1069function halve_(x) {
1070 var i;
1071 for (i=0;i<x.length-1;i++) {
1072 x[i]=mask & ((x[i+1]<<(bpe-1)) | (x[i]>>1));
1073 }
1074 x[i]=(x[i]>>1) | (x[i] & (radix>>1)); //most significant bit stays the same
1075}
1076
1077//left shift bigInt x by n bits.
1078function leftShift_(x,n) {
1079 var i;
1080 var k=Math.floor(n/bpe);
1081 if (k) {
1082 for (i=x.length; i>=k; i--) //left shift x by k elements
1083 x[i]=x[i-k];
1084 for (;i>=0;i--)
1085 x[i]=0;
1086 n%=bpe;
1087 }
1088 if (!n)
1089 return;
1090 for (i=x.length-1;i>0;i--) {
1091 x[i]=mask & ((x[i]<<n) | (x[i-1]>>(bpe-n)));
1092 }
1093 x[i]=mask & (x[i]<<n);
1094}
1095
1096//do x=x*n where x is a bigInt and n is an integer.
1097//x must be large enough to hold the result.
1098function multInt_(x,n) {
1099 var i,k,c,b;
1100 if (!n)
1101 return;
1102 k=x.length;
1103 c=0;
1104 for (i=0;i<k;i++) {
1105 c+=x[i]*n;
1106 b=0;
1107 if (c<0) {
1108 b=-(c>>bpe);
1109 c+=b*radix;
1110 }
1111 x[i]=c & mask;
1112 c=(c>>bpe)-b;
1113 }
1114}
1115
1116//do x=floor(x/n) for bigInt x and integer n, and return the remainder
1117function divInt_(x,n) {
1118 var i,r=0,s;
1119 for (i=x.length-1;i>=0;i--) {
1120 s=r*radix+x[i];
1121 x[i]=Math.floor(s/n);
1122 r=s%n;
1123 }
1124 return r;
1125}
1126
1127//do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.
1128//x must be large enough to hold the answer.
1129function linComb_(x,y,a,b) {
1130 var i,c,k,kk;
1131 k=x.length<y.length ? x.length : y.length;
1132 kk=x.length;
1133 for (c=0,i=0;i<k;i++) {
1134 c+=a*x[i]+b*y[i];
1135 x[i]=c & mask;
1136 c>>=bpe;
1137 }
1138 for (i=k;i<kk;i++) {
1139 c+=a*x[i];
1140 x[i]=c & mask;
1141 c>>=bpe;
1142 }
1143}
1144
1145//do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.
1146//x must be large enough to hold the answer.
1147function linCombShift_(x,y,b,ys) {
1148 var i,c,k,kk;
1149 k=x.length<ys+y.length ? x.length : ys+y.length;
1150 kk=x.length;
1151 for (c=0,i=ys;i<k;i++) {
1152 c+=x[i]+b*y[i-ys];
1153 x[i]=c & mask;
1154 c>>=bpe;
1155 }
1156 for (i=k;c && i<kk;i++) {
1157 c+=x[i];
1158 x[i]=c & mask;
1159 c>>=bpe;
1160 }
1161}
1162
1163//do x=x+(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.
1164//x must be large enough to hold the answer.
1165function addShift_(x,y,ys) {
1166 var i,c,k,kk;
1167 k=x.length<ys+y.length ? x.length : ys+y.length;
1168 kk=x.length;
1169 for (c=0,i=ys;i<k;i++) {
1170 c+=x[i]+y[i-ys];
1171 x[i]=c & mask;
1172 c>>=bpe;
1173 }
1174 for (i=k;c && i<kk;i++) {
1175 c+=x[i];
1176 x[i]=c & mask;
1177 c>>=bpe;
1178 }
1179}
1180
1181//do x=x-(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.
1182//x must be large enough to hold the answer.
1183function subShift_(x,y,ys) {
1184 var i,c,k,kk;
1185 k=x.length<ys+y.length ? x.length : ys+y.length;
1186 kk=x.length;
1187 for (c=0,i=ys;i<k;i++) {
1188 c+=x[i]-y[i-ys];
1189 x[i]=c & mask;
1190 c>>=bpe;
1191 }
1192 for (i=k;c && i<kk;i++) {
1193 c+=x[i];
1194 x[i]=c & mask;
1195 c>>=bpe;
1196 }
1197}
1198
1199//do x=x-y for bigInts x and y.
1200//x must be large enough to hold the answer.
1201//negative answers will be 2s complement
1202function sub_(x,y) {
1203 var i,c,k,kk;
1204 k=x.length<y.length ? x.length : y.length;
1205 for (c=0,i=0;i<k;i++) {
1206 c+=x[i]-y[i];
1207 x[i]=c & mask;
1208 c>>=bpe;
1209 }
1210 for (i=k;c && i<x.length;i++) {
1211 c+=x[i];
1212 x[i]=c & mask;
1213 c>>=bpe;
1214 }
1215}
1216
1217//do x=x+y for bigInts x and y.
1218//x must be large enough to hold the answer.
1219function add_(x,y) {
1220 var i,c,k,kk;
1221 k=x.length<y.length ? x.length : y.length;
1222 for (c=0,i=0;i<k;i++) {
1223 c+=x[i]+y[i];
1224 x[i]=c & mask;
1225 c>>=bpe;
1226 }
1227 for (i=k;c && i<x.length;i++) {
1228 c+=x[i];
1229 x[i]=c & mask;
1230 c>>=bpe;
1231 }
1232}
1233
1234//do x=x*y for bigInts x and y. This is faster when y<x.
1235function mult_(x,y) {
1236 var i;
1237 if (ss.length!=2*x.length)
1238 ss=new Array(2*x.length);
1239 copyInt_(ss,0);
1240 for (i=0;i<y.length;i++)
1241 if (y[i])
1242 linCombShift_(ss,x,y[i],i); //ss=1*ss+y[i]*(x<<(i*bpe))
1243 copy_(x,ss);
1244}
1245
1246//do x=x mod n for bigInts x and n.
1247function mod_(x,n) {
1248 if (s4.length!=x.length)
1249 s4=dup(x);
1250 else
1251 copy_(s4,x);
1252 if (s5.length!=x.length)
1253 s5=dup(x);
1254 divide_(s4,n,s5,x); //x = remainder of s4 / n
1255}
1256
1257//do x=x*y mod n for bigInts x,y,n.
1258//for greater speed, let y<x.
1259function multMod_(x,y,n) {
1260 var i;
1261 if (s0.length!=2*x.length)
1262 s0=new Array(2*x.length);
1263 copyInt_(s0,0);
1264 for (i=0;i<y.length;i++)
1265 if (y[i])
1266 linCombShift_(s0,x,y[i],i); //s0=1*s0+y[i]*(x<<(i*bpe))
1267 mod_(s0,n);
1268 copy_(x,s0);
1269}
1270
1271//do x=x*x mod n for bigInts x,n.
1272function squareMod_(x,n) {
1273 var i,j,d,c,kx,kn,k;
1274 for (kx=x.length; kx>0 && !x[kx-1]; kx--); //ignore leading zeros in x
1275 k=kx>n.length ? 2*kx : 2*n.length; //k=# elements in the product, which is twice the elements in the larger of x and n
1276 if (s0.length!=k)
1277 s0=new Array(k);
1278 copyInt_(s0,0);
1279 for (i=0;i<kx;i++) {
1280 c=s0[2*i]+x[i]*x[i];
1281 s0[2*i]=c & mask;
1282 c>>=bpe;
1283 for (j=i+1;j<kx;j++) {
1284 c=s0[i+j]+2*x[i]*x[j]+c;
1285 s0[i+j]=(c & mask);
1286 c>>=bpe;
1287 }
1288 s0[i+kx]=c;
1289 }
1290 mod_(s0,n);
1291 copy_(x,s0);
1292}
1293
1294//return x with exactly k leading zero elements
1295function trim(x,k) {
1296 var i,y;
1297 for (i=x.length; i>0 && !x[i-1]; i--);
1298 y=new Array(i+k);
1299 copy_(y,x);
1300 return y;
1301}
1302
1303//do x=x**y mod n, where x,y,n are bigInts and ** is exponentiation. 0**0=1.
1304//this is faster when n is odd. x usually needs to have as many elements as n.
1305function powMod_(x,y,n) {
1306 var k1,k2,kn,np;
1307 if(s7.length!=n.length)
1308 s7=dup(n);
1309
1310 //for even modulus, use a simple square-and-multiply algorithm,
1311 //rather than using the more complex Montgomery algorithm.
1312 if ((n[0]&1)==0) {
1313 copy_(s7,x);
1314 copyInt_(x,1);
1315 while(!equalsInt(y,0)) {
1316 if (y[0]&1)
1317 multMod_(x,s7,n);
1318 divInt_(y,2);
1319 squareMod_(s7,n);
1320 }
1321 return;
1322 }
1323
1324 //calculate np from n for the Montgomery multiplications
1325 copyInt_(s7,0);
1326 for (kn=n.length;kn>0 && !n[kn-1];kn--);
1327 np=radix-inverseModInt_(modInt(n,radix),radix);
1328 s7[kn]=1;
1329 multMod_(x ,s7,n); // x = x * 2**(kn*bp) mod n
1330
1331 if (s3.length!=x.length)
1332 s3=dup(x);
1333 else
1334 copy_(s3,x);
1335
1336 for (k1=y.length-1;k1>0 & !y[k1]; k1--); //k1=first nonzero element of y
1337 if (y[k1]==0) { //anything to the 0th power is 1
1338 copyInt_(x,1);
1339 return;
1340 }
1341 for (k2=1<<(bpe-1);k2 && !(y[k1] & k2); k2>>=1); //k2=position of first 1 bit in y[k1]
1342 for (;;) {
1343 if (!(k2>>=1)) { //look at next bit of y
1344 k1--;
1345 if (k1<0) {
1346 mont_(x,one,n,np);
1347 return;
1348 }
1349 k2=1<<(bpe-1);
1350 }
1351 mont_(x,x,n,np);
1352
1353 if (k2 & y[k1]) //if next bit is a 1
1354 mont_(x,s3,n,np);
1355 }
1356}
1357
1358//do x=x*y*Ri mod n for bigInts x,y,n,
1359// where Ri = 2**(-kn*bpe) mod n, and kn is the
1360// number of elements in the n array, not
1361// counting leading zeros.
1362//x must be large enough to hold the answer.
1363//It's OK if x and y are the same variable.
1364//must have:
1365// x,y < n
1366// n is odd
1367// np = -(n^(-1)) mod radix
1368function mont_(x,y,n,np) {
1369 var i,j,c,ui,t;
1370 var kn=n.length;
1371 var ky=y.length;
1372
1373 if (sa.length!=kn)
1374 sa=new Array(kn);
1375
1376 for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n
1377 //this function sometimes gives wrong answers when the next line is uncommented
1378 //for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y
1379
1380 copyInt_(sa,0);
1381
1382 //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large keys
1383 for (i=0; i<kn; i++) {
1384 t=sa[0]+x[i]*y[0];
1385 ui=((t & mask) * np) & mask; //the inner "& mask" is needed on Macintosh MSIE, but not windows MSIE
1386 c=(t+ui*n[0]) >> bpe;
1387 t=x[i];
1388
1389 //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe
1390 for (j=1;j<ky;j++) {
1391 c+=sa[j]+t*y[j]+ui*n[j];
1392 sa[j-1]=c & mask;
1393 c>>=bpe;
1394 }
1395 for (;j<kn;j++) {
1396 c+=sa[j]+ui*n[j];
1397 sa[j-1]=c & mask;
1398 c>>=bpe;
1399 }
1400 sa[j-1]=c & mask;
1401 }
1402
1403 if (!greater(n,sa))
1404 sub_(sa,n);
1405 copy_(x,sa);
1406}
1407
1408
1409
1410
1411//#############################################################################
1412//#############################################################################
1413//#############################################################################
1414//#############################################################################
1415//#############################################################################
1416//#############################################################################
1417//#############################################################################
1418
1419
1420
1421
1422
1423//#############################################################################
1424
1425Clipperz.Crypto.BigInt = function (aValue, aBase) {
1426 varbase;
1427 varvalue;
1428
1429 if (typeof(aValue) == 'object') {
1430 this._internalValue = aValue;
1431 } else {
1432 if (typeof(aValue) == 'undefined') {
1433 value = "0";
1434 } else {
1435 value = aValue + "";
1436 }
1437
1438 if (typeof(aBase) == 'undefined') {
1439 base = 10;
1440 } else {
1441 base = aBase;
1442 }
1443
1444 this._internalValue = str2bigInt(value, base, 1, 1);
1445 }
1446
1447 return this;
1448}
1449
1450//=============================================================================
1451
1452MochiKit.Base.update(Clipperz.Crypto.BigInt.prototype, {
1453
1454 //-------------------------------------------------------------------------
1455
1456 'internalValue': function () {
1457 return this._internalValue;
1458 },
1459
1460 //-------------------------------------------------------------------------
1461
1462 'isBigInt': true,
1463
1464 //-------------------------------------------------------------------------
1465
1466 'toString': function(aBase) {
1467 return this.asString(aBase);
1468 },
1469
1470 //-------------------------------------------------------------------------
1471
1472 'asString': function (aBase) {
1473 varbase;
1474
1475 if (typeof(aBase) == 'undefined') {
1476 base = 10;
1477 } else {
1478 base = aBase;
1479 }
1480
1481 return bigInt2str(this.internalValue(), base).toLowerCase();
1482 },
1483
1484 //-------------------------------------------------------------------------
1485
1486 'equals': function (aValue) {
1487 var result;
1488
1489 if (aValue.isBigInt) {
1490 result = equals(this.internalValue(), aValue.internalValue());
1491 } else if (typeof(aValue) == "number") {
1492 result = equalsInt(this.internalValue(), aValue);
1493 } else {
1494 throw Clipperz.Crypt.BigInt.exception.UnknownType;
1495 }
1496
1497 return result;
1498 },
1499
1500 //-------------------------------------------------------------------------
1501
1502 'add': function (aValue) {
1503 var result;
1504
1505 if (aValue.isBigInt) {
1506 result = add(this.internalValue(), aValue.internalValue());
1507 } else {
1508 result = addInt(this.internalValue(), aValue);
1509 }
1510
1511 return new Clipperz.Crypto.BigInt(result);
1512 },
1513
1514 //-------------------------------------------------------------------------
1515
1516 'subtract': function (aValue) {
1517 var result;
1518 var value;
1519
1520 if (aValue.isBigInt) {
1521 value = aValue;
1522 } else {
1523 value = new Clipperz.Crypto.BigInt(aValue);
1524 }
1525
1526 result = sub(this.internalValue(), value.internalValue());
1527
1528 return new Clipperz.Crypto.BigInt(result);
1529 },
1530
1531 //-------------------------------------------------------------------------
1532
1533 'multiply': function (aValue, aModule) {
1534 var result;
1535 var value;
1536
1537 if (aValue.isBigInt) {
1538 value = aValue;
1539 } else {
1540 value = new Clipperz.Crypto.BigInt(aValue);
1541 }
1542
1543 if (typeof(aModule) == 'undefined') {
1544 result = mult(this.internalValue(), value.internalValue());
1545 } else {
1546 result = multMod(this.internalValue(), value.internalValue(), aModule);
1547 }
1548
1549 return new Clipperz.Crypto.BigInt(result);
1550 },
1551
1552 //-------------------------------------------------------------------------
1553
1554 'module': function (aModule) {
1555 varresult;
1556 var module;
1557
1558 if (aModule.isBigInt) {
1559 module = aModule;
1560 } else {
1561 module = new Clipperz.Crypto.BigInt(aModule);
1562 }
1563
1564 result = mod(this.internalValue(), module.internalValue());
1565
1566 return new Clipperz.Crypto.BigInt(result);
1567 },
1568
1569 //-------------------------------------------------------------------------
1570
1571 'powerModule': function(aValue, aModule) {
1572 varresult;
1573 varvalue;
1574 var module;
1575
1576 if (aValue.isBigInt) {
1577 value = aValue;
1578 } else {
1579 value = new Clipperz.Crypto.BigInt(aValue);
1580 }
1581
1582 if (aModule.isBigInt) {
1583 module = aModule;
1584 } else {
1585 module = new Clipperz.Crypto.BigInt(aModule);
1586 }
1587
1588 if (aValue == -1) {
1589 result = inverseMod(this.internalValue(), module.internalValue());
1590 } else {
1591 result = powMod(this.internalValue(), value.internalValue(), module.internalValue());
1592 }
1593
1594 return new Clipperz.Crypto.BigInt(result);
1595 },
1596
1597 //-------------------------------------------------------------------------
1598
1599 'bitSize': function() {
1600 return bitSize(this.internalValue());
1601 },
1602
1603 //-------------------------------------------------------------------------
1604 __syntaxFix__: "syntax fix"
1605
1606});
1607
1608//#############################################################################
1609
1610Clipperz.Crypto.BigInt.randomPrime = function(aBitSize) {
1611 return new Clipperz.Crypto.BigInt(randTruePrime(aBitSize));
1612}
1613
1614//#############################################################################
1615//#############################################################################
1616//#############################################################################
1617
1618Clipperz.Crypto.BigInt.equals = function(a, b) {
1619 return a.equals(b);
1620}
1621
1622Clipperz.Crypto.BigInt.add = function(a, b) {
1623 return a.add(b);
1624}
1625
1626Clipperz.Crypto.BigInt.subtract = function(a, b) {
1627 return a.subtract(b);
1628}
1629
1630Clipperz.Crypto.BigInt.multiply = function(a, b, module) {
1631 return a.multiply(b, module);
1632}
1633
1634Clipperz.Crypto.BigInt.module = function(a, module) {
1635 return a.module(module);
1636}
1637
1638Clipperz.Crypto.BigInt.powerModule = function(a, b, module) {
1639 return a.powerModule(b, module);
1640}
1641
1642Clipperz.Crypto.BigInt.exception = {
1643 UnknownType: new MochiKit.Base.NamedError("Clipperz.Crypto.BigInt.exception.UnknownType")
1644}
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/ByteArray.js b/frontend/gamma/js/ClipperzCryptoLibrary/ByteArray.js
new file mode 100644
index 0000000..aca1c00
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/ByteArray.js
@@ -0,0 +1,1496 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25
26//=============================================================================
27
28Clipperz.ByteArray_abstract = function(args) {
29 return this;
30}
31
32Clipperz.ByteArray_abstract.prototype = MochiKit.Base.update(null, {
33
34 //-------------------------------------------------------------------------
35
36 'toString': function() {
37 return "Clipperz.ByteArray_abstract";
38 },
39
40 //-------------------------------------------------------------------------
41
42 'equals': function(aValue) {
43 return (this.compare(aValue) == 0);
44 },
45
46 //-------------------------------------------------------------------------
47
48 'compare': function(aValue) {
49 var result;
50 var i;
51
52 result = MochiKit.Base.compare(this.length(), aValue.length());
53 i = this.length();
54
55 while ((result == 0) && (i>0)) {
56 i--;
57 result = MochiKit.Base.compare(this.byteAtIndex(i), aValue.byteAtIndex(i));
58 }
59
60 return result;
61 },
62
63 //-------------------------------------------------------------------------
64
65 'clone': function() {
66 throw Clipperz.Base.exception.AbstractMethod;
67 },
68
69 //-------------------------------------------------------------------------
70
71 'newInstance': function() {
72 throw Clipperz.Base.exception.AbstractMethod;
73 },
74
75 //-------------------------------------------------------------------------
76
77 'reset': function() {
78 throw Clipperz.Base.exception.AbstractMethod;
79 },
80
81 //-------------------------------------------------------------------------
82
83 'length': function() {
84 throw Clipperz.Base.exception.AbstractMethod;
85 },
86
87 //-------------------------------------------------------------------------
88
89 'checkByteValue': function(aValue) {
90//Clipperz.log("aValue", aValue.toString(16));
91//Clipperz.log("(aValue & 0xff)", (aValue & 0xff).toString(16));
92
93 if ((aValue & 0xff) != aValue) {
94 MochiKit.Logging.logError("Clipperz.ByteArray.appendByte: the provided value (0x" + aValue.toString(16) + ") is not a byte value.");
95 throw Clipperz.ByteArray.exception.InvalidValue;
96 }
97 },
98
99 //-------------------------------------------------------------------------
100
101 'xorMergeWithBlock': function(aBlock, anAllignment, paddingMode) {
102 var result;
103 var a, b;
104 var aLength;
105 var bLength;
106 var i, c;
107
108 if (this.length() > aBlock.length()) {
109 a = this;
110 b = aBlock;
111 } else {
112 a = aBlock;
113 b = this;
114 }
115
116 aLength = a.length();
117 bLength = b.length();
118
119 if (aLength != bLength) {
120 if (paddingMode == 'truncate') {
121 if (anAllignment == 'left') {
122 a = a.split(0, bLength);
123 } else {
124 a = a.split(aLength - bLength);
125 }
126 } else {
127 var ii, cc;
128 var padding;
129
130 // padding = new Clipperz.ByteArray();
131 padding = this.newInstance();
132 cc = aLength - bLength;
133 for (ii=0; ii<cc; ii++) {
134 padding.appendByte(0);
135 }
136
137 if (anAllignment == 'left') {
138 b = b.appendBlock(padding);
139 } else {
140 b = padding.appendBlock(b);
141 }
142 }
143 }
144
145
146 // result = new Clipperz.ByteArray();
147 result = this.newInstance();
148 c = a.length();
149 for (i=0; i<c; i++) {
150 result.appendByte(a.byteAtIndex(i) ^ b.byteAtIndex(i));
151 }
152
153 return result;
154 },
155
156 //-------------------------------------------------------------------------
157/*
158 'shiftLeft': function(aNumberOfBitsToShift) {
159 var result;
160
161 result = this.clone(); //???????????
162
163 return result;
164 },
165 */
166 //-------------------------------------------------------------------------
167
168 'appendBlock': function(aBlock) {
169 throw Clipperz.Base.exception.AbstractMethod;
170 },
171
172 //-------------------------------------------------------------------------
173
174 'appendByte': function(aValue) {
175 throw Clipperz.Base.exception.AbstractMethod;
176 },
177
178 'appendBytes': function(args) {
179 varvalues;
180 vari,c;
181
182 if (args.constructor == Array) {
183 values = args;
184 } else {
185 values = arguments;
186 }
187
188 c = values.length;
189 for (i=0; i<c; i++) {
190 this.appendByte(values[i]);
191 }
192
193 return this;
194 },
195
196 //-------------------------------------------------------------------------
197
198 'appendWord': function(aValue, isLittleEndian) {
199 var result;
200 var processAsLittleEndian;
201
202 processAsLittleEndian = isLittleEndian === true ? true : false;
203
204 if (processAsLittleEndian) {
205 result = this.appendBytes( (aValue) & 0xff, (aValue >> 8) & 0xff, (aValue >> 16) & 0xff, (aValue >> 24) & 0xff ); //little endian
206 } else {
207 result = this.appendBytes( (aValue >> 24) & 0xff, (aValue >> 16) & 0xff, (aValue >> 8) & 0xff, (aValue) & 0xff ); //big endian - DEFAULT
208 }
209
210 return result;
211 },
212
213 'appendWords': function(args) {
214 varvalues;
215 vari,c;
216
217 if (args.constructor == Array) {
218 values = args;
219 } else {
220 values = arguments;
221 }
222
223 c = values.length;
224 for (i=0; i<c; i++) {
225 this.appendWord(values[i], false);
226 }
227
228 return this;
229 },
230
231 //-------------------------------------------------------------------------
232
233 'appendBigEndianWords': function(args) {
234 varvalues;
235 vari,c;
236
237 if (args.constructor == Array) {
238 values = args;
239 } else {
240 values = arguments;
241 }
242
243 c = values.length;
244 for (i=0; i<c; i++) {
245 this.appendWord(values[i], true);
246 }
247
248 return this;
249 },
250
251 //-------------------------------------------------------------------------
252
253 'appendBinaryString': function (aBinaryString) {
254 var i,c;
255
256 c = aBinaryString.length;
257 for (i=0; i<c; i++) {
258 this.appendByte(aBinaryString.charCodeAt(i));
259 };
260
261 return this;
262 },
263
264 //-------------------------------------------------------------------------
265
266 'byteAtIndex': function(anIndex) {
267 throw Clipperz.Base.exception.AbstractMethod;
268 },
269
270 'setByteAtIndex': function(aValue, anIndex) {
271 throw Clipperz.Base.exception.AbstractMethod;
272 },
273
274 //-------------------------------------------------------------------------
275
276 'bitAtIndex': function(aBitPosition) {
277 var result;
278 varbytePosition;
279 var bitPositionInSelectedByte;
280 var selectedByte;
281 var selectedByteMask;
282
283 bytePosition = this.length() - Math.ceil((aBitPosition + 1)/ 8);
284 bitPositionInSelectedByte = aBitPosition % 8;
285 selectedByte = this.byteAtIndex(bytePosition);
286
287 if (bitPositionInSelectedByte > 0) {
288 selectedByteMask = (1 << bitPositionInSelectedByte);
289 } else {
290 selectedByteMask = 1;
291 }
292 result = selectedByte & selectedByteMask ? 1 : 0;
293//console.log("aBitPosition: " + aBitPosition + ", length: " + this.length() + ", bytePosition: " + bytePosition + ", bitPositionInSelectedByte: " + bitPositionInSelectedByte + ", selectedByteMask: " + selectedByteMask);
294
295 return result;
296 },
297
298 //-------------------------------------------------------------------------
299
300 'bitBlockAtIndexWithSize': function(aBitPosition, aSize) {
301 var result;
302 var bitValue;
303 var i,c;
304
305 result = 0;
306 c = aSize;
307 for (i=0; i<c; i++) {
308 bitValue = this.bitAtIndex(aBitPosition + i);
309 result = result | bitValue << i;
310 }
311
312 return result;
313 },
314
315 //-------------------------------------------------------------------------
316
317 'asString': function() {
318 varresult;
319 varlength;
320 vari;
321
322//var startTime = new Date();
323
324 //# result = "";
325 result = [];
326
327 i = 0;
328 length = this.length();
329
330 while (i < length) {
331 varcurrentCharacter;
332 varcurrentByte;
333 varunicode;
334
335 currentByte = this.byteAtIndex(i);
336
337 if ((currentByte & 0x80) == 0x00 ) { //0xxxxxxx
338 unicode = currentByte;
339 currentCharacter = String.fromCharCode(unicode);
340 } else if ((currentByte & 0xe0) == 0xc0 ) { //110xxxxx 10xxxxxx
341 unicode = (currentByte & 0x1f) << 6;
342 i++; currentByte = this.byteAtIndex(i);
343 unicode = unicode | (currentByte & 0x3f);
344
345 currentCharacter = String.fromCharCode(unicode);
346 } else if ((currentByte & 0xf0) == 0xe0 ) { //1110xxxx 10xxxxxx 10xxxxxx
347 unicode = (currentByte & 0x0f) << (6+6);
348 i++; currentByte = this.byteAtIndex(i);
349 unicode = unicode | ((currentByte & 0x3f) << 6);
350 i++; currentByte = this.byteAtIndex(i);
351 unicode = unicode | (currentByte & 0x3f);
352
353 currentCharacter = String.fromCharCode(unicode);
354 } else { //11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
355 unicode = (currentByte & 0x07) << (6+6+6);
356 i++; currentByte = this.byteAtIndex(i);
357 unicode = unicode | ((currentByte & 0x3f) << (6+6));
358 i++; currentByte = this.byteAtIndex(i);
359 unicode = unicode | ((currentByte & 0x3f) << 6);
360 i++; currentByte = this.byteAtIndex(i);
361 unicode = unicode | (currentByte & 0x3f);
362
363 currentCharacter = String.fromCharCode(unicode);
364 }
365
366 // result += currentCharacter;
367 result.push(currentCharacter);
368 i++;
369 }
370
371//MochiKit.Logging.logDebug("[" + (new Date() - startTime) + "] ByteArray.asString");
372
373 // return result;
374 return result.join("");
375 },
376
377 //-------------------------------------------------------------------------
378
379 'toHexString': function() {
380 throw Clipperz.Base.exception.AbstractMethod;
381 },
382
383 //-------------------------------------------------------------------------
384
385 'base64map': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
386 'base64mapIndex': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(''),
387 //'base64mapInvertedIndex': {
388 // 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9,
389 // 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16, 'R': 17, 'S': 18, 'T': 19,
390 // 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24, 'Z': 25, 'a': 26, 'b': 27, 'c': 28, 'd': 29,
391 // 'e': 30, 'f': 31, 'g': 32, 'h': 33, 'i': 34, 'j': 35, 'k': 36, 'l': 37, 'm': 38, 'n': 39,
392 // 'o': 40, 'p': 41, 'q': 42, 'r': 43, 's': 44, 't': 45, 'u': 46, 'v': 47, 'w': 48, 'x': 49,
393 // 'y': 50, 'z': 51, '0': 52, '1': 53, '2': 54, '3': 55, '4': 56, '5': 57, '6': 58, '7': 59,
394 // '8': 60, '9': 61, '+': 62, '/': 63,
395 // "=": -1},
396
397 //-------------------------------------------------------------------------
398
399 'appendBase64String': function(aValue) {
400 var i;
401 var length;
402
403 length = aValue.length;
404
405 if ((length % 4) != 0) {
406 MochiKit.Logging.logError("the value passed to the 'ByteArray.setBase64Value' is not correct");
407 throw Clipperz.ByteArray.exception.InvalidValue;
408 }
409
410 i = 0;
411 while (i<length) {
412 var value1, value2, value3, value4;
413 var byte1, byte2, byte3;
414
415 value1 = this.base64map.indexOf(aValue.charAt(i));
416 value2 = this.base64map.indexOf(aValue.charAt(i+1));
417 value3 = this.base64map.indexOf(aValue.charAt(i+2));
418 value4 = this.base64map.indexOf(aValue.charAt(i+3));
419
420 // value1 = this.base64mapInvertedIndex[aValue.charAt(i)];
421 // value2 = this.base64mapInvertedIndex[aValue.charAt(i+1)];
422 // value3 = this.base64mapInvertedIndex[aValue.charAt(i+2)];
423 // value4 = this.base64mapInvertedIndex[aValue.charAt(i+3)];
424
425 byte1 = (value1 << 2) | ((value2 & 0x30) >> 4);
426 if (value3 != -1) {
427 byte2 = ((value2 & 0x0f) << 4) | ((value3 & 0x3c) >> 2);
428
429 if (value4 != -1) {
430 byte3 = ((value3 & 0x03) << 6) | (value4);
431 } else {
432 byte3 = null;
433 }
434 } else {
435 byte2 = null;
436 byte3 = null;
437 }
438
439 this.appendByte(byte1);
440 this.appendByte(byte2);
441 this.appendByte(byte3);
442
443 i += 4;
444 }
445
446 return this;
447 },
448
449 //-------------------------------------------------------------------------
450
451 'toBase64String': function() {
452 var result;
453 var length;
454 var i;
455 var byte1, byte2, byte3;
456 var char1, char2, char3, char4;
457
458 i = 0;
459 length = this.length();
460 result = new Array(Math.ceil(length/3));
461
462 while (i < length) {
463 byte1 = this.byteAtIndex(i);
464 if ((i+2) < length) {
465 byte2 = this.byteAtIndex(i+1);
466 byte3 = this.byteAtIndex(i+2);
467 } else if ((i+2) == length) {
468 byte2 = this.byteAtIndex(i+1);
469 byte3 = null;
470 } else {
471 byte2 = null;
472 byte3 = null;
473 }
474
475 char1 = this.base64mapIndex[byte1 >> 2];
476 if (byte2 != null) {
477 char2 = this.base64mapIndex[((byte1 & 0x03) << 4) | ((byte2 & 0xf0) >> 4)];
478 if (byte3 != null) {
479 char3 = this.base64mapIndex[((byte2 & 0x0f) << 2) | ((byte3 & 0xc0) >> 6)];
480 char4 = this.base64mapIndex[(byte3 & 0x3f)];
481 } else {
482 char3 = this.base64mapIndex[(byte2 & 0x0f) << 2];
483 char4 = "=";
484 }
485 } else {
486 char2 = this.base64mapIndex[(byte1 & 0x03) << 4];
487 char3 = "=";
488 char4 = "=";
489 }
490
491 result.push(char1 + char2 + char3 + char4);
492
493 i += 3;
494 }
495
496 return result.join("");
497 },
498
499 //-------------------------------------------------------------------------
500
501 'base32map': "0123456789abcdefghjkmnpqrstvwxyz",
502 'base32mapIndex': "0123456789abcdefghjkmnpqrstvwxyz".split(''),
503
504 //-------------------------------------------------------------------------
505
506 'appendBase32String': function(aValue) {
507 var value;
508 var i;
509 var length;
510 var value1, value2, value3, value4, value5, value6, value7, value8;
511 var byte1, byte2, byte3, byte4, byte5;
512
513 value = aValue.toLowerCase();
514 value = value.replace(/[\s\-]/g, '');
515 value = value.replace(/[0o]/g, '0');
516 value = value.replace(/[1il]/g, '1');
517
518 length = value.length;
519
520 if ((length % 8) != 0) {
521 MochiKit.Logging.logError("the value passed to the 'ByteArray.setBase32Value' is not correct");
522 throw Clipperz.ByteArray.exception.InvalidValue;
523 }
524
525 i = 0;
526 while (i<length) {
527 value1 = this.base32map.indexOf(value.charAt(i));
528 value2 = this.base32map.indexOf(value.charAt(i+1));
529 value3 = this.base32map.indexOf(value.charAt(i+2));
530 value4 = this.base32map.indexOf(value.charAt(i+3));
531 value5 = this.base32map.indexOf(value.charAt(i+4));
532 value6 = this.base32map.indexOf(value.charAt(i+5));
533 value7 = this.base32map.indexOf(value.charAt(i+6));
534 value8 = this.base32map.indexOf(value.charAt(i+7));
535
536 byte1 = byte2 = byte3 = byte4 = byte5 = null;
537
538 byte1 = (value1 << 3) | ((value2 & 0x1c) >> 2);
539 if (value3 != -1) {
540 byte2 = ((value2 & 0x03) << 6) | (value3 << 1) | ((value4 & 0x10) >> 4);
541 if (value5 != -1) {
542 byte3 = ((value4 & 0x0f) << 4) | ((value5 & 0x1e) >> 1);
543 if (value6 != -1) {
544 byte4 = ((value5 & 0x01) << 7) | (value6 << 2) | ((value7 & 0x18) >> 3);
545 if (value8 != -1) {
546 byte5 = ((value7 & 0x07) << 5) | (value8);
547 }
548 }
549 }
550 }
551
552 this.appendByte(byte1);
553 this.appendByte(byte2);
554 this.appendByte(byte3);
555 this.appendByte(byte4);
556 this.appendByte(byte5);
557
558 i += 8;
559 }
560
561 return this;
562 },
563
564 //-------------------------------------------------------------------------
565
566 'toBase32String': function() {
567 var result;
568 var length;
569 var i;
570 var byte1, byte2, byte3, byte4, byte5;
571 var char1, char2, char3, char4, char5, char6, char7, char8;
572
573 i = 0;
574 length = this.length();
575 result = new Array(Math.ceil(length/5));
576
577 while (i < length) {
578 byte1 = this.byteAtIndex(i);
579
580 if ((i+4) < length) {
581 byte2 = this.byteAtIndex(i+1);
582 byte3 = this.byteAtIndex(i+2);
583 byte4 = this.byteAtIndex(i+3);
584 byte5 = this.byteAtIndex(i+4);
585 } else if ((i+4) == length) {
586 byte2 = this.byteAtIndex(i+1);
587 byte3 = this.byteAtIndex(i+2);
588 byte4 = this.byteAtIndex(i+3);
589 byte5 = null;
590 } else if ((i+3) == length) {
591 byte2 = this.byteAtIndex(i+1);
592 byte3 = this.byteAtIndex(i+2);
593 byte4 = null;
594 byte5 = null;
595 } else if ((i+2) == length) {
596 byte2 = this.byteAtIndex(i+1);
597 byte3 = null;
598 byte4 = null;
599 byte5 = null;
600 } else {
601 byte2 = null;
602 byte3 = null;
603 byte4 = null;
604 byte5 = null;
605 }
606
607
608 char1 = this.base32mapIndex[byte1 >> 3];
609 char2 = char3 = char4 = char5 = char6 = char7 = char8 = "=";
610
611 if (byte2 != null) {
612 char2 = this.base32mapIndex[((byte1 & 0x07) << 2) | ((byte2 & 0xc0) >> 6)];
613 char3 = this.base32mapIndex[((byte2 & 0x3e) >> 1)];
614 if (byte3 != null) {
615 char4 = this.base32mapIndex[((byte2 & 0x01) << 4) | ((byte3 & 0xf0) >> 4)];
616 if (byte4 != null) {
617 char5 = this.base32mapIndex[((byte3 & 0x0f) << 1) | ((byte4 & 0x80) >> 7)];
618 char6 = this.base32mapIndex[(byte4 & 0x7c) >> 2];
619 if (byte5 != null) {
620 char7 = this.base32mapIndex[((byte4 & 0x03) << 3) | ((byte5 & 0xe0) >> 5)];
621 char8 = this.base32mapIndex[(byte5 & 0x1f)];
622 } else {
623 char7 = this.base32mapIndex[(byte4 & 0x03) << 3];
624 }
625 } else {
626 char5 = this.base32mapIndex[(byte3 & 0x0f) << 1];
627 }
628
629 } else {
630 char4 = this.base32mapIndex[(byte2 & 0x01) << 4];
631 }
632 } else {
633 char2 = this.base32mapIndex[(byte1 & 0x07) << 2];
634 }
635
636 result.push(char1 + char2 + char3 + char4 + char5 + char6 + char7 + char8);
637 i += 5;
638 }
639
640 return result.join("");
641 },
642
643 //-------------------------------------------------------------------------
644
645 'toBinaryString': function () {
646 vari, c;
647 var result;
648
649 result = '';
650
651 c = this.length();
652 for (i=0; i<c; i++) {
653 result += String.fromCharCode(this.byteAtIndex(i));
654 }
655
656 return result;
657 },
658
659
660 //-------------------------------------------------------------------------
661
662 'split': function(aStartingIndex, anEndingIndex) {
663 throw Clipperz.Base.exception.AbstractMethod;
664 },
665
666 //-------------------------------------------------------------------------
667
668 'increment': function() {
669 var i;
670 var done;
671
672 done = false;
673 i = this.length() - 1;
674
675 while ((i>=0) && (done == false)) {
676 var currentByteValue;
677
678 currentByteValue = this.byteAtIndex(i);
679
680 if (currentByteValue == 0xff) {
681 this.setByteAtIndex(0, i);
682 if (i>= 0) {
683 i --;
684 } else {
685 done = true;
686 }
687 } else {
688 this.setByteAtIndex(currentByteValue + 1, i);
689 done = true;
690 }
691 }
692 },
693
694 //-------------------------------------------------------------------------
695
696 'arrayValues': function() {
697 throw Clipperz.Base.exception.AbstractMethod;
698 },
699
700 //-------------------------------------------------------------------------
701 __syntaxFix__: "syntax fix"
702
703});
704
705//=============================================================================
706//
707 //Clipperz.ByteArray_hex
708//
709//=============================================================================
710/*
711Clipperz.ByteArray_hex = function (args) {
712 this._value = "";
713
714 if (typeof(args) != 'undefined') {
715 if (args.constructor == Array) {
716 this.appendBytes(args);
717 } else if (args.constructor == String) {
718 if (args.indexOf("0x") == 0) {
719 varvalue;
720
721 value = args.substring(2).toLowerCase();
722 if (/[0123456789abcdef]* /.test(value)) { the space in the regexp shoud be removed if the code is activate
723 if ((value.length % 2) == 0) {
724 this._value = value;
725 } else {
726 this._value = "0" + value;
727 }
728 } else {
729MochiKit.Logging.logError("Clipperz.ByteArray should be inizialized with an hex string.");
730 throw Clipperz.ByteArray.exception.InvalidValue;
731 }
732 } else {
733 varvalue;
734 vari,c;
735
736 c = args.length;
737 value = new Array(c);
738 for (i=0; i<c; i++) {
739 value.push(Clipperz.ByteArray.unicodeToUtf8HexString(args.charCodeAt(i)));
740 }
741
742 this._value = value.join("");
743 }
744 } else {
745 this.appendBytes(MochiKit.Base.extend(null, arguments));
746 }
747 }
748 return this;
749}
750
751Clipperz.ByteArray_hex.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), {
752
753 //-------------------------------------------------------------------------
754
755 'toString': function() {
756 return "Clipperz.ByteArray_hex";
757 },
758
759 //-------------------------------------------------------------------------
760
761 'clone': function() {
762 var result;
763
764 result = this.newInstance();
765 result._value = this._value;
766
767 return result;
768 },
769
770 //-------------------------------------------------------------------------
771
772 'newInstance': function() {
773 return new Clipperz.ByteArray_hex();
774 },
775
776 //-------------------------------------------------------------------------
777
778 'reset': function() {
779 this._value = "";
780 },
781
782 //-------------------------------------------------------------------------
783
784 'length': function() {
785 return (this._value.length / 2);
786 },
787
788 //-------------------------------------------------------------------------
789
790 'appendBlock': function(aBlock) {
791 this._value = this._value += aBlock.toHexString().substring(2);
792
793 return this;
794 },
795
796 //-------------------------------------------------------------------------
797
798 'appendByte': function(aValue) {
799 if (aValue != null) {
800 this.checkByteValue(aValue);
801 this._value += Clipperz.ByteArray.byteToHex(aValue);
802 }
803
804 return this;
805 },
806
807 //-------------------------------------------------------------------------
808
809 'byteAtIndex': function(anIndex) {
810 return parseInt(this._value.substr(anIndex*2, 2), 16);
811 },
812
813 'setByteAtIndex': function(aValue, anIndex) {
814 varmissingBytes;
815
816 this.checkByteValue(aValue);
817
818 missingBytes = anIndex - this.length();
819
820 if (missingBytes < 0) {
821 varcurrentValue;
822 varfirstCutIndex;
823 var secondCutIndex;
824
825 firstCutIndex = anIndex * 2;
826 secondCutIndex = firstCutIndex + 2;
827 currentValue = this._value;
828 this._value =currentValue.substring(0, firstCutIndex) +
829 Clipperz.ByteArray.byteToHex(aValue) +
830 currentValue.substring(secondCutIndex);
831 } else if (missingBytes == 0) {
832 this.appendByte(aValue);
833 } else {
834 var i,c;
835
836 c = missingBytes;
837 for (i=0; i<c; i++) {
838 this.appendByte(0);
839 }
840
841 this.appendByte(aValue);
842 }
843 },
844
845 //-------------------------------------------------------------------------
846
847 'toHexString': function() {
848 return "0x" + this._value;
849 },
850
851 //-------------------------------------------------------------------------
852
853 'split': function(aStartingIndex, anEndingIndex) {
854 var result;
855 varstartingIndex;
856 var endingIndex;
857
858 result = this.newInstance();
859
860 startingIndex = aStartingIndex * 2;
861 if (typeof(anEndingIndex) != 'undefined') {
862 endingIndex = anEndingIndex * 2;
863 result._value = this._value.substring(startingIndex, endingIndex);
864 } else {
865 result._value = this._value.substring(startingIndex);
866 }
867
868 return result;
869 },
870
871 //-------------------------------------------------------------------------
872
873 'arrayValues': function() {
874 var result;
875 var i,c;
876
877 c = this.length();
878
879 result = new Array(c);
880 for (i=0; i<c; i++) {
881 result[i] = this.byteAtIndex(i);
882 }
883
884 return result;
885 },
886
887 //-------------------------------------------------------------------------
888 __syntaxFix__: "syntax fix"
889});
890*/
891
892//=============================================================================
893//
894 //Clipperz.ByteArray_array
895//
896//=============================================================================
897
898Clipperz.ByteArray_array = function (args) {
899 if (typeof(args) != 'undefined') {
900 if (args.constructor == Array) {
901 this._value = args.slice(0);
902 } else if (args.constructor == String) {
903 var result;
904 varvalue;
905 var i, c;
906
907 if (args.indexOf("0x") == 0) {
908
909 value = args.substring(2).toLowerCase();
910 if (/[0123456789abcdef]*/.test(value)) {
911 if ((value.length % 2) != 0) {
912 value = "0" + value;
913 }
914 } else {
915MochiKit.Logging.logError("Clipperz.ByteArray should be inizialized with an hex string.");
916 throw Clipperz.ByteArray.exception.InvalidValue;
917 }
918
919 c = value.length / 2
920 result = new Array(c);
921 for (i=0; i<c; i++) {
922 result[i] = parseInt(value.substr(i*2, 2), 16);
923 }
924
925 } else {
926 var unicode;
927 result = [];
928 c = args.length;
929 for (i=0; i<c; i++) {
930 // Clipperz.ByteArray.pushUtf8BytesOfUnicodeChar(result, args.charCodeAt(i));
931
932 unicode = args.charCodeAt(i);
933 if (unicode <= 0x7f) { //0x00000000 - 0x0000007f -> 0xxxxxxx
934 result.push(unicode);
935 // } else if ((unicode >= 0x80) && (unicode <= 0x7ff)) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
936 } else if (unicode <= 0x7ff) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
937 result.push((unicode >> 6) | 0xc0);
938 result.push((unicode & 0x3F) | 0x80);
939 // } else if ((unicode >= 0x0800) && (unicode <= 0xffff)) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
940 } else if (unicode <= 0xffff) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
941 result.push((unicode >> 12) | 0xe0);
942 result.push(((unicode >> 6) & 0x3f) | 0x80);
943 result.push((unicode & 0x3f) | 0x80);
944 } else { //0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
945 result.push((unicode >> 18) | 0xf0);
946 result.push(((unicode >> 12) & 0x3f) | 0x80);
947 result.push(((unicode >> 6) & 0x3f) | 0x80);
948 result.push((unicode & 0x3f) | 0x80);
949 }
950 }
951 }
952
953
954 this._value = result;
955 } else {
956 this._value = [];
957 this.appendBytes(MochiKit.Base.extend(null, arguments));
958 }
959 } else {
960 this._value = [];
961 }
962
963 return this;
964}
965
966Clipperz.ByteArray_array.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), {
967
968 //-------------------------------------------------------------------------
969
970 'toString': function() {
971 return "Clipperz.ByteArray_array";
972 },
973
974 //-------------------------------------------------------------------------
975
976 'clone': function() {
977 var result;
978
979 result = this.newInstance();
980 result.appendBytes(this._value);
981
982 return result;
983 },
984
985 //-------------------------------------------------------------------------
986
987 'newInstance': function() {
988 return new Clipperz.ByteArray_array();
989 },
990
991 //-------------------------------------------------------------------------
992
993 'reset': function() {
994 this._value = [];
995 },
996
997 //-------------------------------------------------------------------------
998
999 'length': function() {
1000 return (this._value.length);
1001 },
1002
1003 //-------------------------------------------------------------------------
1004
1005 'appendBlock': function(aBlock) {
1006 MochiKit.Base.extend(this._value, aBlock._value);
1007
1008 return this;
1009 },
1010
1011 //-------------------------------------------------------------------------
1012
1013 'appendByte': function(aValue) {
1014 if (aValue != null) {
1015 this.checkByteValue(aValue);
1016 this._value.push(aValue);
1017 }
1018
1019 return this;
1020 },
1021
1022 //-------------------------------------------------------------------------
1023
1024 'byteAtIndex': function(anIndex) {
1025 return this._value[anIndex];
1026 },
1027
1028 'setByteAtIndex': function(aValue, anIndex) {
1029 varmissingBytes;
1030
1031 this.checkByteValue(aValue);
1032
1033 missingBytes = anIndex - this.length();
1034
1035 if (missingBytes < 0) {
1036 this._value[anIndex] = aValue;
1037 } else if (missingBytes == 0) {
1038 this._value.push(aValue);
1039 } else {
1040 var i,c;
1041
1042 c = missingBytes;
1043 for (i=0; i<c; i++) {
1044 this._value.push(0);
1045 }
1046
1047 this._value.push(aValue);
1048 }
1049 },
1050
1051 //-------------------------------------------------------------------------
1052
1053 'toHexString': function() {
1054 var result;
1055 var i, c;
1056
1057 result = "0x";
1058 c = this.length();
1059 for (i=0; i<c; i++) {
1060 result += Clipperz.ByteArray.byteToHex(this._value[i]);
1061 }
1062
1063 return result;
1064 },
1065
1066 //-------------------------------------------------------------------------
1067
1068 'split': function(aStartingIndex, anEndingIndex) {
1069 var result;
1070
1071 result = this.newInstance();
1072 result._value = this._value.slice(aStartingIndex, anEndingIndex ? anEndingIndex : this.length());
1073
1074 return result;
1075 },
1076
1077 //-------------------------------------------------------------------------
1078
1079 'arrayValues': function() {
1080 return this._value.slice(0);
1081 },
1082
1083 //-------------------------------------------------------------------------
1084 __syntaxFix__: "syntax fix"
1085});
1086
1087
1088
1089
1090
1091//=============================================================================
1092//
1093 //Clipperz.ByteArray_string
1094//
1095//=============================================================================
1096/*
1097Clipperz.ByteArray_string = function (args) {
1098 this._value = "";
1099
1100 if (typeof(args) != 'undefined') {
1101 if (args.constructor == Array) {
1102 this.appendBytes(args);
1103 } else if (args.constructor == String) {
1104 var result;
1105 varvalue;
1106 var i, c;
1107
1108 if (args.indexOf("0x") == 0) {
1109
1110 value = args.substring(2).toLowerCase();
1111 if (/[0123456789abcdef]* /.test(value)) { the space in the regexp shoud be removed if the code is activated
1112 if ((value.length % 2) != 0) {
1113 value = "0" + value;
1114 }
1115 } else {
1116MochiKit.Logging.logError("Clipperz.ByteArray should be inizialized with an hex string.");
1117 throw Clipperz.ByteArray.exception.InvalidValue;
1118 }
1119 } else {
1120 value = "";
1121 c = args.length;
1122 for (i=0; i<c; i++) {
1123 value += Clipperz.ByteArray.unicodeToUtf8HexString(args.charCodeAt(i));
1124 }
1125 }
1126
1127 c = value.length / 2
1128 for (i=0; i<c; i++) {
1129 this.appendByte(parseInt(value.substr(i*2, 2), 16));
1130 }
1131 } else {
1132 this.appendBytes(MochiKit.Base.extend(null, arguments));
1133 }
1134 }
1135
1136 return this;
1137}
1138
1139Clipperz.ByteArray_string.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), {
1140
1141 //-------------------------------------------------------------------------
1142
1143 'toString': function() {
1144 return "Clipperz.ByteArray_string";
1145 },
1146
1147 //-------------------------------------------------------------------------
1148
1149 'clone': function() {
1150 var result;
1151
1152 result = this.newInstance();
1153 result._value = this._value;
1154
1155 return result;
1156 },
1157
1158 //-------------------------------------------------------------------------
1159
1160 'newInstance': function() {
1161 return new Clipperz.ByteArray_string();
1162 },
1163
1164 //-------------------------------------------------------------------------
1165
1166 'reset': function() {
1167 this._value = "";
1168 },
1169
1170 //-------------------------------------------------------------------------
1171
1172 'length': function() {
1173 return (this._value.length);
1174 },
1175
1176 //-------------------------------------------------------------------------
1177
1178 'appendBlock': function(aBlock) {
1179 this._value += aBlock._value;
1180
1181 return this;
1182 },
1183
1184 //-------------------------------------------------------------------------
1185
1186 'appendByte': function(aValue) {
1187 if (aValue != null) {
1188 this.checkByteValue(aValue);
1189 this._value += String.fromCharCode(aValue);
1190 }
1191
1192 return this;
1193 },
1194
1195 //-------------------------------------------------------------------------
1196
1197 'byteAtIndex': function(anIndex) {
1198 return this._value.charCodeAt(anIndex);
1199 },
1200
1201 'setByteAtIndex': function(aValue, anIndex) {
1202 varmissingBytes;
1203
1204 this.checkByteValue(aValue);
1205
1206 missingBytes = anIndex - this.length();
1207
1208 if (missingBytes < 0) {
1209 this._value = this._value.substring(0, anIndex) + String.fromCharCode(aValue) + this._value.substring(anIndex + 1);
1210 } else if (missingBytes == 0) {
1211 this.appendByte(aValue);
1212 } else {
1213 var i,c;
1214
1215 c = missingBytes;
1216 for (i=0; i<c; i++) {
1217 this.appendByte(0);
1218 }
1219
1220 this.appendByte(aValue);
1221 }
1222 },
1223
1224 //-------------------------------------------------------------------------
1225
1226 'toHexString': function() {
1227 var result;
1228 var i, c;
1229
1230 result = "0x";
1231 c = this.length();
1232 for (i=0; i<c; i++) {
1233 result += Clipperz.ByteArray.byteToHex(this.byteAtIndex(i));
1234 }
1235
1236 return result;
1237 },
1238
1239 //-------------------------------------------------------------------------
1240
1241 'split': function(aStartingIndex, anEndingIndex) {
1242 var result;
1243 result = this.newInstance();
1244 result._value = this._value.substring(aStartingIndex, anEndingIndex ? anEndingIndex : this.length());
1245
1246 return result;
1247 },
1248
1249 //-------------------------------------------------------------------------
1250
1251 'arrayValues': function() {
1252 var result;
1253 var i,c;
1254
1255 c = this.length();
1256
1257 result = new Array(c);
1258 for (i=0; i<c; i++) {
1259 result[i] = this.byteAtIndex(i);
1260 }
1261
1262 return result;
1263 },
1264
1265 //-------------------------------------------------------------------------
1266 __syntaxFix__: "syntax fix"
1267});
1268*/
1269
1270//=============================================================================
1271//
1272 //Clipperz.ByteArray
1273//
1274//=============================================================================
1275
1276Clipperz.ByteArray = Clipperz.ByteArray_array;
1277//Clipperz.ByteArray = Clipperz.ByteArray_string;
1278//Clipperz.ByteArray = Clipperz.ByteArray_hex;
1279
1280//#############################################################################
1281
1282Clipperz.ByteArray.byteToHex = function(aByte) {
1283 return ((aByte < 16) ? "0" : "") + aByte.toString(16);
1284}
1285
1286
1287Clipperz.ByteArray.unicodeToUtf8HexString = function(aUnicode) {
1288 var result;
1289 varself;
1290
1291 self = Clipperz.ByteArray;
1292
1293 if (aUnicode <= 0x7f) { //0x00000000 - 0x0000007f -> 0xxxxxxx
1294 result = self.byteToHex(aUnicode);
1295 // } else if ((aUnicode >= 0x80) && (aUnicode <= 0x7ff)) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
1296 } else if (aUnicode <= 0x7ff) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
1297 result = self.byteToHex((aUnicode >> 6) | 0xc0);
1298 result += self.byteToHex((aUnicode & 0x3F) | 0x80);
1299 // } else if ((aUnicode >= 0x0800) && (aUnicode <= 0xffff)) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
1300 } else if (aUnicode <= 0xffff) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
1301 result = self.byteToHex((aUnicode >> 12) | 0xe0);
1302 result += self.byteToHex(((aUnicode >> 6) & 0x3f) | 0x80);
1303 result += self.byteToHex((aUnicode & 0x3f) | 0x80);
1304 } else { //0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
1305 result = self.byteToHex((aUnicode >> 18) | 0xf0);
1306 result += self.byteToHex(((aUnicode >> 12) & 0x3f) | 0x80);
1307 result += self.byteToHex(((aUnicode >> 6) & 0x3f) | 0x80);
1308 result += self.byteToHex((aUnicode & 0x3f) | 0x80);
1309 }
1310
1311 return result;
1312}
1313
1314Clipperz.ByteArray.pushUtf8BytesOfUnicodeChar = function(anArray, aUnicode) {
1315 varself;
1316
1317 self = Clipperz.ByteArray;
1318
1319 if (aUnicode <= 0x7f) { //0x00000000 - 0x0000007f -> 0xxxxxxx
1320 anArray.push(aUnicode);
1321 // } else if ((aUnicode >= 0x80) && (aUnicode <= 0x7ff)) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
1322 } else if (aUnicode <= 0x7ff) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
1323 anArray.push((aUnicode >> 6) | 0xc0);
1324 anArray.push((aUnicode & 0x3F) | 0x80);
1325 // } else if ((aUnicode >= 0x0800) && (aUnicode <= 0xffff)) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
1326 } else if (aUnicode <= 0xffff) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
1327 anArray.push((aUnicode >> 12) | 0xe0);
1328 anArray.push(((aUnicode >> 6) & 0x3f) | 0x80);
1329 anArray.push((aUnicode & 0x3f) | 0x80);
1330 } else { //0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
1331 anArray.push((aUnicode >> 18) | 0xf0);
1332 anArray.push(((aUnicode >> 12) & 0x3f) | 0x80);
1333 anArray.push(((aUnicode >> 6) & 0x3f) | 0x80);
1334 anArray.push((aUnicode & 0x3f) | 0x80);
1335 }
1336}
1337
1338Clipperz.ByteArray.prefixMatchingBits = function (aValue, bValue) {
1339 varresult;
1340 var i,c;
1341
1342 result = 0;
1343
1344 c = Math.min(aValue.length(), bValue.length());
1345 i = 0;
1346 while (i<c && (aValue.byteAtIndex(i) == bValue.byteAtIndex(i))) {
1347 result += 8;
1348 i++;
1349 }
1350
1351 if (i<c) {
1352 varxorValue;
1353
1354 xorValue = (aValue.byteAtIndex(i) ^ bValue.byteAtIndex(i));
1355
1356 if (xorValue >= 128) {
1357 result += 0;
1358 } else if (xorValue >= 64) {
1359 result += 1;
1360 } else if (xorValue >= 32) {
1361 result += 2;
1362 } else if (xorValue >= 16) {
1363 result += 3;
1364 } else if (xorValue >= 8) {
1365 result += 4;
1366 } else if (xorValue >= 4) {
1367 result += 5;
1368 } else if (xorValue >= 2) {
1369 result += 6;
1370 } else if (xorValue >= 1) {
1371 result += 7;
1372 }
1373 }
1374
1375 return result;
1376};
1377
1378Clipperz.ByteArray.exception = {
1379 InvalidValue: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue")
1380};
1381
1382//#############################################################################
1383
1384Clipperz.ByteArrayIterator = function(args) {
1385 args = args || {};
1386
1387 this._byteArray = args.byteArray;
1388 this._blockSize = args.blockSize;
1389 this._finalPadding = args.finalPadding || false;
1390
1391 this._currentPosition = 0;
1392
1393 return this;
1394}
1395
1396Clipperz.ByteArrayIterator.prototype = MochiKit.Base.update(null, {
1397
1398 //-------------------------------------------------------------------------
1399
1400 'toString': function() {
1401 return "Clipperz.ByteArrayIterator";
1402 },
1403
1404 //-------------------------------------------------------------------------
1405
1406 'blockSize': function() {
1407 var result;
1408
1409 result = this._blockSize;
1410
1411 return result;
1412 },
1413
1414 //-------------------------------------------------------------------------
1415
1416 'currentPosition': function() {
1417 var result;
1418
1419 result = this._currentPosition;
1420
1421 return result;
1422 },
1423
1424 //-------------------------------------------------------------------------
1425
1426 'byteArray': function() {
1427 var result;
1428
1429 result = this._byteArray;
1430
1431 return result;
1432 },
1433
1434 //-------------------------------------------------------------------------
1435
1436 'finalPadding': function() {
1437 var result;
1438
1439 result = this._finalPadding;
1440
1441 return result;
1442 },
1443
1444 //-------------------------------------------------------------------------
1445
1446 'nextBlock': function() {
1447 var result;
1448 var currentPosition;
1449 varbyteArrayLength;
1450
1451 currentPosition = this._currentPosition;
1452 byteArrayLength = this.byteArray().length();
1453
1454 if (currentPosition < byteArrayLength) {
1455 var i,c;
1456
1457 c = this.blockSize();
1458 result = new Array(c);
1459 for (i=0; i<c; i++) {
1460 if (currentPosition < byteArrayLength) {
1461 result[i] = this.byteArray().byteAtIndex(currentPosition);
1462 currentPosition++;
1463 } else if (this.finalPadding() == true) {
1464 result[i] = 0;
1465 }
1466 }
1467
1468 this._currentPosition = currentPosition;
1469 } else {
1470 result = null;
1471 }
1472
1473 return result;
1474 },
1475
1476 //-------------------------------------------------------------------------
1477
1478 'nextBlockArray': function() {
1479 var result;
1480 var nextBlock;
1481
1482 nextBlock = this.nextBlock();
1483
1484 if (nextBlock != null) {
1485 result = new Clipperz.ByteArray(nextBlock);
1486 } else {
1487 result = null;
1488 }
1489
1490 return result;
1491 },
1492
1493 //-----------------------------------------------------------------------------
1494 __syntaxFix__: "syntax fix"
1495
1496});
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Curve.js b/frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Curve.js
new file mode 100644
index 0000000..9c61bab
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Curve.js
@@ -0,0 +1,545 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
26//}
27if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
28if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
29
30Clipperz.Crypto.ECC.BinaryField.Curve = function(args) {
31 args = args || {};
32
33 this._modulus = args.modulus;
34
35 this._a = args.a;
36 this._b = args.b;
37 this._G = args.G;
38 this._r = args.r;
39 this._h = args.h;
40
41 this._finiteField = null;
42
43 return this;
44}
45
46Clipperz.Crypto.ECC.BinaryField.Curve.prototype = MochiKit.Base.update(null, {
47
48 'asString': function() {
49 return "Clipperz.Crypto.ECC.BinaryField.Curve";
50 },
51
52 //-----------------------------------------------------------------------------
53
54 'modulus': function() {
55 return this._modulus;
56 },
57
58 'a': function() {
59 return this._a;
60 },
61
62 'b': function() {
63 return this._b;
64 },
65
66 'G': function() {
67 return this._G;
68 },
69
70 'r': function() {
71 return this._r;
72 },
73
74 'h': function() {
75 return this._h;
76 },
77
78 //-----------------------------------------------------------------------------
79
80 'finiteField': function() {
81 if (this._finiteField == null) {
82 this._finiteField = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:this.modulus()})
83 }
84
85 return this._finiteField;
86 },
87
88 //-----------------------------------------------------------------------------
89
90 'negate': function(aPointA) {
91 var result;
92
93 result = new Clipperz.Crypto.ECC.Point({x:aPointA.x(), y:this.finiteField().add(aPointA.y(), aPointA.x())})
94
95 return result;
96 },
97
98 //-----------------------------------------------------------------------------
99
100 'add': function(aPointA, aPointB) {
101 var result;
102
103//console.log(">>> ECC.BinaryField.Curve.add");
104 if (aPointA.isZero()) {
105//console.log("--- pointA == zero");
106 result = aPointB;
107 } else if (aPointB.isZero()) {
108//console.log("--- pointB == zero");
109 result = aPointA;
110 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) {
111//console.log("compare A.x - B.x: ", aPointA.x().compare(aPointB.x()));
112//console.log("compare A.y - B.y: ", (aPointA.y().compare(aPointB.y()) != 0));
113//console.log("compare B.x.isZero(): ", aPointB.x().isZero());
114
115//console.log("--- result = zero");
116 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
117 } else {
118//console.log("--- result = ELSE");
119 varf2m;
120 var x, y;
121 var lambda;
122 var aX, aY, bX, bY;
123
124 aX = aPointA.x()._value;
125 aY = aPointA.y()._value;
126 bX = aPointB.x()._value;
127 bY = aPointB.y()._value;
128
129 f2m = this.finiteField();
130
131 if (aPointA.x().compare(aPointB.x()) != 0) {
132//console.log(" a.x != b.x");
133 lambda =f2m._fastMultiply(
134 f2m._add(aY, bY),
135 f2m._inverse(f2m._add(aX, bX))
136 );
137 x = f2m._add(this.a()._value, f2m._square(lambda));
138 f2m._overwriteAdd(x, lambda);
139 f2m._overwriteAdd(x, aX);
140 f2m._overwriteAdd(x, bX);
141 } else {
142//console.log(" a.x == b.x");
143 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX)));
144//console.log(" lambda: " + lambda.asString(16));
145 x = f2m._add(this.a()._value, f2m._square(lambda));
146//console.log(" x (step 1): " + x.asString(16));
147 f2m._overwriteAdd(x, lambda);
148//console.log(" x (step 2): " + x.asString(16));
149 }
150
151 y = f2m._fastMultiply(f2m._add(bX, x), lambda);
152//console.log(" y (step 1): " + y.asString(16));
153 f2m._overwriteAdd(y, x);
154//console.log(" y (step 2): " + y.asString(16));
155 f2m._overwriteAdd(y, bY);
156//console.log(" y (step 3): " + y.asString(16));
157
158 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)})
159 }
160//console.log("<<< ECC.BinaryField.Curve.add");
161
162 return result;
163 },
164
165 //-----------------------------------------------------------------------------
166
167 'addTwice': function(aPointA) {
168 return this.add(aPointA, aPointA);
169 },
170
171 //-----------------------------------------------------------------------------
172
173 'overwriteAdd': function(aPointA, aPointB) {
174 if (aPointA.isZero()) {
175 // result = aPointB;
176 aPointA._x._value = aPointB._x._value;
177 aPointA._y._value = aPointB._y._value;
178 } else if (aPointB.isZero()) {
179 // result = aPointA;
180 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) {
181 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
182 aPointA._x = Clipperz.Crypto.ECC.BinaryField.Value.O;
183 aPointA._y = Clipperz.Crypto.ECC.BinaryField.Value.O;
184 } else {
185 varf2m;
186 var x, y;
187 var lambda;
188 var aX, aY, bX, bY;
189
190 aX = aPointA.x()._value;
191 aY = aPointA.y()._value;
192 bX = aPointB.x()._value;
193 bY = aPointB.y()._value;
194
195 f2m = this.finiteField();
196
197 if (aPointA.x().compare(aPointB.x()) != 0) {
198//console.log(" a.x != b.x");
199 lambda =f2m._fastMultiply(
200 f2m._add(aY, bY),
201 f2m._inverse(f2m._add(aX, bX))
202 );
203 x = f2m._add(this.a()._value, f2m._square(lambda));
204 f2m._overwriteAdd(x, lambda);
205 f2m._overwriteAdd(x, aX);
206 f2m._overwriteAdd(x, bX);
207 } else {
208//console.log(" a.x == b.x");
209 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX)));
210//console.log(" lambda: " + lambda.asString(16));
211 x = f2m._add(this.a()._value, f2m._square(lambda));
212//console.log(" x (step 1): " + x.asString(16));
213 f2m._overwriteAdd(x, lambda);
214//console.log(" x (step 2): " + x.asString(16));
215 }
216
217 y = f2m._fastMultiply(f2m._add(bX, x), lambda);
218//console.log(" y (step 1): " + y.asString(16));
219 f2m._overwriteAdd(y, x);
220//console.log(" y (step 2): " + y.asString(16));
221 f2m._overwriteAdd(y, bY);
222//console.log(" y (step 3): " + y.asString(16));
223
224 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)})
225 aPointA._x._value = x;
226 aPointA._y._value = y;
227
228 }
229//console.log("<<< ECC.BinaryField.Curve.add");
230
231 return result;
232 },
233
234 //-----------------------------------------------------------------------------
235
236 'multiply': function(aValue, aPoint) {
237 var result;
238
239//console.profile();
240 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
241
242 if (aValue.isZero() == false) {
243 var k, Q;
244 var i;
245 var countIndex; countIndex = 0;
246
247 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) {
248 k = aValue;
249 Q = aPoint;
250 } else {
251MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!");
252 k = aValue.negate();
253 Q = this.negate(aPoint);
254 }
255
256//console.log("k: " + k.toString(16));
257//console.log("k.bitSize: " + k.bitSize());
258 for (i=k.bitSize()-1; i>=0; i--) {
259 result = this.add(result, result);
260 // this.overwriteAdd(result, result);
261 if (k.isBitSet(i)) {
262 result = this.add(result, Q);
263 // this.overwriteAdd(result, Q);
264 }
265
266 // if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++;
267 }
268 }
269//console.profileEnd();
270
271 return result;
272 },
273
274 //-----------------------------------------------------------------------------
275
276 'deferredMultiply': function(aValue, aPoint) {
277 var deferredResult;
278 var result;
279
280MochiKit.Logging.logDebug(">>> deferredMultiply - value: " + aValue + ", point: " + aPoint);
281//console.profile("ECC.Curve.multiply");
282 deferredResult = new MochiKit.Async.Deferred();
283//deferredResult.addCallback(function(res) {console.profile("ECC.Curve.deferredMultiply"); return res;} );
284//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 1: " + res); return res;});
285
286 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
287//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 2: " + res); return res;});
288
289 if (aValue.isZero() == false) {
290 var k, Q;
291 var i;
292 var countIndex; countIndex = 0;
293
294 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) {
295 k = aValue;
296 Q = aPoint;
297 } else {
298MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!");
299 k = aValue.negate();
300 Q = this.negate(aPoint);
301 }
302
303//console.log("k: " + k.toString(16));
304//console.log("k.bitSize: " + k.bitSize());
305
306//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 3: " + res); return res;});
307 for (i=k.bitSize()-1; i>=0; i--) {
308//MochiKit.Logging.logDebug("====> " + i);
309//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4 > i = " + i + ": " + res); return res;});
310 deferredResult.addMethod(this, "addTwice");
311 //# result = this.add(result, result);
312 // this.overwriteAdd(result, result);
313 if (k.isBitSet(i)) {
314 deferredResult.addMethod(this, "add", Q);
315 //# result = this.add(result, Q);
316 // this.overwriteAdd(result, Q);
317 }
318 if (i%20 == 0) {deferredResult.addCallback(MochiKit.Async.wait, 0.1);}
319
320 // if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++;
321//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4 < i = " + i + ": " + res); return res;});
322 }
323//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4: " + res); return res;});
324 }
325//#console.profileEnd();
326//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 5: " + res); return res;});
327//deferredResult.addBoth(function(res) {console.profileEnd(); return res;});
328//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 6: " + res); return res;});
329 deferredResult.callback(result);
330
331 //# return result;
332 return deferredResult;
333 },
334
335 //-----------------------------------------------------------------------------
336 __syntaxFix__: "syntax fix"
337});
338
339
340//#############################################################################
341
342Clipperz.Crypto.ECC.StandardCurves = {};
343
344MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, {
345/*
346 '_K571': null,
347 'K571': function() {
348 if (Clipperz.Crypto.ECC.StandardCurves._K571 == null) {
349 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
350 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16),
351 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16),
352 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
353 G: new Clipperz.Crypto.ECC.BinaryField.Point({
354 x: new Clipperz.Crypto.ECC.BinaryField.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16),
355 y: new Clipperz.Crypto.ECC.BinaryField.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16)
356 }),
357 r: new Clipperz.Crypto.ECC.BinaryField.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16),
358 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16)
359 });
360 }
361
362 return Clipperz.Crypto.ECC.StandardCurves._K571;
363 },
364
365
366
367 '_K283': null,
368 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
369 if (Clipperz.Crypto.ECC.StandardCurves._K283 == null) {
370 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
371 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
372 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16),
373 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
374 G: new Clipperz.Crypto.ECC.BinaryField.Point({
375 x: new Clipperz.Crypto.ECC.BinaryField.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16),
376 y: new Clipperz.Crypto.ECC.BinaryField.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16)
377 }),
378 r: new Clipperz.Crypto.ECC.BinaryField.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16),
379 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16)
380 });
381 }
382
383 return Clipperz.Crypto.ECC.StandardCurves._K283;
384 },
385*/
386 //-----------------------------------------------------------------------------
387
388 '_B571': null,
389 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
390 if (Clipperz.Crypto.ECC.StandardCurves._B571 == null) {
391 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
392 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16),
393 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
394 b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a', 16),
395 G: new Clipperz.Crypto.ECC.BinaryField.Point({
396 x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16),
397 y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16)
398 }),
399 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16),
400 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
401
402 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
403 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
404 });
405
406 //-----------------------------------------------------------------------------
407 //
408 //Guide to Elliptic Curve Cryptography
409 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
410 //- Pag: 56, Alorithm 2.45 (with a typo!!!)
411 //
412 //-----------------------------------------------------------------------------
413 //
414 // http://www.milw0rm.com/papers/136
415 //
416 // -------------------------------------------------------------------------
417 // Polynomial Reduction Algorithm Modulo f571
418 // -------------------------------------------------------------------------
419 //
420 // Input: Polynomial p(x) of degree 1140 or less, stored as
421 // an array of 2T machinewords.
422 // Output: p(x) mod f571(x)
423 //
424 // FOR i = T-1, ..., 0 DO
425 // SET X := P[i+T]
426 // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15)
427 // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27)
428 //
429 // SET X := P[T-1] >> 27
430 // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10)
431 // P[T-1] := P[T-1] & 0x07ffffff
432 //
433 // RETURN P[T-1],...,P[0]
434 //
435 // -------------------------------------------------------------------------
436 //
437 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module;
438 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) {
439 varresult;
440
441 if (aValue.bitSize() > 1140) {
442 MochiKit.Logging.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation");
443 result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue);
444 } else {
445 varC, T;
446 var i;
447
448//console.log(">>> binaryField.finiteField.(improved)module");
449 // C = aValue.value().slice(0);
450 C = aValue._value.slice(0);
451 for (i=35; i>=18; i--) {
452 T = C[i];
453 C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0);
454 C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0);
455 }
456 T = (C[17] >>> 27);
457 C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0);
458 C[17] = (C[17] & 0x07ffffff);
459
460 for(i=18; i<=35; i++) {
461 C[i] = 0;
462 }
463
464 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
465//console.log("<<< binaryField.finiteField.(improved)module");
466 }
467
468 return result;
469 };
470 }
471
472 return Clipperz.Crypto.ECC.StandardCurves._B571;
473 },
474
475 //-----------------------------------------------------------------------------
476
477 '_B283': null,
478 'B283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
479 if (Clipperz.Crypto.ECC.StandardCurves._B283 == null) {
480 Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
481 // modulus: new Clipperz.Crypto.ECC.BinaryField.Value('10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
482 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
483 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
484 b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16),
485 G: new Clipperz.Crypto.ECC.BinaryField.Point({
486 x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16),
487 y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16)
488 }),
489 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16),
490 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
491
492 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
493 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
494 });
495
496 //-----------------------------------------------------------------------------
497 //
498 //Guide to Elliptic Curve Cryptography
499 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
500 //- Pag: 56, Alorithm 2.43
501 //
502 //-----------------------------------------------------------------------------
503 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module;
504 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) {
505 varresult;
506
507 if (aValue.bitSize() > 564) {
508 MochiKit.Logging.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation");
509 result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue);
510 } else {
511 varC, T;
512 var i;
513
514//console.log(">>> binaryField.finiteField.(improved)module");
515 C = aValue._value.slice(0);
516 for (i=17; i>=9; i--) {
517 T = C[i];
518 C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0);
519 C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0);
520 }
521 T = (C[8] >>> 27);
522 C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0);
523 C[8] = (C[8] & 0x07ffffff);
524
525 for(i=9; i<=17; i++) {
526 C[i] = 0;
527 }
528
529 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
530//console.log("<<< binaryField.finiteField.(improved)module");
531 }
532
533 return result;
534 };
535 }
536
537 return Clipperz.Crypto.ECC.StandardCurves._B283;
538 },
539
540 //-----------------------------------------------------------------------------
541 __syntaxFix__: "syntax fix"
542});
543
544//#############################################################################
545
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/FiniteField.js b/frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/FiniteField.js
new file mode 100644
index 0000000..4d1ca67
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/FiniteField.js
@@ -0,0 +1,521 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
26//}
27if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
28if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
29
30Clipperz.Crypto.ECC.BinaryField.FiniteField = function(args) {
31 args = args || {};
32 this._modulus = args.modulus;
33
34 return this;
35}
36
37Clipperz.Crypto.ECC.BinaryField.FiniteField.prototype = MochiKit.Base.update(null, {
38
39 'asString': function() {
40 return "Clipperz.Crypto.ECC.BinaryField.FiniteField (" + this.modulus().asString() + ")";
41 },
42
43 //-----------------------------------------------------------------------------
44
45 'modulus': function() {
46 return this._modulus;
47 },
48
49 //-----------------------------------------------------------------------------
50
51 '_module': function(aValue) {
52 varresult;
53 var modulusComparison;
54//console.log(">>> binaryField.finiteField.(standard)module");
55
56 modulusComparison = Clipperz.Crypto.ECC.BinaryField.Value._compare(aValue, this.modulus()._value);
57
58 if (modulusComparison < 0) {
59 result = aValue;
60 } else if (modulusComparison == 0) {
61 result = [0];
62 } else {
63 var modulusBitSize;
64 var resultBitSize;
65
66 result = aValue;
67
68 modulusBitSize = this.modulus().bitSize();
69 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result);
70 while (resultBitSize >= modulusBitSize) {
71 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this.modulus()._value, resultBitSize - modulusBitSize));
72 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result);
73 }
74 }
75//console.log("<<< binaryField.finiteField.(standard)module");
76
77 return result;
78 },
79
80 'module': function(aValue) {
81 return new Clipperz.Crypto.ECC.BinaryField.Value(this._module(aValue._value.slice(0)));
82 },
83
84 //-----------------------------------------------------------------------------
85
86 '_add': function(a, b) {
87 return Clipperz.Crypto.ECC.BinaryField.Value._xor(a, b);
88 },
89
90 '_overwriteAdd': function(a, b) {
91 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(a, b);
92 },
93
94 'add': function(a, b) {
95 return new Clipperz.Crypto.ECC.BinaryField.Value(this._add(a._value, b._value));
96 },
97
98 //-----------------------------------------------------------------------------
99
100 'negate': function(aValue) {
101 return aValue.clone();
102 },
103
104 //-----------------------------------------------------------------------------
105
106 '_multiply': function(a, b) {
107 var result;
108 var valueToXor;
109 var i,c;
110
111 result = [0];
112 valueToXor = b;
113 c = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(a);
114 for (i=0; i<c; i++) {
115 if (Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(a, i) === true) {
116 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, valueToXor);
117 }
118 valueToXor = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(valueToXor, 1);
119 }
120 result = this._module(result);
121
122 return result;
123 },
124
125 'multiply': function(a, b) {
126 return new Clipperz.Crypto.ECC.BinaryField.Value(this._multiply(a._value, b._value));
127 },
128
129 //-----------------------------------------------------------------------------
130
131 '_fastMultiply': function(a, b) {
132 var result;
133 var B;
134 var i,c;
135
136 result = [0];
137 B = b.slice(0); //Is this array copy avoidable?
138 c = 32;
139 for (i=0; i<c; i++) {
140 var ii, cc;
141
142 cc = a.length;
143 for (ii=0; ii<cc; ii++) {
144 if (((a[ii] >>> i) & 0x01) == 1) {
145 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, B, ii);
146 }
147 }
148
149 if (i < (c-1)) {
150 B = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(B, 1);
151 }
152 }
153 result = this._module(result);
154
155 return result;
156 },
157
158 'fastMultiply': function(a, b) {
159 return new Clipperz.Crypto.ECC.BinaryField.Value(this._fastMultiply(a._value, b._value));
160 },
161
162 //-----------------------------------------------------------------------------
163 //
164 //Guide to Elliptic Curve Cryptography
165 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
166 //- Pag: 49, Alorithm 2.34
167 //
168 //-----------------------------------------------------------------------------
169
170 '_square': function(aValue) {
171 var result;
172 var value;
173 var c,i;
174 var precomputedValues;
175
176 value = aValue;
177 result = new Array(value.length * 2);
178 precomputedValues = Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes;
179
180 c = value.length;
181 for (i=0; i<c; i++) {
182 result[i*2] = precomputedValues[(value[i] & 0x000000ff)];
183 result[i*2] |= ((precomputedValues[(value[i] & 0x0000ff00) >>> 8]) << 16);
184
185 result[i*2 + 1] = precomputedValues[(value[i] & 0x00ff0000) >>> 16];
186 result[i*2 + 1] |= ((precomputedValues[(value[i] & 0xff000000) >>> 24]) << 16);
187 }
188
189 return this._module(result);
190 },
191
192 'square': function(aValue) {
193 return new Clipperz.Crypto.ECC.BinaryField.Value(this._square(aValue._value));
194 },
195
196 //-----------------------------------------------------------------------------
197
198 '_inverse': function(aValue) {
199 varresult;
200 var b, c;
201 var u, v;
202
203 // b = Clipperz.Crypto.ECC.BinaryField.Value.I._value;
204 b = [1];
205 // c = Clipperz.Crypto.ECC.BinaryField.Value.O._value;
206 c = [0];
207 u = this._module(aValue);
208 v = this.modulus()._value.slice(0);
209
210 while (Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) > 1) {
211 varbitDifferenceSize;
212
213 bitDifferenceSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) - Clipperz.Crypto.ECC.BinaryField.Value._bitSize(v);
214 if (bitDifferenceSize < 0) {
215 var swap;
216
217 swap = u;
218 u = v;
219 v = swap;
220
221 swap = c;
222 c = b;
223 b = swap;
224
225 bitDifferenceSize = -bitDifferenceSize;
226 }
227
228 u = this._add(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize));
229 b = this._add(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize));
230 // this._overwriteAdd(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize));
231 // this._overwriteAdd(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize));
232 }
233
234 result = this._module(b);
235
236 return result;
237 },
238
239 'inverse': function(aValue) {
240 return new Clipperz.Crypto.ECC.BinaryField.Value(this._inverse(aValue._value));
241 },
242
243 //-----------------------------------------------------------------------------
244 __syntaxFix__: "syntax fix"
245});
246
247
248Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes = [
249 0x0000, // 0 = 0000 0000 -> 0000 0000 0000 0000
250 0x0001, // 1 = 0000 0001 -> 0000 0000 0000 0001
251 0x0004, // 2 = 0000 0010 -> 0000 0000 0000 0100
252 0x0005, // 3 = 0000 0011 -> 0000 0000 0000 0101
253 0x0010, // 4 = 0000 0100 -> 0000 0000 0001 0000
254 0x0011, // 5 = 0000 0101 -> 0000 0000 0001 0001
255 0x0014, // 6 = 0000 0110 -> 0000 0000 0001 0100
256 0x0015, // 7 = 0000 0111 -> 0000 0000 0001 0101
257 0x0040, // 8 = 0000 1000 -> 0000 0000 0100 0000
258 0x0041, // 9 = 0000 1001 -> 0000 0000 0100 0001
259 0x0044, // 10 = 0000 1010 -> 0000 0000 0100 0100
260 0x0045, // 11 = 0000 1011 -> 0000 0000 0100 0101
261 0x0050, // 12 = 0000 1100 -> 0000 0000 0101 0000
262 0x0051, // 13 = 0000 1101 -> 0000 0000 0101 0001
263 0x0054, // 14 = 0000 1110 -> 0000 0000 0101 0100
264 0x0055, // 15 = 0000 1111 -> 0000 0000 0101 0101
265
266 0x0100, // 16 = 0001 0000 -> 0000 0001 0000 0000
267 0x0101, // 17 = 0001 0001 -> 0000 0001 0000 0001
268 0x0104, // 18 = 0001 0010 -> 0000 0001 0000 0100
269 0x0105, // 19 = 0001 0011 -> 0000 0001 0000 0101
270 0x0110, // 20 = 0001 0100 -> 0000 0001 0001 0000
271 0x0111, // 21 = 0001 0101 -> 0000 0001 0001 0001
272 0x0114, // 22 = 0001 0110 -> 0000 0001 0001 0100
273 0x0115, // 23 = 0001 0111 -> 0000 0001 0001 0101
274 0x0140, // 24 = 0001 1000 -> 0000 0001 0100 0000
275 0x0141, // 25 = 0001 1001 -> 0000 0001 0100 0001
276 0x0144, // 26 = 0001 1010 -> 0000 0001 0100 0100
277 0x0145, // 27 = 0001 1011 -> 0000 0001 0100 0101
278 0x0150, // 28 = 0001 1100 -> 0000 0001 0101 0000
279 0x0151, // 28 = 0001 1101 -> 0000 0001 0101 0001
280 0x0154, // 30 = 0001 1110 -> 0000 0001 0101 0100
281 0x0155, // 31 = 0001 1111 -> 0000 0001 0101 0101
282
283 0x0400, // 32 = 0010 0000 -> 0000 0100 0000 0000
284 0x0401, // 33 = 0010 0001 -> 0000 0100 0000 0001
285 0x0404, // 34 = 0010 0010 -> 0000 0100 0000 0100
286 0x0405, // 35 = 0010 0011 -> 0000 0100 0000 0101
287 0x0410, // 36 = 0010 0100 -> 0000 0100 0001 0000
288 0x0411, // 37 = 0010 0101 -> 0000 0100 0001 0001
289 0x0414, // 38 = 0010 0110 -> 0000 0100 0001 0100
290 0x0415, // 39 = 0010 0111 -> 0000 0100 0001 0101
291 0x0440, // 40 = 0010 1000 -> 0000 0100 0100 0000
292 0x0441, // 41 = 0010 1001 -> 0000 0100 0100 0001
293 0x0444, // 42 = 0010 1010 -> 0000 0100 0100 0100
294 0x0445, // 43 = 0010 1011 -> 0000 0100 0100 0101
295 0x0450, // 44 = 0010 1100 -> 0000 0100 0101 0000
296 0x0451, // 45 = 0010 1101 -> 0000 0100 0101 0001
297 0x0454, // 46 = 0010 1110 -> 0000 0100 0101 0100
298 0x0455, // 47 = 0010 1111 -> 0000 0100 0101 0101
299
300 0x0500, // 48 = 0011 0000 -> 0000 0101 0000 0000
301 0x0501, // 49 = 0011 0001 -> 0000 0101 0000 0001
302 0x0504, // 50 = 0011 0010 -> 0000 0101 0000 0100
303 0x0505, // 51 = 0011 0011 -> 0000 0101 0000 0101
304 0x0510, // 52 = 0011 0100 -> 0000 0101 0001 0000
305 0x0511, // 53 = 0011 0101 -> 0000 0101 0001 0001
306 0x0514, // 54 = 0011 0110 -> 0000 0101 0001 0100
307 0x0515, // 55 = 0011 0111 -> 0000 0101 0001 0101
308 0x0540, // 56 = 0011 1000 -> 0000 0101 0100 0000
309 0x0541, // 57 = 0011 1001 -> 0000 0101 0100 0001
310 0x0544, // 58 = 0011 1010 -> 0000 0101 0100 0100
311 0x0545, // 59 = 0011 1011 -> 0000 0101 0100 0101
312 0x0550, // 60 = 0011 1100 -> 0000 0101 0101 0000
313 0x0551, // 61 = 0011 1101 -> 0000 0101 0101 0001
314 0x0554, // 62 = 0011 1110 -> 0000 0101 0101 0100
315 0x0555, // 63 = 0011 1111 -> 0000 0101 0101 0101
316
317 0x1000, // 64 = 0100 0000 -> 0001 0000 0000 0000
318 0x1001, // 65 = 0100 0001 -> 0001 0000 0000 0001
319 0x1004, // 66 = 0100 0010 -> 0001 0000 0000 0100
320 0x1005, // 67 = 0100 0011 -> 0001 0000 0000 0101
321 0x1010, // 68 = 0100 0100 -> 0001 0000 0001 0000
322 0x1011, // 69 = 0100 0101 -> 0001 0000 0001 0001
323 0x1014, // 70 = 0100 0110 -> 0001 0000 0001 0100
324 0x1015, // 71 = 0100 0111 -> 0001 0000 0001 0101
325 0x1040, // 72 = 0100 1000 -> 0001 0000 0100 0000
326 0x1041, // 73 = 0100 1001 -> 0001 0000 0100 0001
327 0x1044, // 74 = 0100 1010 -> 0001 0000 0100 0100
328 0x1045, // 75 = 0100 1011 -> 0001 0000 0100 0101
329 0x1050, // 76 = 0100 1100 -> 0001 0000 0101 0000
330 0x1051, // 77 = 0100 1101 -> 0001 0000 0101 0001
331 0x1054, // 78 = 0100 1110 -> 0001 0000 0101 0100
332 0x1055, // 79 = 0100 1111 -> 0001 0000 0101 0101
333
334 0x1100, // 80 = 0101 0000 -> 0001 0001 0000 0000
335 0x1101, // 81 = 0101 0001 -> 0001 0001 0000 0001
336 0x1104, // 82 = 0101 0010 -> 0001 0001 0000 0100
337 0x1105, // 83 = 0101 0011 -> 0001 0001 0000 0101
338 0x1110, // 84 = 0101 0100 -> 0001 0001 0001 0000
339 0x1111, // 85 = 0101 0101 -> 0001 0001 0001 0001
340 0x1114, // 86 = 0101 0110 -> 0001 0001 0001 0100
341 0x1115, // 87 = 0101 0111 -> 0001 0001 0001 0101
342 0x1140, // 88 = 0101 1000 -> 0001 0001 0100 0000
343 0x1141, // 89 = 0101 1001 -> 0001 0001 0100 0001
344 0x1144, // 90 = 0101 1010 -> 0001 0001 0100 0100
345 0x1145, // 91 = 0101 1011 -> 0001 0001 0100 0101
346 0x1150, // 92 = 0101 1100 -> 0001 0001 0101 0000
347 0x1151, // 93 = 0101 1101 -> 0001 0001 0101 0001
348 0x1154, // 94 = 0101 1110 -> 0001 0001 0101 0100
349 0x1155, // 95 = 0101 1111 -> 0001 0001 0101 0101
350
351 0x1400, // 96 = 0110 0000 -> 0001 0100 0000 0000
352 0x1401, // 97 = 0110 0001 -> 0001 0100 0000 0001
353 0x1404, // 98 = 0110 0010 -> 0001 0100 0000 0100
354 0x1405, // 99 = 0110 0011 -> 0001 0100 0000 0101
355 0x1410, //100 = 0110 0100 -> 0001 0100 0001 0000
356 0x1411, //101 = 0110 0101 -> 0001 0100 0001 0001
357 0x1414, //102 = 0110 0110 -> 0001 0100 0001 0100
358 0x1415, //103 = 0110 0111 -> 0001 0100 0001 0101
359 0x1440, //104 = 0110 1000 -> 0001 0100 0100 0000
360 0x1441, //105 = 0110 1001 -> 0001 0100 0100 0001
361 0x1444, //106 = 0110 1010 -> 0001 0100 0100 0100
362 0x1445, //107 = 0110 1011 -> 0001 0100 0100 0101
363 0x1450, //108 = 0110 1100 -> 0001 0100 0101 0000
364 0x1451, //109 = 0110 1101 -> 0001 0100 0101 0001
365 0x1454, //110 = 0110 1110 -> 0001 0100 0101 0100
366 0x1455, //111 = 0110 1111 -> 0001 0100 0101 0101
367
368 0x1500, //112 = 0111 0000 -> 0001 0101 0000 0000
369 0x1501, //113 = 0111 0001 -> 0001 0101 0000 0001
370 0x1504, //114 = 0111 0010 -> 0001 0101 0000 0100
371 0x1505, //115 = 0111 0011 -> 0001 0101 0000 0101
372 0x1510, //116 = 0111 0100 -> 0001 0101 0001 0000
373 0x1511, //117 = 0111 0101 -> 0001 0101 0001 0001
374 0x1514, //118 = 0111 0110 -> 0001 0101 0001 0100
375 0x1515, //119 = 0111 0111 -> 0001 0101 0001 0101
376 0x1540, //120 = 0111 1000 -> 0001 0101 0100 0000
377 0x1541, //121 = 0111 1001 -> 0001 0101 0100 0001
378 0x1544, //122 = 0111 1010 -> 0001 0101 0100 0100
379 0x1545, //123 = 0111 1011 -> 0001 0101 0100 0101
380 0x1550, //124 = 0111 1100 -> 0001 0101 0101 0000
381 0x1551, //125 = 0111 1101 -> 0001 0101 0101 0001
382 0x1554, //126 = 0111 1110 -> 0001 0101 0101 0100
383 0x1555, //127 = 0111 1111 -> 0001 0101 0101 0101
384
385 0x4000, //128 = 1000 0000 -> 0100 0000 0000 0000
386 0x4001, //129 = 1000 0001 -> 0100 0000 0000 0001
387 0x4004, //130 = 1000 0010 -> 0100 0000 0000 0100
388 0x4005, //131 = 1000 0011 -> 0100 0000 0000 0101
389 0x4010, //132 = 1000 0100 -> 0100 0000 0001 0000
390 0x4011, //133 = 1000 0101 -> 0100 0000 0001 0001
391 0x4014, //134 = 1000 0110 -> 0100 0000 0001 0100
392 0x4015, //135 = 1000 0111 -> 0100 0000 0001 0101
393 0x4040, //136 = 1000 1000 -> 0100 0000 0100 0000
394 0x4041, //137 = 1000 1001 -> 0100 0000 0100 0001
395 0x4044, //138 = 1000 1010 -> 0100 0000 0100 0100
396 0x4045, //139 = 1000 1011 -> 0100 0000 0100 0101
397 0x4050, //140 = 1000 1100 -> 0100 0000 0101 0000
398 0x4051, //141 = 1000 1101 -> 0100 0000 0101 0001
399 0x4054, //142 = 1000 1110 -> 0100 0000 0101 0100
400 0x4055, //143 = 1000 1111 -> 0100 0000 0101 0101
401
402 0x4100, //144 = 1001 0000 -> 0100 0001 0000 0000
403 0x4101, //145 = 1001 0001 -> 0100 0001 0000 0001
404 0x4104, //146 = 1001 0010 -> 0100 0001 0000 0100
405 0x4105, //147 = 1001 0011 -> 0100 0001 0000 0101
406 0x4110, //148 = 1001 0100 -> 0100 0001 0001 0000
407 0x4111, //149 = 1001 0101 -> 0100 0001 0001 0001
408 0x4114, //150 = 1001 0110 -> 0100 0001 0001 0100
409 0x4115, //151 = 1001 0111 -> 0100 0001 0001 0101
410 0x4140, //152 = 1001 1000 -> 0100 0001 0100 0000
411 0x4141, //153 = 1001 1001 -> 0100 0001 0100 0001
412 0x4144, //154 = 1001 1010 -> 0100 0001 0100 0100
413 0x4145, //155 = 1001 1011 -> 0100 0001 0100 0101
414 0x4150, //156 = 1001 1100 -> 0100 0001 0101 0000
415 0x4151, //157 = 1001 1101 -> 0100 0001 0101 0001
416 0x4154, //158 = 1001 1110 -> 0100 0001 0101 0100
417 0x4155, //159 = 1001 1111 -> 0100 0001 0101 0101
418
419 0x4400, //160 = 1010 0000 -> 0100 0100 0000 0000
420 0x4401, //161 = 1010 0001 -> 0100 0100 0000 0001
421 0x4404, //162 = 1010 0010 -> 0100 0100 0000 0100
422 0x4405, //163 = 1010 0011 -> 0100 0100 0000 0101
423 0x4410, //164 = 1010 0100 -> 0100 0100 0001 0000
424 0x4411, //165 = 1010 0101 -> 0100 0100 0001 0001
425 0x4414, //166 = 1010 0110 -> 0100 0100 0001 0100
426 0x4415, //167 = 1010 0111 -> 0100 0100 0001 0101
427 0x4440, //168 = 1010 1000 -> 0100 0100 0100 0000
428 0x4441, //169 = 1010 1001 -> 0100 0100 0100 0001
429 0x4444, //170 = 1010 1010 -> 0100 0100 0100 0100
430 0x4445, //171 = 1010 1011 -> 0100 0100 0100 0101
431 0x4450, //172 = 1010 1100 -> 0100 0100 0101 0000
432 0x4451, //173 = 1010 1101 -> 0100 0100 0101 0001
433 0x4454, //174 = 1010 1110 -> 0100 0100 0101 0100
434 0x4455, //175 = 1010 1111 -> 0100 0100 0101 0101
435
436 0x4500, //176 = 1011 0000 -> 0100 0101 0000 0000
437 0x4501, //177 = 1011 0001 -> 0100 0101 0000 0001
438 0x4504, //178 = 1011 0010 -> 0100 0101 0000 0100
439 0x4505, //179 = 1011 0011 -> 0100 0101 0000 0101
440 0x4510, //180 = 1011 0100 -> 0100 0101 0001 0000
441 0x4511, //181 = 1011 0101 -> 0100 0101 0001 0001
442 0x4514, //182 = 1011 0110 -> 0100 0101 0001 0100
443 0x4515, //183 = 1011 0111 -> 0100 0101 0001 0101
444 0x4540, //184 = 1011 1000 -> 0100 0101 0100 0000
445 0x4541, //185 = 1011 1001 -> 0100 0101 0100 0001
446 0x4544, //186 = 1011 1010 -> 0100 0101 0100 0100
447 0x4545, //187 = 1011 1011 -> 0100 0101 0100 0101
448 0x4550, //188 = 1011 1100 -> 0100 0101 0101 0000
449 0x4551, //189 = 1011 1101 -> 0100 0101 0101 0001
450 0x4554, //190 = 1011 1110 -> 0100 0101 0101 0100
451 0x4555, //191 = 1011 1111 -> 0100 0101 0101 0101
452
453 0x5000, //192 = 1100 0000 -> 0101 0000 0000 0000
454 0x5001, //193 = 1100 0001 -> 0101 0000 0000 0001
455 0x5004, //194 = 1100 0010 -> 0101 0000 0000 0100
456 0x5005, //195 = 1100 0011 -> 0101 0000 0000 0101
457 0x5010, //196 = 1100 0100 -> 0101 0000 0001 0000
458 0x5011, //197 = 1100 0101 -> 0101 0000 0001 0001
459 0x5014, //198 = 1100 0110 -> 0101 0000 0001 0100
460 0x5015, //199 = 1100 0111 -> 0101 0000 0001 0101
461 0x5040, //200 = 1100 1000 -> 0101 0000 0100 0000
462 0x5041, //201 = 1100 1001 -> 0101 0000 0100 0001
463 0x5044, //202 = 1100 1010 -> 0101 0000 0100 0100
464 0x5045, //203 = 1100 1011 -> 0101 0000 0100 0101
465 0x5050, //204 = 1100 1100 -> 0101 0000 0101 0000
466 0x5051, //205 = 1100 1101 -> 0101 0000 0101 0001
467 0x5054, //206 = 1100 1110 -> 0101 0000 0101 0100
468 0x5055, //207 = 1100 1111 -> 0101 0000 0101 0101
469
470 0x5100, //208 = 1101 0000 -> 0101 0001 0000 0000
471 0x5101, //209 = 1101 0001 -> 0101 0001 0000 0001
472 0x5104, //210 = 1101 0010 -> 0101 0001 0000 0100
473 0x5105, //211 = 1101 0011 -> 0101 0001 0000 0101
474 0x5110, //212 = 1101 0100 -> 0101 0001 0001 0000
475 0x5111, //213 = 1101 0101 -> 0101 0001 0001 0001
476 0x5114, //214 = 1101 0110 -> 0101 0001 0001 0100
477 0x5115, //215 = 1101 0111 -> 0101 0001 0001 0101
478 0x5140, //216 = 1101 1000 -> 0101 0001 0100 0000
479 0x5141, //217 = 1101 1001 -> 0101 0001 0100 0001
480 0x5144, //218 = 1101 1010 -> 0101 0001 0100 0100
481 0x5145, //219 = 1101 1011 -> 0101 0001 0100 0101
482 0x5150, //220 = 1101 1100 -> 0101 0001 0101 0000
483 0x5151, //221 = 1101 1101 -> 0101 0001 0101 0001
484 0x5154, //222 = 1101 1110 -> 0101 0001 0101 0100
485 0x5155, //223 = 1101 1111 -> 0101 0001 0101 0101
486
487 0x5400, //224 = 1110 0000 -> 0101 0100 0000 0000
488 0x5401, //225 = 1110 0001 -> 0101 0100 0000 0001
489 0x5404, //226 = 1110 0010 -> 0101 0100 0000 0100
490 0x5405, //227 = 1110 0011 -> 0101 0100 0000 0101
491 0x5410, //228 = 1110 0100 -> 0101 0100 0001 0000
492 0x5411, //229 = 1110 0101 -> 0101 0100 0001 0001
493 0x5414, //230 = 1110 0110 -> 0101 0100 0001 0100
494 0x5415, //231 = 1110 0111 -> 0101 0100 0001 0101
495 0x5440, //232 = 1110 1000 -> 0101 0100 0100 0000
496 0x5441, //233 = 1110 1001 -> 0101 0100 0100 0001
497 0x5444, //234 = 1110 1010 -> 0101 0100 0100 0100
498 0x5445, //235 = 1110 1011 -> 0101 0100 0100 0101
499 0x5450, //236 = 1110 1100 -> 0101 0100 0101 0000
500 0x5451, //237 = 1110 1101 -> 0101 0100 0101 0001
501 0x5454, //238 = 1110 1110 -> 0101 0100 0101 0100
502 0x5455, //239 = 1110 1111 -> 0101 0100 0101 0101
503
504 0x5500, //240 = 1111 0000 -> 0101 0101 0000 0000
505 0x5501, //241 = 1111 0001 -> 0101 0101 0000 0001
506 0x5504, //242 = 1111 0010 -> 0101 0101 0000 0100
507 0x5505, //243 = 1111 0011 -> 0101 0101 0000 0101
508 0x5510, //244 = 1111 0100 -> 0101 0101 0001 0000
509 0x5511, //245 = 1111 0101 -> 0101 0101 0001 0001
510 0x5514, //246 = 1111 0110 -> 0101 0101 0001 0100
511 0x5515, //247 = 1111 0111 -> 0101 0101 0001 0101
512 0x5540, //248 = 1111 1000 -> 0101 0101 0100 0000
513 0x5541, //249 = 1111 1001 -> 0101 0101 0100 0001
514 0x5544, //250 = 1111 1010 -> 0101 0101 0100 0100
515 0x5545, //251 = 1111 1011 -> 0101 0101 0100 0101
516 0x5550, //252 = 1111 1100 -> 0101 0101 0101 0000
517 0x5551, //253 = 1111 1101 -> 0101 0101 0101 0001
518 0x5554, //254 = 1111 1110 -> 0101 0101 0101 0100
519 0x5555 //255 = 1111 1111 -> 0101 0101 0101 0101
520
521]
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Point.js b/frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Point.js
new file mode 100644
index 0000000..fef3220
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Point.js
@@ -0,0 +1,62 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
26//}
27if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
28if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
29
30Clipperz.Crypto.ECC.BinaryField.Point = function(args) {
31 args = args || {};
32 this._x = args.x;
33 this._y = args.y;
34
35 return this;
36}
37
38Clipperz.Crypto.ECC.BinaryField.Point.prototype = MochiKit.Base.update(null, {
39
40 'asString': function() {
41 return "Clipperz.Crypto.ECC.BinaryField.Point (" + this.x() + ", " + this.y() + ")";
42 },
43
44 //-----------------------------------------------------------------------------
45
46 'x': function() {
47 return this._x;
48 },
49
50 'y': function() {
51 return this._y;
52 },
53
54 //-----------------------------------------------------------------------------
55
56 'isZero': function() {
57 return (this.x().isZero() && this.y().isZero())
58 },
59
60 //-----------------------------------------------------------------------------
61 __syntaxFix__: "syntax fix"
62});
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Value.js b/frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Value.js
new file mode 100644
index 0000000..b046039
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Value.js
@@ -0,0 +1,381 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
26//}
27if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
28if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
29if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
30if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
31
32Clipperz.Crypto.ECC.BinaryField.Value = function(aValue, aBase, aBitSize) {
33 if (aValue.constructor == String) {
34 varvalue;
35 varstringLength;
36 var numberOfWords;
37 vari,c;
38
39 if (aBase != 16) {
40 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase;
41 }
42
43 value = aValue.replace(/ /g, '');
44 stringLength = value.length;
45 numberOfWords = Math.ceil(stringLength / 8);
46 this._value = new Array(numberOfWords);
47
48 c = numberOfWords;
49 for (i=0; i<c; i++) {
50 varword;
51
52 if (i < (c-1)) {
53 word = parseInt(value.substr(stringLength-((i+1)*8), 8), 16);
54 } else {
55 word = parseInt(value.substr(0, stringLength-(i*8)), 16);
56 }
57
58 this._value[i] = word;
59 }
60 } else if (aValue.constructor == Array) {
61 var itemsToCopy;
62
63 itemsToCopy = aValue.length;
64 while (aValue[itemsToCopy - 1] == 0) {
65 itemsToCopy --;
66 }
67
68 this._value = aValue.slice(0, itemsToCopy);
69 } else if (aValue.constructor == Number) {
70 this._value = [aValue];
71 } else {
72 // throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType;
73 }
74
75 this._bitSize == aBitSize || null;
76
77 return this;
78}
79
80Clipperz.Crypto.ECC.BinaryField.Value.prototype = MochiKit.Base.update(null, {
81
82 'value': function() {
83 return this._value;
84 },
85
86 //-----------------------------------------------------------------------------
87
88 'wordSize': function() {
89 return this._value.length
90 },
91
92 //-----------------------------------------------------------------------------
93
94 'clone': function() {
95 return new Clipperz.Crypto.ECC.BinaryField.Value(this._value.slice(0), null, this._bitSize);
96 },
97
98 //-----------------------------------------------------------------------------
99
100 'isZero': function() {
101 return (this.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) == 0);
102 },
103
104 //-----------------------------------------------------------------------------
105
106 'asString': function(aBase) {
107 varresult;
108 var i,c;
109
110 if (aBase != 16) {
111 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase;
112 }
113
114 result = "";
115 c = this.wordSize();
116 for (i=0; i<c; i++) {
117 varwordAsString;
118
119 // wordAsString = ("00000000" + this.value()[i].toString(16));
120 wordAsString = ("00000000" + this._value[i].toString(16));
121 wordAsString = wordAsString.substring(wordAsString.length - 8);
122 result = wordAsString + result;
123 }
124
125 result = result.replace(/^(00)*/, "");
126
127 if (result == "") {
128 result = "0";
129 }
130
131 return result;
132 },
133
134 //-----------------------------------------------------------------------------
135
136 'shiftLeft': function(aNumberOfBitsToShift) {
137 //this method seems like it is never called. :-(
138 return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this._value, aNumberOfBitsToShift));
139 },
140
141 //-----------------------------------------------------------------------------
142
143 'bitSize': function() {
144 if (this._bitSize == null) {
145 this._bitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(this._value);
146 }
147
148 return this._bitSize;
149 },
150
151 //-----------------------------------------------------------------------------
152
153 'isBitSet': function(aBitPosition) {
154 return Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(this._value, aBitPosition);
155 },
156
157 //-----------------------------------------------------------------------------
158
159 'xor': function(aValue) {
160 return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(this._value, aValue._value));
161 },
162
163 //-----------------------------------------------------------------------------
164
165 'compare': function(aValue) {
166 return Clipperz.Crypto.ECC.BinaryField.Value._compare(this._value, aValue._value);
167 },
168
169 //-----------------------------------------------------------------------------
170 __syntaxFix__: "syntax fix"
171});
172
173Clipperz.Crypto.ECC.BinaryField.Value.O = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16);
174Clipperz.Crypto.ECC.BinaryField.Value.I = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16);
175
176Clipperz.Crypto.ECC.BinaryField.Value._xor = function(a, b, aFirstItemOffset) {
177 var result;
178 var resultSize;
179 var i,c;
180 var firstItemOffset;
181
182 firstItemOffset = aFirstItemOffset || 0;
183 resultSize = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset;
184
185 result = new Array(resultSize);
186
187 c = firstItemOffset;
188 for (i=0; i<c; i++) {
189 result[i] = a[i];
190 }
191
192 c = resultSize;
193 for (i=firstItemOffset; i<c; i++) {
194 result[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0);
195 }
196
197 return result;
198};
199
200Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor = function(a, b, aFirstItemOffset) {
201 var i,c;
202 var firstItemOffset;
203
204 firstItemOffset = aFirstItemOffset || 0;
205
206 c = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset;
207 for (i=firstItemOffset; i<c; i++) {
208 a[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0);
209 }
210};
211
212Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft = function(aWordArray, aNumberOfBitsToShift) {
213 var numberOfWordsToShift;
214 varnumberOfBitsToShift;
215 var result;
216 varoverflowValue;
217 var nextOverflowValue;
218 vari,c;
219
220 numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32);
221 numberOfBitsToShift = aNumberOfBitsToShift % 32;
222
223 result = new Array(aWordArray.length + numberOfWordsToShift);
224
225 c = numberOfWordsToShift;
226 for (i=0; i<c; i++) {
227 result[i] = 0;
228 }
229
230 overflowValue = 0;
231 nextOverflowValue = 0;
232
233 c = aWordArray.length;
234 for (i=0; i<c; i++) {
235 varvalue;
236 varresultWord;
237
238 // value = this.value()[i];
239 value = aWordArray[i];
240
241 if (numberOfBitsToShift > 0) {
242 nextOverflowValue = (value >>> (32 - numberOfBitsToShift));
243 value = value & (0xffffffff >>> numberOfBitsToShift);
244 resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0);
245 } else {
246 resultWord = value;
247 }
248
249 result[i+numberOfWordsToShift] = resultWord;
250 overflowValue = nextOverflowValue;
251 }
252
253 if (overflowValue != 0) {
254 result[aWordArray.length + numberOfWordsToShift] = overflowValue;
255 }
256
257 return result;
258};
259
260Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft = function(aWordArray, aNumberOfBitsToShift) {
261 var numberOfWordsToShift;
262 varnumberOfBitsToShift;
263 var result;
264 varoverflowValue;
265 vari,c;
266
267 numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32);
268 numberOfBitsToShift = aNumberOfBitsToShift % 32;
269
270 result = new Array(aWordArray.length + numberOfWordsToShift);
271
272 c = numberOfWordsToShift;
273 for (i=0; i<c; i++) {
274 result[i] = 0;
275 }
276
277 overflowValue = 0;
278 nextOverflowValue = 0;
279
280 c = aWordArray.length;
281 for (i=0; i<c; i++) {
282 varvalue;
283 varresultWord;
284
285 // value = this.value()[i];
286 value = aWordArray[i];
287
288 if (numberOfBitsToShift > 0) {
289 var nextOverflowValue;
290
291 nextOverflowValue = (value >>> (32 - numberOfBitsToShift));
292 value = value & (0xffffffff >>> numberOfBitsToShift);
293 resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0);
294 } else {
295 resultWord = value;
296 }
297
298 result[i+numberOfWordsToShift] = resultWord;
299 overflowValue = nextOverflowValue;
300 }
301
302 if (overflowValue != 0) {
303 result[aWordArray.length + numberOfWordsToShift] = overflowValue;
304 }
305
306 return result;
307};
308
309Clipperz.Crypto.ECC.BinaryField.Value._bitSize = function(aWordArray) {
310 varresult;
311 varnotNullElements;
312 var mostValuableWord;
313 var matchingBitsInMostImportantWord;
314 var mask;
315 var i,c;
316
317 notNullElements = aWordArray.length;
318
319 if ((aWordArray.length == 1) && (aWordArray[0] == 0)) {
320 result = 0;
321 } else {
322 notNullElements --;
323 while((notNullElements > 0) && (aWordArray[notNullElements] == 0)) {
324 notNullElements --;
325 }
326
327 result = notNullElements * 32;
328 mostValuableWord = aWordArray[notNullElements];
329
330 matchingBits = 32;
331 mask = 0x80000000;
332
333 while ((matchingBits > 0) && ((mostValuableWord & mask) == 0)) {
334 matchingBits --;
335 mask >>>= 1;
336 }
337
338 result += matchingBits;
339 }
340
341 return result;
342};
343
344Clipperz.Crypto.ECC.BinaryField.Value._isBitSet = function(aWordArray, aBitPosition) {
345 var result;
346 varbyteIndex;
347 var bitIndexInSelectedByte;
348
349 byteIndex = Math.floor(aBitPosition / 32);
350 bitIndexInSelectedByte = aBitPosition % 32;
351
352 if (byteIndex <= aWordArray.length) {
353 result = ((aWordArray[byteIndex] & (1 << bitIndexInSelectedByte)) != 0);
354 } else {
355 result = false;
356 }
357
358 return result;
359};
360
361Clipperz.Crypto.ECC.BinaryField.Value._compare = function(a,b) {
362 varresult;
363 var i,c;
364
365 result = MochiKit.Base.compare(a.length, b.length);
366
367 c = a.length;
368 for (i=0; (i<c) && (result==0); i++) {
369//console.log("compare[" + c + " - " + i + " - 1] " + this.value()[c-i-1] + ", " + aValue.value()[c-i-1]);
370 // result = MochiKit.Base.compare(this.value()[c-i-1], aValue.value()[c-i-1]);
371 result = MochiKit.Base.compare(a[c-i-1], b[c-i-1]);
372 }
373
374 return result;
375};
376
377
378Clipperz.Crypto.ECC.BinaryField.Value['exception']= {
379 'UnsupportedBase': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase"),
380 'UnsupportedConstructorValueType':new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType")
381};
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/ECC/StandardCurves.js b/frontend/gamma/js/ClipperzCryptoLibrary/ECC/StandardCurves.js
new file mode 100644
index 0000000..ed971ae
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/ECC/StandardCurves.js
@@ -0,0 +1,234 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24//try { if (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) == 'undefined') { throw ""; }} catch (e) {
25 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.BinaryField.Curve!";
26//}
27//try { if (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) == 'undefined') { throw ""; }} catch (e) {
28 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.Koblitz.Curve!";
29//}
30
31Clipperz.Crypto.ECC.StandardCurves = {};
32
33MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, {
34
35 //==============================================================================
36
37 '_K571': null,
38 'K571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
39 if ((Clipperz.Crypto.ECC.StandardCurves._K571 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) {
40 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.Koblitz.Curve({
41 modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16),
42 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16),
43 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16),
44 G: new Clipperz.Crypto.ECC.Koblitz.Point({
45 x: new Clipperz.Crypto.ECC.Koblitz.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16),
46 y: new Clipperz.Crypto.ECC.Koblitz.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16)
47 }),
48 r: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16),
49 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16),
50 primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16)
51 });
52 }
53
54 return Clipperz.Crypto.ECC.StandardCurves._K571;
55 },
56
57 //-----------------------------------------------------------------------------
58
59 '_K283': null,
60 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
61 if ((Clipperz.Crypto.ECC.StandardCurves._K283 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) {
62 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.Koblitz.Curve({
63 modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
64 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16),
65 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16),
66 G: new Clipperz.Crypto.ECC.Koblitz.Point({
67 x: new Clipperz.Crypto.ECC.Koblitz.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16),
68 y: new Clipperz.Crypto.ECC.Koblitz.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16)
69 }),
70 r: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16),
71 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16),
72 primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16)
73 });
74 }
75
76 return Clipperz.Crypto.ECC.StandardCurves._K283;
77 },
78
79 //==============================================================================
80
81 '_B571': null,
82 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
83 if ((Clipperz.Crypto.ECC.StandardCurves._B571 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) {
84 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
85 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16),
86 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
87 b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e 2221f295 de297117 b7f3d62f 5c6a97ff cb8ceff1 cd6ba8ce 4a9a18ad 84ffabbd 8efa5933 2be7ad67 56a66e29 4afd185a 78ff12aa 520e4de7 39baca0c 7ffeff7f 2955727a', 16),
88 G: new Clipperz.Crypto.ECC.BinaryField.Point({
89 x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16),
90 y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16)
91 }),
92 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16),
93 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
94
95 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
96 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
97 });
98
99 //-----------------------------------------------------------------------------
100 //
101 //Guide to Elliptic Curve Cryptography
102 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
103 //- Pag: 56, Alorithm 2.45 (with a typo!!!)
104 //
105 //-----------------------------------------------------------------------------
106 //
107 // http://www.milw0rm.com/papers/136
108 //
109 // -------------------------------------------------------------------------
110 // Polynomial Reduction Algorithm Modulo f571
111 // -------------------------------------------------------------------------
112 //
113 // Input: Polynomial p(x) of degree 1140 or less, stored as
114 // an array of 2T machinewords.
115 // Output: p(x) mod f571(x)
116 //
117 // FOR i = T-1, ..., 0 DO
118 // SET X := P[i+T]
119 // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15)
120 // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27)
121 //
122 // SET X := P[T-1] >> 27
123 // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10)
124 // P[T-1] := P[T-1] & 0x07ffffff
125 //
126 // RETURN P[T-1],...,P[0]
127 //
128 // -------------------------------------------------------------------------
129 //
130 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module;
131 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) {
132 varresult;
133
134 if (aValue.bitSize() > 1140) {
135 MochiKit.Logging.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation");
136 result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue);
137 } else {
138 varC, T;
139 var i;
140
141//console.log(">>> binaryField.finiteField.(improved)module");
142 // C = aValue.value().slice(0);
143 C = aValue._value.slice(0);
144 for (i=35; i>=18; i--) {
145 T = C[i];
146 C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0);
147 C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0);
148 }
149 T = (C[17] >>> 27);
150 C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0);
151 C[17] = (C[17] & 0x07ffffff);
152
153 for(i=18; i<=35; i++) {
154 C[i] = 0;
155 }
156
157 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
158//console.log("<<< binaryField.finiteField.(improved)module");
159 }
160
161 return result;
162 };
163 }
164
165 return Clipperz.Crypto.ECC.StandardCurves._B571;
166 },
167
168 //-----------------------------------------------------------------------------
169
170 '_B283': null,
171 'B283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
172 if ((Clipperz.Crypto.ECC.StandardCurves._B283 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) {
173 Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
174 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
175 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
176 b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16),
177 G: new Clipperz.Crypto.ECC.BinaryField.Point({
178 x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16),
179 y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16)
180 }),
181 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16),
182 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
183 });
184
185 //-----------------------------------------------------------------------------
186 //
187 //Guide to Elliptic Curve Cryptography
188 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
189 //- Pag: 56, Alorithm 2.43
190 //
191 //-----------------------------------------------------------------------------
192 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module;
193 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) {
194 varresult;
195
196 if (aValue.bitSize() > 564) {
197 MochiKit.Logging.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation");
198 result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue);
199 } else {
200 varC, T;
201 var i;
202
203//console.log(">>> binaryField.finiteField.(improved)module");
204 C = aValue._value.slice(0);
205 for (i=17; i>=9; i--) {
206 T = C[i];
207 C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0);
208 C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0);
209 }
210 T = (C[8] >>> 27);
211 C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0);
212 C[8] = (C[8] & 0x07ffffff);
213
214 for(i=9; i<=17; i++) {
215 C[i] = 0;
216 }
217
218 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
219//console.log("<<< binaryField.finiteField.(improved)module");
220 }
221
222 return result;
223 };
224 }
225
226 return Clipperz.Crypto.ECC.StandardCurves._B283;
227 },
228
229 //==============================================================================
230 __syntaxFix__: "syntax fix"
231});
232
233
234
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/PRNG.js b/frontend/gamma/js/ClipperzCryptoLibrary/PRNG.js
new file mode 100644
index 0000000..18cc260
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/PRNG.js
@@ -0,0 +1,850 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
26}
27
28try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) {
29 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!";
30}
31
32try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) {
33 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!";
34}
35
36if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; }
37
38//#############################################################################
39
40Clipperz.Crypto.PRNG.EntropyAccumulator = function(args) {
41 args = args || {};
42 //MochiKit.Base.bindMethods(this);
43
44 this._stack = new Clipperz.ByteArray();
45 this._maxStackLengthBeforeHashing = args.maxStackLengthBeforeHashing || 256;
46 return this;
47}
48
49Clipperz.Crypto.PRNG.EntropyAccumulator.prototype = MochiKit.Base.update(null, {
50
51 'toString': function() {
52 return "Clipperz.Crypto.PRNG.EntropyAccumulator";
53 },
54
55 //-------------------------------------------------------------------------
56
57 'stack': function() {
58 return this._stack;
59 },
60
61 'setStack': function(aValue) {
62 this._stack = aValue;
63 },
64
65 'resetStack': function() {
66 this.stack().reset();
67 },
68
69 'maxStackLengthBeforeHashing': function() {
70 return this._maxStackLengthBeforeHashing;
71 },
72
73 //-------------------------------------------------------------------------
74
75 'addRandomByte': function(aValue) {
76 this.stack().appendByte(aValue);
77
78 if (this.stack().length() > this.maxStackLengthBeforeHashing()) {
79 this.setStack(Clipperz.Crypto.SHA.sha_d256(this.stack()));
80 }
81 },
82
83 //-------------------------------------------------------------------------
84 __syntaxFix__: "syntax fix"
85});
86
87//#############################################################################
88
89Clipperz.Crypto.PRNG.RandomnessSource = function(args) {
90 args = args || {};
91 MochiKit.Base.bindMethods(this);
92
93 this._generator = args.generator || null;
94 this._sourceId = args.sourceId || null;
95 this._boostMode = args.boostMode || false;
96
97 this._nextPoolIndex = 0;
98
99 return this;
100}
101
102Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, {
103
104 'generator': function() {
105 return this._generator;
106 },
107
108 'setGenerator': function(aValue) {
109 this._generator = aValue;
110 },
111
112 //-------------------------------------------------------------------------
113
114 'boostMode': function() {
115 return this._boostMode;
116 },
117
118 'setBoostMode': function(aValue) {
119 this._boostMode = aValue;
120 },
121
122 //-------------------------------------------------------------------------
123
124 'sourceId': function() {
125 return this._sourceId;
126 },
127
128 'setSourceId': function(aValue) {
129 this._sourceId = aValue;
130 },
131
132 //-------------------------------------------------------------------------
133
134 'nextPoolIndex': function() {
135 return this._nextPoolIndex;
136 },
137
138 'incrementNextPoolIndex': function() {
139 this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators());
140 },
141
142 //-------------------------------------------------------------------------
143
144 'updateGeneratorWithValue': function(aRandomValue) {
145 if (this.generator() != null) {
146 this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue);
147 this.incrementNextPoolIndex();
148 }
149 },
150
151 //-------------------------------------------------------------------------
152 __syntaxFix__: "syntax fix"
153});
154
155//#############################################################################
156
157Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) {
158 args = args || {};
159 //MochiKit.Base.bindMethods(this);
160
161 this._intervalTime = args.intervalTime || 1000;
162
163 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
164
165 this.collectEntropy();
166 return this;
167}
168
169Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
170
171 'intervalTime': function() {
172 return this._intervalTime;
173 },
174
175 //-------------------------------------------------------------------------
176
177 'collectEntropy': function() {
178 varnow;
179 varentropyByte;
180 var intervalTime;
181 now = new Date();
182 entropyByte = (now.getTime() & 0xff);
183
184 intervalTime = this.intervalTime();
185 if (this.boostMode() == true) {
186 intervalTime = intervalTime / 9;
187 }
188
189 this.updateGeneratorWithValue(entropyByte);
190 setTimeout(this.collectEntropy, intervalTime);
191 },
192
193 //-------------------------------------------------------------------------
194
195 'numberOfRandomBits': function() {
196 return 5;
197 },
198
199 //-------------------------------------------------------------------------
200
201 'pollingFrequency': function() {
202 return 10;
203 },
204
205 //-------------------------------------------------------------------------
206 __syntaxFix__: "syntax fix"
207});
208
209//*****************************************************************************
210
211Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) {
212 args = args || {};
213
214 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
215
216 this._numberOfBitsToCollectAtEachEvent = 4;
217 this._randomBitsCollector = 0;
218 this._numberOfRandomBitsCollected = 0;
219
220 MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy');
221
222 return this;
223}
224
225Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
226
227 //-------------------------------------------------------------------------
228
229 'numberOfBitsToCollectAtEachEvent': function() {
230 return this._numberOfBitsToCollectAtEachEvent;
231 },
232
233 //-------------------------------------------------------------------------
234
235 'randomBitsCollector': function() {
236 return this._randomBitsCollector;
237 },
238
239 'setRandomBitsCollector': function(aValue) {
240 this._randomBitsCollector = aValue;
241 },
242
243 'appendRandomBitsToRandomBitsCollector': function(aValue) {
244 var collectedBits;
245 var numberOfRandomBitsCollected;
246
247 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
248 collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
249 this.setRandomBitsCollector(collectetBits);
250 numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent();
251
252 if (numberOfRandomBitsCollected == 8) {
253 this.updateGeneratorWithValue(collectetBits);
254 numberOfRandomBitsCollected = 0;
255 this.setRandomBitsCollector(0);
256 }
257
258 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
259 },
260
261 //-------------------------------------------------------------------------
262
263 'numberOfRandomBitsCollected': function() {
264 return this._numberOfRandomBitsCollected;
265 },
266
267 'setNumberOfRandomBitsCollected': function(aValue) {
268 this._numberOfRandomBitsCollected = aValue;
269 },
270
271 //-------------------------------------------------------------------------
272
273 'collectEntropy': function(anEvent) {
274 var mouseLocation;
275 var randomBit;
276 var mask;
277
278 mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent());
279
280 mouseLocation = anEvent.mouse().client;
281 randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask);
282 this.appendRandomBitsToRandomBitsCollector(randomBit)
283 },
284
285 //-------------------------------------------------------------------------
286
287 'numberOfRandomBits': function() {
288 return 1;
289 },
290
291 //-------------------------------------------------------------------------
292
293 'pollingFrequency': function() {
294 return 10;
295 },
296
297 //-------------------------------------------------------------------------
298 __syntaxFix__: "syntax fix"
299});
300
301//*****************************************************************************
302
303Clipperz.Crypto.PRNG.KeyboardRandomnessSource = function(args) {
304 args = args || {};
305 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
306
307 this._randomBitsCollector = 0;
308 this._numberOfRandomBitsCollected = 0;
309
310 MochiKit.Signal.connect(document, 'onkeypress', this, 'collectEntropy');
311
312 return this;
313}
314
315Clipperz.Crypto.PRNG.KeyboardRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
316
317 //-------------------------------------------------------------------------
318
319 'randomBitsCollector': function() {
320 return this._randomBitsCollector;
321 },
322
323 'setRandomBitsCollector': function(aValue) {
324 this._randomBitsCollector = aValue;
325 },
326
327 'appendRandomBitToRandomBitsCollector': function(aValue) {
328 var collectedBits;
329 var numberOfRandomBitsCollected;
330
331 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
332 collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
333 this.setRandomBitsCollector(collectetBits);
334 numberOfRandomBitsCollected ++;
335
336 if (numberOfRandomBitsCollected == 8) {
337 this.updateGeneratorWithValue(collectetBits);
338 numberOfRandomBitsCollected = 0;
339 this.setRandomBitsCollector(0);
340 }
341
342 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
343 },
344
345 //-------------------------------------------------------------------------
346
347 'numberOfRandomBitsCollected': function() {
348 return this._numberOfRandomBitsCollected;
349 },
350
351 'setNumberOfRandomBitsCollected': function(aValue) {
352 this._numberOfRandomBitsCollected = aValue;
353 },
354
355 //-------------------------------------------------------------------------
356
357 'collectEntropy': function(anEvent) {
358/*
359 var mouseLocation;
360 var randomBit;
361
362 mouseLocation = anEvent.mouse().client;
363
364 randomBit = ((mouseLocation.x ^ mouseLocation.y) & 0x1);
365 this.appendRandomBitToRandomBitsCollector(randomBit);
366*/
367 },
368
369 //-------------------------------------------------------------------------
370
371 'numberOfRandomBits': function() {
372 return 1;
373 },
374
375 //-------------------------------------------------------------------------
376
377 'pollingFrequency': function() {
378 return 10;
379 },
380
381 //-------------------------------------------------------------------------
382 __syntaxFix__: "syntax fix"
383});
384
385//#############################################################################
386
387Clipperz.Crypto.PRNG.Fortuna = function(args) {
388 vari,c;
389
390 args = args || {};
391
392 this._key = args.seed || null;
393 if (this._key == null) {
394 this._counter = 0;
395 this._key = new Clipperz.ByteArray();
396 } else {
397 this._counter = 1;
398 }
399
400 this._aesKey = null;
401
402 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64;
403 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32;
404
405 this._accumulators = [];
406 c = this.numberOfEntropyAccumulators();
407 for (i=0; i<c; i++) {
408 this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator());
409 }
410
411 this._randomnessSources = [];
412 this._reseedCounter = 0;
413
414 return this;
415}
416
417Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, {
418
419 'toString': function() {
420 return "Clipperz.Crypto.PRNG.Fortuna";
421 },
422
423 //-------------------------------------------------------------------------
424
425 'key': function() {
426 return this._key;
427 },
428
429 'setKey': function(aValue) {
430 this._key = aValue;
431 this._aesKey = null;
432 },
433
434 'aesKey': function() {
435 if (this._aesKey == null) {
436 this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()});
437 }
438
439 return this._aesKey;
440 },
441
442 'accumulators': function() {
443 return this._accumulators;
444 },
445
446 'firstPoolReseedLevel': function() {
447 return this._firstPoolReseedLevel;
448 },
449
450 //-------------------------------------------------------------------------
451
452 'reseedCounter': function() {
453 return this._reseedCounter;
454 },
455
456 'incrementReseedCounter': function() {
457 this._reseedCounter = this._reseedCounter +1;
458 },
459
460 //-------------------------------------------------------------------------
461
462 'reseed': function() {
463 varnewKeySeed;
464 var reseedCounter;
465 varreseedCounterMask;
466 var i, c;
467
468 newKeySeed = this.key();
469 this.incrementReseedCounter();
470 reseedCounter = this.reseedCounter();
471
472 c = this.numberOfEntropyAccumulators();
473 reseedCounterMask = 0xffffffff >>> (32 - c);
474 for (i=0; i<c; i++) {
475 if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) {
476 newKeySeed.appendBlock(this.accumulators()[i].stack());
477 this.accumulators()[i].resetStack();
478 }
479 }
480
481 if (reseedCounter == 1) {
482 c = this.randomnessSources().length;
483 for (i=0; i<c; i++) {
484 this.randomnessSources()[i].setBoostMode(false);
485 }
486 }
487
488 this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed));
489 if (reseedCounter == 1) {
490//MochiKit.Logging.logDebug("### PRNG.readyToGenerateRandomBytes");
491Clipperz.log("### PRNG.readyToGenerateRandomBytes");
492 MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes');
493 }
494 MochiKit.Signal.signal(this, 'reseeded');
495 },
496
497 //-------------------------------------------------------------------------
498
499 'isReadyToGenerateRandomValues': function() {
500 return this.reseedCounter() != 0;
501 },
502
503 //-------------------------------------------------------------------------
504
505 'entropyLevel': function() {
506 return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel());
507 },
508
509 //-------------------------------------------------------------------------
510
511 'counter': function() {
512 return this._counter;
513 },
514
515 'incrementCounter': function() {
516 this._counter += 1;
517 },
518
519 'counterBlock': function() {
520 var result;
521
522 result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0);
523
524 return result;
525 },
526
527 //-------------------------------------------------------------------------
528
529 'getRandomBlock': function() {
530 var result;
531
532 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues()));
533 this.incrementCounter();
534
535 return result;
536 },
537
538 //-------------------------------------------------------------------------
539
540 'getRandomBytes': function(aSize) {
541 var result;
542
543 if (this.isReadyToGenerateRandomValues()) {
544 var i,c;
545 var newKey;
546
547 result = new Clipperz.ByteArray();
548
549 c = Math.ceil(aSize / (128 / 8));
550 for (i=0; i<c; i++) {
551 result.appendBlock(this.getRandomBlock());
552 }
553
554 if (result.length() != aSize) {
555 result = result.split(0, aSize);
556 }
557
558 newKey = this.getRandomBlock().appendBlock(this.getRandomBlock());
559 this.setKey(newKey);
560 } else {
561MochiKit.Logging.logWarning("Fortuna generator has not enough entropy, yet!");
562 throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy;
563 }
564
565 return result;
566 },
567
568 //-------------------------------------------------------------------------
569
570 'addRandomByte': function(aSourceId, aPoolId, aRandomValue) {
571 varselectedAccumulator;
572
573 selectedAccumulator = this.accumulators()[aPoolId];
574 selectedAccumulator.addRandomByte(aRandomValue);
575
576 if (aPoolId == 0) {
577 MochiKit.Signal.signal(this, 'addedRandomByte')
578 if (selectedAccumulator.stack().length() > this.firstPoolReseedLevel()) {
579 this.reseed();
580 }
581 }
582 },
583
584 //-------------------------------------------------------------------------
585
586 'numberOfEntropyAccumulators': function() {
587 return this._numberOfEntropyAccumulators;
588 },
589
590 //-------------------------------------------------------------------------
591
592 'randomnessSources': function() {
593 return this._randomnessSources;
594 },
595
596 'addRandomnessSource': function(aRandomnessSource) {
597 aRandomnessSource.setGenerator(this);
598 aRandomnessSource.setSourceId(this.randomnessSources().length);
599 this.randomnessSources().push(aRandomnessSource);
600
601 if (this.isReadyToGenerateRandomValues() == false) {
602 aRandomnessSource.setBoostMode(true);
603 }
604 },
605
606 //-------------------------------------------------------------------------
607
608 'deferredEntropyCollection': function(aValue) {
609 var result;
610
611//MochiKit.Logging.logDebug(">>> PRNG.deferredEntropyCollection");
612
613 if (this.isReadyToGenerateRandomValues()) {
614//MochiKit.Logging.logDebug("--- PRNG.deferredEntropyCollection - 1");
615 result = aValue;
616 } else {
617//MochiKit.Logging.logDebug("--- PRNG.deferredEntropyCollection - 2");
618 var deferredResult;
619
620 // Clipperz.NotificationCenter.notify(this, 'updatedProgressState', 'collectingEntropy', true);
621
622 deferredResult = new Clipperz.Async.Deferred("PRNG.deferredEntropyCollection");
623 // deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.1 - PRNG.deferredEntropyCollection - 1: " + res); return res;});
624 deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Async.succeed, aValue));
625 // deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.2 - PRNG.deferredEntropyCollection - 2: " + res); return res;});
626 MochiKit.Signal.connect(this,
627 'readyToGenerateRandomBytes',
628 deferredResult,
629 'callback');
630
631 result = deferredResult;
632 }
633//MochiKit.Logging.logDebug("<<< PRNG.deferredEntropyCollection - result: " + result);
634
635 return result;
636 },
637
638 //-------------------------------------------------------------------------
639
640 'fastEntropyAccumulationForTestingPurpose': function() {
641 while (! this.isReadyToGenerateRandomValues()) {
642 this.addRandomByte(Math.floor(Math.random() * 32), Math.floor(Math.random() * 32), Math.floor(Math.random() * 256));
643 }
644 },
645
646 //-------------------------------------------------------------------------
647
648 'dump': function(appendToDoc) {
649 var tbl;
650 var i,c;
651
652 tbl = document.createElement("table");
653 tbl.border = 0;
654 with (tbl.style) {
655 border = "1px solid lightgrey";
656 fontFamily = 'Helvetica, Arial, sans-serif';
657 fontSize = '8pt';
658 //borderCollapse = "collapse";
659 }
660 var hdr = tbl.createTHead();
661 var hdrtr = hdr.insertRow(0);
662 // document.createElement("tr");
663 {
664 var ntd;
665
666 ntd = hdrtr.insertCell(0);
667 ntd.style.borderBottom = "1px solid lightgrey";
668 ntd.style.borderRight = "1px solid lightgrey";
669 ntd.appendChild(document.createTextNode("#"));
670
671 ntd = hdrtr.insertCell(1);
672 ntd.style.borderBottom = "1px solid lightgrey";
673 ntd.style.borderRight = "1px solid lightgrey";
674 ntd.appendChild(document.createTextNode("s"));
675
676 ntd = hdrtr.insertCell(2);
677 ntd.colSpan = this.firstPoolReseedLevel();
678 ntd.style.borderBottom = "1px solid lightgrey";
679 ntd.style.borderRight = "1px solid lightgrey";
680 ntd.appendChild(document.createTextNode("base values"));
681
682 ntd = hdrtr.insertCell(3);
683 ntd.colSpan = 20;
684 ntd.style.borderBottom = "1px solid lightgrey";
685 ntd.appendChild(document.createTextNode("extra values"));
686
687 }
688
689 c = this.accumulators().length;
690 for (i=0; i<c ; i++) {
691 varcurrentAccumulator;
692 var bdytr;
693 var bdytd;
694 var ii, cc;
695
696 currentAccumulator = this.accumulators()[i]
697
698 bdytr = tbl.insertRow(true);
699
700 bdytd = bdytr.insertCell(0);
701 bdytd.style.borderRight = "1px solid lightgrey";
702 bdytd.style.color = "lightgrey";
703 bdytd.appendChild(document.createTextNode("" + i));
704
705 bdytd = bdytr.insertCell(1);
706 bdytd.style.borderRight = "1px solid lightgrey";
707 bdytd.style.color = "gray";
708 bdytd.appendChild(document.createTextNode("" + currentAccumulator.stack().length()));
709
710
711 cc = Math.max(currentAccumulator.stack().length(), this.firstPoolReseedLevel());
712 for (ii=0; ii<cc; ii++) {
713 var cellText;
714
715 bdytd = bdytr.insertCell(ii + 2);
716
717 if (ii < currentAccumulator.stack().length()) {
718 cellText = Clipperz.ByteArray.byteToHex(currentAccumulator.stack().byteAtIndex(ii));
719 } else {
720 cellText = "_";
721 }
722
723 if (ii == (this.firstPoolReseedLevel() - 1)) {
724 bdytd.style.borderRight = "1px solid lightgrey";
725 }
726
727 bdytd.appendChild(document.createTextNode(cellText));
728 }
729
730 }
731
732
733 if (appendToDoc) {
734 var ne = document.createElement("div");
735 ne.id = "entropyGeneratorStatus";
736 with (ne.style) {
737 fontFamily = "Courier New, monospace";
738 fontSize = "12px";
739 lineHeight = "16px";
740 borderTop = "1px solid black";
741 padding = "10px";
742 }
743 if (document.getElementById(ne.id)) {
744 MochiKit.DOM.swapDOM(ne.id, ne);
745 } else {
746 document.body.appendChild(ne);
747 }
748 ne.appendChild(tbl);
749 }
750
751 return tbl;
752 },
753
754 //-----------------------------------------------------------------------------
755 __syntaxFix__: "syntax fix"
756});
757
758//#############################################################################
759
760Clipperz.Crypto.PRNG.Random = function(args) {
761 args = args || {};
762 //MochiKit.Base.bindMethods(this);
763
764 return this;
765}
766
767Clipperz.Crypto.PRNG.Random.prototype = MochiKit.Base.update(null, {
768
769 'toString': function() {
770 return "Clipperz.Crypto.PRNG.Random";
771 },
772
773 //-------------------------------------------------------------------------
774
775 'getRandomBytes': function(aSize) {
776//Clipperz.Profile.start("Clipperz.Crypto.PRNG.Random.getRandomBytes");
777 varresult;
778 var i,c;
779
780 result = new Clipperz.ByteArray()
781 c = aSize || 1;
782 for (i=0; i<c; i++) {
783 result.appendByte((Math.random()*255) & 0xff);
784 }
785
786//Clipperz.Profile.stop("Clipperz.Crypto.PRNG.Random.getRandomBytes");
787 return result;
788 },
789
790 //-------------------------------------------------------------------------
791 __syntaxFix__: "syntax fix"
792});
793
794//#############################################################################
795
796_clipperz_crypt_prng_defaultPRNG = null;
797
798Clipperz.Crypto.PRNG.defaultRandomGenerator = function() {
799 if (_clipperz_crypt_prng_defaultPRNG == null) {
800 _clipperz_crypt_prng_defaultPRNG = new Clipperz.Crypto.PRNG.Fortuna();
801
802 //.............................................................
803 //
804 // TimeRandomnessSource
805 //
806 //.............................................................
807 {
808 var newRandomnessSource;
809
810 newRandomnessSource = new Clipperz.Crypto.PRNG.TimeRandomnessSource({intervalTime:111});
811 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
812 }
813
814 //.............................................................
815 //
816 // MouseRandomnessSource
817 //
818 //.............................................................
819 {
820 varnewRandomnessSource;
821
822 newRandomnessSource = new Clipperz.Crypto.PRNG.MouseRandomnessSource();
823 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
824 }
825
826 //.............................................................
827 //
828 // KeyboardRandomnessSource
829 //
830 //.............................................................
831 {
832 varnewRandomnessSource;
833
834 newRandomnessSource = new Clipperz.Crypto.PRNG.KeyboardRandomnessSource();
835 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
836 }
837
838 }
839
840 return _clipperz_crypt_prng_defaultPRNG;
841};
842
843//#############################################################################
844
845Clipperz.Crypto.PRNG.exception = {
846 NotEnoughEntropy: new MochiKit.Base.NamedError("Clipperz.Crypto.PRNG.exception.NotEnoughEntropy")
847};
848
849
850MochiKit.DOM.addLoadEvent(Clipperz.Crypto.PRNG.defaultRandomGenerator);
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/RSA.js b/frontend/gamma/js/ClipperzCryptoLibrary/RSA.js
new file mode 100644
index 0000000..5a480f1
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/RSA.js
@@ -0,0 +1,146 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.RSA depends on Clipperz.Crypto.BigInt!";
26}
27
28if (typeof(Clipperz.Crypto.RSA) == 'undefined') { Clipperz.Crypto.RSA = {}; }
29
30Clipperz.Crypto.RSA.VERSION = "0.1";
31Clipperz.Crypto.RSA.NAME = "Clipperz.RSA";
32
33//#############################################################################
34
35MochiKit.Base.update(Clipperz.Crypto.RSA, {
36
37 //-------------------------------------------------------------------------
38
39 'publicKeyWithValues': function (e, d, n) {
40 varresult;
41
42 result = {};
43
44 if (e.isBigInt) {
45 result.e = e;
46 } else {
47 result.e = new Clipperz.Crypto.BigInt(e, 16);
48 }
49
50 if (d.isBigInt) {
51 result.d = d;
52 } else {
53 result.d = new Clipperz.Crypto.BigInt(d, 16);
54 }
55
56 if (n.isBigInt) {
57 result.n = n;
58 } else {
59 result.n = new Clipperz.Crypto.BigInt(n, 16);
60 }
61
62 return result;
63 },
64
65 'privateKeyWithValues': function(e, d, n) {
66 return Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n);
67 },
68
69 //-----------------------------------------------------------------------------
70
71 'encryptUsingPublicKey': function (aKey, aMessage) {
72 varmessageValue;
73 varresult;
74
75 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16);
76 result = messageValue.powerModule(aKey.e, aKey.n);
77
78 return result.asString(16);
79 },
80
81 //.............................................................................
82
83 'decryptUsingPublicKey': function (aKey, aMessage) {
84 return Clipperz.Crypto.RSA.encryptUsingPublicKey(aKey, aMessage);
85 },
86
87 //-----------------------------------------------------------------------------
88
89 'encryptUsingPrivateKey': function (aKey, aMessage) {
90 varmessageValue;
91 varresult;
92
93 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16);
94 result = messageValue.powerModule(aKey.d, aKey.n);
95
96 return result.asString(16);
97 },
98
99 //.............................................................................
100
101 'decryptUsingPrivateKey': function (aKey, aMessage) {
102 return Clipperz.Crypto.RSA.encryptUsingPrivateKey(aKey, aMessage);
103 },
104
105 //-----------------------------------------------------------------------------
106
107 'generatePublicKey': function(aNumberOfBits) {
108 varresult;
109 vare;
110 vard;
111 varn;
112
113 e = new Clipperz.Crypto.BigInt("10001", 16);
114
115 {
116 var p, q;
117 varphi;
118
119 do {
120 p = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits);
121 } while (p.module(e).equals(1));
122
123 do {
124 q = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits);
125 } while ((q.equals(p)) || (q.module(e).equals(1)));
126
127 n = p.multiply(q);
128 phi = (p.subtract(1).multiply(q.subtract(1)));
129 d = e.powerModule(-1, phi);
130 }
131
132 result = Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n);
133
134 return result;
135 },
136
137 //-------------------------------------------------------------------------
138
139 __syntaxFix__: "syntax fix"
140
141 //-------------------------------------------------------------------------
142
143});
144
145//#############################################################################
146
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/SHA.js b/frontend/gamma/js/ClipperzCryptoLibrary/SHA.js
new file mode 100644
index 0000000..f8bfe6e
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/SHA.js
@@ -0,0 +1,296 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
26}
27
28if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
29if (typeof(Clipperz.Crypto.SHA) == 'undefined') { Clipperz.Crypto.SHA = {}; }
30
31Clipperz.Crypto.SHA.VERSION = "0.3";
32Clipperz.Crypto.SHA.NAME = "Clipperz.Crypto.SHA";
33
34MochiKit.Base.update(Clipperz.Crypto.SHA, {
35
36 '__repr__': function () {
37 return "[" + this.NAME + " " + this.VERSION + "]";
38 },
39
40 'toString': function () {
41 return this.__repr__();
42 },
43
44 //-----------------------------------------------------------------------------
45
46 'rotateRight': function(aValue, aNumberOfBits) {
47//Clipperz.Profile.start("Clipperz.Crypto.SHA.rotateRight");
48 var result;
49
50 result = (aValue >>> aNumberOfBits) | (aValue << (32 - aNumberOfBits));
51
52//Clipperz.Profile.stop("Clipperz.Crypto.SHA.rotateRight");
53 return result;
54 },
55
56 'shiftRight': function(aValue, aNumberOfBits) {
57//Clipperz.Profile.start("Clipperz.Crypto.SHA.shiftRight");
58 var result;
59
60 result = aValue >>> aNumberOfBits;
61
62//Clipperz.Profile.stop("Clipperz.Crypto.SHA.shiftRight");
63 return result;
64 },
65
66 //-----------------------------------------------------------------------------
67
68 'safeAdd': function() {
69//Clipperz.Profile.start("Clipperz.Crypto.SHA.safeAdd");
70 varresult;
71 vari, c;
72
73 result = arguments[0];
74 c = arguments.length;
75 for (i=1; i<c; i++) {
76 varlowerBytesSum;
77
78 lowerBytesSum = (result & 0xffff) + (arguments[i] & 0xffff);
79 result = (((result >> 16) + (arguments[i] >> 16) + (lowerBytesSum >> 16)) << 16) | (lowerBytesSum & 0xffff);
80 }
81
82//Clipperz.Profile.stop("Clipperz.Crypto.SHA.safeAdd");
83 return result;
84 },
85
86 //-----------------------------------------------------------------------------
87
88 'sha256_array': function(aValue) {
89//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256_array");
90 varresult;
91 varmessage;
92 var h0, h1, h2, h3, h4, h5, h6, h7;
93 vark;
94 varmessageLength;
95 varmessageLengthInBits;
96 var_i, _c;
97 var charBits;
98 var rotateRight;
99 var shiftRight;
100 var safeAdd;
101 varbytesPerBlock;
102 var currentMessageIndex;
103
104 bytesPerBlock = 512/8;
105 rotateRight = Clipperz.Crypto.SHA.rotateRight;
106 shiftRight = Clipperz.Crypto.SHA.shiftRight;
107 safeAdd = Clipperz.Crypto.SHA.safeAdd;
108
109 charBits = 8;
110
111 h0 = 0x6a09e667;
112 h1 = 0xbb67ae85;
113 h2 = 0x3c6ef372;
114 h3 = 0xa54ff53a;
115 h4 = 0x510e527f;
116 h5 = 0x9b05688c;
117 h6 = 0x1f83d9ab;
118 h7 = 0x5be0cd19;
119
120 k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
121 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
122 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
123 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
124 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
125 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
126 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
127 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
128
129 message = aValue;
130 messageLength = message.length;
131
132 //Pre-processing:
133 message.push(0x80); //append a single "1" bit to message
134
135 _c = (512 - (((messageLength + 1) * charBits) % 512) - 64) / charBits;
136 if (_c < 0) {
137 _c = _c + (512 / charBits);
138 }
139
140 for (_i=0; _i<_c; _i++) {
141 message.push(0x00); //append "0" bits until message length ≡ 448 ≡ -64 (mod 512)
142 }
143
144 messageLengthInBits = messageLength * charBits;
145 message.push(0x00); //the 4 most high byte are alway 0 as message length is represented with a 32bit value;
146 message.push(0x00);
147 message.push(0x00);
148 message.push(0x00);
149 message.push((messageLengthInBits >> 24)& 0xff);
150 message.push((messageLengthInBits >> 16)& 0xff);
151 message.push((messageLengthInBits >> 8) & 0xff);
152 message.push( messageLengthInBits & 0xff);
153
154 currentMessageIndex = 0;
155 while(currentMessageIndex < message.length) {
156 varw;
157 vara, b, c, d, e, f, g, h;
158
159 w = Array(64);
160
161 _c = 16;
162 for (_i=0; _i<_c; _i++) {
163 var _j;
164
165 _j = currentMessageIndex + _i*4;
166 w[_i] = (message[_j] << 24) | (message[_j + 1] << 16) | (message[_j + 2] << 8) | (message[_j + 3] << 0);
167 }
168
169 _c = 64;
170 for (_i=16; _i<_c; _i++) {
171 vars0, s1;
172
173 s0 = (rotateRight(w[_i-15], 7)) ^ (rotateRight(w[_i-15], 18)) ^ (shiftRight(w[_i-15], 3));
174 s1 = (rotateRight(w[_i-2], 17)) ^ (rotateRight(w[_i-2], 19)) ^ (shiftRight(w[_i-2], 10));
175 w[_i] = safeAdd(w[_i-16], s0, w[_i-7], s1);
176 }
177
178 a=h0; b=h1; c=h2; d=h3; e=h4; f=h5; g=h6; h=h7;
179
180 _c = 64;
181 for (_i=0; _i<_c; _i++) {
182 var s0, s1, ch, maj, t1, t2;
183
184 s0 = (rotateRight(a, 2)) ^ (rotateRight(a, 13)) ^ (rotateRight(a, 22));
185 maj = (a & b) ^ (a & c) ^ (b & c);
186 t2 = safeAdd(s0, maj);
187 s1 = (rotateRight(e, 6)) ^ (rotateRight(e, 11)) ^ (rotateRight(e, 25));
188 ch = (e & f) ^ ((~e) & g);
189 t1 = safeAdd(h, s1, ch, k[_i], w[_i]);
190
191 h = g;
192 g = f;
193 f = e;
194 e = safeAdd(d, t1);
195 d = c;
196 c = b;
197 b = a;
198 a = safeAdd(t1, t2);
199 }
200
201 h0 = safeAdd(h0, a);
202 h1 = safeAdd(h1, b);
203 h2 = safeAdd(h2, c);
204 h3 = safeAdd(h3, d);
205 h4 = safeAdd(h4, e);
206 h5 = safeAdd(h5, f);
207 h6 = safeAdd(h6, g);
208 h7 = safeAdd(h7, h);
209
210 currentMessageIndex += bytesPerBlock;
211 }
212
213 result = new Array(256/8);
214 result[0] = (h0 >> 24)& 0xff;
215 result[1] = (h0 >> 16)& 0xff;
216 result[2] = (h0 >> 8)& 0xff;
217 result[3] = h0 & 0xff;
218
219 result[4] = (h1 >> 24)& 0xff;
220 result[5] = (h1 >> 16)& 0xff;
221 result[6] = (h1 >> 8)& 0xff;
222 result[7] = h1 & 0xff;
223
224 result[8] = (h2 >> 24)& 0xff;
225 result[9] = (h2 >> 16)& 0xff;
226 result[10] = (h2 >> 8)& 0xff;
227 result[11] = h2 & 0xff;
228
229 result[12] = (h3 >> 24)& 0xff;
230 result[13] = (h3 >> 16)& 0xff;
231 result[14] = (h3 >> 8)& 0xff;
232 result[15] = h3 & 0xff;
233
234 result[16] = (h4 >> 24)& 0xff;
235 result[17] = (h4 >> 16)& 0xff;
236 result[18] = (h4 >> 8)& 0xff;
237 result[19] = h4 & 0xff;
238
239 result[20] = (h5 >> 24)& 0xff;
240 result[21] = (h5 >> 16)& 0xff;
241 result[22] = (h5 >> 8)& 0xff;
242 result[23] = h5 & 0xff;
243
244 result[24] = (h6 >> 24)& 0xff;
245 result[25] = (h6 >> 16)& 0xff;
246 result[26] = (h6 >> 8)& 0xff;
247 result[27] = h6 & 0xff;
248
249 result[28] = (h7 >> 24)& 0xff;
250 result[29] = (h7 >> 16)& 0xff;
251 result[30] = (h7 >> 8)& 0xff;
252 result[31] = h7 & 0xff;
253
254//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256_array");
255 return result;
256 },
257
258 //-----------------------------------------------------------------------------
259
260 'sha256': function(aValue) {
261//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256");
262 var result;
263 var resultArray;
264 varvalueArray;
265
266 valueArray = aValue.arrayValues();
267 resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray);
268
269 result = new Clipperz.ByteArray(resultArray);
270
271//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256");
272 return result;
273 },
274
275 //-----------------------------------------------------------------------------
276
277 'sha_d256': function(aValue) {
278//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha_d256");
279 var result;
280 var resultArray;
281 varvalueArray;
282
283 valueArray = aValue.arrayValues();
284 resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray);
285 resultArray = Clipperz.Crypto.SHA.sha256_array(resultArray);
286
287 result = new Clipperz.ByteArray(resultArray);
288
289//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256");
290 return result;
291 },
292
293 //-----------------------------------------------------------------------------
294 __syntaxFix__: "syntax fix"
295
296});
diff --git a/frontend/gamma/js/ClipperzCryptoLibrary/SRP.js b/frontend/gamma/js/ClipperzCryptoLibrary/SRP.js
new file mode 100644
index 0000000..8cc80ba
--- a/dev/null
+++ b/frontend/gamma/js/ClipperzCryptoLibrary/SRP.js
@@ -0,0 +1,326 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
26}
27
28try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) {
29 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.BigInt!";
30}
31
32try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
33 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.PRNG!";
34}
35
36if (typeof(Clipperz.Crypto.SRP) == 'undefined') { Clipperz.Crypto.SRP = {}; }
37
38Clipperz.Crypto.SRP.VERSION = "0.1";
39Clipperz.Crypto.SRP.NAME = "Clipperz.Crypto.SRP";
40
41//#############################################################################
42
43MochiKit.Base.update(Clipperz.Crypto.SRP, {
44
45 '_n': null,
46 '_g': null,
47 //-------------------------------------------------------------------------
48
49 'n': function() {
50 if (Clipperz.Crypto.SRP._n == null) {
51 Clipperz.Crypto.SRP._n = new Clipperz.Crypto.BigInt("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16);
52 }
53
54 return Clipperz.Crypto.SRP._n;
55 },
56
57 //-------------------------------------------------------------------------
58
59 'g': function() {
60 if (Clipperz.Crypto.SRP._g == null) {
61 Clipperz.Crypto.SRP._g = new Clipperz.Crypto.BigInt(2); //eventually 5 (as suggested on the Diffi-Helmann documentation)
62 }
63
64 return Clipperz.Crypto.SRP._g;
65 },
66
67 //-----------------------------------------------------------------------------
68
69 'exception': {
70 'InvalidValue': new MochiKit.Base.NamedError("Clipperz.Crypto.SRP.exception.InvalidValue")
71 },
72
73 //-------------------------------------------------------------------------
74 __syntaxFix__: "syntax fix"
75
76});
77
78//#############################################################################
79//
80 // S R P C o n n e c t i o n version 1.0
81//
82//=============================================================================
83Clipperz.Crypto.SRP.Connection = function (args) {
84 args = args || {};
85
86 this._C = args.C;
87 this._P = args.P;
88 this.hash = args.hash;
89
90 this._a = null;
91 this._A = null;
92
93 this._s = null;
94 this._B = null;
95
96 this._x = null;
97
98 this._u = null;
99 this._K = null;
100 this._M1 = null;
101 this._M2 = null;
102
103 this._sessionKey = null;
104
105 return this;
106}
107
108Clipperz.Crypto.SRP.Connection.prototype = MochiKit.Base.update(null, {
109
110 'toString': function () {
111 return "Clipperz.Crypto.SRP.Connection (username: " + this.username() + "). Status: " + this.statusDescription();
112 },
113
114 //-------------------------------------------------------------------------
115
116 'C': function () {
117 return this._C;
118 },
119
120 //-------------------------------------------------------------------------
121
122 'P': function () {
123 return this._P;
124 },
125
126 //-------------------------------------------------------------------------
127
128 'a': function () {
129 if (this._a == null) {
130 this._a = new Clipperz.Crypto.BigInt(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2), 16);
131 // this._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10);
132//MochiKit.Logging.logDebug("SRP a: " + this._a);
133 }
134
135 return this._a;
136 },
137
138 //-------------------------------------------------------------------------
139
140 'A': function () {
141 if (this._A == null) {
142 //Warning: this value should be strictly greater than zero: how should we perform this check?
143 this._A = Clipperz.Crypto.SRP.g().powerModule(this.a(), Clipperz.Crypto.SRP.n());
144
145 if (this._A.equals(0)) {
146MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'A' to 0.");
147 throw Clipperz.Crypto.SRP.exception.InvalidValue;
148 }
149//MochiKit.Logging.logDebug("SRP A: " + this._A);
150 }
151
152 return this._A;
153 },
154
155 //-------------------------------------------------------------------------
156
157 's': function () {
158 return this._s;
159//MochiKit.Logging.logDebug("SRP s: " + this._S);
160 },
161
162 'set_s': function(aValue) {
163 this._s = aValue;
164 },
165
166 //-------------------------------------------------------------------------
167
168 'B': function () {
169 return this._B;
170 },
171
172 'set_B': function(aValue) {
173 //Warning: this value should be strictly greater than zero: how should we perform this check?
174 if (! aValue.equals(0)) {
175 this._B = aValue;
176//MochiKit.Logging.logDebug("SRP B: " + this._B);
177 } else {
178MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'B' to 0.");
179 throw Clipperz.Crypto.SRP.exception.InvalidValue;
180 }
181 },
182
183 //-------------------------------------------------------------------------
184
185 'x': function () {
186 if (this._x == null) {
187 this._x = new Clipperz.Crypto.BigInt(this.stringHash(this.s().asString(16, 64) + this.P()), 16);
188//MochiKit.Logging.logDebug("SRP x: " + this._x);
189 }
190
191 return this._x;
192 },
193
194 //-------------------------------------------------------------------------
195
196 'u': function () {
197 if (this._u == null) {
198 this._u = new Clipperz.Crypto.BigInt(this.stringHash(this.B().asString()), 16);
199//MochiKit.Logging.logDebug("SRP u: " + this._u);
200 }
201
202 return this._u;
203 },
204
205 //-------------------------------------------------------------------------
206
207 'S': function () {
208 if (this._S == null) {
209 var bigint;
210 varsrp;
211
212 bigint = Clipperz.Crypto.BigInt;
213 srp = Clipperz.Crypto.SRP;
214
215 this._S =bigint.powerModule(
216 bigint.subtract(this.B(), bigint.powerModule(srp.g(), this.x(), srp.n())),
217 bigint.add(this.a(), bigint.multiply(this.u(), this.x())),
218 srp.n()
219 )
220//MochiKit.Logging.logDebug("SRP S: " + this._S);
221 }
222
223 return this._S;
224 },
225
226 //-------------------------------------------------------------------------
227
228 'K': function () {
229 if (this._K == null) {
230 this._K = this.stringHash(this.S().asString());
231//MochiKit.Logging.logDebug("SRP K: " + this._K);
232 }
233
234 return this._K;
235 },
236
237 //-------------------------------------------------------------------------
238
239 'M1': function () {
240 if (this._M1 == null) {
241 this._M1 = this.stringHash(this.A().asString(10) + this.B().asString(10) + this.K());
242//MochiKit.Logging.logDebug("SRP M1: " + this._M1);
243 }
244
245 return this._M1;
246 },
247
248 //-------------------------------------------------------------------------
249
250 'M2': function () {
251 if (this._M2 == null) {
252 this._M2 = this.stringHash(this.A().asString(10) + this.M1() + this.K());
253//MochiKit.Logging.logDebug("SRP M2: " + this._M2);
254 }
255
256 return this._M2;
257 },
258
259 //=========================================================================
260
261 'serverSideCredentialsWithSalt': function(aSalt) {
262 var result;
263 var s, x, v;
264
265 s = aSalt;
266 x = this.stringHash(s + this.P());
267 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
268
269 result = {};
270 result['C'] = this.C();
271 result['s'] = s;
272 result['v'] = v.asString(16);
273
274 return result;
275 },
276
277 'serverSideCredentials': function() {
278 var result;
279 var s;
280
281 s = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
282
283 result = this.serverSideCredentialsWithSalt(s);
284
285 return result;
286 },
287
288 //=========================================================================
289/*
290 'computeServerSide_S': function(b) {
291 var result;
292 var v;
293 var bigint;
294 varsrp;
295
296 bigint = Clipperz.Crypto.BigInt;
297 srp = Clipperz.Crypto.SRP;
298
299 v = new Clipperz.Crypto.BigInt(srpConnection.serverSideCredentialsWithSalt(this.s().asString(16, 64)).v, 16);
300 // _S = (this.A().multiply(this.v().modPow(this.u(), this.n()))).modPow(this.b(), this.n());
301 result = bigint.powerModule(
302 bigint.multiply(
303 this.A(),
304 bigint.powerModule(v, this.u(), srp.n())
305 ), new Clipperz.Crypto.BigInt(b, 10), srp.n()
306 );
307
308 return result;
309 },
310*/
311 //=========================================================================
312
313 'stringHash': function(aValue) {
314 varresult;
315
316 result = this.hash(new Clipperz.ByteArray(aValue)).toHexString().substring(2);
317
318 return result;
319 },
320
321 //=========================================================================
322 __syntaxFix__: "syntax fix"
323
324});
325
326//#############################################################################
diff --git a/frontend/gamma/js/main.js b/frontend/gamma/js/main.js
index 934b325..6816754 100644
--- a/frontend/gamma/js/main.js
+++ b/frontend/gamma/js/main.js
@@ -1,93 +1,91 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26function _pm_logEvent(anEvent) { 24function _pm_logEvent(anEvent) {
27 //console.log("####", anEvent); 25 //console.log("####", anEvent);
28 26
29 anEvent.preventDefault(); 27 anEvent.preventDefault();
30} 28}
31 29
32function handleGenericDeferredError(anError) { 30function handleGenericDeferredError(anError) {
33 var result; 31 var result;
34 32
35 if (anError instanceof MochiKit.Async.CancelledError) { 33 if (anError instanceof MochiKit.Async.CancelledError) {
36 result = anError; 34 result = anError;
37 } else { 35 } else {
38MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack); 36MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
39//console.log(anError); 37//console.log(anError);
40 result = new MochiKit.Async.CancelledError(anError); 38 result = new MochiKit.Async.CancelledError(anError);
41 } 39 }
42 40
43 return result; 41 return result;
44} 42}
45 43
46 44
47Clipperz.PM.RunTime = {}; 45Clipperz.PM.RunTime = {};
48 46
49 47
50function run() { 48function run() {
51 var shouldShowRegistrationForm; 49 var shouldShowRegistrationForm;
52 var useCompactDesign; 50 var useCompactDesign;
53 var controllerParameters; 51 var controllerParameters;
54 52
55 controllerParameters = {}; 53 controllerParameters = {};
56 54
57 //MochiKit.DOM.removeElement('javaScriptAlert'); 55 //MochiKit.DOM.removeElement('javaScriptAlert');
58 Clipperz.PM.Strings.Languages.initSetup(); 56 Clipperz.PM.Strings.Languages.initSetup();
59 57
60 if (window.location.search.indexOf('registration') != -1) { 58 if (window.location.search.indexOf('registration') != -1) {
61 shouldShowRegistrationForm = true; 59 shouldShowRegistrationForm = true;
62 } else { 60 } else {
63 shouldShowRegistrationForm = false; 61 shouldShowRegistrationForm = false;
64 } 62 }
65 63
66 if (window.location.search.indexOf('autocomplete') != -1) { 64 if (window.location.search.indexOf('autocomplete') != -1) {
67 controllerParameters['autocomplete'] = 'on' 65 controllerParameters['autocomplete'] = 'on'
68 } 66 }
69 67
70 if (window.location.search.indexOf('compact') != -1) { 68 if (window.location.search.indexOf('compact') != -1) {
71 useCompactDesign = true; 69 useCompactDesign = true;
72 } else { 70 } else {
73 useCompactDesign = false; 71 useCompactDesign = false;
74 } 72 }
75 73
76 if (useCompactDesign == true) { 74 if (useCompactDesign == true) {
77 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters); 75 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters);
78 } else { 76 } else {
79 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters); 77 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters);
80 } 78 }
81 79
82 Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm); 80 Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm);
83 81
84 //Clipperz.log("HASH: " + window.location.hash); 82 //Clipperz.log("HASH: " + window.location.hash);
85 //if (window.location.hash != "") { 83 //if (window.location.hash != "") {
86 // window.location.hash = "" 84 // window.location.hash = ""
87 //} 85 //}
88 //Clipperz.log("HASH cleaned"); 86 //Clipperz.log("HASH cleaned");
89 //#credentials=base64encoded({username:'joe', passphrase:'clipperz'}) 87 //#credentials=base64encoded({username:'joe', passphrase:'clipperz'})
90 //MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'}); 88 //MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'});
91} 89}
92 90
93MochiKit.DOM.addLoadEvent(run); 91MochiKit.DOM.addLoadEvent(run);
diff --git a/frontend/gamma/js/main.mobile.js b/frontend/gamma/js/main.mobile.js
index 60a32fa..2fdd920 100644
--- a/frontend/gamma/js/main.mobile.js
+++ b/frontend/gamma/js/main.mobile.js
@@ -1,64 +1,62 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26function _pm_logEvent(anEvent) { 24function _pm_logEvent(anEvent) {
27 //console.log("####", anEvent); 25 //console.log("####", anEvent);
28 26
29 anEvent.preventDefault(); 27 anEvent.preventDefault();
30} 28}
31 29
32function handleGenericDeferredError(anError) { 30function handleGenericDeferredError(anError) {
33 var result; 31 var result;
34 32
35 if (anError instanceof MochiKit.Async.CancelledError) { 33 if (anError instanceof MochiKit.Async.CancelledError) {
36 result = anError; 34 result = anError;
37 } else { 35 } else {
38MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack); 36MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
39 result = new MochiKit.Async.CancelledError(anError); 37 result = new MochiKit.Async.CancelledError(anError);
40 } 38 }
41 39
42 return result; 40 return result;
43} 41}
44 42
45 43
46Clipperz.PM.RunTime = {}; 44Clipperz.PM.RunTime = {};
47 45
48 46
49function run() { 47function run() {
50 Clipperz.PM.Strings.Languages.initSetup(); 48 Clipperz.PM.Strings.Languages.initSetup();
51 49
52 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Mobile.Controllers.MainController(); 50 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Mobile.Controllers.MainController();
53 Clipperz.PM.RunTime.mainController.run(); 51 Clipperz.PM.RunTime.mainController.run();
54} 52}
55 53
56// if (navigator.standalone == false) { 54// if (navigator.standalone == false) {
57 // window.localStorage.setItem('PIN', '1234'); 55 // window.localStorage.setItem('PIN', '1234');
58 // alert("Saved PIN"); 56 // alert("Saved PIN");
59// } else { 57// } else {
60 // alert (window.localStorage.getItem('PIN')); 58 // alert (window.localStorage.getItem('PIN'));
61// } 59// }
62 60
63 61
64MochiKit.DOM.addLoadEvent(run); 62MochiKit.DOM.addLoadEvent(run);
diff --git a/frontend/gamma/properties/gamma.properties.json b/frontend/gamma/properties/gamma.properties.json
index eec4194..d00e03a 100644
--- a/frontend/gamma/properties/gamma.properties.json
+++ b/frontend/gamma/properties/gamma.properties.json
@@ -1,114 +1,114 @@
1{ 1{
2 "copyright.values": { 2 "copyright.values": {
3 "mochikit.repository":"https://github.com/mochi/mochikit.git", 3 "mochikit.repository":"https://github.com/mochi/mochikit.git",
4 "mochikit.version": "fe8d17bb9ac0a4e5ad4a8d5c2c94a6fac1c92d75" 4 "mochikit.version": "fe8d17bb9ac0a4e5ad4a8d5c2c94a6fac1c92d75"
5 }, 5 },
6 6
7 "html.template": "index_template.html", 7 "html.template": "index_template.html",
8 8
9 "js": [ 9 "js": [
10 "MochiKit/Base.js", 10 "MochiKit/Base.js",
11 "MochiKit/Iter.js", 11 "MochiKit/Iter.js",
12 "MochiKit/Logging.js", 12 "-- MochiKit/Logging.js",
13 "-- MochiKit/DateTime.js", 13 "-- MochiKit/DateTime.js",
14 "MochiKit/Format.js", 14 "MochiKit/Format.js",
15 "MochiKit/Async.js", 15 "MochiKit/Async.js",
16 "MochiKit/DOM.js", 16 "MochiKit/DOM.js",
17 "MochiKit/Style.js", 17 "MochiKit/Style.js",
18 "MochiKit/LoggingPane.js", 18 "-- MochiKit/LoggingPane.js",
19 "MochiKit/Color.js", 19 "MochiKit/Color.js",
20 "MochiKit/Signal.js", 20 "MochiKit/Signal.js",
21 "MochiKit/Position.js", 21 "MochiKit/Position.js",
22 "MochiKit/Selector.js", 22 "MochiKit/Selector.js",
23 "MochiKit/Visual.js", 23 "MochiKit/Visual.js",
24 24
25 "JSON/json2.js", 25 "JSON/json2.js",
26 26
27 "Clipperz/YUI/Utils.js", 27 "Clipperz/YUI/Utils.js",
28 "Clipperz/YUI/DomHelper.js", 28 "Clipperz/YUI/DomHelper.js",
29 29
30 "Clipperz/ByteArray.js", 30 "Clipperz/ByteArray.js",
31 "Clipperz/Base.js", 31 "Clipperz/Base.js",
32 "Clipperz/Async.js", 32 "Clipperz/Async.js",
33 "Clipperz/CSVProcessor.js", 33 "Clipperz/CSVProcessor.js",
34 "Clipperz/KeePassExportProcessor.js", 34 "Clipperz/KeePassExportProcessor.js",
35 "Clipperz/Date.js", 35 "Clipperz/Date.js",
36 "Clipperz/DOM.js", 36 "Clipperz/DOM.js",
37 "Clipperz/Logging.js", 37 "Clipperz/Logging.js",
38 "Clipperz/Signal.js", 38 "Clipperz/Signal.js",
39 "Clipperz/Style.js", 39 "Clipperz/Style.js",
40 "Clipperz/Visual.js", 40 "Clipperz/Visual.js",
41 "Clipperz/Set.js", 41 "Clipperz/Set.js",
42 "-- Clipperz/Profile.js", 42 "-- Clipperz/Profile.js",
43 "Clipperz/KeyValueObjectStore.js", 43 "Clipperz/KeyValueObjectStore.js",
44 44
45 "Clipperz/Crypto/SHA.js", 45 "Clipperz/Crypto/SHA.js",
46 "Clipperz/Crypto/AES.js", 46 "Clipperz/Crypto/AES.js",
47 "Clipperz/Crypto/PRNG.js", 47 "Clipperz/Crypto/PRNG.js",
48 "Clipperz/Crypto/BigInt.js", 48 "Clipperz/Crypto/BigInt.js",
49 "Clipperz/Crypto/Base.js", 49 "Clipperz/Crypto/Base.js",
50 "Clipperz/Crypto/SRP.js", 50 "Clipperz/Crypto/SRP.js",
51 "Clipperz/Crypto/RSA.js", 51 "Clipperz/Crypto/RSA.js",
52 52
53 "Clipperz/PM/Strings/Strings_defaults.js", 53 "Clipperz/PM/Strings/Strings_defaults.js",
54 "Clipperz/PM/Strings/Strings_en-US.js", 54 "Clipperz/PM/Strings/Strings_en-US.js",
55 "-- # Clipperz/PM/Strings/Strings_en-GB.js", 55 "-- # Clipperz/PM/Strings/Strings_en-GB.js",
56 "-- # Clipperz/PM/Strings/Strings_en-CA.js", 56 "-- # Clipperz/PM/Strings/Strings_en-CA.js",
57 "-- Clipperz/PM/Strings/Strings_it-IT.js", 57 "-- Clipperz/PM/Strings/Strings_it-IT.js",
58 "-- Clipperz/PM/Strings/Strings_pt-BR.js", 58 "-- Clipperz/PM/Strings/Strings_pt-BR.js",
59 "-- # Clipperz/PM/Strings/Strings_pt-PT.js", 59 "-- # Clipperz/PM/Strings/Strings_pt-PT.js",
60 "-- Clipperz/PM/Strings/Strings_ja-JP.js", 60 "-- Clipperz/PM/Strings/Strings_ja-JP.js",
61 "-- Clipperz/PM/Strings/Strings_zh-CN.js", 61 "-- Clipperz/PM/Strings/Strings_zh-CN.js",
62 "-- Clipperz/PM/Strings/Strings_es-ES.js", 62 "-- Clipperz/PM/Strings/Strings_es-ES.js",
63 "-- Clipperz/PM/Strings/Strings_fr-FR.js", 63 "-- Clipperz/PM/Strings/Strings_fr-FR.js",
64 "-- # Clipperz/PM/Strings/Strings_de-DE.js", 64 "-- # Clipperz/PM/Strings/Strings_de-DE.js",
65 "-- # Clipperz/PM/Strings/Strings_el-GR.js", 65 "-- # Clipperz/PM/Strings/Strings_el-GR.js",
66 "-- # Clipperz/PM/Strings/Strings_ru-RU.js", 66 "-- # Clipperz/PM/Strings/Strings_ru-RU.js",
67 "-- # Clipperz/PM/Strings/Strings_he-IL.js", 67 "-- # Clipperz/PM/Strings/Strings_he-IL.js",
68 "Clipperz/PM/Strings.js", 68 "Clipperz/PM/Strings.js",
69 "-- Clipperz/PM/Strings/MessagePanelConfigurations.js", 69 "-- Clipperz/PM/Strings/MessagePanelConfigurations.js",
70 70
71 "Clipperz/PM/Date.js", 71 "Clipperz/PM/Date.js",
72 72
73 "Clipperz/PM/Toll.js", 73 "Clipperz/PM/Toll.js",
74 "Clipperz/PM/Proxy.js", 74 "Clipperz/PM/Proxy.js",
75 "Clipperz/PM/Proxy/Proxy.JSON.js", 75 "Clipperz/PM/Proxy/Proxy.JSON.js",
76 "Clipperz/PM/Proxy/Proxy.Offline.js", 76 "Clipperz/PM/Proxy/Proxy.Offline.js",
77 "Clipperz/PM/Proxy/Proxy.Offline.DataStore.js", 77 "Clipperz/PM/Proxy/Proxy.Offline.DataStore.js",
78 "Clipperz/PM/Connection.js", 78 "Clipperz/PM/Connection.js",
79 "Clipperz/PM/Crypto.js", 79 "Clipperz/PM/Crypto.js",
80 "Clipperz/PM/BookmarkletProcessor.js", 80 "Clipperz/PM/BookmarkletProcessor.js",
81 81
82 "Clipperz/PM/DataModel/EncryptedRemoteObject.js", 82 "Clipperz/PM/DataModel/EncryptedRemoteObject.js",
83 "Clipperz/PM/DataModel/User.js", 83 "Clipperz/PM/DataModel/User.js",
84 "Clipperz/PM/DataModel/User.Header.Legacy.js", 84 "Clipperz/PM/DataModel/User.Header.Legacy.js",
85 "Clipperz/PM/DataModel/User.Header.RecordIndex.js", 85 "Clipperz/PM/DataModel/User.Header.RecordIndex.js",
86 "Clipperz/PM/DataModel/User.Header.Preferences.js", 86 "Clipperz/PM/DataModel/User.Header.Preferences.js",
87 "Clipperz/PM/DataModel/User.Header.OneTimePasswords.js", 87 "Clipperz/PM/DataModel/User.Header.OneTimePasswords.js",
88 "Clipperz/PM/DataModel/Record.js", 88 "Clipperz/PM/DataModel/Record.js",
89 "Clipperz/PM/DataModel/Record.Version.js", 89 "Clipperz/PM/DataModel/Record.Version.js",
90 "Clipperz/PM/DataModel/Record.Version.Field.js", 90 "Clipperz/PM/DataModel/Record.Version.Field.js",
91 "Clipperz/PM/DataModel/DirectLogin.js", 91 "Clipperz/PM/DataModel/DirectLogin.js",
92 "Clipperz/PM/DataModel/DirectLoginInput.js", 92 "Clipperz/PM/DataModel/DirectLoginInput.js",
93 "Clipperz/PM/DataModel/DirectLoginBinding.js", 93 "Clipperz/PM/DataModel/DirectLoginBinding.js",
94 "Clipperz/PM/DataModel/DirectLoginFormValue.js", 94 "Clipperz/PM/DataModel/DirectLoginFormValue.js",
95 "Clipperz/PM/DataModel/OneTimePassword.js", 95 "Clipperz/PM/DataModel/OneTimePassword.js",
96 96
97 "Clipperz/PM/UI/Canvas/Marks/exclamationMark.js", 97 "Clipperz/PM/UI/Canvas/Marks/exclamationMark.js",
98 "Clipperz/PM/UI/Canvas/Marks/questionMark.js", 98 "Clipperz/PM/UI/Canvas/Marks/questionMark.js",
99 "Clipperz/PM/UI/Canvas/Marks/info.js", 99 "Clipperz/PM/UI/Canvas/Marks/info.js",
100 100
101 "Clipperz/PM/UI/Canvas/Features/store.js", 101 "Clipperz/PM/UI/Canvas/Features/store.js",
102 "Clipperz/PM/UI/Canvas/Features/protect.js", 102 "Clipperz/PM/UI/Canvas/Features/protect.js",
103 "Clipperz/PM/UI/Canvas/Features/directLogin.js", 103 "Clipperz/PM/UI/Canvas/Features/directLogin.js",
104 "Clipperz/PM/UI/Canvas/Features/share.js", 104 "Clipperz/PM/UI/Canvas/Features/share.js",
105 105
106 "Clipperz/PM/UI/Canvas/Star/normal.js", 106 "Clipperz/PM/UI/Canvas/Star/normal.js",
107 107
108 "Clipperz/PM/UI/Canvas/CoverActions/look.js", 108 "Clipperz/PM/UI/Canvas/CoverActions/look.js",
109 "Clipperz/PM/UI/Canvas/CoverActions/download.js", 109 "Clipperz/PM/UI/Canvas/CoverActions/download.js",
110 110
111 "Clipperz/PM/UI/Canvas/Tips/open.js", 111 "Clipperz/PM/UI/Canvas/Tips/open.js",
112 "Clipperz/PM/UI/Canvas/Tips/close.js", 112 "Clipperz/PM/UI/Canvas/Tips/close.js",
113 113
114 "Clipperz/PM/UI/Canvas/RegisterButton/normal.js", 114 "Clipperz/PM/UI/Canvas/RegisterButton/normal.js",
diff --git a/frontend/gamma/properties/mobile.properties.json b/frontend/gamma/properties/mobile.properties.json
index bdb2d07..0127ce6 100644
--- a/frontend/gamma/properties/mobile.properties.json
+++ b/frontend/gamma/properties/mobile.properties.json
@@ -2,141 +2,155 @@
2 "copyright.values": { 2 "copyright.values": {
3 "mochikit.repository": "https://github.com/mochi/mochikit.git", 3 "mochikit.repository": "https://github.com/mochi/mochikit.git",
4 "mochikit.version": "fe8d17bb9ac0a4e5ad4a8d5c2c94a6fac1c92d75" 4 "mochikit.version": "fe8d17bb9ac0a4e5ad4a8d5c2c94a6fac1c92d75"
5 }, 5 },
6 6
7 "html.template": "mobile_template.html", 7 "html.template": "mobile_template.html",
8 8
9 "js": [ 9 "js": [
10 "MochiKit/Base.js", 10 "MochiKit/Base.js",
11 "MochiKit/Iter.js", 11 "MochiKit/Iter.js",
12 "MochiKit/Logging.js", 12 "MochiKit/Logging.js",
13 "MochiKit/DateTime.js", 13 "MochiKit/DateTime.js",
14 "MochiKit/Format.js", 14 "MochiKit/Format.js",
15 "MochiKit/Async.js", 15 "MochiKit/Async.js",
16 "MochiKit/DOM.js", 16 "MochiKit/DOM.js",
17 "MochiKit/Style.js", 17 "MochiKit/Style.js",
18 "MochiKit/LoggingPane.js", 18 "MochiKit/LoggingPane.js",
19 "-- MochiKit/Color.js", 19 "-- MochiKit/Color.js",
20 "MochiKit/Signal.js", 20 "MochiKit/Signal.js",
21 "-- MochiKit/Position.js", 21 "-- MochiKit/Position.js",
22 "MochiKit/Selector.js", 22 "MochiKit/Selector.js",
23 "-- MochiKit/Visual.js", 23 "-- MochiKit/Visual.js",
24 24
25 "JSON/json2.js", 25 "JSON/json2.js",
26 26
27 "Clipperz/YUI/Utils.js", 27 "Clipperz/YUI/Utils.js",
28 "Clipperz/YUI/DomHelper.js", 28 "Clipperz/YUI/DomHelper.js",
29 29
30 "Clipperz/ByteArray.js", 30 "Clipperz/ByteArray.js",
31 "Clipperz/Base.js", 31 "Clipperz/Base.js",
32 "Clipperz/Async.js", 32 "Clipperz/Async.js",
33 "-- Clipperz/CSVProcessor.js", 33 "-- Clipperz/CSVProcessor.js",
34 "-- Clipperz/KeePassExportProcessor.js", 34 "-- Clipperz/KeePassExportProcessor.js",
35 "Clipperz/Date.js", 35 "Clipperz/Date.js",
36 "Clipperz/DOM.js", 36 "Clipperz/DOM.js",
37 "Clipperz/Logging.js", 37 "Clipperz/Logging.js",
38 "Clipperz/Signal.js", 38 "Clipperz/Signal.js",
39 "-- Clipperz/Style.js", 39 "-- Clipperz/Style.js",
40 "-- Clipperz/Visual.js", 40 "-- Clipperz/Visual.js",
41 "Clipperz/Set.js", 41 "Clipperz/Set.js",
42 "Clipperz/KeyValueObjectStore.js", 42 "Clipperz/KeyValueObjectStore.js",
43 43
44 "Clipperz/Crypto/SHA.js", 44 "Clipperz/Crypto/SHA.js",
45 "Clipperz/Crypto/AES.js", 45 "Clipperz/Crypto/AES.js",
46 "Clipperz/Crypto/PRNG.js", 46 "Clipperz/Crypto/PRNG.js",
47 "Clipperz/Crypto/BigInt.js", 47 "Clipperz/Crypto/BigInt.js",
48 "Clipperz/Crypto/Base.js", 48 "Clipperz/Crypto/Base.js",
49 "Clipperz/Crypto/SRP.js", 49 "Clipperz/Crypto/SRP.js",
50 "Clipperz/Crypto/RSA.js", 50 "Clipperz/Crypto/RSA.js",
51 51
52 "Clipperz/PM/Strings/Strings_defaults.js", 52 "Clipperz/PM/Strings/Strings_defaults.js",
53 "Clipperz/PM/Strings/Strings_en-US.js", 53 "Clipperz/PM/Strings/Strings_en-US.js",
54 "-- # Clipperz/PM/Strings/Strings_en-GB.js", 54 "-- # Clipperz/PM/Strings/Strings_en-GB.js",
55 "-- # Clipperz/PM/Strings/Strings_en-CA.js", 55 "-- # Clipperz/PM/Strings/Strings_en-CA.js",
56 "-- Clipperz/PM/Strings/Strings_it-IT.js", 56 "-- Clipperz/PM/Strings/Strings_it-IT.js",
57 "-- Clipperz/PM/Strings/Strings_pt-BR.js", 57 "-- Clipperz/PM/Strings/Strings_pt-BR.js",
58 "-- # Clipperz/PM/Strings/Strings_pt-PT.js", 58 "-- # Clipperz/PM/Strings/Strings_pt-PT.js",
59 "-- Clipperz/PM/Strings/Strings_ja-JP.js", 59 "-- Clipperz/PM/Strings/Strings_ja-JP.js",
60 "-- Clipperz/PM/Strings/Strings_zh-CN.js", 60 "-- Clipperz/PM/Strings/Strings_zh-CN.js",
61 "-- Clipperz/PM/Strings/Strings_es-ES.js", 61 "-- Clipperz/PM/Strings/Strings_es-ES.js",
62 "-- Clipperz/PM/Strings/Strings_fr-FR.js", 62 "-- Clipperz/PM/Strings/Strings_fr-FR.js",
63 "-- # Clipperz/PM/Strings/Strings_de-DE.js", 63 "-- # Clipperz/PM/Strings/Strings_de-DE.js",
64 "-- # Clipperz/PM/Strings/Strings_el-GR.js", 64 "-- # Clipperz/PM/Strings/Strings_el-GR.js",
65 "-- # Clipperz/PM/Strings/Strings_ru-RU.js", 65 "-- # Clipperz/PM/Strings/Strings_ru-RU.js",
66 "-- # Clipperz/PM/Strings/Strings_he-IL.js", 66 "-- # Clipperz/PM/Strings/Strings_he-IL.js",
67 "Clipperz/PM/Strings.js", 67 "Clipperz/PM/Strings.js",
68 "-- Clipperz/PM/Strings/MessagePanelConfigurations.js", 68 "-- Clipperz/PM/Strings/MessagePanelConfigurations.js",
69 69
70 "Clipperz/PM/Date.js", 70 "Clipperz/PM/Date.js",
71 71
72 "Clipperz/PM/Toll.js", 72 "Clipperz/PM/Toll.js",
73 "Clipperz/PM/Proxy.js", 73 "Clipperz/PM/Proxy.js",
74 "Clipperz/PM/Proxy/Proxy.JSON.js", 74 "Clipperz/PM/Proxy/Proxy.JSON.js",
75 "-- Clipperz/PM/Proxy/Proxy.OfflineCache.js", 75 "-- Clipperz/PM/Proxy/Proxy.OfflineCache.js",
76 "Clipperz/PM/Proxy/Proxy.Offline.js", 76 "Clipperz/PM/Proxy/Proxy.Offline.js",
77 "Clipperz/PM/Proxy/Proxy.Offline.DataStore.js", 77 "Clipperz/PM/Proxy/Proxy.Offline.DataStore.js",
78 78
79 "Clipperz/PM/Connection.js", 79 "Clipperz/PM/Connection.js",
80 "Clipperz/PM/Crypto.js", 80 "Clipperz/PM/Crypto.js",
81 "Clipperz/PM/PIN.js", 81 "Clipperz/PM/PIN.js",
82 82
83 "Clipperz/PM/DataModel/EncryptedRemoteObject.js", 83 "Clipperz/PM/DataModel/EncryptedRemoteObject.js",
84 "Clipperz/PM/DataModel/User.js", 84 "Clipperz/PM/DataModel/User.js",
85 "Clipperz/PM/DataModel/User.Header.Legacy.js", 85 "Clipperz/PM/DataModel/User.Header.Legacy.js",
86 "Clipperz/PM/DataModel/User.Header.RecordIndex.js", 86 "Clipperz/PM/DataModel/User.Header.RecordIndex.js",
87 "Clipperz/PM/DataModel/User.Header.Preferences.js", 87 "Clipperz/PM/DataModel/User.Header.Preferences.js",
88 "Clipperz/PM/DataModel/User.Header.OneTimePasswords.js", 88 "Clipperz/PM/DataModel/User.Header.OneTimePasswords.js",
89 "Clipperz/PM/DataModel/Record.js", 89 "Clipperz/PM/DataModel/Record.js",
90 "Clipperz/PM/DataModel/Record.Version.js", 90 "Clipperz/PM/DataModel/Record.Version.js",
91 "Clipperz/PM/DataModel/Record.Version.Field.js", 91 "Clipperz/PM/DataModel/Record.Version.Field.js",
92 "Clipperz/PM/DataModel/DirectLogin.js", 92 "Clipperz/PM/DataModel/DirectLogin.js",
93 "Clipperz/PM/DataModel/DirectLoginInput.js", 93 "Clipperz/PM/DataModel/DirectLoginInput.js",
94 "Clipperz/PM/DataModel/DirectLoginBinding.js", 94 "Clipperz/PM/DataModel/DirectLoginBinding.js",
95 "Clipperz/PM/DataModel/DirectLoginFormValue.js", 95 "Clipperz/PM/DataModel/DirectLoginFormValue.js",
96 "Clipperz/PM/DataModel/OneTimePassword.js", 96 "Clipperz/PM/DataModel/OneTimePassword.js",
97 97
98 "Zepto/zepto.js", 98 "-- Zepto/zepto.js",
99 "Zepto/ajax.js", 99 "-- Zepto/ajax.js",
100 "Zepto/assets.js", 100 "-- Zepto/assets.js",
101 "Zepto/data.js", 101 "-- Zepto/data.js",
102 "Zepto/detect.js", 102 "-- Zepto/detect.js",
103 "Zepto/event.js", 103 "-- Zepto/event.js",
104 "Zepto/form.js", 104 "-- Zepto/form.js",
105 "Zepto/fx.js", 105 "-- Zepto/fx.js",
106 "Zepto/fx_methods.js", 106 "-- Zepto/fx_methods.js",
107 "Zepto/gesture.js", 107 "-- Zepto/gesture.js",
108 "Zepto/polyfill.js", 108 "-- Zepto/polyfill.js",
109 "Zepto/selector.js", 109 "-- Zepto/selector.js",
110 "Zepto/stack.js", 110 "-- Zepto/stack.js",
111 "Zepto/touch.js", 111 "-- Zepto/touch.js",
112 112
113 "JQTouch/jqtouch.js", 113 "-- JQTouch/jqtouch.js",
114
115 "-- Bootstrap/bootstrap-affix.js",
116 "-- Bootstrap/bootstrap-alert.js",
117 "-- Bootstrap/bootstrap-button.js",
118 "-- Bootstrap/bootstrap-carousel.js",
119 "-- Bootstrap/bootstrap-collapse.js",
120 "-- Bootstrap/bootstrap-dropdown.js",
121 "-- Bootstrap/bootstrap-modal.js",
122 "-- Bootstrap/bootstrap-popover.js",
123 "-- Bootstrap/bootstrap-scrollspy.js",
124 "-- Bootstrap/bootstrap-tab.js",
125 "-- Bootstrap/bootstrap-tooltip.js",
126 "-- Bootstrap/bootstrap-transition.js",
127 "-- Bootstrap/bootstrap-typeahead.js",
114 128
115 "Clipperz/PM/UI/Common/Components/BaseComponent.js", 129 "Clipperz/PM/UI/Common/Components/BaseComponent.js",
116 "-- Clipperz/PM/UI/Common/Components/Button.js", 130 "-- Clipperz/PM/UI/Common/Components/Button.js",
117 "Clipperz/PM/UI/Common/Components/ComponentSlot.js", 131 "Clipperz/PM/UI/Common/Components/ComponentSlot.js",
118 "-- Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js", 132 "-- Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js",
119 "Clipperz/PM/UI/Common/Components/ProgressBar.js", 133 "Clipperz/PM/UI/Common/Components/ProgressBar.js",
120 "-- Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js", 134 "-- Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js",
121 "-- Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js", 135 "-- Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js",
122 "-- Clipperz/PM/UI/Common/Components/TabPanelComponent.js", 136 "-- Clipperz/PM/UI/Common/Components/TabPanelComponent.js",
123 "-- Clipperz/PM/UI/Common/Components/Tooltip.js", 137 "-- Clipperz/PM/UI/Common/Components/Tooltip.js",
124 "-- Clipperz/PM/UI/Common/Components/TranslatorWidget.js", 138 "-- Clipperz/PM/UI/Common/Components/TranslatorWidget.js",
125 139
126 "Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js", 140 "Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js",
127 "Clipperz/PM/UI/Common/Controllers/ProgressBarController.js", 141 "Clipperz/PM/UI/Common/Controllers/ProgressBarController.js",
128 "-- Clipperz/PM/UI/Common/Controllers/TabPanelController.js", 142 "-- Clipperz/PM/UI/Common/Controllers/TabPanelController.js",
129 143
130 "Clipperz/PM/UI/Mobile/Components/LoginForm.js", 144 "Clipperz/PM/UI/Mobile/Components/LoginForm.js",
131 "Clipperz/PM/UI/Mobile/Components/CardList.js", 145 "Clipperz/PM/UI/Mobile/Components/CardList.js",
132 "-- Clipperz/PM/UI/Mobile/Components/CardDetail.js", 146 "-- Clipperz/PM/UI/Mobile/Components/CardDetail.js",
133 147
134 "Clipperz/PM/UI/Mobile/Controllers/MainController.js", 148 "Clipperz/PM/UI/Mobile/Controllers/MainController.js",
135 149
136 "main.mobile.js" 150 "main.mobile.js"
137 ], 151 ],
138 152
139 "css": [ 153 "css": [
140 "mobile.css" 154 "mobile.css"
141 ] 155 ]
142} \ No newline at end of file 156} \ No newline at end of file
diff --git a/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js b/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js
index 3633182..268a04d 100644
--- a/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js
+++ b/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26MochiKit.Base.update(Clipperz.Async.Deferred.prototype, { 24MochiKit.Base.update(Clipperz.Async.Deferred.prototype, {
27/* 25/*
28 '_addTest': function(anExpectedValue, aDescription, isDeep, aResult) { 26 '_addTest': function(anExpectedValue, aDescription, isDeep, aResult) {
29 if (isDeep) { 27 if (isDeep) {
30 SimpleTest.isDeeply(aResult, anExpectedValue, aDescription); 28 SimpleTest.isDeeply(aResult, anExpectedValue, aDescription);
31 } else { 29 } else {
32 SimpleTest.is(aResult, anExpectedValue, aDescription); 30 SimpleTest.is(aResult, anExpectedValue, aDescription);
33 } 31 }
34 32
35 return aResult; 33 return aResult;
36 }, 34 },
37*/ 35*/
38 'addTest': function (anExpectedValue, aDescription, isDeep) { 36 'addTest': function (anExpectedValue, aDescription, isDeep) {
39 // this.addMethod(this, '_addTest', anExpectedValue, aDescription, isDeep); 37 // this.addMethod(this, '_addTest', anExpectedValue, aDescription, isDeep);
40 // this.addCallback(Clipperz.Async.test, anExpectedValue, aDescription, isDeep); 38 // this.addCallback(Clipperz.Async.test, anExpectedValue, aDescription, isDeep);
41 39
42 if (isDeep) { 40 if (isDeep) {
43 // SimpleTest.isDeeply(aResult, anExpectedValue, aDescription); 41 // SimpleTest.isDeeply(aResult, anExpectedValue, aDescription);
44 this.addCallback(Clipperz.Async.Test.isDeeply(anExpectedValue, aDescription)); 42 this.addCallback(Clipperz.Async.Test.isDeeply(anExpectedValue, aDescription));
45 } else { 43 } else {
46 // SimpleTest.is(aResult, anExpectedValue, aDescription); 44 // SimpleTest.is(aResult, anExpectedValue, aDescription);
47 this.addCallback(Clipperz.Async.Test.is(anExpectedValue, aDescription)); 45 this.addCallback(Clipperz.Async.Test.is(anExpectedValue, aDescription));
48 } 46 }
49 }, 47 },
50 48
51 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
52 50
53 'shouldSucceed': function (aDescription) { 51 'shouldSucceed': function (aDescription) {
54 this.addCallbackPass(SimpleTest.ok, true, aDescription); 52 this.addCallbackPass(SimpleTest.ok, true, aDescription);
55 this.addErrbackPass (SimpleTest.ok, false, aDescription); 53 this.addErrbackPass (SimpleTest.ok, false, aDescription);
56 this.addBoth(MochiKit.Async.succeed, null); 54 this.addBoth(MochiKit.Async.succeed, null);
57 }, 55 },
58 56
59 'shouldFail': function (aDescription) { 57 'shouldFail': function (aDescription) {
60 this.addCallbackPass(SimpleTest.ok, false, aDescription); 58 this.addCallbackPass(SimpleTest.ok, false, aDescription);
61 this.addErrbackPass (SimpleTest.ok, true, aDescription); 59 this.addErrbackPass (SimpleTest.ok, true, aDescription);
62 this.addBoth(MochiKit.Async.succeed, null); 60 this.addBoth(MochiKit.Async.succeed, null);
63 }, 61 },
64 62
65 //------------------------------------------------------------------------- 63 //-------------------------------------------------------------------------
66 64
67}); 65});
68 66
69 67
70Clipperz.Async.Test = {}; 68Clipperz.Async.Test = {};
71MochiKit.Base.update(Clipperz.Async.Test, { 69MochiKit.Base.update(Clipperz.Async.Test, {
72 70
73 'is': function (anExpectedResult, aDescription) { 71 'is': function (anExpectedResult, aDescription) {
74 return MochiKit.Base.partial(function (anExpectedResult, aDescription, aResult) { 72 return MochiKit.Base.partial(function (anExpectedResult, aDescription, aResult) {
75 SimpleTest.is(aResult, anExpectedResult, aDescription); 73 SimpleTest.is(aResult, anExpectedResult, aDescription);
76 74
77 return aResult; 75 return aResult;
78 }, anExpectedResult, aDescription); 76 }, anExpectedResult, aDescription);
79 }, 77 },
80 78
81 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
82 80
83 'ok': function (aDescription) { 81 'ok': function (aDescription) {
84 return MochiKit.Base.partial(function (aDescription, aResult) { 82 return MochiKit.Base.partial(function (aDescription, aResult) {
85 SimpleTest.ok(aResult, aDescription); 83 SimpleTest.ok(aResult, aDescription);
86 84
87 return aResult; 85 return aResult;
88 }, aDescription); 86 }, aDescription);
89 }, 87 },
90 88
91 //------------------------------------------------------------------------- 89 //-------------------------------------------------------------------------
92 90
93 'fail': function(aDescription) { 91 'fail': function(aDescription) {
94 return MochiKit.Base.partial(function (aDescription, aResult) { 92 return MochiKit.Base.partial(function (aDescription, aResult) {
95 SimpleTest.ok(!aResult, aDescription); 93 SimpleTest.ok(!aResult, aDescription);
96 94
97 return aResult; 95 return aResult;
98 }, aDescription); 96 }, aDescription);
99 }, 97 },
100 98
101 //------------------------------------------------------------------------- 99 //-------------------------------------------------------------------------
102 100
103 'isDeeply': function (anExpectedResult, aDescription) { 101 'isDeeply': function (anExpectedResult, aDescription) {
104 return MochiKit.Base.partial(function (anExpectedResult, aDescription, aResult) { 102 return MochiKit.Base.partial(function (anExpectedResult, aDescription, aResult) {
105 SimpleTest.isDeeply(aResult, anExpectedResult, aDescription); 103 SimpleTest.isDeeply(aResult, anExpectedResult, aDescription);
106 104
107 return aResult; 105 return aResult;
108 }, anExpectedResult, aDescription); 106 }, anExpectedResult, aDescription);
109 }, 107 },
110 108
111 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
112 __syntaxFix__: "syntax fix" 110 __syntaxFix__: "syntax fix"
113}); 111});
114 112
115 113
116SimpleTest.runDeferredTests = function (aName, aTestSet, aTestArguments) { 114SimpleTest.runDeferredTests = function (aName, aTestSet, aTestArguments) {
117 try { 115 try {
118 var deferredTests; 116 var deferredTests;
diff --git a/frontend/gamma/tests/index.html b/frontend/gamma/tests/index.html
index ef89088..99fad81 100755
--- a/frontend/gamma/tests/index.html
+++ b/frontend/gamma/tests/index.html
@@ -1,53 +1,51 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="./SimpleTest/TestRunner.js"></script> 27 <script type="text/javascript" src="./SimpleTest/TestRunner.js"></script>
30</head> 28</head>
31<body> 29<body>
32<script type="text/javascript"> 30<script type="text/javascript">
33TestRunner.runTests( 31TestRunner.runTests(
34/* 32/*
35 //'tests/Clipperz/Base.html', 33 //'tests/Clipperz/Base.html',
36 //'tests/Clipperz/Set.html', 34 //'tests/Clipperz/Set.html',
37 'tests/Clipperz/index.html', 35 'tests/Clipperz/index.html',
38 36
39 //'tests/Clipperz/Crypto/Base.html', 37 //'tests/Clipperz/Crypto/Base.html',
40 //'tests/Clipperz/Crypto/BigInt.html', 38 //'tests/Clipperz/Crypto/BigInt.html',
41 //'tests/Clipperz/Crypto/SRP.html' 39 //'tests/Clipperz/Crypto/SRP.html'
42 'tests/Clipperz/Crypto/index.html', 40 'tests/Clipperz/Crypto/index.html',
43 'tests/Clipperz/PM/index.html', 41 'tests/Clipperz/PM/index.html',
44 'tests/Clipperz/PM/DataModel/index.html' 42 'tests/Clipperz/PM/DataModel/index.html'
45*/ 43*/
46 44
47 'tests/index.html' 45 'tests/index.html'
48 46
49 47
50); 48);
51</script> 49</script>
52</body> 50</body>
53</html> \ No newline at end of file 51</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css b/frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css
index fd79d8a..8a6bae6 100644
--- a/frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css
+++ b/frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26/* @override 24/* @override
27 http://localhost:8000/tests/js/tests/Bookmarklet/Bookmarklet.css 25 http://localhost:8000/tests/js/tests/Bookmarklet/Bookmarklet.css
28 http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/Bookmarklet.css 26 http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/Bookmarklet.css
29*/ 27*/
30 28
31div#clipperzBookmarklet { 29div#clipperzBookmarklet {
32 margin: 0; 30 margin: 0;
33 padding: 0; 31 padding: 0;
34 border: 0; 32 border: 0;
35 outline: 0; 33 outline: 0;
36 font-size: 100%; 34 font-size: 100%;
37 vertical-align: baseline; 35 vertical-align: baseline;
38 background: transparent; 36 background: transparent;
39 37
40 position: absolute; 38 position: absolute;
41 top: 80px; 39 top: 80px;
42 left: 100px; 40 left: 100px;
43 width: 202px; 41 width: 202px;
44 height: 202px; 42 height: 202px;
45 background: url(./background.png) no-repeat; 43 background: url(./background.png) no-repeat;
46} 44}
47 45
48div#clipperzBookmarklet div#clipperzBookmarkletClose { 46div#clipperzBookmarklet div#clipperzBookmarkletClose {
49 margin: 0; 47 margin: 0;
50 padding: 0; 48 padding: 0;
51 border: 0; 49 border: 0;
52 outline: 0; 50 outline: 0;
53 font-size: 100%; 51 font-size: 100%;
54 vertical-align: baseline; 52 vertical-align: baseline;
55 background: transparent; 53 background: transparent;
56 54
57 position: absolute; 55 position: absolute;
58 left: 168px; 56 left: 168px;
59 top: 5px; 57 top: 5px;
60 width: 25px; 58 width: 25px;
61 height: 25px; 59 height: 25px;
62 background: url(./close.png) no-repeat; 60 background: url(./close.png) no-repeat;
63} 61}
64 62
65div#clipperzBookmarklet div#clipperzBookmarkletClose:hover { 63div#clipperzBookmarklet div#clipperzBookmarkletClose:hover {
66 background: url(./close_selected.png) no-repeat; 64 background: url(./close_selected.png) no-repeat;
67 cursor: pointer; 65 cursor: pointer;
68} 66}
69 67
70div#clipperzBookmarklet div#clipperzBookmarkletResult { 68div#clipperzBookmarklet div#clipperzBookmarkletResult {
71 margin: 0; 69 margin: 0;
72 padding: 0; 70 padding: 0;
73 border: 0; 71 border: 0;
74 outline: 0; 72 outline: 0;
75 font-size: 100%; 73 font-size: 100%;
76 vertical-align: baseline; 74 vertical-align: baseline;
77 background: transparent; 75 background: transparent;
78 76
79 position: absolute; 77 position: absolute;
80 width: 145px; 78 width: 145px;
81 top: 61px; 79 top: 61px;
82 left: 27px; 80 left: 27px;
83 height: 63px; 81 height: 63px;
84 overflow: hidden; 82 overflow: hidden;
85} 83}
86 84
87div#clipperzBookmarklet div#clipperzBookmarkletResultIcon { 85div#clipperzBookmarklet div#clipperzBookmarkletResultIcon {
88 margin: 0; 86 margin: 0;
89 padding: 0; 87 padding: 0;
90 border: 0; 88 border: 0;
91 outline: 0; 89 outline: 0;
92 font-size: 100%; 90 font-size: 100%;
93 vertical-align: baseline; 91 vertical-align: baseline;
94 92
95 width: 28px; 93 width: 28px;
96 height: 35px; 94 height: 35px;
97 position: absolute; 95 position: absolute;
98} 96}
99 97
100div#clipperzBookmarklet div#clipperzBookmarkletResultIcon.ok { 98div#clipperzBookmarklet div#clipperzBookmarkletResultIcon.ok {
101 background: transparent url(./info.png); 99 background: transparent url(./info.png);
102} 100}
103 101
104div#clipperzBookmarklet div#clipperzBookmarkletResultIcon.fail { 102div#clipperzBookmarklet div#clipperzBookmarkletResultIcon.fail {
105 background: transparent url(./error.png); 103 background: transparent url(./error.png);
106} 104}
107 105
108div#clipperzBookmarklet div#clipperzBookmarkletResult p { 106div#clipperzBookmarklet div#clipperzBookmarkletResult p {
109 margin: 0; 107 margin: 0;
110 padding: 0; 108 padding: 0;
111 border: 0; 109 border: 0;
112 outline: 0; 110 outline: 0;
113 font-size: 100%; 111 font-size: 100%;
114 vertical-align: baseline; 112 vertical-align: baseline;
115 background: transparent; 113 background: transparent;
116 114
117 font-family: Helvetica, Arial, Geneva, sans-serif; 115 font-family: Helvetica, Arial, Geneva, sans-serif;
118 color: #898e7d; 116 color: #898e7d;
diff --git a/frontend/gamma/tests/tests/Bookmarklet/Fail.html b/frontend/gamma/tests/tests/Bookmarklet/Fail.html
index d3d1ec9..dfca010 100644
--- a/frontend/gamma/tests/tests/Bookmarklet/Fail.html
+++ b/frontend/gamma/tests/tests/Bookmarklet/Fail.html
@@ -1,110 +1,108 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Bookmarlet TEST - fail</title> 26 <title>Bookmarlet TEST - fail</title>
29 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
30 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 28 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
31 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 29 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
32 30
33 <!-- link rel="stylesheet" type="text/css" href="./Bookmarklet.css" --> 31 <!-- link rel="stylesheet" type="text/css" href="./Bookmarklet.css" -->
34 <script type='text/javascript' src='../../../js/Bookmarklet.js'></script> 32 <script type='text/javascript' src='../../../js/Bookmarklet.js'></script>
35 <script type='text/javascript' src='../../../../_build/_scratch/bookmarklet_test.js'></script> 33 <script type='text/javascript' src='../../../../_build/_scratch/bookmarklet_test.js'></script>
36</head> 34</head>
37<body> 35<body>
38 36
39<!-- TWITTER Login Form --> 37<!-- TWITTER Login Form -->
40<!-- form id="signin" action="https://twitter.com/sessions" method="post"> 38<!-- form id="signin" action="https://twitter.com/sessions" method="post">
41 <input id="authenticity_token" type="hidden" value="a3a9abfa089122e4b437736313e54f2a25911101" name="authenticity_token"/> 39 <input id="authenticity_token" type="hidden" value="a3a9abfa089122e4b437736313e54f2a25911101" name="authenticity_token"/>
42 <fieldset class="common-form standard-form"> 40 <fieldset class="common-form standard-form">
43 <legend>Please sign in</legend> 41 <legend>Please sign in</legend>
44 <p> 42 <p>
45 <label class="inside" for="username" tabindex="1">user name or email address:</label> 43 <label class="inside" for="username" tabindex="1">user name or email address:</label>
46 <input id="username" type="text" title="username" value="" name="session[username_or_email]"/> 44 <input id="username" type="text" title="username" value="" name="session[username_or_email]"/>
47 </p> 45 </p>
48 <p> 46 <p>
49 <label class="inside" for="password" tabindex="2">password:</label> 47 <label class="inside" for="password" tabindex="2">password:</label>
50 <input id="password" type="password" title="password" value="" name="session[password]"/> 48 <input id="password" type="password" title="password" value="" name="session[password]"/>
51 </p> 49 </p>
52 <p class="remember"></p> 50 <p class="remember"></p>
53 <p class="submit"></p> 51 <p class="submit"></p>
54 <p class="forgot"></p> 52 <p class="forgot"></p>
55 <p class="complete"></p> 53 <p class="complete"></p>
56 </fieldset> 54 </fieldset>
57</form --> 55</form -->
58 56
59<!-- ###################################################################### --> 57<!-- ###################################################################### -->
60<!-- 58<!--
61<div id="clipperzBookmarklet" style=""> 59<div id="clipperzBookmarklet" style="">
62 <div id="clipperzBookmarkletResult" style=""><p>The direct login configuration has been collected.</p></div> 60 <div id="clipperzBookmarkletResult" style=""><p>The direct login configuration has been collected.</p></div>
63 <div id="clipperzBookmarletButton" style=""></div> 61 <div id="clipperzBookmarletButton" style=""></div>
64 <div id="clipperzBookmarletAfterCopyHint" style=""><p>Now you can return to the Clipperz main interface and create a new card</p></div> 62 <div id="clipperzBookmarletAfterCopyHint" style=""><p>Now you can return to the Clipperz main interface and create a new card</p></div>
65</div> 63</div>
66--> 64-->
67<!-- 65<!--
68<div id="clipperzBookmarklet"> 66<div id="clipperzBookmarklet">
69 <div id="clipperzBookmarkletResult"><div id="clipperzBookmarkletResultIcon"></div><p id="clipperzBookmarkletResultText"></p></div> 67 <div id="clipperzBookmarkletResult"><div id="clipperzBookmarkletResultIcon"></div><p id="clipperzBookmarkletResultText"></p></div>
70 <div id="clipperzBookmarletButton"></div> 68 <div id="clipperzBookmarletButton"></div>
71 <div id="clipperzBookmarletAfterCopyHint"><p id="clipperzBookmarkletHintText"></p></div> 69 <div id="clipperzBookmarletAfterCopyHint"><p id="clipperzBookmarkletHintText"></p></div>
72</div> 70</div>
73--> 71-->
74 72
75 73
76<!-- ###################################################################### --> 74<!-- ###################################################################### -->
77 75
78<pre id="test"> 76<pre id="test">
79<script type="text/javascript"> 77<script type="text/javascript">
80try { 78try {
81 runBookmarklet(); 79 runBookmarklet();
82 // varparameters; 80 // varparameters;
83 //runBookmarklet(); 81 //runBookmarklet();
84 82
85 //parameters = getLoginFormConfiguration(); 83 //parameters = getLoginFormConfiguration();
86 84
87 // SimpleTest.ok(parameters != null, "The bookmarklet returns something useful"); 85 // SimpleTest.ok(parameters != null, "The bookmarklet returns something useful");
88 // SimpleTest.ok(bookmarkletClip != null,"The clipboard bridge has been created"); 86 // SimpleTest.ok(bookmarkletClip != null,"The clipboard bridge has been created");
89 // SimpleTest.ok(bookmarkletClip.ready,"The clipboard bridge has been created AND is ready"); 87 // SimpleTest.ok(bookmarkletClip.ready,"The clipboard bridge has been created AND is ready");
90 SimpleTest.ok(true, "no exception raised"); 88 SimpleTest.ok(true, "no exception raised");
91 89
92} catch (err) { 90} catch (err) {
93 91
94 var s = "test suite failure!\n"; 92 var s = "test suite failure!\n";
95 var o = {}; 93 var o = {};
96 var k = null; 94 var k = null;
97 for (k in err) { 95 for (k in err) {
98 // ensure unique keys?! 96 // ensure unique keys?!
99 if (!o[k]) { 97 if (!o[k]) {
100 s += k + ": " + err[k] + "\n"; 98 s += k + ": " + err[k] + "\n";
101 o[k] = err[k]; 99 o[k] = err[k];
102 } 100 }
103 } 101 }
104 ok ( false, s ); 102 ok ( false, s );
105} 103}
106 104
107</script> 105</script>
108</pre> 106</pre>
109</body> 107</body>
110</html> 108</html>
diff --git a/frontend/gamma/tests/tests/Bookmarklet/Twitter.html b/frontend/gamma/tests/tests/Bookmarklet/Twitter.html
index 27dc6a1..025197e 100644
--- a/frontend/gamma/tests/tests/Bookmarklet/Twitter.html
+++ b/frontend/gamma/tests/tests/Bookmarklet/Twitter.html
@@ -1,110 +1,108 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Bookmarlet TEST - ok</title> 26 <title>Bookmarlet TEST - ok</title>
29 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
30 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 28 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
31 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 29 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
32 30
33 <!-- link rel="stylesheet" type="text/css" href="./Bookmarklet.css" --> 31 <!-- link rel="stylesheet" type="text/css" href="./Bookmarklet.css" -->
34 <script type='text/javascript' src='../../../js/Bookmarklet.js'></script> 32 <script type='text/javascript' src='../../../js/Bookmarklet.js'></script>
35 <script type='text/javascript' src='../../../../_build/_scratch/bookmarklet_test.js'></script> 33 <script type='text/javascript' src='../../../../_build/_scratch/bookmarklet_test.js'></script>
36</head> 34</head>
37<body> 35<body>
38 36
39<!-- TWITTER Login Form --> 37<!-- TWITTER Login Form -->
40<form id="signin" action="https://twitter.com/sessions" method="post"> 38<form id="signin" action="https://twitter.com/sessions" method="post">
41 <input id="authenticity_token" type="hidden" value="a3a9abfa089122e4b437736313e54f2a25911101" name="authenticity_token"/> 39 <input id="authenticity_token" type="hidden" value="a3a9abfa089122e4b437736313e54f2a25911101" name="authenticity_token"/>
42 <fieldset class="common-form standard-form"> 40 <fieldset class="common-form standard-form">
43 <legend>Please sign in</legend> 41 <legend>Please sign in</legend>
44 <p> 42 <p>
45 <label class="inside" for="username" tabindex="1">user name or email address:</label> 43 <label class="inside" for="username" tabindex="1">user name or email address:</label>
46 <input id="username" type="text" title="username" value="" name="session[username_or_email]"/> 44 <input id="username" type="text" title="username" value="" name="session[username_or_email]"/>
47 </p> 45 </p>
48 <p> 46 <p>
49 <label class="inside" for="password" tabindex="2">password:</label> 47 <label class="inside" for="password" tabindex="2">password:</label>
50 <input id="password" type="password" title="password" value="" name="session[password]"/> 48 <input id="password" type="password" title="password" value="" name="session[password]"/>
51 </p> 49 </p>
52 <p class="remember"></p> 50 <p class="remember"></p>
53 <p class="submit"></p> 51 <p class="submit"></p>
54 <p class="forgot"></p> 52 <p class="forgot"></p>
55 <p class="complete"></p> 53 <p class="complete"></p>
56 </fieldset> 54 </fieldset>
57</form> 55</form>
58 56
59<!-- ###################################################################### --> 57<!-- ###################################################################### -->
60<!-- 58<!--
61<div id="clipperzBookmarklet" style=""> 59<div id="clipperzBookmarklet" style="">
62 <div id="clipperzBookmarkletResult" style=""><p>The direct login configuration has been collected.</p></div> 60 <div id="clipperzBookmarkletResult" style=""><p>The direct login configuration has been collected.</p></div>
63 <div id="clipperzBookmarletButton" style=""></div> 61 <div id="clipperzBookmarletButton" style=""></div>
64 <div id="clipperzBookmarletAfterCopyHint" style=""><p>Now you can return to the Clipperz main interface and create a new card</p></div> 62 <div id="clipperzBookmarletAfterCopyHint" style=""><p>Now you can return to the Clipperz main interface and create a new card</p></div>
65</div> 63</div>
66--> 64-->
67<!-- 65<!--
68<div id="clipperzBookmarklet"> 66<div id="clipperzBookmarklet">
69 <div id="clipperzBookmarkletResult"><div id="clipperzBookmarkletResultIcon"></div><p id="clipperzBookmarkletResultText"></p></div> 67 <div id="clipperzBookmarkletResult"><div id="clipperzBookmarkletResultIcon"></div><p id="clipperzBookmarkletResultText"></p></div>
70 <div id="clipperzBookmarletButton"></div> 68 <div id="clipperzBookmarletButton"></div>
71 <div id="clipperzBookmarletAfterCopyHint"><p id="clipperzBookmarkletHintText"></p></div> 69 <div id="clipperzBookmarletAfterCopyHint"><p id="clipperzBookmarkletHintText"></p></div>
72</div> 70</div>
73--> 71-->
74 72
75 73
76<!-- ###################################################################### --> 74<!-- ###################################################################### -->
77 75
78<pre id="test"> 76<pre id="test">
79<script type="text/javascript"> 77<script type="text/javascript">
80try { 78try {
81 runBookmarklet(); 79 runBookmarklet();
82 // varparameters; 80 // varparameters;
83 //runBookmarklet(); 81 //runBookmarklet();
84 82
85 //parameters = getLoginFormConfiguration(); 83 //parameters = getLoginFormConfiguration();
86 84
87 // SimpleTest.ok(parameters != null, "The bookmarklet returns something useful"); 85 // SimpleTest.ok(parameters != null, "The bookmarklet returns something useful");
88 // SimpleTest.ok(bookmarkletClip != null,"The clipboard bridge has been created"); 86 // SimpleTest.ok(bookmarkletClip != null,"The clipboard bridge has been created");
89 // SimpleTest.ok(bookmarkletClip.ready,"The clipboard bridge has been created AND is ready"); 87 // SimpleTest.ok(bookmarkletClip.ready,"The clipboard bridge has been created AND is ready");
90 SimpleTest.ok(true, "no exception raised"); 88 SimpleTest.ok(true, "no exception raised");
91 89
92} catch (err) { 90} catch (err) {
93 91
94 var s = "test suite failure!\n"; 92 var s = "test suite failure!\n";
95 var o = {}; 93 var o = {};
96 var k = null; 94 var k = null;
97 for (k in err) { 95 for (k in err) {
98 // ensure unique keys?! 96 // ensure unique keys?!
99 if (!o[k]) { 97 if (!o[k]) {
100 s += k + ": " + err[k] + "\n"; 98 s += k + ": " + err[k] + "\n";
101 o[k] = err[k]; 99 o[k] = err[k];
102 } 100 }
103 } 101 }
104 ok ( false, s ); 102 ok ( false, s );
105} 103}
106 104
107</script> 105</script>
108</pre> 106</pre>
109</body> 107</body>
110</html> 108</html>
diff --git a/frontend/gamma/tests/tests/Bookmarklet/index.html b/frontend/gamma/tests/tests/Bookmarklet/index.html
index 9ee3dec..759ecc3 100644
--- a/frontend/gamma/tests/tests/Bookmarklet/index.html
+++ b/frontend/gamma/tests/tests/Bookmarklet/index.html
@@ -1,39 +1,37 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Complete TEST suite</title> 26 <title>Complete TEST suite</title>
29 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
30 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script> 28 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script>
31</head> 29</head>
32<body> 30<body>
33<script> 31<script>
34TestRunner.runTests( 32TestRunner.runTests(
35 'Twitter.html' 33 'Twitter.html'
36); 34);
37</script> 35</script>
38</body> 36</body>
39</html> \ No newline at end of file 37</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/Async.html b/frontend/gamma/tests/tests/Clipperz/Async.html
index 6d28fdb..2c752bb 100644
--- a/frontend/gamma/tests/tests/Clipperz/Async.html
+++ b/frontend/gamma/tests/tests/Clipperz/Async.html
@@ -1,50 +1,48 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.Async - test</title> 26 <title>Clipperz.Async - test</title>
29 27
30 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
39 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
41 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 39 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
42</head> 40</head>
43<body> 41<body>
44 42
45<pre id="test"> 43<pre id="test">
46<!--<script type="text/javascript" src="User.data.js"></script>//--> 44<!--<script type="text/javascript" src="User.data.js"></script>//-->
47<script type="text/javascript" src="Async.test.js"></script> 45<script type="text/javascript" src="Async.test.js"></script>
48</pre> 46</pre>
49</body> 47</body>
50</html> 48</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Async.test.js b/frontend/gamma/tests/tests/Clipperz/Async.test.js
index 443130e..83cea85 100644
--- a/frontend/gamma/tests/tests/Clipperz/Async.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/Async.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26testObject = function (aLabel) { 24testObject = function (aLabel) {
27 this._label = aLabel; 25 this._label = aLabel;
28 this._sibling = null; 26 this._sibling = null;
29} 27}
30 28
31testObject.prototype = { 29testObject.prototype = {
32 'label': function () { 30 'label': function () {
33 return MochiKit.Async.succeed(this._label); 31 return MochiKit.Async.succeed(this._label);
34 }, 32 },
35 33
36 'shouldHit': function () { 34 'shouldHit': function () {
37 var filterRegExp; 35 var filterRegExp;
38 36
39 filterRegExp = new RegExp("hit", "i"); 37 filterRegExp = new RegExp("hit", "i");
40 38
41 return Clipperz.Async.callbacks("testObject.shouldHit", [ 39 return Clipperz.Async.callbacks("testObject.shouldHit", [
42 MochiKit.Base.method(this, 'label'), 40 MochiKit.Base.method(this, 'label'),
43 MochiKit.Base.method(filterRegExp, 'test') 41 MochiKit.Base.method(filterRegExp, 'test')
44 ]); 42 ]);
45 }, 43 },
46 44
47 'sibling': function () { 45 'sibling': function () {
48 return this._sibling; 46 return this._sibling;
49 }, 47 },
50 48
51 'setSibling': function (aSibling) { 49 'setSibling': function (aSibling) {
52 this._sibling = aSibling; 50 this._sibling = aSibling;
53 } 51 }
54 52
55} 53}
56 54
57var tests = { 55var tests = {
58 56
59 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
60 58
61 'succeedingForkedDeferrer_test': function (someTestArgs) { 59 'succeedingForkedDeferrer_test': function (someTestArgs) {
62 var deferredResult; 60 var deferredResult;
63 61
64 deferredResult = new Clipperz.Async.Deferred('Async.test succeedingForkedDeferred', someTestArgs); 62 deferredResult = new Clipperz.Async.Deferred('Async.test succeedingForkedDeferred', someTestArgs);
65 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedDeferred", 63 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedDeferred",
66 [ 64 [
67 MochiKit.Base.partial(MochiKit.Async.succeed, 3), 65 MochiKit.Base.partial(MochiKit.Async.succeed, 3),
68 MochiKit.Base.partial(MochiKit.Async.succeed, 2) 66 MochiKit.Base.partial(MochiKit.Async.succeed, 2)
69 ], someTestArgs 67 ], someTestArgs
70 )); 68 ));
71 deferredResult.addCallback(function (anAsyncResult) { 69 deferredResult.addCallback(function (anAsyncResult) {
72 var sum; 70 var sum;
73 71
74 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult); 72 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult);
75 SimpleTest.is(sum, 5, "the sum of all the returned results should be 5"); 73 SimpleTest.is(sum, 5, "the sum of all the returned results should be 5");
76 }); 74 });
77 deferredResult.addErrback(function() { 75 deferredResult.addErrback(function() {
78 SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (1)") 76 SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (1)")
79 }) 77 })
80 deferredResult.callback(); 78 deferredResult.callback();
81 79
82 return deferredResult; 80 return deferredResult;
83 }, 81 },
84 82
85 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
86 84
87 'succeedingForkedAndWaitDeferrer_test': function (someTestArgs) { 85 'succeedingForkedAndWaitDeferrer_test': function (someTestArgs) {
88 var deferredResult; 86 var deferredResult;
89 87
90 deferredResult = new Clipperz.Async.Deferred('succeedingForkedAndWaitDeferrer_test', someTestArgs); 88 deferredResult = new Clipperz.Async.Deferred('succeedingForkedAndWaitDeferrer_test', someTestArgs);
91 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", 89 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer",
92 [ 90 [
93 MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3), 91 MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3),
94 MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2), 92 MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2),
95 MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7) 93 MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7)
96 ], someTestArgs 94 ], someTestArgs
97 )); 95 ));
98 deferredResult.addCallback(function (anAsyncResult) { 96 deferredResult.addCallback(function (anAsyncResult) {
99 var sum; 97 var sum;
100 98
101 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult); 99 sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult);
102 SimpleTest.is(sum, 12, "the sum of all the returned results should be 12"); 100 SimpleTest.is(sum, 12, "the sum of all the returned results should be 12");
103 }); 101 });
104 deferredResult.addErrback(function() { 102 deferredResult.addErrback(function() {
105 SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (2)") 103 SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (2)")
106 }) 104 })
107 deferredResult.callback(); 105 deferredResult.callback();
108 106
109 return deferredResult; 107 return deferredResult;
110 }, 108 },
111 109
112 //------------------------------------------------------------------------- 110 //-------------------------------------------------------------------------
113 111
114 'failingForkedDeferrer_test': function (someTestArgs) { 112 'failingForkedDeferrer_test': function (someTestArgs) {
115 var deferredResult; 113 var deferredResult;
116 114
117 deferredResult = new Clipperz.Async.Deferred('Async.test failingForkedDeferred', someTestArgs); 115 deferredResult = new Clipperz.Async.Deferred('Async.test failingForkedDeferred', someTestArgs);
118 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test failingForkedDeferred", 116 deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test failingForkedDeferred",
diff --git a/frontend/gamma/tests/tests/Clipperz/Base.html b/frontend/gamma/tests/tests/Clipperz/Base.html
index a1b1df8..d3bd96e 100644
--- a/frontend/gamma/tests/tests/Clipperz/Base.html
+++ b/frontend/gamma/tests/tests/Clipperz/Base.html
@@ -1,52 +1,50 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.Base - TEST</title> 26 <title>Clipperz.Base - TEST</title>
29 27
30 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
39 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/KeyValueObjectStore.js'></script> 39 <script type='text/javascript' src='../../../js/Clipperz/KeyValueObjectStore.js'></script>
42 40
43 41
44 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 42 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
45 43
46</head> 44</head>
47<body> 45<body>
48<pre id="test"> 46<pre id="test">
49<script type="text/javascript" src="Base.test.js"></script> 47<script type="text/javascript" src="Base.test.js"></script>
50</pre> 48</pre>
51</body> 49</body>
52</html> 50</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Base.test.js b/frontend/gamma/tests/tests/Clipperz/Base.test.js
index fc827f7..7ae611d 100644
--- a/frontend/gamma/tests/tests/Clipperz/Base.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/Base.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26 24
27//============================================================================= 25//=============================================================================
28 26
29testEvalJSON = function(aString, shouldFail, aDescription) { 27testEvalJSON = function(aString, shouldFail, aDescription) {
30 var result; 28 var result;
31 29
32 if (shouldFail == true) { 30 if (shouldFail == true) {
33 try { 31 try {
34 result = Clipperz.Base.evalJSON(aString); 32 result = Clipperz.Base.evalJSON(aString);
35 is(true, false, aDescription + ": vulnerability not caught"); 33 is(true, false, aDescription + ": vulnerability not caught");
36//console.log(result); 34//console.log(result);
37 } catch(exception) { 35 } catch(exception) {
38 is(true, true, aDescription + ": vulnerability correctly caught"); 36 is(true, true, aDescription + ": vulnerability correctly caught");
39 } 37 }
40 } else { 38 } else {
41 try { 39 try {
42 result = Clipperz.Base.evalJSON(aString); 40 result = Clipperz.Base.evalJSON(aString);
43 is(true, true, aDescription + ": configuration correctly checked"); 41 is(true, true, aDescription + ": configuration correctly checked");
44 } catch(exception) { 42 } catch(exception) {
45 is(true, false, aDescription + ": configuration wrongly caught as malicious"); 43 is(true, false, aDescription + ": configuration wrongly caught as malicious");
46 // console.log(exception); 44 // console.log(exception);
47 } 45 }
48 } 46 }
49 47
50 return result; 48 return result;
51} 49}
52 50
53//============================================================================= 51//=============================================================================
54 52
55var tests = { 53var tests = {
56 54
57 '001_test': function () { 55 '001_test': function () {
58 var stringToSplit; 56 var stringToSplit;
59 varsplittedString; 57 varsplittedString;
60 58
61 stringToSplit = "stringToSplit"; 59 stringToSplit = "stringToSplit";
62 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 2); 60 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 2);
63 is(splittedString.length, 7); 61 is(splittedString.length, 7);
64 is(splittedString[0], 'st'); 62 is(splittedString[0], 'st');
65 is(splittedString[1], 'ri'); 63 is(splittedString[1], 'ri');
66 is(splittedString[2], 'ng'); 64 is(splittedString[2], 'ng');
67 is(splittedString[3], 'To'); 65 is(splittedString[3], 'To');
68 is(splittedString[4], 'Sp'); 66 is(splittedString[4], 'Sp');
69 is(splittedString[5], 'li'); 67 is(splittedString[5], 'li');
70 is(splittedString[6], 't', "test that should pass"); 68 is(splittedString[6], 't', "test that should pass");
71 69
72 stringToSplit = "stringToSplit"; 70 stringToSplit = "stringToSplit";
73 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20); 71 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20);
74 is(splittedString.length, 1); 72 is(splittedString.length, 1);
75 is(splittedString[0], 'stringToSplit'); 73 is(splittedString[0], 'stringToSplit');
76 74
77 stringToSplit = null; 75 stringToSplit = null;
78 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20); 76 splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20);
79 is(splittedString.length, 0); 77 is(splittedString.length, 0);
80 }, 78 },
81 79
82 //------------------------------------------------------------------------- 80 //-------------------------------------------------------------------------
83 81
84 '002_test': function () { 82 '002_test': function () {
85 var anObject; 83 var anObject;
86 84
87 anObject = "String"; 85 anObject = "String";
88 is(Clipperz.Base.objectType(anObject), 'string', "test on strings (1)"); 86 is(Clipperz.Base.objectType(anObject), 'string', "test on strings (1)");
89 anObject = new String("String"); 87 anObject = new String("String");
90 is(Clipperz.Base.objectType(anObject), 'string', "test on strings (2)"); 88 is(Clipperz.Base.objectType(anObject), 'string', "test on strings (2)");
91 89
92 anObject = 120; 90 anObject = 120;
93 is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (1)"); 91 is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (1)");
94 anObject = new Number(120); 92 anObject = new Number(120);
95 is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (2)"); 93 is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (2)");
96 94
97 anObject = true; 95 anObject = true;
98 is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (1)"); 96 is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (1)");
99 anObject = new Boolean(true); 97 anObject = new Boolean(true);
100 is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (2)"); 98 is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (2)");
101 99
102 anObject = new Date; 100 anObject = new Date;
103 is(Clipperz.Base.objectType(anObject), 'date', "test on dates"); 101 is(Clipperz.Base.objectType(anObject), 'date', "test on dates");
104 102
105 anObject = new Error("test"); 103 anObject = new Error("test");
106 is(Clipperz.Base.objectType(anObject), 'error', "test on errors"); 104 is(Clipperz.Base.objectType(anObject), 'error', "test on errors");
107 105
108 anObject = function() {}; 106 anObject = function() {};
109 is(Clipperz.Base.objectType(anObject), 'function', "test on functions"); 107 is(Clipperz.Base.objectType(anObject), 'function', "test on functions");
110 108
111 anObject = new Object(); 109 anObject = new Object();
112 is(Clipperz.Base.objectType(anObject), 'object', "test on objects"); 110 is(Clipperz.Base.objectType(anObject), 'object', "test on objects");
113 111
114 112
115 anObject = [1, 2, 3]; 113 anObject = [1, 2, 3];
116 is(Clipperz.Base.objectType(anObject), 'array', "test on arrays"); 114 is(Clipperz.Base.objectType(anObject), 'array', "test on arrays");
117 }, 115 },
118 116
diff --git a/frontend/gamma/tests/tests/Clipperz/ByteArray.html b/frontend/gamma/tests/tests/Clipperz/ByteArray.html
index 6dc7116..5c496c9 100644
--- a/frontend/gamma/tests/tests/Clipperz/ByteArray.html
+++ b/frontend/gamma/tests/tests/Clipperz/ByteArray.html
@@ -1,68 +1,66 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.ByteArray - tests</title> 26 <title>Clipperz.ByteArray - tests</title>
29 27
30 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 28 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
31 29
32 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
33 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
35 33
36 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
37 35
38 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
39 <script type='text/javascript' src='../../../js/Clipperz/YUI/DomHelper.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/YUI/DomHelper.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> 39 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 40 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
43 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 41 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../js/Clipperz/Crypto/Base.js'></script> 42 <script type='text/javascript' src='../../../js/Clipperz/Crypto/Base.js'></script>
45 <script type='text/javascript' src='../../../js/Clipperz/Crypto/BigInt.js'></script> 43 <script type='text/javascript' src='../../../js/Clipperz/Crypto/BigInt.js'></script>
46 <script type='text/javascript' src='../../../js/Clipperz/Crypto/AES.js'></script> 44 <script type='text/javascript' src='../../../js/Clipperz/Crypto/AES.js'></script>
47 <script type='text/javascript' src='../../../js/Clipperz/Crypto/SHA.js'></script> 45 <script type='text/javascript' src='../../../js/Clipperz/Crypto/SHA.js'></script>
48 <script type='text/javascript' src='../../../js/Clipperz/Crypto/PRNG.js'></script> 46 <script type='text/javascript' src='../../../js/Clipperz/Crypto/PRNG.js'></script>
49 <!-- script type='text/javascript' src='../../../js/Clipperz/Crypto/BigInt.js'></script --> 47 <!-- script type='text/javascript' src='../../../js/Clipperz/Crypto/BigInt.js'></script -->
50 48
51 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 49 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
52 50
53</head> 51</head>
54<body> 52<body>
55 53
56<pre id="test"> 54<pre id="test">
57<script> 55<script>
58 Clipperz_IEisBroken = false; 56 Clipperz_IEisBroken = false;
59</script> 57</script>
60 <script type="text/javascript"> 58 <script type="text/javascript">
61 var longAsciiText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam ac ipsum. Morbi mauris. Aenean ac elit id metus lobortis elementum. Proin at quam ac ipsum pellentesque adipiscing. Aenean vestibulum, nisl eu suscipit iaculis, quam pede congue mi, sit amet dapibus metus neque eget dui. Suspendisse posuere diam ac sapien. Nulla lobortis dapibus leo. Quisque ornare tortor quis turpis. Aliquam erat volutpat. Ut faucibus lacinia magna. Nunc metus leo, volutpat quis, mollis ac, sagittis ut, turpis. Quisque purus. Mauris ante enim, vehicula eu, suscipit vitae, laoreet vel, nulla. Pellentesque pede leo, aliquam quis, vehicula eget, rhoncus nec, metus. Vestibulum tellus. Suspendisse blandit. Pellentesque vel tellus. Maecenas arcu. Duis eget purus. Curabitur non pede nec odio cursus luctus. In non elit. Nullam eget nunc in nisl elementum commodo. Vivamus sollicitudin pede quis dui. Morbi commodo. Praesent a risus id urna hendrerit fermentum. Nunc ultricies tristique odio. Phasellus imperdiet, sapien eget viverra blandit, tortor risus blandit nisi, et sodales libero dolor quis nisl. Morbi vel enim. Nunc in quam. Vestibulum a magna. Fusce auctor elit in augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris tincidunt consectetuer leo. Etiam non turpis. Vestibulum eros. Praesent venenatis adipiscing augue. Pellentesque dapibus odio ac arcu rhoncus sagittis. Nullam vitae augue. Ut magna nulla, congue eu, porta in, egestas quis, ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur malesuada neque non nulla. Nulla facilisi. Fusce viverra magna ut tellus. Sed rutrum pretium sapien. Vivamus dui. Cras fringilla. Nullam lorem. Vestibulum varius, purus at imperdiet fermentum, metus diam ultricies lacus, vitae aliquam ipsum libero sit amet felis. Sed eget eros ac velit commodo sollicitudin. Morbi in metus in mi viverra lacinia. Sed ut urna. Suspendisse imperdiet tellus ac velit. Duis malesuada velit sit amet sapien. Vestibulum a sapien id libero accumsan luctus. Fusce iaculis. Donec pulvinar orci ut pede. Nam placerat sem ut sem. Ut pretium bibendum nisl. Suspendisse potenti. Phasellus mollis neque in neque. Suspendisse augue magna, eleifend et, malesuada at, viverra in, nisl. Donec vel lectus in justo ultrices tristique. Aliquam erat volutpat. Morbi suscipit, risus ac volutpat mollis, risus metus hendrerit sapien, ac scelerisque est orci eu est. Quisque sit amet velit. Sed libero diam, semper id, eleifend ac, iaculis non, nulla. Donec varius tincidunt arcu. Sed quis metus eu erat adipiscing viverra. Donec odio. Aenean sagittis nisl sed purus. Fusce vel nibh quis felis accumsan bibendum. Etiam et risus ac tortor cursus pharetra. Maecenas tellus. Pellentesque nec felis id eros vehicula commodo. Aliquam interdum sagittis odio. Maecenas at lorem eget mi aliquet sagittis. Mauris quis nibh in odio sodales lacinia. Proin augue mauris, placerat a, blandit vel, tincidunt eget, ante. Quisque turpis purus, placerat eget, tempor consectetuer, aliquet ac, enim. Etiam eleifend vestibulum mi. Vivamus gravida. Morbi dolor. In hac habitasse platea dictumst. Nulla commodo lectus faucibus lorem. Phasellus aliquet pede id metus hendrerit tempus. Fusce convallis pede ac neque tempor dignissim. Sed vitae lorem sit amet justo dapibus porta. Ut quam orci, pretium non, sagittis nec, condimentum id, dolor. Sed tempor. Nunc porta rutrum leo. Nunc id sem. Sed nibh tortor, dapibus eget, feugiat a, pretium pretium, purus. Suspendisse suscipit lobortis sem. Praesent pharetra orci. Quisque molestie tristique quam. Maecenas nunc lorem, rhoncus non, venenatis sed, sodales at, felis. Quisque semper. Quisque malesuada est quis lacus. Nullam a justo. Aliquam pellentesque, ante ut congue molestie, nisl sapien posuere nisl, eu cursus nulla ligula vel nisl. Fusce commodo lacinia magna. Aenean rutrum vestibulum lorem. Pellentesque fermentum tristique ipsum. Nulla facilisi. Donec id mi eget ipsum commodo egestas. Mauris iaculis. Nulla vulputate mi at nisl. In condimentum sodales tellus. Donec metus orci, mollis vel, accumsan ac, ornare ac, lacus. Pellentesque accumsan est et tellus. Nam mollis. Aenean accumsan eros sit amet tellus. Praesent eu libero. Sed tempus urna nec dolor. Nulla facilisi. Duis eleifend rhoncus neque. Curabitur consectetuer quam eu justo. Sed metus. Vivamus risus. Aliquam erat volutpat. Aliquam erat volutpat. Nunc semper urna. Praesent molestie libero a lacus. Nullam suscipit lobortis velit. Praesent rhoncus, felis ut interdum dapibus, ipsum lectus vestibulum nulla, in interdum risus dolor eget orci. Nullam venenatis. Suspendisse laoreet, arcu a luctus consectetuer, libero ligula condimentum quam, eget elementum mauris tortor sed enim. Pellentesque leo. Nam interdum malesuada ante. Praesent fermentum nunc et dolor. Donec auctor volutpat odio. Pellentesque volutpat egestas ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras ac ligula eu justo dignissim accumsan. Nullam nisi. Fusce id sem. Fusce et urna. Pellentesque commodo pharetra lorem. Donec erat. Vestibulum elit arcu, commodo et, consequat eget, posuere eget, sem. Morbi sed nulla sed neque commodo commodo. Aliquam erat volutpat. Ut id turpis a enim malesuada vestibulum. In arcu dui, dignissim vitae, blandit eu, egestas ac, arcu. In ultricies sapien vitae nisi. Proin rhoncus magna eget tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In dictum. Sed volutpat pharetra quam. Mauris eget eros. Fusce malesuada dolor id pede. Praesent nec justo sed nisi vehicula varius. In scelerisque convallis nulla. Pellentesque sodales massa vulputate urna. Duis metus urna, imperdiet ac, sodales vel, ullamcorper sed, pede. Vestibulum aliquam mollis metus. Praesent tempus tristique elit. Maecenas tellus tortor, pretium id, mollis id, molestie non, turpis. Vivamus nibh magna, bibendum vitae, a."; 59 var longAsciiText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam ac ipsum. Morbi mauris. Aenean ac elit id metus lobortis elementum. Proin at quam ac ipsum pellentesque adipiscing. Aenean vestibulum, nisl eu suscipit iaculis, quam pede congue mi, sit amet dapibus metus neque eget dui. Suspendisse posuere diam ac sapien. Nulla lobortis dapibus leo. Quisque ornare tortor quis turpis. Aliquam erat volutpat. Ut faucibus lacinia magna. Nunc metus leo, volutpat quis, mollis ac, sagittis ut, turpis. Quisque purus. Mauris ante enim, vehicula eu, suscipit vitae, laoreet vel, nulla. Pellentesque pede leo, aliquam quis, vehicula eget, rhoncus nec, metus. Vestibulum tellus. Suspendisse blandit. Pellentesque vel tellus. Maecenas arcu. Duis eget purus. Curabitur non pede nec odio cursus luctus. In non elit. Nullam eget nunc in nisl elementum commodo. Vivamus sollicitudin pede quis dui. Morbi commodo. Praesent a risus id urna hendrerit fermentum. Nunc ultricies tristique odio. Phasellus imperdiet, sapien eget viverra blandit, tortor risus blandit nisi, et sodales libero dolor quis nisl. Morbi vel enim. Nunc in quam. Vestibulum a magna. Fusce auctor elit in augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris tincidunt consectetuer leo. Etiam non turpis. Vestibulum eros. Praesent venenatis adipiscing augue. Pellentesque dapibus odio ac arcu rhoncus sagittis. Nullam vitae augue. Ut magna nulla, congue eu, porta in, egestas quis, ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur malesuada neque non nulla. Nulla facilisi. Fusce viverra magna ut tellus. Sed rutrum pretium sapien. Vivamus dui. Cras fringilla. Nullam lorem. Vestibulum varius, purus at imperdiet fermentum, metus diam ultricies lacus, vitae aliquam ipsum libero sit amet felis. Sed eget eros ac velit commodo sollicitudin. Morbi in metus in mi viverra lacinia. Sed ut urna. Suspendisse imperdiet tellus ac velit. Duis malesuada velit sit amet sapien. Vestibulum a sapien id libero accumsan luctus. Fusce iaculis. Donec pulvinar orci ut pede. Nam placerat sem ut sem. Ut pretium bibendum nisl. Suspendisse potenti. Phasellus mollis neque in neque. Suspendisse augue magna, eleifend et, malesuada at, viverra in, nisl. Donec vel lectus in justo ultrices tristique. Aliquam erat volutpat. Morbi suscipit, risus ac volutpat mollis, risus metus hendrerit sapien, ac scelerisque est orci eu est. Quisque sit amet velit. Sed libero diam, semper id, eleifend ac, iaculis non, nulla. Donec varius tincidunt arcu. Sed quis metus eu erat adipiscing viverra. Donec odio. Aenean sagittis nisl sed purus. Fusce vel nibh quis felis accumsan bibendum. Etiam et risus ac tortor cursus pharetra. Maecenas tellus. Pellentesque nec felis id eros vehicula commodo. Aliquam interdum sagittis odio. Maecenas at lorem eget mi aliquet sagittis. Mauris quis nibh in odio sodales lacinia. Proin augue mauris, placerat a, blandit vel, tincidunt eget, ante. Quisque turpis purus, placerat eget, tempor consectetuer, aliquet ac, enim. Etiam eleifend vestibulum mi. Vivamus gravida. Morbi dolor. In hac habitasse platea dictumst. Nulla commodo lectus faucibus lorem. Phasellus aliquet pede id metus hendrerit tempus. Fusce convallis pede ac neque tempor dignissim. Sed vitae lorem sit amet justo dapibus porta. Ut quam orci, pretium non, sagittis nec, condimentum id, dolor. Sed tempor. Nunc porta rutrum leo. Nunc id sem. Sed nibh tortor, dapibus eget, feugiat a, pretium pretium, purus. Suspendisse suscipit lobortis sem. Praesent pharetra orci. Quisque molestie tristique quam. Maecenas nunc lorem, rhoncus non, venenatis sed, sodales at, felis. Quisque semper. Quisque malesuada est quis lacus. Nullam a justo. Aliquam pellentesque, ante ut congue molestie, nisl sapien posuere nisl, eu cursus nulla ligula vel nisl. Fusce commodo lacinia magna. Aenean rutrum vestibulum lorem. Pellentesque fermentum tristique ipsum. Nulla facilisi. Donec id mi eget ipsum commodo egestas. Mauris iaculis. Nulla vulputate mi at nisl. In condimentum sodales tellus. Donec metus orci, mollis vel, accumsan ac, ornare ac, lacus. Pellentesque accumsan est et tellus. Nam mollis. Aenean accumsan eros sit amet tellus. Praesent eu libero. Sed tempus urna nec dolor. Nulla facilisi. Duis eleifend rhoncus neque. Curabitur consectetuer quam eu justo. Sed metus. Vivamus risus. Aliquam erat volutpat. Aliquam erat volutpat. Nunc semper urna. Praesent molestie libero a lacus. Nullam suscipit lobortis velit. Praesent rhoncus, felis ut interdum dapibus, ipsum lectus vestibulum nulla, in interdum risus dolor eget orci. Nullam venenatis. Suspendisse laoreet, arcu a luctus consectetuer, libero ligula condimentum quam, eget elementum mauris tortor sed enim. Pellentesque leo. Nam interdum malesuada ante. Praesent fermentum nunc et dolor. Donec auctor volutpat odio. Pellentesque volutpat egestas ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras ac ligula eu justo dignissim accumsan. Nullam nisi. Fusce id sem. Fusce et urna. Pellentesque commodo pharetra lorem. Donec erat. Vestibulum elit arcu, commodo et, consequat eget, posuere eget, sem. Morbi sed nulla sed neque commodo commodo. Aliquam erat volutpat. Ut id turpis a enim malesuada vestibulum. In arcu dui, dignissim vitae, blandit eu, egestas ac, arcu. In ultricies sapien vitae nisi. Proin rhoncus magna eget tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In dictum. Sed volutpat pharetra quam. Mauris eget eros. Fusce malesuada dolor id pede. Praesent nec justo sed nisi vehicula varius. In scelerisque convallis nulla. Pellentesque sodales massa vulputate urna. Duis metus urna, imperdiet ac, sodales vel, ullamcorper sed, pede. Vestibulum aliquam mollis metus. Praesent tempus tristique elit. Maecenas tellus tortor, pretium id, mollis id, molestie non, turpis. Vivamus nibh magna, bibendum vitae, a.";
62 var longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù"; 60 var longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù";
63 var longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之"; 61 var longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之";
64 </script> 62 </script>
65 <script type="text/javascript" src="ByteArray.test.js"></script> 63 <script type="text/javascript" src="ByteArray.test.js"></script>
66</pre> 64</pre>
67</body> 65</body>
68</html> 66</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js b/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js
index 43d74a0..643bbf8 100644
--- a/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 24Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
27 25
28var tests = { 26var tests = {
29 27
30 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
31 29
32 'core_tests': function (someTestArgs) { 30 'core_tests': function (someTestArgs) {
33 // vardeferredResult; 31 // vardeferredResult;
34 32
35 // deferredResult = new Clipperz.Async.Deferred("core_tests", someTestArgs); 33 // deferredResult = new Clipperz.Async.Deferred("core_tests", someTestArgs);
36 // deferredResult.addCallback(function() { 34 // deferredResult.addCallback(function() {
37 var byteArray; 35 var byteArray;
38 36
39 byteArray = new Clipperz.ByteArray(); 37 byteArray = new Clipperz.ByteArray();
40 38
41 try { 39 try {
42 byteArray.checkByteValue(512); 40 byteArray.checkByteValue(512);
43 is(false, true, "a value greater that a byte (0x200) should have raised an exception - NO Exception"); 41 is(false, true, "a value greater that a byte (0x200) should have raised an exception - NO Exception");
44 } catch(e) { 42 } catch(e) {
45 // is(e.name, 43 // is(e.name,
46 // "Clipperz.ByteArray.exception.InvalidValue", 44 // "Clipperz.ByteArray.exception.InvalidValue",
47 // "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") 45 // "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER")
48 ok(/Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name), 46 ok(/Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name),
49 "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") 47 "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER")
50 }; 48 };
51 49
52 // }); 50 // });
53 // deferredResult.callback(); 51 // deferredResult.callback();
54 52
55 // return deferredResult; 53 // return deferredResult;
56 54
57 }, 55 },
58 56
59 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
60 58
61 'basic_tests': function (someTestArgs) { 59 'basic_tests': function (someTestArgs) {
62 vardeferredResult; 60 vardeferredResult;
63 61
64 deferredResult = new Clipperz.Async.Deferred("simple_tests", someTestArgs); 62 deferredResult = new Clipperz.Async.Deferred("simple_tests", someTestArgs);
65 deferredResult.addCallback(function() { 63 deferredResult.addCallback(function() {
66 var byteArray; 64 var byteArray;
67 var byteArray2; 65 var byteArray2;
68 varbyteArrayIterator; 66 varbyteArrayIterator;
69 varnextBlock; 67 varnextBlock;
70 68
71 byteArray = new Clipperz.ByteArray(); 69 byteArray = new Clipperz.ByteArray();
72 is(byteArray.length(), 0, "before adding any element the length is 0"); 70 is(byteArray.length(), 0, "before adding any element the length is 0");
73 byteArray.appendByte(10); 71 byteArray.appendByte(10);
74 is(byteArray.length(), 1, "adding a single byte the length == 1"); 72 is(byteArray.length(), 1, "adding a single byte the length == 1");
75 is(byteArray.byteAtIndex(0), 10, "the first element is correct"); 73 is(byteArray.byteAtIndex(0), 10, "the first element is correct");
76 74
77 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true}); 75 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true});
78 nextBlock = byteArrayIterator.nextBlock(); 76 nextBlock = byteArrayIterator.nextBlock();
79 is(nextBlock.constructor, Array, "ByteArrayIterator.nextBlock returns an array of byte values"); 77 is(nextBlock.constructor, Array, "ByteArrayIterator.nextBlock returns an array of byte values");
80 is(nextBlock.length, 1, "as the block size is 8bit, the returned array has only one element"); 78 is(nextBlock.length, 1, "as the block size is 8bit, the returned array has only one element");
81 is(nextBlock[0], 10, "the element of the returned block is correct"); 79 is(nextBlock[0], 10, "the element of the returned block is correct");
82 nextBlock = byteArrayIterator.nextBlock(); 80 nextBlock = byteArrayIterator.nextBlock();
83 is(nextBlock, null, "after the last element, the nextBlock returns null"); 81 is(nextBlock, null, "after the last element, the nextBlock returns null");
84 82
85 byteArray = new Clipperz.ByteArray(); 83 byteArray = new Clipperz.ByteArray();
86 byteArray.appendBytes(10, 20, 45, 38); 84 byteArray.appendBytes(10, 20, 45, 38);
87 is(byteArray.length(), 4, "Appending more bytes, returns the right length"); 85 is(byteArray.length(), 4, "Appending more bytes, returns the right length");
88 is(byteArray.byteAtIndex(0), 10, "and all the elements are right [0]"); 86 is(byteArray.byteAtIndex(0), 10, "and all the elements are right [0]");
89 is(byteArray.byteAtIndex(1), 20, "and all the elements are right [1]"); 87 is(byteArray.byteAtIndex(1), 20, "and all the elements are right [1]");
90 is(byteArray.byteAtIndex(2), 45, "and all the elements are right [2]"); 88 is(byteArray.byteAtIndex(2), 45, "and all the elements are right [2]");
91 is(byteArray.byteAtIndex(3), 38, "and all the elements are right [3]"); 89 is(byteArray.byteAtIndex(3), 38, "and all the elements are right [3]");
92 90
93 byteArray2 = new Clipperz.ByteArray(); 91 byteArray2 = new Clipperz.ByteArray();
94 byteArray2.appendBytes([10, 20, 45, 38]); 92 byteArray2.appendBytes([10, 20, 45, 38]);
95 is(byteArray.equals(byteArray2), true, "equals method tested with a byteArray created with the same values"); 93 is(byteArray.equals(byteArray2), true, "equals method tested with a byteArray created with the same values");
96 94
97 byteArray2 = new Clipperz.ByteArray(); 95 byteArray2 = new Clipperz.ByteArray();
98 byteArray2.appendBytes([20, 11, 3, 22]); 96 byteArray2.appendBytes([20, 11, 3, 22]);
99 is(byteArray.equals(byteArray2), false, "equals method tested with a byteArray created with different values"); 97 is(byteArray.equals(byteArray2), false, "equals method tested with a byteArray created with different values");
100 98
101 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true}); 99 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true});
102 nextBlock = byteArrayIterator.nextBlock(); 100 nextBlock = byteArrayIterator.nextBlock();
103 is(nextBlock.length, 1, "the size of the block returned by the byteArrayIterator match with the configured blockedSize"); 101 is(nextBlock.length, 1, "the size of the block returned by the byteArrayIterator match with the configured blockedSize");
104 is(nextBlock[0], 10, "the values returned by nextBlock are right [1]"); 102 is(nextBlock[0], 10, "the values returned by nextBlock are right [1]");
105 nextBlock = byteArrayIterator.nextBlock(); 103 nextBlock = byteArrayIterator.nextBlock();
106 is(nextBlock[0], 20, "the values returned by nextBlock are right [2]"); 104 is(nextBlock[0], 20, "the values returned by nextBlock are right [2]");
107 nextBlock = byteArrayIterator.nextBlock(); 105 nextBlock = byteArrayIterator.nextBlock();
108 is(nextBlock[0], 45, "the values returned by nextBlock are right [3]"); 106 is(nextBlock[0], 45, "the values returned by nextBlock are right [3]");
109 nextBlock = byteArrayIterator.nextBlock(); 107 nextBlock = byteArrayIterator.nextBlock();
110 is(nextBlock[0], 38, "the values returned by nextBlock are right [4]"); 108 is(nextBlock[0], 38, "the values returned by nextBlock are right [4]");
111 nextBlock = byteArrayIterator.nextBlock(); 109 nextBlock = byteArrayIterator.nextBlock();
112 is(nextBlock, null, "after the last block the nextBlock method returns null"); 110 is(nextBlock, null, "after the last block the nextBlock method returns null");
113 111
114 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(16/8), finalPadding:true}); 112 byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(16/8), finalPadding:true});
115 nextBlock = byteArrayIterator.nextBlock(); 113 nextBlock = byteArrayIterator.nextBlock();
116 is(nextBlock.length, 2, "on the same data, using a different block size, returns the right length"); 114 is(nextBlock.length, 2, "on the same data, using a different block size, returns the right length");
117 is(nextBlock[0], 10, "and also the data are fine [1][0]"); 115 is(nextBlock[0], 10, "and also the data are fine [1][0]");
118 is(nextBlock[1], 20, "and also the data are fine [1][1]"); 116 is(nextBlock[1], 20, "and also the data are fine [1][1]");
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html
index 16f64d0..27a81a4 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.Crypto.AES_v3 - TEST</title> 26 <title>Clipperz.Crypto.AES_v3 - TEST</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
43 41
44</head> 42</head>
45<body> 43<body>
46<pre id="test"> 44<pre id="test">
47<script type="text/javascript"> 45<script type="text/javascript">
48 46
49try { 47try {
50 var block; 48 var block;
51 var keyValue; 49 var keyValue;
52 varkey; 50 varkey;
53 var encryptedBlock; 51 var encryptedBlock;
54 var startTime, endTime; 52 var startTime, endTime;
55 53
56 startTime = new Date(); 54 startTime = new Date();
57 55
58 keyValue = new Clipperz.ByteArray("0x00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526"); 56 keyValue = new Clipperz.ByteArray("0x00010203050607080a0b0c0d0f10111214151617191a1b1c1e1f202123242526");
59 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 57 key = new Clipperz.Crypto.AES.Key({key:keyValue});
60 block = new Clipperz.ByteArray("0x834eadfccac7e1b30664b1aba44815ab"); 58 block = new Clipperz.ByteArray("0x834eadfccac7e1b30664b1aba44815ab");
61 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 59 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
62 is(encryptedBlock.toHexString(), "0x1946dabf6a03a2a2c3d0b05080aed6fc", "Test 1"); 60 is(encryptedBlock.toHexString(), "0x1946dabf6a03a2a2c3d0b05080aed6fc", "Test 1");
63 61
64 keyValue = new Clipperz.ByteArray("0x28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e"); 62 keyValue = new Clipperz.ByteArray("0x28292a2b2d2e2f30323334353738393a3c3d3e3f41424344464748494b4c4d4e");
65 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 63 key = new Clipperz.Crypto.AES.Key({key:keyValue});
66 block = new Clipperz.ByteArray("0xd9dc4dba3021b05d67c0518f72b62bf1"); 64 block = new Clipperz.ByteArray("0xd9dc4dba3021b05d67c0518f72b62bf1");
67 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 65 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
68 is(encryptedBlock.toHexString(), "0x5ed301d747d3cc715445ebdec62f2fb4", "Test 2"); 66 is(encryptedBlock.toHexString(), "0x5ed301d747d3cc715445ebdec62f2fb4", "Test 2");
69 67
70 keyValue = new Clipperz.ByteArray("0x50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576"); 68 keyValue = new Clipperz.ByteArray("0x50515253555657585a5b5c5d5f60616264656667696a6b6c6e6f707173747576");
71 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 69 key = new Clipperz.Crypto.AES.Key({key:keyValue});
72 block = new Clipperz.ByteArray("0xa291d86301a4a739f7392173aa3c604c"); 70 block = new Clipperz.ByteArray("0xa291d86301a4a739f7392173aa3c604c");
73 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 71 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
74 is(encryptedBlock.toHexString(), "0x6585c8f43d13a6beab6419fc5935b9d0", "Test 3"); 72 is(encryptedBlock.toHexString(), "0x6585c8f43d13a6beab6419fc5935b9d0", "Test 3");
75 73
76 keyValue = new Clipperz.ByteArray("0x78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e"); 74 keyValue = new Clipperz.ByteArray("0x78797a7b7d7e7f80828384858788898a8c8d8e8f91929394969798999b9c9d9e");
77 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 75 key = new Clipperz.Crypto.AES.Key({key:keyValue});
78 block = new Clipperz.ByteArray("0x4264b2696498de4df79788a9f83e9390"); 76 block = new Clipperz.ByteArray("0x4264b2696498de4df79788a9f83e9390");
79 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 77 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
80 is(encryptedBlock.toHexString(), "0x2a5b56a596680fcc0e05f5e0f151ecae", "Test 4"); 78 is(encryptedBlock.toHexString(), "0x2a5b56a596680fcc0e05f5e0f151ecae", "Test 4");
81 79
82 keyValue = new Clipperz.ByteArray("0xa0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6"); 80 keyValue = new Clipperz.ByteArray("0xa0a1a2a3a5a6a7a8aaabacadafb0b1b2b4b5b6b7b9babbbcbebfc0c1c3c4c5c6");
83 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 81 key = new Clipperz.Crypto.AES.Key({key:keyValue});
84 block = new Clipperz.ByteArray("0xee9932b3721804d5a83ef5949245b6f6"); 82 block = new Clipperz.ByteArray("0xee9932b3721804d5a83ef5949245b6f6");
85 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 83 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
86 is(encryptedBlock.toHexString(), "0xf5d6ff414fd2c6181494d20c37f2b8c4", "Test 5"); 84 is(encryptedBlock.toHexString(), "0xf5d6ff414fd2c6181494d20c37f2b8c4", "Test 5");
87 85
88 keyValue = new Clipperz.ByteArray("0xc8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee"); 86 keyValue = new Clipperz.ByteArray("0xc8c9cacbcdcecfd0d2d3d4d5d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedee");
89 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 87 key = new Clipperz.Crypto.AES.Key({key:keyValue});
90 block = new Clipperz.ByteArray("0xe6248f55c5fdcbca9cbbb01c88a2ea77"); 88 block = new Clipperz.ByteArray("0xe6248f55c5fdcbca9cbbb01c88a2ea77");
91 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 89 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
92 is(encryptedBlock.toHexString(), "0x85399c01f59fffb5204f19f8482f00b8", "Test 6"); 90 is(encryptedBlock.toHexString(), "0x85399c01f59fffb5204f19f8482f00b8", "Test 6");
93 91
94 keyValue = new Clipperz.ByteArray("0xf0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516"); 92 keyValue = new Clipperz.ByteArray("0xf0f1f2f3f5f6f7f8fafbfcfdfe01000204050607090a0b0c0e0f101113141516");
95 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 93 key = new Clipperz.Crypto.AES.Key({key:keyValue});
96 block = new Clipperz.ByteArray("0xb8358e41b9dff65fd461d55a99266247"); 94 block = new Clipperz.ByteArray("0xb8358e41b9dff65fd461d55a99266247");
97 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 95 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
98 is(encryptedBlock.toHexString(), "0x92097b4c88a041ddf98144bc8d22e8e7", "Test 7"); 96 is(encryptedBlock.toHexString(), "0x92097b4c88a041ddf98144bc8d22e8e7", "Test 7");
99 97
100 keyValue = new Clipperz.ByteArray("0x18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e"); 98 keyValue = new Clipperz.ByteArray("0x18191a1b1d1e1f20222324252728292a2c2d2e2f31323334363738393b3c3d3e");
101 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 99 key = new Clipperz.Crypto.AES.Key({key:keyValue});
102 block = new Clipperz.ByteArray("0xf0e2d72260af58e21e015ab3a4c0d906"); 100 block = new Clipperz.ByteArray("0xf0e2d72260af58e21e015ab3a4c0d906");
103 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 101 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
104 is(encryptedBlock.toHexString(), "0x89bd5b73b356ab412aef9f76cea2d65c", "Test 8"); 102 is(encryptedBlock.toHexString(), "0x89bd5b73b356ab412aef9f76cea2d65c", "Test 8");
105 103
106 keyValue = new Clipperz.ByteArray("0x40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566"); 104 keyValue = new Clipperz.ByteArray("0x40414243454647484a4b4c4d4f50515254555657595a5b5c5e5f606163646566");
107 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 105 key = new Clipperz.Crypto.AES.Key({key:keyValue});
108 block = new Clipperz.ByteArray("0x475b8b823ce8893db3c44a9f2a379ff7"); 106 block = new Clipperz.ByteArray("0x475b8b823ce8893db3c44a9f2a379ff7");
109 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 107 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
110 is(encryptedBlock.toHexString(), "0x2536969093c55ff9454692f2fac2f530", "Test 9"); 108 is(encryptedBlock.toHexString(), "0x2536969093c55ff9454692f2fac2f530", "Test 9");
111 109
112 keyValue = new Clipperz.ByteArray("0x68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e"); 110 keyValue = new Clipperz.ByteArray("0x68696a6b6d6e6f70727374757778797a7c7d7e7f81828384868788898b8c8d8e");
113 key = new Clipperz.Crypto.AES.Key({key:keyValue}); 111 key = new Clipperz.Crypto.AES.Key({key:keyValue});
114 block = new Clipperz.ByteArray("0x688f5281945812862f5f3076cf80412f"); 112 block = new Clipperz.ByteArray("0x688f5281945812862f5f3076cf80412f");
115 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues())); 113 encryptedBlock = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(key, block.arrayValues()));
116 is(encryptedBlock.toHexString(), "0x07fc76a872843f3f6e0081ee9396d637", "Test 10"); 114 is(encryptedBlock.toHexString(), "0x07fc76a872843f3f6e0081ee9396d637", "Test 10");
117 115
118 //------------------------------------------------------------------------- 116 //-------------------------------------------------------------------------
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html
index a90d815..13dade4 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.Crypto.AES_performance - TEST</title> 26 <title>Clipperz.Crypto.AES_performance - TEST</title>
29 27
30 <script> 28 <script>
31 jslog_config_enabled = true; 29 jslog_config_enabled = true;
32 </script> 30 </script>
33 31
34 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
35 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
36 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
37 35
38 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 36 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
39 37
40 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
45 43
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
49 47
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
54 52
55</head> 53</head>
56<body> 54<body>
57<pre id="test"> 55<pre id="test">
58<script type="text/javascript"> 56<script type="text/javascript">
59Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 57Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
60 58
61try { 59try {
62 60
63 var password; 61 var password;
64 varplainText; 62 varplainText;
65 varencryptedText; 63 varencryptedText;
66 var decryptedText; 64 var decryptedText;
67 /* 65 /*
68 password = "trustno1"; 66 password = "trustno1";
69 plainText = "The quick brown fox jumps over the lazy dog"; 67 plainText = "The quick brown fox jumps over the lazy dog";
70//console.profile("encrypt"); 68//console.profile("encrypt");
71 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(password, plainText); 69 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(password, plainText);
72//console.profileEnd(); 70//console.profileEnd();
73//console.profile("decrypt"); 71//console.profile("decrypt");
74 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(password, encryptedText); 72 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(password, encryptedText);
75//console.profileEnd(); 73//console.profileEnd();
76 is(decryptedText, plainText, "simple string encrypted/decrypted"); 74 is(decryptedText, plainText, "simple string encrypted/decrypted");
77*/ 75*/
78 76
79 password = "L7bd9fQMhborMbYcHtlr"; 77 password = "L7bd9fQMhborMbYcHtlr";
80 plainText = {"records":{"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6":{"label":"imap4all [no]", "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd", "notes":""}, "c9dae2b7a60b300008306f5ec731b60050250df8f8ff34f7d9cce92762121b99":{"label":"Il manifesto", "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c", "notes":""}, "70d536c89a86b1aa9e077d6f9c717306a5d6c8d5549789e42dfb4f981484f116":{"label":"OmniGroup applications", "key":"7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c", "notes":"url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:"}, "111855cedd650dfcbbce597d764583c6b040df4b71f5fa0161fb8d10514ee48f":{"label":"R@cine", "key":"57295772c84669b0a224f435e9b75c797ae5999a2d9473ab50f9384ae54f49d6", "notes":""}, "378a790452de46e1079a99eba2e15094a096b418cccd0262b8b20244eb94d2df":{"label":"NewsGator", "key":"6ee16f6932ee02000c49dbcc685c84074b40d7956e5f4bc1100030a0f9a41f1a", "notes":""}, "30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e":{"label":"GMail - giulio.cesare", "key":"0395efd852b00700bcf78b65350ec15932430df71201d2c53a11b0269b557d1a", "notes":""}, "b2836a864ff081b6f053c3f5f13dfb29c81af33d25a316cdd82af747ea71bea0":{"label":"GMail - clipperz.com", "key":"90d6ae70d89c8211404b6f9d6c70b6b9c113fff74f474a67b34acd9c1c048d1f", "notes":""}, "6ad2cda35f97743cfddf2133cdf3142fe6419e683484531f1ef1e67431f44284":{"label":"Aruba - hosting", "key":"5c7472d24d57391c63ea99ed1fc9de179d225abd335fa65702018cfea6083d47", "notes":""}, "741ce1d21839c69db754309b04ce02fbb4104f6cb87572c056ae4af918420700":{"label":"Aruba - sql hosting", "key":"f6bd942ac3b0b7065771e5197c7499b345a10f7a4843d00c3ba3809d0ea059dc", "notes":""}, "1cef440eecea59f47554aa04b94e18c1d9fc761246b911f89a7da72d544cac48":{"label":"Amazon", "key":"1ae022b4d14b642f113703b2a98931bd892dec2da785ab5ff6fc1d0aac7537f1", "notes":""}, "d34c13773b5d8154355c2605024a1dfaf66279ba0fbe3ac19fc1cbc642278fe4":{"label":"YouTube [no]", "key":"4c6593d4f6448137939b364b84c81501fadb60f7871fe5fa63c93e97bb5c4648", "notes":""}, "5054f0b94cd97610a1bc0ed8671b6fb5b25bf7a5582677059fcaaea75fac27bc":{"label":"DynDns - gcsolaroli", "key":"f8ed9e7a3630deed046eda37ebc63ecb4d63668a2f97224d7628fdc53b242467", "notes":""}, "73fb52ed51533657d6ebb020d5026fb4deb601dadce802de58f7fff4b56e1495":{"label":"DynDns - clipperz", "key":"d8bc295177383a523e67b61b166e0ca956ab4c2ee86800559a009d2716064f6d", "notes":""}, "48d4c0546c032be26ecce4da41e020129afa7fc34cfe164ea72e1c9953d2e6bb":{"label":"Bol.it", "key":"cada5dadeebd8d12190954d21f1a944c8799d034f028be195b448935fcf970c7", "notes":""}, "d62d420db34720ccc054df06b88725ea79020ffa9389ca15e70137fb4dfd0883":{"label":"Freenigma - clipperz.com", "key":"f09cb3790c1110794b834702b8c487c1a42b2508fbe6450a8468477d93790b2e", "notes":""}, "ccd44ae294e7694ea53009c7198506cc0fe3121ad5d9fe2635d247e2afdab2ae":{"label":"Freenigma", "key":"4b05738f6faebc147eac5e425054a91d3cc59dd63844e82d1f0864c0ac8efec7", "notes":""}, "bd5a587bb977a2c728fcd0fa6093dd63a4e62138cf89721115fe45e0396ba5d2":{"label":"clipperz.com - blog", "key":"9cc24328bbce18e8713962428d8123e309a12f7e1d9537bc252e134501734003", "notes":""}, "c2b99939e40d100218baa3ed1cb2a25a5cf726485b0336a0989b104a94157b5f":{"label":"Apple", "key":"75f2651af400629c4e5dd8bcdc3a6c691150d23d6e1a4eb263ff810926d1228f", "notes":""}, "b5bd38d8eb5e23b1354884cc519e05580864fadf74d0a19d2c691cd0c7054d77":{"label":".mac", "key":"5934ae96d2e01282effb368d9086c2ba5d1d856ad91dd6f04f5bace26a1c0cbe", "notes":""}, "ff79a2282cf246add520a3c06e835cf6ffaaae95067d45e8e2e8f44da2501380":{"label":"3nity", "key":"33d84c4a91ab053cbf8115c689ede7e504b81199884de449acc257bea534f57f", "notes":""}, "7b2f2a59ebb34b5a49f20b99b546f08b9f4f62cbefdce9699f8ef7e74aeb0552":{"label":"ACM", "key":"b4976bb0892baba81d628513d191de100d89acd58efbb07c823a5bb4abe48a7a", "notes":""}, "b83a6bac0da3a27eb909d34cbad183e77088952f01d8d5321613b7b01635a020":{"label":"Adobe", "key":"d162bc404994a79ec97e0106c3a4edf2f83aca25def130242e11e95e74bd0aaa", "notes":""}, "befc571e9cda1a7dfb1d15200240ca5170386280ee7be6a12716904cb6d0ea44":{"label":"Adobe Photoshop Elements 3", "key":"18a62c3c2065399819707322f467ff4be030d7939acbe5182c8194599845c428", "notes":"Photoshop Elements 2:\n1057-4312-5223-2206-9509-6837"}, "0424f72608fedc969d64a6d5b4a16dd3ce860a230cd6d87d936439f4dd2aafc7":{"label":"Agatra", "key":"c35158a21b2af75d414232b742ab738d042314e00209f8fca94c8c704c891f23", "notes":""}, "e5e17c29fd598acb4f4c7d621dbdcb045d4d0cabf7d8a19e24420c440cdc3935":{"label":"AIM", "key":"8561ac421d845921978387b5e6b362750b57ed08feda8ec12b9378b69f67ceff", "notes":""}, "de890eb76a4b0cabd4ffd490adad1ff1b73238c7b5ee6dde1a2aeab2d03ebe93":{"label":"Anna Vespignani", "key":"79a970af0d2d30643dc2db4d16757395c1f22c311919036c2a22b7581982144a", "notes":""}, "0dc8d3989d0b35d672c012057d3eb7b111f16e79329e08a9ffb31ac7accbab21":{"label":"Bloglines", "key":"fe81f4df8c42fd81c830f9af408e9b074e77fd430e26d0ee285844fe3b092aec", "notes":""}, "85a40a322a59c80cb46519900269dcc7cf6947213d03dfc9371dd1930373a65b":{"label":"Bow.it", "key":"64a1a9fec99c9238dc8180a01484a1ccf5f50fcd6e9a95a52b8b49fb9ca00bdc", "notes":""}, "60308062a1848a301641a74712d220eef191a280ba0a8355992f0e61ed793811":{"label":"GMail - feedback", "key":"fad310cb2e6152c3faf78b7183c99f3044f5d31ee364068b80580c271a7784ef", "notes":""}, "257ac2da79ee1cd46dfa214d91f5ece213b6bbade28d1ee71495c81a3d7e033a":{"label":"Fineco", "key":"8f99de2635b5dad7987180bc0bff49947eb37cc75d6a5d1ee1f13ed7567465a3", "notes":""}, "78261622810232b6da5efcd52b1c9b0bd87c62517bf4df25323ca6a0b49d84ec":{"label":"mon.itor.us", "key":"d2aa7164007c5deac8bb73580a6ab0d051f747e801ecd30284eff725d0ffaba2", "notes":""}, "4b78dc0376d07e57d77b4c7318d2f222956adb6ff7360b73e60b8bb8b85f3d11":{"label":"Lamba Probe - forum", "key":"f73906817fddba4d8f816334cb2fd0cd5ae91bc29bce6a69fdd5cf98fc96911f", "notes":""}, "78ca2c85908275d788c2f7dd0306ca5e03b83637bb3812272b697e12e9dbf941":{"label":"MeasureMap", "key":"2385ce9536ebb7863b6a4c8b1f5c428587e4d6420a4bbcd31b935cb00bbd768e", "notes":""}, "4c2c7f0d733b647e6f388c9a4590a2a864cd2de259b66aba9b3cf92bdc3cf9bc":{"label":"NGI - Squillo", "key":"96f20c212be02fb38c8b2dfc83d8e864dd84dcb95297a7fecf9280e1e4dcffe3", "notes":""}, "eaeadf6d36f8ee6916c33b9e5bf480b663dc90c0c7f370ff5a1f2fd998cf1143":{"label":"NGI - F5", "key":"00347769244b208647c24e6a64f8fa4213e97eb2135ecfcb277b341c28616a59", "notes":""}, "19654392222206d60547073209672dde1c743ea371ddc20a2bd8254e561a4ec0":{"label":"CVSdude", "key":"ed0ab5080a29eb1b20927142d21ab8f67b61c2c7b19623bb610af030dfd42c02", "notes":""}, "6b10514d50e745f1dab5a40e8629ecf1a8c78a5d6e3895f3637fb67d2d3f9993":{"label":"Yahoo", "key":"6380a7655cd790d1f1e6f482e92ae04201568ff0cab887e65102e9396df1b86e", "notes":"note"}}, "directLogins":{"eac496e0b1ec75ea403f821fedc7f51f98dac639713ebe577f969f607a8943f5":{"record":"111855cedd650dfcbbce597d764583c6b040df4b71f5fa0161fb8d10514ee48f", "label":"R@cine - WebMail", "favicon":"http://www.racine.ra.it/favicon.ico"}, "ef564a022630d4395a9ecac854f3b127b3518cec362323ccc605079c0749c152":{"record":"1cef440eecea59f47554aa04b94e18c1d9fc761246b911f89a7da72d544cac48", "label":"Amazon sign in", "favicon":"http://www.amazon.com/favicon.ico"}, "4f14b88a4055ff23a00d625382650888ce9284fe869304775e43e3e33ee5bbb6":{"record":"6ad2cda35f97743cfddf2133cdf3142fe6419e683484531f1ef1e67431f44284", "label":"Aruba - hosting", "favicon":"http://hosting.aruba.it/favicon.ico"}, "e94c0d12d1db0badc31a8bbbbc4b08d2065a39f458462bbff9756f7b5eb7fedf":{"record":"741ce1d21839c69db754309b04ce02fbb4104f6cb87572c056ae4af918420700", "label":"Aruba - sql hosting", "favicon":"http://mysql.aruba.it/favicon.ico"}, "7299249153ef93a44e2f248ca3a73badde56e71d70919bb5637093c2abbe2c9a":{"record":"bd5a587bb977a2c728fcd0fa6093dd63a4e62138cf89721115fe45e0396ba5d2", "label":"clipperz.com - blog", "favicon":"http://www.clipperz.com/favicon.ico"}, "66876dbae68778d4c104bc12f01adcb21d47d9eace8db30ef95f74f461afcb59":{"record":"73fb52ed51533657d6ebb020d5026fb4deb601dadce802de58f7fff4b56e1495", "label":"DynDns - clipperz", "favicon":"http://www.dyndns.com/favicon.ico"}, "a60c65030a1797abde3e2089c3e5de9648f66bf71cebf0b58c26e729ad8d6a45":{"record":"5054f0b94cd97610a1bc0ed8671b6fb5b25bf7a5582677059fcaaea75fac27bc", "label":"DynDns - gcsolaroli", "favicon":"http://www.dyndns.com/favicon.ico"}, "08d6c5dff9fed4a2f237c32dd0a93ac46b2c45370d07f56fa76064be3b8fecbf":{"record":"30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e", "label":"GMail - giulio.cesare", "favicon":"http://www.google.com/favicon.ico"}, "9e75e12f0f52f248cc7ae517869dd7b02303037d32d9fb4fa0ab0e013923c304":{"record":"c9dae2b7a60b300008306f5ec731b60050250df8f8ff34f7d9cce92762121b99", "label":"Il manifesto", "favicon":"http://abbonati.ilmanifesto.it/favicon.ico"}, "935bf9553fbcb85b8bd5b98c6901d7cccb2566b395f192cbea71e7822979aaf2":{"record":"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6", "label":"Imap4All.com - account", "favicon":"http://www.imap4all.com/favicon.ico"}, "9504205ec29b89e6ccd0f3afc7a447d8891da0c71a0222f1860f98a8f8bc6677":{"record":"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6", "label":"Imap4all.com - WebMail", "favicon":"http://webmail.imap4all.com/favicon.ico"}, "3d8dd32d2290ca98789c914580ac2436ece97234217a07d752726d2ac48a4ebf":{"record":"d34c13773b5d8154355c2605024a1dfaf66279ba0fbe3ac19fc1cbc642278fe4", "label":"YouTube [no]", "favicon":"http://www.youtube.com/favicon.ico"}, "7c4b6b5a16984c43ed6d99b04ddfa7e00b624de729ec8aaa3d0f539fb67587e2":{"record":"c2b99939e40d100218baa3ed1cb2a25a5cf726485b0336a0989b104a94157b5f", "label":"Apple Store - Italia", "favicon":"http://store.apple.com/favicon.ico"}, "0b9a98262b50f0ebae5af077467bc627619738873690238fd61093ce9922c9f9":{"record":"ff79a2282cf246add520a3c06e835cf6ffaaae95067d45e8e2e8f44da2501380", "label":"3nity", "favicon":"http://www.3nity.de/favicon.ico"}, "aadeb3388629cfc3b15954f26cf284f52e084191dcdf75752dc4c53d2006c5be":{"record":"7b2f2a59ebb34b5a49f20b99b546f08b9f4f62cbefdce9699f8ef7e74aeb0552", "label":"ACM Web Account", "favicon":"http://portal.acm.org/favicon.ico"}, "3d21c71f2e284ec76f1ae0bb990b683979918f758635bb7d008150f4d7b1447d":{"record":"b83a6bac0da3a27eb909d34cbad183e77088952f01d8d5321613b7b01635a020", "label":"Adobe - Sign In", "favicon":"http://www.adobe.com/favicon.ico"}, "e61a331c998804d46044d4c2acaf96c2fce806f6549e1e16c7d2334872a70953":{"record":"0424f72608fedc969d64a6d5b4a16dd3ce860a230cd6d87d936439f4dd2aafc7", "label":"Agatra [no]", "favicon":"http://www.agatra.com/favicon.ico"}, "9bcd99564fda778061246439fa098dcc79de75b16c542f61e6de7d36dbaf97dc":{"record":"e5e17c29fd598acb4f4c7d621dbdcb045d4d0cabf7d8a19e24420c440cdc3935", "label":"AIM [no]", "favicon":"http://my.screenname.aol.com/favicon.ico"}, "c7093f4663c6e0eba941c557cb86da83fc68cbea36c922e168d0867e6cabe9fe":{"record":"0dc8d3989d0b35d672c012057d3eb7b111f16e79329e08a9ffb31ac7accbab21", "label":"Bloglines", "favicon":"http://www.bloglines.com/favicon.ico"}, "915f2e9460f6e54c6137f3876f9179fc8d2162c59f26e12899c2db6b0e70a68f":{"record":"85a40a322a59c80cb46519900269dcc7cf6947213d03dfc9371dd1930373a65b", "label":"Bow.it", "favicon":"http://www.bow.it/favicon.ico"}, "779701af1beb2a91735ba1a2e471b948f0d985bb0df256f5e089291ce3405bd2":{"record":"b2836a864ff081b6f053c3f5f13dfb29c81af33d25a316cdd82af747ea71bea0", "label":"GMail - Clipperz", "favicon":"http://www.google.com/favicon.ico"}, "1c300539a98c874d52134b6b5a591172acc00c0947692f3da284447f7d511eaf":{"record":"60308062a1848a301641a74712d220eef191a280ba0a8355992f0e61ed793811", "label":"GMail - feedback", "favicon":"http://www.google.com/favicon.ico"}, "f9dccdf7a98735fd7a6b5d04c09177005c0de14f8f92b04007f06a281ecdf31e":{"record":"30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e", "label":"Blogger", "favicon":"http://www.google.com/favicon.ico"}, "48497a89f3bfd567758977e1c32b4497d28c843880667ee52fa4cfcb53c5f9e4":{"record":"378a790452de46e1079a99eba2e15094a096b418cccd0262b8b20244eb94d2df", "label":"NewsGator", "favicon":"http://www.newsgator.com/favicon.ico"}, "134cd28f150df4f2a089f4807bb7a35fb7ece22ec41244f72e63f8b43637a4cd":{"record":"4b78dc0376d07e57d77b4c7318d2f222956adb6ff7360b73e60b8bb8b85f3d11", "label":"Lambda Probe - forum", "favicon":"http://www.lambdaprobe.org/favicon.ico"}, "2ab6106a81513b70f1ba0d7c5c3ef54fa6f4bcadf01d2eeaa2b31b9299551398":{"record":"78ca2c85908275d788c2f7dd0306ca5e03b83637bb3812272b697e12e9dbf941", "label":"Measure Map", "favicon":"http://alpha.measuremap.com/favicon.ico"}, "53ccdc41b43da9b018847f9faa8effb35e7a6c6e78a54e9ee7816fc02f0ea63b":{"record":"4c2c7f0d733b647e6f388c9a4590a2a864cd2de259b66aba9b3cf92bdc3cf9bc", "label":"NGI - Squillo", "favicon":"http://www.ngi.it/favicon.ico"}, "ca520e7081fba1df3ef79c3d00266cffc8e4567def29d67ae812b7ed6283fb12":{"record":"eaeadf6d36f8ee6916c33b9e5bf480b663dc90c0c7f370ff5a1f2fd998cf1143", "label":"NGI - F5", "favicon":"http://www.ngi.it/favicon.ico"}, "80e63e135d7abd2b2990f42af4f8d1f8e8b1146aed44dc36975061fbf360a983":{"record":"6b10514d50e745f1dab5a40e8629ecf1a8c78a5d6e3895f3637fb67d2d3f9993", "label":"Yahoo! Mail", "favicon":"http://login.yahoo.com/favicon.ico"}}, "preferences":{"preferredLanguage":"en-US"}}; 78 plainText = {"records":{"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6":{"label":"imap4all [no]", "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd", "notes":""}, "c9dae2b7a60b300008306f5ec731b60050250df8f8ff34f7d9cce92762121b99":{"label":"Il manifesto", "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c", "notes":""}, "70d536c89a86b1aa9e077d6f9c717306a5d6c8d5549789e42dfb4f981484f116":{"label":"OmniGroup applications", "key":"7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c", "notes":"url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:"}, "111855cedd650dfcbbce597d764583c6b040df4b71f5fa0161fb8d10514ee48f":{"label":"R@cine", "key":"57295772c84669b0a224f435e9b75c797ae5999a2d9473ab50f9384ae54f49d6", "notes":""}, "378a790452de46e1079a99eba2e15094a096b418cccd0262b8b20244eb94d2df":{"label":"NewsGator", "key":"6ee16f6932ee02000c49dbcc685c84074b40d7956e5f4bc1100030a0f9a41f1a", "notes":""}, "30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e":{"label":"GMail - giulio.cesare", "key":"0395efd852b00700bcf78b65350ec15932430df71201d2c53a11b0269b557d1a", "notes":""}, "b2836a864ff081b6f053c3f5f13dfb29c81af33d25a316cdd82af747ea71bea0":{"label":"GMail - clipperz.com", "key":"90d6ae70d89c8211404b6f9d6c70b6b9c113fff74f474a67b34acd9c1c048d1f", "notes":""}, "6ad2cda35f97743cfddf2133cdf3142fe6419e683484531f1ef1e67431f44284":{"label":"Aruba - hosting", "key":"5c7472d24d57391c63ea99ed1fc9de179d225abd335fa65702018cfea6083d47", "notes":""}, "741ce1d21839c69db754309b04ce02fbb4104f6cb87572c056ae4af918420700":{"label":"Aruba - sql hosting", "key":"f6bd942ac3b0b7065771e5197c7499b345a10f7a4843d00c3ba3809d0ea059dc", "notes":""}, "1cef440eecea59f47554aa04b94e18c1d9fc761246b911f89a7da72d544cac48":{"label":"Amazon", "key":"1ae022b4d14b642f113703b2a98931bd892dec2da785ab5ff6fc1d0aac7537f1", "notes":""}, "d34c13773b5d8154355c2605024a1dfaf66279ba0fbe3ac19fc1cbc642278fe4":{"label":"YouTube [no]", "key":"4c6593d4f6448137939b364b84c81501fadb60f7871fe5fa63c93e97bb5c4648", "notes":""}, "5054f0b94cd97610a1bc0ed8671b6fb5b25bf7a5582677059fcaaea75fac27bc":{"label":"DynDns - gcsolaroli", "key":"f8ed9e7a3630deed046eda37ebc63ecb4d63668a2f97224d7628fdc53b242467", "notes":""}, "73fb52ed51533657d6ebb020d5026fb4deb601dadce802de58f7fff4b56e1495":{"label":"DynDns - clipperz", "key":"d8bc295177383a523e67b61b166e0ca956ab4c2ee86800559a009d2716064f6d", "notes":""}, "48d4c0546c032be26ecce4da41e020129afa7fc34cfe164ea72e1c9953d2e6bb":{"label":"Bol.it", "key":"cada5dadeebd8d12190954d21f1a944c8799d034f028be195b448935fcf970c7", "notes":""}, "d62d420db34720ccc054df06b88725ea79020ffa9389ca15e70137fb4dfd0883":{"label":"Freenigma - clipperz.com", "key":"f09cb3790c1110794b834702b8c487c1a42b2508fbe6450a8468477d93790b2e", "notes":""}, "ccd44ae294e7694ea53009c7198506cc0fe3121ad5d9fe2635d247e2afdab2ae":{"label":"Freenigma", "key":"4b05738f6faebc147eac5e425054a91d3cc59dd63844e82d1f0864c0ac8efec7", "notes":""}, "bd5a587bb977a2c728fcd0fa6093dd63a4e62138cf89721115fe45e0396ba5d2":{"label":"clipperz.com - blog", "key":"9cc24328bbce18e8713962428d8123e309a12f7e1d9537bc252e134501734003", "notes":""}, "c2b99939e40d100218baa3ed1cb2a25a5cf726485b0336a0989b104a94157b5f":{"label":"Apple", "key":"75f2651af400629c4e5dd8bcdc3a6c691150d23d6e1a4eb263ff810926d1228f", "notes":""}, "b5bd38d8eb5e23b1354884cc519e05580864fadf74d0a19d2c691cd0c7054d77":{"label":".mac", "key":"5934ae96d2e01282effb368d9086c2ba5d1d856ad91dd6f04f5bace26a1c0cbe", "notes":""}, "ff79a2282cf246add520a3c06e835cf6ffaaae95067d45e8e2e8f44da2501380":{"label":"3nity", "key":"33d84c4a91ab053cbf8115c689ede7e504b81199884de449acc257bea534f57f", "notes":""}, "7b2f2a59ebb34b5a49f20b99b546f08b9f4f62cbefdce9699f8ef7e74aeb0552":{"label":"ACM", "key":"b4976bb0892baba81d628513d191de100d89acd58efbb07c823a5bb4abe48a7a", "notes":""}, "b83a6bac0da3a27eb909d34cbad183e77088952f01d8d5321613b7b01635a020":{"label":"Adobe", "key":"d162bc404994a79ec97e0106c3a4edf2f83aca25def130242e11e95e74bd0aaa", "notes":""}, "befc571e9cda1a7dfb1d15200240ca5170386280ee7be6a12716904cb6d0ea44":{"label":"Adobe Photoshop Elements 3", "key":"18a62c3c2065399819707322f467ff4be030d7939acbe5182c8194599845c428", "notes":"Photoshop Elements 2:\n1057-4312-5223-2206-9509-6837"}, "0424f72608fedc969d64a6d5b4a16dd3ce860a230cd6d87d936439f4dd2aafc7":{"label":"Agatra", "key":"c35158a21b2af75d414232b742ab738d042314e00209f8fca94c8c704c891f23", "notes":""}, "e5e17c29fd598acb4f4c7d621dbdcb045d4d0cabf7d8a19e24420c440cdc3935":{"label":"AIM", "key":"8561ac421d845921978387b5e6b362750b57ed08feda8ec12b9378b69f67ceff", "notes":""}, "de890eb76a4b0cabd4ffd490adad1ff1b73238c7b5ee6dde1a2aeab2d03ebe93":{"label":"Anna Vespignani", "key":"79a970af0d2d30643dc2db4d16757395c1f22c311919036c2a22b7581982144a", "notes":""}, "0dc8d3989d0b35d672c012057d3eb7b111f16e79329e08a9ffb31ac7accbab21":{"label":"Bloglines", "key":"fe81f4df8c42fd81c830f9af408e9b074e77fd430e26d0ee285844fe3b092aec", "notes":""}, "85a40a322a59c80cb46519900269dcc7cf6947213d03dfc9371dd1930373a65b":{"label":"Bow.it", "key":"64a1a9fec99c9238dc8180a01484a1ccf5f50fcd6e9a95a52b8b49fb9ca00bdc", "notes":""}, "60308062a1848a301641a74712d220eef191a280ba0a8355992f0e61ed793811":{"label":"GMail - feedback", "key":"fad310cb2e6152c3faf78b7183c99f3044f5d31ee364068b80580c271a7784ef", "notes":""}, "257ac2da79ee1cd46dfa214d91f5ece213b6bbade28d1ee71495c81a3d7e033a":{"label":"Fineco", "key":"8f99de2635b5dad7987180bc0bff49947eb37cc75d6a5d1ee1f13ed7567465a3", "notes":""}, "78261622810232b6da5efcd52b1c9b0bd87c62517bf4df25323ca6a0b49d84ec":{"label":"mon.itor.us", "key":"d2aa7164007c5deac8bb73580a6ab0d051f747e801ecd30284eff725d0ffaba2", "notes":""}, "4b78dc0376d07e57d77b4c7318d2f222956adb6ff7360b73e60b8bb8b85f3d11":{"label":"Lamba Probe - forum", "key":"f73906817fddba4d8f816334cb2fd0cd5ae91bc29bce6a69fdd5cf98fc96911f", "notes":""}, "78ca2c85908275d788c2f7dd0306ca5e03b83637bb3812272b697e12e9dbf941":{"label":"MeasureMap", "key":"2385ce9536ebb7863b6a4c8b1f5c428587e4d6420a4bbcd31b935cb00bbd768e", "notes":""}, "4c2c7f0d733b647e6f388c9a4590a2a864cd2de259b66aba9b3cf92bdc3cf9bc":{"label":"NGI - Squillo", "key":"96f20c212be02fb38c8b2dfc83d8e864dd84dcb95297a7fecf9280e1e4dcffe3", "notes":""}, "eaeadf6d36f8ee6916c33b9e5bf480b663dc90c0c7f370ff5a1f2fd998cf1143":{"label":"NGI - F5", "key":"00347769244b208647c24e6a64f8fa4213e97eb2135ecfcb277b341c28616a59", "notes":""}, "19654392222206d60547073209672dde1c743ea371ddc20a2bd8254e561a4ec0":{"label":"CVSdude", "key":"ed0ab5080a29eb1b20927142d21ab8f67b61c2c7b19623bb610af030dfd42c02", "notes":""}, "6b10514d50e745f1dab5a40e8629ecf1a8c78a5d6e3895f3637fb67d2d3f9993":{"label":"Yahoo", "key":"6380a7655cd790d1f1e6f482e92ae04201568ff0cab887e65102e9396df1b86e", "notes":"note"}}, "directLogins":{"eac496e0b1ec75ea403f821fedc7f51f98dac639713ebe577f969f607a8943f5":{"record":"111855cedd650dfcbbce597d764583c6b040df4b71f5fa0161fb8d10514ee48f", "label":"R@cine - WebMail", "favicon":"http://www.racine.ra.it/favicon.ico"}, "ef564a022630d4395a9ecac854f3b127b3518cec362323ccc605079c0749c152":{"record":"1cef440eecea59f47554aa04b94e18c1d9fc761246b911f89a7da72d544cac48", "label":"Amazon sign in", "favicon":"http://www.amazon.com/favicon.ico"}, "4f14b88a4055ff23a00d625382650888ce9284fe869304775e43e3e33ee5bbb6":{"record":"6ad2cda35f97743cfddf2133cdf3142fe6419e683484531f1ef1e67431f44284", "label":"Aruba - hosting", "favicon":"http://hosting.aruba.it/favicon.ico"}, "e94c0d12d1db0badc31a8bbbbc4b08d2065a39f458462bbff9756f7b5eb7fedf":{"record":"741ce1d21839c69db754309b04ce02fbb4104f6cb87572c056ae4af918420700", "label":"Aruba - sql hosting", "favicon":"http://mysql.aruba.it/favicon.ico"}, "7299249153ef93a44e2f248ca3a73badde56e71d70919bb5637093c2abbe2c9a":{"record":"bd5a587bb977a2c728fcd0fa6093dd63a4e62138cf89721115fe45e0396ba5d2", "label":"clipperz.com - blog", "favicon":"http://www.clipperz.com/favicon.ico"}, "66876dbae68778d4c104bc12f01adcb21d47d9eace8db30ef95f74f461afcb59":{"record":"73fb52ed51533657d6ebb020d5026fb4deb601dadce802de58f7fff4b56e1495", "label":"DynDns - clipperz", "favicon":"http://www.dyndns.com/favicon.ico"}, "a60c65030a1797abde3e2089c3e5de9648f66bf71cebf0b58c26e729ad8d6a45":{"record":"5054f0b94cd97610a1bc0ed8671b6fb5b25bf7a5582677059fcaaea75fac27bc", "label":"DynDns - gcsolaroli", "favicon":"http://www.dyndns.com/favicon.ico"}, "08d6c5dff9fed4a2f237c32dd0a93ac46b2c45370d07f56fa76064be3b8fecbf":{"record":"30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e", "label":"GMail - giulio.cesare", "favicon":"http://www.google.com/favicon.ico"}, "9e75e12f0f52f248cc7ae517869dd7b02303037d32d9fb4fa0ab0e013923c304":{"record":"c9dae2b7a60b300008306f5ec731b60050250df8f8ff34f7d9cce92762121b99", "label":"Il manifesto", "favicon":"http://abbonati.ilmanifesto.it/favicon.ico"}, "935bf9553fbcb85b8bd5b98c6901d7cccb2566b395f192cbea71e7822979aaf2":{"record":"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6", "label":"Imap4All.com - account", "favicon":"http://www.imap4all.com/favicon.ico"}, "9504205ec29b89e6ccd0f3afc7a447d8891da0c71a0222f1860f98a8f8bc6677":{"record":"f1aac97154a0e52c5e33508afa82df5a9d6dcde24883a240b8c072a3238da0b6", "label":"Imap4all.com - WebMail", "favicon":"http://webmail.imap4all.com/favicon.ico"}, "3d8dd32d2290ca98789c914580ac2436ece97234217a07d752726d2ac48a4ebf":{"record":"d34c13773b5d8154355c2605024a1dfaf66279ba0fbe3ac19fc1cbc642278fe4", "label":"YouTube [no]", "favicon":"http://www.youtube.com/favicon.ico"}, "7c4b6b5a16984c43ed6d99b04ddfa7e00b624de729ec8aaa3d0f539fb67587e2":{"record":"c2b99939e40d100218baa3ed1cb2a25a5cf726485b0336a0989b104a94157b5f", "label":"Apple Store - Italia", "favicon":"http://store.apple.com/favicon.ico"}, "0b9a98262b50f0ebae5af077467bc627619738873690238fd61093ce9922c9f9":{"record":"ff79a2282cf246add520a3c06e835cf6ffaaae95067d45e8e2e8f44da2501380", "label":"3nity", "favicon":"http://www.3nity.de/favicon.ico"}, "aadeb3388629cfc3b15954f26cf284f52e084191dcdf75752dc4c53d2006c5be":{"record":"7b2f2a59ebb34b5a49f20b99b546f08b9f4f62cbefdce9699f8ef7e74aeb0552", "label":"ACM Web Account", "favicon":"http://portal.acm.org/favicon.ico"}, "3d21c71f2e284ec76f1ae0bb990b683979918f758635bb7d008150f4d7b1447d":{"record":"b83a6bac0da3a27eb909d34cbad183e77088952f01d8d5321613b7b01635a020", "label":"Adobe - Sign In", "favicon":"http://www.adobe.com/favicon.ico"}, "e61a331c998804d46044d4c2acaf96c2fce806f6549e1e16c7d2334872a70953":{"record":"0424f72608fedc969d64a6d5b4a16dd3ce860a230cd6d87d936439f4dd2aafc7", "label":"Agatra [no]", "favicon":"http://www.agatra.com/favicon.ico"}, "9bcd99564fda778061246439fa098dcc79de75b16c542f61e6de7d36dbaf97dc":{"record":"e5e17c29fd598acb4f4c7d621dbdcb045d4d0cabf7d8a19e24420c440cdc3935", "label":"AIM [no]", "favicon":"http://my.screenname.aol.com/favicon.ico"}, "c7093f4663c6e0eba941c557cb86da83fc68cbea36c922e168d0867e6cabe9fe":{"record":"0dc8d3989d0b35d672c012057d3eb7b111f16e79329e08a9ffb31ac7accbab21", "label":"Bloglines", "favicon":"http://www.bloglines.com/favicon.ico"}, "915f2e9460f6e54c6137f3876f9179fc8d2162c59f26e12899c2db6b0e70a68f":{"record":"85a40a322a59c80cb46519900269dcc7cf6947213d03dfc9371dd1930373a65b", "label":"Bow.it", "favicon":"http://www.bow.it/favicon.ico"}, "779701af1beb2a91735ba1a2e471b948f0d985bb0df256f5e089291ce3405bd2":{"record":"b2836a864ff081b6f053c3f5f13dfb29c81af33d25a316cdd82af747ea71bea0", "label":"GMail - Clipperz", "favicon":"http://www.google.com/favicon.ico"}, "1c300539a98c874d52134b6b5a591172acc00c0947692f3da284447f7d511eaf":{"record":"60308062a1848a301641a74712d220eef191a280ba0a8355992f0e61ed793811", "label":"GMail - feedback", "favicon":"http://www.google.com/favicon.ico"}, "f9dccdf7a98735fd7a6b5d04c09177005c0de14f8f92b04007f06a281ecdf31e":{"record":"30c4f575799fc6908765fc8b54f4a9a483cb32e12aa89feae545976870a9102e", "label":"Blogger", "favicon":"http://www.google.com/favicon.ico"}, "48497a89f3bfd567758977e1c32b4497d28c843880667ee52fa4cfcb53c5f9e4":{"record":"378a790452de46e1079a99eba2e15094a096b418cccd0262b8b20244eb94d2df", "label":"NewsGator", "favicon":"http://www.newsgator.com/favicon.ico"}, "134cd28f150df4f2a089f4807bb7a35fb7ece22ec41244f72e63f8b43637a4cd":{"record":"4b78dc0376d07e57d77b4c7318d2f222956adb6ff7360b73e60b8bb8b85f3d11", "label":"Lambda Probe - forum", "favicon":"http://www.lambdaprobe.org/favicon.ico"}, "2ab6106a81513b70f1ba0d7c5c3ef54fa6f4bcadf01d2eeaa2b31b9299551398":{"record":"78ca2c85908275d788c2f7dd0306ca5e03b83637bb3812272b697e12e9dbf941", "label":"Measure Map", "favicon":"http://alpha.measuremap.com/favicon.ico"}, "53ccdc41b43da9b018847f9faa8effb35e7a6c6e78a54e9ee7816fc02f0ea63b":{"record":"4c2c7f0d733b647e6f388c9a4590a2a864cd2de259b66aba9b3cf92bdc3cf9bc", "label":"NGI - Squillo", "favicon":"http://www.ngi.it/favicon.ico"}, "ca520e7081fba1df3ef79c3d00266cffc8e4567def29d67ae812b7ed6283fb12":{"record":"eaeadf6d36f8ee6916c33b9e5bf480b663dc90c0c7f370ff5a1f2fd998cf1143", "label":"NGI - F5", "favicon":"http://www.ngi.it/favicon.ico"}, "80e63e135d7abd2b2990f42af4f8d1f8e8b1146aed44dc36975061fbf360a983":{"record":"6b10514d50e745f1dab5a40e8629ecf1a8c78a5d6e3895f3637fb67d2d3f9993", "label":"Yahoo! Mail", "favicon":"http://login.yahoo.com/favicon.ico"}}, "preferences":{"preferredLanguage":"en-US"}};
81/* */ 79/* */
82 plainText = { 80 plainText = {
83 "records": { 81 "records": {
84 "1": { 82 "1": {
85 "label":"imap4all [no]", 83 "label":"imap4all [no]",
86 "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd", 84 "key":"f54b5033d1152456acb67974c45ee6771f8411e300c9533359dfacacf60dcbbd",
87 "notes":"" 85 "notes":""
88 }, 86 },
89 "2": { 87 "2": {
90 "label":"Il manifesto", 88 "label":"Il manifesto",
91 "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c", 89 "key":"6e0ef134503110e72f444e7d102a4b1cc6ae28f2e0b1287c2b1875ff052fc16c",
92 "notes":"" 90 "notes":""
93 }, 91 },
94 "3": { 92 "3": {
95 "label": "OmniGroup applications", 93 "label": "OmniGroup applications",
96 "key": "7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c", 94 "key": "7b432b7dae39ff5951db31947fa721dc012af0da4055760c6df3b02e776ef22c",
97 "notes": "url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:" 95 "notes": "url: http://www.omnigroup.com\n\nLicence owner: Giulio Cesare Solaroli\n\nOmniWeb: EQGP-EMKH-LKWP-MUHQ-OUHL-LDF\nOmniGraffle:\nOmniOutliner:\nOmniDiskSweeper:"
98 }, 96 },
99 "4": { 97 "4": {
100 "label": "R@cine", 98 "label": "R@cine",
101 "key": "57295772c84669b0a224f435e9b75c797ae5999a2d9473ab50f9384ae54f49d6", 99 "key": "57295772c84669b0a224f435e9b75c797ae5999a2d9473ab50f9384ae54f49d6",
102 "notes": "" 100 "notes": ""
103 }, 101 },
104 "5": { 102 "5": {
105 "label": "NewsGator", 103 "label": "NewsGator",
106 "key": "6ee16f6932ee02000c49dbcc685c84074b40d7956e5f4bc1100030a0f9a41f1a", 104 "key": "6ee16f6932ee02000c49dbcc685c84074b40d7956e5f4bc1100030a0f9a41f1a",
107 "notes": "" 105 "notes": ""
108 }, 106 },
109 "6": { 107 "6": {
110 "label": "GMail - giulio.cesare", 108 "label": "GMail - giulio.cesare",
111 "key": "0395efd852b00700bcf78b65350ec15932430df71201d2c53a11b0269b557d1a", 109 "key": "0395efd852b00700bcf78b65350ec15932430df71201d2c53a11b0269b557d1a",
112 "notes": "" 110 "notes": ""
113 }, 111 },
114 "7": { 112 "7": {
115 "label": "GMail - clipperz.com", 113 "label": "GMail - clipperz.com",
116 "key": "90d6ae70d89c8211404b6f9d6c70b6b9c113fff74f474a67b34acd9c1c048d1f", 114 "key": "90d6ae70d89c8211404b6f9d6c70b6b9c113fff74f474a67b34acd9c1c048d1f",
117 "notes": "" 115 "notes": ""
118 }, 116 },
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html b/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html
index 83f0766..0e42790 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 27 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 28 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
35 33
36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
40 38
41</head> 39</head>
42<body> 40<body>
43<pre id="test"> 41<pre id="test">
44<script type="text/javascript"> 42<script type="text/javascript">
45try { 43try {
46 var secretKey; 44 var secretKey;
47 varpublicKey; 45 varpublicKey;
48 varplainString; 46 varplainString;
49 varencryptedString; 47 varencryptedString;
50 48
51 49
52 secretKey = "s3cr37k39"; 50 secretKey = "s3cr37k39";
53 plainString = "The Quick Brown Fox Jumps Over The Lazy Dog"; 51 plainString = "The Quick Brown Fox Jumps Over The Lazy Dog";
54 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 52 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
55 53
56 //------------------------------------------------------------------------- 54 //-------------------------------------------------------------------------
57 // 55 //
58 //Secret key encryption / decryption 56 //Secret key encryption / decryption
59 // 57 //
60 is (isUndefinedOrNull(encryptedString), false, "An encrypted string should not be empty"); 58 is (isUndefinedOrNull(encryptedString), false, "An encrypted string should not be empty");
61 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 59 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
62 60
63 try { 61 try {
64 vardecryptedText; 62 vardecryptedText;
65 63
66 decryptedText = Clipperz.Crypto.Base.decryptUsingSecretKey("anotherKey", encryptedString); 64 decryptedText = Clipperz.Crypto.Base.decryptUsingSecretKey("anotherKey", encryptedString);
67 ok( false, "It should not be possible to decrypt a text with a different passphrase (decrypted text: " + decryptedText + ")" ); 65 ok( false, "It should not be possible to decrypt a text with a different passphrase (decrypted text: " + decryptedText + ")" );
68 } catch (e) { 66 } catch (e) {
69 ok( e instanceof Error, "Trying to decrypt a message with the wrong passphrase raised an error" ); 67 ok( e instanceof Error, "Trying to decrypt a message with the wrong passphrase raised an error" );
70 } 68 }
71 69
72 is (encryptedString == Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString), false, "Two consecutive encryption of the same text should return different values"); 70 is (encryptedString == Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString), false, "Two consecutive encryption of the same text should return different values");
73 71
74 secretKey = "trustno1"; 72 secretKey = "trustno1";
75 plainString = "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1"; 73 plainString = "59fed719f8959a468de367f77a33a7536d53b8e4d25ed49ccc89a94cd6899da90415623fb73386e9635034fb65ad5f248445a1c66703f760d64a8271ad342b1";
76 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 74 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
77 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 75 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
78 76
79 secretKey = "trustno1"; 77 secretKey = "trustno1";
80 plainString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed pede. Curabitur a mi id nisi euismod rutrum. Phasellus gravida. Ut luctus. Praesent quis leo sit amet orci imperdiet malesuada. Aenean molestie mauris euismod odio. Suspendisse ullamcorper facilisis nisl. Fusce vestibulum consectetuer risus. Curabitur ut turpis eget arcu facilisis ultricies. Morbi elementum, erat vitae dictum imperdiet, nisi purus rutrum odio, eget ornare ipsum nisl in tortor. Duis vestibulum, nulla et bibendum volutpat, mauris metus facilisis elit, vel gravida tortor leo at enim. Vivamus pulvinar lorem vitae tortor. Morbi rhoncus suscipit urna. Praesent placerat tempus augue. Fusce varius dui a nisi consequat ultricies. Curabitur at nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas."; 78 plainString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed pede. Curabitur a mi id nisi euismod rutrum. Phasellus gravida. Ut luctus. Praesent quis leo sit amet orci imperdiet malesuada. Aenean molestie mauris euismod odio. Suspendisse ullamcorper facilisis nisl. Fusce vestibulum consectetuer risus. Curabitur ut turpis eget arcu facilisis ultricies. Morbi elementum, erat vitae dictum imperdiet, nisi purus rutrum odio, eget ornare ipsum nisl in tortor. Duis vestibulum, nulla et bibendum volutpat, mauris metus facilisis elit, vel gravida tortor leo at enim. Vivamus pulvinar lorem vitae tortor. Morbi rhoncus suscipit urna. Praesent placerat tempus augue. Fusce varius dui a nisi consequat ultricies. Curabitur at nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.";
81 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 79 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
82 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 80 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
83 81
84 secretKey = "trustno1"; 82 secretKey = "trustno1";
85 plainString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed pede. Curabitur a mi id nisi euismod rutrum. Phasellus gravida. Ut luctus. Praesent quis leo sit amet orci imperdiet malesuada. Aenean molestie mauris euismod odio. Suspendisse ullamcorper facilisis nisl. Fusce vestibulum consectetuer risus. Curabitur ut turpis eget arcu facilisis ultricies. Morbi elementum, erat vitae dictum imperdiet, nisi purus rutrum odio, eget ornare ipsum nisl in tortor. Duis vestibulum, nulla et bibendum volutpat, mauris metus facilisis elit, vel gravida tortor leo at enim. Vivamus pulvinar lorem vitae tortor. Morbi rhoncus suscipit urna. Praesent placerat tempus augue. Fusce varius dui a nisi consequat ultricies. Curabitur at nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas./n/n/nMorbi vel leo non justo condimentum convallis. Vestibulum posuere aliquam nunc. Donec magna magna, euismod nec, pharetra fringilla, tristique mattis, turpis. Duis condimentum lacus eu felis. Sed ultricies. Nullam lacinia ante id diam. Ut quis enim. Fusce at felis quis neque vehicula tempor. Sed feugiat sodales sem. Duis cursus massa in ligula. Vestibulum volutpat, risus in ornare porta, tortor orci vestibulum felis, et eleifend risus odio nec eros. Integer lorem turpis, imperdiet eu, tempor eu, ultricies nec, est. Ut congue. Morbi lacinia vehicula pede. Cras neque sapien, feugiat ac, eleifend eget, mattis et, nisl. Morbi at augue vitae massa laoreet gravida./n/n/nSuspendisse vehicula convallis sem. Sed vel urna. Proin dolor diam, malesuada in, aliquet a, sagittis et, magna. Cras at dui eu mi porta fermentum. Donec pharetra purus sed velit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque euismod ornare neque. In odio nisi, bibendum non, vulputate ut, tincidunt a, ante. Sed risus arcu, tempus laoreet, euismod id, laoreet mollis, arcu. Ut tempor orci in nibh. Suspendisse potenti. Maecenas accumsan augue at nisl. Donec elementum diam nec metus. Sed vitae lacus sed libero varius semper. Aenean hendrerit tristique arcu. Praesent adipiscing ornare purus. Vestibulum quis eros nec risus accumsan laoreet. Duis consequat ante ut turpis. Curabitur aliquam suscipit ligula. Vivamus adipiscing./n/n/nCurabitur facilisis neque sit amet erat. Aliquam odio augue, vulputate lobortis, rutrum ut, tristique id, leo. Vivamus eu magna. Maecenas et libero. Integer porta, lorem at mollis ullamcorper, purus metus vestibulum erat, ut fringilla dui ante id mi. Morbi vitae ligula. Praesent ornare sapien sed massa. Mauris rhoncus fermentum dolor. Mauris gravida, justo et mollis malesuada, dolor erat fermentum nulla, vel suscipit leo ligula vel augue. Praesent magna enim, dignissim sed, aliquet quis, fermentum viverra, nisi. Vivamus condimentum, nisi quis posuere viverra, enim nunc faucibus lectus, mollis aliquam ipsum enim vel lacus. Suspendisse eget ligula. Aliquam ut metus et justo consectetuer ornare. Donec dapibus tristique pede. Vestibulum interdum ultricies tortor./n/n/nNunc nonummy dictum tortor. Quisque at elit a arcu nonummy elementum. Quisque auctor, risus et sodales euismod, turpis tellus consectetuer ante, quis egestas justo enim quis mi. Nunc fermentum sodales felis. Vivamus odio mi, dignissim vitae, auctor nec, tempus eget, lacus. Ut sapien massa, hendrerit eget, sagittis at, eleifend condimentum, arcu. Curabitur purus orci, facilisis vel, dapibus id, varius rutrum, tortor. Fusce accumsan viverra sem. Quisque tincidunt venenatis risus. Sed tortor justo, volutpat malesuada, sodales ut, vehicula id, magna. Nunc placerat, nibh et imperdiet ultricies, urna nulla luctus sapien, et porta mi odio ac neque. Morbi dignissim. Sed risus pede, adipiscing gravida, pharetra sit amet, convallis non, orci. Morbi adipiscing mauris id massa. Nullam fermentum. Suspendisse eget est"; 83 plainString = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed pede. Curabitur a mi id nisi euismod rutrum. Phasellus gravida. Ut luctus. Praesent quis leo sit amet orci imperdiet malesuada. Aenean molestie mauris euismod odio. Suspendisse ullamcorper facilisis nisl. Fusce vestibulum consectetuer risus. Curabitur ut turpis eget arcu facilisis ultricies. Morbi elementum, erat vitae dictum imperdiet, nisi purus rutrum odio, eget ornare ipsum nisl in tortor. Duis vestibulum, nulla et bibendum volutpat, mauris metus facilisis elit, vel gravida tortor leo at enim. Vivamus pulvinar lorem vitae tortor. Morbi rhoncus suscipit urna. Praesent placerat tempus augue. Fusce varius dui a nisi consequat ultricies. Curabitur at nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas./n/n/nMorbi vel leo non justo condimentum convallis. Vestibulum posuere aliquam nunc. Donec magna magna, euismod nec, pharetra fringilla, tristique mattis, turpis. Duis condimentum lacus eu felis. Sed ultricies. Nullam lacinia ante id diam. Ut quis enim. Fusce at felis quis neque vehicula tempor. Sed feugiat sodales sem. Duis cursus massa in ligula. Vestibulum volutpat, risus in ornare porta, tortor orci vestibulum felis, et eleifend risus odio nec eros. Integer lorem turpis, imperdiet eu, tempor eu, ultricies nec, est. Ut congue. Morbi lacinia vehicula pede. Cras neque sapien, feugiat ac, eleifend eget, mattis et, nisl. Morbi at augue vitae massa laoreet gravida./n/n/nSuspendisse vehicula convallis sem. Sed vel urna. Proin dolor diam, malesuada in, aliquet a, sagittis et, magna. Cras at dui eu mi porta fermentum. Donec pharetra purus sed velit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque euismod ornare neque. In odio nisi, bibendum non, vulputate ut, tincidunt a, ante. Sed risus arcu, tempus laoreet, euismod id, laoreet mollis, arcu. Ut tempor orci in nibh. Suspendisse potenti. Maecenas accumsan augue at nisl. Donec elementum diam nec metus. Sed vitae lacus sed libero varius semper. Aenean hendrerit tristique arcu. Praesent adipiscing ornare purus. Vestibulum quis eros nec risus accumsan laoreet. Duis consequat ante ut turpis. Curabitur aliquam suscipit ligula. Vivamus adipiscing./n/n/nCurabitur facilisis neque sit amet erat. Aliquam odio augue, vulputate lobortis, rutrum ut, tristique id, leo. Vivamus eu magna. Maecenas et libero. Integer porta, lorem at mollis ullamcorper, purus metus vestibulum erat, ut fringilla dui ante id mi. Morbi vitae ligula. Praesent ornare sapien sed massa. Mauris rhoncus fermentum dolor. Mauris gravida, justo et mollis malesuada, dolor erat fermentum nulla, vel suscipit leo ligula vel augue. Praesent magna enim, dignissim sed, aliquet quis, fermentum viverra, nisi. Vivamus condimentum, nisi quis posuere viverra, enim nunc faucibus lectus, mollis aliquam ipsum enim vel lacus. Suspendisse eget ligula. Aliquam ut metus et justo consectetuer ornare. Donec dapibus tristique pede. Vestibulum interdum ultricies tortor./n/n/nNunc nonummy dictum tortor. Quisque at elit a arcu nonummy elementum. Quisque auctor, risus et sodales euismod, turpis tellus consectetuer ante, quis egestas justo enim quis mi. Nunc fermentum sodales felis. Vivamus odio mi, dignissim vitae, auctor nec, tempus eget, lacus. Ut sapien massa, hendrerit eget, sagittis at, eleifend condimentum, arcu. Curabitur purus orci, facilisis vel, dapibus id, varius rutrum, tortor. Fusce accumsan viverra sem. Quisque tincidunt venenatis risus. Sed tortor justo, volutpat malesuada, sodales ut, vehicula id, magna. Nunc placerat, nibh et imperdiet ultricies, urna nulla luctus sapien, et porta mi odio ac neque. Morbi dignissim. Sed risus pede, adipiscing gravida, pharetra sit amet, convallis non, orci. Morbi adipiscing mauris id massa. Nullam fermentum. Suspendisse eget est";
86 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 84 encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
87 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 85 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
88 86
89 //secretKey = "trustno1"; 87 //secretKey = "trustno1";
90 //plainString = "{}"; 88 //plainString = "{}";
91 // plainString = "{'tags': {'personal': ['ref_1', 'ref_3'], 'business': ['ref_2', 'ref_3']}, 'records': {'ref_1': {'label': 'record_1', 'key': 'key_1'}, 'ref_2': {'label': 'record_2', 'key': 'key_2'}, 'ref_3': {'label': 'record_3', 'key': 'key_3'}}}"; 89 // plainString = "{'tags': {'personal': ['ref_1', 'ref_3'], 'business': ['ref_2', 'ref_3']}, 'records': {'ref_1': {'label': 'record_1', 'key': 'key_1'}, 'ref_2': {'label': 'record_2', 'key': 'key_2'}, 'ref_3': {'label': 'record_3', 'key': 'key_3'}}}";
92 //plainString = "{'tags': {}, 'records': {'07a5a92fcb334f757998ba14f3251f126d038318b3ac5e584bd712804c548084': {'label': 'Un bel record', 'key': '2a3f261c20a6a98dcc82b13fba013130b759f20602b4b13c5760879e087482a4'}}}"; 90 //plainString = "{'tags': {}, 'records': {'07a5a92fcb334f757998ba14f3251f126d038318b3ac5e584bd712804c548084': {'label': 'Un bel record', 'key': '2a3f261c20a6a98dcc82b13fba013130b759f20602b4b13c5760879e087482a4'}}}";
93 //encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString); 91 //encryptedString = Clipperz.Crypto.Base.encryptUsingSecretKey(secretKey, plainString);
94 //is(encryptedString, "{}", "encrypted value"); 92 //is(encryptedString, "{}", "encrypted value");
95 93
96 94
97 //secretKey = "trustno1"; 95 //secretKey = "trustno1";
98 //encryptedString = "0d43a4544424ffa519f2e43b7a46f703884fd94ff9879479563f6f252a573b253d3e77bc4f5f30f17bd11d2907718921ab8c9e1faccbe4314793fa323eb85eaf1bfbce5f7deea601e15b781782181cbff3c649dafef39abb70e8573e4f9be220f2286b01c3bd51d5c4a79b9d44a27be3b0994667302e301ca3dc074fb1bc7abc03d12b9e58ba0249435a120858c96e8ae99570718541499ab958a8fb92b63390be070ff61fc6ef107061693ab14c1915118cc6671ab7cf99b9cca553d6b5a7c314bffcd933e0a59f056d842a47cfe8571110b4764c5225443210d99b43b80a23c20fe953de3e1329d72cfb20139fe1ca"; 96 //encryptedString = "0d43a4544424ffa519f2e43b7a46f703884fd94ff9879479563f6f252a573b253d3e77bc4f5f30f17bd11d2907718921ab8c9e1faccbe4314793fa323eb85eaf1bfbce5f7deea601e15b781782181cbff3c649dafef39abb70e8573e4f9be220f2286b01c3bd51d5c4a79b9d44a27be3b0994667302e301ca3dc074fb1bc7abc03d12b9e58ba0249435a120858c96e8ae99570718541499ab958a8fb92b63390be070ff61fc6ef107061693ab14c1915118cc6671ab7cf99b9cca553d6b5a7c314bffcd933e0a59f056d842a47cfe8571110b4764c5225443210d99b43b80a23c20fe953de3e1329d72cfb20139fe1ca";
99 //plainString = Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString); 97 //plainString = Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString);
100 //is(plainString, "{}", "decrypted value"); 98 //is(plainString, "{}", "decrypted value");
101 99
102 //------------------------------------------------------------------------- 100 //-------------------------------------------------------------------------
103 // 101 //
104 //Java secret key encryption / JavaScript decryption 102 //Java secret key encryption / JavaScript decryption
105 // 103 //
106 secretKey = "s3cr37k39"; 104 secretKey = "s3cr37k39";
107 plainString = "The Quick Brown Fox Jumps Over The Lazy Dog"; 105 plainString = "The Quick Brown Fox Jumps Over The Lazy Dog";
108 encryptedString = "9be538c3dde4dfab9384c0ef71dc624299fbbe71be8d1fe8991fd6cae88a883cf459d7cd56913a2b69815782cf74d7ce5c2c08034661f7f8aa59cf420e913086896840ebb45102d44d733d32de2a7dc8"; 106 encryptedString = "9be538c3dde4dfab9384c0ef71dc624299fbbe71be8d1fe8991fd6cae88a883cf459d7cd56913a2b69815782cf74d7ce5c2c08034661f7f8aa59cf420e913086896840ebb45102d44d733d32de2a7dc8";
109 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely"); 107 is (plainString, Clipperz.Crypto.Base.decryptUsingSecretKey(secretKey, encryptedString), "I should be able to encrypt and then decrypt safely");
110 108
111 //------------------------------------------------------------------------- 109 //-------------------------------------------------------------------------
112 // 110 //
113 //Public key encryption -> Private key decryption 111 //Public key encryption -> Private key decryption
114 // 112 //
115 { 113 {
116 varcleanKey; 114 varcleanKey;
117 vart1, t2; 115 vart1, t2;
118/* 116/*
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html b/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html
index f4db3b7..f94618c 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 27 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 28 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
36 34
37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
40</head> 38</head>
41<body> 39<body>
42<pre id="test"> 40<pre id="test">
43<script type="text/javascript"> 41<script type="text/javascript">
44try { 42try {
45 varbigInt_1; 43 varbigInt_1;
46 varbigInt_2; 44 varbigInt_2;
47 varresult; 45 varresult;
48 varexpectedResult; 46 varexpectedResult;
49 47
50 // 48 //
51 //Constructur and equality test 49 //Constructur and equality test
52 // 50 //
53 bigInt_1 = new Clipperz.Crypto.BigInt("110"); 51 bigInt_1 = new Clipperz.Crypto.BigInt("110");
54 is (bigInt_1.equals(bigInt_1), true, ""); 52 is (bigInt_1.equals(bigInt_1), true, "");
55 53
56 bigInt_1 = new Clipperz.Crypto.BigInt("110"); 54 bigInt_1 = new Clipperz.Crypto.BigInt("110");
57 bigInt_2 = new Clipperz.Crypto.BigInt("110", 10); 55 bigInt_2 = new Clipperz.Crypto.BigInt("110", 10);
58 is (bigInt_1.equals(bigInt_2), true, ""); 56 is (bigInt_1.equals(bigInt_2), true, "");
59 57
60 bigInt_1 = new Clipperz.Crypto.BigInt("110"); 58 bigInt_1 = new Clipperz.Crypto.BigInt("110");
61 bigInt_2 = new Clipperz.Crypto.BigInt(110); 59 bigInt_2 = new Clipperz.Crypto.BigInt(110);
62 is (bigInt_1.equals(bigInt_2), true, ""); 60 is (bigInt_1.equals(bigInt_2), true, "");
63 61
64 bigInt_1 = new Clipperz.Crypto.BigInt(6); 62 bigInt_1 = new Clipperz.Crypto.BigInt(6);
65 bigInt_2 = new Clipperz.Crypto.BigInt("110", 2); 63 bigInt_2 = new Clipperz.Crypto.BigInt("110", 2);
66 is (bigInt_1.equals(bigInt_2), true, ""); 64 is (bigInt_1.equals(bigInt_2), true, "");
67 65
68 bigInt_1 = new Clipperz.Crypto.BigInt(6); 66 bigInt_1 = new Clipperz.Crypto.BigInt(6);
69 bigInt_2 = new Clipperz.Crypto.BigInt("110", 3); 67 bigInt_2 = new Clipperz.Crypto.BigInt("110", 3);
70 is (bigInt_1.equals(bigInt_2), false, ""); 68 is (bigInt_1.equals(bigInt_2), false, "");
71 69
72 70
73 // 71 //
74 //Addition test 72 //Addition test
75 // 73 //
76 bigInt_1 = new Clipperz.Crypto.BigInt(6); 74 bigInt_1 = new Clipperz.Crypto.BigInt(6);
77 bigInt_2 = new Clipperz.Crypto.BigInt(110); 75 bigInt_2 = new Clipperz.Crypto.BigInt(110);
78 result = bigInt_1.add(bigInt_2); 76 result = bigInt_1.add(bigInt_2);
79 expectedResult = new Clipperz.Crypto.BigInt(116); 77 expectedResult = new Clipperz.Crypto.BigInt(116);
80 is (result.equals(expectedResult), true, ""); 78 is (result.equals(expectedResult), true, "");
81 is (result.equals(Clipperz.Crypto.BigInt.add(bigInt_1, bigInt_2)), true, "instance method === static function"); 79 is (result.equals(Clipperz.Crypto.BigInt.add(bigInt_1, bigInt_2)), true, "instance method === static function");
82 80
83 bigInt_1 = new Clipperz.Crypto.BigInt(6); 81 bigInt_1 = new Clipperz.Crypto.BigInt(6);
84 result = bigInt_1.add(6); 82 result = bigInt_1.add(6);
85 expectedResult = new Clipperz.Crypto.BigInt(12); 83 expectedResult = new Clipperz.Crypto.BigInt(12);
86 is (result.equals(expectedResult), true, ""); 84 is (result.equals(expectedResult), true, "");
87 85
88 bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161"); 86 bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161");
89 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424"); 87 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424");
90 result = bigInt_1.add(bigInt_2); 88 result = bigInt_1.add(bigInt_2);
91 expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585858585858585858585858585858585"); 89 expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585858585858585858585858585858585");
92 is (result.equals(expectedResult), true, ""); 90 is (result.equals(expectedResult), true, "");
93 91
94 bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161"); 92 bigInt_1 = new Clipperz.Crypto.BigInt("16161616161616161616161616161616161616161616161616161");
95 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424"); 93 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424");
96 result = bigInt_1.add(bigInt_2); 94 result = bigInt_1.add(bigInt_2);
97 expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585851585858585858585858585858585"); 95 expectedResult = new Clipperz.Crypto.BigInt("58585858585858585858585851585858585858585858585858585");
98 is (result.equals(expectedResult), false, ""); 96 is (result.equals(expectedResult), false, "");
99 97
100 bigInt_1 = new Clipperz.Crypto.BigInt("86161616161616161616161616161616161616161616161616161"); 98 bigInt_1 = new Clipperz.Crypto.BigInt("86161616161616161616161616161616161616161616161616161");
101 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424"); 99 bigInt_2 = new Clipperz.Crypto.BigInt("42424242424242424242424242424242424242424242424242424");
102 result = bigInt_1.add(bigInt_2); 100 result = bigInt_1.add(bigInt_2);
103 expectedResult = new Clipperz.Crypto.BigInt("128585858585858585858585858585858585858585858585858585"); 101 expectedResult = new Clipperz.Crypto.BigInt("128585858585858585858585858585858585858585858585858585");
104 is (result.equals(expectedResult), true, ""); 102 is (result.equals(expectedResult), true, "");
105 103
106 bigInt_1 = new Clipperz.Crypto.BigInt("6541652165410321654063516540621063540654" + 104 bigInt_1 = new Clipperz.Crypto.BigInt("6541652165410321654063516540621063540654" +
107 "0654065106540654165416521654103216540635" + 105 "0654065106540654165416521654103216540635" +
108 "1654062106354065406540651065406541"); 106 "1654062106354065406540651065406541");
109 bigInt_2 = new Clipperz.Crypto.BigInt("3046540351035403510354035103510351351351" + 107 bigInt_2 = new Clipperz.Crypto.BigInt("3046540351035403510354035103510351351351" +
110 "0351350435103213540634132135401351035403" + 108 "0351350435103213540634132135401351035403" +
111 "5403540354103540"); 109 "5403540354103540");
112 result = bigInt_1.add(bigInt_2); 110 result = bigInt_1.add(bigInt_2);
113 expectedResult = new Clipperz.Crypto.BigInt("6541652165410321657110056891656467051008" + 111 expectedResult = new Clipperz.Crypto.BigInt("6541652165410321657110056891656467051008" +
114 "1005100210054167675767872089206430081269" + 112 "1005100210054167675767872089206430081269" +
115 "2975416119864419441944191419510081"); 113 "2975416119864419441944191419510081");
116 is (result.equals(expectedResult), true, ""); 114 is (result.equals(expectedResult), true, "");
117 115
118 116
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html
index 9ef9146..6e3f871 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28<!-- - -> 26<!-- - ->
29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
30<!- - --> 28<!- - -->
31<!-- --> 29<!-- -->
32 <script type="text/javascript" src="../../../../js/MochiKit/Base.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/Base.js"></script>
33 <script type="text/javascript" src="../../../../js/MochiKit/Async.js"></script> 31 <script type="text/javascript" src="../../../../js/MochiKit/Async.js"></script>
34 <script type="text/javascript" src="../../../../js/MochiKit/DOM.js"></script> 32 <script type="text/javascript" src="../../../../js/MochiKit/DOM.js"></script>
35 <script type="text/javascript" src="../../../../js/MochiKit/Logging.js"></script> 33 <script type="text/javascript" src="../../../../js/MochiKit/Logging.js"></script>
36 <script type="text/javascript" src="../../../../js/MochiKit/Iter.js"></script> 34 <script type="text/javascript" src="../../../../js/MochiKit/Iter.js"></script>
37<!-- --> 35<!-- -->
38 36
39<!-- - -> 37<!-- - ->
40 <script type="text/javascript" src="../../../../js/MochiKit/Style.js"></script> 38 <script type="text/javascript" src="../../../../js/MochiKit/Style.js"></script>
41 <script type="text/javascript" src="../../../../js/MochiKit/Signal.js"></script> 39 <script type="text/javascript" src="../../../../js/MochiKit/Signal.js"></script>
42 <script type="text/javascript" src="../../../../js/MochiKit/Color.js"></script> 40 <script type="text/javascript" src="../../../../js/MochiKit/Color.js"></script>
43 <script type="text/javascript" src="../../../../js/MochiKit/Position.js"></script> 41 <script type="text/javascript" src="../../../../js/MochiKit/Position.js"></script>
44 <script type="text/javascript" src="../../../../js/MochiKit/Visual.js"></script> 42 <script type="text/javascript" src="../../../../js/MochiKit/Visual.js"></script>
45<!- - --> 43<!- - -->
46 44
47 45
48 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 46 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
49 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 47 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
50 48
51<!--<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>--> 49<!--<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>-->
52<!--<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>--> 50<!--<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>-->
53<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>--> 51<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>-->
54 52
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
59 57
60 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/StandardCurves.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/StandardCurves.js'></script>
61 59
62</head> 60</head>
63<body> 61<body>
64<pre id="test"> 62<pre id="test">
65<script type="text/javascript"> 63<script type="text/javascript">
66try { 64try {
67 65
68 var deferredResult; 66 var deferredResult;
69 67
70 68
71 deferredResult = new MochiKit.Async.Deferred(); 69 deferredResult = new MochiKit.Async.Deferred();
72//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 1: " + res); return res;}); 70//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 1: " + res); return res;});
73 71
74 // 72 //
75 //ECC.Curve.multiplication 73 //ECC.Curve.multiplication
76 // 74 //
77 varcurve; 75 varcurve;
78 var f2m; 76 var f2m;
79 var f2m_improved; 77 var f2m_improved;
80 var value; 78 var value;
81 var moduledValue; 79 var moduledValue;
82 var result; 80 var result;
83 var result_improved; 81 var result_improved;
84 var expectedResul; 82 var expectedResul;
85 83
86 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)}) 84 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)})
87 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField(); 85 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField();
88 86
89 curve = Clipperz.Crypto.ECC.StandardCurves.B283(); 87 curve = Clipperz.Crypto.ECC.StandardCurves.B283();
90 88
91/** / 89/** /
92 value = new Clipperz.Crypto.ECC.BinaryField.Value("7b", 16); 90 value = new Clipperz.Crypto.ECC.BinaryField.Value("7b", 16);
93 result = curve.multiply(value, curve.G()); 91 result = curve.multiply(value, curve.G());
94 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Point({ 92 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Point({
95 x: new Clipperz.Crypto.ECC.BinaryField.Value('29705d23a9cda75e43984bdb9a8fd33304682da0f506a69bdbd5f36657e11b41e35fcdd', 16), 93 x: new Clipperz.Crypto.ECC.BinaryField.Value('29705d23a9cda75e43984bdb9a8fd33304682da0f506a69bdbd5f36657e11b41e35fcdd', 16),
96 y: new Clipperz.Crypto.ECC.BinaryField.Value('59157d2ace16563a905361c5206cc0775c3330f4978bddf8aa9916c451cf9951313623b', 16) 94 y: new Clipperz.Crypto.ECC.BinaryField.Value('59157d2ace16563a905361c5206cc0775c3330f4978bddf8aa9916c451cf9951313623b', 16)
97 }); 95 });
98 is(result.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match"); 96 is(result.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match");
99 is(result.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match"); 97 is(result.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match");
100/ **/ 98/ **/
101 99
102 value = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16); 100 value = new Clipperz.Crypto.ECC.BinaryField.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16);
103 101
104//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 6: " + res); return res;}); 102//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 6: " + res); return res;});
105 //deferredResult.addCallback(console.time, 'B283.deferred.multiply - moduled value'); 103 //deferredResult.addCallback(console.time, 'B283.deferred.multiply - moduled value');
106//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("2 - " + res); return res;}); 104//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("2 - " + res); return res;});
107//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 7: " + res); return res;}); 105//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 7: " + res); return res;});
108 deferredResult.addMethod(curve, 'deferredMultiply', value, curve.G()); 106 deferredResult.addMethod(curve, 'deferredMultiply', value, curve.G());
109//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("3 - " + res); return res;}); 107//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("3 - " + res); return res;});
110//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 8: " + res); return res;}); 108//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 8: " + res); return res;});
111 //deferredResult.addBoth(function(res) {console.timeEnd('B283.deferred.multiply - moduled value'); return res;}); 109 //deferredResult.addBoth(function(res) {console.timeEnd('B283.deferred.multiply - moduled value'); return res;});
112//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("4 - " + res); return res;}); 110//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("4 - " + res); return res;});
113//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 9: " + res); return res;}); 111//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 9: " + res); return res;});
114 deferredResult.addCallback(function(res) { 112 deferredResult.addCallback(function(res) {
115 var expectedResult; 113 var expectedResult;
116 114
117 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Point({ 115 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Point({
118 x: new Clipperz.Crypto.ECC.BinaryField.Value('7cf07c0880d1ae59f567a2ce420e78d1fdfc1249df694a60e5d40d23c6dc631e1501b77', 16), 116 x: new Clipperz.Crypto.ECC.BinaryField.Value('7cf07c0880d1ae59f567a2ce420e78d1fdfc1249df694a60e5d40d23c6dc631e1501b77', 16),
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html
index 93d8695..f87bdbe 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 27 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 28 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
34 32
35 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
37<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>--> 35<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>-->
38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
43</head> 41</head>
44<body> 42<body>
45<pre id="test"> 43<pre id="test">
46<script type="text/javascript"> 44<script type="text/javascript">
47try { 45try {
48 // 46 //
49 //ECC.BinaryFiniteField 47 //ECC.BinaryFiniteField
50 // 48 //
51 varf2m; 49 varf2m;
52 varf2m_improved; 50 varf2m_improved;
53 var a, a1, b; 51 var a, a1, b;
54 var result; 52 var result;
55 var result_improved; 53 var result_improved;
56 var expectedResul; 54 var expectedResul;
57 55
58 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)}) 56 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)})
59 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField(); 57 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B283().finiteField();
60 a = new Clipperz.Crypto.ECC.BinaryField.Value("05c91e41 d9ca17ef 9d8a33c1 a44eba6d 368fde02 1c492077 1a46eb01 a481e5f7 f430749d", 16); 58 a = new Clipperz.Crypto.ECC.BinaryField.Value("05c91e41 d9ca17ef 9d8a33c1 a44eba6d 368fde02 1c492077 1a46eb01 a481e5f7 f430749d", 16);
61 b = new Clipperz.Crypto.ECC.BinaryField.Value("07377071 2de7d57b a803f65f 45786c06 876b8066 db75ec47 81c053b0 a0f78e2c a6ab5187", 16); 59 b = new Clipperz.Crypto.ECC.BinaryField.Value("07377071 2de7d57b a803f65f 45786c06 876b8066 db75ec47 81c053b0 a0f78e2c a6ab5187", 16);
62 60
63 // 61 //
64 //addition 62 //addition
65 // 63 //
66 result = f2m.add(a, b); 64 result = f2m.add(a, b);
67 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16); 65 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16);
68 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add"); 66 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add");
69 67
70 68
71 // 69 //
72 //negation 70 //negation
73 // 71 //
74 result = f2m.negate(a); 72 result = f2m.negate(a);
75 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16); 73 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16);
76 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate"); 74 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate");
77 75
78 76
79 // 77 //
80 //multiplication 78 //multiplication
81 // 79 //
82 result = f2m.multiply(a, b); 80 result = f2m.multiply(a, b);
83 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2bacb89668741f6d1f7fd7d3df2f045814086adba11d8bb5f12f3f9851e3b66fbe283cb", 16); 81 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("2bacb89668741f6d1f7fd7d3df2f045814086adba11d8bb5f12f3f9851e3b66fbe283cb", 16);
84 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply"); 82 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply");
85 83
86 84
87 // 85 //
88 //fast multiplication 86 //fast multiplication
89 // 87 //
90 result = f2m.fastMultiply(a, b); 88 result = f2m.fastMultiply(a, b);
91 expectedResult = f2m.multiply(a, b); 89 expectedResult = f2m.multiply(a, b);
92 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply"); 90 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply");
93 91
94 a = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16); 92 a = new Clipperz.Crypto.ECC.BinaryField.Value("2fe6e30f42dc2943589c59ee136d66bb1e45e64c73ccc309b86b8b104766bdb529b251a", 16);
95 b = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16); 93 b = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16);
96 result = f2m.fastMultiply(a, b); 94 result = f2m.fastMultiply(a, b);
97 expectedResult = f2m.multiply(a, b); 95 expectedResult = f2m.multiply(a, b);
98 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.B283.fastMultiply"); 96 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.B283.fastMultiply");
99 97
100 // 98 //
101 //square 99 //square
102 // 100 //
103 a = new Clipperz.Crypto.ECC.BinaryField.Value("1111", 16); 101 a = new Clipperz.Crypto.ECC.BinaryField.Value("1111", 16);
104 result = f2m.square(a); 102 result = f2m.square(a);
105 expectedResult = f2m.multiply(a, a); 103 expectedResult = f2m.multiply(a, a);
106 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); 104 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
107 105
108 a = new Clipperz.Crypto.ECC.BinaryField.Value("11111111", 16); 106 a = new Clipperz.Crypto.ECC.BinaryField.Value("11111111", 16);
109 result = f2m.square(a); 107 result = f2m.square(a);
110 expectedResult = f2m.multiply(a, a); 108 expectedResult = f2m.multiply(a, a);
111 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); 109 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
112 110
113 a = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16); 111 a = new Clipperz.Crypto.ECC.BinaryField.Value("5c91e41d9ca17ef9d8a33c1a44eba6d368fde021c4920771a46eb01a481e5f7f430749d", 16);
114 result = f2m.square(a); 112 result = f2m.square(a);
115 expectedResult = f2m.multiply(a, a); 113 expectedResult = f2m.multiply(a, a);
116 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); 114 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
117 115
118 116
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html
index 658c402..5feb7df 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 27 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 28 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
34 32
35 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
37<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>--> 35<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>-->
38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
43</head> 41</head>
44<body> 42<body>
45<pre id="test"> 43<pre id="test">
46<script type="text/javascript"> 44<script type="text/javascript">
47try { 45try {
48 // 46 //
49 //ECC.BinaryFiniteField 47 //ECC.BinaryFiniteField
50 // 48 //
51 varf2m; 49 varf2m;
52 varf2m_improved; 50 varf2m_improved;
53 var a, b; 51 var a, b;
54 var result; 52 var result;
55 var result_improved; 53 var result_improved;
56 var expectedResul; 54 var expectedResul;
57 55
58 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16)}) 56 f2m = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16)})
59 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B571().finiteField(); 57 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.B571().finiteField();
60 a = new Clipperz.Crypto.ECC.BinaryField.Value("01401ca8 7b8f1446 84a2c58a e9308c23 7789e4bf 1f36dd11 7c150b7d 6076dd1d a6197fe4 c5225a06 4db0e422 2589d5ca 50eb6bb6 b7147a03 f6152843 8a8767c6 a6c4a688 3fd6f067", 16); 58 a = new Clipperz.Crypto.ECC.BinaryField.Value("01401ca8 7b8f1446 84a2c58a e9308c23 7789e4bf 1f36dd11 7c150b7d 6076dd1d a6197fe4 c5225a06 4db0e422 2589d5ca 50eb6bb6 b7147a03 f6152843 8a8767c6 a6c4a688 3fd6f067", 16);
61 b = new Clipperz.Crypto.ECC.BinaryField.Value("0112f5c9 7e74737b 38925faf e22cea3e 12b868d4 ddea5b33 41db8fc2 e788cab7 4f0a7a3c c27087a8 93659453 69938650 a99217d5 66e13f80 dc87f082 73f7411b 6b01ef1d 399c772a", 16); 59 b = new Clipperz.Crypto.ECC.BinaryField.Value("0112f5c9 7e74737b 38925faf e22cea3e 12b868d4 ddea5b33 41db8fc2 e788cab7 4f0a7a3c c27087a8 93659453 69938650 a99217d5 66e13f80 dc87f082 73f7411b 6b01ef1d 399c772a", 16);
62 60
63 // 61 //
64 //addition 62 //addition
65 // 63 //
66 result = f2m.add(a, b); 64 result = f2m.add(a, b);
67 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16); 65 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16);
68 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add"); 66 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.add");
69 67
70 68
71 // 69 //
72 //negation 70 //negation
73 // 71 //
74 result = f2m.negate(a); 72 result = f2m.negate(a);
75 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); 73 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
76 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate"); 74 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.negate");
77 75
78 76
79 // 77 //
80 //multiplication 78 //multiplication
81 // 79 //
82 result = f2m.multiply(a, b); 80 result = f2m.multiply(a, b);
83 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("4f8e4c0ae7664b284d3b4cb1b3f9568a1ce6e6e96b5381e184fe0822cb3d5c3a3f01ffd0206355d9e5c4853472bb33cf6b2d861d6b48c39d33a360e9a63ad2f7102f92e68a12312", 16); 81 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value("4f8e4c0ae7664b284d3b4cb1b3f9568a1ce6e6e96b5381e184fe0822cb3d5c3a3f01ffd0206355d9e5c4853472bb33cf6b2d861d6b48c39d33a360e9a63ad2f7102f92e68a12312", 16);
84 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply"); 82 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.multiply");
85 83
86 84
87 // 85 //
88 //fast multiplication 86 //fast multiplication
89 // 87 //
90 result = f2m.fastMultiply(a, b); 88 result = f2m.fastMultiply(a, b);
91 expectedResult = f2m.multiply(a, b); 89 expectedResult = f2m.multiply(a, b);
92 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply"); 90 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply");
93 91
94 a = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16); 92 a = new Clipperz.Crypto.ECC.BinaryField.Value("52e96105fb673dbc309a250b1c661d65318c6bc2dc86223dce84bf87fe17aae91305d80752ddaeded570714c1a539af9797c63d1f545832a92d8c1f97026ddcdc54995064a874d", 16);
95 b = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); 93 b = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
96 result = f2m.fastMultiply(a, b); 94 result = f2m.fastMultiply(a, b);
97 expectedResult = f2m.multiply(a, b); 95 expectedResult = f2m.multiply(a, b);
98 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply"); 96 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.fastMultiply");
99 97
100 // 98 //
101 //square 99 //square
102 // 100 //
103 a = new Clipperz.Crypto.ECC.BinaryField.Value("1111", 16); 101 a = new Clipperz.Crypto.ECC.BinaryField.Value("1111", 16);
104 result = f2m.square(a); 102 result = f2m.square(a);
105 expectedResult = f2m.multiply(a, a); 103 expectedResult = f2m.multiply(a, a);
106 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); 104 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
107 105
108 a = new Clipperz.Crypto.ECC.BinaryField.Value("11111111", 16); 106 a = new Clipperz.Crypto.ECC.BinaryField.Value("11111111", 16);
109 result = f2m.square(a); 107 result = f2m.square(a);
110 expectedResult = f2m.multiply(a, a); 108 expectedResult = f2m.multiply(a, a);
111 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); 109 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
112 110
113 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16); 111 a = new Clipperz.Crypto.ECC.BinaryField.Value("1401ca87b8f144684a2c58ae9308c237789e4bf1f36dd117c150b7d6076dd1da6197fe4c5225a064db0e4222589d5ca50eb6bb6b7147a03f61528438a8767c6a6c4a6883fd6f067", 16);
114 result = f2m.square(a); 112 result = f2m.square(a);
115 expectedResult = f2m.multiply(a, a); 113 expectedResult = f2m.multiply(a, a);
116 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square"); 114 is(result.asString(16), expectedResult.asString(16), "ECC.BinaryFinetField.square");
117 115
118 116
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html
index 0d0903d..8da2b6d 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 27 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 28 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
34 32
35 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
37<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>--> 35<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC.js'></script>-->
38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Functions.js'></script>
43</head> 41</head>
44<body> 42<body>
45<pre id="test"> 43<pre id="test">
46<script type="text/javascript"> 44<script type="text/javascript">
47try { 45try {
48 var value_1; 46 var value_1;
49 var value_2; 47 var value_2;
50 48
51 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("a", 16); 49 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("a", 16);
52 is(value_1.asString(16), "0a"); 50 is(value_1.asString(16), "0a");
53 51
54 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ffff", 16); 52 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("ffff", 16);
55 is(value_1.asString(16), "ffff"); 53 is(value_1.asString(16), "ffff");
56 54
57 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("7fff", 16); 55 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("7fff", 16);
58 is(value_1.asString(16), "7fff"); 56 is(value_1.asString(16), "7fff");
59 57
60 is(parseInt("ffff", 16), 65535); 58 is(parseInt("ffff", 16), 65535);
61 is(parseInt("ffffff", 16), 16777215); 59 is(parseInt("ffffff", 16), 16777215);
62 is(parseInt("ffffffff", 16), 4294967295); 60 is(parseInt("ffffffff", 16), 4294967295);
63 is(parseInt("ffffffffff", 16), 1099511627775); 61 is(parseInt("ffffffffff", 16), 1099511627775);
64 is(parseInt("ffffffffffff", 16), 281474976710655); 62 is(parseInt("ffffffffffff", 16), 281474976710655);
65 is(parseInt("ffffffffffffff", 16), 72057594037927940); 63 is(parseInt("ffffffffffffff", 16), 72057594037927940);
66 is(parseInt("ffffffffffffffff", 16), 18446744073709552000); 64 is(parseInt("ffffffffffffffff", 16), 18446744073709552000);
67 is(parseInt("10000000000000000", 16), 18446744073709552001); 65 is(parseInt("10000000000000000", 16), 18446744073709552001);
68 is(parseInt("10000000000000001", 16), 18446744073709552002); 66 is(parseInt("10000000000000001", 16), 18446744073709552002);
69 is(parseInt("10000000000000009", 16), 18446744073709552010); 67 is(parseInt("10000000000000009", 16), 18446744073709552010);
70 68
71 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16); 69 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", 16);
72 is(value_1.wordSize(), 8, "check the number of words of a 64 char hex string using the 'wordSize' method"); 70 is(value_1.wordSize(), 8, "check the number of words of a 64 char hex string using the 'wordSize' method");
73 71
74 // 000108cb bacda1f0 3ea93603 01045434 ec7d82ba 150936df 08a229cb b4832ce1 72 // 000108cb bacda1f0 3ea93603 01045434 ec7d82ba 150936df 08a229cb b4832ce1
75 is(value_1.value()[0], parseInt("b4832ce1", 16), "word[0]"); 73 is(value_1.value()[0], parseInt("b4832ce1", 16), "word[0]");
76 is(value_1.value()[1], parseInt("08a229cb", 16), "word[1]"); 74 is(value_1.value()[1], parseInt("08a229cb", 16), "word[1]");
77 is(value_1.value()[2], parseInt("150936df", 16), "word[2]"); 75 is(value_1.value()[2], parseInt("150936df", 16), "word[2]");
78 is(value_1.value()[3], parseInt("ec7d82ba", 16), "word[3]"); 76 is(value_1.value()[3], parseInt("ec7d82ba", 16), "word[3]");
79 is(value_1.value()[4], parseInt("01045434", 16), "word[4]"); 77 is(value_1.value()[4], parseInt("01045434", 16), "word[4]");
80 is(value_1.value()[5], parseInt("3ea93603", 16), "word[5]"); 78 is(value_1.value()[5], parseInt("3ea93603", 16), "word[5]");
81 is(value_1.value()[6], parseInt("bacda1f0", 16), "word[6]"); 79 is(value_1.value()[6], parseInt("bacda1f0", 16), "word[6]");
82 is(value_1.value()[7], parseInt("000108cb", 16), "word[7]"); 80 is(value_1.value()[7], parseInt("000108cb", 16), "word[7]");
83 81
84 is(value_1.asString(16), "0108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", "asString(16)"); 82 is(value_1.asString(16), "0108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1", "asString(16)");
85 83
86 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16); 84 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16);
87 is(value_1.wordSize(), 3, "check the number of words of a value with only a bit set on the first slot of byte at position 17"); 85 is(value_1.wordSize(), 3, "check the number of words of a value with only a bit set on the first slot of byte at position 17");
88 is(value_1.value()[0], parseInt("00000000", 16), "word[0]"); 86 is(value_1.value()[0], parseInt("00000000", 16), "word[0]");
89 is(value_1.value()[1], parseInt("00000000", 16), "word[1]"); 87 is(value_1.value()[1], parseInt("00000000", 16), "word[1]");
90 is(value_1.value()[2], parseInt("10", 16), "word[2]"); 88 is(value_1.value()[2], parseInt("10", 16), "word[2]");
91 is(value_1.asString(16), "100000000000000000", "2^17 asString(16)"); 89 is(value_1.asString(16), "100000000000000000", "2^17 asString(16)");
92 90
93 // 91 //
94 //XOR 92 //XOR
95 // 93 //
96 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16); 94 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16);
97 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16); 95 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16);
98 result = value_1.xor(value_2); 96 result = value_1.xor(value_2);
99 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16); 97 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16);
100 is(result.asString(16), expectedResult.asString(16), "a xor a = 0"); 98 is(result.asString(16), expectedResult.asString(16), "a xor a = 0");
101 99
102 // 100 //
103 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855', 16); 101 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855', 16);
104 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b935c a495991b 7852b855', 16); 102 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b935c a495991b 7852b855', 16);
105 result = value_1.xor(value_2); 103 result = value_1.xor(value_2);
106 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16); 104 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('10 00000000 00000000', 16);
107 is(result.asString(16), expectedResult.asString(16), "single bit difference"); 105 is(result.asString(16), expectedResult.asString(16), "single bit difference");
108 106
109 // 107 //
110 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("01", 16); 108 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value("01", 16);
111 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855', 16); 109 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b855', 16);
112 result = value_1.xor(value_2); 110 result = value_1.xor(value_2);
113 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b854', 16); 111 expectedResult = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b935ca495991b7852b854', 16);
114 is(result.asString(16), expectedResult.asString(16), "01 xor value"); 112 is(result.asString(16), expectedResult.asString(16), "01 xor value");
115 113
116 // 114 //
117 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16); 115 value_1 = new Clipperz.Crypto.ECC.BinaryField.Value('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16);
118 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16); 116 value_2 = new Clipperz.Crypto.ECC.BinaryField.Value('f3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 16);
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html
index b784f66..ab0fc5c 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28<!-- - -> 26<!-- - ->
29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
30<!- - --> 28<!- - -->
31<!-- --> 29<!-- -->
32 <script type="text/javascript" src="../../../../js/MochiKit/Base.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/Base.js"></script>
33 <script type="text/javascript" src="../../../../js/MochiKit/Async.js"></script> 31 <script type="text/javascript" src="../../../../js/MochiKit/Async.js"></script>
34 <script type="text/javascript" src="../../../../js/MochiKit/DOM.js"></script> 32 <script type="text/javascript" src="../../../../js/MochiKit/DOM.js"></script>
35 <script type="text/javascript" src="../../../../js/MochiKit/Logging.js"></script> 33 <script type="text/javascript" src="../../../../js/MochiKit/Logging.js"></script>
36 <script type="text/javascript" src="../../../../js/MochiKit/Iter.js"></script> 34 <script type="text/javascript" src="../../../../js/MochiKit/Iter.js"></script>
37<!-- --> 35<!-- -->
38 36
39<!-- - -> 37<!-- - ->
40 <script type="text/javascript" src="../../../../js/MochiKit/Style.js"></script> 38 <script type="text/javascript" src="../../../../js/MochiKit/Style.js"></script>
41 <script type="text/javascript" src="../../../../js/MochiKit/Signal.js"></script> 39 <script type="text/javascript" src="../../../../js/MochiKit/Signal.js"></script>
42 <script type="text/javascript" src="../../../../js/MochiKit/Color.js"></script> 40 <script type="text/javascript" src="../../../../js/MochiKit/Color.js"></script>
43 <script type="text/javascript" src="../../../../js/MochiKit/Position.js"></script> 41 <script type="text/javascript" src="../../../../js/MochiKit/Position.js"></script>
44 <script type="text/javascript" src="../../../../js/MochiKit/Visual.js"></script> 42 <script type="text/javascript" src="../../../../js/MochiKit/Visual.js"></script>
45<!- - --> 43<!- - -->
46 44
47 45
48 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 46 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
49 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 47 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
50 48
51<!--<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>--> 49<!--<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>-->
52<!--<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>--> 50<!--<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>-->
53<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>--> 51<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>-->
54 52
55<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>--> 53<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Value.js'></script>-->
56<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>--> 54<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Point.js'></script>-->
57<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>--> 55<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js'></script>-->
58<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>--> 56<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/BinaryField/Curve.js'></script>-->
59 57
60 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Value.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Value.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Point.js'></script> 59 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Point.js'></script>
62 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/FiniteField.js'></script> 60 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/FiniteField.js'></script>
63 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Curve.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/Koblitz/Curve.js'></script>
64 62
65 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/StandardCurves.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/ECC/StandardCurves.js'></script>
66 64
67</head> 65</head>
68<body> 66<body>
69<pre id="test"> 67<pre id="test">
70<script type="text/javascript"> 68<script type="text/javascript">
71try { 69try {
72 70
73 var deferredResult; 71 var deferredResult;
74 72
75 73
76 deferredResult = new MochiKit.Async.Deferred(); 74 deferredResult = new MochiKit.Async.Deferred();
77//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 1: " + res); return res;}); 75//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 1: " + res); return res;});
78 76
79 // 77 //
80 //ECC.Curve.multiplication 78 //ECC.Curve.multiplication
81 // 79 //
82 varcurve; 80 varcurve;
83 var f2m; 81 var f2m;
84 var f2m_improved; 82 var f2m_improved;
85 var value; 83 var value;
86 var moduledValue; 84 var moduledValue;
87 var result; 85 var result;
88 var result_improved; 86 var result_improved;
89 var expectedResul; 87 var expectedResul;
90 88
91 f2m = new Clipperz.Crypto.ECC.Koblitz.FiniteField({modulus:new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)}) 89 f2m = new Clipperz.Crypto.ECC.Koblitz.FiniteField({modulus:new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16)})
92 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.K283().finiteField(); 90 f2m_improved = Clipperz.Crypto.ECC.StandardCurves.K283().finiteField();
93 91
94 curve = Clipperz.Crypto.ECC.StandardCurves.K283(); 92 curve = Clipperz.Crypto.ECC.StandardCurves.K283();
95 93
96/** / 94/** /
97 value = new Clipperz.Crypto.ECC.Koblitz.Value("7b", 16); 95 value = new Clipperz.Crypto.ECC.Koblitz.Value("7b", 16);
98 result = curve.multiply(value, curve.G()); 96 result = curve.multiply(value, curve.G());
99 expectedResult = new Clipperz.Crypto.ECC.Koblitz.Point({ 97 expectedResult = new Clipperz.Crypto.ECC.Koblitz.Point({
100 x: new Clipperz.Crypto.ECC.Koblitz.Value('29705d23a9cda75e43984bdb9a8fd33304682da0f506a69bdbd5f36657e11b41e35fcdd', 16), 98 x: new Clipperz.Crypto.ECC.Koblitz.Value('29705d23a9cda75e43984bdb9a8fd33304682da0f506a69bdbd5f36657e11b41e35fcdd', 16),
101 y: new Clipperz.Crypto.ECC.Koblitz.Value('59157d2ace16563a905361c5206cc0775c3330f4978bddf8aa9916c451cf9951313623b', 16) 99 y: new Clipperz.Crypto.ECC.Koblitz.Value('59157d2ace16563a905361c5206cc0775c3330f4978bddf8aa9916c451cf9951313623b', 16)
102 }); 100 });
103 is(result.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match"); 101 is(result.x().asString(16), expectedResult.x().asString(16), "ECC.Curve.multiplication: result.x does match");
104 is(result.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match"); 102 is(result.y().asString(16), expectedResult.y().asString(16), "ECC.Curve.multiplication: result.y does match");
105/ **/ 103/ **/
106 104
107 value = new Clipperz.Crypto.ECC.Koblitz.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16); 105 value = new Clipperz.Crypto.ECC.Koblitz.Value("ba35032a24eb81238251d85824998bebae3b3e09f4d3845256c87585cf62416ee43191", 16);
108 106
109//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 6: " + res); return res;}); 107//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 6: " + res); return res;});
110 //deferredResult.addCallback(console.time, 'K283.deferred.multiply - moduled value'); 108 //deferredResult.addCallback(console.time, 'K283.deferred.multiply - moduled value');
111//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("2 - " + res); return res;}); 109//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("2 - " + res); return res;});
112//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 7: " + res); return res;}); 110//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 7: " + res); return res;});
113 deferredResult.addMethod(curve, 'deferredMultiply', value, curve.G()); 111 deferredResult.addMethod(curve, 'deferredMultiply', value, curve.G());
114//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("3 - " + res); return res;}); 112//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("3 - " + res); return res;});
115//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 8: " + res); return res;}); 113//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 8: " + res); return res;});
116 //deferredResult.addBoth(function(res) {console.timeEnd('K283.deferred.multiply - moduled value'); return res;}); 114 //deferredResult.addBoth(function(res) {console.timeEnd('K283.deferred.multiply - moduled value'); return res;});
117//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("4 - " + res); return res;}); 115//deferredResult.addBoth(function(res) {MochiKit.Base.logDebug("4 - " + res); return res;});
118//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 9: " + res); return res;}); 116//deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("** 9: " + res); return res;});
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html
index 2968894..95f21a3 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html
@@ -1,67 +1,65 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.Crypto.JSCrypto_vs_Clipperz - tests</title> 26 <title>Clipperz.Crypto.JSCrypto_vs_Clipperz - tests</title>
29 27
30 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 28 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
31 29
32 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
33 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
34 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
35 33
36 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
37 35
38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
50 48
51 <script type='text/javascript' src='./jscrypto.js'></script> 49 <script type='text/javascript' src='./jscrypto.js'></script>
52 50
53 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 51 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
54 52
55</head> 53</head>
56<body> 54<body>
57 55
58<pre id="test"> 56<pre id="test">
59 <script type="text/javascript"> 57 <script type="text/javascript">
60 var longAsciiText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam ac ipsum. Morbi mauris. Aenean ac elit id metus lobortis elementum. Proin at quam ac ipsum pellentesque adipiscing. Aenean vestibulum, nisl eu suscipit iaculis, quam pede congue mi, sit amet dapibus metus neque eget dui. Suspendisse posuere diam ac sapien. Nulla lobortis dapibus leo. Quisque ornare tortor quis turpis. Aliquam erat volutpat. Ut faucibus lacinia magna. Nunc metus leo, volutpat quis, mollis ac, sagittis ut, turpis. Quisque purus. Mauris ante enim, vehicula eu, suscipit vitae, laoreet vel, nulla. Pellentesque pede leo, aliquam quis, vehicula eget, rhoncus nec, metus. Vestibulum tellus. Suspendisse blandit. Pellentesque vel tellus. Maecenas arcu. Duis eget purus. Curabitur non pede nec odio cursus luctus. In non elit. Nullam eget nunc in nisl elementum commodo. Vivamus sollicitudin pede quis dui. Morbi commodo. Praesent a risus id urna hendrerit fermentum. Nunc ultricies tristique odio. Phasellus imperdiet, sapien eget viverra blandit, tortor risus blandit nisi, et sodales libero dolor quis nisl. Morbi vel enim. Nunc in quam. Vestibulum a magna. Fusce auctor elit in augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris tincidunt consectetuer leo. Etiam non turpis. Vestibulum eros. Praesent venenatis adipiscing augue. Pellentesque dapibus odio ac arcu rhoncus sagittis. Nullam vitae augue. Ut magna nulla, congue eu, porta in, egestas quis, ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur malesuada neque non nulla. Nulla facilisi. Fusce viverra magna ut tellus. Sed rutrum pretium sapien. Vivamus dui. Cras fringilla. Nullam lorem. Vestibulum varius, purus at imperdiet fermentum, metus diam ultricies lacus, vitae aliquam ipsum libero sit amet felis. Sed eget eros ac velit commodo sollicitudin. Morbi in metus in mi viverra lacinia. Sed ut urna. Suspendisse imperdiet tellus ac velit. Duis malesuada velit sit amet sapien. Vestibulum a sapien id libero accumsan luctus. Fusce iaculis. Donec pulvinar orci ut pede. Nam placerat sem ut sem. Ut pretium bibendum nisl. Suspendisse potenti. Phasellus mollis neque in neque. Suspendisse augue magna, eleifend et, malesuada at, viverra in, nisl. Donec vel lectus in justo ultrices tristique. Aliquam erat volutpat. Morbi suscipit, risus ac volutpat mollis, risus metus hendrerit sapien, ac scelerisque est orci eu est. Quisque sit amet velit. Sed libero diam, semper id, eleifend ac, iaculis non, nulla. Donec varius tincidunt arcu. Sed quis metus eu erat adipiscing viverra. Donec odio. Aenean sagittis nisl sed purus. Fusce vel nibh quis felis accumsan bibendum. Etiam et risus ac tortor cursus pharetra. Maecenas tellus. Pellentesque nec felis id eros vehicula commodo. Aliquam interdum sagittis odio. Maecenas at lorem eget mi aliquet sagittis. Mauris quis nibh in odio sodales lacinia. Proin augue mauris, placerat a, blandit vel, tincidunt eget, ante. Quisque turpis purus, placerat eget, tempor consectetuer, aliquet ac, enim. Etiam eleifend vestibulum mi. Vivamus gravida. Morbi dolor. In hac habitasse platea dictumst. Nulla commodo lectus faucibus lorem. Phasellus aliquet pede id metus hendrerit tempus. Fusce convallis pede ac neque tempor dignissim. Sed vitae lorem sit amet justo dapibus porta. Ut quam orci, pretium non, sagittis nec, condimentum id, dolor. Sed tempor. Nunc porta rutrum leo. Nunc id sem. Sed nibh tortor, dapibus eget, feugiat a, pretium pretium, purus. Suspendisse suscipit lobortis sem. Praesent pharetra orci. Quisque molestie tristique quam. Maecenas nunc lorem, rhoncus non, venenatis sed, sodales at, felis. Quisque semper. Quisque malesuada est quis lacus. Nullam a justo. Aliquam pellentesque, ante ut congue molestie, nisl sapien posuere nisl, eu cursus nulla ligula vel nisl. Fusce commodo lacinia magna. Aenean rutrum vestibulum lorem. Pellentesque fermentum tristique ipsum. Nulla facilisi. Donec id mi eget ipsum commodo egestas. Mauris iaculis. Nulla vulputate mi at nisl. In condimentum sodales tellus. Donec metus orci, mollis vel, accumsan ac, ornare ac, lacus. Pellentesque accumsan est et tellus. Nam mollis. Aenean accumsan eros sit amet tellus. Praesent eu libero. Sed tempus urna nec dolor. Nulla facilisi. Duis eleifend rhoncus neque. Curabitur consectetuer quam eu justo. Sed metus. Vivamus risus. Aliquam erat volutpat. Aliquam erat volutpat. Nunc semper urna. Praesent molestie libero a lacus. Nullam suscipit lobortis velit. Praesent rhoncus, felis ut interdum dapibus, ipsum lectus vestibulum nulla, in interdum risus dolor eget orci. Nullam venenatis. Suspendisse laoreet, arcu a luctus consectetuer, libero ligula condimentum quam, eget elementum mauris tortor sed enim. Pellentesque leo. Nam interdum malesuada ante. Praesent fermentum nunc et dolor. Donec auctor volutpat odio. Pellentesque volutpat egestas ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras ac ligula eu justo dignissim accumsan. Nullam nisi. Fusce id sem. Fusce et urna. Pellentesque commodo pharetra lorem. Donec erat. Vestibulum elit arcu, commodo et, consequat eget, posuere eget, sem. Morbi sed nulla sed neque commodo commodo. Aliquam erat volutpat. Ut id turpis a enim malesuada vestibulum. In arcu dui, dignissim vitae, blandit eu, egestas ac, arcu. In ultricies sapien vitae nisi. Proin rhoncus magna eget tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In dictum. Sed volutpat pharetra quam. Mauris eget eros. Fusce malesuada dolor id pede. Praesent nec justo sed nisi vehicula varius. In scelerisque convallis nulla. Pellentesque sodales massa vulputate urna. Duis metus urna, imperdiet ac, sodales vel, ullamcorper sed, pede. Vestibulum aliquam mollis metus. Praesent tempus tristique elit. Maecenas tellus tortor, pretium id, mollis id, molestie non, turpis. Vivamus nibh magna, bibendum vitae, a."; 58 var longAsciiText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam ac ipsum. Morbi mauris. Aenean ac elit id metus lobortis elementum. Proin at quam ac ipsum pellentesque adipiscing. Aenean vestibulum, nisl eu suscipit iaculis, quam pede congue mi, sit amet dapibus metus neque eget dui. Suspendisse posuere diam ac sapien. Nulla lobortis dapibus leo. Quisque ornare tortor quis turpis. Aliquam erat volutpat. Ut faucibus lacinia magna. Nunc metus leo, volutpat quis, mollis ac, sagittis ut, turpis. Quisque purus. Mauris ante enim, vehicula eu, suscipit vitae, laoreet vel, nulla. Pellentesque pede leo, aliquam quis, vehicula eget, rhoncus nec, metus. Vestibulum tellus. Suspendisse blandit. Pellentesque vel tellus. Maecenas arcu. Duis eget purus. Curabitur non pede nec odio cursus luctus. In non elit. Nullam eget nunc in nisl elementum commodo. Vivamus sollicitudin pede quis dui. Morbi commodo. Praesent a risus id urna hendrerit fermentum. Nunc ultricies tristique odio. Phasellus imperdiet, sapien eget viverra blandit, tortor risus blandit nisi, et sodales libero dolor quis nisl. Morbi vel enim. Nunc in quam. Vestibulum a magna. Fusce auctor elit in augue. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris tincidunt consectetuer leo. Etiam non turpis. Vestibulum eros. Praesent venenatis adipiscing augue. Pellentesque dapibus odio ac arcu rhoncus sagittis. Nullam vitae augue. Ut magna nulla, congue eu, porta in, egestas quis, ligula. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur malesuada neque non nulla. Nulla facilisi. Fusce viverra magna ut tellus. Sed rutrum pretium sapien. Vivamus dui. Cras fringilla. Nullam lorem. Vestibulum varius, purus at imperdiet fermentum, metus diam ultricies lacus, vitae aliquam ipsum libero sit amet felis. Sed eget eros ac velit commodo sollicitudin. Morbi in metus in mi viverra lacinia. Sed ut urna. Suspendisse imperdiet tellus ac velit. Duis malesuada velit sit amet sapien. Vestibulum a sapien id libero accumsan luctus. Fusce iaculis. Donec pulvinar orci ut pede. Nam placerat sem ut sem. Ut pretium bibendum nisl. Suspendisse potenti. Phasellus mollis neque in neque. Suspendisse augue magna, eleifend et, malesuada at, viverra in, nisl. Donec vel lectus in justo ultrices tristique. Aliquam erat volutpat. Morbi suscipit, risus ac volutpat mollis, risus metus hendrerit sapien, ac scelerisque est orci eu est. Quisque sit amet velit. Sed libero diam, semper id, eleifend ac, iaculis non, nulla. Donec varius tincidunt arcu. Sed quis metus eu erat adipiscing viverra. Donec odio. Aenean sagittis nisl sed purus. Fusce vel nibh quis felis accumsan bibendum. Etiam et risus ac tortor cursus pharetra. Maecenas tellus. Pellentesque nec felis id eros vehicula commodo. Aliquam interdum sagittis odio. Maecenas at lorem eget mi aliquet sagittis. Mauris quis nibh in odio sodales lacinia. Proin augue mauris, placerat a, blandit vel, tincidunt eget, ante. Quisque turpis purus, placerat eget, tempor consectetuer, aliquet ac, enim. Etiam eleifend vestibulum mi. Vivamus gravida. Morbi dolor. In hac habitasse platea dictumst. Nulla commodo lectus faucibus lorem. Phasellus aliquet pede id metus hendrerit tempus. Fusce convallis pede ac neque tempor dignissim. Sed vitae lorem sit amet justo dapibus porta. Ut quam orci, pretium non, sagittis nec, condimentum id, dolor. Sed tempor. Nunc porta rutrum leo. Nunc id sem. Sed nibh tortor, dapibus eget, feugiat a, pretium pretium, purus. Suspendisse suscipit lobortis sem. Praesent pharetra orci. Quisque molestie tristique quam. Maecenas nunc lorem, rhoncus non, venenatis sed, sodales at, felis. Quisque semper. Quisque malesuada est quis lacus. Nullam a justo. Aliquam pellentesque, ante ut congue molestie, nisl sapien posuere nisl, eu cursus nulla ligula vel nisl. Fusce commodo lacinia magna. Aenean rutrum vestibulum lorem. Pellentesque fermentum tristique ipsum. Nulla facilisi. Donec id mi eget ipsum commodo egestas. Mauris iaculis. Nulla vulputate mi at nisl. In condimentum sodales tellus. Donec metus orci, mollis vel, accumsan ac, ornare ac, lacus. Pellentesque accumsan est et tellus. Nam mollis. Aenean accumsan eros sit amet tellus. Praesent eu libero. Sed tempus urna nec dolor. Nulla facilisi. Duis eleifend rhoncus neque. Curabitur consectetuer quam eu justo. Sed metus. Vivamus risus. Aliquam erat volutpat. Aliquam erat volutpat. Nunc semper urna. Praesent molestie libero a lacus. Nullam suscipit lobortis velit. Praesent rhoncus, felis ut interdum dapibus, ipsum lectus vestibulum nulla, in interdum risus dolor eget orci. Nullam venenatis. Suspendisse laoreet, arcu a luctus consectetuer, libero ligula condimentum quam, eget elementum mauris tortor sed enim. Pellentesque leo. Nam interdum malesuada ante. Praesent fermentum nunc et dolor. Donec auctor volutpat odio. Pellentesque volutpat egestas ipsum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras ac ligula eu justo dignissim accumsan. Nullam nisi. Fusce id sem. Fusce et urna. Pellentesque commodo pharetra lorem. Donec erat. Vestibulum elit arcu, commodo et, consequat eget, posuere eget, sem. Morbi sed nulla sed neque commodo commodo. Aliquam erat volutpat. Ut id turpis a enim malesuada vestibulum. In arcu dui, dignissim vitae, blandit eu, egestas ac, arcu. In ultricies sapien vitae nisi. Proin rhoncus magna eget tortor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In dictum. Sed volutpat pharetra quam. Mauris eget eros. Fusce malesuada dolor id pede. Praesent nec justo sed nisi vehicula varius. In scelerisque convallis nulla. Pellentesque sodales massa vulputate urna. Duis metus urna, imperdiet ac, sodales vel, ullamcorper sed, pede. Vestibulum aliquam mollis metus. Praesent tempus tristique elit. Maecenas tellus tortor, pretium id, mollis id, molestie non, turpis. Vivamus nibh magna, bibendum vitae, a.";
61 var longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù"; 59 var longIsoLatin1Text = "¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ¡¢£¤¥¦§¨©ª«¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùù";
62 var longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之"; 60 var longUtf8Text = "客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之所以能统称为汉语第客家方言简体字危及了对古代文学的研究共有找华语并不被中国政府很好的接受然而汉语之";
63 </script> 61 </script>
64 <script type="text/javascript" src="JSCrypto_vs_Clipperz.test.js"></script> 62 <script type="text/javascript" src="JSCrypto_vs_Clipperz.test.js"></script>
65</pre> 63</pre>
66</body> 64</body>
67</html> 65</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js
index 1580e6c..b3675f1 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26//function logElapsedTime(aDescription, aStartTime, anEndTime) { 24//function logElapsedTime(aDescription, aStartTime, anEndTime) {
27 //MochiKit.Logging.logDebug(aDescription + " - took " + (anEndTime - aStartTime) + "ms"); 25 //MochiKit.Logging.logDebug(aDescription + " - took " + (anEndTime - aStartTime) + "ms");
28 //SimpleTest.ok(true, aDescription + " - took " + (anEndTime - aStartTime) + "ms"); 26 //SimpleTest.ok(true, aDescription + " - took " + (anEndTime - aStartTime) + "ms");
29//} 27//}
30 28
31 var asciiTestString = longAsciiText; 29 var asciiTestString = longAsciiText;
32//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; 30//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString;
33//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; 31//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString;
34//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; 32//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString;
35//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; 33//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString;
36//asciiTestString = asciiTestString + asciiTestString; 34//asciiTestString = asciiTestString + asciiTestString;
37//asciiTestString = asciiTestString + asciiTestString; 35//asciiTestString = asciiTestString + asciiTestString;
38 36
39 var isoLatin1TestString= longIsoLatin1Text; 37 var isoLatin1TestString= longIsoLatin1Text;
40//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString; 38//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString;
41//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString; 39//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString;
42//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString; 40//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString;
43//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString; 41//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString;
44//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString; 42//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString;
45 43
46 var utf8TestString = longUtf8Text; 44 var utf8TestString = longUtf8Text;
47//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString; 45//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString;
48//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString; 46//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString;
49//utf8TestString = utf8TestString + utf8TestString; 47//utf8TestString = utf8TestString + utf8TestString;
50//utf8TestString = utf8TestString + utf8TestString; 48//utf8TestString = utf8TestString + utf8TestString;
51 49
52var times = { 50var times = {
53 'Clipperz': {}, 51 'Clipperz': {},
54 'JSCrypto': {} 52 'JSCrypto': {}
55}; 53};
56 54
57function appendResults (aDescription, aTimer) { 55function appendResults (aDescription, aTimer) {
58 MochiKit.DOM.appendChildNodes(MochiKit.DOM.getElement('timerTBODY'), 56 MochiKit.DOM.appendChildNodes(MochiKit.DOM.getElement('timerTBODY'),
59 MochiKit.DOM.TR(null, 57 MochiKit.DOM.TR(null,
60 MochiKit.DOM.TH({align:'left'}, aDescription), 58 MochiKit.DOM.TH({align:'left'}, aDescription),
61 MochiKit.DOM.TH(null, aTimer['ascii']['encrypt'] + ' - ' + aTimer['ascii']['decrypt'])//, 59 MochiKit.DOM.TH(null, aTimer['ascii']['encrypt'] + ' - ' + aTimer['ascii']['decrypt'])//,
62 // MochiKit.DOM.TH(null, aTimer['isoLatin1']['encrypt']+ ' - ' + aTimer['isoLatin1']['decrypt']), 60 // MochiKit.DOM.TH(null, aTimer['isoLatin1']['encrypt']+ ' - ' + aTimer['isoLatin1']['decrypt']),
63 // MochiKit.DOM.TH(null, aTimer['utf8']['encrypt'] + ' - ' + aTimer['utf8']['decrypt']) 61 // MochiKit.DOM.TH(null, aTimer['utf8']['encrypt'] + ' - ' + aTimer['utf8']['decrypt'])
64 ) 62 )
65 ); 63 );
66 64
67} 65}
68 66
69//============================================================================= 67//=============================================================================
70 68
71function timeRegularFunction (aDescription, aString, anEncryptFunction, aDecryptFunction, aTimer, aKey) { 69function timeRegularFunction (aDescription, aString, anEncryptFunction, aDecryptFunction, aTimer, aKey) {
72 var start; 70 var start;
73 var end; 71 var end;
74 var encryptTime; 72 var encryptTime;
75 var decryptTime; 73 var decryptTime;
76 var ciphertext; 74 var ciphertext;
77 var plaintext; 75 var plaintext;
78 76
79 77
80 start = new Date(); 78 start = new Date();
81 ciphertext = anEncryptFunction('trustno1', aString); 79 ciphertext = anEncryptFunction('trustno1', aString);
82 end = new Date(); 80 end = new Date();
83 encryptTime = end - start; 81 encryptTime = end - start;
84 82
85 start = new Date(); 83 start = new Date();
86 plaintext = aDecryptFunction('trustno1', ciphertext); 84 plaintext = aDecryptFunction('trustno1', ciphertext);
87 end = new Date(); 85 end = new Date();
88 decryptTime = end - start; 86 decryptTime = end - start;
89 aTimer[aKey] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; 87 aTimer[aKey] = { 'encrypt': encryptTime, 'decrypt': decryptTime };
90 SimpleTest.is(aString, plaintext, aDescription); 88 SimpleTest.is(aString, plaintext, aDescription);
91} 89}
92/* 90/*
93function timeRegularFunction (anEncryptFunction, aDecryptFunction, aTimer) { 91function timeRegularFunction (anEncryptFunction, aDecryptFunction, aTimer) {
94 var start; 92 var start;
95 var end; 93 var end;
96 var encryptTime; 94 var encryptTime;
97 var decryptTime; 95 var decryptTime;
98 var ciphertext; 96 var ciphertext;
99 var plaintext; 97 var plaintext;
100 98
101 99
102 start = new Date(); 100 start = new Date();
103 ciphertext = anEncryptFunction('trustno1', asciiTestString); 101 ciphertext = anEncryptFunction('trustno1', asciiTestString);
104 end = new Date(); 102 end = new Date();
105 encryptTime = end - start; 103 encryptTime = end - start;
106 104
107 start = new Date(); 105 start = new Date();
108 plaintext = aDecryptFunction('trustno1', ciphertext); 106 plaintext = aDecryptFunction('trustno1', ciphertext);
109 end = new Date(); 107 end = new Date();
110 decryptTime = end - start; 108 decryptTime = end - start;
111 aTimer['ascii'] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; 109 aTimer['ascii'] = { 'encrypt': encryptTime, 'decrypt': decryptTime };
112 SimpleTest.is(asciiTestString, plaintext, "Encrypt/decrypt the ASCII text"); 110 SimpleTest.is(asciiTestString, plaintext, "Encrypt/decrypt the ASCII text");
113 111
114 112
115 start = new Date(); 113 start = new Date();
116 ciphertext = anEncryptFunction('trustno1', isoLatin1TestString); 114 ciphertext = anEncryptFunction('trustno1', isoLatin1TestString);
117 end = new Date(); 115 end = new Date();
118 encryptTime = end - start; 116 encryptTime = end - start;
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html b/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html
index 61aa1c2..1ba19c6 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html
@@ -1,113 +1,111 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script> jslog_config_enabled = true; </script> 26 <script> jslog_config_enabled = true; </script>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 38
41<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Statistics.js'></script>--> 39<!--<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Statistics.js'></script>-->
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
47</head> 45</head>
48<body> 46<body>
49<pre id="test"> 47<pre id="test">
50<script type="text/javascript"> 48<script type="text/javascript">
51test_PRNG = function() { 49test_PRNG = function() {
52 varrand1, rand2; 50 varrand1, rand2;
53 var i,c; 51 var i,c;
54 52
55 c = 10; 53 c = 10;
56 for (i=0; i<c; i++) { 54 for (i=0; i<c; i++) {
57 // jslog.debug(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString()); 55 // jslog.debug(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString());
58 } 56 }
59 57
60 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1); 58 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1);
61 is(rand1.byteAtIndex(0) <= 255, true, "getRandomByte returns always a single byte"); 59 is(rand1.byteAtIndex(0) <= 255, true, "getRandomByte returns always a single byte");
62 60
63 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1); 61 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(1);
64 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence"); 62 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence");
65 63
66 64
67 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 65 rand1 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
68 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 66 rand2 = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
69 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence"); 67 is(rand1.equals(rand2), false, "getRandomByte should almost always return two different values when called into sequence");
70 is(rand1.split(0,1).equals(rand2.split(0,1)), false, "getRandomByte should almost always return two different values when called into sequence"); 68 is(rand1.split(0,1).equals(rand2.split(0,1)), false, "getRandomByte should almost always return two different values when called into sequence");
71 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 1", "Value for random test"); 69 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 1", "Value for random test");
72 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 2", "Value for random test"); 70 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 2", "Value for random test");
73 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 3", "Value for random test"); 71 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 3", "Value for random test");
74 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 4", "Value for random test"); 72 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 4", "Value for random test");
75 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 5", "Value for random test"); 73 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 5", "Value for random test");
76 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 6", "Value for random test"); 74 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 6", "Value for random test");
77 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 7", "Value for random test"); 75 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 7", "Value for random test");
78 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 8", "Value for random test"); 76 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 8", "Value for random test");
79 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 9", "Value for random test"); 77 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 9", "Value for random test");
80 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 10", "Value for random test"); 78 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 10", "Value for random test");
81 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 11", "Value for random test"); 79 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 11", "Value for random test");
82 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 12", "Value for random test"); 80 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 12", "Value for random test");
83 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 13", "Value for random test"); 81 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 13", "Value for random test");
84 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 14", "Value for random test"); 82 //is(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(10000).toHexString(), "rand 14", "Value for random test");
85//jslog.debug(rand1.toHexString()); 83//jslog.debug(rand1.toHexString());
86//jslog.debug(rand2.toHexString()); 84//jslog.debug(rand2.toHexString());
87 85
88 SimpleTest.finish(); 86 SimpleTest.finish();
89} 87}
90 88
91try { 89try {
92 MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', test_PRNG); 90 MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', test_PRNG);
93 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 91 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
94 SimpleTest.waitForExplicitFinish(); 92 SimpleTest.waitForExplicitFinish();
95} catch (err) { 93} catch (err) {
96 94
97 var s = "test suite failure!\n"; 95 var s = "test suite failure!\n";
98 var o = {}; 96 var o = {};
99 var k = null; 97 var k = null;
100 for (k in err) { 98 for (k in err) {
101 // ensure unique keys?! 99 // ensure unique keys?!
102 if (!o[k]) { 100 if (!o[k]) {
103 s += k + ": " + err[k] + "\n"; 101 s += k + ": " + err[k] + "\n";
104 o[k] = err[k]; 102 o[k] = err[k];
105 } 103 }
106 } 104 }
107 ok ( false, s ); 105 ok ( false, s );
108} 106}
109 107
110</script> 108</script>
111</pre> 109</pre>
112</body> 110</body>
113</html> 111</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html b/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html
index 4c7fd86..043ab40 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html
@@ -1,86 +1,84 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 27 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 28 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
34 32
35 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script>
38 36
39</head> 37</head>
40<body> 38<body>
41<pre id="test"> 39<pre id="test">
42<script type="text/javascript"> 40<script type="text/javascript">
43try { 41try {
44 varrsaPublicKey; 42 varrsaPublicKey;
45 varrandomValue; 43 varrandomValue;
46 varpublicEncryptedValue; 44 varpublicEncryptedValue;
47 var privateEncryptedValue; 45 var privateEncryptedValue;
48 46
49 varstartTime; 47 varstartTime;
50 varendTime; 48 varendTime;
51 49
52 50
53startTime=new Date(); 51startTime=new Date();
54 rsaPublicKey = Clipperz.Crypto.RSA.generatePublicKey(512); 52 rsaPublicKey = Clipperz.Crypto.RSA.generatePublicKey(512);
55 53
56endTime=new Date(); 54endTime=new Date();
57is(true, true, 'Time to generate the RSA public key (size 512 bit): '+(endTime.getTime()-startTime.getTime())/1000.0); 55is(true, true, 'Time to generate the RSA public key (size 512 bit): '+(endTime.getTime()-startTime.getTime())/1000.0);
58 56
59 randomValue = Clipperz.Crypto.Base.generateRandomSeed(); 57 randomValue = Clipperz.Crypto.Base.generateRandomSeed();
60 publicEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPublicKey(rsaPublicKey, randomValue); 58 publicEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPublicKey(rsaPublicKey, randomValue);
61 privateEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPrivateKey(rsaPublicKey, randomValue); 59 privateEncryptedValue = Clipperz.Crypto.RSA.encryptUsingPrivateKey(rsaPublicKey, randomValue);
62 60
63 is(publicEncryptedValue == privateEncryptedValue, false); 61 is(publicEncryptedValue == privateEncryptedValue, false);
64 is(Clipperz.Crypto.RSA.decryptUsingPrivateKey(rsaPublicKey, publicEncryptedValue), randomValue); 62 is(Clipperz.Crypto.RSA.decryptUsingPrivateKey(rsaPublicKey, publicEncryptedValue), randomValue);
65 is(Clipperz.Crypto.RSA.decryptUsingPublicKey(rsaPublicKey, privateEncryptedValue), randomValue); 63 is(Clipperz.Crypto.RSA.decryptUsingPublicKey(rsaPublicKey, privateEncryptedValue), randomValue);
66 64
67 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
68} catch (err) { 66} catch (err) {
69 67
70 var s = "test suite failure!\n"; 68 var s = "test suite failure!\n";
71 var o = {}; 69 var o = {};
72 var k = null; 70 var k = null;
73 for (k in err) { 71 for (k in err) {
74 // ensure unique keys?! 72 // ensure unique keys?!
75 if (!o[k]) { 73 if (!o[k]) {
76 s += k + ": " + err[k] + "\n"; 74 s += k + ": " + err[k] + "\n";
77 o[k] = err[k]; 75 o[k] = err[k];
78 } 76 }
79 } 77 }
80 ok ( false, s ); 78 ok ( false, s );
81} 79}
82 80
83</script> 81</script>
84</pre> 82</pre>
85</body> 83</body>
86</html> 84</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html
index a2f6c04..de2021a 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.Crypto.SHA - TEST</title> 26 <title>Clipperz.Crypto.SHA - TEST</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
42 40
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
44 42
45 43
46 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 44 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
47 45
48</head> 46</head>
49<body> 47<body>
50<pre id="test"> 48<pre id="test">
51<script type="text/javascript" src="SHA.test.js"></script> 49<script type="text/javascript" src="SHA.test.js"></script>
52</pre> 50</pre>
53</body> 51</body>
54</html> 52</html>
55 53
56 54
57 55
58<!-- html> 56<!-- html>
59<head> 57<head>
60 <script> 58 <script>
61 jslog_config_enabled = true; 59 jslog_config_enabled = true;
62 clipperz_profiling_enabled = true; 60 clipperz_profiling_enabled = true;
63 </script> 61 </script>
64 62
65 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 63 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
66 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 64 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
67 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 65 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
68 66
69 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 69 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
73 71
74 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
75</head> 73</head>
76<body> 74<body>
77<pre id="test"> 75<pre id="test">
78<script type="text/javascript"> 76<script type="text/javascript">
79 77
80try { 78try {
81 varbyteArray; 79 varbyteArray;
82 varhash; 80 varhash;
83 var longText; 81 var longText;
84 var startTime, endTime; 82 var startTime, endTime;
85 83
86 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo."; 84 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo.";
87 85
88 //------------------------------------------------------------------------- 86 //-------------------------------------------------------------------------
89 // 87 //
90 //Test of SHA-256 algorithm 88 //Test of SHA-256 algorithm
91 // 89 //
92 //------------------------------------------------------------------------- 90 //-------------------------------------------------------------------------
93 91
94 byteArray = new Clipperz.ByteArray(); 92 byteArray = new Clipperz.ByteArray();
95 hash = Clipperz.Crypto.SHA.sha256(byteArray); 93 hash = Clipperz.Crypto.SHA.sha256(byteArray);
96 is(hash.toHexString(), "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "sha256('')"); 94 is(hash.toHexString(), "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "sha256('')");
97 95
98 byteArray = new Clipperz.ByteArray("0xbd"); 96 byteArray = new Clipperz.ByteArray("0xbd");
99 hash = Clipperz.Crypto.SHA.sha256(byteArray); 97 hash = Clipperz.Crypto.SHA.sha256(byteArray);
100 is(hash.toHexString(), "0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b", "sha256('0xbd')"); 98 is(hash.toHexString(), "0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b", "sha256('0xbd')");
101 99
102 byteArray = new Clipperz.ByteArray("0x5fd4"); 100 byteArray = new Clipperz.ByteArray("0x5fd4");
103 hash = Clipperz.Crypto.SHA.sha256(byteArray); 101 hash = Clipperz.Crypto.SHA.sha256(byteArray);
104 is(hash.toHexString(), "0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788", "sha256('0x5fd4')"); 102 is(hash.toHexString(), "0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788", "sha256('0x5fd4')");
105 103
106 byteArray = new Clipperz.ByteArray("0xc98c8e55"); 104 byteArray = new Clipperz.ByteArray("0xc98c8e55");
107 hash = Clipperz.Crypto.SHA.sha256(byteArray); 105 hash = Clipperz.Crypto.SHA.sha256(byteArray);
108 is(hash.toHexString(), "0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504", "sha256('0xc98c8e55')"); 106 is(hash.toHexString(), "0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504", "sha256('0xc98c8e55')");
109 107
110 byteArray = new Clipperz.ByteArray("0x0df1cd526b5a4edd"); 108 byteArray = new Clipperz.ByteArray("0x0df1cd526b5a4edd");
111 hash = Clipperz.Crypto.SHA.sha256(byteArray); 109 hash = Clipperz.Crypto.SHA.sha256(byteArray);
112 is(hash.toHexString(), "0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c", "sha256('0x0df1cd526b5a4edd')"); 110 is(hash.toHexString(), "0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c", "sha256('0x0df1cd526b5a4edd')");
113 111
114 byteArray = new Clipperz.ByteArray("0xfdf4700984ee11b70af1880d0e0fefd4"); 112 byteArray = new Clipperz.ByteArray("0xfdf4700984ee11b70af1880d0e0fefd4");
115 hash = Clipperz.Crypto.SHA.sha256(byteArray); 113 hash = Clipperz.Crypto.SHA.sha256(byteArray);
116 is(hash.toHexString(), 114 is(hash.toHexString(),
117 "0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c", 115 "0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c",
118 "sha256('0xfdf4700984ee11b70af1880d0e0fefd4')"); 116 "sha256('0xfdf4700984ee11b70af1880d0e0fefd4')");
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js
index 2864aaf..6530844 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js
@@ -1,81 +1,79 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26var testSHA = function (aValue, anExpectedResult) { 24var testSHA = function (aValue, anExpectedResult) {
27 var byteArrayValue; 25 var byteArrayValue;
28 26
29 byteArrayValue = new Clipperz.ByteArray(aValue); 27 byteArrayValue = new Clipperz.ByteArray(aValue);
30 hash = Clipperz.Crypto.SHA.sha256(byteArrayValue); 28 hash = Clipperz.Crypto.SHA.sha256(byteArrayValue);
31 is(hash.toHexString(), anExpectedResult, "sha256(' " + byteArrayValue.toHexString() + "')"); 29 is(hash.toHexString(), anExpectedResult, "sha256(' " + byteArrayValue.toHexString() + "')");
32 30
33} 31}
34 32
35 33
36var tests = { 34var tests = {
37 35
38 'basic_tests': function (someTestArgs) { 36 'basic_tests': function (someTestArgs) {
39 testSHA('', '0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'); 37 testSHA('', '0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
40 testSHA('0xbd', '0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b'); 38 testSHA('0xbd', '0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b');
41 testSHA('0x5fd4', '0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788'); 39 testSHA('0x5fd4', '0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788');
42 testSHA('0xc98c8e55', '0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504'); 40 testSHA('0xc98c8e55', '0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504');
43 testSHA('0x0df1cd526b5a4edd', '0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c'); 41 testSHA('0x0df1cd526b5a4edd', '0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c');
44 testSHA('0xfdf4700984ee11b70af1880d0e0fefd4', '0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c'); 42 testSHA('0xfdf4700984ee11b70af1880d0e0fefd4', '0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c');
45 testSHA('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb', '0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d'); 43 testSHA('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb', '0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d');
46 testSHA('0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a', '0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3'); 44 testSHA('0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a', '0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3');
47 testSHA('0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad', '0x105a60865830ac3a371d3843324d4bb5fa8ec0e02ddaa389ad8da4f10215c454'); 45 testSHA('0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad', '0x105a60865830ac3a371d3843324d4bb5fa8ec0e02ddaa389ad8da4f10215c454');
48 46
49 }, 47 },
50 48
51 //------------------------------------------------------------------------- 49 //-------------------------------------------------------------------------
52 50
53 'aldo_cortesi_tests': function (someTestArgs) { 51 'aldo_cortesi_tests': function (someTestArgs) {
54 testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','0xa3f01b6939256127582ac8ae9fb47a382a244680806a3f613a118851c1ca1d47'); 52 testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','0xa3f01b6939256127582ac8ae9fb47a382a244680806a3f613a118851c1ca1d47');
55 testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','0xb35439a4ac6f0948b6d6f9e3c6af0f5f590ce20f1bde7090ef7970686ec6738a'); 53 testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','0xb35439a4ac6f0948b6d6f9e3c6af0f5f590ce20f1bde7090ef7970686ec6738a');
56 testSHA('0x79', '0xa1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa'); 54 testSHA('0x79', '0xa1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa');
57 testSHA('0x80', '0x76be8b528d0075f7aae98d6fa57a6d3c83ae480a8469e668d7b0af968995ac71'); 55 testSHA('0x80', '0x76be8b528d0075f7aae98d6fa57a6d3c83ae480a8469e668d7b0af968995ac71');
58 }, 56 },
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'longTextPerformance_test': function (someTestArgs) { 60 'longTextPerformance_test': function (someTestArgs) {
63 var longText; 61 var longText;
64 var startTime; 62 var startTime;
65 var endTime; 63 var endTime;
66 64
67 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo."; 65 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo.";
68 startTime = new Date(); 66 startTime = new Date();
69 testSHA(longText, '0xf6fac13c06784e0fbc61a3d25c41c9984840a8b617a2beb57cf6fa3e5e4a8949'); 67 testSHA(longText, '0xf6fac13c06784e0fbc61a3d25c41c9984840a8b617a2beb57cf6fa3e5e4a8949');
70 endTime = new Date(); 68 endTime = new Date();
71 69
72 is((endTime - startTime) < 100, true, "Long text hash performance (" + (endTime - startTime) + ")"); 70 is((endTime - startTime) < 100, true, "Long text hash performance (" + (endTime - startTime) + ")");
73 }, 71 },
74 72
75 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
76 'syntaxFix': MochiKit.Base.noop 74 'syntaxFix': MochiKit.Base.noop
77} 75}
78 76
79//============================================================================= 77//=============================================================================
80 78
81SimpleTest.runDeferredTests("Clipperz.Crypto.SHA", tests, {trace:false}); 79SimpleTest.runDeferredTests("Clipperz.Crypto.SHA", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html b/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html
index ba842a9..5da2327 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 27 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 28 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
36 34
37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
43</head> 41</head>
44<body> 42<body>
45<pre id="test"> 43<pre id="test">
46<script type="text/javascript"> 44<script type="text/javascript">
47hashString = function(aValue) { 45hashString = function(aValue) {
48 return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aValue)).toHexString().substring(2) 46 return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aValue)).toHexString().substring(2)
49} 47}
50try { 48try {
51 varusername; 49 varusername;
52 varpassphrase; 50 varpassphrase;
53 51
54 var C; 52 var C;
55 var P; 53 var P;
56 var encryptedText_1; 54 var encryptedText_1;
57 var encryptedText_2; 55 var encryptedText_2;
58 varsalt; 56 varsalt;
59 varx; 57 varx;
60 var v; 58 var v;
61 var v1; 59 var v1;
62 60
63 username = "giulio.cesare"; 61 username = "giulio.cesare";
64 passphrase = "trustno1"; 62 passphrase = "trustno1";
65 63
66 C = hashString(username); 64 C = hashString(username);
67 is (C, "bde3c7b5fdcd9d6ce72782ca1ae912fc4397d668fcb3a73a04e5d47852670c4a", "C"); 65 is (C, "bde3c7b5fdcd9d6ce72782ca1ae912fc4397d668fcb3a73a04e5d47852670c4a", "C");
68 66
69 P = hashString(passphrase + username); 67 P = hashString(passphrase + username);
70 is (P, "d79f5c5a04e91e1c85fb64cb6ee9481cb52c181047f69da02cd6c3ce6d058a76", "P"); 68 is (P, "d79f5c5a04e91e1c85fb64cb6ee9481cb52c181047f69da02cd6c3ce6d058a76", "P");
71 69
72 salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988"; 70 salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988";
73 71
74 x = hashString(salt + P); 72 x = hashString(salt + P);
75 is(x, "21fe88a158e420aade86e00b5eb12a4c19bf15482fa34c542c90b1afdbd5b5fd", "x"); 73 is(x, "21fe88a158e420aade86e00b5eb12a4c19bf15482fa34c542c90b1afdbd5b5fd", "x");
76 74
77 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n()); 75 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
78 is(v.asString(10), "33816467430011076413789931449607305355248467973000153409872503376381719918118", "v"); 76 is(v.asString(10), "33816467430011076413789931449607305355248467973000153409872503376381719918118", "v");
79 is(v.asString(16), "4ac37139dbf32ebabd2c43f91dd085066d3c457d059efd5902d32ed247fcb626", "v (base 16)"); 77 is(v.asString(16), "4ac37139dbf32ebabd2c43f91dd085066d3c457d059efd5902d32ed247fcb626", "v (base 16)");
80 78
81 //encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); 79 //encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
82 //encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); 80 //encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
83 //is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result"); 81 //is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result");
84 82
85 //------------------------------------------------------------------------- 83 //-------------------------------------------------------------------------
86 84
87 username = "giulio.cesare.debug"; 85 username = "giulio.cesare.debug";
88 passphrase = "trustno1"; 86 passphrase = "trustno1";
89 87
90 C = hashString(username); 88 C = hashString(username);
91 is (C, "fa1af609123b97a10d676158ed538d4657a89ac33a102b22bd9a66712039e208", "C"); 89 is (C, "fa1af609123b97a10d676158ed538d4657a89ac33a102b22bd9a66712039e208", "C");
92 90
93 P = hashString(passphrase + username); 91 P = hashString(passphrase + username);
94 is (P, "e1bfba03dd626b12f29458a6ad63fb2c01b4765548504e1e2f6b1503c82e4253", "P"); 92 is (P, "e1bfba03dd626b12f29458a6ad63fb2c01b4765548504e1e2f6b1503c82e4253", "P");
95 93
96 salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988"; 94 salt = "cf1fa93393ade60318b8276f1f39420098419445005a7dc9117975fe1f8d9988";
97 95
98 x = hashString(salt + P); 96 x = hashString(salt + P);
99 is(x, "93d4af3cdcd2447a745d309826dff3161feed4b15f32db8e909ff032a2bc8fb8", "x"); 97 is(x, "93d4af3cdcd2447a745d309826dff3161feed4b15f32db8e909ff032a2bc8fb8", "x");
100 98
101 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n()); 99 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
102 is(v.asString(10), "115049747015252903452664067168789229427785288458366249918596663144588656606556", "v"); 100 is(v.asString(10), "115049747015252903452664067168789229427785288458366249918596663144588656606556", "v");
103 101
104 //encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); 102 //encryptedText_1 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
105 //encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username); 103 //encryptedText_2 = Clipperz.Crypto.Base.encryptUsingSecretKey(passphrase, username);
106 //is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result"); 104 //is (encryptedText_1 != encryptedText_2, true, "Two round of encryption (with random padding bits) should NOT produce the same result");
107 105
108 //------------------------------------------------------------------------- 106 //-------------------------------------------------------------------------
109 107
110 var srpConnection; 108 var srpConnection;
111 var C, P, salt; 109 var C, P, salt;
112 110
113 C = "da8602c2f847306f4eb9acdaad925277d1fad1408f173f128a078aea15e60b1e"; 111 C = "da8602c2f847306f4eb9acdaad925277d1fad1408f173f128a078aea15e60b1e";
114 P = "77643559beca49dd21c1c31db10bb0a9009662cb504413dc3fa3b7303c7e02ba"; 112 P = "77643559beca49dd21c1c31db10bb0a9009662cb504413dc3fa3b7303c7e02ba";
115 salt ="000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1"; 113 salt ="000108cbbacda1f03ea9360301045434ec7d82ba150936df08a229cbb4832ce1";
116 114
117 srpConnection = new Clipperz.Crypto.SRP.Connection({C:C, P:P, hash:Clipperz.Crypto.SHA.sha_d256}); 115 srpConnection = new Clipperz.Crypto.SRP.Connection({C:C, P:P, hash:Clipperz.Crypto.SHA.sha_d256});
118 srpConnection._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10); 116 srpConnection._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10);
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html b/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html
index 4e7ad3d..f253553 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.Crypto.Usage - TEST</title> 26 <title>Clipperz.Crypto.Usage - TEST</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
41 39
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
45 43
46</head> 44</head>
47<body> 45<body>
48<pre id="test"> 46<pre id="test">
49<script type="text/javascript"> 47<script type="text/javascript">
50Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 48Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
51 49
52MochiKit.Base.update(Clipperz, { 50MochiKit.Base.update(Clipperz, {
53 'PM': { 51 'PM': {
54 'Crypto': { 52 'Crypto': {
55 'passwordEntropy': function(aValue) { 53 'passwordEntropy': function(aValue) {
56 var result; 54 var result;
57 varbitPerChar; 55 varbitPerChar;
58 56
59 bitPerChar = 4; 57 bitPerChar = 4;
60 if (/[a-z]/.test(aValue)) { 58 if (/[a-z]/.test(aValue)) {
61 bitPerChar ++; 59 bitPerChar ++;
62 } 60 }
63 if (/[A-Z]/.test(aValue)) { 61 if (/[A-Z]/.test(aValue)) {
64 bitPerChar ++; 62 bitPerChar ++;
65 } 63 }
66 if (/[^a-zA-Z0-9]/.test(aValue)) { 64 if (/[^a-zA-Z0-9]/.test(aValue)) {
67 bitPerChar ++; 65 bitPerChar ++;
68 } 66 }
69 //MochiKit.Logging.logDebug("--- bitPerChar: " + bitPerChar); 67 //MochiKit.Logging.logDebug("--- bitPerChar: " + bitPerChar);
70 68
71 result = aValue.length * bitPerChar; 69 result = aValue.length * bitPerChar;
72 70
73 return result; 71 return result;
74 } 72 }
75 } 73 }
76 } 74 }
77}) 75})
78 76
79try { 77try {
80 var keyValue; 78 var keyValue;
81 var keyEntropy; 79 var keyEntropy;
82 varkey; 80 varkey;
83 var plainText; 81 var plainText;
84 var cypherText; 82 var cypherText;
85 var randomBytes; 83 var randomBytes;
86 var hashedValue; 84 var hashedValue;
87 85
88 key = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("This is my long and complex passphrase")); 86 key = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("This is my long and complex passphrase"));
89 keyEntropy = Clipperz.PM.Crypto.passwordEntropy(key); 87 keyEntropy = Clipperz.PM.Crypto.passwordEntropy(key);
90 88
91 cypherText = Clipperz.Crypto.AES.encrypt(key, new Clipperz.ByteArray("some text to encrypt")); 89 cypherText = Clipperz.Crypto.AES.encrypt(key, new Clipperz.ByteArray("some text to encrypt"));
92 plainText = Clipperz.Crypto.AES.decrypt(key, cypherText).asString(); 90 plainText = Clipperz.Crypto.AES.decrypt(key, cypherText).asString();
93 is(plainText, "some text to encrypt"); 91 is(plainText, "some text to encrypt");
94 92
95 randomBytes = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(256/8); 93 randomBytes = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(256/8);
96 hashedValue = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("text to hash")); 94 hashedValue = Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray("text to hash"));
97 95
98//############################################################################# 96//#############################################################################
99 97
100} catch (err) { 98} catch (err) {
101 99
102 var s = "test suite failure!\n"; 100 var s = "test suite failure!\n";
103 var o = {}; 101 var o = {};
104 var k = null; 102 var k = null;
105 for (k in err) { 103 for (k in err) {
106 // ensure unique keys?! 104 // ensure unique keys?!
107 if (!o[k]) { 105 if (!o[k]) {
108 s += k + ": " + err[k] + "\n"; 106 s += k + ": " + err[k] + "\n";
109 o[k] = err[k]; 107 o[k] = err[k];
110 } 108 }
111 } 109 }
112 ok ( false, s ); 110 ok ( false, s );
113} 111}
114 112
115</script> 113</script>
116</pre> 114</pre>
117</body> 115</body>
118</html> 116</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/index.html b/frontend/gamma/tests/tests/Clipperz/Crypto/index.html
index dd63ceb..5ee8b8c 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/index.html
@@ -1,55 +1,53 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.Crypto.* - tests</title> 26 <title>Clipperz.Crypto.* - tests</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script>
32</head> 30</head>
33<body> 31<body>
34<script> 32<script>
35TestRunner.runTests( 33TestRunner.runTests(
36 'AES.html', 34 'AES.html',
37 'AES.performance.html', 35 'AES.performance.html',
38 'Base.html', 36 'Base.html',
39 'BigInt.html', 37 'BigInt.html',
40 38
41 //'ECC.B283.deferred.html', 39 //'ECC.B283.deferred.html',
42 //'ECC.BinaryField.FiniteField.html', 40 //'ECC.BinaryField.FiniteField.html',
43 //'ECC.BinaryField.FiniteField.B283.html', 41 //'ECC.BinaryField.FiniteField.B283.html',
44 //'ECC.BinaryField.Value.html', 42 //'ECC.BinaryField.Value.html',
45 //#'ECC.K283.deferred.html', 43 //#'ECC.K283.deferred.html',
46 44
47 'PRNG.html', 45 'PRNG.html',
48 //'RSA.html', 46 //'RSA.html',
49 'SHA.html', 47 'SHA.html',
50 'SRP.html', 48 'SRP.html',
51 'Usage.html' 49 'Usage.html'
52); 50);
53</script> 51</script>
54</body> 52</body>
55</html> \ No newline at end of file 53</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js b/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js
index 9a0d5fa..7781380 100644
--- a/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js
+++ b/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26/* jsCrypto 24/* jsCrypto
27Core AES 25Core AES
28 26
29Emily Stark (estark@stanford.edu) 27Emily Stark (estark@stanford.edu)
30Mike Hamburg (mhamburg@stanford.edu) 28Mike Hamburg (mhamburg@stanford.edu)
31Dan Boneh (dabo@cs.stanford.edu) 29Dan Boneh (dabo@cs.stanford.edu)
32 30
33Symmetric AES in Javascript using precomputed lookup tables for round transformations rather for speed improvements 31Symmetric AES in Javascript using precomputed lookup tables for round transformations rather for speed improvements
34and code size reduction. Provides authenticated encryption in OCB and CCM modes. 32and code size reduction. Provides authenticated encryption in OCB and CCM modes.
35Parts of this code are based on the OpenSSL implementation of AES: http://www.openssl.org 33Parts of this code are based on the OpenSSL implementation of AES: http://www.openssl.org
36 34
37Public domain, 2009. 35Public domain, 2009.
38 36
39*/ 37*/
40 38
41 39
42// CCM mode is the default 40// CCM mode is the default
43var CCM = 1, OCB = 2; 41var CCM = 1, OCB = 2;
44 42
45/* aes object constructor. Takes as arguments: 43/* aes object constructor. Takes as arguments:
46- 16-byte key, or an array of 4 32-bit words 44- 16-byte key, or an array of 4 32-bit words
47- Optionally specify a mode (aes.OCB or aes.CCM). Defaults to CCM 45- Optionally specify a mode (aes.OCB or aes.CCM). Defaults to CCM
48- Optionally specify a MAC tag length for integrity. Defaults to 16 bytes 46- Optionally specify a MAC tag length for integrity. Defaults to 16 bytes
49*/ 47*/
50function aes(key, mode, Tlen) { 48function aes(key, mode, Tlen) {
51 // initialize objects for CCM and OCB modes 49 // initialize objects for CCM and OCB modes
52 this._CCM = new cipherCCM(this); 50 this._CCM = new cipherCCM(this);
53 this._OCB = new cipherOCB(this); 51 this._OCB = new cipherOCB(this);
54 52
55 this._decryptScheduled = false; 53 this._decryptScheduled = false;
56 54
57 if (mode) this._mode = mode; 55 if (mode) this._mode = mode;
58 else this._mode = OCB; 56 else this._mode = OCB;
59 57
60 // AES round constants 58 // AES round constants
61 this._RCON = [ 59 this._RCON = [
62 [0x00, 0x00, 0x00, 0x00], 60 [0x00, 0x00, 0x00, 0x00],
63 [0x01, 0x00, 0x00, 0x00], 61 [0x01, 0x00, 0x00, 0x00],
64 [0x02, 0x00, 0x00, 0x00], 62 [0x02, 0x00, 0x00, 0x00],
65 [0x04, 0x00, 0x00, 0x00], 63 [0x04, 0x00, 0x00, 0x00],
66 [0x08, 0x00, 0x00, 0x00], 64 [0x08, 0x00, 0x00, 0x00],
67 [0x10, 0x00, 0x00, 0x00], 65 [0x10, 0x00, 0x00, 0x00],
68 [0x20, 0x00, 0x00, 0x00], 66 [0x20, 0x00, 0x00, 0x00],
69 [0x40, 0x00, 0x00, 0x00], 67 [0x40, 0x00, 0x00, 0x00],
70 [0x80, 0x00, 0x00, 0x00], 68 [0x80, 0x00, 0x00, 0x00],
71 [0x1b, 0x00, 0x00, 0x00], 69 [0x1b, 0x00, 0x00, 0x00],
72 [0x36, 0x00, 0x00, 0x00] 70 [0x36, 0x00, 0x00, 0x00]
73 ]; 71 ];
74 72
75 this._key_len = 16; 73 this._key_len = 16;
76 if (key.length == 4) { 74 if (key.length == 4) {
77 this._key = []; 75 this._key = [];
78 aes.wordsToBytes(key, this._key); 76 aes.wordsToBytes(key, this._key);
79 } 77 }
80 else 78 else
81 this._key = key; 79 this._key = key;
82 80
83 if (Tlen) this._Tlen = Tlen; 81 if (Tlen) this._Tlen = Tlen;
84 else this._Tlen = 16; // tag length in bytes 82 else this._Tlen = 16; // tag length in bytes
85 83
86 this._nr = 10; 84 this._nr = 10;
87 85
88 // initialize tables that will be precomputed 86 // initialize tables that will be precomputed
89 this._SBOX = []; 87 this._SBOX = [];
90 this._INV_SBOX = []; 88 this._INV_SBOX = [];
91 this._T = new Array(4); 89 this._T = new Array(4);
92 this._Tin = new Array(4); 90 this._Tin = new Array(4);
93 for (var i=0; i < 4; i++) { 91 for (var i=0; i < 4; i++) {
94 this._T[i] = []; 92 this._T[i] = [];
95 this._Tin[i] = []; 93 this._Tin[i] = [];
96 } 94 }
97 95
98 this._precompute(); 96 this._precompute();
99 this.scheduleEncrypt(); 97 this.scheduleEncrypt();
100 98
101 // initialize encryption and decryption buffers 99 // initialize encryption and decryption buffers
102 this._ctBuffer = []; 100 this._ctBuffer = [];
103 this._ptBuffer = []; 101 this._ptBuffer = [];
104} 102}
105 103
106 104
107////////////////// 105//////////////////
108// KEY SCHEDULING 106// KEY SCHEDULING
109////////////////// 107//////////////////
110 108
111aes.prototype.scheduleEncrypt = function () { 109aes.prototype.scheduleEncrypt = function () {
112 this._decryptScheduled = false; 110 this._decryptScheduled = false;
113 111
114 this._w = new Array(this._nr+1); 112 this._w = new Array(this._nr+1);
115 this._w[0] = new Array(4); 113 this._w[0] = new Array(4);
116 for (var i=0; i < 4; i++) 114 for (var i=0; i < 4; i++)
117 this._w[0][i] = this._key[i]; 115 this._w[0][i] = this._key[i];
118 var temp = new Array(4); 116 var temp = new Array(4);
diff --git a/frontend/gamma/tests/tests/Clipperz/DOM.html b/frontend/gamma/tests/tests/Clipperz/DOM.html
index 782b1fe..c5c6ffe 100644
--- a/frontend/gamma/tests/tests/Clipperz/DOM.html
+++ b/frontend/gamma/tests/tests/Clipperz/DOM.html
@@ -1,55 +1,53 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 27 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
30 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 28 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
31 29
32 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 30 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
33 31
34 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
35 <script type='text/javascript' src='../../../js/Clipperz/YUI/DomHelper.js'></script> 33 <script type='text/javascript' src='../../../js/Clipperz/YUI/DomHelper.js'></script>
36 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 34 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
37 <script type='text/javascript' src='../../../js/Clipperz/DOM.js'></script> 35 <script type='text/javascript' src='../../../js/Clipperz/DOM.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
39 37
40 <script type='text/javascript' src='../../../js/Clipperz/Crypto/Base.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/Crypto/Base.js'></script>
41</head> 39</head>
42<body> 40<body>
43 41
44<pre id="test"> 42<pre id="test">
45<script> 43<script>
46 Clipperz_IEisBroken = false; 44 Clipperz_IEisBroken = false;
47</script> 45</script>
48 46
49<!--[if IE]><script> 47<!--[if IE]><script>
50Clipperz_IEisBroken = true; 48Clipperz_IEisBroken = true;
51</script><![endif]--> 49</script><![endif]-->
52<script type="text/javascript" src="DOM.test.js"></script> 50<script type="text/javascript" src="DOM.test.js"></script>
53</pre> 51</pre>
54</body> 52</body>
55</html> 53</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/DOM.test.js b/frontend/gamma/tests/tests/Clipperz/DOM.test.js
index e8c6225..38c24e6 100644
--- a/frontend/gamma/tests/tests/Clipperz/DOM.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/DOM.test.js
@@ -1,79 +1,77 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26try { 24try {
27 var template; 25 var template;
28 var templateArgs; 26 var templateArgs;
29 var element; 27 var element;
30 var rowElement; 28 var rowElement;
31 var tdElement; 29 var tdElement;
32 30
33 template = Clipperz.DOM.Helper.createTemplate( 31 template = Clipperz.DOM.Helper.createTemplate(
34 [ 32 [
35 {tag:'td', children:[{tag:'img', cls:'favicon', src:'{faviconUrl}'}]}, 33 {tag:'td', children:[{tag:'img', cls:'favicon', src:'{faviconUrl}'}]},
36 {tag:'td', children:[{tag:'a', href:'#', cls:'title', html:'{cardTitle}'}]}, 34 {tag:'td', children:[{tag:'a', href:'#', cls:'title', html:'{cardTitle}'}]},
37 {tag:'td', children:[{tag:'span', cls:'directLogins', id:'{directLoginsID}'}]}, 35 {tag:'td', children:[{tag:'span', cls:'directLogins', id:'{directLoginsID}'}]},
38 {tag:'td', children:[{tag:'span', cls:'latestUpdate', html:'{latestUpdate}'}]}, 36 {tag:'td', children:[{tag:'span', cls:'latestUpdate', html:'{latestUpdate}'}]},
39 {tag:'td'} 37 {tag:'td'}
40 ] 38 ]
41 ); 39 );
42 40
43 templateArgs = { 41 templateArgs = {
44 cardTitle: "Amazon.com", 42 cardTitle: "Amazon.com",
45 directLoginsID: "Clipperz_PM_Components_directLogins_58", 43 directLoginsID: "Clipperz_PM_Components_directLogins_58",
46 faviconUrl: "http://www.amazon.com/favicon.ico", 44 faviconUrl: "http://www.amazon.com/favicon.ico",
47 latestUpdate: "", 45 latestUpdate: "",
48 reference: "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551" 46 reference: "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551"
49 } 47 }
50 48
51 element = Clipperz.DOM.Helper.append(document.body, {tag:'table', children:[ 49 element = Clipperz.DOM.Helper.append(document.body, {tag:'table', children:[
52 {tag:'theader'}, 50 {tag:'theader'},
53 {tag:'tbody', children:[ 51 {tag:'tbody', children:[
54 {tag:'tr', id:'testRow'} 52 {tag:'tr', id:'testRow'}
55 ]}, 53 ]},
56 {tag:'tfooter'} 54 {tag:'tfooter'}
57 ]}); 55 ]});
58 ok(element != null, "created the TABLE"); 56 ok(element != null, "created the TABLE");
59 57
60 rowElement = Clipperz.DOM.get('testRow'); 58 rowElement = Clipperz.DOM.get('testRow');
61 ok(testRow != null, "created the ROW"); 59 ok(testRow != null, "created the ROW");
62 60
63 template.append(rowElement, templateArgs); 61 template.append(rowElement, templateArgs);
64 tdElement = Clipperz.DOM.get(templateArgs['directLoginsID']); 62 tdElement = Clipperz.DOM.get(templateArgs['directLoginsID']);
65 ok(tdElement != null, "created the TD"); 63 ok(tdElement != null, "created the TD");
66 64
67} catch (err) { 65} catch (err) {
68 var s = "test suite failure!\n"; 66 var s = "test suite failure!\n";
69 var o = {}; 67 var o = {};
70 var k = null; 68 var k = null;
71 for (k in err) { 69 for (k in err) {
72 // ensure unique keys?! 70 // ensure unique keys?!
73 if (!o[k]) { 71 if (!o[k]) {
74 s += k + ": " + err[k] + "\n"; 72 s += k + ": " + err[k] + "\n";
75 o[k] = err[k]; 73 o[k] = err[k];
76 } 74 }
77 } 75 }
78 ok ( false, s ); 76 ok ( false, s );
79} 77}
diff --git a/frontend/gamma/tests/tests/Clipperz/Date.html b/frontend/gamma/tests/tests/Clipperz/Date.html
index 1f425c8..5d6a12e 100644
--- a/frontend/gamma/tests/tests/Clipperz/Date.html
+++ b/frontend/gamma/tests/tests/Clipperz/Date.html
@@ -1,51 +1,49 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.Date - TEST</title> 26 <title>Clipperz.Date - TEST</title>
29 27
30 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/Date.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
41 39
42 40
43 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 41 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
44 42
45</head> 43</head>
46<body> 44<body>
47<pre id="test"> 45<pre id="test">
48<script type="text/javascript" src="Date.test.js"></script> 46<script type="text/javascript" src="Date.test.js"></script>
49</pre> 47</pre>
50</body> 48</body>
51</html> 49</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/Date.test.js b/frontend/gamma/tests/tests/Clipperz/Date.test.js
index f184fd6..7deda3f 100644
--- a/frontend/gamma/tests/tests/Clipperz/Date.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/Date.test.js
@@ -1,63 +1,61 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26var tests = { 24var tests = {
27 25
28 '001_test': function () { 26 '001_test': function () {
29 vardate; 27 vardate;
30 var locale; 28 var locale;
31 29
32 // date = new Date(0); 30 // date = new Date(0);
33 // date.setMilliseconds(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC")); 31 // date.setMilliseconds(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC"));
34 32
35 date = new Date(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC")); 33 date = new Date(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC"));
36 34
37 locale = { 35 locale = {
38 'amDesignation':"am", 36 'amDesignation':"am",
39 'pmDesignation':"pm", 37 'pmDesignation':"pm",
40 // 'shortDateFormat':"d/m/y", 38 // 'shortDateFormat':"d/m/y",
41 // 'longDateFormat':"", 39 // 'longDateFormat':"",
42 'months': ["January", "February", "March","April", 40 'months': ["January", "February", "March","April",
43 "May", "June", "July", "August", 41 "May", "June", "July", "August",
44 "September", "October", "November", "December"], 42 "September", "October", "November", "December"],
45 'shortMonths': ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], 43 'shortMonths': ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
46 'days': ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], 44 'days': ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
47 'shortDays': ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ] 45 'shortDays': ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ]
48 } 46 }
49 47
50 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "d/m/y", locale), '21/09/07', "formatDate - 1"); 48 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "d/m/y", locale), '21/09/07', "formatDate - 1");
51 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D M Y", locale), 'Fri Sep 2007', "formatDate - 2"); 49 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D M Y", locale), 'Fri Sep 2007', "formatDate - 2");
52 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y", locale), 'Fri, 21 Sep 2007', "formatDate - 3"); 50 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y", locale), 'Fri, 21 Sep 2007', "formatDate - 3");
53 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s", locale), 'Fri, 21 Sep 2007 12:04:24', "formatDate - 4"); 51 is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s", locale), 'Fri, 21 Sep 2007 12:04:24', "formatDate - 4");
54 // is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s (T)", locale), 'Fri, 21 Sep 2007 11:04:24 (CEST)', "formatDate - 5"); 52 // is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s (T)", locale), 'Fri, 21 Sep 2007 11:04:24 (CEST)', "formatDate - 5");
55 }, 53 },
56 54
57 //------------------------------------------------------------------------- 55 //-------------------------------------------------------------------------
58 'syntaxFix': MochiKit.Base.noop 56 'syntaxFix': MochiKit.Base.noop
59} 57}
60 58
61//============================================================================= 59//=============================================================================
62 60
63SimpleTest.runDeferredTests("Clipperz.Date", tests, {trace:false}); 61SimpleTest.runDeferredTests("Clipperz.Date", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js
index 3c407f7..ed9fc09 100644
--- a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js
+++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26var testData = {} 24var testData = {}
27 25
28testData['Barb_Newman_data'] = ""; 26testData['Barb_Newman_data'] = "";
29testData['Barb_Newman_data'] = testData['Barb_Newman_data'] + 27testData['Barb_Newman_data'] = testData['Barb_Newman_data'] +
30 "[Domain Administration Account]" + "\n" + 28 "[Domain Administration Account]" + "\n" +
31 "Group: Windows" + "\n" + 29 "Group: Windows" + "\n" +
32 "User Name: _ABC" + "\n" + 30 "User Name: _ABC" + "\n" +
33 "URL: " + "\n" + 31 "URL: " + "\n" +
34 "Password: 123456" + "\n" + 32 "Password: 123456" + "\n" +
35 "Notes: " + "\n" + 33 "Notes: " + "\n" +
36 "" + "\n" + 34 "" + "\n" +
37 "[Enquiro Domain]" + "\n" + 35 "[Enquiro Domain]" + "\n" +
38 "Group: Windows" + "\n" + 36 "Group: Windows" + "\n" +
39 "User Name: ABC" + "\n" + 37 "User Name: ABC" + "\n" +
40 "URL: " + "\n" + 38 "URL: " + "\n" +
41 "Password: 123456" + "\n" + 39 "Password: 123456" + "\n" +
42 "Notes: This is an Exchange Mailbox checked by IT/Programming" + "\n" + 40 "Notes: This is an Exchange Mailbox checked by IT/Programming" + "\n" +
43 "" + "\n" + 41 "" + "\n" +
44 "[Enquiro Domain Administrator Account]" + "\n" + 42 "[Enquiro Domain Administrator Account]" + "\n" +
45 "Group: Windows" + "\n" + 43 "Group: Windows" + "\n" +
46 "User Name: ENQUIRO\ABC" + "\n" + 44 "User Name: ENQUIRO\ABC" + "\n" +
47 "URL: " + "\n" + 45 "URL: " + "\n" +
48 "Password: 123456" + "\n" + 46 "Password: 123456" + "\n" +
49 "Notes: Obsolete" + "\n" + 47 "Notes: Obsolete" + "\n" +
50 "" + "\n" + 48 "" + "\n" +
51 "[Enquiro Domain Administrator Account]" + "\n" + 49 "[Enquiro Domain Administrator Account]" + "\n" +
52 "Group: Windows" + "\n" + 50 "Group: Windows" + "\n" +
53 "User Name: ENQUIRO\ABC" + "\n" + 51 "User Name: ENQUIRO\ABC" + "\n" +
54 "URL: " + "\n" + 52 "URL: " + "\n" +
55 "Password: 123456" + "\n" + 53 "Password: 123456" + "\n" +
56 "Notes: Changed on 07 Sep 2007 by Randy Kissick" + "\n" + 54 "Notes: Changed on 07 Sep 2007 by Randy Kissick" + "\n" +
57 "" + "\n" + 55 "" + "\n" +
58 "[Enquiro Domain Previous Administrator Account]" + "\n" + 56 "[Enquiro Domain Previous Administrator Account]" + "\n" +
59 "Group: Windows" + "\n" + 57 "Group: Windows" + "\n" +
60 "User Name: ENQUIRO\ABC" + "\n" + 58 "User Name: ENQUIRO\ABC" + "\n" +
61 "URL: " + "\n" + 59 "URL: " + "\n" +
62 "Password: 123456" + "\n" + 60 "Password: 123456" + "\n" +
63 "Notes: ENSQL1" + "\n" + 61 "Notes: ENSQL1" + "\n" +
64 "" + "\n" + 62 "" + "\n" +
65 "[Local Administrator Account for most Machines]" + "\n" + 63 "[Local Administrator Account for most Machines]" + "\n" +
66 "Group: Windows" + "\n" + 64 "Group: Windows" + "\n" +
67 "User Name: ABC" + "\n" + 65 "User Name: ABC" + "\n" +
68 "URL: " + "\n" + 66 "URL: " + "\n" +
69 "Password: 123456" + "\n" + 67 "Password: 123456" + "\n" +
70 "Notes: " + "\n" + 68 "Notes: " + "\n" +
71 "" + "\n" + 69 "" + "\n" +
72 "[Local Administrator Account for some Machines]" + "\n" + 70 "[Local Administrator Account for some Machines]" + "\n" +
73 "Group: Windows" + "\n" + 71 "Group: Windows" + "\n" +
74 "User Name: ABC" + "\n" + 72 "User Name: ABC" + "\n" +
75 "URL: " + "\n" + 73 "URL: " + "\n" +
76 "Password: 123456" + "\n" + 74 "Password: 123456" + "\n" +
77 "Notes: " + "\n" + 75 "Notes: " + "\n" +
78 "" + "\n" + 76 "" + "\n" +
79 "[Bugzilla]" + "\n" + 77 "[Bugzilla]" + "\n" +
80 "Group: Hardware" + "\n" + 78 "Group: Hardware" + "\n" +
81 "User Name: ABC" + "\n" + 79 "User Name: ABC" + "\n" +
82 "URL: " + "\n" + 80 "URL: " + "\n" +
83 "Password: 123456" + "\n" + 81 "Password: 123456" + "\n" +
84 "Notes: BUGZILLA" + "\n" + 82 "Notes: BUGZILLA" + "\n" +
85 "" + "\n" + 83 "" + "\n" +
86 "[Client Services Linux Box]" + "\n" + 84 "[Client Services Linux Box]" + "\n" +
87 "Group: Hardware" + "\n" + 85 "Group: Hardware" + "\n" +
88 "User Name: ABC" + "\n" + 86 "User Name: ABC" + "\n" +
89 "URL: " + "\n" + 87 "URL: " + "\n" +
90 "Password: 123456" + "\n" + 88 "Password: 123456" + "\n" +
91 "Notes: 192.168.1.141" + "\n" + 89 "Notes: 192.168.1.141" + "\n" +
92 "" + "\n" + 90 "" + "\n" +
93 "[ENSQL2 BIOS]" + "\n" + 91 "[ENSQL2 BIOS]" + "\n" +
94 "Group: Hardware" + "\n" + 92 "Group: Hardware" + "\n" +
95 "User Name: " + "\n" + 93 "User Name: " + "\n" +
96 "URL: " + "\n" + 94 "URL: " + "\n" +
97 "Password: 123456" + "\n" + 95 "Password: 123456" + "\n" +
98 "Notes: " + "\n" + 96 "Notes: " + "\n" +
99 "" + "\n" + 97 "" + "\n" +
100 "[Eye Tracking PC]" + "\n" + 98 "[Eye Tracking PC]" + "\n" +
101 "Group: Hardware" + "\n" + 99 "Group: Hardware" + "\n" +
102 "User Name: ABC" + "\n" + 100 "User Name: ABC" + "\n" +
103 "URL: " + "\n" + 101 "URL: " + "\n" +
104 "Password: 123456" + "\n" + 102 "Password: 123456" + "\n" +
105 "Notes: " + "\n" + 103 "Notes: " + "\n" +
106 "" + "\n" + 104 "" + "\n" +
107 "[IT Linux Box (Brainiac)]" + "\n" + 105 "[IT Linux Box (Brainiac)]" + "\n" +
108 "Group: Hardware" + "\n" + 106 "Group: Hardware" + "\n" +
109 "User Name: ABC" + "\n" + 107 "User Name: ABC" + "\n" +
110 "URL: " + "\n" + 108 "URL: " + "\n" +
111 "Password: 123456" + "\n" + 109 "Password: 123456" + "\n" +
112 "Notes: " + "\n" + 110 "Notes: " + "\n" +
113 "" + "\n" + 111 "" + "\n" +
114 "[Maizal - Contract Developer Machine]" + "\n" + 112 "[Maizal - Contract Developer Machine]" + "\n" +
115 "Group: Hardware" + "\n" + 113 "Group: Hardware" + "\n" +
116 "User Name: ABC" + "\n" + 114 "User Name: ABC" + "\n" +
117 "URL: 199.185.139.69:3399" + "\n" + 115 "URL: 199.185.139.69:3399" + "\n" +
118 "Password: 123456" + "\n" + 116 "Password: 123456" + "\n" +
diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html
index 969b517..f2dc9ad 100644
--- a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html
+++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html
@@ -1,56 +1,54 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.KeePassExportProcessor - test</title> 26 <title>Clipperz.KeePassExportProcessor - test</title>
29 27
30 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
39 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
41 <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script> 39 <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script>
42 40
43 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 41 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
44 42
45 <!-- script type="text/javascript" src="./KeePassExportProcessor.data.js"></script> 43 <!-- script type="text/javascript" src="./KeePassExportProcessor.data.js"></script>
46 <script type="text/javascript" src="./KeePassExportProcessor.test.js"></script --> 44 <script type="text/javascript" src="./KeePassExportProcessor.test.js"></script -->
47 45
48</head> 46</head>
49<body> 47<body>
50 48
51<pre id="test"> 49<pre id="test">
52<script type="text/javascript" src="./KeePassExportProcessor.data.js"></script> 50<script type="text/javascript" src="./KeePassExportProcessor.data.js"></script>
53<script type="text/javascript" src="./KeePassExportProcessor.test.js"></script> 51<script type="text/javascript" src="./KeePassExportProcessor.test.js"></script>
54</pre> 52</pre>
55</body> 53</body>
56</html> 54</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js
index 4d1aa12..4099aee 100644
--- a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26var tests = { 24var tests = {
27 25
28 //------------------------------------------------------------------------- 26 //-------------------------------------------------------------------------
29 27
30 'test1_test': function (someTestArgs) { 28 'test1_test': function (someTestArgs) {
31 var deferredResult; 29 var deferredResult;
32 varkeePassProcessor; 30 varkeePassProcessor;
33 31
34 keePassProcessor = new Clipperz.KeePassExportProcessor(); 32 keePassProcessor = new Clipperz.KeePassExportProcessor();
35 33
36 deferredResult = new Clipperz.Async.Deferred("test1_test", someTestArgs); 34 deferredResult = new Clipperz.Async.Deferred("test1_test", someTestArgs);
37 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\n" }); 35 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\n" });
38 deferredResult.addMethod(keePassProcessor, 'deferredParse'); 36 deferredResult.addMethod(keePassProcessor, 'deferredParse');
39 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\"}]", "first test"); }); 37 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\"}]", "first test"); });
40 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 38 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
41 39
42 deferredResult.callback(); 40 deferredResult.callback();
43 41
44 return deferredResult; 42 return deferredResult;
45 }, 43 },
46 44
47 'test2_test': function (someTestArgs) { 45 'test2_test': function (someTestArgs) {
48 var deferredResult; 46 var deferredResult;
49 varkeePassProcessor; 47 varkeePassProcessor;
50 48
51 keePassProcessor = new Clipperz.KeePassExportProcessor(); 49 keePassProcessor = new Clipperz.KeePassExportProcessor();
52 50
53 deferredResult = new Clipperz.Async.Deferred("test2_test", someTestArgs); 51 deferredResult = new Clipperz.Async.Deferred("test2_test", someTestArgs);
54 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" }); 52 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" });
55 deferredResult.addMethod(keePassProcessor, 'deferredParse'); 53 deferredResult.addMethod(keePassProcessor, 'deferredParse');
56 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "second test"); }); 54 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "second test"); });
57 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 55 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
58 56
59 deferredResult.callback(); 57 deferredResult.callback();
60 58
61 return deferredResult; 59 return deferredResult;
62 }, 60 },
63 61
64 'test3_test': function (someTestArgs) { 62 'test3_test': function (someTestArgs) {
65 var deferredResult; 63 var deferredResult;
66 varkeePassProcessor; 64 varkeePassProcessor;
67 65
68 keePassProcessor = new Clipperz.KeePassExportProcessor(); 66 keePassProcessor = new Clipperz.KeePassExportProcessor();
69 67
70 deferredResult = new Clipperz.Async.Deferred("test3_test", someTestArgs); 68 deferredResult = new Clipperz.Async.Deferred("test3_test", someTestArgs);
71 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\nwith some notes stored\non multiple lines\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" }); 69 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\nwith some notes stored\non multiple lines\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" });
72 deferredResult.addMethod(keePassProcessor, 'deferredParse'); 70 deferredResult.addMethod(keePassProcessor, 'deferredParse');
73 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\\nwith some notes stored\\non multiple lines\\n\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "third test"); }); 71 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\\nwith some notes stored\\non multiple lines\\n\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "third test"); });
74 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 72 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
75 73
76 deferredResult.callback(); 74 deferredResult.callback();
77 75
78 return deferredResult; 76 return deferredResult;
79 }, 77 },
80 78
81 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
82 80
83 'Barb_Newman_test': function (someTestArgs) { 81 'Barb_Newman_test': function (someTestArgs) {
84 var deferredResult; 82 var deferredResult;
85 varkeePassProcessor; 83 varkeePassProcessor;
86 84
87 keePassProcessor = new Clipperz.KeePassExportProcessor(); 85 keePassProcessor = new Clipperz.KeePassExportProcessor();
88 86
89 deferredResult = new Clipperz.Async.Deferred("Barb_Newman_test", someTestArgs); 87 deferredResult = new Clipperz.Async.Deferred("Barb_Newman_test", someTestArgs);
90 // deferredResult.addCallback(function () { return testData['Barb_Newman_data']; }); 88 // deferredResult.addCallback(function () { return testData['Barb_Newman_data']; });
91 deferredResult.addMethod(keePassProcessor, 'deferredParse'); 89 deferredResult.addMethod(keePassProcessor, 'deferredParse');
92 deferredResult.addBoth(function(aResult) { 90 deferredResult.addBoth(function(aResult) {
93 SimpleTest.is(aResult.length, 121, "Barb's data contains 121 records"); 91 SimpleTest.is(aResult.length, 121, "Barb's data contains 121 records");
94 return aResult; 92 return aResult;
95 }); 93 });
96 deferredResult.addBoth(function(aResult) { 94 deferredResult.addBoth(function(aResult) {
97 SimpleTest.is(MochiKit.Base.serializeJSON(aResult[0]), "{\"Title\":\"Domain Administration Account\", \"Group\":\"Windows\", \"User Name\":\"_ABC\", \"URL\":\"\", \"Password\":\"123456\", \"Notes\":\"\"}", "Barb's first record data matches"); 95 SimpleTest.is(MochiKit.Base.serializeJSON(aResult[0]), "{\"Title\":\"Domain Administration Account\", \"Group\":\"Windows\", \"User Name\":\"_ABC\", \"URL\":\"\", \"Password\":\"123456\", \"Notes\":\"\"}", "Barb's first record data matches");
98 return aResult; 96 return aResult;
99 }); 97 });
100 // deferredResult.callback(); 98 // deferredResult.callback();
101 deferredResult.callback(testData['Barb_Newman_data']); 99 deferredResult.callback(testData['Barb_Newman_data']);
102 100
103 return deferredResult; 101 return deferredResult;
104 }, 102 },
105 103
106 //------------------------------------------------------------------------- 104 //-------------------------------------------------------------------------
107/* 105/*
108 'Jordan_Curzon_test': function (someTestArgs) { 106 'Jordan_Curzon_test': function (someTestArgs) {
109 var deferredResult; 107 var deferredResult;
110 varkeePassProcessor; 108 varkeePassProcessor;
111 109
112 keePassProcessor = new Clipperz.KeePassExportProcessor(); 110 keePassProcessor = new Clipperz.KeePassExportProcessor();
113 111
114 deferredResult = new Clipperz.Async.Deferred("Jordan_Curzon_test", someTestArgs); 112 deferredResult = new Clipperz.Async.Deferred("Jordan_Curzon_test", someTestArgs);
115 deferredResult.addCallback(function () { return testData['Jordan_Curzon_data']; }); 113 deferredResult.addCallback(function () { return testData['Jordan_Curzon_data']; });
116 deferredResult.addMethod(keePassProcessor, 'deferredParse'); 114 deferredResult.addMethod(keePassProcessor, 'deferredParse');
117 deferredResult.addBoth(function(aResult) { 115 deferredResult.addBoth(function(aResult) {
118 SimpleTest.is(aResult.length, 2, "Jordarn's data contains 2 records"); 116 SimpleTest.is(aResult.length, 2, "Jordarn's data contains 2 records");
diff --git a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html
index ece8a9c..19dbd8b 100644
--- a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html
+++ b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html
@@ -1,49 +1,47 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 27 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
30 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 28 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
31 29
32 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 30 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
33 31
34 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
35 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 33 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
36 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script> 34 <script type='text/javascript' src='../../../js/Clipperz/ByteArray.js'></script>
37 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 35 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
39 37
40 <script type='text/javascript' src='../../../js/Clipperz/KeyValueObjectStore.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/KeyValueObjectStore.js'></script>
41 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 39 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
42</head> 40</head>
43<body> 41<body>
44 42
45<pre id="test"> 43<pre id="test">
46<script type="text/javascript" src="KeyValueObjectStore.test.js"></script> 44<script type="text/javascript" src="KeyValueObjectStore.test.js"></script>
47</pre> 45</pre>
48</body> 46</body>
49</html> 47</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js
index ac56386..3fbbe7e 100644
--- a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26var tests = { 24var tests = {
27 25
28 //------------------------------------------------------------------------- 26 //-------------------------------------------------------------------------
29 27
30 'simple_tests': function() { 28 'simple_tests': function() {
31 vardeferredResult; 29 vardeferredResult;
32 30
33 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); 31 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
34 deferredResult.addCallback(function() { 32 deferredResult.addCallback(function() {
35 varobjectStore; 33 varobjectStore;
36 34
37 objectStore = new Clipperz.KeyValueObjectStore(); 35 objectStore = new Clipperz.KeyValueObjectStore();
38 36
39 ok(objectStore != null, "created an object store"); 37 ok(objectStore != null, "created an object store");
40 38
41 objectStore.setValue('key', "value"); 39 objectStore.setValue('key', "value");
42 is(objectStore.getValue('key'), "value", "can store and read a value to a simple key"); 40 is(objectStore.getValue('key'), "value", "can store and read a value to a simple key");
43 41
44 objectStore.setValue('key', "overwritten value"); 42 objectStore.setValue('key', "overwritten value");
45 is(objectStore.getValue('key'), "overwritten value", "using the same key overwrites the previous value"); 43 is(objectStore.getValue('key'), "overwritten value", "using the same key overwrites the previous value");
46 44
47 objectStore.setValue('record.keys', [1, 2, 3]); 45 objectStore.setValue('record.keys', [1, 2, 3]);
48 is( 46 is(
49 MochiKit.Base.compare(objectStore.getValue('record'), {'keys': [1,2,3]}), 47 MochiKit.Base.compare(objectStore.getValue('record'), {'keys': [1,2,3]}),
50 0, 48 0,
51 "getting a partial key returns the whole content associate with that key" 49 "getting a partial key returns the whole content associate with that key"
52 ); 50 );
53 is( 51 is(
54 MochiKit.Base.compare(objectStore.getValue('record.keys'), [1,2,3]), 52 MochiKit.Base.compare(objectStore.getValue('record.keys'), [1,2,3]),
55 0, 53 0,
56 "accessing data using a key.path return the matching content" 54 "accessing data using a key.path return the matching content"
57 ); 55 );
58 is( 56 is(
59 MochiKit.Base.compare(objectStore.getValue('record.keys.1'), 2), 57 MochiKit.Base.compare(objectStore.getValue('record.keys.1'), 2),
60 0, 58 0,
61 "accessing data using a key.path return the matching content, even inside an array" 59 "accessing data using a key.path return the matching content, even inside an array"
62 ); 60 );
63 61
64 is( 62 is(
65 objectStore.setValue('key', "value"), 63 objectStore.setValue('key', "value"),
66 "value", 64 "value",
67 "setting a value return the value itself, as a convenience to chain deferred methods" 65 "setting a value return the value itself, as a convenience to chain deferred methods"
68 ); 66 );
69 67
70 is( 68 is(
71 objectStore.getValue('not_set_key'), 69 objectStore.getValue('not_set_key'),
72 null, 70 null,
73 "accessing a previously undefined key will return null" 71 "accessing a previously undefined key will return null"
74 ); 72 );
75 is( 73 is(
76 objectStore.getValue('record.not_set_key'), 74 objectStore.getValue('record.not_set_key'),
77 null, 75 null,
78 "accessing a previously undefined key will return null, even if part of the path is defined" 76 "accessing a previously undefined key will return null, even if part of the path is defined"
79 ); 77 );
80 is( 78 is(
81 objectStore.getValue('not_set_path.not_set_key'), 79 objectStore.getValue('not_set_path.not_set_key'),
82 null, 80 null,
83 "accessing a previously undefined key will return null, even if using a completely undefined path" 81 "accessing a previously undefined key will return null, even if using a completely undefined path"
84 ); 82 );
85 83
86 objectStore.removeAllData(); 84 objectStore.removeAllData();
87 is( 85 is(
88 objectStore.getValue('key'), 86 objectStore.getValue('key'),
89 null, 87 null,
90 "getting a value after a 'removeAllData' return no value" 88 "getting a value after a 'removeAllData' return no value"
91 ); 89 );
92 90
93 }); 91 });
94 92
95 deferredResult.callback(); 93 deferredResult.callback();
96 94
97 return deferredResult; 95 return deferredResult;
98 }, 96 },
99 97
100 //------------------------------------------------------------------------- 98 //-------------------------------------------------------------------------
101 99
102 'simple_deferredGetOrSet_test': function () { 100 'simple_deferredGetOrSet_test': function () {
103 vardeferredResult; 101 vardeferredResult;
104 varobjectStore; 102 varobjectStore;
105 var testValue; 103 var testValue;
106 104
107 objectStore = new Clipperz.KeyValueObjectStore(); 105 objectStore = new Clipperz.KeyValueObjectStore();
108 testValue = "nifty test value"; 106 testValue = "nifty test value";
109 107
110 deferredResult = new Clipperz.Async.Deferred("simple_deferredGetOrSet_test", {trace:false}); 108 deferredResult = new Clipperz.Async.Deferred("simple_deferredGetOrSet_test", {trace:false});
111 deferredResult.addMethod(objectStore, 'setValue', 'key', testValue); 109 deferredResult.addMethod(objectStore, 'setValue', 'key', testValue);
112 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return testValue}); 110 deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return testValue});
113 deferredResult.addCallback(function(aResult) { 111 deferredResult.addCallback(function(aResult) {
114 SimpleTest.is(aResult, testValue, "deferredGetOrSet works when accessing data already present on the object store"); 112 SimpleTest.is(aResult, testValue, "deferredGetOrSet works when accessing data already present on the object store");
115 }) 113 })
116 deferredResult.callback(); 114 deferredResult.callback();
117 }, 115 },
118 116
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html
index b61057c..1a127a0 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html
@@ -1,56 +1,54 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.BookmarkletProcessor - test</title> 26 <title>Clipperz.PM.BookmarkletProcessor - test</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
42 40
43 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script>
46 44
47 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 45 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
48 46
49</head> 47</head>
50<body> 48<body>
51 49
52<pre id="test"> 50<pre id="test">
53<script type="text/javascript" src="BookmarkletProcessor.test.js"></script> 51<script type="text/javascript" src="BookmarkletProcessor.test.js"></script>
54</pre> 52</pre>
55</body> 53</body>
56</html> 54</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js
index 45bf76b..bcb77ea 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26function testBookmarkletConfigurationString (aConfiguration, shouldFail, aMessage) { 24function testBookmarkletConfigurationString (aConfiguration, shouldFail, aMessage) {
27 //var configuration; 25 //var configuration;
28 26
29//try { 27//try {
30 //configuration = Clipperz.Base.evalJSON(aConfiguration); 28 //configuration = Clipperz.Base.evalJSON(aConfiguration);
31//} catch (exception) { 29//} catch (exception) {
32 //console.log("EXCEPTION", exception); 30 //console.log("EXCEPTION", exception);
33 //throw exception; 31 //throw exception;
34//} 32//}
35 33
36//console.log("configuration", configuration); 34//console.log("configuration", configuration);
37 35
38 if (shouldFail == true) { 36 if (shouldFail == true) {
39 try { 37 try {
40 Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration); 38 Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration);
41 SimpleTest.ok(false, "vulnerability not caught - " + aMessage); 39 SimpleTest.ok(false, "vulnerability not caught - " + aMessage);
42 } catch(exception) { 40 } catch(exception) {
43 SimpleTest.ok(true, "vulnerability correctly caught - " + aMessage); 41 SimpleTest.ok(true, "vulnerability correctly caught - " + aMessage);
44 } 42 }
45 } else { 43 } else {
46 try { 44 try {
47 Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration); 45 Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration);
48 SimpleTest.ok(true, "configuration correctly checked - " + aMessage); 46 SimpleTest.ok(true, "configuration correctly checked - " + aMessage);
49 } catch(exception) { 47 } catch(exception) {
50 SimpleTest.ok(false, "configuration wrongly caught as malicious - " + aMessage); 48 SimpleTest.ok(false, "configuration wrongly caught as malicious - " + aMessage);
51 // console.log(exception); 49 // console.log(exception);
52 } 50 }
53 } 51 }
54} 52}
55 53
56//############################################################################# 54//#############################################################################
57 55
58var tests = { 56var tests = {
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'simpleAmazonConfiguration_test': function () { 60 'simpleAmazonConfiguration_test': function () {
63 var bookmarkletConfigurationString; 61 var bookmarkletConfigurationString;
64 62
65 bookmarkletConfigurationString = "{"+ 63 bookmarkletConfigurationString = "{"+
66 "\"page\": {\"title\": \"Sign In\"},\n" + 64 "\"page\": {\"title\": \"Sign In\"},\n" +
67 "\"form\": {" + 65 "\"form\": {" +
68 "\"attributes\": {" + 66 "\"attributes\": {" +
69 "\"action\": \"https://www.amazon.com/gp/flex/sign-in/select.html\",\n" + 67 "\"action\": \"https://www.amazon.com/gp/flex/sign-in/select.html\",\n" +
70 "\"method\": \"post\"" + 68 "\"method\": \"post\"" +
71 "},\n" + 69 "},\n" +
72 "\"inputs\": [" + 70 "\"inputs\": [" +
73 "{\"type\": \"hidden\",\n\"name\": \"path\",\n\"value\": \"/gp/yourstore\"},\n" + 71 "{\"type\": \"hidden\",\n\"name\": \"path\",\n\"value\": \"/gp/yourstore\"},\n" +
74 "{\"type\": \"hidden\",\n\"name\": \"useRedirectOnSuccess\",\n\"value\": \"1\"},\n" + 72 "{\"type\": \"hidden\",\n\"name\": \"useRedirectOnSuccess\",\n\"value\": \"1\"},\n" +
75 "{\"type\": \"hidden\",\n\"name\": \"query\",\n\"value\": \"signIn=1&action=sign-out&useRedirectOnSuccess=1&path=/gp/yourstore&ref_=pd_irl_gw_r\"},\n" + 73 "{\"type\": \"hidden\",\n\"name\": \"query\",\n\"value\": \"signIn=1&action=sign-out&useRedirectOnSuccess=1&path=/gp/yourstore&ref_=pd_irl_gw_r\"},\n" +
76 "{\"type\": \"hidden\",\n\"name\": \"mode\",\n\"value\": \"\"},\n" + 74 "{\"type\": \"hidden\",\n\"name\": \"mode\",\n\"value\": \"\"},\n" +
77 "{\"type\": \"hidden\",\n\"name\": \"redirectProtocol\",\n\"value\": \"\"},\n" + 75 "{\"type\": \"hidden\",\n\"name\": \"redirectProtocol\",\n\"value\": \"\"},\n" +
78 "{\"type\": \"hidden\",\n\"name\": \"pageAction\",\n\"value\": \"/gp/yourstore\"},\n" + 76 "{\"type\": \"hidden\",\n\"name\": \"pageAction\",\n\"value\": \"/gp/yourstore\"},\n" +
79 "{\"type\": \"hidden\",\n\"name\": \"disableCorpSignUp\",\n\"value\": \"\"},\n" + 77 "{\"type\": \"hidden\",\n\"name\": \"disableCorpSignUp\",\n\"value\": \"\"},\n" +
80 "{\"type\": \"hidden\",\n\"name\": \"protocol\",\n\"value\": \"https\"},\n" + 78 "{\"type\": \"hidden\",\n\"name\": \"protocol\",\n\"value\": \"https\"},\n" +
81 "{\"type\": \"hidden\",\n\"name\": \"sessionId\",\n\"value\": \"105-1479357-7902864\"},\n" + 79 "{\"type\": \"hidden\",\n\"name\": \"sessionId\",\n\"value\": \"105-1479357-7902864\"},\n" +
82 "{\"type\": \"hidden\",\n\"name\": \"referer\",\n\"value\": \"flex\"},\n" + 80 "{\"type\": \"hidden\",\n\"name\": \"referer\",\n\"value\": \"flex\"},\n" +
83 "{\"type\": \"text\",\n\"name\": \"email\",\n\"value\": \"\"},\n" + 81 "{\"type\": \"text\",\n\"name\": \"email\",\n\"value\": \"\"},\n" +
84 "{\"type\": \"password\",\n\"name\": \"password\",\n\"value\": \"\"},\n" + 82 "{\"type\": \"password\",\n\"name\": \"password\",\n\"value\": \"\"},\n" +
85 "{\"type\": \"hidden\",\n\"name\": \"metadata1\",\n\"value\": \"Firefox 3.0.3 Mac\"},\n" + 83 "{\"type\": \"hidden\",\n\"name\": \"metadata1\",\n\"value\": \"Firefox 3.0.3 Mac\"},\n" +
86 "{\"type\": \"hidden\",\n\"name\": \"metadataf1\",\n\"value\": \"\"},\n" + 84 "{\"type\": \"hidden\",\n\"name\": \"metadataf1\",\n\"value\": \"\"},\n" +
87 "{\"type\": \"hidden\",\n\"name\": \"metadata2\",\n\"value\": \"Default Plug-in Java Embedding Plugin 0.9.6.4 Shockwave Flash 90124RealPlayer Plugin QuickTime Plug-in 7.5.5 Flip4Mac Windows Media Plugin 2.2 4||1440-900-878-24-*-*-*\"},\n" + 85 "{\"type\": \"hidden\",\n\"name\": \"metadata2\",\n\"value\": \"Default Plug-in Java Embedding Plugin 0.9.6.4 Shockwave Flash 90124RealPlayer Plugin QuickTime Plug-in 7.5.5 Flip4Mac Windows Media Plugin 2.2 4||1440-900-878-24-*-*-*\"},\n" +
88 "{\"type\": \"hidden\",\n\"name\": \"metadata3\",\n\"value\": \"timezone: -1 execution time: 3\"},\n" + 86 "{\"type\": \"hidden\",\n\"name\": \"metadata3\",\n\"value\": \"timezone: -1 execution time: 3\"},\n" +
89 "{\"name\": \"action\",\n\"type\": \"radio\",\n\"options\": [" + 87 "{\"name\": \"action\",\n\"type\": \"radio\",\n\"options\": [" +
90 "{\"value\": \"new-user\",\n\"checked\": false},\n" + 88 "{\"value\": \"new-user\",\n\"checked\": false},\n" +
91 "{\"value\": \"sign-in\",\n\"checked\": true}" + 89 "{\"value\": \"sign-in\",\n\"checked\": true}" +
92 "]}" + 90 "]}" +
93 "]" + 91 "]" +
94 "},\n" + 92 "},\n" +
95 "\"version\": \"0.2.3\"" + 93 "\"version\": \"0.2.3\"" +
96 "}"; 94 "}";
97 testBookmarkletConfigurationString(bookmarkletConfigurationString, false, "regular Amazon.com configuration"); 95 testBookmarkletConfigurationString(bookmarkletConfigurationString, false, "regular Amazon.com configuration");
98 }, 96 },
99 97
100 //------------------------------------------------------------------------- 98 //-------------------------------------------------------------------------
101 99
102 'hackedConfigurationWithXSSAttackVectorReadyToBeTriggeredWhenActivatingTheDirectLogin_test': function () { 100 'hackedConfigurationWithXSSAttackVectorReadyToBeTriggeredWhenActivatingTheDirectLogin_test': function () {
103 var bookmarkletConfigurationString; 101 var bookmarkletConfigurationString;
104 102
105 bookmarkletConfigurationString = "{" + 103 bookmarkletConfigurationString = "{" +
106 "\"page\": {\"title\": \"Example Attack\"}," + 104 "\"page\": {\"title\": \"Example Attack\"}," +
107 "\"form\": { " + 105 "\"form\": { " +
108 "\"attributes\": { " + 106 "\"attributes\": { " +
109 "\"action\": \"javascript:opener.document.body.innerHTML = 'hacked!';close();\", " + 107 "\"action\": \"javascript:opener.document.body.innerHTML = 'hacked!';close();\", " +
110 "\"style\": \"-moz-binding:url('http://ha.ckers.org/xssmoz.xml#xss')\", " + 108 "\"style\": \"-moz-binding:url('http://ha.ckers.org/xssmoz.xml#xss')\", " +
111 "\"method\": null " + 109 "\"method\": null " +
112 "}, " + 110 "}, " +
113 "\"inputs\": [" + 111 "\"inputs\": [" +
114 "{\"type\": \"text\", \"name\": \"username\", \"value\": \"\"}, " + 112 "{\"type\": \"text\", \"name\": \"username\", \"value\": \"\"}, " +
115 "{\"type\": \"password\", \"name\": \"password\", \"value\": \"\"}" + 113 "{\"type\": \"password\", \"name\": \"password\", \"value\": \"\"}" +
116 "]" + 114 "]" +
117 "}," + 115 "}," +
118 "\"version\": \"0.2.3\" " + 116 "\"version\": \"0.2.3\" " +
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js b/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js
index 3e01411..7a4f01d 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26testData = { 24testData = {
27 25
28 //------------------------------------------------------------------------- 26 //-------------------------------------------------------------------------
29 27
30 'joe_clipperz_offline_copy_data': { 28 'joe_clipperz_offline_copy_data': {
31 users:{ 29 users:{
32 'catchAllUser': { 30 'catchAllUser': {
33 __masterkey_test_value__: 'masterkey', 31 __masterkey_test_value__: 'masterkey',
34 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 32 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
35 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 33 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
36 }, 34 },
37 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 35 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
38 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 36 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
39 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 37 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
40 version: '0.2', 38 version: '0.2',
41 maxNumberOfRecords: '100', 39 maxNumberOfRecords: '100',
42 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}', 40 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}',
43 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', 41 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
44 userDetailsVersion: '0.3', 42 userDetailsVersion: '0.3',
45 records: { 43 records: {
46 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 44 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
47 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx', 45 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
48 version: '0.2', 46 version: '0.2',
49 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 47 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
50 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 48 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
51 accessDate: 'Mon Jan 19 16:10:04 CET 2009', 49 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
52 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 50 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
53 versions: { 51 versions: {
54 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 52 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
55 header: '####', 53 header: '####',
56 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 54 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
57 version: '0.2', 55 version: '0.2',
58 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 56 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
59 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 57 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
60 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 58 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
61 } 59 }
62 } 60 }
63 }, 61 },
64 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 62 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
65 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL', 63 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
66 version: '0.3', 64 version: '0.3',
67 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 65 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
68 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 66 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
69 accessDate: 'Mon Jan 19 16:09:39 CET 2009', 67 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
70 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 68 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
71 versions: { 69 versions: {
72 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 70 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
73 header: '####', 71 header: '####',
74 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 72 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
75 version: '0.3', 73 version: '0.3',
76 creationDate: 'Fri Oct 17 17:00:31 CEST 2008', 74 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
77 updateDate: 'Fri Oct 17 17:00:31 CEST 2008', 75 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
78 accessDate: 'Fri Oct 17 17:00:31 CEST 2008' 76 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
79 }, 77 },
80 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 78 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
81 header: '####', 79 header: '####',
82 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 80 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
83 version: '0.3', 81 version: '0.3',
84 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 82 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
85 updateDate: 'Fri Oct 17 16:49:20 CEST 2008', 83 updateDate: 'Fri Oct 17 16:49:20 CEST 2008',
86 accessDate: 'Fri Oct 17 16:54:23 CEST 2008' 84 accessDate: 'Fri Oct 17 16:54:23 CEST 2008'
87 }, 85 },
88 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': { 86 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
89 header: '####', 87 header: '####',
90 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==', 88 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
91 version: '0.3', 89 version: '0.3',
92 creationDate: 'Fri Oct 17 17:00:13 CEST 2008', 90 creationDate: 'Fri Oct 17 17:00:13 CEST 2008',
93 updateDate: 'Fri Oct 17 17:00:13 CEST 2008', 91 updateDate: 'Fri Oct 17 17:00:13 CEST 2008',
94 accessDate: 'Fri Oct 17 17:00:13 CEST 2008' 92 accessDate: 'Fri Oct 17 17:00:13 CEST 2008'
95 }, 93 },
96 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': { 94 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
97 header: '####', 95 header: '####',
98 data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==', 96 data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==',
99 version: '0.3', 97 version: '0.3',
100 creationDate: 'Fri Oct 17 16:59:31 CEST 2008', 98 creationDate: 'Fri Oct 17 16:59:31 CEST 2008',
101 updateDate: 'Fri Oct 17 16:59:31 CEST 2008', 99 updateDate: 'Fri Oct 17 16:59:31 CEST 2008',
102 accessDate: 'Fri Oct 17 16:59:31 CEST 2008' 100 accessDate: 'Fri Oct 17 16:59:31 CEST 2008'
103 }, 101 },
104 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { 102 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
105 header: '####', 103 header: '####',
106 data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==', 104 data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==',
107 version: '0.3', 105 version: '0.3',
108 creationDate: 'Mon Oct 27 08:58:49 CET 2008', 106 creationDate: 'Mon Oct 27 08:58:49 CET 2008',
109 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 107 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
110 accessDate: 'Mon Jan 19 16:09:39 CET 2009' 108 accessDate: 'Mon Jan 19 16:09:39 CET 2009'
111 }, 109 },
112 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': { 110 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
113 header: '####', 111 header: '####',
114 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==', 112 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
115 version: '0.3', 113 version: '0.3',
116 creationDate: 'Fri Oct 17 16:57:17 CEST 2008', 114 creationDate: 'Fri Oct 17 16:57:17 CEST 2008',
117 updateDate: 'Fri Oct 17 16:57:17 CEST 2008', 115 updateDate: 'Fri Oct 17 16:57:17 CEST 2008',
118 accessDate: 'Fri Oct 17 16:57:17 CEST 2008' 116 accessDate: 'Fri Oct 17 16:57:17 CEST 2008'
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.html b/frontend/gamma/tests/tests/Clipperz/PM/Connection.html
index e2a3394..1f3a472 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Connection.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.html
@@ -1,68 +1,66 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.Connection - test</title> 26 <title>Clipperz.PM.Connection - test</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
43 41
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
57 55
58 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 56 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
59 57
60</head> 58</head>
61<body> 59<body>
62 60
63<pre id="test"> 61<pre id="test">
64<script type="text/javascript" src="Connection.data.js"></script> 62<script type="text/javascript" src="Connection.data.js"></script>
65<script type="text/javascript" src="Connection.test.js"></script> 63<script type="text/javascript" src="Connection.test.js"></script>
66</pre> 64</pre>
67</body> 65</body>
68</html> 66</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js
index 9d0036a..df409c0 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 24Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
27 25
28var tests = { 26var tests = {
29 27
30 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
31 29
32 'simple_tests': function () { 30 'simple_tests': function () {
33 vardeferredResult; 31 vardeferredResult;
34 32
35 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); 33 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
36 deferredResult.addCallback(function() { 34 deferredResult.addCallback(function() {
37 var connection; 35 var connection;
38 36
39 SimpleTest.is(Clipperz.PM.Connection.communicationProtocol.versions['current'], Clipperz.PM.Connection.SRP['1.1'], "the current connection is 1.1"); 37 SimpleTest.is(Clipperz.PM.Connection.communicationProtocol.versions['current'], Clipperz.PM.Connection.SRP['1.1'], "the current connection is 1.1");
40 38
41 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current'](); 39 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']();
42 SimpleTest.ok(connection != null, "can create a connection with the 'current' communication protocol"); 40 SimpleTest.ok(connection != null, "can create a connection with the 'current' communication protocol");
43 41
44 SimpleTest.is(connection.proxy(), Clipperz.PM.Proxy.defaultProxy, "the connection uses the defaultProxy if no proxy is specified on the constructor"); 42 SimpleTest.is(connection.proxy(), Clipperz.PM.Proxy.defaultProxy, "the connection uses the defaultProxy if no proxy is specified on the constructor");
45 }); 43 });
46 44
47 deferredResult.callback(); 45 deferredResult.callback();
48 46
49 return deferredResult; 47 return deferredResult;
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'simpleProxy_tests': function () { 52 'simpleProxy_tests': function () {
55 vardeferredResult; 53 vardeferredResult;
56 54
57 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); 55 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
58 deferredResult.addCallback(function() { 56 deferredResult.addCallback(function() {
59 var connection; 57 var connection;
60 var proxy; 58 var proxy;
61 59
62 proxy = new Clipperz.PM.Proxy(); 60 proxy = new Clipperz.PM.Proxy();
63 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({proxy:proxy}); 61 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({proxy:proxy});
64 SimpleTest.is(connection.proxy(), proxy, "the connection uses the specified proxy, when present"); 62 SimpleTest.is(connection.proxy(), proxy, "the connection uses the specified proxy, when present");
65 }); 63 });
66 64
67 deferredResult.callback(); 65 deferredResult.callback();
68 66
69 return deferredResult; 67 return deferredResult;
70 }, 68 },
71 69
72 //------------------------------------------------------------------------- 70 //-------------------------------------------------------------------------
73 71
74 'login_test': function () { 72 'login_test': function () {
75 var deferredResult; 73 var deferredResult;
76 var connection; 74 var connection;
77 var proxy; 75 var proxy;
78 76
79 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, shouldCheckExpectedRequests:true}); 77 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, shouldCheckExpectedRequests:true});
80 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({ 78 connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({
81 proxy: proxy, 79 proxy: proxy,
82 getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; } 80 getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; }
83 }); 81 });
84 82
85 deferredResult = new Clipperz.Async.Deferred("login_tests", {trace:false}); 83 deferredResult = new Clipperz.Async.Deferred("login_tests", {trace:false});
86 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 84 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
87 deferredResult.addCallback(function() { 85 deferredResult.addCallback(function() {
88 proxy.expectedRequests().unshift({ 86 proxy.expectedRequests().unshift({
89 name: "First handshake step", 87 name: "First handshake step",
90 functionName: 'handshake', 88 functionName: 'handshake',
91 parameters: { 89 parameters: {
92 parameters: { 90 parameters: {
93 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "connect"), 91 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "connect"),
94 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), 92 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"),
95 parameters: { 93 parameters: {
96 C: MochiKit.Base.partial(MochiKit.Base.operator.eq, "f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674"), 94 C: MochiKit.Base.partial(MochiKit.Base.operator.eq, "f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674"),
97 A: MochiKit.Base.operator.truth 95 A: MochiKit.Base.operator.truth
98 } 96 }
99 } 97 }
100 } 98 }
101 }); 99 });
102 }); 100 });
103 deferredResult.addCallback(function() { 101 deferredResult.addCallback(function() {
104 proxy.expectedRequests().unshift({ 102 proxy.expectedRequests().unshift({
105 name: "Second handshake step", 103 name: "Second handshake step",
106 functionName: 'handshake', 104 functionName: 'handshake',
107 parameters: { 105 parameters: {
108 parameters: { 106 parameters: {
109 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "credentialCheck"), 107 message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "credentialCheck"),
110 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), 108 version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"),
111 parameters: { 109 parameters: {
112 M1: MochiKit.Base.operator.truth 110 M1: MochiKit.Base.operator.truth
113 } 111 }
114 } 112 }
115 } 113 }
116 }); 114 });
117 }); 115 });
118 deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/); 116 deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/);
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html
index 044658e..67627f8 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.Crypto - TEST</title> 26 <title>Clipperz.PM.Crypto - TEST</title>
29 27
30 <script> 28 <script>
31 jslog_config_enabled = true; 29 jslog_config_enabled = true;
32 clipperz_profiling_enabled = true; 30 clipperz_profiling_enabled = true;
33 </script> 31 </script>
34 32
35 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 33 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
36 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 34 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
37 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 35 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
38 36
39 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 37 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
42 40
43 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Profile.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Profile.js'></script>
49 47
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
56 54
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
60 58
61 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 59 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
62<!-- 60<!--
63 <script> 61 <script>
64 MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true)); 62 MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true));
65 MochiKit.Logging.logger.useNativeConsole = true; 63 MochiKit.Logging.logger.useNativeConsole = true;
66 </script> 64 </script>
67--> 65-->
68</head> 66</head>
69<body> 67<body>
70<pre id="test"> 68<pre id="test">
71 69
72<script type="text/javascript"> 70<script type="text/javascript">
73 71
74 72
75Clipperz_PM_Crypt_test = function() { 73Clipperz_PM_Crypt_test = function() {
76 varkey; 74 varkey;
77 75
78 var plainData; 76 var plainData;
79 var encryptedData; 77 var encryptedData;
80 var decryptedData; 78 var decryptedData;
81 79
82 var result; 80 var result;
83 var expectedResult; 81 var expectedResult;
84 82
85 var plainText; 83 var plainText;
86 var longPlainText; 84 var longPlainText;
87 85
88 key = 'trustno1'; 86 key = 'trustno1';
89 87
90 plainText = "Lorem ipsum dolor sit amet"; 88 plainText = "Lorem ipsum dolor sit amet";
91 longPlainText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo."; 89 longPlainText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo.";
92 90
93 // 91 //
94 //hashing 92 //hashing
95 // 93 //
96 plainData = new Clipperz.ByteArray(plainText); 94 plainData = new Clipperz.ByteArray(plainText);
97 95
98 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData); 96 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData);
99 is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a short text"); 97 is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a short text");
100 98
101 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData); 99 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData);
102 is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a short text"); 100 is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a short text");
103 101
104 102
105 plainData = new Clipperz.ByteArray(longPlainText); 103 plainData = new Clipperz.ByteArray(longPlainText);
106 104
107 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData); 105 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData);
108 is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a long text"); 106 is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a long text");
109 107
110 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData); 108 result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData);
111 is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a long text"); 109 is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a long text");
112 110
113 111
114 // 112 //
115 //encrypting / decripting 113 //encrypting / decripting
116 // 114 //
117 plainData = plainText; 115 plainData = plainText;
118 116
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html
index e8ce0bc..5529121 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.Crypt - Performance evaluation - TEST</title> 26 <title>Clipperz.PM.Crypt - Performance evaluation - TEST</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
47 45
48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
51 49
52<!--< script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES_other_implementation.js'>< /script> --> 50<!--< script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES_other_implementation.js'>< /script> -->
53 51
54</head> 52</head>
55<body> 53<body>
56<pre id="test"> 54<pre id="test">
57 55
58<script type="text/javascript"> 56<script type="text/javascript">
59 57
60try { 58try {
61 var key; 59 var key;
62 var shortText; 60 var shortText;
63 var longText; 61 var longText;
64 var veryLongText; 62 var veryLongText;
65 var byteArray; 63 var byteArray;
66 varplainText; 64 varplainText;
67 var encryptedText; 65 var encryptedText;
68 var decryptedText; 66 var decryptedText;
69 var startTime, endTime; 67 var startTime, endTime;
70 var startTime1, endTime1; 68 var startTime1, endTime1;
71 var ClipperzCryptoVersion; 69 var ClipperzCryptoVersion;
72 var i,c; 70 var i,c;
73 71
74 ClipperzCryptoVersion = '0.3'; 72 ClipperzCryptoVersion = '0.3';
75 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 73 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
76 key = 'trustno1'; 74 key = 'trustno1';
77 75
78 shortText = "Lorem ipsum dolor sit amet"; 76 shortText = "Lorem ipsum dolor sit amet";
79 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo."; 77 longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo.";
80 veryLongText = ""; 78 veryLongText = "";
81 c = 100; 79 c = 100;
82 for (i=0; i<100; i++) { 80 for (i=0; i<100; i++) {
83 veryLongText += longText; 81 veryLongText += longText;
84 } 82 }
85 nonce = new Clipperz.ByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 83 nonce = new Clipperz.ByteArray(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
86 84
87 85
88 //-------------------------------------------------------------- 86 //--------------------------------------------------------------
89 // 87 //
90 // longTextencryption performance 88 // longTextencryption performance
91 // 89 //
92 //-------------------------------------------------------------- 90 //--------------------------------------------------------------
93 91
94 plainText = longText; 92 plainText = longText;
95 93
96startTime = new Date(); 94startTime = new Date();
97 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText, nonce); 95 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText, nonce);
98endTime = new Date(); 96endTime = new Date();
99//console.log("[1] encryption time: " + (endTime - startTime)); 97//console.log("[1] encryption time: " + (endTime - startTime));
100 is((endTime - startTime < 350), true, "[1] Need to improve some more (" + (endTime - startTime) + ")"); 98 is((endTime - startTime < 350), true, "[1] Need to improve some more (" + (endTime - startTime) + ")");
101 is(encryptedText, "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", "encrypted text"); 99 is(encryptedText, "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", "encrypted text");
102 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText); 100 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText);
103 is(decryptedText, plainText, "encrypt <-> decrypt works (specifying the nonce)"); 101 is(decryptedText, plainText, "encrypt <-> decrypt works (specifying the nonce)");
104 102
105startTime = new Date(); 103startTime = new Date();
106 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText); 104 encryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].encrypt(key, plainText);
107endTime = new Date(); 105endTime = new Date();
108//console.log("[2] encryption time: " + (endTime - startTime)); 106//console.log("[2] encryption time: " + (endTime - startTime));
109 is((endTime - startTime < 350), true, "[2] Need to improve some more (" + (endTime - startTime) + ")"); 107 is((endTime - startTime < 350), true, "[2] Need to improve some more (" + (endTime - startTime) + ")");
110 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText); 108 decryptedText = Clipperz.PM.Crypto.encryptingFunctions.versions[ClipperzCryptoVersion].decrypt(key, encryptedText);
111 is(decryptedText, plainText, "encrypt <-> decrypt works"); 109 is(decryptedText, plainText, "encrypt <-> decrypt works");
112 110
113 //-------------------------------------------------------------- 111 //--------------------------------------------------------------
114 // 112 //
115 // veryLongTextencryption performance 113 // veryLongTextencryption performance
116 // 114 //
117 //-------------------------------------------------------------- 115 //--------------------------------------------------------------
118/* 116/*
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html
index dc01dae..d4750f5 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.Crypto - TEST</title> 26 <title>Clipperz.PM.Crypto - TEST</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 29
32 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
35 33
36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
41 39
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
48 46
49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
52 50
53 51
54<!-- ================================================================================ --> <script> 52<!-- ================================================================================ --> <script>
55//MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true)); 53//MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true));
56//MochiKit.Logging.logger.useNativeConsole = true; 54//MochiKit.Logging.logger.useNativeConsole = true;
57 55
58//----------------------------------------------------------------------------- 56//-----------------------------------------------------------------------------
59 57
60encodePassword = function (anEvent) { 58encodePassword = function (anEvent) {
61 varusername; 59 varusername;
62 var password; 60 var password;
63 var encodedPassword; 61 var encodedPassword;
64 var srpConnection; 62 var srpConnection;
65 63
66 anEvent.stop(); 64 anEvent.stop();
67 65
68 srpConnection = new Clipperz.PM.Connection.SRP['1.1'](); 66 srpConnection = new Clipperz.PM.Connection.SRP['1.1']();
69 67
70 username = MochiKit.DOM.getElement('username').value; 68 username = MochiKit.DOM.getElement('username').value;
71 passphrase = MochiKit.DOM.getElement('passphrase').value; 69 passphrase = MochiKit.DOM.getElement('passphrase').value;
72 encodedPassword = srpConnection.normalizedCredentials({'username':username , 'password':passphrase })['password']; 70 encodedPassword = srpConnection.normalizedCredentials({'username':username , 'password':passphrase })['password'];
73 71
74 MochiKit.DOM.getElement('encodedPassword').value = encodedPassword; 72 MochiKit.DOM.getElement('encodedPassword').value = encodedPassword;
75} 73}
76 74
77//----------------------------------------------------------------------------- 75//-----------------------------------------------------------------------------
78 76
79decryptData = function (anEvent) { 77decryptData = function (anEvent) {
80 vardeferredResult; 78 vardeferredResult;
81 varkey; 79 varkey;
82 varversion; 80 varversion;
83 var value; 81 var value;
84 82
85 key = MochiKit.DOM.getElement('key').value; 83 key = MochiKit.DOM.getElement('key').value;
86 version = MochiKit.DOM.getElement('version').value; 84 version = MochiKit.DOM.getElement('version').value;
87 value = MochiKit.DOM.getElement('encryptedText').value; 85 value = MochiKit.DOM.getElement('encryptedText').value;
88 86
89 anEvent.stop(); 87 anEvent.stop();
90 88
91 deferredResult = new Clipperz.Async.Deferred("Decrypted data", {trace:false}); 89 deferredResult = new Clipperz.Async.Deferred("Decrypted data", {trace:false});
92 deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, {key:key, version:version, value:value}); 90 deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, {key:key, version:version, value:value});
93 deferredResult.addCallback(Clipperz.Base.serializeJSON); 91 deferredResult.addCallback(Clipperz.Base.serializeJSON);
94 deferredResult.addCallback(function (aValue) { 92 deferredResult.addCallback(function (aValue) {
95 MochiKit.DOM.getElement('decryptedText').value = aValue; 93 MochiKit.DOM.getElement('decryptedText').value = aValue;
96 }); 94 });
97 deferredResult.addErrback(alert); 95 deferredResult.addErrback(alert);
98 96
99 deferredResult.callback(); 97 deferredResult.callback();
100} 98}
101 99
102//----------------------------------------------------------------------------- 100//-----------------------------------------------------------------------------
103 101
104encryptData = function (anEvent) { 102encryptData = function (anEvent) {
105 vardeferredResult; 103 vardeferredResult;
106 varkey; 104 varkey;
107 varversion; 105 varversion;
108 var value; 106 var value;
109 107
110 key = MochiKit.DOM.getElement('key').value; 108 key = MochiKit.DOM.getElement('key').value;
111 version = MochiKit.DOM.getElement('version').value; 109 version = MochiKit.DOM.getElement('version').value;
112 value = Clipperz.Base.evalJSON(MochiKit.DOM.getElement('decryptedText').value); 110 value = Clipperz.Base.evalJSON(MochiKit.DOM.getElement('decryptedText').value);
113 111
114 anEvent.stop(); 112 anEvent.stop();
115 113
116 deferredResult = new Clipperz.Async.Deferred("Encrypted data", {trace:false}); 114 deferredResult = new Clipperz.Async.Deferred("Encrypted data", {trace:false});
117 deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt, {key:key, version:version, value:value}); 115 deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt, {key:key, version:version, value:value});
118 deferredResult.addCallback(function (aValue) { 116 deferredResult.addCallback(function (aValue) {
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html
index 0a5bcfb..73b8225 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html
@@ -1,100 +1,98 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.DataModel.DirectLogin - test</title> 26 <title>Clipperz.PM.DataModel.DirectLogin - test</title>
29 27
30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script> 36 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> 40 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 41 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
44 42
45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> 43 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> 44 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> 45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> 46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> 47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> 48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
51 49
52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script> 50 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> 51 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script>
54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 53 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
57 55
58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> 56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> 57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
60 58
61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> 59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 60 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
63 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> 61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script> 63 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script>
66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> 67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> 68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script> 69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script>
72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> 72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> 73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> 74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
77 75
78 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> 76 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
79<script> 77<script>
80 Clipperz_IEisBroken = false; 78 Clipperz_IEisBroken = false;
81</script> 79</script>
82 80
83<!--[if IE]><script> 81<!--[if IE]><script>
84Clipperz_IEisBroken = true; 82Clipperz_IEisBroken = true;
85Clipperz_normalizedNewLine = '\x0d\x0a'; 83Clipperz_normalizedNewLine = '\x0d\x0a';
86</script><![endif]--> 84</script><![endif]-->
87 85
88</head> 86</head>
89<body> 87<body>
90 88
91<pre id="test"> 89<pre id="test">
92<script> 90<script>
93 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us'); 91 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us');
94</script> 92</script>
95<script type="text/javascript" src="User.data.js"></script> 93<script type="text/javascript" src="User.data.js"></script>
96<script type="text/javascript" src="User.data.old.js"></script> 94<script type="text/javascript" src="User.data.old.js"></script>
97<script type="text/javascript" src="DirectLogin.test.js"></script> 95<script type="text/javascript" src="DirectLogin.test.js"></script>
98</pre> 96</pre>
99</body> 97</body>
100</html> 98</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js
index 7df0971..11009f5 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 24Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
27 25
28var tests = { 26var tests = {
29 27
30/* 28/*
31 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 29 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
32 ... 30 ...
33 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); 31 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
34 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); 32 deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
35 33
36 34
37 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 35 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
38 ... 36 ...
39 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 37 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
40 deferredResult.addMethod(user, 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); //WEB PASSWORD (0) 38 deferredResult.addMethod(user, 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); //WEB PASSWORD (0)
41 deferredResult.addMethod(user, 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); //DIGG (1) 39 deferredResult.addMethod(user, 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); //DIGG (1)
42 deferredResult.addMethod(user, 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); //SAP (2) 40 deferredResult.addMethod(user, 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); //SAP (2)
43 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4) 41 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
44 DirectLogin references 42 DirectLogin references
45 - dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496 //Yahoo! Mail 43 - dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496 //Yahoo! Mail
46 - aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584 //(Yahoo! Groups) 44 - aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584 //(Yahoo! Groups)
47 - 6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f //(Flickr) 45 - 6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f //(Flickr)
48 - a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e //(My Yahoo!) 46 - a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e //(My Yahoo!)
49*/ 47*/
50 //------------------------------------------------------------------------- 48 //-------------------------------------------------------------------------
51 49
52 'editDirectLoginLabel_test': function (someTestArgs) { 50 'editDirectLoginLabel_test': function (someTestArgs) {
53 var deferredResult; 51 var deferredResult;
54 var proxy; 52 var proxy;
55 var user; 53 var user;
56 54
57 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 55 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
58 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 56 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
59 57
60 deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test", someTestArgs); 58 deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test", someTestArgs);
61 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 59 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
62 deferredResult.addMethod(user, 'login'); 60 deferredResult.addMethod(user, 'login');
63 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4) 61 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
64 deferredResult.addMethodcaller('directLogins'); 62 deferredResult.addMethodcaller('directLogins');
65 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496')); 63 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'));
66 deferredResult.addCallback(function (aDirectLogin) { 64 deferredResult.addCallback(function (aDirectLogin) {
67 var innerDeferredResult; 65 var innerDeferredResult;
68 var updatedLabel; 66 var updatedLabel;
69 67
70 updatedLabel = "updated Yahoo! Mail label"; 68 updatedLabel = "updated Yahoo! Mail label";
71 69
72 innerDeferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test <inner>", someTestArgs); 70 innerDeferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test <inner>", someTestArgs);
73 innerDeferredResult.addMethod(aDirectLogin, 'label'); 71 innerDeferredResult.addMethod(aDirectLogin, 'label');
74 innerDeferredResult.addTest("Yahoo! Mail", "The label of the selected direct login is correct."); 72 innerDeferredResult.addTest("Yahoo! Mail", "The label of the selected direct login is correct.");
75 innerDeferredResult.addMethod(aDirectLogin, 'setLabel', updatedLabel); 73 innerDeferredResult.addMethod(aDirectLogin, 'setLabel', updatedLabel);
76 74
77 innerDeferredResult.addMethod(aDirectLogin, 'label'); 75 innerDeferredResult.addMethod(aDirectLogin, 'label');
78 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even before committing data."); 76 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even before committing data.");
79 77
80 innerDeferredResult.addMethod(user, 'hasPendingChanges'); 78 innerDeferredResult.addMethod(user, 'hasPendingChanges');
81 innerDeferredResult.addTest(true, "When changing the label of a DirectLogin, the user should report pending changes."); 79 innerDeferredResult.addTest(true, "When changing the label of a DirectLogin, the user should report pending changes.");
82 80
83//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ >>>")}); 81//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ >>>")});
84 innerDeferredResult.addMethod(user, 'saveChanges'); 82 innerDeferredResult.addMethod(user, 'saveChanges');
85//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ <<<")}); 83//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ <<<")});
86 innerDeferredResult.addMethod(user, 'hasPendingChanges'); 84 innerDeferredResult.addMethod(user, 'hasPendingChanges');
87 innerDeferredResult.addTest(false, "After saving changes there should be no pending changes left."); 85 innerDeferredResult.addTest(false, "After saving changes there should be no pending changes left.");
88 86
89 innerDeferredResult.addMethod(aDirectLogin, 'label'); 87 innerDeferredResult.addMethod(aDirectLogin, 'label');
90 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even after committing data."); 88 innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even after committing data.");
91 89
92 innerDeferredResult.callback(); 90 innerDeferredResult.callback();
93 91
94 return innerDeferredResult; 92 return innerDeferredResult;
95 }) 93 })
96 94
97 deferredResult.callback(); 95 deferredResult.callback();
98 96
99 return deferredResult; 97 return deferredResult;
100 }, 98 },
101 99
102 //------------------------------------------------------------------------- 100 //-------------------------------------------------------------------------
103 101
104 'editDirectLoginLabel_thanResetItToThePreviousValue_test': function (someTestArgs) { 102 'editDirectLoginLabel_thanResetItToThePreviousValue_test': function (someTestArgs) {
105 var deferredResult; 103 var deferredResult;
106 var proxy; 104 var proxy;
107 var user; 105 var user;
108 106
109 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 107 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
110 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 108 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
111 109
112 deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_thanResetItToThePreviousValue_test", someTestArgs); 110 deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_thanResetItToThePreviousValue_test", someTestArgs);
113 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 111 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
114 deferredResult.addMethod(user, 'login'); 112 deferredResult.addMethod(user, 'login');
115 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4) 113 deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
116 deferredResult.addMethodcaller('directLogins'); 114 deferredResult.addMethodcaller('directLogins');
117 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496')); 115 deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'));
118 deferredResult.addCallback(function (aDirectLogin) { 116 deferredResult.addCallback(function (aDirectLogin) {
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js
index 1678515..eaf4035 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js
@@ -1,30 +1,28 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26directLoginConfigurations = { 24directLoginConfigurations = {
27 'Yahoo! Mail':'{\n "page": {\n "title": "Yahoo! Mail"\n },\n "form": {\n "attributes": {\n "action": "https://login.yahoo.com/config/login?",\n "method": "post"\n },\n "inputs": [\n {\n "type": "hidden",\n "name": ".tries",\n "value": "1"\n },\n {\n "type": "hidden",\n "name": ".src",\n "value": "ym"\n },\n {\n "type": "hidden",\n "name": ".md5",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".hash",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".js",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".last",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "promo",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".intl",\n "value": "us"\n },\n {\n "type": "hidden",\n "name": ".bypass",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".partner",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".u",\n "value": "5gp62cl2vg3ov"\n },\n {\n "type": "hidden",\n "name": ".v",\n "value": "0"\n },\n {\n "type": "hidden",\n "name": ".challenge",\n "value": "iBEY0IK6k3t9Uals32mrTos8s48p"\n },\n {\n "type": "hidden",\n "name": ".yplus",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".emailCode",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "pkg",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "stepid",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".ev",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "hasMsgr",\n "value": "0"\n },\n {\n "type": "hidden",\n "name": ".chkP",\n "value": "Y"\n },\n {\n "type": "hidden",\n "name": ".done",\n "value": "http://mail.yahoo.com"\n },\n {\n "type": "hidden",\n "name": ".pd",\n "value": "ym_ver%3d0%26c="\n },\n {\n "type": "text",\n "name": "login",\n "value": ""\n },\n {\n "type": "password",\n "name": "passwd",\n "value": ""\n },\n {\n "type": "checkbox",\n "name": ".persistent",\n "value": "y"\n },\n {\n "type": "submit",\n "name": ".save",\n "value": "Sign In"\n }\n ]\n },\n "version": "0.2"\n}', 25 'Yahoo! Mail':'{\n "page": {\n "title": "Yahoo! Mail"\n },\n "form": {\n "attributes": {\n "action": "https://login.yahoo.com/config/login?",\n "method": "post"\n },\n "inputs": [\n {\n "type": "hidden",\n "name": ".tries",\n "value": "1"\n },\n {\n "type": "hidden",\n "name": ".src",\n "value": "ym"\n },\n {\n "type": "hidden",\n "name": ".md5",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".hash",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".js",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".last",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "promo",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".intl",\n "value": "us"\n },\n {\n "type": "hidden",\n "name": ".bypass",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".partner",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".u",\n "value": "5gp62cl2vg3ov"\n },\n {\n "type": "hidden",\n "name": ".v",\n "value": "0"\n },\n {\n "type": "hidden",\n "name": ".challenge",\n "value": "iBEY0IK6k3t9Uals32mrTos8s48p"\n },\n {\n "type": "hidden",\n "name": ".yplus",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".emailCode",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "pkg",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "stepid",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".ev",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "hasMsgr",\n "value": "0"\n },\n {\n "type": "hidden",\n "name": ".chkP",\n "value": "Y"\n },\n {\n "type": "hidden",\n "name": ".done",\n "value": "http://mail.yahoo.com"\n },\n {\n "type": "hidden",\n "name": ".pd",\n "value": "ym_ver%3d0%26c="\n },\n {\n "type": "text",\n "name": "login",\n "value": ""\n },\n {\n "type": "password",\n "name": "passwd",\n "value": ""\n },\n {\n "type": "checkbox",\n "name": ".persistent",\n "value": "y"\n },\n {\n "type": "submit",\n "name": ".save",\n "value": "Sign In"\n }\n ]\n },\n "version": "0.2"\n}',
28 'Parallels':'{"page": {"title": "Parallels Account"},\n"form": {"attributes": {"action": "https://www.parallels.com/account/",\n"method": "post"},\n"inputs": [{"type": "text",\n"name": "Email",\n"value": ""},\n{"type": "password",\n"name": "Password",\n"value": ""}]},\n"version": "0.2.3"}', 26 'Parallels':'{"page": {"title": "Parallels Account"},\n"form": {"attributes": {"action": "https://www.parallels.com/account/",\n"method": "post"},\n"inputs": [{"type": "text",\n"name": "Email",\n"value": ""},\n{"type": "password",\n"name": "Password",\n"value": ""}]},\n"version": "0.2.3"}',
29 __syntaxFix__: "syntax fix" 27 __syntaxFix__: "syntax fix"
30}; \ No newline at end of file 28}; \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html
index 3297ab4..a711ba9 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html
@@ -1,63 +1,61 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.DataModel.EncryptedRemoteObject - test</title> 26 <title>Clipperz.PM.DataModel.EncryptedRemoteObject - test</title>
29 27
30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
39 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> 39 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 40 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
43 41
44 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> 42 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> 43 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> 44 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> 45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> 46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> 47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> 48 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script>
51 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> 49 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> 50 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
53 51
54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
55 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> 53 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
56</head> 54</head>
57<body> 55<body>
58 56
59<pre id="test"> 57<pre id="test">
60<script type="text/javascript" src="EncryptedRemoteObject.test.js"></script> 58<script type="text/javascript" src="EncryptedRemoteObject.test.js"></script>
61</pre> 59</pre>
62</body> 60</body>
63</html> 61</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js
index 9c50c43..c5f0e00 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 24Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
27 25
28var tests = { 26var tests = {
29 27
30 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
31 29
32 'simple_tests': function(someTestArgs) { 30 'simple_tests': function(someTestArgs) {
33 vardeferredResult; 31 vardeferredResult;
34 varencryptedRemoteObject; 32 varencryptedRemoteObject;
35 33
36 varkey; 34 varkey;
37 var version; 35 var version;
38 var rawData; 36 var rawData;
39 37
40 key = "just a random key"; 38 key = "just a random key";
41 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; 39 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
42 rawData = "just a random text to encrypt"; 40 rawData = "just a random text to encrypt";
43 41
44 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 42 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({
45 'retrieveKeyFunction': MochiKit.Base.noop, 43 'retrieveKeyFunction': MochiKit.Base.noop,
46 'retrieveRemoteDataFunction':function () { return "--"}, 44 'retrieveRemoteDataFunction':function () { return "--"},
47 'encryptedDataKeypath': '--', 45 'encryptedDataKeypath': '--',
48 'encryptedVersionKeypath': '--' 46 'encryptedVersionKeypath': '--'
49 }); 47 });
50 SimpleTest.ok(encryptedRemoteObject != null, "create an encryptedRemoteObject"); 48 SimpleTest.ok(encryptedRemoteObject != null, "create an encryptedRemoteObject");
51 49
52 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.test - simple_tests", [ 50 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.test - simple_tests", [
53 MochiKit.Base.method(encryptedRemoteObject, 'getRemoteData'), 51 MochiKit.Base.method(encryptedRemoteObject, 'getRemoteData'),
54 function(aResult) { 52 function(aResult) {
55 SimpleTest.is(aResult, "--", "setting and getting serverData works"); 53 SimpleTest.is(aResult, "--", "setting and getting serverData works");
56 } 54 }
57 ], someTestArgs); 55 ], someTestArgs);
58 56
59 return deferredResult; 57 return deferredResult;
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'decrypt_test': function (someTestArgs) { 62 'decrypt_test': function (someTestArgs) {
65 vardeferredResult; 63 vardeferredResult;
66 varencryptedRemoteObject; 64 varencryptedRemoteObject;
67 varkey; 65 varkey;
68 var version; 66 var version;
69 var rawData; 67 var rawData;
70 68
71 key = "just a random key"; 69 key = "just a random key";
72 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; 70 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
73 rawData = "just a random text to encrypt"; 71 rawData = "just a random text to encrypt";
74 72
75 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 73 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({
76 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key), 74 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key),
77 'retrieveRemoteDataFunction':MochiKit.Base.partial(Clipperz.Async.callbacks, "EncryptedRemoteObject.test - decrypt_test <encrypt data>", [ 75 'retrieveRemoteDataFunction':MochiKit.Base.partial(Clipperz.Async.callbacks, "EncryptedRemoteObject.test - decrypt_test <encrypt data>", [
78 MochiKit.Base.partial(Clipperz.PM.Crypto.deferredEncrypt, {key:key, value:rawData, version:version}), 76 MochiKit.Base.partial(Clipperz.PM.Crypto.deferredEncrypt, {key:key, value:rawData, version:version}),
79 function (someEncryptedData) { 77 function (someEncryptedData) {
80 return { 78 return {
81 'data': someEncryptedData, 79 'data': someEncryptedData,
82 'version': version 80 'version': version
83 } 81 }
84 } 82 }
85 ], someTestArgs)//, 83 ], someTestArgs)//,
86 // 'encryptedDataKeypath': 'data', 84 // 'encryptedDataKeypath': 'data',
87 // 'encryptedVersionKeypath': 'version' 85 // 'encryptedVersionKeypath': 'version'
88 }); 86 });
89 87
90 deferredResult = new Clipperz.Async.Deferred("decrypt_test", someTestArgs); 88 deferredResult = new Clipperz.Async.Deferred("decrypt_test", someTestArgs);
91 deferredResult.addMethod(encryptedRemoteObject, 'getDecryptedData'); 89 deferredResult.addMethod(encryptedRemoteObject, 'getDecryptedData');
92 deferredResult.addCallback(function (aResult) { 90 deferredResult.addCallback(function (aResult) {
93 SimpleTest.is(aResult, rawData, "encrypt and decrypt works"); 91 SimpleTest.is(aResult, rawData, "encrypt and decrypt works");
94 }) 92 })
95 deferredResult.callback(); 93 deferredResult.callback();
96 94
97 return deferredResult; 95 return deferredResult;
98 }, 96 },
99 97
100 //------------------------------------------------------------------------- 98 //-------------------------------------------------------------------------
101 99
102 'getValue_test': function (someTestArgs) { 100 'getValue_test': function (someTestArgs) {
103 vardeferredResult; 101 vardeferredResult;
104 varencryptedRemoteObject; 102 varencryptedRemoteObject;
105 varkey; 103 varkey;
106 var version; 104 var version;
107 var rawData; 105 var rawData;
108 106
109 key = "just a random key"; 107 key = "just a random key";
110 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; 108 version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion;
111 rawData = { 109 rawData = {
112 key1: 'value1', 110 key1: 'value1',
113 key2: 'value2' 111 key2: 'value2'
114 }; 112 };
115 113
116 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ 114 encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({
117 'reference': "testReference", 115 'reference': "testReference",
118 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key), 116 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key),
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html
index 7861b80..949154b 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html
@@ -1,102 +1,100 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.DataModel.User - test</title> 26 <title>Clipperz.PM.DataModel.User - test</title>
29 27
30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script> 36 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> 40 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 41 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
44 42
45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> 43 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> 44 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> 45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> 46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> 47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> 48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
51 49
52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script> 50 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> 51 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script>
54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 53 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
57 55
58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> 56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> 57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
60 58
61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script> 59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script>
62 60
63 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> 61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> 63 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script> 65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script>
68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> 69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> 70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> 71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script> 72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script>
75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
77 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> 75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
78 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> 76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
79 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> 77 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
80 78
81 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> 79 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
82<script> 80<script>
83 Clipperz_IEisBroken = false; 81 Clipperz_IEisBroken = false;
84</script> 82</script>
85 83
86<!--[if IE]><script> 84<!--[if IE]><script>
87Clipperz_IEisBroken = true; 85Clipperz_IEisBroken = true;
88Clipperz_normalizedNewLine = '\x0d\x0a'; 86Clipperz_normalizedNewLine = '\x0d\x0a';
89</script><![endif]--> 87</script><![endif]-->
90 88
91</head> 89</head>
92<body> 90<body>
93 91
94<pre id="test"> 92<pre id="test">
95<script> 93<script>
96 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us'); 94 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us');
97</script> 95</script>
98<script type="text/javascript" src="User.data.js"></script> 96<script type="text/javascript" src="User.data.js"></script>
99<script type="text/javascript" src="OneTimePassword.test.js"></script> 97<script type="text/javascript" src="OneTimePassword.test.js"></script>
100</pre> 98</pre>
101</body> 99</body>
102</html> 100</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js
index 85aae4e..835be38 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 24Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
27 25
28var tests = { 26var tests = {
29 27
30 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
31 29
32 'isValidOneTimePasswordValue_test': function (someTestArgs) { 30 'isValidOneTimePasswordValue_test': function (someTestArgs) {
33 var otp; 31 var otp;
34 var notOTP; 32 var notOTP;
35 33
36 otp = 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg'; 34 otp = 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg';
37 SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(otp), true, "isValidOneTimePasswordValue [expect true] - test 1"); 35 SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(otp), true, "isValidOneTimePasswordValue [expect true] - test 1");
38 36
39 notOTP = 'trustno1'; 37 notOTP = 'trustno1';
40 SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(notOTP), false, "isValidOneTimePasswordValue [expect false] - test 1"); 38 SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(notOTP), false, "isValidOneTimePasswordValue [expect false] - test 1");
41 39
42 return MochiKit.Async.succeed('done'); 40 return MochiKit.Async.succeed('done');
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'loginUsingOtp_test': function (someTestArgs) { 45 'loginUsingOtp_test': function (someTestArgs) {
48 var deferredResult; 46 var deferredResult;
49 var proxy; 47 var proxy;
50 var user, user2; 48 var user, user2;
51 var username; 49 var username;
52 var passphrase; 50 var passphrase;
53 51
54 username = "test"; 52 username = "test";
55 passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP 53 passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP
56 54
57 proxy =new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 55 proxy =new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
58 user =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); 56 user =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}});
59 user2 =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); 57 user2 =new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}});
60 58
61 deferredResult = new Clipperz.Async.Deferred("loginUsingOtp_test", someTestArgs); 59 deferredResult = new Clipperz.Async.Deferred("loginUsingOtp_test", someTestArgs);
62 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']); 60 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']);
63 61
64 deferredResult.addMethod(user, 'login'); 62 deferredResult.addMethod(user, 'login');
65 deferredResult.addMethod(user, 'getRecords'); 63 deferredResult.addMethod(user, 'getRecords');
66 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 64 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
67 deferredResult.addTest(1, "This account has one single card"); 65 deferredResult.addTest(1, "This account has one single card");
68 66
69 deferredResult.addMethod(user, 'getOneTimePasswords'); 67 deferredResult.addMethod(user, 'getOneTimePasswords');
70 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 68 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
71 deferredResult.addTest(1, "This account has one OTP"); 69 deferredResult.addTest(1, "This account has one OTP");
72 70
73 deferredResult.addMethod(user, 'getOneTimePasswords'); 71 deferredResult.addMethod(user, 'getOneTimePasswords');
74 deferredResult.addCallback(MochiKit.Base.itemgetter(0)); 72 deferredResult.addCallback(MochiKit.Base.itemgetter(0));
75 deferredResult.addCallback(MochiKit.Base.methodcaller('status')); 73 deferredResult.addCallback(MochiKit.Base.methodcaller('status'));
76 deferredResult.addTest('USED', "The available OTP has been unsed to login, and should be marked accordingly"); 74 deferredResult.addTest('USED', "The available OTP has been unsed to login, and should be marked accordingly");
77 75
78 deferredResult.addMethod(user2, 'login'); 76 deferredResult.addMethod(user2, 'login');
79 deferredResult.shouldFail("trying to login using the same OTP twice"); 77 deferredResult.shouldFail("trying to login using the same OTP twice");
80 78
81 deferredResult.callback(); 79 deferredResult.callback();
82 80
83 return deferredResult; 81 return deferredResult;
84 }, 82 },
85 83
86 //------------------------------------------------------------------------- 84 //-------------------------------------------------------------------------
87 85
88 'changePassphraseAndLoginUsingOtp_test': function (someTestArgs) { 86 'changePassphraseAndLoginUsingOtp_test': function (someTestArgs) {
89 var deferredResult; 87 var deferredResult;
90 var proxy; 88 var proxy;
91 var user; 89 var user;
92 var user2; 90 var user2;
93 var user3; 91 var user3;
94 var otp; 92 var otp;
95 93
96 otp = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP 94 otp = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; //OTP
97 95
98 newPassphrase = 'tset'; 96 newPassphrase = 'tset';
99 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 97 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
100 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 98 user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
101 user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return otp;}}); 99 user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return otp;}});
102 100
103 deferredResult = new Clipperz.Async.Deferred("changePassphraseAndLoginUsingOtp_test", someTestArgs); 101 deferredResult = new Clipperz.Async.Deferred("changePassphraseAndLoginUsingOtp_test", someTestArgs);
104 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']); 102 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']);
105 103
106 deferredResult.addMethod(user, 'login'); 104 deferredResult.addMethod(user, 'login');
107 105
108 deferredResult.addMethod(user, 'getRecords'); 106 deferredResult.addMethod(user, 'getRecords');
109 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 107 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
110 deferredResult.addTest(1, "This account has only a single card"); 108 deferredResult.addTest(1, "This account has only a single card");
111 109
112 deferredResult.addMethod(user, 'changePassphrase', newPassphrase); 110 deferredResult.addMethod(user, 'changePassphrase', newPassphrase);
113 deferredResult.addMethod(user, 'logout'); 111 deferredResult.addMethod(user, 'logout');
114 112
115 deferredResult.addMethod(user2, 'login'); 113 deferredResult.addMethod(user2, 'login');
116 deferredResult.addMethod(user2, 'getRecords'); 114 deferredResult.addMethod(user2, 'getRecords');
117 deferredResult.addCallback(MochiKit.Base.itemgetter('length')); 115 deferredResult.addCallback(MochiKit.Base.itemgetter('length'));
118 deferredResult.addTest(1, "This account has oly a single card"); 116 deferredResult.addTest(1, "This account has oly a single card");
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html
index 3685a7a..0332008 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html
@@ -1,95 +1,93 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.DataModel.Record - test</title> 26 <title>Clipperz.PM.DataModel.Record - test</title>
29 27
30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script> 36 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> 40 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 41 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
44 42
45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> 43 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> 44 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> 45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> 46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> 47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> 48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
51 49
52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script> 50 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> 51 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> 53 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> 54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script>
57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
60 58
61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> 59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> 60 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
63 61
64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> 62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 63 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> 64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script> 66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script>
69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> 70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> 71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> 72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script> 73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script>
76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
77 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
78 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> 76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
79 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> 77 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
80 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> 78 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
81 79
82 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> 80 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
83</head> 81</head>
84<body> 82<body>
85 83
86<pre id="test"> 84<pre id="test">
87<script> 85<script>
88 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us'); 86 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us');
89</script> 87</script>
90<script type="text/javascript" src="DirectLoginConfigurations.data.js"></script> 88<script type="text/javascript" src="DirectLoginConfigurations.data.js"></script>
91<script type="text/javascript" src="User.data.js"></script> 89<script type="text/javascript" src="User.data.js"></script>
92<script type="text/javascript" src="Record.test.js"></script> 90<script type="text/javascript" src="Record.test.js"></script>
93</pre> 91</pre>
94</body> 92</body>
95</html> 93</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js
index 667e2ae..3478743 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 24Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
27 25
28var tests = { 26var tests = {
29 27
30 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
31 29
32 'recordUseOf_retrieveIndexDataFunction_and_getRemoteDataFunction_test': function (someTestArgs) { 30 'recordUseOf_retrieveIndexDataFunction_and_getRemoteDataFunction_test': function (someTestArgs) {
33 var deferredResult; 31 var deferredResult;
34 var record; 32 var record;
35 33
36//console.log("#### new Clipperz.PM.DataModel.Record [5]"); 34//console.log("#### new Clipperz.PM.DataModel.Record [5]");
37 record = new Clipperz.PM.DataModel.Record({ 35 record = new Clipperz.PM.DataModel.Record({
38 'reference': '<<< record reference >>>', 36 'reference': '<<< record reference >>>',
39 'retrieveKeyFunction': MochiKit.Base.noop, 37 'retrieveKeyFunction': MochiKit.Base.noop,
40 'retrieveRemoteDataFunction': function (aRecordReference) { 38 'retrieveRemoteDataFunction': function (aRecordReference) {
41 SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for encrypted data"); 39 SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for encrypted data");
42 return MochiKit.Async.succeed({ 40 return MochiKit.Async.succeed({
43 // fake server payload 41 // fake server payload
44 'data': "#### fake encrypted data ####", 42 'data': "#### fake encrypted data ####",
45 'version': "0.x", 43 'version': "0.x",
46 'currentVersion': { 44 'currentVersion': {
47 'reference': "<<< fake record version reference >>>", 45 'reference': "<<< fake record version reference >>>",
48 'data': "#### fake encrypted data ####", 46 'data': "#### fake encrypted data ####",
49 'version': "0.x" 47 'version': "0.x"
50 } 48 }
51 }); 49 });
52 }, 50 },
53 'updateDate': "Thu, 10 May 2007 13:01:21 UTC", 51 'updateDate': "Thu, 10 May 2007 13:01:21 UTC",
54 // 'encryptedDataKeypath': 'data', 52 // 'encryptedDataKeypath': 'data',
55 // 'encryptedVersionKeypath': 'version', 53 // 'encryptedVersionKeypath': 'version',
56 54
57 'retrieveIndexDataFunction':function (aRecordReference) { 55 'retrieveIndexDataFunction':function (aRecordReference) {
58 SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for index data"); 56 SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for index data");
59 return MochiKit.Async.succeed({ 57 return MochiKit.Async.succeed({
60 key:'<< key >>', 58 key:'<< key >>',
61 label:'<< label >>', 59 label:'<< label >>',
62 notes:'<< notes >>' 60 notes:'<< notes >>'
63 }); 61 });
64 }, 62 },
65 'updateIndexDataFunction': MochiKit.Base.noop 63 'updateIndexDataFunction': MochiKit.Base.noop
66 64
67 }); 65 });
68 66
69 deferredResult = new Clipperz.Async.Deferred("recordUseOf_retrieveIndexDataFunction_and_getEncryptedDataFunction_test", someTestArgs); 67 deferredResult = new Clipperz.Async.Deferred("recordUseOf_retrieveIndexDataFunction_and_getEncryptedDataFunction_test", someTestArgs);
70 deferredResult.addMethod(record, 'label'); 68 deferredResult.addMethod(record, 'label');
71 deferredResult.addTest('<< label >>', "Record returns the right value for label"); 69 deferredResult.addTest('<< label >>', "Record returns the right value for label");
72 deferredResult.addMethod(record, 'notes'); 70 deferredResult.addMethod(record, 'notes');
73 deferredResult.addTest('<< notes >>', "Record returns the right value for notes - even the legacy one, stored on the header"); 71 deferredResult.addTest('<< notes >>', "Record returns the right value for notes - even the legacy one, stored on the header");
74 deferredResult.addMethod(record, 'getRemoteData'); 72 deferredResult.addMethod(record, 'getRemoteData');
75 deferredResult.addCallback(Clipperz.Async.Test.isDeeply({ 'data': "#### fake encrypted data ####", 'version': "0.x", 'currentVersion': { 'reference': "<<< fake record version reference >>>", 'data': "#### fake encrypted data ####", 'version': "0.x" } }, "Record returns the expected encrypted data")); 73 deferredResult.addCallback(Clipperz.Async.Test.isDeeply({ 'data': "#### fake encrypted data ####", 'version': "0.x", 'currentVersion': { 'reference': "<<< fake record version reference >>>", 'data': "#### fake encrypted data ####", 'version': "0.x" } }, "Record returns the expected encrypted data"));
76 deferredResult.callback(); 74 deferredResult.callback();
77 75
78 return deferredResult; 76 return deferredResult;
79 }, 77 },
80 78
81 //------------------------------------------------------------------------- 79 //-------------------------------------------------------------------------
82 80
83 'createRecordWithoutAllRequiredParameters_test': function (someTestArgs) { 81 'createRecordWithoutAllRequiredParameters_test': function (someTestArgs) {
84 varrecord; 82 varrecord;
85 83
86 try { 84 try {
87//console.log("#### new Clipperz.PM.DataModel.Record [6]"); 85//console.log("#### new Clipperz.PM.DataModel.Record [6]");
88 record = new Clipperz.PM.DataModel.Record({reference:'--'}); 86 record = new Clipperz.PM.DataModel.Record({reference:'--'});
89 SimpleTest.ok(false, "creating a record without all parameters should raise an exception"); 87 SimpleTest.ok(false, "creating a record without all parameters should raise an exception");
90 } catch(exception) { 88 } catch(exception) {
91 // SimpleTest.is(exception.name, "Clipperz.Base.exception.MandatoryParameter", "creating a record without all parameters raises an exception"); 89 // SimpleTest.is(exception.name, "Clipperz.Base.exception.MandatoryParameter", "creating a record without all parameters raises an exception");
92 SimpleTest.ok(/Clipperz\.Base\.exception\.MandatoryParameter.*/.test(exception.name), "creating a record without all parameters raises an exception"); 90 SimpleTest.ok(/Clipperz\.Base\.exception\.MandatoryParameter.*/.test(exception.name), "creating a record without all parameters raises an exception");
93 } 91 }
94 }, 92 },
95 93
96 //------------------------------------------------------------------------- 94 //-------------------------------------------------------------------------
97 95
98 'recordFromOldData_version_0.1_test': function (someTestArgs) { 96 'recordFromOldData_version_0.1_test': function (someTestArgs) {
99 var deferredResult; 97 var deferredResult;
100 var proxy; 98 var proxy;
101 var user; 99 var user;
102 var recordID; 100 var recordID;
103 101
104//console.log("#### new Clipperz.PM.DataModel.Record [7]"); 102//console.log("#### new Clipperz.PM.DataModel.Record [7]");
105/* 103/*
106 record = new Clipperz.PM.DataModel.Record({ 104 record = new Clipperz.PM.DataModel.Record({
107 'reference':'05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a', 105 'reference':'05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a',
108 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6'), 106 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6'),
109 'retrieveRemoteDataFunction':MochiKit.Base.partial(MochiKit.Async.succeed, { 107 'retrieveRemoteDataFunction':MochiKit.Base.partial(MochiKit.Async.succeed, {
110 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c', 108 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c',
111 'version': '0.1', 109 'version': '0.1',
112 'currentVersion': { 110 'currentVersion': {
113 'reference': '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a', 111 'reference': '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a',
114 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c', 112 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c',
115 'version': '0.1' 113 'version': '0.1'
116 } 114 }
117 115
118 }), 116 }),
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js
index 96c6962..1dc932a 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26testData = { 24testData = {
27 25
28 //----------------------------------------------------------------------------- 26 //-----------------------------------------------------------------------------
29 27
30 'simpleLogin_001': function () { return { 28 'simpleLogin_001': function () { return {
31 'users': [ 29 'users': [
32 { 30 {
33 'username': "joe", 31 'username': "joe",
34 'passphrase': "eoj", 32 'passphrase': "eoj",
35 'version': "0.2", 33 'version': "0.2",
36 'connectionVersion':"0.2", 34 'connectionVersion':"0.2",
37 'records':{ 35 'records':{
38 'record 1': { 36 'record 1': {
39 'notes':"Some notes here", 37 'notes':"Some notes here",
40 'fields':[ 38 'fields':[
41 { 'name': "username", 'value': "joe", 'type': "text" }, 39 { 'name': "username", 'value': "joe", 'type': "text" },
42 { 'name': "password", 'value': "1234", 'type': "password"} 40 { 'name': "password", 'value': "1234", 'type': "password"}
43 ], 41 ],
44 'directLogins':{ 42 'directLogins':{
45 "record 1 direct login": { 43 "record 1 direct login": {
46 'configuration':"", 44 'configuration':"",
47 'bindings':[ 45 'bindings':[
48 ], 46 ],
49 'favicon':"http://www.example.com/favicon.ico" 47 'favicon':"http://www.example.com/favicon.ico"
50 } 48 }
51 } 49 }
52 } 50 }
53 }, 51 },
54 'otp':[ 52 'otp':[
55 "12345678 90abcdef 12345678 90abcdef", 53 "12345678 90abcdef 12345678 90abcdef",
56 "fedcba09 87654321 fedcba09 87654321" 54 "fedcba09 87654321 fedcba09 87654321"
57 ] 55 ]
58 } 56 }
59 ] 57 ]
60 };}(), 58 };}(),
61 59
62 //----------------------------------------------------------------------------- 60 //-----------------------------------------------------------------------------
63 61
64 'joe_clipperz_offline_copy_data': function () { return { 62 'joe_clipperz_offline_copy_data': function () { return {
65 users:{ 63 users:{
66 'catchAllUser': { 64 'catchAllUser': {
67 __masterkey_test_value__: 'masterkey', 65 __masterkey_test_value__: 'masterkey',
68 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 66 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
69 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 67 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
70 }, 68 },
71 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 69 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
72 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 70 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
73 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 71 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
74 version: '0.2', 72 version: '0.2',
75 maxNumberOfRecords: '100', 73 maxNumberOfRecords: '100',
76 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}', 74 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"6tqzHY7/lB/JVfDi3iJ7BIJTiX1Fih//aTUF7IDoLdlnafC9hoIQ/5lGk+/Ezilw59n11ocPN31aOA9ddFGc9oa2vQ1BdymV8F91sWGLGyWft+PRCWOqxy7U1XxvbgyRbCs0mbtSLp/qlC6gewnAXJpH6KT9oURIjKkyaR8jJ7ng6IlfGUIL2KUFnAv6KNoWO5cdXDU0nrrdSYehcApmXYlTyreHDbrFlLJ2YuR9JLvw9bDxXi/xBY1wZgwiUsGVlG3j0e4f63mJVrpmPI1jhaXD3BQD8cbl96l1ImhYe1Boz53gLq94KSk+3bkjG4GRhvlDPtvk8vdSZPsYPsbC0Cu0M4TMS70nPX7qNj5LDvzrd+S+zDj1/CW0yctRThXstrxDyG/L75k/xdZcVbMzXQHQR4OwWWFiqGOnLpyiZIHGfV5+xZ1a1uxT9TPDoDdwPuE5P1Uwh3PeGc9jatk3waQN6fo3g8PQrCOtPn7C7b6y4MEjpAG4e53HFb0B/hEfK6ApycT6QAglsA3qF/tZyZbwNCwert4pG52rIG/PODZ1XxVZHFX8VFWeSxuk/jnPpJg/pvfpRzBMyCGVDJb/i+dlwFcnOAVvqju5xXJk4mu05XrngF10NzHnVRMfxwXmdtTDYE/lDuODy1SiE5yBZlt/Ff6a0eMS/P8HLsUS8+dtz9yOIQ8rh+52nVS7F5tFWXFOvT7nfq1L4HaHCigY187Jk0Y3LCsZW6ziB5qhKZlbQxdCAx5UDNWNs/F59qxVWP5k2UagBgAJoh+iMTZAMWkaURqQxY84SVYIkm9vNZv6Jf+ppFJNn6s3ZZSUe8gmmgMPJP0Lmoh/VCPNypzR+sZULfVFpmPmNXfaAOQ875iDgvUuBWsDSBdyx2+8Q+fUO0w+W4WkDM09VGmFxrHHjfpRsOT1B3dVFti2ypyiCdkvm878pvTS2j4Obweh6+bmzE7lqOXJgtQUydKNZIb3hNbjB7LwPro6e70ctm3eM9OLFT73u+khVM2UtAhfMseEb+Ny+PldW+VgXnHFm8n5CDBHoDJPXBfJq60l6+1OnDPfB+7tIgnCVH56CZ0jFX2EbxWS63xAHNLttfMtxdbkf4AbpanqLJvNiU4P0ThW4+VNRKBid0v78WC40rWX4UTEv9HPvUA5JUsj1v6+I5UI+quCUfx0vQgeO/gAlI0YuVgDBB1ouWUSES9+U9QIGoUsVTHDo4ZOEInsnhjPbz+IFyRMoMfbiYx3gviHluxHNGYsIMFxo+yB8aW/CedyWYt54ijgViPIXhH+R8bMgFBX4JX6hu8l3NMSYvMV82ua9Pnyl7NxbwuL1S/0JAp2uh0OzGMX9iOOcFWqbWVAX7NCePAG4VTJ0wZ2iL/MUGAVG72qBWvCb1ckavQc1LTw8l2vPG6YwFf0frFHsVvZsGHRptswFTp+77U1bpn/TL2MUXJQ9gQWgCQHxE+STunbJDDWOe9FZeKkJgjqQQ2E70UFoyUp4U/H1fA5Sy9+gS8QMtOcPJ6tCbcIXnq1nif+6bDBjtQCofs59Mm7ibwnofXPGkWv8Id3SyhW9YZCYhJZss2dkMyWfqw4jDysWxQAHjxZg4qgVXA9xpwuhu7O82vMOutk7vPyEuJ4gqlDroN4aPecD405YOEXWeWrWsL2V3y5PwXBrYWq22XzJeL3PvS9usj1Vg2TtG2O3HLuB6Rm6+i7kraiRbENemst4MjLrZwYjI07ZD7DUifsrUvjA50JXXb8pjudYqwUrTKOzcE/uZ1WbSbm+2x8PYVimLtDE4/lOp34J07WV7ZxJL8yk4J4CYRxLnnS7xps8skfy6glRA8fTKRVLv+9VqVxJgE3X/G8Kfosd9K03DJbD+L+h3kvLAAZ6Xr6FpbnA5HeGXzfQ/k5lBqIS39iqT2kZKMxIOXhfwmmuTSS25nk7hD+0R1TdnnTOYQrEn8bdyPuFXzd08FxN9KSYm2H1Gdg+2h+N9UWTED7zXmv/H+gfzk5gfoNOKyWWoaEFT/NL3ky6ApzuiokUj3x+xvCwOXoozLHXhdeZYtYkIu1HlYWQx1YAk2ilg47nnRhQQaYjMvIHfsdYjdb1CpGO5K1dYlRBOCMttp+j5QVz/jCSeCrMh8dtu9ZGLEZ3QL06tqmXp03fCsvKOG0it/KuNG5EJpfb6bV+5DsZvI6k4VLXjcKvZhhh+VZSf2mr+mzFEGKBSeleZvii2g8dVyaEBms37SBFCdIwkMxFRmzo/n+1m8axx9o57NPwISU4q8eAjUK2bWrBECZaI4FwLqmlGK9hMPGB/lbrcuHtlqmv5qzo2TJb5/xoX0LyJB/FZVk5Wsm8vC+O8b7o6JDxaPkOgy07+p8Sg9wuKVy6hHrFRnZ+MEZO3Bbk74omg4+6y4HVuRCgxztzRyUiYTssFphqKBsC/e6fQN0QtSwhLSld/B5qoPMn/9CMs8UxmRbA2Ekwi+7Ss51YsWNmd8dKUqxMKWFZOQYe2dbvcYbRwKwjrARxR7d5aaQr8b96hKsWs0YkLQDn71C3AQfEUvClvDXJdJ97B9WkDHz/DQ9EaIp9+4ZSl3SIrew09vUkvUSVGU7egHzv1Oe2gf4jI/3zToRq307AzCT1tF4k0VbInDFKb8YSG35UaJAtfTENvkAQ+8KmR3gQyHRupLi6D8TNvy/03n8naG8BV8+EArzmUAgxmfv3PTipnn3bdsaIFK1+uldQXVUoHm7PgZidzOHpNXvNzgrL3c3gv7Et/s="},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}',
77 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', 75 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
78 userDetailsVersion: '0.3', 76 userDetailsVersion: '0.3',
79 records: { 77 records: {
80 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 78 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
81 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx', 79 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
82 version: '0.2', 80 version: '0.2',
83 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 81 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
84 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 82 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
85 accessDate: 'Mon Jan 19 16:10:04 CET 2009', 83 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
86 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 84 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
87 versions: { 85 versions: {
88 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 86 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
89 header: '####', 87 header: '####',
90 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 88 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
91 version: '0.2', 89 version: '0.2',
92 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 90 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
93 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 91 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
94 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 92 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
95 } 93 }
96 } 94 }
97 }, 95 },
98 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 96 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
99 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL', 97 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
100 version: '0.3', 98 version: '0.3',
101 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 99 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
102 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 100 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
103 accessDate: 'Mon Jan 19 16:09:39 CET 2009', 101 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
104 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 102 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
105 versions: { 103 versions: {
106 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 104 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
107 header: '####', 105 header: '####',
108 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 106 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
109 version: '0.3', 107 version: '0.3',
110 creationDate: 'Fri Oct 17 17:00:31 CEST 2008', 108 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
111 updateDate: 'Fri Oct 17 17:00:31 CEST 2008', 109 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
112 accessDate: 'Fri Oct 17 17:00:31 CEST 2008' 110 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
113 }, 111 },
114 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 112 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
115 header: '####', 113 header: '####',
116 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 114 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
117 version: '0.3', 115 version: '0.3',
118 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 116 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js
index ed3a6a4..fae7ff0 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26MochiKit.Base.update(testData, { 24MochiKit.Base.update(testData, {
27 25
28 //------------------------------------------------------------------------- 26 //-------------------------------------------------------------------------
29 27
30 'OLD_joe_clipperz_offline_copy_data': { 28 'OLD_joe_clipperz_offline_copy_data': {
31 users:{ 29 users:{
32 'catchAllUser': { 30 'catchAllUser': {
33 __masterkey_test_value__: 'masterkey', 31 __masterkey_test_value__: 'masterkey',
34 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 32 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
35 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 33 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
36 }, 34 },
37 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 35 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
38 s: '097ca38b1792023d6c1ffca50606b6040c6b27a7667e355ba9e54e6d47d8bf23', 36 s: '097ca38b1792023d6c1ffca50606b6040c6b27a7667e355ba9e54e6d47d8bf23',
39 v: '34b9f3ab193bb12dc93c791637b8d80364564b9a39ed7130cd168d52876914e4', 37 v: '34b9f3ab193bb12dc93c791637b8d80364564b9a39ed7130cd168d52876914e4',
40 version: '0.2', 38 version: '0.2',
41 maxNumberOfRecords: '100', 39 maxNumberOfRecords: '100',
42 userDetails: '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', 40 userDetails: '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',
43 statistics: 'iFI3fKfuUd5Tqj/iRCJnIk7isZ2FOYPr/yNfICm2U35oUeTJ/RA+l+kbWiYrecpIEgk=', 41 statistics: 'iFI3fKfuUd5Tqj/iRCJnIk7isZ2FOYPr/yNfICm2U35oUeTJ/RA+l+kbWiYrecpIEgk=',
44 userDetailsVersion: '0.2', 42 userDetailsVersion: '0.2',
45 records: { 43 records: {
46 /* 01 */ '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 44 /* 01 */ '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
47 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx', 45 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
48 version: '0.2', 46 version: '0.2',
49 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 47 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
50 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 48 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
51 accessDate: 'Mon Jan 19 16:10:04 CET 2009', 49 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
52 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 50 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
53 versions: { 51 versions: {
54 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 52 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
55 header: '####', 53 header: '####',
56 data: '.....', 54 data: '.....',
57 version: '0.2', 55 version: '0.2',
58 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 56 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
59 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 57 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
60 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 58 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
61 } 59 }
62 } 60 }
63 }, 61 },
64 /* 02 */ '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { 62 /* 02 */ '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
65 data: '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', 63 data: '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',
66 version: '0.2', 64 version: '0.2',
67 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 65 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
68 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 66 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
69 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 67 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
70 }, 68 },
71 /* 03 */ '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { 69 /* 03 */ '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
72 data: 'B7RNc32W4K53PWYWQ4aUkqSLV2O4bwExYXVPFT+50MHxrhYt4/yh2idYXAooF1ImaIlvyUsIbI4EnIoBQ33ed2wxuSA9HVC4+wTrE05EfjYOw66yJO6R6TbIazOs0Fob5PJCFEW6evmb6WWf5KsHwifOo+ACMHK799yZ1dxfaIEjRBmLCtnc8sTNvo8i6McAf7WCffA1vXbyVPEhxJjmrfIDqvkWsNR7jDV5xIA021WicOS0FxOnzU3FecU7EF/UPcYjTKfe8IKw4nDXSKIIgXqCdzNYsyZkw2OnMDVJoSwNdfiog3H4zFy2m9KZqPjwnHHj5BE8rdx0JuZoSnTFLR05p4KdWfOU4BrjehAWXZdudYqsovtDm9uMLgUfx4DV/JKVmGAZ49GWM1Tx7pY5PBbJRTO3674FGWYHTPEMiIpDk+zt1sYIR2YBbJTq4fFOIPsgmOfvYdTkSvdHLk0fbxoK12w+atgmXAiNgE6T7DlYT0IMZlEesw0Spchxoo7lTBUPXC93bl/JugyhoRLUof4dxFvsIvd18Gnop+h7aCVW1S3lqZ36TG/N+hlM4U54FkpHjJi2fN8M8EKF0N8n399m58RNfsX2FriUVHozdb5gpgUXnQnVaAUrtv177lz0sRO+9KqbhJ16dCDzMFLcarBvXGqWkj+ZfkpNIaoyl8KTeHTQTbSS2IwLTvs69fbMW6Mub3VD81CXyY3MXyF4hT0U3CFVD4jQg+xODNnqqrkl/LebWy/XP/HOoNTxjygEu1JcS7zCptRagNoucXVkWinyKGjR9fSEltsrXG2pm4w2qsovRB3vfYp7kx2m5I9qc11K+JKhgPUmpm0S4BnPdfpRMXq0w8kxu08Mwm1Debhrzrgjw1/s1ZtcpoFgJv4EWLboWbo+CKWYdq0AGl+b5UHREPnGOM9o9bOg3uvaOEKZyMq8wxECBjdas4wjRbMY83PcBfzCbOU+POrcbalmtwn4/ILkHPsUcaOHYcnKwkxSYIDRxQc69mHw1+vilSHUQ5dZYSWIRvV3yPe9eqZPWJsWrOyhPLCf18BoNdfbgHFL7b2KN9xLMz0tdHxVozH2TnwAavcNqAE0hVIgtyEDoT4rI7FVMSu5mCIN2KOxgXB8XREZokT1BQ8+rz6JraS3JYQNz+7Bd6iB6OaTStsFoaBkj50MszNdwhRViOCCUk4bUr45XRtyh4ZEXj/I4pyJUkhR5H8/qKKD', 70 data: 'B7RNc32W4K53PWYWQ4aUkqSLV2O4bwExYXVPFT+50MHxrhYt4/yh2idYXAooF1ImaIlvyUsIbI4EnIoBQ33ed2wxuSA9HVC4+wTrE05EfjYOw66yJO6R6TbIazOs0Fob5PJCFEW6evmb6WWf5KsHwifOo+ACMHK799yZ1dxfaIEjRBmLCtnc8sTNvo8i6McAf7WCffA1vXbyVPEhxJjmrfIDqvkWsNR7jDV5xIA021WicOS0FxOnzU3FecU7EF/UPcYjTKfe8IKw4nDXSKIIgXqCdzNYsyZkw2OnMDVJoSwNdfiog3H4zFy2m9KZqPjwnHHj5BE8rdx0JuZoSnTFLR05p4KdWfOU4BrjehAWXZdudYqsovtDm9uMLgUfx4DV/JKVmGAZ49GWM1Tx7pY5PBbJRTO3674FGWYHTPEMiIpDk+zt1sYIR2YBbJTq4fFOIPsgmOfvYdTkSvdHLk0fbxoK12w+atgmXAiNgE6T7DlYT0IMZlEesw0Spchxoo7lTBUPXC93bl/JugyhoRLUof4dxFvsIvd18Gnop+h7aCVW1S3lqZ36TG/N+hlM4U54FkpHjJi2fN8M8EKF0N8n399m58RNfsX2FriUVHozdb5gpgUXnQnVaAUrtv177lz0sRO+9KqbhJ16dCDzMFLcarBvXGqWkj+ZfkpNIaoyl8KTeHTQTbSS2IwLTvs69fbMW6Mub3VD81CXyY3MXyF4hT0U3CFVD4jQg+xODNnqqrkl/LebWy/XP/HOoNTxjygEu1JcS7zCptRagNoucXVkWinyKGjR9fSEltsrXG2pm4w2qsovRB3vfYp7kx2m5I9qc11K+JKhgPUmpm0S4BnPdfpRMXq0w8kxu08Mwm1Debhrzrgjw1/s1ZtcpoFgJv4EWLboWbo+CKWYdq0AGl+b5UHREPnGOM9o9bOg3uvaOEKZyMq8wxECBjdas4wjRbMY83PcBfzCbOU+POrcbalmtwn4/ILkHPsUcaOHYcnKwkxSYIDRxQc69mHw1+vilSHUQ5dZYSWIRvV3yPe9eqZPWJsWrOyhPLCf18BoNdfbgHFL7b2KN9xLMz0tdHxVozH2TnwAavcNqAE0hVIgtyEDoT4rI7FVMSu5mCIN2KOxgXB8XREZokT1BQ8+rz6JraS3JYQNz+7Bd6iB6OaTStsFoaBkj50MszNdwhRViOCCUk4bUr45XRtyh4ZEXj/I4pyJUkhR5H8/qKKD',
73 version: '0.2', 71 version: '0.2',
74 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 72 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
75 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 73 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
76 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 74 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
77 }, 75 },
78 /* 04 */ '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': { 76 /* 04 */ '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
79 data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA', 77 data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA',
80 version: '0.2', 78 version: '0.2',
81 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 79 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
82 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 80 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
83 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 81 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
84 }, 82 },
85 /* 05 */ '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { 83 /* 05 */ '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
86 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', 84 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
87 version: '0.2', 85 version: '0.2',
88 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 86 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
89 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 87 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
90 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 88 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
91 }, 89 },
92 /* 06 */ '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { 90 /* 06 */ '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
93 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', 91 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
94 version: '0.2', 92 version: '0.2',
95 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 93 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
96 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 94 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
97 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 95 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
98 }, 96 },
99 /* 07 */ '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': { 97 /* 07 */ '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
100 data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==', 98 data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==',
101 version: '0.2', 99 version: '0.2',
102 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 100 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
103 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 101 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
104 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 102 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
105 }, 103 },
106 /* 08 */ '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': { 104 /* 08 */ '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
107 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=', 105 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=',
108 version: '0.2', 106 version: '0.2',
109 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 107 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
110 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 108 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
111 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 109 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
112 }, 110 },
113 /* 09 */ 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': { 111 /* 09 */ 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': {
114 data: 'YXBq1ZlFhoosb2Krnk0Tk8+LKyecTeZ3UdJujrryEgvMnhGJvSVVtN3uph9gts10Kw+tF5wvdAtBFdMUpvcP3mOlbnX7+HCz+JsJcLLVvuGBU9ciwok5kRKQuvWffmP7qFLuqO2VJUj2ozjcpVssStZOrfDXWrJwYfkd9IMnOJVmCwjFeXpPlkOeHNyhjPlfZhWWlTga6xLdEXaVeZyjDegzhlhh9U3e1CLupLTwdxXtNCPRXp8gU7e/I9HP/qdnj5BzgDxaKx29v/AUcgOt3jq5oWwePXZL9nVOp6rh/UqduM88tyxEbnBQxcGj9KxTVsIh6ywzQZgnPtfrPaqX4Fvb1P9cGN80/F+/JXVgL3fvrcxJDGxZj6VYFTA+cHM6sV+F4/7wMLUVlCcn78BB6/k3DC4mYUv+8LSxfZf22bWCcSyubPTRhmCm2/sgdOloDUKT4AjfZivlpJjkYNDtNmZn/rUpMr3uLiHeWDDNB+eGqk3lAFhihBPXqDJ3o+8c9jrznedMxQPkgYD0V9ryDauY2RYjQIhmXqQlnGxpGOO2lFDGYtkwsBplPy6LDkudzJVAqp5trBR8Ty87k65hbhinGCra/DgPqIxjaN5pvZbXkOLoaIoLnE9RRGdAwfUTMIg/maNRoDKaHO0hJ3ksCflu71H9tzPjGM7BBjWjQgUvwDJOgnEPyZv+noOiHfNIq3u8CfI8e867gnEbdtd3oPYex1aBYIQ1ELAxI8szUtSeMDHOouXrZKwy04xVdC90KHnVWl49scE2QfgqV4hqzFjtuQgZOqQ50bI+duWDm7YYTwKVlo5QKy40faW6dPIfDPRsxY6M3gcL2OPBm+WMopUC/o/AFSpxPaut1DOr3mXBip0Ejam9xmJhMOUwIJDoE2U+8S2s+UJjRunLb680vqbddF24aWxpLL1Fg+hlRZ/Jz1ZajonH9ktQhoQaTl+w/4uHhMZjKH7/FaRqge2WMMwVjOd7VXNByBPia6W7VbmDk8LFCeCsC1DchcDaMj/JmoGXucqzDO/sOIby2YCBsV72ReqTNtu6SLZe4G61DWA7j+6NiOSmAutYox6VsoRsKaJYkyBgmq5hWDZmWOJ/cC1pQa9EMoXzcaEPicmXx5YE4xF15VWpI8cKTM/StLtLcqTs78Z0fQAicz8YhhNdVCGp/zcjJRPyL6XCDhpvMxcIOnU7', 112 data: 'YXBq1ZlFhoosb2Krnk0Tk8+LKyecTeZ3UdJujrryEgvMnhGJvSVVtN3uph9gts10Kw+tF5wvdAtBFdMUpvcP3mOlbnX7+HCz+JsJcLLVvuGBU9ciwok5kRKQuvWffmP7qFLuqO2VJUj2ozjcpVssStZOrfDXWrJwYfkd9IMnOJVmCwjFeXpPlkOeHNyhjPlfZhWWlTga6xLdEXaVeZyjDegzhlhh9U3e1CLupLTwdxXtNCPRXp8gU7e/I9HP/qdnj5BzgDxaKx29v/AUcgOt3jq5oWwePXZL9nVOp6rh/UqduM88tyxEbnBQxcGj9KxTVsIh6ywzQZgnPtfrPaqX4Fvb1P9cGN80/F+/JXVgL3fvrcxJDGxZj6VYFTA+cHM6sV+F4/7wMLUVlCcn78BB6/k3DC4mYUv+8LSxfZf22bWCcSyubPTRhmCm2/sgdOloDUKT4AjfZivlpJjkYNDtNmZn/rUpMr3uLiHeWDDNB+eGqk3lAFhihBPXqDJ3o+8c9jrznedMxQPkgYD0V9ryDauY2RYjQIhmXqQlnGxpGOO2lFDGYtkwsBplPy6LDkudzJVAqp5trBR8Ty87k65hbhinGCra/DgPqIxjaN5pvZbXkOLoaIoLnE9RRGdAwfUTMIg/maNRoDKaHO0hJ3ksCflu71H9tzPjGM7BBjWjQgUvwDJOgnEPyZv+noOiHfNIq3u8CfI8e867gnEbdtd3oPYex1aBYIQ1ELAxI8szUtSeMDHOouXrZKwy04xVdC90KHnVWl49scE2QfgqV4hqzFjtuQgZOqQ50bI+duWDm7YYTwKVlo5QKy40faW6dPIfDPRsxY6M3gcL2OPBm+WMopUC/o/AFSpxPaut1DOr3mXBip0Ejam9xmJhMOUwIJDoE2U+8S2s+UJjRunLb680vqbddF24aWxpLL1Fg+hlRZ/Jz1ZajonH9ktQhoQaTl+w/4uHhMZjKH7/FaRqge2WMMwVjOd7VXNByBPia6W7VbmDk8LFCeCsC1DchcDaMj/JmoGXucqzDO/sOIby2YCBsV72ReqTNtu6SLZe4G61DWA7j+6NiOSmAutYox6VsoRsKaJYkyBgmq5hWDZmWOJ/cC1pQa9EMoXzcaEPicmXx5YE4xF15VWpI8cKTM/StLtLcqTs78Z0fQAicz8YhhNdVCGp/zcjJRPyL6XCDhpvMxcIOnU7',
115 version: '0.2', 113 version: '0.2',
116 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 114 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
117 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 115 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
118 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 116 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html
index a651830..793f763 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html
@@ -1,103 +1,101 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.DataModel.User - test</title> 26 <title>Clipperz.PM.DataModel.User - test</title>
29 27
30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script> 36 <script type='text/javascript' src='../../../../../js/Clipperz/Date.js'></script>
39 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script> 37 <script type='text/javascript' src='../../../../../js/Clipperz/ByteArray.js'></script>
40 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script> 38 <script type='text/javascript' src='../../../../../js/Clipperz/Logging.js'></script>
41 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script> 39 <script type='text/javascript' src='../../../../../js/Clipperz/Async.js'></script>
42 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script> 40 <script type='text/javascript' src='../../../../../js/Clipperz/Signal.js'></script>
43 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 41 <script type='text/javascript' src='../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
44 42
45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script> 43 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/Base.js'></script>
46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script> 44 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/BigInt.js'></script>
47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script> 45 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/AES.js'></script>
48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script> 46 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SHA.js'></script>
49 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script> 47 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/PRNG.js'></script>
50 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script> 48 <script type='text/javascript' src='../../../../../js/Clipperz/Crypto/SRP.js'></script>
51 49
52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script> 50 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Toll.js'></script>
53 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script> 51 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy.js'></script>
54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 52 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
55 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 53 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 54 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
57 55
58 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script> 56 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Connection.js'></script>
59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script> 57 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Crypto.js'></script>
60 58
61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script> 59 <script type='text/javascript' src='../../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script>
62 60
63 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script> 61 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings.js'></script>
64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 62 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script> 63 <script type='text/javascript' src='../../../../../js/Clipperz/PM/Date.js'></script>
66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 64 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script> 65 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.js'></script>
68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 66 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 67 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 68 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> 69 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> 70 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> 71 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script> 72 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.js'></script>
75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 73 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 74 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
77 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> 75 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
78 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> 76 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
79 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> 77 <script type='text/javascript' src='../../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
80 78
81 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script> 79 <script type="text/javascript" src="../../../../SimpleTest/SimpleTest.Async.js"></script>
82<script> 80<script>
83 Clipperz_IEisBroken = false; 81 Clipperz_IEisBroken = false;
84</script> 82</script>
85 83
86<!--[if IE]><script> 84<!--[if IE]><script>
87Clipperz_IEisBroken = true; 85Clipperz_IEisBroken = true;
88Clipperz_normalizedNewLine = '\x0d\x0a'; 86Clipperz_normalizedNewLine = '\x0d\x0a';
89</script><![endif]--> 87</script><![endif]-->
90 88
91</head> 89</head>
92<body> 90<body>
93 91
94<pre id="test"> 92<pre id="test">
95<script> 93<script>
96 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us'); 94 Clipperz.PM.Strings.Languages.setSelectedLanguage('en-us');
97</script> 95</script>
98<script type="text/javascript" src="User.data.js"></script> 96<script type="text/javascript" src="User.data.js"></script>
99<script type="text/javascript" src="User.data.old.js"></script> 97<script type="text/javascript" src="User.data.old.js"></script>
100<script type="text/javascript" src="User.test.js"></script> 98<script type="text/javascript" src="User.test.js"></script>
101</pre> 99</pre>
102</body> 100</body>
103</html> 101</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js
index c9ca3d6..45f3297 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 24Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
27 25
28var tests = { 26var tests = {
29 27
30 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
31 29
32 'invertIndex_test': function (someTestArgs) { 30 'invertIndex_test': function (someTestArgs) {
33 var testIndex; 31 var testIndex;
34 var invertedIndex; 32 var invertedIndex;
35 33
36 testIndex = { 34 testIndex = {
37 'key1': 'value1', 35 'key1': 'value1',
38 'key2': 'value2', 36 'key2': 'value2',
39 'key3': 'value3', 37 'key3': 'value3',
40 'key4': 'value4', 38 'key4': 'value4',
41 'key5': 'value5' 39 'key5': 'value5'
42 }; 40 };
43 41
44 invertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(testIndex); 42 invertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(testIndex);
45 43
46 SimpleTest.is(MochiKit.Base.keys(invertedIndex).length, MochiKit.Base.keys(testIndex).length, "the inverted index has the same number of elements as the original index"); 44 SimpleTest.is(MochiKit.Base.keys(invertedIndex).length, MochiKit.Base.keys(testIndex).length, "the inverted index has the same number of elements as the original index");
47 SimpleTest.is(invertedIndex['value1'], 'key1', "the first element has been correctly inverted"); 45 SimpleTest.is(invertedIndex['value1'], 'key1', "the first element has been correctly inverted");
48 SimpleTest.is(invertedIndex['value2'], 'key2', "the second element has been correctly inverted"); 46 SimpleTest.is(invertedIndex['value2'], 'key2', "the second element has been correctly inverted");
49 SimpleTest.is(invertedIndex['value3'], 'key3', "the third element has been correctly inverted"); 47 SimpleTest.is(invertedIndex['value3'], 'key3', "the third element has been correctly inverted");
50 SimpleTest.is(invertedIndex['value4'], 'key4', "the forth element has been correctly inverted"); 48 SimpleTest.is(invertedIndex['value4'], 'key4', "the forth element has been correctly inverted");
51 SimpleTest.is(invertedIndex['value5'], 'key5', "the fifth element has been correctly inverted"); 49 SimpleTest.is(invertedIndex['value5'], 'key5', "the fifth element has been correctly inverted");
52 return MochiKit.Async.succeed('done'); 50 return MochiKit.Async.succeed('done');
53 }, 51 },
54 52
55 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
56 54
57 'joe_clipperz_offline_copy_test': function(someTestArgs) { 55 'joe_clipperz_offline_copy_test': function(someTestArgs) {
58 var deferredResult; 56 var deferredResult;
59 var proxy; 57 var proxy;
60 var user; 58 var user;
61 59
62 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); 60 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
63 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 61 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
64 62
65 deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_test", someTestArgs); 63 deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_test", someTestArgs);
66 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 64 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
67 deferredResult.addMethod(user, 'login'); 65 deferredResult.addMethod(user, 'login');
68 deferredResult.addMethod(user, 'getRecords'); 66 deferredResult.addMethod(user, 'getRecords');
69 deferredResult.addCallback(function (someRecords) { 67 deferredResult.addCallback(function (someRecords) {
70 is(someRecords.length, 20,"joe_clipperz_offline_copy_test - joe has 20 records"); 68 is(someRecords.length, 20,"joe_clipperz_offline_copy_test - joe has 20 records");
71 }); 69 });
72 70
73 deferredResult.addMethod(user, 'getRecords'); 71 deferredResult.addMethod(user, 'getRecords');
74 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); 72 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label'));
75 deferredResult.addCallback(Clipperz.Async.collectAll); 73 deferredResult.addCallback(Clipperz.Async.collectAll);
76 deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); 74 deferredResult.addCallback(MochiKit.Base.methodcaller('sort'));
77 deferredResult.addCallback(function (someSortedLabels) { 75 deferredResult.addCallback(function (someSortedLabels) {
78 SimpleTest.is(someSortedLabels.length, 20, "We got all the labels"); 76 SimpleTest.is(someSortedLabels.length, 20, "We got all the labels");
79 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); 77 SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct");
80 SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); 78 SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct");
81 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); 79 SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct");
82 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); 80 SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct");
83 SimpleTest.is(someSortedLabels[4], "Example Attack", "The fifth label is correct"); 81 SimpleTest.is(someSortedLabels[4], "Example Attack", "The fifth label is correct");
84 SimpleTest.is(someSortedLabels[5], "Expedia.com", "The sixth label is correct"); 82 SimpleTest.is(someSortedLabels[5], "Expedia.com", "The sixth label is correct");
85 SimpleTest.is(someSortedLabels[6], "Google Account", "The seventh label is correct"); 83 SimpleTest.is(someSortedLabels[6], "Google Account", "The seventh label is correct");
86 SimpleTest.is(someSortedLabels[7], "Home burglar alarm", "The eighth label is correct"); 84 SimpleTest.is(someSortedLabels[7], "Home burglar alarm", "The eighth label is correct");
87 SimpleTest.is(someSortedLabels[8], "Jaiku", "The ninth label is correct"); 85 SimpleTest.is(someSortedLabels[8], "Jaiku", "The ninth label is correct");
88 SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct"); 86 SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct");
89 SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct"); 87 SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct");
90 SimpleTest.is(someSortedLabels[11], "Microsoft Office CD Key","The 12th label is correct"); 88 SimpleTest.is(someSortedLabels[11], "Microsoft Office CD Key","The 12th label is correct");
91 SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct"); 89 SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct");
92 SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct"); 90 SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct");
93 SimpleTest.is(someSortedLabels[14], "SAP - Login", "The 15th label is correct"); 91 SimpleTest.is(someSortedLabels[14], "SAP - Login", "The 15th label is correct");
94 SimpleTest.is(someSortedLabels[15], "The New York Times", "The 16th label is correct"); 92 SimpleTest.is(someSortedLabels[15], "The New York Times", "The 16th label is correct");
95 SimpleTest.is(someSortedLabels[16], "Web password", "The 17th label is correct"); 93 SimpleTest.is(someSortedLabels[16], "Web password", "The 17th label is correct");
96 SimpleTest.is(someSortedLabels[17], "Web password", "The 18th label is correct"); 94 SimpleTest.is(someSortedLabels[17], "Web password", "The 18th label is correct");
97 SimpleTest.is(someSortedLabels[18], "Yahoo! Account", "The 19th label is correct"); 95 SimpleTest.is(someSortedLabels[18], "Yahoo! Account", "The 19th label is correct");
98 SimpleTest.is(someSortedLabels[19], "del.icio.us", "The 20th label is correct"); 96 SimpleTest.is(someSortedLabels[19], "del.icio.us", "The 20th label is correct");
99 }); 97 });
100 deferredResult.callback(); 98 deferredResult.callback();
101 99
102 return deferredResult; 100 return deferredResult;
103 }, 101 },
104 102
105 //------------------------------------------------------------------------- 103 //-------------------------------------------------------------------------
106 104
107 'joe_clipperz_offline_copy_getDirectLogins_test': function(someTestArgs) { 105 'joe_clipperz_offline_copy_getDirectLogins_test': function(someTestArgs) {
108 var deferredResult; 106 var deferredResult;
109 var proxy; 107 var proxy;
110 var user; 108 var user;
111 109
112 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); 110 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true});
113 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 111 user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
114 112
115 deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_getDirectLogins_test", someTestArgs); 113 deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_getDirectLogins_test", someTestArgs);
116 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 114 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
117 deferredResult.addMethod(user, 'login'); 115 deferredResult.addMethod(user, 'login');
118 deferredResult.addMethod(user, 'getDirectLogins'); 116 deferredResult.addMethod(user, 'getDirectLogins');
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html
index 237c0ea..8aacac5 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html
@@ -1,44 +1,42 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.DataModel.* - tests</title> 26 <title>Clipperz.PM.DataModel.* - tests</title>
29 27
30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../SimpleTest/TestRunner.js"></script> 29 <script type="text/javascript" src="../../../../SimpleTest/TestRunner.js"></script>
32</head> 30</head>
33<body> 31<body>
34<script> 32<script>
35TestRunner.runTests( 33TestRunner.runTests(
36 'EncryptedRemoteObject.html', 34 'EncryptedRemoteObject.html',
37 'Record.html', 35 'Record.html',
38 'DirectLogin.html', 36 'DirectLogin.html',
39 'User.html', 37 'User.html',
40 'OneTimePassword.html' 38 'OneTimePassword.html'
41); 39);
42</script> 40</script>
43</body> 41</body>
44</html> \ No newline at end of file 42</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Date.html b/frontend/gamma/tests/tests/Clipperz/PM/Date.html
index 7b87185..4a2760a 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Date.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Date.html
@@ -1,55 +1,53 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.Date - test</title> 26 <title>Clipperz.PM.Date - test</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
40 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
41 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
42 40
43 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
46 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 44 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
47 45
48</head> 46</head>
49<body> 47<body>
50<pre id="test"> 48<pre id="test">
51 <script type="text/javascript" src="Date.test.js"></script> 49 <script type="text/javascript" src="Date.test.js"></script>
52</pre> 50</pre>
53 51
54</body> 52</body>
55</html> 53</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js
index e4b4db6..ff4745f 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js
@@ -1,87 +1,85 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26var tests = { 24var tests = {
27 25
28 //------------------------------------------------------------------------- 26 //-------------------------------------------------------------------------
29 27
30 'offlineDataParsing_test': function () { 28 'offlineDataParsing_test': function () {
31 var value; 29 var value;
32 varparsedValue; 30 varparsedValue;
33 var expectedValue; 31 var expectedValue;
34 32
35 value = 'Tue Mar 27 06:41:37 PDT 2007'; 33 value = 'Tue Mar 27 06:41:37 PDT 2007';
36 parsedValue = Clipperz.PM.Date.parse(value); 34 parsedValue = Clipperz.PM.Date.parse(value);
37 expectedValue = new Date(); 35 expectedValue = new Date();
38 expectedValue.setUTCFullYear(2007, 03 - 1, 27); 36 expectedValue.setUTCFullYear(2007, 03 - 1, 27);
39 expectedValue.setUTCHours(13, 41, 37); 37 expectedValue.setUTCHours(13, 41, 37);
40 // SimpleTest.is(parsedValue.toString(), 'Tue Mar 27 2007 15:41:37 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [1]"); 38 // SimpleTest.is(parsedValue.toString(), 'Tue Mar 27 2007 15:41:37 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [1]");
41 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [1]"); 39 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [1]");
42 40
43 value = 'Thu May 10 15:01:21 PDT 2007'; 41 value = 'Thu May 10 15:01:21 PDT 2007';
44 parsedValue = Clipperz.PM.Date.parse(value); 42 parsedValue = Clipperz.PM.Date.parse(value);
45 expectedValue = new Date(); 43 expectedValue = new Date();
46 expectedValue.setUTCFullYear(2007, 05 - 1, 10); 44 expectedValue.setUTCFullYear(2007, 05 - 1, 10);
47 expectedValue.setUTCHours(22, 01, 21); 45 expectedValue.setUTCHours(22, 01, 21);
48 // SimpleTest.is(parsedValue.toString(), 'Fri May 11 2007 00:01:21 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [3]"); 46 // SimpleTest.is(parsedValue.toString(), 'Fri May 11 2007 00:01:21 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [3]");
49 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [3]"); 47 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [3]");
50 48
51 value = 'Thu May 10 15:01:21 PST 2007'; 49 value = 'Thu May 10 15:01:21 PST 2007';
52 parsedValue = Clipperz.PM.Date.parse(value); 50 parsedValue = Clipperz.PM.Date.parse(value);
53 expectedValue = new Date(); 51 expectedValue = new Date();
54 expectedValue.setUTCFullYear(2007, 05 - 1, 10); 52 expectedValue.setUTCFullYear(2007, 05 - 1, 10);
55 expectedValue.setUTCHours(23, 01, 21); 53 expectedValue.setUTCHours(23, 01, 21);
56 // SimpleTest.is(parsedValue.toString(), 'Fri May 11 2007 01:01:21 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [3]"); 54 // SimpleTest.is(parsedValue.toString(), 'Fri May 11 2007 01:01:21 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [3]");
57 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [3]"); 55 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [3]");
58 }, 56 },
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'onlineDataParsing_test': function () { 60 'onlineDataParsing_test': function () {
63 var value; 61 var value;
64 varparsedValue; 62 varparsedValue;
65 var expectedValue; 63 var expectedValue;
66 64
67 value = 'Tue, 27 March 2007 06:41:37 PDT'; 65 value = 'Tue, 27 March 2007 06:41:37 PDT';
68 parsedValue = Clipperz.PM.Date.parse(value); 66 parsedValue = Clipperz.PM.Date.parse(value);
69 expectedValue = new Date(); 67 expectedValue = new Date();
70 expectedValue.setUTCFullYear(2007, 03 - 1, 27); 68 expectedValue.setUTCFullYear(2007, 03 - 1, 27);
71 expectedValue.setUTCHours(13, 41, 37); 69 expectedValue.setUTCHours(13, 41, 37);
72 70
73 // SimpleTest.is(parsedValue.toString(), 'Tue Mar 27 2007 15:41:37 GMT+0200 (CEST)', "the data in the format returned by the server is processed correctly"); 71 // SimpleTest.is(parsedValue.toString(), 'Tue Mar 27 2007 15:41:37 GMT+0200 (CEST)', "the data in the format returned by the server is processed correctly");
74 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format returned by the server is processed correctly"); 72 SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format returned by the server is processed correctly");
75 }, 73 },
76 74
77 //------------------------------------------------------------------------- 75 //-------------------------------------------------------------------------
78 'syntaxFix': MochiKit.Base.noop 76 'syntaxFix': MochiKit.Base.noop
79}; 77};
80 78
81//############################################################################# 79//#############################################################################
82 80
83Clipperz.PM.Strings.Languages.initSetup(); 81Clipperz.PM.Strings.Languages.initSetup();
84SimpleTest.runDeferredTests("Clipperz.PM.Date", tests, {trace:false}); 82SimpleTest.runDeferredTests("Clipperz.PM.Date", tests, {trace:false});
85 83
86 84
87 85
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/PIN.html b/frontend/gamma/tests/tests/Clipperz/PM/PIN.html
index a08b286..9282bb9 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/PIN.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/PIN.html
@@ -1,66 +1,64 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.Proxy - TEST</title> 26 <title>Clipperz.PM.Proxy - TEST</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
50<!-- 48<!--
51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
52 50
53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 51 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
54--> 52-->
55 53
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/PIN.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/PIN.js'></script>
57 55
58 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 56 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
59 57
60</head> 58</head>
61<body> 59<body>
62<pre id="test"> 60<pre id="test">
63 <script type="text/javascript" src="PIN.test.js"></script> 61 <script type="text/javascript" src="PIN.test.js"></script>
64</pre> 62</pre>
65</body> 63</body>
66</html> 64</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/PIN.test.js b/frontend/gamma/tests/tests/Clipperz/PM/PIN.test.js
index ed795dd..abd489e 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/PIN.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/PIN.test.js
@@ -1,97 +1,95 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 24Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
27 25
28 Clipperz.PM.PIN['CREDENTIALS'] ='TEST.CLIPPERZ.CREDENTIALS'; 26 Clipperz.PM.PIN['CREDENTIALS'] ='TEST.CLIPPERZ.CREDENTIALS';
29 Clipperz.PM.PIN['FAILURE_COUNT'] ='TEST.CLIPPERZ.FAILED_LOGIN_COUNT'; 27 Clipperz.PM.PIN['FAILURE_COUNT'] ='TEST.CLIPPERZ.FAILED_LOGIN_COUNT';
30 28
31 29
32var tests = { 30var tests = {
33 31
34 //------------------------------------------------------------------------- 32 //-------------------------------------------------------------------------
35 33
36 'clearCredentials': function () { 34 'clearCredentials': function () {
37 localStorage.removeItem(Clipperz.PM.PIN['CREDENTIALS']); 35 localStorage.removeItem(Clipperz.PM.PIN['CREDENTIALS']);
38 localStorage.removeItem(Clipperz.PM.PIN['FAILURE_COUNT']); 36 localStorage.removeItem(Clipperz.PM.PIN['FAILURE_COUNT']);
39 }, 37 },
40 38
41 //------------------------------------------------------------------------- 39 //-------------------------------------------------------------------------
42 40
43 'isSet': function () { 41 'isSet': function () {
44 tests.clearCredentials(); 42 tests.clearCredentials();
45 43
46 is(false, Clipperz.PM.PIN.isSet(), "after cleaning all values, credentials should not be set"); 44 is(false, Clipperz.PM.PIN.isSet(), "after cleaning all values, credentials should not be set");
47 45
48 Clipperz.PM.PIN.setCredentialsWithPIN("1234", {'username':'joe', 'passphrase':'eoj'}); 46 Clipperz.PM.PIN.setCredentialsWithPIN("1234", {'username':'joe', 'passphrase':'eoj'});
49 is(true, Clipperz.PM.PIN.isSet(), "once saved, they should be found"); 47 is(true, Clipperz.PM.PIN.isSet(), "once saved, they should be found");
50 }, 48 },
51 49
52 'recordFailedAttempt': function () { 50 'recordFailedAttempt': function () {
53 tests.clearCredentials(); 51 tests.clearCredentials();
54 52
55 Clipperz.PM.PIN.setCredentialsWithPIN("1234", {'username':'joe', 'passphrase':'eoj'}); 53 Clipperz.PM.PIN.setCredentialsWithPIN("1234", {'username':'joe', 'passphrase':'eoj'});
56 is(true, Clipperz.PM.PIN.isSet(), "once saved, they should be found"); 54 is(true, Clipperz.PM.PIN.isSet(), "once saved, they should be found");
57 Clipperz.PM.PIN.recordFailedAttempt(); 55 Clipperz.PM.PIN.recordFailedAttempt();
58 is(true, Clipperz.PM.PIN.isSet(), "1st wrong PIN -> keep credentials"); 56 is(true, Clipperz.PM.PIN.isSet(), "1st wrong PIN -> keep credentials");
59 Clipperz.PM.PIN.recordFailedAttempt(); 57 Clipperz.PM.PIN.recordFailedAttempt();
60 is(true, Clipperz.PM.PIN.isSet(), "2nd wrong PIN -> keep credentials"); 58 is(true, Clipperz.PM.PIN.isSet(), "2nd wrong PIN -> keep credentials");
61 Clipperz.PM.PIN.recordFailedAttempt(); 59 Clipperz.PM.PIN.recordFailedAttempt();
62 is(false, Clipperz.PM.PIN.isSet(), "3rd wrong PIN -> REMOVE credentials"); 60 is(false, Clipperz.PM.PIN.isSet(), "3rd wrong PIN -> REMOVE credentials");
63 61
64 Clipperz.PM.PIN.setCredentialsWithPIN("1234", {'username':'joe', 'passphrase':'eoj'}); 62 Clipperz.PM.PIN.setCredentialsWithPIN("1234", {'username':'joe', 'passphrase':'eoj'});
65 is(true, Clipperz.PM.PIN.isSet(), "once saved, they should be found"); 63 is(true, Clipperz.PM.PIN.isSet(), "once saved, they should be found");
66 Clipperz.PM.PIN.recordFailedAttempt(); 64 Clipperz.PM.PIN.recordFailedAttempt();
67 is(true, Clipperz.PM.PIN.isSet(), "1st wrong PIN -> keep credentials"); 65 is(true, Clipperz.PM.PIN.isSet(), "1st wrong PIN -> keep credentials");
68 Clipperz.PM.PIN.recordFailedAttempt(); 66 Clipperz.PM.PIN.recordFailedAttempt();
69 is(true, Clipperz.PM.PIN.isSet(), "2nd wrong PIN -> keep credentials"); 67 is(true, Clipperz.PM.PIN.isSet(), "2nd wrong PIN -> keep credentials");
70 Clipperz.PM.PIN.resetFailedAttemptCount(); 68 Clipperz.PM.PIN.resetFailedAttemptCount();
71 Clipperz.PM.PIN.recordFailedAttempt(); 69 Clipperz.PM.PIN.recordFailedAttempt();
72 is(true, Clipperz.PM.PIN.isSet(), "3rd wrong PIN, but with a successful use in between -> keep credentials"); 70 is(true, Clipperz.PM.PIN.isSet(), "3rd wrong PIN, but with a successful use in between -> keep credentials");
73 }, 71 },
74 72
75 'credentialsWithPIN': function () { 73 'credentialsWithPIN': function () {
76 varcredentials; 74 varcredentials;
77 varpin; 75 varpin;
78 var decryptedCredentials; 76 var decryptedCredentials;
79 77
80 tests.clearCredentials(); 78 tests.clearCredentials();
81 79
82 credentials = {'username': 'joe', 'passphrase':'foobar'}; 80 credentials = {'username': 'joe', 'passphrase':'foobar'};
83 pin = '1234'; 81 pin = '1234';
84 Clipperz.PM.PIN.setCredentialsWithPIN(pin, credentials); 82 Clipperz.PM.PIN.setCredentialsWithPIN(pin, credentials);
85 decryptedCredentials = Clipperz.PM.PIN.credentialsWithPIN(pin); 83 decryptedCredentials = Clipperz.PM.PIN.credentialsWithPIN(pin);
86 84
87 is(decryptedCredentials['username'],credentials['username']); 85 is(decryptedCredentials['username'],credentials['username']);
88 is(decryptedCredentials['passphrase'],credentials['passphrase']); 86 is(decryptedCredentials['passphrase'],credentials['passphrase']);
89 }, 87 },
90 88
91 //------------------------------------------------------------------------- 89 //-------------------------------------------------------------------------
92 'syntaxFix': MochiKit.Base.noop 90 'syntaxFix': MochiKit.Base.noop
93}; 91};
94 92
95//############################################################################# 93//#############################################################################
96 94
97SimpleTest.runDeferredTests("Clipperz.PM.PIN", tests, {trace:false}); 95SimpleTest.runDeferredTests("Clipperz.PM.PIN", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html
index 8177285..704d232 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html
@@ -1,61 +1,59 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.Proxy - TEST</title> 26 <title>Clipperz.PM.Proxy - TEST</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
47 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
51 49
52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
53 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 51 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
54 52
55</head> 53</head>
56<body> 54<body>
57<pre id="test"> 55<pre id="test">
58 <script type="text/javascript" src="Proxy.test.js"></script> 56 <script type="text/javascript" src="Proxy.test.js"></script>
59</pre> 57</pre>
60</body> 58</body>
61</html> 59</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js
index 8225823..1bec17d 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js
@@ -1,114 +1,112 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 24Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
27 25
28var tests = { 26var tests = {
29 27
30 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
31 29
32 'simple_tests': function() { 30 'simple_tests': function() {
33 vardeferredResult; 31 vardeferredResult;
34 32
35 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); 33 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
36 deferredResult.addCallback(function() { 34 deferredResult.addCallback(function() {
37 var proxy; 35 var proxy;
38 36
39 proxy = new Clipperz.PM.Proxy(); 37 proxy = new Clipperz.PM.Proxy();
40 ok(proxy != null, "can create instances of the Proxy class"); 38 ok(proxy != null, "can create instances of the Proxy class");
41 is(proxy.shouldPayTolls(), false, "proxy is set to NOT pay tolls by default"); 39 is(proxy.shouldPayTolls(), false, "proxy is set to NOT pay tolls by default");
42 }); 40 });
43 41
44 deferredResult.callback(); 42 deferredResult.callback();
45 43
46 return deferredResult; 44 return deferredResult;
47 }, 45 },
48 46
49 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
50 48
51 'simpleTestsWithTolls_tests': function() { 49 'simpleTestsWithTolls_tests': function() {
52 vardeferredResult; 50 vardeferredResult;
53 51
54 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); 52 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
55 deferredResult.addCallback(function() { 53 deferredResult.addCallback(function() {
56 var proxy; 54 var proxy;
57 55
58 proxy = new Clipperz.PM.Proxy({shouldPayTolls:true}); 56 proxy = new Clipperz.PM.Proxy({shouldPayTolls:true});
59 is(proxy.shouldPayTolls(), true, "I can set Proxy to pays tolls"); 57 is(proxy.shouldPayTolls(), true, "I can set Proxy to pays tolls");
60 }); 58 });
61 59
62 deferredResult.callback(); 60 deferredResult.callback();
63 61
64 return deferredResult; 62 return deferredResult;
65 }, 63 },
66 64
67 //------------------------------------------------------------------------- 65 //-------------------------------------------------------------------------
68 'syntaxFix': MochiKit.Base.noop 66 'syntaxFix': MochiKit.Base.noop
69}; 67};
70 68
71//############################################################################# 69//#############################################################################
72 70
73runTests = function(aClassName) { 71runTests = function(aClassName) {
74 try { 72 try {
75 var deferredTests; 73 var deferredTests;
76 var aTestName; 74 var aTestName;
77 75
78 deferredTests = new Clipperz.Async.Deferred(aClassName + ".test", {trace:false}); 76 deferredTests = new Clipperz.Async.Deferred(aClassName + ".test", {trace:false});
79 77
80 aTestName = window.location.href.match(/#.*/); 78 aTestName = window.location.href.match(/#.*/);
81 if (aTestName && (aTestName != '#')) { 79 if (aTestName && (aTestName != '#')) {
82 aTestName = aTestName[0].slice(1); 80 aTestName = aTestName[0].slice(1);
83 if (aTestName in tests) { 81 if (aTestName in tests) {
84 //Clipperz.log("single test execution, via fragment identifier", aTestName); 82 //Clipperz.log("single test execution, via fragment identifier", aTestName);
85 deferredTests.addCallback(tests[aTestName]); 83 deferredTests.addCallback(tests[aTestName]);
86 deferredTests.addErrback(SimpleTest.ok, false, aTestName); 84 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
87 } else { 85 } else {
88 deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run"); 86 deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run");
89 } 87 }
90 } else { 88 } else {
91 for (aTestName in tests) { 89 for (aTestName in tests) {
92 deferredTests.addCallback(tests[aTestName]); 90 deferredTests.addCallback(tests[aTestName]);
93 deferredTests.addErrback(SimpleTest.ok, false, aTestName); 91 deferredTests.addErrback(SimpleTest.ok, false, aTestName);
94 } 92 }
95 deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests"); 93 deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests");
96 } 94 }
97 deferredTests.addBoth(SimpleTest.finish); 95 deferredTests.addBoth(SimpleTest.finish);
98 deferredTests.callback(); 96 deferredTests.callback();
99 97
100 SimpleTest.waitForExplicitFinish(); 98 SimpleTest.waitForExplicitFinish();
101 } catch (err) { 99 } catch (err) {
102 var s = "test suite failure!\n"; 100 var s = "test suite failure!\n";
103 var o = {}; 101 var o = {};
104 var k = null; 102 var k = null;
105 for (k in err) { 103 for (k in err) {
106 // ensure unique keys?! 104 // ensure unique keys?!
107 if (!o[k]) { 105 if (!o[k]) {
108 s += k + ": " + err[k] + "\n"; 106 s += k + ": " + err[k] + "\n";
109 o[k] = err[k]; 107 o[k] = err[k];
110 } 108 }
111 } 109 }
112 ok ( false, s ); 110 ok ( false, s );
113 } 111 }
114}("Clipperz.PM.Proxy"); 112}("Clipperz.PM.Proxy");
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Toll.html b/frontend/gamma/tests/tests/Clipperz/PM/Toll.html
index 6c2e000..b5a35f6 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Toll.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Toll.html
@@ -1,58 +1,56 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.Toll - test</title> 26 <title>Clipperz.PM.Toll - test</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 44 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
47 45
48 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
49 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script> 47 <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
50 48
51</head> 49</head>
52<body> 50<body>
53<pre id="test"> 51<pre id="test">
54 <script type="text/javascript" src="Toll.test.js"></script> 52 <script type="text/javascript" src="Toll.test.js"></script>
55</pre> 53</pre>
56 54
57</body> 55</body>
58</html> 56</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js
index 6de67c3..bab0713 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 24Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
27 25
28var tests = { 26var tests = {
29 27
30 //------------------------------------------------------------------------- 28 //-------------------------------------------------------------------------
31/* 29/*
32 'simple_test': function() { 30 'simple_test': function() {
33 vardeferredResult; 31 vardeferredResult;
34 32
35 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); 33 deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false});
36 deferredResult.addCallback(function() { 34 deferredResult.addCallback(function() {
37 vartollTargetValue; 35 vartollTargetValue;
38 vartoll; 36 vartoll;
39 var price; 37 var price;
40 38
41 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 39 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
42 tollTargetValue = Clipperz.Crypto.SHA.sha256(tollTargetValue); 40 tollTargetValue = Clipperz.Crypto.SHA.sha256(tollTargetValue);
43 41
44 price = 1; 42 price = 1;
45 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 43 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
46 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); 44 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
47 toll.pay(); 45 toll.pay();
48 46
49 price = 5; 47 price = 5;
50 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 48 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
51 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); 49 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
52 toll.pay(); 50 toll.pay();
53 51
54 price = 6; 52 price = 6;
55 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 53 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
56 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); 54 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
57 toll.pay(); 55 toll.pay();
58 56
59 price = 7; 57 price = 7;
60 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 58 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
61 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); 59 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
62 toll.pay(); 60 toll.pay();
63 61
64 price = 7; 62 price = 7;
65 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); 63 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
66 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); 64 toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price});
67 toll.pay(); 65 toll.pay();
68 }); 66 });
69 67
70 deferredResult.callback(); 68 deferredResult.callback();
71 69
72 return deferredResult; 70 return deferredResult;
73 }, 71 },
74*/ 72*/
75 //------------------------------------------------------------------------- 73 //-------------------------------------------------------------------------
76 74
77 'deferredPay_test': function() { 75 'deferredPay_test': function() {
78 vardeferredResult; 76 vardeferredResult;
79 vartollTargetValue; 77 vartollTargetValue;
80 var toll_1, toll_5, toll_6, toll_7, toll_10, toll_16; 78 var toll_1, toll_5, toll_6, toll_7, toll_10, toll_16;
81 79
82 // tollTargetValue = Clipperz.Crypto.SHA.sha256(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32)); 80 // tollTargetValue = Clipperz.Crypto.SHA.sha256(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32));
83 81
84 82
85 83
86 deferredResult = new Clipperz.Async.Deferred("deferredPay_tests", {trace:false}); 84 deferredResult = new Clipperz.Async.Deferred("deferredPay_tests", {trace:false});
87 85
88 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 86 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
89 toll_1 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:1}); 87 toll_1 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:1});
90 88
91 deferredResult.addMethod(toll_1, 'deferredPay'); 89 deferredResult.addMethod(toll_1, 'deferredPay');
92 deferredResult.addCallback(function (aResult) { 90 deferredResult.addCallback(function (aResult) {
93 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 1), "Payed a toll of cost 1"); 91 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 1), "Payed a toll of cost 1");
94 }); 92 });
95 deferredResult.addCallback(MochiKit.Async.wait, 1); 93 deferredResult.addCallback(MochiKit.Async.wait, 1);
96 94
97 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 95 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
98 toll_5 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:5}); 96 toll_5 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:5});
99 97
100 deferredResult.addMethod(toll_5, 'deferredPay'); 98 deferredResult.addMethod(toll_5, 'deferredPay');
101 deferredResult.addCallback(function (aResult) { 99 deferredResult.addCallback(function (aResult) {
102 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 5), "Payed a toll of cost 5"); 100 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 5), "Payed a toll of cost 5");
103 }); 101 });
104 deferredResult.addCallback(MochiKit.Async.wait, 1); 102 deferredResult.addCallback(MochiKit.Async.wait, 1);
105 103
106 104
107 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 105 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
108 toll_6 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:6}); 106 toll_6 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:6});
109 107
110 deferredResult.addMethod(toll_6, 'deferredPay'); 108 deferredResult.addMethod(toll_6, 'deferredPay');
111 deferredResult.addCallback(function (aResult) { 109 deferredResult.addCallback(function (aResult) {
112 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 6), "Payed a toll of cost 6"); 110 SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 6), "Payed a toll of cost 6");
113 }); 111 });
114 deferredResult.addCallback(MochiKit.Async.wait, 1); 112 deferredResult.addCallback(MochiKit.Async.wait, 1);
115 113
116 114
117 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); 115 tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
118 toll_7 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:7}); 116 toll_7 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:7});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html
index 1eea01b..6a2d3a0 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html
@@ -1,60 +1,58 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.UI.Web.MainController - test</title> 26 <title>Clipperz.PM.UI.Web.MainController - test</title>
29 27
30 <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../../../../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../../../../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../../../../../js/Clipperz/YUI/Utils.js'></script> 32 <script type='text/javascript' src='../../../../../../../js/Clipperz/YUI/Utils.js'></script>
35 <script type='text/javascript' src='../../../../../../../js/Clipperz/Base.js'></script> 33 <script type='text/javascript' src='../../../../../../../js/Clipperz/Base.js'></script>
36 <script type='text/javascript' src='../../../../../../../js/Clipperz/ByteArray.js'></script> 34 <script type='text/javascript' src='../../../../../../../js/Clipperz/ByteArray.js'></script>
37 <script type='text/javascript' src='../../../../../../../js/Clipperz/Logging.js'></script> 35 <script type='text/javascript' src='../../../../../../../js/Clipperz/Logging.js'></script>
38 <script type='text/javascript' src='../../../../../../../js/Clipperz/Async.js'></script> 36 <script type='text/javascript' src='../../../../../../../js/Clipperz/Async.js'></script>
39 <script type='text/javascript' src='../../../../../../../js/Clipperz/KeyValueObjectStore.js'></script> 37 <script type='text/javascript' src='../../../../../../../js/Clipperz/KeyValueObjectStore.js'></script>
40 38
41 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/Base.js'></script> 39 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/Base.js'></script>
42 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/BigInt.js'></script> 40 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/BigInt.js'></script>
43 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/AES.js'></script> 41 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/AES.js'></script>
44 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SHA.js'></script> 42 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SHA.js'></script>
45 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/PRNG.js'></script> 43 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/PRNG.js'></script>
46 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SRP.js'></script> 44 <script type='text/javascript' src='../../../../../../../js/Clipperz/Crypto/SRP.js'></script>
47 45
48 <script type='text/javascript' src='../../../../../../../js/Clipperz/Signal.js'></script> 46 <script type='text/javascript' src='../../../../../../../js/Clipperz/Signal.js'></script>
49 47
50 <script type='text/javascript' src='../../../../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script> 48 <script type='text/javascript' src='../../../../../../../js/Clipperz/PM/UI/Web/Controllers/MainController.js'></script>
51 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.Async.js"></script> 49 <script type="text/javascript" src="../../../../../../SimpleTest/SimpleTest.Async.js"></script>
52 50
53</head> 51</head>
54<body> 52<body>
55<pre id="test"> 53<pre id="test">
56 <script type="text/javascript" src="MainController.test.js"></script> 54 <script type="text/javascript" src="MainController.test.js"></script>
57</pre> 55</pre>
58 56
59</body> 57</body>
60</html> 58</html>
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js
index 919215e..512104b 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js
@@ -1,87 +1,85 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26//Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 24//Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
27 25
28var tests = { 26var tests = {
29 27
30 'isPassphraseDelegateLockSetAfterInit': function (someTestArgs) { 28 'isPassphraseDelegateLockSetAfterInit': function (someTestArgs) {
31 return Clipperz.Async.callbacks('isPassphraseDelegateLockSetAfterInit', [ 29 return Clipperz.Async.callbacks('isPassphraseDelegateLockSetAfterInit', [
32 function () { 30 function () {
33 var mainController; 31 var mainController;
34 32
35 mainController = new Clipperz.PM.UI.Web.Controllers.MainController(); 33 mainController = new Clipperz.PM.UI.Web.Controllers.MainController();
36 SimpleTest.is(true, mainController._passphraseDelegateLock.locked, 'passphraseDelegate lock is locked after MainController initialization') 34 SimpleTest.is(true, mainController._passphraseDelegateLock.locked, 'passphraseDelegate lock is locked after MainController initialization')
37 }]); 35 }]);
38 }, 36 },
39 37
40 //------------------------------------------------------------------------- 38 //-------------------------------------------------------------------------
41 39
42 'getPassphraseWithUnsetDelegate_test': function (someTestArgs) { 40 'getPassphraseWithUnsetDelegate_test': function (someTestArgs) {
43 var deferredResult; 41 var deferredResult;
44 var mainController; 42 var mainController;
45 var delegateFunction; 43 var delegateFunction;
46 44
47 mainController = new Clipperz.PM.UI.Web.Controllers.MainController(); 45 mainController = new Clipperz.PM.UI.Web.Controllers.MainController();
48 delegateFunction = function () { return "clipperz";}; 46 delegateFunction = function () { return "clipperz";};
49 47
50 MochiKit.Async.callLater(1, MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction)); 48 MochiKit.Async.callLater(1, MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction));
51 49
52 return Clipperz.Async.callbacks("MainController.getPassphraseWithUnsetDelegate",[ 50 return Clipperz.Async.callbacks("MainController.getPassphraseWithUnsetDelegate",[
53 MochiKit.Base.method(mainController, 'getPassphrase'), 51 MochiKit.Base.method(mainController, 'getPassphrase'),
54 function (aResult) { 52 function (aResult) {
55 SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct"); 53 SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct");
56 } 54 }
57 ], {trace:false}); 55 ], {trace:false});
58 }, 56 },
59 57
60 //------------------------------------------------------------------------- 58 //-------------------------------------------------------------------------
61 59
62 'getPassphraseWithSetDelegate_test': function (someTestArgs) { 60 'getPassphraseWithSetDelegate_test': function (someTestArgs) {
63 var deferredResult; 61 var deferredResult;
64 var mainController; 62 var mainController;
65 var delegateFunction; 63 var delegateFunction;
66 64
67 mainController = new Clipperz.PM.UI.Web.Controllers.MainController(); 65 mainController = new Clipperz.PM.UI.Web.Controllers.MainController();
68 delegateFunction = function () {return "clipperz";}; 66 delegateFunction = function () {return "clipperz";};
69 67
70 return Clipperz.Async.callbacks("MainController.getPassphraseWithSetDelegate_test",[ 68 return Clipperz.Async.callbacks("MainController.getPassphraseWithSetDelegate_test",[
71 MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction), 69 MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction),
72 MochiKit.Base.method(mainController, 'getPassphrase'), 70 MochiKit.Base.method(mainController, 'getPassphrase'),
73 function (aResult) { 71 function (aResult) {
74 SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct"); 72 SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct");
75 } 73 }
76 ], {trace:false}); 74 ], {trace:false});
77 }, 75 },
78 76
79 //------------------------------------------------------------------------- 77 //-------------------------------------------------------------------------
80 'syntaxFix': MochiKit.Base.noop 78 'syntaxFix': MochiKit.Base.noop
81}; 79};
82 80
83 81
84 82
85//############################################################################# 83//#############################################################################
86 84
87SimpleTest.runDeferredTests("Clipperz.PM.UI.Web.Controllers.MainController", tests, {trace:false}); 85SimpleTest.runDeferredTests("Clipperz.PM.UI.Web.Controllers.MainController", tests, {trace:false});
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html
index 3f04d4f..a49fcd6 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html
@@ -1,43 +1,41 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.UI.Web.Controllers.* - tests</title> 26 <title>Clipperz.PM.UI.Web.Controllers.* - tests</title>
29 27
30 <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../../../SimpleTest/TestRunner.js"></script> 29 <script type="text/javascript" src="../../../../../../SimpleTest/TestRunner.js"></script>
32</head> 30</head>
33<body> 31<body>
34<script> 32<script>
35TestRunner.runTests( 33TestRunner.runTests(
36// 34//
37 //This is still a complete mess. 35 //This is still a complete mess.
38// 36//
39 'MainController.html' 37 'MainController.html'
40); 38);
41</script> 39</script>
42</body> 40</body>
43</html> \ No newline at end of file 41</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html
index 250a70d..cdec066 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html
@@ -1,42 +1,40 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.UI.Web* - tests</title> 26 <title>Clipperz.PM.UI.Web* - tests</title>
29 27
30 <script type="text/javascript" src="../../../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../../SimpleTest/TestRunner.js"></script> 29 <script type="text/javascript" src="../../../../../SimpleTest/TestRunner.js"></script>
32</head> 30</head>
33<body> 31<body>
34<script> 32<script>
35TestRunner.runTests( 33TestRunner.runTests(
36// 34//
37 //This is still a complete mess. 35 //This is still a complete mess.
38// 36//
39); 37);
40</script> 38</script>
41</body> 39</body>
42</html> \ No newline at end of file 40</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html
index d46ced1..89deab8 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html
@@ -1,42 +1,40 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.UI.* - tests</title> 26 <title>Clipperz.PM.UI.* - tests</title>
29 27
30 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../../SimpleTest/TestRunner.js"></script> 29 <script type="text/javascript" src="../../../../SimpleTest/TestRunner.js"></script>
32</head> 30</head>
33<body> 31<body>
34<script> 32<script>
35TestRunner.runTests( 33TestRunner.runTests(
36// 34//
37 //This is still a complete mess. 35 //This is still a complete mess.
38// 36//
39); 37);
40</script> 38</script>
41</body> 39</body>
42</html> \ No newline at end of file 40</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/PM/index.html b/frontend/gamma/tests/tests/Clipperz/PM/index.html
index c3df56a..eeda692 100644
--- a/frontend/gamma/tests/tests/Clipperz/PM/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/PM/index.html
@@ -1,54 +1,52 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.PM.* - tests</title> 26 <title>Clipperz.PM.* - tests</title>
29 27
30 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script> 29 <script type="text/javascript" src="../../../SimpleTest/TestRunner.js"></script>
32</head> 30</head>
33<body> 31<body>
34<script> 32<script>
35TestRunner.runTests( 33TestRunner.runTests(
36// 34//
37 //This is still a complete mess. 35 //This is still a complete mess.
38// 36//
39 //'BookmarkletProcessor.html', 37 //'BookmarkletProcessor.html',
40 'Connection.html', 38 'Connection.html',
41 'Crypto.html', 39 'Crypto.html',
42 //'Crypto_other_implementation_comparison.html', 40 //'Crypto_other_implementation_comparison.html',
43 'Crypto_performanceEvaluation.html', 41 'Crypto_performanceEvaluation.html',
44 //'CryptoPerformance_ByteArrayArray.html', 42 //'CryptoPerformance_ByteArrayArray.html',
45 //'CryptoPerformance_ByteArrayHex.html', 43 //'CryptoPerformance_ByteArrayHex.html',
46 //'CryptoPerformance_ByteArrayString.html', 44 //'CryptoPerformance_ByteArrayString.html',
47 'Date.html', 45 'Date.html',
48 'PIN.html', 46 'PIN.html',
49 'Proxy.html', 47 'Proxy.html',
50 'Toll.html' 48 'Toll.html'
51); 49);
52</script> 50</script>
53</body> 51</body>
54</html> \ No newline at end of file 52</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html b/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html
index b4500e3..3065b32 100644
--- a/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html
+++ b/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 27 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
30 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 28 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
31 29
32 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 30 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
33 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 31 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
34 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 32 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
35 <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script> 33 <script type='text/javascript' src='../../../js/Clipperz/KeePassExportProcessor.js'></script>
36 34
37 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 35 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
38</head> 36</head>
39<body> 37<body>
40<pre id="test"> 38<pre id="test">
41<script type="text/javascript"> 39<script type="text/javascript">
42try { 40try {
43 var deferredResult; 41 var deferredResult;
44 varkeePassProcessor; 42 varkeePassProcessor;
45 43
46 keePassProcessor = new Clipperz.KeePassExportProcessor(); 44 keePassProcessor = new Clipperz.KeePassExportProcessor();
47 45
48 deferredResult = new MochiKit.Async.Deferred(); 46 deferredResult = new MochiKit.Async.Deferred();
49 47
50 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\n" }); 48 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\n" });
51 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse')); 49 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse'));
52 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\"}]", "first test"); }); 50 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\"}]", "first test"); });
53 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 51 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
54 52
55 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" }); 53 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" });
56 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse')); 54 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse'));
57 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "second test"); }); 55 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "second test"); });
58 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 56 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
59 57
60 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\nwith some notes stored\non multiple lines\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" }); 58 deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\nwith some notes stored\non multiple lines\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" });
61 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse')); 59 deferredResult.addCallback(MochiKit.Base.method(keePassProcessor, 'deferredParse'));
62 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\\nwith some notes stored\\non multiple lines\\n\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "third test"); }); 60 deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\\nwith some notes stored\\non multiple lines\\n\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "third test"); });
63 deferredResult.addErrback(function(anError) { is("ERROR", anError) }); 61 deferredResult.addErrback(function(anError) { is("ERROR", anError) });
64 62
65 63
66 64
67 deferredResult.addBoth(SimpleTest.finish); 65 deferredResult.addBoth(SimpleTest.finish);
68 deferredResult.callback(); 66 deferredResult.callback();
69 67
70/* 68/*
71 var set; 69 var set;
72 varobject1; 70 varobject1;
73 varobject2; 71 varobject2;
74 var object3; 72 var object3;
75 73
76 set = new Clipperz.Set(); 74 set = new Clipperz.Set();
77 75
78 object1 = new Object(); 76 object1 = new Object();
79 object2 = new Object(); 77 object2 = new Object();
80 object3 = new Object(); 78 object3 = new Object();
81 79
82 object1.label = "object 1"; 80 object1.label = "object 1";
83 object2.label = "object 2"; 81 object2.label = "object 2";
84 object3.label = "object 3"; 82 object3.label = "object 3";
85 83
86 is(set.size(), 0, "A new set should be empty"); 84 is(set.size(), 0, "A new set should be empty");
87 85
88 set.add(object1); 86 set.add(object1);
89 is(set.size(), 1); 87 is(set.size(), 1);
90 is(set.contains(object1), true); 88 is(set.contains(object1), true);
91 is(set.contains(object2), false); 89 is(set.contains(object2), false);
92 90
93 set.add(object1); 91 set.add(object1);
94 is(set.size(), 1, "Adding the same object twice does not change the set content"); 92 is(set.size(), 1, "Adding the same object twice does not change the set content");
95 is(set.contains(object1), true); 93 is(set.contains(object1), true);
96 is(set.contains(object2), false); 94 is(set.contains(object2), false);
97 95
98 set.add(object2); 96 set.add(object2);
99 is(set.size(), 2); 97 is(set.size(), 2);
100 is(set.contains(object1), true); 98 is(set.contains(object1), true);
101 is(set.contains(object2), true); 99 is(set.contains(object2), true);
102 is(set.contains(object3), false); 100 is(set.contains(object3), false);
103 101
104 set.remove(object1); 102 set.remove(object1);
105 is(set.size(), 1, "Size check after removing an object"); 103 is(set.size(), 1, "Size check after removing an object");
106 is(set.contains(object1), false); 104 is(set.contains(object1), false);
107 is(set.contains(object2), true); 105 is(set.contains(object2), true);
108 is(set.contains(object3), false); 106 is(set.contains(object3), false);
109 107
110 set.remove(object1); 108 set.remove(object1);
111 is(set.size(), 1, "Removing twice the same object does not change the set content"); 109 is(set.size(), 1, "Removing twice the same object does not change the set content");
112 is(set.contains(object1), false); 110 is(set.contains(object1), false);
113 is(set.contains(object2), true); 111 is(set.contains(object2), true);
114 is(set.contains(object3), false); 112 is(set.contains(object3), false);
115 113
116 set.empty(); 114 set.empty();
117 is(set.size(), 0); 115 is(set.size(), 0);
118 116
diff --git a/frontend/gamma/tests/tests/Clipperz/Set.html b/frontend/gamma/tests/tests/Clipperz/Set.html
index 82bb249..401d89c 100644
--- a/frontend/gamma/tests/tests/Clipperz/Set.html
+++ b/frontend/gamma/tests/tests/Clipperz/Set.html
@@ -1,51 +1,49 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.Set - test</title> 26 <title>Clipperz.Set - test</title>
29 27
30 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
31 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script> 29 <script type="text/javascript" src="../../SimpleTest/SimpleTest.js"></script>
32 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css"> 30 <link rel="stylesheet" type="text/css" href="../../SimpleTest/test.css">
33 31
34 <script type='text/javascript' src='../../../js/JSON/json2.js'></script> 32 <script type='text/javascript' src='../../../js/JSON/json2.js'></script>
35 33
36 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script> 34 <script type='text/javascript' src='../../../js/Clipperz/YUI/Utils.js'></script>
37 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script> 35 <script type='text/javascript' src='../../../js/Clipperz/Base.js'></script>
38 <script type='text/javascript' src='../../../js/Clipperz/Set.js'></script> 36 <script type='text/javascript' src='../../../js/Clipperz/Set.js'></script>
39 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script> 37 <script type='text/javascript' src='../../../js/Clipperz/Logging.js'></script>
40 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script> 38 <script type='text/javascript' src='../../../js/Clipperz/Async.js'></script>
41 39
42 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script> 40 <script type="text/javascript" src="../../SimpleTest/SimpleTest.Async.js"></script>
43</head> 41</head>
44<body> 42<body>
45 43
46<pre id="test"> 44<pre id="test">
47<script type="text/javascript" src="Set.test.js"></script> 45<script type="text/javascript" src="Set.test.js"></script>
48</pre> 46</pre>
49</body> 47</body>
50</html> 48</html>
51 49
diff --git a/frontend/gamma/tests/tests/Clipperz/Set.test.js b/frontend/gamma/tests/tests/Clipperz/Set.test.js
index f908816..f5574ee 100644
--- a/frontend/gamma/tests/tests/Clipperz/Set.test.js
+++ b/frontend/gamma/tests/tests/Clipperz/Set.test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26var tests = { 24var tests = {
27 25
28 //------------------------------------------------------------------------- 26 //-------------------------------------------------------------------------
29 27
30 'set_test': function (someTestArgs) { 28 'set_test': function (someTestArgs) {
31 var deferredResult; 29 var deferredResult;
32 30
33 deferredResult = new Clipperz.Async.Deferred("set_test", someTestArgs); 31 deferredResult = new Clipperz.Async.Deferred("set_test", someTestArgs);
34 deferredResult.addCallback(function () { 32 deferredResult.addCallback(function () {
35 var set; 33 var set;
36 varobject1; 34 varobject1;
37 varobject2; 35 varobject2;
38 var object3; 36 var object3;
39 37
40 set = new Clipperz.Set(); 38 set = new Clipperz.Set();
41 39
42 object1 = new Object(); 40 object1 = new Object();
43 object2 = new Object(); 41 object2 = new Object();
44 object3 = new Object(); 42 object3 = new Object();
45 43
46 object1.label = "object 1"; 44 object1.label = "object 1";
47 object2.label = "object 2"; 45 object2.label = "object 2";
48 object3.label = "object 3"; 46 object3.label = "object 3";
49 47
50 is(set.size(), 0, "A new set should be empty"); 48 is(set.size(), 0, "A new set should be empty");
51 49
52 set.add(object1); 50 set.add(object1);
53 is(set.size(), 1); 51 is(set.size(), 1);
54 is(set.contains(object1), true); 52 is(set.contains(object1), true);
55 is(set.contains(object2), false); 53 is(set.contains(object2), false);
56 54
57 set.add(object1); 55 set.add(object1);
58 is(set.size(), 1, "Adding the same object twice does not change the set content"); 56 is(set.size(), 1, "Adding the same object twice does not change the set content");
59 is(set.contains(object1), true); 57 is(set.contains(object1), true);
60 is(set.contains(object2), false); 58 is(set.contains(object2), false);
61 59
62 set.add(object2); 60 set.add(object2);
63 is(set.size(), 2); 61 is(set.size(), 2);
64 is(set.contains(object1), true); 62 is(set.contains(object1), true);
65 is(set.contains(object2), true); 63 is(set.contains(object2), true);
66 is(set.contains(object3), false); 64 is(set.contains(object3), false);
67 65
68 set.remove(object1); 66 set.remove(object1);
69 is(set.size(), 1, "Size check after removing an object"); 67 is(set.size(), 1, "Size check after removing an object");
70 is(set.contains(object1), false); 68 is(set.contains(object1), false);
71 is(set.contains(object2), true); 69 is(set.contains(object2), true);
72 is(set.contains(object3), false); 70 is(set.contains(object3), false);
73 71
74 set.remove(object1); 72 set.remove(object1);
75 is(set.size(), 1, "Removing twice the same object does not change the set content"); 73 is(set.size(), 1, "Removing twice the same object does not change the set content");
76 is(set.contains(object1), false); 74 is(set.contains(object1), false);
77 is(set.contains(object2), true); 75 is(set.contains(object2), true);
78 is(set.contains(object3), false); 76 is(set.contains(object3), false);
79 77
80 set.empty(); 78 set.empty();
81 is(set.size(), 0); 79 is(set.size(), 0);
82 80
83 { 81 {
84 varitems; 82 varitems;
85 varpopulatedSet; 83 varpopulatedSet;
86 84
87 items = ["item1", "item2", "item3"]; 85 items = ["item1", "item2", "item3"];
88 86
89 populatedSet = new Clipperz.Set({'items': items}); 87 populatedSet = new Clipperz.Set({'items': items});
90 is(populatedSet.size(), 3); 88 is(populatedSet.size(), 3);
91 is(populatedSet.contains("item1"), true); 89 is(populatedSet.contains("item1"), true);
92 is(populatedSet.contains("item4"), false); 90 is(populatedSet.contains("item4"), false);
93 91
94 items.splice(0, items.length); 92 items.splice(0, items.length);
95 is(populatedSet.size(), 3); 93 is(populatedSet.size(), 3);
96 } 94 }
97 95
98 { 96 {
99 varitems; 97 varitems;
100 vardeletedItems; 98 vardeletedItems;
101 99
102 items = ["item1", "item2", "item3"]; 100 items = ["item1", "item2", "item3"];
103 101
104 set = new Clipperz.Set({'items': items}); 102 set = new Clipperz.Set({'items': items});
105 deletedItems = ["item1"]; 103 deletedItems = ["item1"];
106 set.remove(deletedItems); 104 set.remove(deletedItems);
107 is(set.size(), 2, "here I am"); 105 is(set.size(), 2, "here I am");
108 is(set.contains("item1"), false); 106 is(set.contains("item1"), false);
109 is(set.contains("item2"), true); 107 is(set.contains("item2"), true);
110 108
111 set = new Clipperz.Set({'items': items}); 109 set = new Clipperz.Set({'items': items});
112 deletedItems = ["item1", "item2"]; 110 deletedItems = ["item1", "item2"];
113 set.remove(deletedItems); 111 set.remove(deletedItems);
114 is(set.size(), 1); 112 is(set.size(), 1);
115 is(set.contains("item1"), false); 113 is(set.contains("item1"), false);
116 is(set.contains("item2"), false); 114 is(set.contains("item2"), false);
117 115
118 set = new Clipperz.Set({'items': items}); 116 set = new Clipperz.Set({'items': items});
diff --git a/frontend/gamma/tests/tests/Clipperz/index.html b/frontend/gamma/tests/tests/Clipperz/index.html
index d4556eb..c86cbe0 100644
--- a/frontend/gamma/tests/tests/Clipperz/index.html
+++ b/frontend/gamma/tests/tests/Clipperz/index.html
@@ -1,46 +1,44 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Clipperz.* - tests</title> 26 <title>Clipperz.* - tests</title>
29 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
30 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script> 28 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script>
31</head> 29</head>
32<body> 30<body>
33<script> 31<script>
34TestRunner.runTests( 32TestRunner.runTests(
35 'Async.html', 33 'Async.html',
36 'Base.html', 34 'Base.html',
37 'ByteArray.html', 35 'ByteArray.html',
38 'Date.html', 36 'Date.html',
39 'DOM.html', 37 'DOM.html',
40 'KeePassExportProcessor.html', 38 'KeePassExportProcessor.html',
41 'RoboFormExportProcessor.html', 39 'RoboFormExportProcessor.html',
42 'Set.html' 40 'Set.html'
43); 41);
44</script> 42</script>
45</body> 43</body>
46</html> \ No newline at end of file 44</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/index_googleCode.html b/frontend/gamma/tests/tests/Clipperz/index_googleCode.html
index 3878809..cf07043 100644
--- a/frontend/gamma/tests/tests/Clipperz/index_googleCode.html
+++ b/frontend/gamma/tests/tests/Clipperz/index_googleCode.html
@@ -1,47 +1,45 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script> 27 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script>
30</head> 28</head>
31<body> 29<body>
32<script> 30<script>
33TestRunner.runTests( 31TestRunner.runTests(
34 'Base.html', 32 'Base.html',
35 'ByteArray.html', 33 'ByteArray.html',
36 'NotificationCenter.html', 34 'NotificationCenter.html',
37 'Set.html', 35 'Set.html',
38 'Crypto/AES.html', 36 'Crypto/AES.html',
39 'Crypto/BigInt.html', 37 'Crypto/BigInt.html',
40 'Crypto/PRNG.html', 38 'Crypto/PRNG.html',
41 'Crypto/SHA.html', 39 'Crypto/SHA.html',
42 'Crypto/ECC.html', 40 'Crypto/ECC.html',
43 'Crypto/SRP.html' 41 'Crypto/SRP.html'
44); 42);
45</script> 43</script>
46</body> 44</body>
47</html> \ No newline at end of file 45</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Clipperz/index_testECC.html b/frontend/gamma/tests/tests/Clipperz/index_testECC.html
index bac17d1..34039fd 100644
--- a/frontend/gamma/tests/tests/Clipperz/index_testECC.html
+++ b/frontend/gamma/tests/tests/Clipperz/index_testECC.html
@@ -1,47 +1,45 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script> 26 <script type="text/javascript" src="../../../js/MochiKit/MochiKit.js"></script>
29 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script> 27 <script type="text/javascript" src="../../SimpleTest/TestRunner.js"></script>
30</head> 28</head>
31<body> 29<body>
32<script> 30<script>
33TestRunner.runTests( 31TestRunner.runTests(
34 //'Base.html', 32 //'Base.html',
35 'ByteArray.html', 33 'ByteArray.html',
36 //'Crypto/AES.html', 34 //'Crypto/AES.html',
37 'Crypto/BigInt.html', 35 'Crypto/BigInt.html',
38 //'Crypto/PRNG.html', 36 //'Crypto/PRNG.html',
39 //'Crypto/SHA.html', 37 //'Crypto/SHA.html',
40 //'Crypto/SRP.html', 38 //'Crypto/SRP.html',
41 //'Crypto/ECC.html', 39 //'Crypto/ECC.html',
42 'Crypto/ECC.BinaryField.FiniteField.html', 40 'Crypto/ECC.BinaryField.FiniteField.html',
43 'Crypto/ECC.BinaryField.Value.html' 41 'Crypto/ECC.BinaryField.Value.html'
44); 42);
45</script> 43</script>
46</body> 44</body>
47</html> \ No newline at end of file 45</html> \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js b/frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js
index d2136af..b052384 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js
+++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.Tests.CardDialogEditing'); 24Clipperz.Base.module('Clipperz.Tests.CardDialogEditing');
27 25
28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
29Clipperz.PM.Strings.Languages.initSetup(); 27Clipperz.PM.Strings.Languages.initSetup();
30 28
31Clipperz.Tests.CardDialogEditing.Tester = function(args) { 29Clipperz.Tests.CardDialogEditing.Tester = function(args) {
32 args = args || {}; 30 args = args || {};
33 31
34 Clipperz.Tests.CardDialogEditing.Tester.superclass.constructor.call(this, args); 32 Clipperz.Tests.CardDialogEditing.Tester.superclass.constructor.call(this, args);
35 //#this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 33 //#this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
36 this._user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 34 this._user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
37 35
38 return this; 36 return this;
39}; 37};
40 38
41Clipperz.Base.extend(Clipperz.Tests.CardDialogEditing.Tester, Object, { 39Clipperz.Base.extend(Clipperz.Tests.CardDialogEditing.Tester, Object, {
42 40
43 'toString': function() { 41 'toString': function() {
44 return "Clipperz.Tests.CardDialogEditing.Tester"; 42 return "Clipperz.Tests.CardDialogEditing.Tester";
45 }, 43 },
46 44
47 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
48 46
49 'user': function () { 47 'user': function () {
50 return this._user; 48 return this._user;
51 }, 49 },
52 50
53 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
54 52
55 'run': function () { 53 'run': function () {
56 var deferredResult; 54 var deferredResult;
57 var proxy; 55 var proxy;
58 varcardDialogController; 56 varcardDialogController;
59 varcardDialogComponent; 57 varcardDialogComponent;
60 58
61 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 59 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
62 60
63 deferredResult = new Clipperz.Async.Deferred("CardDialogEditing_test.init", {trace:false}); 61 deferredResult = new Clipperz.Async.Deferred("CardDialogEditing_test.init", {trace:false});
64 //# deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); 62 //# deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
65 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data_newVersion']); 63 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data_newVersion']);
66 deferredResult.addMethod(this.user(), 'login'); 64 deferredResult.addMethod(this.user(), 'login');
67 //# deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); 65 //# deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
68 66
69 // deferredResult.addMethod(this.user(), 'getRecord', '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80'); //Linkedin 67 // deferredResult.addMethod(this.user(), 'getRecord', '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80'); //Linkedin
70 // deferredResult.addMethod(this.user(), 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); //Example Attack 68 // deferredResult.addMethod(this.user(), 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); //Example Attack
71 deferredResult.addMethod(this.user(), 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); //Amazon 69 deferredResult.addMethod(this.user(), 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); //Amazon
72 // deferredResult.addMethod(this.user(), 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'); //MyBlogLog 70 // deferredResult.addMethod(this.user(), 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'); //MyBlogLog
73 // deferredResult.addMethod(this.user(), 'getRecord', '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728'); //Del.icio.us 71 // deferredResult.addMethod(this.user(), 'getRecord', '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728'); //Del.icio.us
74 // deferredResult.addMethod(this.user(), 'getRecord', '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a'); //Microsoft Office Key 72 // deferredResult.addMethod(this.user(), 'getRecord', '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a'); //Microsoft Office Key
75 // deferredResult.addMethod(this.user(), 'getRecord', '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18'); //The NewYork Times 73 // deferredResult.addMethod(this.user(), 'getRecord', '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18'); //The NewYork Times
76 // deferredResult.addMethod(this.user(), 'getRecord', '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb'); //Web Password 74 // deferredResult.addMethod(this.user(), 'getRecord', '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb'); //Web Password
77 // deferredResult.addMethod(this.user(), 'getRecord', '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39'); //Jaiku 75 // deferredResult.addMethod(this.user(), 'getRecord', '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39'); //Jaiku
78 // deferredResult.addMethod(this.user(), 'getRecord', '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291'); //Home Burglar Alarm 76 // deferredResult.addMethod(this.user(), 'getRecord', '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291'); //Home Burglar Alarm
79 // deferredResult.addMethod(this.user(), 'getRecord', 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c'); //MySpace 77 // deferredResult.addMethod(this.user(), 'getRecord', 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c'); //MySpace
80 // deferredResult.addMethod(this.user(), 'getRecord', 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045'); //American Airlines 78 // deferredResult.addMethod(this.user(), 'getRecord', 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045'); //American Airlines
81 // deferredResult.addMethod(this.user(), 'getRecord', 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4'); //Luftansa 79 // deferredResult.addMethod(this.user(), 'getRecord', 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4'); //Luftansa
82 // deferredResult.addMethod(this.user(), 'getRecord', 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5'); //Google Account 80 // deferredResult.addMethod(this.user(), 'getRecord', 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5'); //Google Account
83 // deferredResult.addMethod(this.user(), 'getRecord', 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732'); //Expedia 81 // deferredResult.addMethod(this.user(), 'getRecord', 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732'); //Expedia
84 // deferredResult.addMethod(this.user(), 'getRecord', 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6'); //Bloglines 82 // deferredResult.addMethod(this.user(), 'getRecord', 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6'); //Bloglines
85 83
86 // deferredResult.addMethod(this.user(), 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); //WEB PASSWORD (0) 84 // deferredResult.addMethod(this.user(), 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); //WEB PASSWORD (0)
87 // deferredResult.addMethod(this.user(), 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); //DIGG (1) 85 // deferredResult.addMethod(this.user(), 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); //DIGG (1)
88 // deferredResult.addMethod(this.user(), 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); //SAP (2) 86 // deferredResult.addMethod(this.user(), 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); //SAP (2)
89 // deferredResult.addMethod(this.user(), 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4) 87 // deferredResult.addMethod(this.user(), 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); //YAHOO (4)
90 88
91 // deferredResult.addMethod(this.user(), 'createNewRecord'); 89 // deferredResult.addMethod(this.user(), 'createNewRecord');
92 90
93/* 91/*
94 deferredResult.addCallback(function (aRecord) { 92 deferredResult.addCallback(function (aRecord) {
95 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup new record", [ 93 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup new record", [
96 MochiKit.Base.method(aRecord, 'setLabel', "Clipperz staging site"), 94 MochiKit.Base.method(aRecord, 'setLabel', "Clipperz staging site"),
97 MochiKit.Base.method(aRecord, 'addField', {'label':"URL", 'value':"http://d6.clipperz.com", 'isHidden':false}), 95 MochiKit.Base.method(aRecord, 'addField', {'label':"URL", 'value':"http://d6.clipperz.com", 'isHidden':false}),
98 MochiKit.Base.method(aRecord, 'addField', {'label':"USERNAME", 'value':"staging", 'isHidden':false}), 96 MochiKit.Base.method(aRecord, 'addField', {'label':"USERNAME", 'value':"staging", 'isHidden':false}),
99 MochiKit.Base.method(aRecord, 'addField', {'label':"PASSWORD", 'value':"drupal", 'isHidden':true}), 97 MochiKit.Base.method(aRecord, 'addField', {'label':"PASSWORD", 'value':"drupal", 'isHidden':true}),
100 98
101 MochiKit.Base.method(aRecord, 'createNewDirectLogin'), 99 MochiKit.Base.method(aRecord, 'createNewDirectLogin'),
102 function (aDirectLogin) { 100 function (aDirectLogin) {
103 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup new record [directLogin]", [ 101 return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup new record [directLogin]", [
104 MochiKit.Base.method(aDirectLogin, 'setLabel', 'Clipperz staging site'), 102 MochiKit.Base.method(aDirectLogin, 'setLabel', 'Clipperz staging site'),
105 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.apple.com/favicon.ico'), 103 MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.apple.com/favicon.ico'),
106 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{ "page":{"title":"HTTP authentication"},\n "form":{"attributes": {\n "action":"",\n "type":"http_auth"\n }, "inputs": [\n {"type":"text","name":"url","value":""},\n {"type":"text","name":"username","value":""},\n {"type":"password","name":"password","value":""}\n ]}, "version":"0.2.3"}'), 104 MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{ "page":{"title":"HTTP authentication"},\n "form":{"attributes": {\n "action":"",\n "type":"http_auth"\n }, "inputs": [\n {"type":"text","name":"url","value":""},\n {"type":"text","name":"username","value":""},\n {"type":"password","name":"password","value":""}\n ]}, "version":"0.2.3"}'),
107 105
108 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'url', 'URL'), 106 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'url', 'URL'),
109 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'username', 'USERNAME'), 107 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'username', 'USERNAME'),
110 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'password', 'PASSWORD') 108 MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'password', 'PASSWORD')
111 ], {trace:false}); 109 ], {trace:false});
112 }, 110 },
113 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord) 111 MochiKit.Base.partial(MochiKit.Async.succeed, aRecord)
114 ], {trace:false}); 112 ], {trace:false});
115 }); 113 });
116 114
117 // deferredResult.addMethod(this.user(), 'createNewRecord'); 115 // deferredResult.addMethod(this.user(), 'createNewRecord');
118 deferredResult.addCallback(function (aRecord) { 116 deferredResult.addCallback(function (aRecord) {
diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js b/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js
index 0e55ff5..2a8fca3 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js
+++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26testData = { 24testData = {
27 25
28 //------------------------------------------------------------------------- 26 //-------------------------------------------------------------------------
29 27
30 'simpleLogin_001': { 28 'simpleLogin_001': {
31 'users': [ 29 'users': [
32 { 30 {
33 'username': "joe", 31 'username': "joe",
34 'passphrase': "eoj", 32 'passphrase': "eoj",
35 'version': "0.2", 33 'version': "0.2",
36 'connectionVersion':"0.2", 34 'connectionVersion':"0.2",
37 'records':{ 35 'records':{
38 'record 1': { 36 'record 1': {
39 'notes':"Some notes here", 37 'notes':"Some notes here",
40 'fields':[ 38 'fields':[
41 { 'name': "username", 'value': "joe", 'type': "text" }, 39 { 'name': "username", 'value': "joe", 'type': "text" },
42 { 'name': "password", 'value': "1234", 'type': "password"} 40 { 'name': "password", 'value': "1234", 'type': "password"}
43 ], 41 ],
44 'directLogins':{ 42 'directLogins':{
45 "record 1 direct login": { 43 "record 1 direct login": {
46 'configuration':"", 44 'configuration':"",
47 'bindings':[ 45 'bindings':[
48 ], 46 ],
49 'favicon':"http://www.example.com/favicon.ico" 47 'favicon':"http://www.example.com/favicon.ico"
50 } 48 }
51 } 49 }
52 } 50 }
53 }, 51 },
54 'otp':[ 52 'otp':[
55 "12345678 90abcdef 12345678 90abcdef", 53 "12345678 90abcdef 12345678 90abcdef",
56 "fedcba09 87654321 fedcba09 87654321" 54 "fedcba09 87654321 fedcba09 87654321"
57 ] 55 ]
58 } 56 }
59 ] 57 ]
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'joe_clipperz_offline_copy_data': { 62 'joe_clipperz_offline_copy_data': {
65 users:{ 63 users:{
66 'catchAllUser': { 64 'catchAllUser': {
67 __masterkey_test_value__: 'masterkey', 65 __masterkey_test_value__: 'masterkey',
68 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 66 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
69 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 67 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
70 }, 68 },
71 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 69 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
72 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 70 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
73 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 71 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
74 version: '0.2', 72 version: '0.2',
75 maxNumberOfRecords: '100', 73 maxNumberOfRecords: '100',
76 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"xuiWbu5GjkueQhyH6sKg5Cn9/CSsPIjYgbhaHmjgwnnB+GL8UO5u0uURxTY6tkG2HbaFRpYZwLnqUUulEkVY6iNqJajFI0qDtrKams11cF2y9LaAalbqyv6U7EUt76d666DkXW8tf88nJ4HYfyAhhPCJ0cw5053K9BAVPbQM7fMA4MYY29k45U3HcIKNZcNqMftCc+fZB+fmZl1g7mSbrXaZyagRkwWwTdJ6/ecVOSSVOkWpckAaQWzGhwbO6zVWLtR9XQReIQZV52TwDMnV5IYJHnlw0Uvv2ZCVSu/oMN2TneW5fcIwQ0x/SRe+n4Mklzucpvasza+ZhRaRUFS53kvmbfPFI5tXqB3Z1+9S7LRLr9Ws97suTQ6G5eW6jKT2vf65ehnQJtA/gW6uwH+3IAT7ukFxO1knaRf7dRJDLuIc4Xnh+bRDnZUqfA+B+04pp6r0OS9oysD35t/HydVFeHgoyMCbL4RzduZvmu7y16WhIznn0DEfRmrYmC68C+DNcAbxeiXU8v14PgGycIg1++0v44Qor/BXfP5JW4WnYjVLW3aXN3FgI5rPuN6PqTzMn7z+eF2V28GNss5pui1xIbR2bTECAAnaRQiaz98F1LH4z5kYG1ehmyjIOLqz1nAv3Kuo7+DZKaSez4nX1oWznbXEnwd6uguukcCGpQllZoHYso/fz07e6p/9fskXPmg7LnMMHApP7Vay6XPhXV/AG0imU7uREFLbgnw3305Ey9fslmD8qCzi8LlqNALEt1TFNpAukvqodkv8V1o6zqzYNMSKaqJV4E9dWMNDpOFFTKv1FuZjZfzyPwyCcePgP7vcJGtUSYqRJwl56Ia8UA+l3FBiX8DCSW3GkG+wusf7bZ5kV6lV5DQJTScIyFxWwcECJ5S8/2QaBPTopeLo2NuMmFwjUwhBGVrDkUmtqjfb6DSfr/dR6AbmraRLXrpd/KUN7wWgp5GdLUAKNT+RdsUc0mLsLF3oT+XshfgfsQqi/pDnX9x3QfH/WuRtoywAIE5APU8Rnl+1NGsEidzeYrBnryA8VRi9vxfhuaxe3+rx1ewB1pgVSERPLF+0MYtetug01yRSxEUYJgYHxQmfnmkCoz+kKCejdpYVqKC+RzhjIMytRbFXNmS0NpRmtBxZrSIskKXjjwjUeEzMAttqAPC4IK1kt5IK+5NZPNZbf2Y8qDsWcBNXfw5sh7pJymRwPCge+S5Jy69tadeSAWpX1YMuq+By/o2KWawpokstxmE6w2RNPFhKXtGPvukoDnpV9wDFgBcoNDJctDVdIPqNolLxn6Y57HoOid6CO2s+PqQcfZSEo7V70Rk6OQ+02M0ED0/4XGq6vflc6IlQ5LO1urRT4INrAQmWdulHnmLf+HESJAc0ZICO1T73aQVaGVVHFQxDMVgaTer1UXP1xxfB1tazfJme2aycsDM1WS5lTwMRRlvgwupkzS+YwGq+nB1QFsZknKgeoacGYxQjFo6EGvszitNU+sK4U/EeAShS/nM/96c10awZVwQnal5T9sYOO31mA2pxyI4TwxkgWw2wkj38msz+8afHvPlFlqlU0UiEm7hYMj5s4L08msIY+GVc7tGgaRYklsnRFUU6s0Kql8BLPkbpdM9RAoSczy4tlGlaBAPeC6ouPgyNf1+VRfVZnqlPF063ok1KcEbd6QqQHo0kgsUMLbtdPbe752dmUo64sZXkuDKISmFEwQjn3SN4K7OOg9sk5QEz1STMvm8pazq1yb+0CE1iad5e+HoNkrGT+5GSVX+YShiItu5eyZXjZ7m8GQ2HZTA7mgv6FwGSI6o0URPIRk/UgKMCggTSat2gf3oVk+aZvRCvkGg+ISjkEKk49tQasLDAfvVjdue2JHpM1UwNhTlurHNasqnwNEzFzhflsMuM+V7dv/6/3AiJBUSC9Oyd/kWRpt5DS0nW+BkBcL5eBoofyssj0tAqxpWe+nNwCL9ljVPdytQCHWp71xEqnDxSq1KWV7u57MmBSaGStdyWtShBvEQdHQIDpXz8HVfOWOxQKttNYkupVJcbYhHNicwLzc3Ox1TaT/trfkmTXT80XXfQA83Ls1VVsYKjHDBT5/bIOx3IzjS0KNl7C5E8BuggSL69t8ogHSOKwH9CugZje3vj0BuzhZsl65k1i/pNS+vYwOifv6BhhbgWS6D2s9+a1Xi5YLGLE/EvMlw82N+o/owUluZ2vhekbYJ0HkuyrL+18l0L5B+8iJS62LzdD+hC93cGxqD9RVQA37yxzpN33l2y6teSrypYU7j2hMVv1l0Y6JU0l5itSdWT3VmWyHzdKLYNFjpA2WY3UgvsWRTJfFYzFEYUu2V6OqY7HzUiuKcVTYwB5Ky2qESzmIFiLRv0E9E+fVoYTKjk8v2gDaNwKWq7AJTabgeNaQVif3lUdZ1oQerb6aRc7PBBBKBD1YE3S8+wJ6C4MIs+XIxuJvjhhbOav5Q+G9Tk251dlt44cWQ61sCPi5pCMAgzcwRH2+ZQOZeYslt6g4XS3TorVlHveIpQkBOPvzO3fUkfUQzKPZ1QXFIBZnTLLIcsV+L/tt5kep9ucrqUjNcREPODf+nM/mQlfLGT8SLU9r2zMFkMm4zXNWswWTsXO7zm1YEErAtyggWff6gM66wz1dnNMiVXMQ=="},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}', 74 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"6tqzHY7/lB/JVfDi3iJ7BIJTiX1Fih//aTUF7IDoLdlnafC9hoIQ/5lGk+/Ezilw59n11ocPN31aOA9ddFGc9oa2vQ1BdymV8F91sWGLGyWft+PRCWOqxy7U1XxvbgyRbCs0mbtSLp/qlC6gewnAXJpH6KT9oURIjKkyaR8jJ7ng6IlfGUIL2KUFnAv6KNoWO5cdXDU0nrrdSYehcApmXYlTyreHDbrFlLJ2YuR9JLvw9bDxXi/xBY1wZgwiUsGVlG3j0e4f63mJVrpmPI1jhaXD3BQD8cbl96l1ImhYe1Boz53gLq94KSk+3bkjG4GRhvlDPtvk8vdSZPsYPsbC0Cu0M4TMS70nPX7qNj5LDvzrd+S+zDj1/CW0yctRThXstrxDyG/L75k/xdZcVbMzXQHQR4OwWWFiqGOnLpyiZIHGfV5+xZ1a1uxT9TPDoDdwPuE5P1Uwh3PeGc9jatk3waQN6fo3g8PQrCOtPn7C7b6y4MEjpAG4e53HFb0B/hEfK6ApycT6QAglsA3qF/tZyZbwNCwert4pG52rIG/PODZ1XxVZHFX8VFWeSxuk/jnPpJg/pvfpRzBMyCGVDJb/i+dlwFcnOAVvqju5xXJk4mu05XrngF10NzHnVRMfxwXmdtTDYE/lDuODy1SiE5yBZlt/Ff6a0eMS/P8HLsUS8+dtz9yOIQ8rh+52nVS7F5tFWXFOvT7nfq1L4HaHCigY187Jk0Y3LCsZW6ziB5qhKZlbQxdCAx5UDNWNs/F59qxVWP5k2UagBgAJoh+iMTZAMWkaURqQxY84SVYIkm9vNZv6Jf+ppFJNn6s3ZZSUe8gmmgMPJP0Lmoh/VCPNypzR+sZULfVFpmPmNXfaAOQ875iDgvUuBWsDSBdyx2+8Q+fUO0w+W4WkDM09VGmFxrHHjfpRsOT1B3dVFti2ypyiCdkvm878pvTS2j4Obweh6+bmzE7lqOXJgtQUydKNZIb3hNbjB7LwPro6e70ctm3eM9OLFT73u+khVM2UtAhfMseEb+Ny+PldW+VgXnHFm8n5CDBHoDJPXBfJq60l6+1OnDPfB+7tIgnCVH56CZ0jFX2EbxWS63xAHNLttfMtxdbkf4AbpanqLJvNiU4P0ThW4+VNRKBid0v78WC40rWX4UTEv9HPvUA5JUsj1v6+I5UI+quCUfx0vQgeO/gAlI0YuVgDBB1ouWUSES9+U9QIGoUsVTHDo4ZOEInsnhjPbz+IFyRMoMfbiYx3gviHluxHNGYsIMFxo+yB8aW/CedyWYt54ijgViPIXhH+R8bMgFBX4JX6hu8l3NMSYvMV82ua9Pnyl7NxbwuL1S/0JAp2uh0OzGMX9iOOcFWqbWVAX7NCePAG4VTJ0wZ2iL/MUGAVG72qBWvCb1ckavQc1LTw8l2vPG6YwFf0frFHsVvZsGHRptswFTp+77U1bpn/TL2MUXJQ9gQWgCQHxE+STunbJDDWOe9FZeKkJgjqQQ2E70UFoyUp4U/H1fA5Sy9+gS8QMtOcPJ6tCbcIXnq1nif+6bDBjtQCofs59Mm7ibwnofXPGkWv8Id3SyhW9YZCYhJZss2dkMyWfqw4jDysWxQAHjxZg4qgVXA9xpwuhu7O82vMOutk7vPyEuJ4gqlDroN4aPecD405YOEXWeWrWsL2V3y5PwXBrYWq22XzJeL3PvS9usj1Vg2TtG2O3HLuB6Rm6+i7kraiRbENemst4MjLrZwYjI07ZD7DUifsrUvjA50JXXb8pjudYqwUrTKOzcE/uZ1WbSbm+2x8PYVimLtDE4/lOp34J07WV7ZxJL8yk4J4CYRxLnnS7xps8skfy6glRA8fTKRVLv+9VqVxJgE3X/G8Kfosd9K03DJbD+L+h3kvLAAZ6Xr6FpbnA5HeGXzfQ/k5lBqIS39iqT2kZKMxIOXhfwmmuTSS25nk7hD+0R1TdnnTOYQrEn8bdyPuFXzd08FxN9KSYm2H1Gdg+2h+N9UWTED7zXmv/H+gfzk5gfoNOKyWWoaEFT/NL3ky6ApzuiokUj3x+xvCwOXoozLHXhdeZYtYkIu1HlYWQx1YAk2ilg47nnRhQQaYjMvIHfsdYjdb1CpGO5K1dYlRBOCMttp+j5QVz/jCSeCrMh8dtu9ZGLEZ3QL06tqmXp03fCsvKOG0it/KuNG5EJpfb6bV+5DsZvI6k4VLXjcKvZhhh+VZSf2mr+mzFEGKBSeleZvii2g8dVyaEBms37SBFCdIwkMxFRmzo/n+1m8axx9o57NPwISU4q8eAjUK2bWrBECZaI4FwLqmlGK9hMPGB/lbrcuHtlqmv5qzo2TJb5/xoX0LyJB/FZVk5Wsm8vC+O8b7o6JDxaPkOgy07+p8Sg9wuKVy6hHrFRnZ+MEZO3Bbk74omg4+6y4HVuRCgxztzRyUiYTssFphqKBsC/e6fQN0QtSwhLSld/B5qoPMn/9CMs8UxmRbA2Ekwi+7Ss51YsWNmd8dKUqxMKWFZOQYe2dbvcYbRwKwjrARxR7d5aaQr8b96hKsWs0YkLQDn71C3AQfEUvClvDXJdJ97B9WkDHz/DQ9EaIp9+4ZSl3SIrew09vUkvUSVGU7egHzv1Oe2gf4jI/3zToRq307AzCT1tF4k0VbInDFKb8YSG35UaJAtfTENvkAQ+8KmR3gQyHRupLi6D8TNvy/03n8naG8BV8+EArzmUAgxmfv3PTipnn3bdsaIFK1+uldQXVUoHm7PgZidzOHpNXvNzgrL3c3gv7Et/s="},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"xuiWbu5GjkueQhyH6sKg5Cn9/CSsPIjYgbhaHmjgwnnB+GL8UO5u0uURxTY6tkG2HbaFRpYZwLnqUUulEkVY6iNqJajFI0qDtrKams11cF2y9LaAalbqyv6U7EUt76d666DkXW8tf88nJ4HYfyAhhPCJ0cw5053K9BAVPbQM7fMA4MYY29k45U3HcIKNZcNqMftCc+fZB+fmZl1g7mSbrXaZyagRkwWwTdJ6/ecVOSSVOkWpckAaQWzGhwbO6zVWLtR9XQReIQZV52TwDMnV5IYJHnlw0Uvv2ZCVSu/oMN2TneW5fcIwQ0x/SRe+n4Mklzucpvasza+ZhRaRUFS53kvmbfPFI5tXqB3Z1+9S7LRLr9Ws97suTQ6G5eW6jKT2vf65ehnQJtA/gW6uwH+3IAT7ukFxO1knaRf7dRJDLuIc4Xnh+bRDnZUqfA+B+04pp6r0OS9oysD35t/HydVFeHgoyMCbL4RzduZvmu7y16WhIznn0DEfRmrYmC68C+DNcAbxeiXU8v14PgGycIg1++0v44Qor/BXfP5JW4WnYjVLW3aXN3FgI5rPuN6PqTzMn7z+eF2V28GNss5pui1xIbR2bTECAAnaRQiaz98F1LH4z5kYG1ehmyjIOLqz1nAv3Kuo7+DZKaSez4nX1oWznbXEnwd6uguukcCGpQllZoHYso/fz07e6p/9fskXPmg7LnMMHApP7Vay6XPhXV/AG0imU7uREFLbgnw3305Ey9fslmD8qCzi8LlqNALEt1TFNpAukvqodkv8V1o6zqzYNMSKaqJV4E9dWMNDpOFFTKv1FuZjZfzyPwyCcePgP7vcJGtUSYqRJwl56Ia8UA+l3FBiX8DCSW3GkG+wusf7bZ5kV6lV5DQJTScIyFxWwcECJ5S8/2QaBPTopeLo2NuMmFwjUwhBGVrDkUmtqjfb6DSfr/dR6AbmraRLXrpd/KUN7wWgp5GdLUAKNT+RdsUc0mLsLF3oT+XshfgfsQqi/pDnX9x3QfH/WuRtoywAIE5APU8Rnl+1NGsEidzeYrBnryA8VRi9vxfhuaxe3+rx1ewB1pgVSERPLF+0MYtetug01yRSxEUYJgYHxQmfnmkCoz+kKCejdpYVqKC+RzhjIMytRbFXNmS0NpRmtBxZrSIskKXjjwjUeEzMAttqAPC4IK1kt5IK+5NZPNZbf2Y8qDsWcBNXfw5sh7pJymRwPCge+S5Jy69tadeSAWpX1YMuq+By/o2KWawpokstxmE6w2RNPFhKXtGPvukoDnpV9wDFgBcoNDJctDVdIPqNolLxn6Y57HoOid6CO2s+PqQcfZSEo7V70Rk6OQ+02M0ED0/4XGq6vflc6IlQ5LO1urRT4INrAQmWdulHnmLf+HESJAc0ZICO1T73aQVaGVVHFQxDMVgaTer1UXP1xxfB1tazfJme2aycsDM1WS5lTwMRRlvgwupkzS+YwGq+nB1QFsZknKgeoacGYxQjFo6EGvszitNU+sK4U/EeAShS/nM/96c10awZVwQnal5T9sYOO31mA2pxyI4TwxkgWw2wkj38msz+8afHvPlFlqlU0UiEm7hYMj5s4L08msIY+GVc7tGgaRYklsnRFUU6s0Kql8BLPkbpdM9RAoSczy4tlGlaBAPeC6ouPgyNf1+VRfVZnqlPF063ok1KcEbd6QqQHo0kgsUMLbtdPbe752dmUo64sZXkuDKISmFEwQjn3SN4K7OOg9sk5QEz1STMvm8pazq1yb+0CE1iad5e+HoNkrGT+5GSVX+YShiItu5eyZXjZ7m8GQ2HZTA7mgv6FwGSI6o0URPIRk/UgKMCggTSat2gf3oVk+aZvRCvkGg+ISjkEKk49tQasLDAfvVjdue2JHpM1UwNhTlurHNasqnwNEzFzhflsMuM+V7dv/6/3AiJBUSC9Oyd/kWRpt5DS0nW+BkBcL5eBoofyssj0tAqxpWe+nNwCL9ljVPdytQCHWp71xEqnDxSq1KWV7u57MmBSaGStdyWtShBvEQdHQIDpXz8HVfOWOxQKttNYkupVJcbYhHNicwLzc3Ox1TaT/trfkmTXT80XXfQA83Ls1VVsYKjHDBT5/bIOx3IzjS0KNl7C5E8BuggSL69t8ogHSOKwH9CugZje3vj0BuzhZsl65k1i/pNS+vYwOifv6BhhbgWS6D2s9+a1Xi5YLGLE/EvMlw82N+o/owUluZ2vhekbYJ0HkuyrL+18l0L5B+8iJS62LzdD+hC93cGxqD9RVQA37yxzpN33l2y6teSrypYU7j2hMVv1l0Y6JU0l5itSdWT3VmWyHzdKLYNFjpA2WY3UgvsWRTJfFYzFEYUu2V6OqY7HzUiuKcVTYwB5Ky2qESzmIFiLRv0E9E+fVoYTKjk8v2gDaNwKWq7AJTabgeNaQVif3lUdZ1oQerb6aRc7PBBBKBD1YE3S8+wJ6C4MIs+XIxuJvjhhbOav5Q+G9Tk251dlt44cWQ61sCPi5pCMAgzcwRH2+ZQOZeYslt6g4XS3TorVlHveIpQkBOPvzO3fUkfUQzKPZ1QXFIBZnTLLIcsV+L/tt5kep9ucrqUjNcREPODf+nM/mQlfLGT8SLU9r2zMFkMm4zXNWswWTsXO7zm1YEErAtyggWff6gM66wz1dnNMiVXMQ=="},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}',
77 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', 75 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
78 userDetailsVersion: '0.3', 76 userDetailsVersion: '0.3',
79 records: { 77 records: {
80 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 78 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
81 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx', 79 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
82 version: '0.2', 80 version: '0.2',
83 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 81 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
84 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 82 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
85 accessDate: 'Mon Jan 19 16:10:04 CET 2009', 83 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
86 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 84 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
87 versions: { 85 versions: {
88 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 86 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
89 header: '####', 87 header: '####',
90 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 88 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
91 version: '0.2', 89 version: '0.2',
92 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 90 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
93 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 91 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
94 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 92 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
95 } 93 }
96 } 94 }
97 }, 95 },
98 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 96 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
99 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL', 97 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
100 version: '0.3', 98 version: '0.3',
101 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 99 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
102 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 100 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
103 accessDate: 'Mon Jan 19 16:09:39 CET 2009', 101 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
104 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 102 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
105 versions: { 103 versions: {
106 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 104 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
107 header: '####', 105 header: '####',
108 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 106 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
109 version: '0.3', 107 version: '0.3',
110 creationDate: 'Fri Oct 17 17:00:31 CEST 2008', 108 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
111 updateDate: 'Fri Oct 17 17:00:31 CEST 2008', 109 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
112 accessDate: 'Fri Oct 17 17:00:31 CEST 2008' 110 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
113 }, 111 },
114 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 112 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
115 header: '####', 113 header: '####',
116 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 114 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
117 version: '0.3', 115 version: '0.3',
118 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 116 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js b/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js
index 91909fa..cfe94d4 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js
+++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.Tests.DragAndDrop'); 24Clipperz.Base.module('Clipperz.Tests.DragAndDrop');
27 25
28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
29Clipperz.PM.Strings.Languages.initSetup(); 27Clipperz.PM.Strings.Languages.initSetup();
30 28
31Clipperz.Tests.DragAndDrop.Tester = function(args) { 29Clipperz.Tests.DragAndDrop.Tester = function(args) {
32 args = args || {}; 30 args = args || {};
33 31
34 Clipperz.Tests.DragAndDrop.Tester.superclass.constructor.call(this, args); 32 Clipperz.Tests.DragAndDrop.Tester.superclass.constructor.call(this, args);
35 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 33 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
36 34
37 return this; 35 return this;
38}; 36};
39 37
40Clipperz.Base.extend(Clipperz.Tests.DragAndDrop.Tester, Object, { 38Clipperz.Base.extend(Clipperz.Tests.DragAndDrop.Tester, Object, {
41 39
42 'toString': function() { 40 'toString': function() {
43 return "Clipperz.Tests.DragAndDrop.Tester"; 41 return "Clipperz.Tests.DragAndDrop.Tester";
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'user': function () { 46 'user': function () {
49 return this._user; 47 return this._user;
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'run': function () { 52 'run': function () {
55 var deferredResult; 53 var deferredResult;
56 var proxy; 54 var proxy;
57 varcardDialogController; 55 varcardDialogController;
58 varcardDialogComponent; 56 varcardDialogComponent;
59 57
60 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 58 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
61 59
62 deferredResult = new Clipperz.Async.Deferred("DragAndDrop_test.init", {trace:false}); 60 deferredResult = new Clipperz.Async.Deferred("DragAndDrop_test.init", {trace:false});
63 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); 61 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
64 deferredResult.addMethod(this.user(), 'login'); 62 deferredResult.addMethod(this.user(), 'login');
65 deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); 63 deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
66 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) { 64 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) {
67 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this}); 65 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this});
68 cardDialogController.run(); 66 cardDialogController.run();
69 67
70 cardDialogController.showPasswordTooltip('**********', MochiKit.DOM.getElement('Clipperz_PM_Components_actionLink_63')); 68 cardDialogController.showPasswordTooltip('**********', MochiKit.DOM.getElement('Clipperz_PM_Components_actionLink_63'));
71 }, this)); 69 }, this));
72 deferredResult.callback(); 70 deferredResult.callback();
73 71
74 return deferredResult; 72 return deferredResult;
75 }, 73 },
76 74
77 //========================================================================= 75 //=========================================================================
78 76
79 'saveChanges': function () { 77 'saveChanges': function () {
80 return this.user().saveChanges(); 78 return this.user().saveChanges();
81 }, 79 },
82 80
83 //------------------------------------------------------------------------- 81 //-------------------------------------------------------------------------
84 82
85 'hasPendingChanges': function () { 83 'hasPendingChanges': function () {
86 return this.user().hasPendingChanges(); 84 return this.user().hasPendingChanges();
87 }, 85 },
88 86
89 //------------------------------------------------------------------------- 87 //-------------------------------------------------------------------------
90 88
91 'revertChanges': function () { 89 'revertChanges': function () {
92 return this.user().revertChanges(); 90 return this.user().revertChanges();
93 }, 91 },
94 92
95 //========================================================================= 93 //=========================================================================
96 __syntaxFix__: "syntax fix" 94 __syntaxFix__: "syntax fix"
97}); 95});
98 96
99 97
100 98
101 99
102 100
103 101
104 102
105 103
106 104
107 105
108 106
109 107
110 108
111 109
112 110
113 111
114 112
115 113
116 114
117 115
118init = function () { 116init = function () {
diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html b/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html
index e484719..70a6d87 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html
+++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Card Dialog EDITING - test</title> 26 <title>Card Dialog EDITING - test</title>
29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 28 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 44
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
53 51
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
59 57
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
62 60
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 62 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
75 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script --> 73 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 75 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
82 80
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/FaviconComponent.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/FaviconComponent.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
92 90
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/RulerComponent.js'></script> 91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/RulerComponent.js'></script>
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
95 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
96 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script> 94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script>
97 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js'></script> 95 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js'></script>
98 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js'></script> 96 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js'></script>
99 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js'></script> 97 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script> 98 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js'></script> 99 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js'></script>
102 100
103 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script> 101 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
104 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 102 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
105 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script> 103 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js'></script>
106 104
107 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js'></script> 105 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js'></script>
108 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 106 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
109 107
110 <script type='text/javascript' src='./User.data.js'></script> 108 <script type='text/javascript' src='./User.data.js'></script>
111 <script type='text/javascript' src='./CardDialogEditing_test.js'></script> 109 <script type='text/javascript' src='./CardDialogEditing_test.js'></script>
112<script> 110<script>
113 Clipperz_IEisBroken = false; 111 Clipperz_IEisBroken = false;
114</script> 112</script>
115 113
116<!--[if IE]><script> 114<!--[if IE]><script>
117Clipperz_IEisBroken = true; 115Clipperz_IEisBroken = true;
118</script><![endif]--> 116</script><![endif]-->
diff --git a/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js b/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js
index 49abe46..ba60878 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js
+++ b/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26testData = { 24testData = {
27 25
28 //------------------------------------------------------------------------- 26 //-------------------------------------------------------------------------
29 27
30 'simpleLogin_001': { 28 'simpleLogin_001': {
31 'users': [ 29 'users': [
32 { 30 {
33 'username': "joe", 31 'username': "joe",
34 'passphrase': "eoj", 32 'passphrase': "eoj",
35 'version': "0.2", 33 'version': "0.2",
36 'connectionVersion':"0.2", 34 'connectionVersion':"0.2",
37 'records':{ 35 'records':{
38 'record 1': { 36 'record 1': {
39 'notes':"Some notes here", 37 'notes':"Some notes here",
40 'fields':[ 38 'fields':[
41 { 'name': "username", 'value': "joe", 'type': "text" }, 39 { 'name': "username", 'value': "joe", 'type': "text" },
42 { 'name': "password", 'value': "1234", 'type': "password"} 40 { 'name': "password", 'value': "1234", 'type': "password"}
43 ], 41 ],
44 'directLogins':{ 42 'directLogins':{
45 "record 1 direct login": { 43 "record 1 direct login": {
46 'configuration':"", 44 'configuration':"",
47 'bindings':[ 45 'bindings':[
48 ], 46 ],
49 'favicon':"http://www.example.com/favicon.ico" 47 'favicon':"http://www.example.com/favicon.ico"
50 } 48 }
51 } 49 }
52 } 50 }
53 }, 51 },
54 'otp':[ 52 'otp':[
55 "12345678 90abcdef 12345678 90abcdef", 53 "12345678 90abcdef 12345678 90abcdef",
56 "fedcba09 87654321 fedcba09 87654321" 54 "fedcba09 87654321 fedcba09 87654321"
57 ] 55 ]
58 } 56 }
59 ] 57 ]
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'joe_clipperz_offline_copy_data': { 62 'joe_clipperz_offline_copy_data': {
65 users:{ 63 users:{
66 'catchAllUser': { 64 'catchAllUser': {
67 __masterkey_test_value__: 'masterkey', 65 __masterkey_test_value__: 'masterkey',
68 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 66 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
69 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 67 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
70 }, 68 },
71 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 69 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
72 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 70 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
73 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 71 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
74 version: '0.2', 72 version: '0.2',
75 maxNumberOfRecords: '100', 73 maxNumberOfRecords: '100',
76 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}', 74 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"jufmL1KVY0YBl8MSaL413hGtw12I/+sFnumcfeVku9RRMBmXaXCfE/vYnraxZyPxJxVS3qFRWDKsSGR3pScdACSwlBD+mzjifRn2SCfXWutD1/oJiqiMvq3YFzwyZJiXx+oS5u8DOTieQT9HZYt0pUmAod9QHiq2NAkueVjvRkZI1saRlWGtNXCaJIHwpuFJpHBDSD//6D9DYeTdVUeFEbej+4oNYpBCkyE1G2OL6q50YRBYp9yARRiy9juKHRWFvZiSeMGEJQS0f2gaP+xZkb9Z4qrfDgAZ1F7oDbPksr2SOYlSsm0bqa6c+7Wtopdo63Urf7Ze3Wg9n8TGBk6H88boseR8e3sHudlmtO1oLxcB9p3z/NTceF6SvWyJWTxHeMe6O72dZVmSnZlXhD/IJamRt13HLk3g05d8oXfrXM3iMhIGQ+EsXMxZfKdXlZpyYtjWD5tcQTKz7M5Qo3SFmdkwDu4jH5ke+bD8CeluDcMaHF6KHfdV8nEsmsjGwrH6lqSCT/9kBO5ETqUJKloOhJpFpNS/EN7nxjXF/QbqnUmWV4wngdyYmk9goNZNfZv7C2ouiyys55/QEfGsIsvEPPSfO670oJuncTyfFngFj2tdh2JpJ5vytuoRNLOm7XPM3hDCvZCOpUnjbm+jt4AvdOGU7ID8a2mtZFjb2noP5emAxTg6MO6f3+44eTkUcbCDskO5fe6jd0pTdODk21Ilp7WUjFwxEdJG8tRrGYpLooProJExamL7WShm/S/nhJL4+euW+1UIDjcZJA+a7aGdMSC63qBvrEsNyf57SDBk/o2eNJHs2sndCzgvK42IKGKcipq9D1Gyos9JQsA3My9ARMt68V/5FfzOkgPO6mblOsQMoTyQj/OCLzITEBfqA5IufhljSEkD3CLkfkeVwVf1NB2SsTPXJFChnynfsK7cMFy0O2XBNByCRTQDqBDBYo673tI1KTGnT4gLSAwCt96lq8UkEdt51jjkAJcvBXkbswuw3hvhtzLJ302hkN9CIHJrEN0oss5mWlxIxYrCyqE3ABME3FCR9r+V7exuIaQn6mdJTkMcRbYmVQQkexsROh2cdx8I/tuMN4ECWEAL948k9vEPZfgaQirWnrTtHoxLzNAUBDSQfzYXd8yr0T4vAHLnXaUalWPgLamJJ3eR+LDFcDQVvFkaomsF3RpOIS5fswTBFuRKGKEBSIINc9AyC4DtkSmDMTF2S0TgpnGdK94ZS8C/PM8WEsX738echa5qZG5qG0f+koOUUrbaORcDqaktCuDmsgFTYiUv1JxFskTvS/t/EM2Y0MEKVLZBsoG+4WXz4XEE0VJFoI9glaYll96WH/iMbaVXRnDwjyE62CAk/8DXIf//MJQVyO6ElFsvCrDfH03yLpCJhqwHv+mD5sRctVaq6Cp5Ts3bzdFeiLCX9rhSaqdG5AuMk4dCInlywxrsOvBfNaDBjX7NGCULri6px2T53FNiH6ineVjr9TfgY2uoMyevLiQsGd3GHS4wnxiUfIyz7/Yav5an4o82cHhMVOLvfKwF8C2dJQDg9woJ3ju1ha66UA2XGScJVd93w3OWco78+giXBE96R3CebxgaWQ5Zif6nI+FJnw6OipaRgd7EyrLrQTWadvTiYLfDknlsxFZd4XVs33/3xxF3RyoVsIFO7cpEX/BLVB69v+1TJvLdiyGwSl5FUKbrcrXycZ67uTKtHyAI/vrzwwoQxYV8e32xW86blEjH4pq/Zrijm1wGw7IrD9fYVgEO7nnWpE/ac85LrDaJpGOdZ+slcVWM6THHR9boKJGLtuc8V81gDVNtZ/f4Hx5YXZWKIIfpe57BybWejdQ8ZACWK+mXOGczyXJ88B4nIvaKnRlhSszQryAZzSqJry2k3t1v73BzL48TZWJ6yu1rFmqAUk2V5DCA4XnyHfPuiG8hZfTuu1YXQ+iBgbyDipTwozQqyTv3SxLBPTFxKZLuabMn7ZTo/kLXGfVO/2va58bv6kzW6WjwZ0D481N1Nyd1kZUw1lyxXklcAzZqaHUiIsy+/5DgV/qULYFqEBMNMA7QvBfRN4VZRlnNiemgzkBQXj+JGJOWZMz5cvss291rj1fAe91s10nkZoaddDrvfgfjTq6n9XLSyGSmnrIDMLVc9+YuDtuaQ4gwuiLG2X57Jzrc/Xy7jdZ82G1j+cfT/8Pvb40i1K9aid0Z3xl/tm7jBAqQ91Ehkbo6c8jUVPaQsRcfTumtsNf+Xa5PJmQtEGEPCUlGN6F7eFB5eOLXQFdsLRL1x+SzhS7k3aDri9sTMwYQij26AexwwzAPqcOOkkfbYf0lov5Gxx0LhsZAetDZCRFlxjDRDS8jE8dKBBXkWFazF8K2rdQXKNlclwezCEDBwUWhoJs/H5ndJ38MpSPfKo1YsVvlxi4QFyOTDPJIstCCvYnCjj1r7SrkRrbcuevITRTxD4FKgPCdsYFlGfhS1zWb23DWYWo6fPQ1/zlnN01gZStxsZKepB3NnxbTSjBgTSmzG6RzZajv6BtqivtvOa1hI2KZQtVGCDU2+NGmfbJ5TTJehYiTEPeBF9TfLRP9rktQTUngj2ohv+1TDL0jL3YWiSA9TJzYonsincEVy1aRUeGVazWF2Rrq2o4hCBp12BfuMGHOdVkg9rMXdusyl2y75YyEkcBNMz4zi8i1lVhjUg16rCR48uKJ9QO2KBbjoGTx13uxIXTR8ufXx6mW7iW3qVx+6k7BQGKlMo1G64O8HQ2UrboS/tCqlP0W+7XB2C3EaZMqfKeYcuzM4MLkM6CT2GKYmJPyevXLKE749BM8zRQUcrWieAxmyD+g0QQ4T1fl0RTNEFB1/0BIg3fQQHCLGUTahXwt0EluG9iNPVgmFwwBHybH6gmIEZ4xnD8I7QPwgYY3JF407NdLkHjOuXrP+GODGEvX49MMaUigUUO2fkdw9EJbaidhx6j1EsFpQrz4Lt/5sAu5c9B/365TXtnNnmaPkaFj1q+3ezVXUroimRqxZ9BMaTm7J1hjubO+Dxjb2QlR/UApvQ0ty8aZpmIrMi0xjfoodIMiH6IYdw3VRZSqup7irWWpnJhef2qqtcpoxdiYZaFyf5u2XpZqEnAJpTupqOg+qJN/7aQt6ZmP7POFPwUwzwAsfTYk2EwMlTVAXrawZZEYu2JZ4kIjazo1LgyuuWTieEuONnye8Hr9p70RjwWUdlErlPSCKKn6JRdsM2no13F3151cfgx8I02J9vDuiNa3vfJfmRnBOly5jq6Wlnm2rJN6YYQHwbikoq3lJvkX5ZANDRKFlMWKK42+fXLBuofAZShFt6xvlY384aYsv3EcR42GOLrgYPQy0a7lr/FS4mM2ErNwNYnCz/xTuPBjgXXplbAnyA3jpKdPN1EfUM1oA4kZjECmkXZOuyEQxrndS9eOGbPM6S131zpdWEw9dWSZdkSI34+OkLfAKf6W6z4G4Z+cMRrkYLHs+BavJOum4XTjyyXHIKhQiqz9mgEf+ulodXi+LNsbq1eCcGPWrGg+GNwN1SjJHZm78gidyrlEF6xuPCaZRvGQtk59nuJULOZWkC3Ns/EcFiAql8cu37Lp842fsHHeCVOq0e8ZII4TPg9HKPwDD4HLSg4frBzyeZwK0nN30C5ATCxWdL4Q60cKtZyIEM7Kn1a/vifsAbe019Ui3ovTOCYiTCAdOLaAL/NdpgWA/fDNOsTlPvnEYkq+4+bV3Wyye9ddxICD4TnC2yvXvjw4C/WnYYceJy5R4KamIJueEGIHGp22/0DSF3H4ji3QoUDiFB/H+CA8A2q9LO9q0NYcf2P5q2MfdJGu4bd49g68mltj35pRnGQaafflXY9VmMfrlAbBYfUnsKOb3DOUpq8asveE41/6WkGcXFIuSABcbBf0cHIfBn41wRWQhoCm/JL8pfqEZC/paBdFBRW4FjKkxhbg4BPvBL0aQyGGkU8eH8tr8nm4YN1HMFF/s3s8+9FPoBxPuXLoGSg7Rvdz+g=="},"version":"0.1"}',
77 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', 75 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
78 userDetailsVersion: '0.3', 76 userDetailsVersion: '0.3',
79 records: { 77 records: {
80 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 78 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
81 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx', 79 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
82 version: '0.2', 80 version: '0.2',
83 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 81 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
84 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 82 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
85 accessDate: 'Mon Jan 19 16:10:04 CET 2009', 83 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
86 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 84 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
87 versions: { 85 versions: {
88 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 86 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
89 header: '####', 87 header: '####',
90 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 88 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
91 version: '0.2', 89 version: '0.2',
92 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 90 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
93 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 91 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
94 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 92 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
95 } 93 }
96 } 94 }
97 }, 95 },
98 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 96 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
99 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL', 97 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
100 version: '0.3', 98 version: '0.3',
101 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 99 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
102 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 100 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
103 accessDate: 'Mon Jan 19 16:09:39 CET 2009', 101 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
104 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 102 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
105 versions: { 103 versions: {
106 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 104 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
107 header: '####', 105 header: '####',
108 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 106 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
109 version: '0.3', 107 version: '0.3',
110 creationDate: 'Fri Oct 17 17:00:31 CEST 2008', 108 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
111 updateDate: 'Fri Oct 17 17:00:31 CEST 2008', 109 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
112 accessDate: 'Fri Oct 17 17:00:31 CEST 2008' 110 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
113 }, 111 },
114 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 112 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
115 header: '####', 113 header: '####',
116 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 114 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
117 version: '0.3', 115 version: '0.3',
118 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 116 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
diff --git a/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js b/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js
index 60a2757..9eba347 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js
+++ b/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.Tests.CardDialogNew'); 24Clipperz.Base.module('Clipperz.Tests.CardDialogNew');
27 25
28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
29Clipperz.PM.Strings.Languages.initSetup(); 27Clipperz.PM.Strings.Languages.initSetup();
30 28
31Clipperz.Tests.CardDialogNew.Tester = function(args) { 29Clipperz.Tests.CardDialogNew.Tester = function(args) {
32 args = args || {}; 30 args = args || {};
33 31
34 Clipperz.Tests.CardDialogNew.Tester.superclass.constructor.call(this, args); 32 Clipperz.Tests.CardDialogNew.Tester.superclass.constructor.call(this, args);
35 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 33 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
36 34
37 return this; 35 return this;
38}; 36};
39 37
40Clipperz.Base.extend(Clipperz.Tests.CardDialogNew.Tester, Object, { 38Clipperz.Base.extend(Clipperz.Tests.CardDialogNew.Tester, Object, {
41 39
42 'toString': function() { 40 'toString': function() {
43 return "Clipperz.Tests.CardDialogNew.Tester"; 41 return "Clipperz.Tests.CardDialogNew.Tester";
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47 45
48 'user': function () { 46 'user': function () {
49 return this._user; 47 return this._user;
50 }, 48 },
51 49
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'run': function () { 52 'run': function () {
55 var deferredResult; 53 var deferredResult;
56 var proxy; 54 var proxy;
57 varcardDialogController; 55 varcardDialogController;
58 varcardDialogComponent; 56 varcardDialogComponent;
59 57
60 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 58 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
61 59
62 deferredResult = new Clipperz.Async.Deferred("cardDialogNew_test.init", {trace:false}); 60 deferredResult = new Clipperz.Async.Deferred("cardDialogNew_test.init", {trace:false});
63 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); 61 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
64 deferredResult.addMethod(this.user(), 'login'); 62 deferredResult.addMethod(this.user(), 'login');
65 // deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); 63 // deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
66 deferredResult.addMethod(this.user(), 'createNewRecord'); 64 deferredResult.addMethod(this.user(), 'createNewRecord');
67 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) { 65 deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) {
68 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this}); 66 cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this});
69 cardDialogController.run(); 67 cardDialogController.run();
70 }, this)); 68 }, this));
71 deferredResult.callback(); 69 deferredResult.callback();
72 70
73 return deferredResult; 71 return deferredResult;
74 }, 72 },
75 73
76 //========================================================================= 74 //=========================================================================
77 75
78 'saveChanges': function () { 76 'saveChanges': function () {
79 return this.user().saveChanges(); 77 return this.user().saveChanges();
80 }, 78 },
81 79
82 //------------------------------------------------------------------------- 80 //-------------------------------------------------------------------------
83 81
84 'hasPendingChanges': function () { 82 'hasPendingChanges': function () {
85 return this.user().hasPendingChanges(); 83 return this.user().hasPendingChanges();
86 }, 84 },
87 85
88 //------------------------------------------------------------------------- 86 //-------------------------------------------------------------------------
89 87
90 'revertChanges': function () { 88 'revertChanges': function () {
91 return this.user().revertChanges(); 89 return this.user().revertChanges();
92 }, 90 },
93 91
94 //========================================================================= 92 //=========================================================================
95 __syntaxFix__: "syntax fix" 93 __syntaxFix__: "syntax fix"
96}); 94});
97 95
98 96
99 97
100 98
101 99
102 100
103 101
104 102
105 103
106 104
107 105
108 106
109 107
110 108
111 109
112 110
113 111
114 112
115 113
116 114
117init = function () { 115init = function () {
118 vartester; 116 vartester;
diff --git a/frontend/gamma/tests/tests/Components/CardDialogNew/index.html b/frontend/gamma/tests/tests/Components/CardDialogNew/index.html
index 64f9e4d..ff8c77f 100644
--- a/frontend/gamma/tests/tests/Components/CardDialogNew/index.html
+++ b/frontend/gamma/tests/tests/Components/CardDialogNew/index.html
@@ -1,112 +1,110 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Card Dialog NEW - test</title> 26 <title>Card Dialog NEW - test</title>
29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 28 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 44
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
53 51
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
59 57
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
62 60
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 62 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
71 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script --> 69 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
75 73
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script> 75 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
85 83
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
88 86
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
91 89
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
93 91
94 <script type='text/javascript' src='./User.data.js'></script> 92 <script type='text/javascript' src='./User.data.js'></script>
95 <script type='text/javascript' src='./cardDialogNew_test.js'></script> 93 <script type='text/javascript' src='./cardDialogNew_test.js'></script>
96<script> 94<script>
97 Clipperz_IEisBroken = false; 95 Clipperz_IEisBroken = false;
98</script> 96</script>
99 97
100<!--[if IE]><script> 98<!--[if IE]><script>
101Clipperz_IEisBroken = true; 99Clipperz_IEisBroken = true;
102</script><![endif]--> 100</script><![endif]-->
103 101
104 <link rel="stylesheet" type="text/css" href="../../../../css/web.css" /> 102 <link rel="stylesheet" type="text/css" href="../../../../css/web.css" />
105 103
106</head> 104</head>
107<body> 105<body>
108 106
109<div id="tableWrapper"></div> 107<div id="tableWrapper"></div>
110 108
111</body> 109</body>
112</html> 110</html>
diff --git a/frontend/gamma/tests/tests/Components/FullApp/User.data.js b/frontend/gamma/tests/tests/Components/FullApp/User.data.js
index 4dfc81c..fb099c0 100644
--- a/frontend/gamma/tests/tests/Components/FullApp/User.data.js
+++ b/frontend/gamma/tests/tests/Components/FullApp/User.data.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26testData = { 24testData = {
27 25
28 //------------------------------------------------------------------------- 26 //-------------------------------------------------------------------------
29 27
30 'testData': { 28 'testData': {
31 users:{ 29 users:{
32 'catchAllUser': { 30 'catchAllUser': {
33 __masterkey_test_value__: 'masterkey', 31 __masterkey_test_value__: 'masterkey',
34 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 32 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
35 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 33 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
36 }, 34 },
37 35
38 /* tt/tt - empty, just created, account*/ 36 /* tt/tt - empty, just created, account*/
39 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { 37 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
40 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', 38 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
41 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', 39 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
42 version: '0.2', 40 version: '0.2',
43 maxNumberOfRecords: '100', 41 maxNumberOfRecords: '100',
44 userDetails: '{"records":{"index":{},"data":"q/wNeY/xf7Sujn5CIxEYPRSF"},"directLogins":{"index":{},"data":"qcVwiiyOYeDHFZq5T06iF1Wp"},"preferences":{"data":"7ONKfKQk9GYGnlRxFgTgAd4J"},"oneTimePasswords":{"data":"GD66ZNSIqkRl1UxhwyrsSm5r"},"version":"0.1"}', 42 userDetails: '{"records":{"index":{},"data":"q/wNeY/xf7Sujn5CIxEYPRSF"},"directLogins":{"index":{},"data":"qcVwiiyOYeDHFZq5T06iF1Wp"},"preferences":{"data":"7ONKfKQk9GYGnlRxFgTgAd4J"},"oneTimePasswords":{"data":"GD66ZNSIqkRl1UxhwyrsSm5r"},"version":"0.1"}',
45 statistics: 'tfQF+BrjAQUWyiXWOMkWApmq', 43 statistics: 'tfQF+BrjAQUWyiXWOMkWApmq',
46 userDetailsVersion: '0.3', 44 userDetailsVersion: '0.3',
47 records: { 45 records: {
48 46
49 } 47 }
50 }, 48 },
51 49
52 /* tt/tt - account with "wrong" direct login*/ 50 /* tt/tt - account with "wrong" direct login*/
53 /* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { 51 /* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
54 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', 52 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
55 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', 53 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
56 version: '0.2', 54 version: '0.2',
57 maxNumberOfRecords: '100', 55 maxNumberOfRecords: '100',
58 userDetails: '{"records":{"index":{"8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab":"1"},"data":"/+RHG+JLrFhZLYga2H9hsPyugT5bbiPwmNgY/RqE2g90FXfsCOvJ6TnfHX6ufeVfJ5+jUq/mRhWMlKdIqROSBLRL5EbL7i881EyKMNE24zpzUWm9zN6HcATPO2iNvDjsZjv2dEP9QWtAabw4Hc7UB+39WQ=="},"directLogins":{"index":{"dd9c1f84d06d67fe1ca5826b52bf46e56407e7f9d87fb7b7b927831920955338":1},"data":"ZF6BZYAVIJi3xrCPs6XWHwZDveEonG/5WJVKwIXbCGa5fr1myopvpqYbWI09tPCCktlMKP/X/SiIyBxlq7Z953VpOHWx0AYqTpRnw8PfJ+0BJDEblBFCZ8ZZfkZXcfYmNoY7"},"preferences":{"data":"IpjYNIHTXtE/pZvR8TjotEnR"},"oneTimePasswords":{"data":"1ibPl0R6S/LGBFFyH9pio1Oo"},"version":"0.1"}', 56 userDetails: '{"records":{"index":{"8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab":"1"},"data":"/+RHG+JLrFhZLYga2H9hsPyugT5bbiPwmNgY/RqE2g90FXfsCOvJ6TnfHX6ufeVfJ5+jUq/mRhWMlKdIqROSBLRL5EbL7i881EyKMNE24zpzUWm9zN6HcATPO2iNvDjsZjv2dEP9QWtAabw4Hc7UB+39WQ=="},"directLogins":{"index":{"dd9c1f84d06d67fe1ca5826b52bf46e56407e7f9d87fb7b7b927831920955338":1},"data":"ZF6BZYAVIJi3xrCPs6XWHwZDveEonG/5WJVKwIXbCGa5fr1myopvpqYbWI09tPCCktlMKP/X/SiIyBxlq7Z953VpOHWx0AYqTpRnw8PfJ+0BJDEblBFCZ8ZZfkZXcfYmNoY7"},"preferences":{"data":"IpjYNIHTXtE/pZvR8TjotEnR"},"oneTimePasswords":{"data":"1ibPl0R6S/LGBFFyH9pio1Oo"},"version":"0.1"}',
59 statistics: 'XhiWkdDyHzuviv5bdxOY/2Q5', 57 statistics: 'XhiWkdDyHzuviv5bdxOY/2Q5',
60 userDetailsVersion: '0.3', 58 userDetailsVersion: '0.3',
61 records: { 59 records: {
62 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': { 60 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': {
63 data: '93QXl+c+JmQo4WTl4rYLYb/oHehjntAroteeHd6HqrUiXYoi+02GYrYcKfvE5wgMWvOwvQ4kVdUv5ksa3gJaUzhrpY5GLM3EV3agEkQ6yuKwHgfmAQvES1c6tcw15lNTzGiZ7PHhBrW5I5H6Le0Mf10uW1DOyu6gFl+W5OarbBBGyQmRmASy+CW2l3/lY5pOFxUq3qlkwW/o4KrSiwKOFh3HDvxOQKwovm0v3puLu+NsuL5rz5blUIZpj+CsOmZUhtU5FC5s6iO2L1uj3w8+Yxu279p249H1bv1zxo1zSBpP507uuRH8dKOLsu7JI6PO+UC8PLqVhPU7fHhDhNleurE7AsUo6eHocG0DhxCAm3xeobm1K2iPd0iRprcuRXmwa8HWRDJHTItbQr9D+cnQTT7/DwneRdQzpMaVZHZcKqtAzz07jboy98plrigu03tV2MkXt2veIMLBofxxHqgZ0NJhcfrVta4FlJsrd1vO9RUkoHl+qPJqQZIVGZzoT0rdHS/nLd614EHJSfRYIl+drUEUchIidbRnMzvPTBo2s6bVfUPcQksVop4E85wMo15ah2BHzUe4vjkmM+Ki8ecUVH8jRR5fmZhCGpBFML5U7o+rERYABFuwwRC9FfCXMtmClHc2LypP+iu+lI/VycdHg/m8skQVeCDBv892vqehUs1CpeVAxMtYOJcFtm6roQNPxJe1EI/j4PAi3SEYPCFev1F7u1g4bw4cG5jCGJx6U3qTTYMX5A06dHf4iSSOUeCsrP5U+VJY0KLhU3E66DzOxNIrIyYN6iOJxKCbhH7ILfGdWAV3MlZZOpVoSIqiR7oZo2PwovtudF5tOy9lhz7SEFYLvuQy8r4mqFC7qMVnXJRrBPDZcQDTdXLG33YV6dWX17QpGrpyvPhX5/UDv8E7zc8PdO1YfJmzL1rpArlIXF1EOsLa6BqjQp5bkIlHKugQMjnn3tf4sYK0OhPskbKidfNm59NedQODEoUr5NGwmjSAqTCokt1D7q0K3vMK', 61 data: '93QXl+c+JmQo4WTl4rYLYb/oHehjntAroteeHd6HqrUiXYoi+02GYrYcKfvE5wgMWvOwvQ4kVdUv5ksa3gJaUzhrpY5GLM3EV3agEkQ6yuKwHgfmAQvES1c6tcw15lNTzGiZ7PHhBrW5I5H6Le0Mf10uW1DOyu6gFl+W5OarbBBGyQmRmASy+CW2l3/lY5pOFxUq3qlkwW/o4KrSiwKOFh3HDvxOQKwovm0v3puLu+NsuL5rz5blUIZpj+CsOmZUhtU5FC5s6iO2L1uj3w8+Yxu279p249H1bv1zxo1zSBpP507uuRH8dKOLsu7JI6PO+UC8PLqVhPU7fHhDhNleurE7AsUo6eHocG0DhxCAm3xeobm1K2iPd0iRprcuRXmwa8HWRDJHTItbQr9D+cnQTT7/DwneRdQzpMaVZHZcKqtAzz07jboy98plrigu03tV2MkXt2veIMLBofxxHqgZ0NJhcfrVta4FlJsrd1vO9RUkoHl+qPJqQZIVGZzoT0rdHS/nLd614EHJSfRYIl+drUEUchIidbRnMzvPTBo2s6bVfUPcQksVop4E85wMo15ah2BHzUe4vjkmM+Ki8ecUVH8jRR5fmZhCGpBFML5U7o+rERYABFuwwRC9FfCXMtmClHc2LypP+iu+lI/VycdHg/m8skQVeCDBv892vqehUs1CpeVAxMtYOJcFtm6roQNPxJe1EI/j4PAi3SEYPCFev1F7u1g4bw4cG5jCGJx6U3qTTYMX5A06dHf4iSSOUeCsrP5U+VJY0KLhU3E66DzOxNIrIyYN6iOJxKCbhH7ILfGdWAV3MlZZOpVoSIqiR7oZo2PwovtudF5tOy9lhz7SEFYLvuQy8r4mqFC7qMVnXJRrBPDZcQDTdXLG33YV6dWX17QpGrpyvPhX5/UDv8E7zc8PdO1YfJmzL1rpArlIXF1EOsLa6BqjQp5bkIlHKugQMjnn3tf4sYK0OhPskbKidfNm59NedQODEoUr5NGwmjSAqTCokt1D7q0K3vMK',
64 version: '0.3', 62 version: '0.3',
65 creationDate: 'Wed Jan 20 16:53:47 CET 2010', 63 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
66 updateDate: 'Wed Jan 20 16:53:47 CET 2010', 64 updateDate: 'Wed Jan 20 16:53:47 CET 2010',
67 accessDate: 'Wed Jan 20 16:53:47 CET 2010', 65 accessDate: 'Wed Jan 20 16:53:47 CET 2010',
68 currentVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741', 66 currentVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741',
69 versions: { 67 versions: {
70 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': { 68 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': {
71 header: '####', 69 header: '####',
72 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv', 70 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv',
73 version: '0.3', 71 version: '0.3',
74 creationDate: 'Wed Jan 20 16:53:47 CET 2010', 72 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
75 updateDate: 'Wed Jan 20 16:53:47 CET 2010', 73 updateDate: 'Wed Jan 20 16:53:47 CET 2010',
76 accessDate: 'Wed Jan 20 16:53:47 CET 2010' 74 accessDate: 'Wed Jan 20 16:53:47 CET 2010'
77 } 75 }
78 } 76 }
79 } 77 }
80 } 78 }
81 }, 79 },
82*/ 80*/
83 /* tt/tt with "fixed" direct login*/ 81 /* tt/tt with "fixed" direct login*/
84 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { 82 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': {
85 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', 83 s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594',
86 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', 84 v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0',
87 version: '0.2', 85 version: '0.2',
88 maxNumberOfRecords: '100', 86 maxNumberOfRecords: '100',
89 userDetails: '{"records":{"index":{"8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab":"0"},"data":"K6sV3xYDTHn1PDHmbVhG3PogarwMtHCliSEGaJ5eev/RQv7MW9TCP5efsjATRT4eheX7JkXAoLo+sgMVr2fTyu7f7K0IEYp3mCi27T/TmtTM3b8FoaVfmXWEjN0FGx7N6gK6+lZxhFueRxsOha1+fTLDBg=="},"directLogins":{"index":{"dd9c1f84d06d67fe1ca5826b52bf46e56407e7f9d87fb7b7b927831920955338":"0"},"data":"9aUwb/5nIlAOPKz62xTwylK0dilpWVVEJBag5+LydmBwWxTmlfcB+OO6jGnMgDrjif3LVhWFjfKVSoZs5hSpPvhsSDPaLf5vQhF4igRaQpWI9QhBdfmv3QvZ57ei/gfcal346F4="},"preferences":{"data":"IpjYNIHTXtE/pZvR8TjotEnR"},"oneTimePasswords":{"data":"1ibPl0R6S/LGBFFyH9pio1Oo"},"version":"0.1"}', 87 userDetails: '{"records":{"index":{"8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab":"0"},"data":"K6sV3xYDTHn1PDHmbVhG3PogarwMtHCliSEGaJ5eev/RQv7MW9TCP5efsjATRT4eheX7JkXAoLo+sgMVr2fTyu7f7K0IEYp3mCi27T/TmtTM3b8FoaVfmXWEjN0FGx7N6gK6+lZxhFueRxsOha1+fTLDBg=="},"directLogins":{"index":{"dd9c1f84d06d67fe1ca5826b52bf46e56407e7f9d87fb7b7b927831920955338":"0"},"data":"9aUwb/5nIlAOPKz62xTwylK0dilpWVVEJBag5+LydmBwWxTmlfcB+OO6jGnMgDrjif3LVhWFjfKVSoZs5hSpPvhsSDPaLf5vQhF4igRaQpWI9QhBdfmv3QvZ57ei/gfcal346F4="},"preferences":{"data":"IpjYNIHTXtE/pZvR8TjotEnR"},"oneTimePasswords":{"data":"1ibPl0R6S/LGBFFyH9pio1Oo"},"version":"0.1"}',
90 statistics: 'GHHkZjW0QLdUq6CPnVuDLh86', 88 statistics: 'GHHkZjW0QLdUq6CPnVuDLh86',
91 userDetailsVersion: '0.3', 89 userDetailsVersion: '0.3',
92 records: { 90 records: {
93 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': { 91 '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': {
94 data: 'SOcANZTLo4dsjpsPghF2+TndV9+1uYhGjup3StEa1kiFHHzDK6kDZkKwjhP0mxFgixlQHZBnvgsW/xdHGXdmj1RHtaNdHlte7W1Wq5MHbH4XE9bJzQAvQmop8OETgGz7Khp4BbUMVLIXhxoJmP3rMx7ulQHds+WN+S5u+iB73y5nkJwfOXrXDjwwlL1vER92XHE1VJZAjkYRB/xes6SLcITaG9LYVSGSVAhtLIzkmrAvPHPIpZSOI4NQnAMEVPllwtMlWQBEeerN7PIKImyaUd9zPzP+v0S1V+kUyioizScsDdVuaNKa+yqwFKvYYy61nobv3Mg+Fo3EGqY7GOiO7AklRTreZoOkZAdogQlA1DZuIBNSbpcMvm5MoP+PsU3HFSb/Vioo+QEcgTWqVyDNuFGZpkOI2iIBuQCwLmsCwB1JaE/1cCd1fEpOWyiFep0vxwi0ZrtRZQowQd2Ua3UIoaG5u5WoYEMYoH7FFi6Djda4Rf4gxed8rPLE+cNTI/p67OKlbAfr8iz3YZknaH+CXp9pPr7V7xXBCWNxo5DnFPeeqqrxjTAbkeg/Rp2hJeN7/zi0TSWKDUTXfkuUNyewHOHb7M+MIvC1F1CtmqLuU3h8RDINYgPtZTtTk68YBmOG88xYTtClr4kKxmp1scrV3nJ7af+IGoVKZpRAwBJYT3HV33vzO9W35zl14eZ0vVuNoHMNsh9uDxjCwRyPtQzVpQuTIYnHHoO5R17XyIfe599BOSBAGimciprURN3llC2H8YhRtMilQRYvEDVsC+mVZmGAeEdQ5o/AehnpBuVKErRBzotWe6bNMkIQqWfwCLQFBb6ap1gT5hbacrJM4AlaPgOdQsyX9npd3yN/tzjVA1IqWLnoaEXq9EfWXhBuT+juMfSQ2Y8bPbpBKZmWWL06T2fVkaZJN0VFtBXGi0XRFJngPskApLunZOfBYq831jSi8/Z937QVTQKWwOz6rLE8covE3mxJ53gDVcOlvqD9s/NGXbmnt2GnlWhVKpzhTIJ812Hr050/2AI9ZmWnv+ypSqeQ3l0BFh4D+xfk5NRv+dKbxANheZnfZMhR6u8F+jX/W3hUtNCIMQc2vLSQ', 92 data: 'SOcANZTLo4dsjpsPghF2+TndV9+1uYhGjup3StEa1kiFHHzDK6kDZkKwjhP0mxFgixlQHZBnvgsW/xdHGXdmj1RHtaNdHlte7W1Wq5MHbH4XE9bJzQAvQmop8OETgGz7Khp4BbUMVLIXhxoJmP3rMx7ulQHds+WN+S5u+iB73y5nkJwfOXrXDjwwlL1vER92XHE1VJZAjkYRB/xes6SLcITaG9LYVSGSVAhtLIzkmrAvPHPIpZSOI4NQnAMEVPllwtMlWQBEeerN7PIKImyaUd9zPzP+v0S1V+kUyioizScsDdVuaNKa+yqwFKvYYy61nobv3Mg+Fo3EGqY7GOiO7AklRTreZoOkZAdogQlA1DZuIBNSbpcMvm5MoP+PsU3HFSb/Vioo+QEcgTWqVyDNuFGZpkOI2iIBuQCwLmsCwB1JaE/1cCd1fEpOWyiFep0vxwi0ZrtRZQowQd2Ua3UIoaG5u5WoYEMYoH7FFi6Djda4Rf4gxed8rPLE+cNTI/p67OKlbAfr8iz3YZknaH+CXp9pPr7V7xXBCWNxo5DnFPeeqqrxjTAbkeg/Rp2hJeN7/zi0TSWKDUTXfkuUNyewHOHb7M+MIvC1F1CtmqLuU3h8RDINYgPtZTtTk68YBmOG88xYTtClr4kKxmp1scrV3nJ7af+IGoVKZpRAwBJYT3HV33vzO9W35zl14eZ0vVuNoHMNsh9uDxjCwRyPtQzVpQuTIYnHHoO5R17XyIfe599BOSBAGimciprURN3llC2H8YhRtMilQRYvEDVsC+mVZmGAeEdQ5o/AehnpBuVKErRBzotWe6bNMkIQqWfwCLQFBb6ap1gT5hbacrJM4AlaPgOdQsyX9npd3yN/tzjVA1IqWLnoaEXq9EfWXhBuT+juMfSQ2Y8bPbpBKZmWWL06T2fVkaZJN0VFtBXGi0XRFJngPskApLunZOfBYq831jSi8/Z937QVTQKWwOz6rLE8covE3mxJ53gDVcOlvqD9s/NGXbmnt2GnlWhVKpzhTIJ812Hr050/2AI9ZmWnv+ypSqeQ3l0BFh4D+xfk5NRv+dKbxANheZnfZMhR6u8F+jX/W3hUtNCIMQc2vLSQ',
95 version: '0.3', 93 version: '0.3',
96 creationDate: 'Wed Jan 20 16:53:47 CET 2010', 94 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
97 updateDate: 'Wed Jan 20 16:54:56 CET 2010', 95 updateDate: 'Wed Jan 20 16:54:56 CET 2010',
98 accessDate: 'Wed Jan 20 16:54:56 CET 2010', 96 accessDate: 'Wed Jan 20 16:54:56 CET 2010',
99 currentVersion: 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d', 97 currentVersion: 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d',
100 versions: { 98 versions: {
101 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': { 99 '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': {
102 header: '####', 100 header: '####',
103 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv', 101 data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv',
104 version: '0.3', 102 version: '0.3',
105 creationDate: 'Wed Jan 20 16:53:47 CET 2010', 103 creationDate: 'Wed Jan 20 16:53:47 CET 2010',
106 updateDate: 'Wed Jan 20 16:53:47 CET 2010', 104 updateDate: 'Wed Jan 20 16:53:47 CET 2010',
107 accessDate: 'Wed Jan 20 16:54:26 CET 2010' 105 accessDate: 'Wed Jan 20 16:54:26 CET 2010'
108 }, 106 },
109 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d': { 107 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d': {
110 header: '####', 108 header: '####',
111 data: 'ky36e85TGmGQ+O9FXAhHRXEz5eBQogwuyAEgjpsHaSUM22TowYEw/NkWMg4oT4M2DGIYoTyXatvea859F3kMWM5hUe16PaG9J8HzQcEnaTRmi5oe0cMJAlg6pl7ypLt9kUiqDoMIM4lM/eKO8E/bRZWnU1EsxjehYjQQUoeoSyyTAOhHlLfXS99TzCXFrJjO5rAgaJ7iAjNOcQ8Bm6ECau5ao9AVd5hqgMDEmLJhRwygcGHSTek3i3I4o0jIImcqpfNko/4SbEC4p7+V5Rggr1IG5DkeYfKuyqxgulJbtdkcWxAqPReKXUOkmSGlRTje8rjTTLx1Jv7QCc0hLDYc5pLd8j/G7mOwLG1nLTMeNekljKNCTLAhQ+ccDDq35Jv1cNhmA/icmRlMkztbsR7tzqFs+drQ', 109 data: 'ky36e85TGmGQ+O9FXAhHRXEz5eBQogwuyAEgjpsHaSUM22TowYEw/NkWMg4oT4M2DGIYoTyXatvea859F3kMWM5hUe16PaG9J8HzQcEnaTRmi5oe0cMJAlg6pl7ypLt9kUiqDoMIM4lM/eKO8E/bRZWnU1EsxjehYjQQUoeoSyyTAOhHlLfXS99TzCXFrJjO5rAgaJ7iAjNOcQ8Bm6ECau5ao9AVd5hqgMDEmLJhRwygcGHSTek3i3I4o0jIImcqpfNko/4SbEC4p7+V5Rggr1IG5DkeYfKuyqxgulJbtdkcWxAqPReKXUOkmSGlRTje8rjTTLx1Jv7QCc0hLDYc5pLd8j/G7mOwLG1nLTMeNekljKNCTLAhQ+ccDDq35Jv1cNhmA/icmRlMkztbsR7tzqFs+drQ',
112 version: '0.3', 110 version: '0.3',
113 previousVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741', 111 previousVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741',
114 previousVersionKey: 'aLMGf0ucGPaKLVv+AunJaZWDg+gGncnBu2Bf7QseH3ma/jcMOZCNHNd44mNPKfZPyoXYZi6/ToxkJh6Nu8PmOL/SsHTlf8FBZxrNm1i7ZS2b3A==', 112 previousVersionKey: 'aLMGf0ucGPaKLVv+AunJaZWDg+gGncnBu2Bf7QseH3ma/jcMOZCNHNd44mNPKfZPyoXYZi6/ToxkJh6Nu8PmOL/SsHTlf8FBZxrNm1i7ZS2b3A==',
115 creationDate: 'Wed Jan 20 16:54:56 CET 2010', 113 creationDate: 'Wed Jan 20 16:54:56 CET 2010',
116 updateDate: 'Wed Jan 20 16:54:56 CET 2010', 114 updateDate: 'Wed Jan 20 16:54:56 CET 2010',
117 accessDate: 'Wed Jan 20 16:54:56 CET 2010' 115 accessDate: 'Wed Jan 20 16:54:56 CET 2010'
118 } 116 }
diff --git a/frontend/gamma/tests/tests/Components/FullApp/index.html b/frontend/gamma/tests/tests/Components/FullApp/index.html
index fab110b..f0e6be3 100644
--- a/frontend/gamma/tests/tests/Components/FullApp/index.html
+++ b/frontend/gamma/tests/tests/Components/FullApp/index.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>FullApp TEST - WEB</title> 26 <title>FullApp TEST - WEB</title>
29 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 27 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
30 28
31 29
32 <link rel="stylesheet" type="text/css" href="../../../../css/web.css" /> 30 <link rel="stylesheet" type="text/css" href="../../../../css/web.css" />
33 31
34 <link rel="shortcut icon" href="./clipperz.ico" /> 32 <link rel="shortcut icon" href="./clipperz.ico" />
35 33
36 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." /> 34 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." />
37 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" /> 35 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" />
38<script> 36<script>
39 Clipperz_IEisBroken = false; 37 Clipperz_IEisBroken = false;
40 Clipperz_normalizedNewLine = '\n'; 38 Clipperz_normalizedNewLine = '\n';
41 Clipperz_dumpUrl = "/dump/"; 39 Clipperz_dumpUrl = "/dump/";
42 Clipperz_version = ">>> hg:28fe087a9316 <<<"; 40 Clipperz_version = ">>> hg:28fe087a9316 <<<";
43</script> 41</script>
44 42
45<!--[if IE]><script> 43<!--[if IE]><script>
46Clipperz_IEisBroken = true; 44Clipperz_IEisBroken = true;
47Clipperz_normalizedNewLine = '\x0d\x0a'; 45Clipperz_normalizedNewLine = '\x0d\x0a';
48</script><![endif]--> 46</script><![endif]-->
49 47
50 48
51 <script type='text/javascript' src='../../../../js/Bookmarklet.js'></script> 49 <script type='text/javascript' src='../../../../js/Bookmarklet.js'></script>
52 <script type='text/javascript' src='../../../../js/Bookmarklet_IE.js'></script> 50 <script type='text/javascript' src='../../../../js/Bookmarklet_IE.js'></script>
53 51
54 <script type='text/javascript' src='../../../../js/MochiKit/Base.js'></script> 52 <script type='text/javascript' src='../../../../js/MochiKit/Base.js'></script>
55 <script type='text/javascript' src='../../../../js/MochiKit/Iter.js'></script> 53 <script type='text/javascript' src='../../../../js/MochiKit/Iter.js'></script>
56 <script type='text/javascript' src='../../../../js/MochiKit/Logging.js'></script> 54 <script type='text/javascript' src='../../../../js/MochiKit/Logging.js'></script>
57 <script type='text/javascript' src='../../../../js/MochiKit/Format.js'></script> 55 <script type='text/javascript' src='../../../../js/MochiKit/Format.js'></script>
58 <script type='text/javascript' src='../../../../js/MochiKit/Async.js'></script> 56 <script type='text/javascript' src='../../../../js/MochiKit/Async.js'></script>
59 <script type='text/javascript' src='../../../../js/MochiKit/DOM.js'></script> 57 <script type='text/javascript' src='../../../../js/MochiKit/DOM.js'></script>
60 <script type='text/javascript' src='../../../../js/MochiKit/Style.js'></script> 58 <script type='text/javascript' src='../../../../js/MochiKit/Style.js'></script>
61 <script type='text/javascript' src='../../../../js/MochiKit/LoggingPane.js'></script> 59 <script type='text/javascript' src='../../../../js/MochiKit/LoggingPane.js'></script>
62 <script type='text/javascript' src='../../../../js/MochiKit/Color.js'></script> 60 <script type='text/javascript' src='../../../../js/MochiKit/Color.js'></script>
63 <script type='text/javascript' src='../../../../js/MochiKit/Signal.js'></script> 61 <script type='text/javascript' src='../../../../js/MochiKit/Signal.js'></script>
64 <script type='text/javascript' src='../../../../js/MochiKit/Position.js'></script> 62 <script type='text/javascript' src='../../../../js/MochiKit/Position.js'></script>
65 <script type='text/javascript' src='../../../../js/MochiKit/Selector.js'></script> 63 <script type='text/javascript' src='../../../../js/MochiKit/Selector.js'></script>
66 <script type='text/javascript' src='../../../../js/MochiKit/Visual.js'></script> 64 <script type='text/javascript' src='../../../../js/MochiKit/Visual.js'></script>
67 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 65 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 66 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 69 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/CSVProcessor.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/CSVProcessor.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/KeePassExportProcessor.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/KeePassExportProcessor.js'></script>
75 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 73 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 75 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
88 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 86 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script> 88 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script>
91 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 90 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 91 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 92 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
95 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 93 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
96 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.JSON.js'></script> 94 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.JSON.js'></script>
97 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 95 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
98 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 96 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
99 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 97 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 98 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script> 99 <script type='text/javascript' src='../../../../js/Clipperz/PM/BookmarkletProcessor.js'></script>
102 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 100 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
103 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 101 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
104 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 102 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
105 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 103 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
106 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> 104 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
107 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> 105 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
108 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 106 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
109 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 107 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
110 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 108 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
111 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 109 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
112 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script> 110 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
113 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script> 111 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
114 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script> 112 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
115 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script> 113 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
116 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 114 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
117 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script> 115 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
118 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 116 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
diff --git a/frontend/gamma/tests/tests/Components/FullApp/mobile.index.html b/frontend/gamma/tests/tests/Components/FullApp/mobile.index.html
index 818e3d6..53fbcf6 100644
--- a/frontend/gamma/tests/tests/Components/FullApp/mobile.index.html
+++ b/frontend/gamma/tests/tests/Components/FullApp/mobile.index.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<!doctype html> 24<!doctype html>
27<!-- Conditional comment for mobile ie7 blogs.msdn.com/b/iemobile/ --> 25<!-- Conditional comment for mobile ie7 blogs.msdn.com/b/iemobile/ -->
28<!--[if IEMobile 7 ]> <html class="no-js iem7" lang="en"> <![endif]--> 26<!--[if IEMobile 7 ]> <html class="no-js iem7" lang="en"> <![endif]-->
29<!--[if (gt IEMobile 7)|!(IEMobile)]><!--> <html class="no-js" lang="en" manifest="mobile.appcache"> <!--<![endif]--> 27<!--[if (gt IEMobile 7)|!(IEMobile)]><!--> <html class="no-js" lang="en" manifest="mobile.appcache"> <!--<![endif]-->
30<head> 28<head>
31 <title>FullApp TEST - MOBILE</title> 29 <title>FullApp TEST - MOBILE</title>
32 <meta charset="utf-8"> 30 <meta charset="utf-8">
33 31
34 <meta name="HandheldFriendly" content="True"> 32 <meta name="HandheldFriendly" content="True">
35 <meta name="MobileOptimized" content="320"> 33 <meta name="MobileOptimized" content="320">
36 <meta name="viewport" content="width=device-width"> 34 <meta name="viewport" content="width=device-width">
37 35
38<!-- link rel="apple-touch-icon-precomposed" ... --> 36<!-- link rel="apple-touch-icon-precomposed" ... -->
39 <link rel="apple-touch-icon" sizes="114x114" href="data:image/png;charset=utf-8;base64,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"> 37 <link rel="apple-touch-icon" sizes="114x114" href="data:image/png;charset=utf-8;base64,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">
40 <link rel="apple-touch-icon" sizes="72x72" href="data:image/png;charset=utf-8;base64,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"> 38 <link rel="apple-touch-icon" sizes="72x72" href="data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAIAAADajyQQAAAD8GlDQ1BJQ0MgUHJvZmlsZQAAKJGNVd1v21QUP4lvXKQWP6Cxjg4Vi69VU1u5GxqtxgZJk6XpQhq5zdgqpMl1bhpT1za2021Vn/YCbwz4A4CyBx6QeEIaDMT2su0BtElTQRXVJKQ9dNpAaJP2gqpwrq9Tu13GuJGvfznndz7v0TVAx1ea45hJGWDe8l01n5GPn5iWO1YhCc9BJ/RAp6Z7TrpcLgIuxoVH1sNfIcHeNwfa6/9zdVappwMknkJsVz19HvFpgJSpO64PIN5G+fAp30Hc8TziHS4miFhheJbjLMMzHB8POFPqKGKWi6TXtSriJcT9MzH5bAzzHIK1I08t6hq6zHpRdu2aYdJYuk9Q/881bzZa8Xrx6fLmJo/iu4/VXnfH1BB/rmu5ScQvI77m+BkmfxXxvcZcJY14L0DymZp7pML5yTcW61PvIN6JuGr4halQvmjNlCa4bXJ5zj6qhpxrujeKPYMXEd+q00KR5yNAlWZzrF+Ie+uNsdC/MO4tTOZafhbroyXuR3Df08bLiHsQf+ja6gTPWVimZl7l/oUrjl8OcxDWLbNU5D6JRL2gxkDu16fGuC054OMhclsyXTOOFEL+kmMGs4i5kfNuQ62EnBuam8tzP+Q+tSqhz9SuqpZlvR1EfBiOJTSgYMMM7jpYsAEyqJCHDL4dcFFTAwNMlFDUUpQYiadhDmXteeWAw3HEmA2s15k1RmnP4RHuhBybdBOF7MfnICmSQ2SYjIBM3iRvkcMki9IRcnDTthyLz2Ld2fTzPjTQK+Mdg8y5nkZfFO+se9LQr3/09xZr+5GcaSufeAfAww60mAPx+q8u/bAr8rFCLrx7s+vqEkw8qb+p26n11Aruq6m1iJH6PbWGv1VIY25mkNE8PkaQhxfLIF7DZXx80HD/A3l2jLclYs061xNpWCfoB6WHJTjbH0mV35Q/lRXlC+W8cndbl9t2SfhU+Fb4UfhO+F74GWThknBZ+Em4InwjXIyd1ePnY/Psg3pb1TJNu15TMKWMtFt6ScpKL0ivSMXIn9QtDUlj0h7U7N48t3i8eC0GnMC91dX2sTivgloDTgUVeEGHLTizbf5Da9JLhkhh29QOs1luMcScmBXTIIt7xRFxSBxnuJWfuAd1I7jntkyd/pgKaIwVr3MgmDo2q8x6IdB5QH162mcX7ajtnHGN2bov71OU1+U0fqqoXLD0wX5ZM005UHmySz3qLtDqILDvIL+iH6jB9y2x83ok898GOPQX3lk3Itl0A+BrD6D7tUjWh3fis58BXDigN9yF8M5PJH4B8Gr79/F/XRm8m241mw/wvur4BGDj42bzn+Vmc+NL9L8GcMn8F1kAcXjEKMJAAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrlPw1BAAAPZklEQVRoge2aeXAcVX7Hv+9199ySRhrdl3XYGNvY2LLB2OCLw0ZlYwfIbrFU7QJbSyoklWQJqV0I2QuySW2ygTLU7lKV3SQUBSHcXm5zLGCDMb5k2eBLsmTJts7RaEaa6enpfu+XP+bQSNYxM8h/UOVfdbVaM/3e/D79O/r3ft3AJbkkl+SS5CBs1mdUVdVmsxFRRj/PmBDCMIzZV2PWZ7z//vvvvffezLjAGNuz57O77rpr1tWYfbDKysp58+aBDCAdjpLeQWluQmCOnp7zs64DLgaYEBIAwn4wIGW4+AFL52IgCU++FT9/tmX2wZJCIAIoaTZK7ZKfMEAiQ5fNXi4aGIkEGJBGRUmjMQCgbypY3MfSqDDBaDQ+DmdTLj4YpRstGWnxPyS/gWBSgGQyfyTZxpkLgIS8WN54EcASWV2AZMIDJwRbSohAFkkx+zpcFLAEggSJiVSp0GIAMUBCfIPA4kIiLTGmAix1W4vvJaRF9E0BIwnIiWDpVGN4EvKbYzEiCVjjwMbyPo2PsosIxqf6QlGUhx9+eNOmm202W1YzkpSJlCAFyALFIS2QlfZJ/F8LUuQAVlZa/Bd3f+e3j/2zw26f6pwpLbbg8ssfffRRxmj//oPPPvvsyy+/3N3dnREYScgkzFhhlRZsSN3cJKSZOZiiKCtXLL3jti3NN62vrS4XQj793Et797dkB7Zt2zbGGHT/imXzV6z494d+/A9vvPn2M888s/vTzyzLmpZMQiRdMY40eaQBJDK0WGVF2ZZN13/71s0rli50OzUSMTL8XM3bevOG7MA0Tdu27RYIHWAwdMhQaR77/t3f+t6dt3+xv+XZ555/bcfr53t6JudKWMxKxpgcD4a02krQtOle09RVVzXdcfuWjddfV1Pu42RARhTBmaKBqRE9tHH96l8+9lQkomcKtvTKJUsWL6RYJFn9cEgLo36VxOqmuatX/stDP/rh62++++xzz+/Zu0/K8esOmXLF8WATUz8ASdIiOYn9a6oqtjbf8Ofbbl62eL7bRmSFFXOAKxxcBQBpgXHI6Ny6ypVNV/xp975MwW7dttXu0Eg3wBhIJoo6xkAMsTD0QHWBct89t979nT/7fP/h555/+fW33unrH4iPpbgrSgkIECULQprEbheke5tNu3bl8jtu23zT+lVVpflcjDLRp5gAUwAOSWAA42AErthUkLBu2bg2UzCn07G5+SYyIozxhFpx/RI3KALjkCbC/Q6SG66q33DNzzoe+Ksdb73/vy+88sWBQ7GYQXGLQY5dlNQ84ywmSFqWGQNQV1O1tfmG27duXLqwwaXFEAsqeoBxDsZBPPGj4CAC5/EiU1XViD66YXVTQb4nGBqdQDFJM2fdmmt3vvmKyiRXtXhGTgTMuIPUZkGaYArs+SMRfLj7gMvlWrNysV0/zSAmBxvDE4ZSfLhDP3Tkq03rr6kqdnJrmFmjnMkEBmMATx6nNiVxwNVwaNgQ9u/+7SNvfbBnAoVyIdj9f3PftauWA5whXkak9EsaIX4wziAWYiEbhS5vKKuuKDWMmJ1CbJzR5JgNEXdOCRK6pfp8JdcsKilQ/KrZz6XOkPKR1FWQk+QeEABOlmkK05JvXgA20RXz8zwbb1grYoZic4EIXAWpYAJkQjAQgRGgAhxQoAhIC5JAIrEqjoXsckiVBCYTqxJMMFpqkUYAOWmImwFuCYADDAQwCWIAS5gLDOCgpLkgAQWQIAUgVdXIGr52+cISn3fAPzwd2LWrrm6sq4HqBlMQ7cFoB0InED6DyFkYfogoIMFUKE5o+bAXw1EGZyXsxVA94BokgQmFiXEWnjzSCIDKkqk/DhzPT4wB8QOeIGQKiCWdkBJ7KcFVmyLLfZ51Kxe/9Nau6cBuvaVZFSF27LcY/Byh44gOIL2LlNY4G/uEc9gK4apBwSIULIKnDooT0oSUicVLeuIZh5c+Ufw/lsADA+MJNmKIRx1JMAUsbQ/YHZoejW5ev3w6MF9R4YZ1a62uN2yHfwWedIRJwnCCSBh+RP3wt0ABnNUoaoJvJVy1AAeZyTaBHJ/9k5UxJS9QojPHxlyRsYQTTnBFkuAKQJCkqiqT+lWLG6vLfWd7/Smdxmm9eeOGu++8lZ/4tRLtgpJN/5slYgEAzBCCJzDwCUZOQdFgLwZTIM1kHkpPIakDMeariWwhJyaPSZbhBBA4JyuqcKWtq6/1+JnJwf7xgb++otahtW1nViyhaw6SGCih98G/F6ETUD2wlySSJyXTYzoV5LiNkjyUyp+pe3qKjRLmBRSIcDiiqeqr7+9LNVDGwCoryv71p3/vdLp1T5O0FTER4WYAMr2vlBNhdAhDX0DvgaMcqgeUMl2a0cZtNA57YgEd14fAQMKKRfVQMDgyEuFczS/w/vGDA6HRyEQwAuvu9RPXiioXuao3WKWb9LyrheblIsytYO6EcbxIL4YPgqtwVgISUqTdHi+w21iymZhFAUlSGFEjFIoEQ0bEwGhMPXEu8uIHRx9/+t22zm6RTHWTaFpbW7N+zaotN629aukin9dDxrAc/lIL7LGH9qrRM8mCLXvCuGLeJahshuKGjE2+lkFaYoznRsbBGBEME+EoMyyFuMMQakfv6CcH2nbubmn58mQ0Er7wek4pc+bM2bBm5eYbr1u+eH5RgVtGhyh4zBbcax/ZrxndORJKwFmG6m1wlCXYJrSx4t3vRFYESUQtHjFUQ9iIOw2hdfSN7jrYvnNXS8uXJ/ULeDICS0l9Xd31a1c2X79q2cK5hXkOGR2i0HF7aJ8jfEiLnR3L1xkKAaoHVVvgrhtvt/g8BMR5lHDMZggHKa6YtHX2hXcdat+5q6Xl6KlIZGLJmyNYShoa6m9Ys/Lm9VdfuaDO67JJYwihE/bRA85Iq2b2Ahk/ECJAsaOiGZ6GJBtARCSjljoasxvSCcVjSNuZ/vDuQ6d37j586OjJSHhmnhzBUqMaG+tvXHv1xjXLl1xWY1ekjI24w3t9g08zZNyZIUCxoeJmuGpBJkBGTPaES2LSAdV1zq/vaul479PWg60nsuIZUzGHMWmj+dyG+id+8v3FjcVFvb9xRVqzm48AxYHKZthLQCaR7B0pCFq+R/7w8WvvfaFn4G/TyJTtt8w0kw0V7sYqb57/1aypADBARNH3AcwASDCIUteghwc2LPFJc5I2RlYycyE4jTTWlj31i78s58cKAy8yltNDEwYIA+YwXNUgwbmwIVxWUq1ptt0tnV9Ht9zBnA7bkz+5Z3EN9w38XpHR3J2aAeYIGOAohrRUxYSINM6p7+4Lnujyzzx8Cskd7MEfbL5twxXegf+2W71f93URBhh+2IvA7SDh0KLCkovm1u850j04nKNP5gi2Zd2SB3+wOT/4Rn60ZXZegiGCNQJnaXyN49TCgOOy2vKd+zqNWC7N/VzA5taWbH/ozlJ85Qu/k3loCdj4NDcDBlg6VBtUF8jiTNh52OUsLMxzfnToXA7hmzWY22nb/uNvL6qSpaEXFGT6qpAJdydvdlG/imldS4ThKIz3eTTVZEKvKC0LRWKtpwPZ6pk12IP33LB1zVxf6EWHHMx81DmsHuX1unR7WSebqkBhgLCgKFDt8XW30x6NGWJ+bXnr6aHz/uyCLTuwW9YueOC7673h9wvE8cxHBajunFx2rEcW5nmkMPN4/5SnMkAasLsBCzBBwmMPGzF1YW3xR4f7R6NZBFsWYJfVFv/HD28p5SdKzV2Z54sYuXuVNe8cCv3oiZ0rFjd487x28jv4lFU5pAWFQwEoBjI5M12qDririx0fHh4SMtNwyxTM7bQ9fn/zwgqzwnhbgZnhKICdFU0doeIHf/fxoD9w9Exw0zVzTWEvVHsUNsXlJwAmNAHoIB1kaFqEU7TAXcgg953KtM7KFOzB761uXllVFn3HgeGZz07KoFUziEX/9sKxfUc6AQwFgkHTft0V5dEYFWlThCgDpIBmADHABGKgmMsxahiyrtR7pt/o6Itl8tMZgW1dM/fvvrW82PzMi84MkQBEpeucWPbeEf3J/9tPiWYbjnX0V1dX1Zc6mYx4tKkdMt78S+sJ5Dkjo2G2oMr2+cloIDyzQ84MNr+28Ff3rS3XTpfjYIZIAAisS1/QNVL00H/uD46kAZBsOeW/rqleZZSvhWzKFA9H4/3MtEYb5/DYo4ZhNpbKD4+SOVMemQGsKN/x6/tWNZbyGuxS2LRPaMer1R+tGBR1j+3o3nuka8KX0Wi0rZ9ubCrRddPnHOFT3eLjqqWMJqHZSVjCwajIjc/bMH0emWHZUlNVXl9fZwrZaVxhkCtDKt109hmVHx+L7Pj45KSnHDza/oePwjq5u4Y9k1dk8bZVshMXN93AALp6wKDNn9focjmm12IGi/UNDu/+Knj5ZY3F+a6BSL6dR51qZPohBNYeqj4fKXj4f04GQlNG0dH2wOXzqnyOIYdiumyTXfzUNWeQEm1nWVs3FK1gZ0f9L57vHw7OkB5njrFBf+CdzzudhVULawuGIg5T8nxtZMoSkeH8aKE/VvzE26E9rWenmVZK68gZa/0yr9ADPjfUCxVJNuDCOo62YzCAmK36N7t9v/tje1SfOutkDgbANGOfHmzrDLmaFlSQwJDuyNMi2oVxzzBq2LpCRZ+etm1/pZ3kDL2dkdFIb9h33XyuR/SS/AtckgMcvYM40gZL2E4bc3/2qvnJgdPI7N2rLCqP9jM9H3852tDQUFFAvUFF5ZbHNu6WIsFODrr6Iu5/es4fCM58UQF0ng8VlNQ1FoQYiQJPWhrksAROdqOtG4rN+/aZukdeOH+uZyBzbbOrFYOh0M5958hVs7jOMRzS9RgrcJg8HgwMXQHmjypP/Un7tHXqanCiUGuH3rRwjt30e12w2xJUoTAOn4J/GIa95snPvP/1VnvMmCG2J0jW1b0U5v4vu44P5l85v1QVff1By20nhw0hHZ1+tre7ePsOv8zm9SjLjB3vt61b6I0EQxU+cAVn+3GkHZLsp2Lzfr7D2HO4M4uOZVJyXEF3nx/88IhZOWderVfvHdQJOB/AQNT78xeFfzgjJ0yXoeGRsFK+vMqK6sbAMNrPQXEWvdE555cvnevtz2JxlC659zwikfAHB/xh27wr69wjgYAg7fefeT85nKMeJ7tDNXPqy9WhkTBF7HO278575t02M5Z7E+5rtd9A4uip3pbeoqUL6joGlcd3DMjJ3h/KbCrZ2m2uaarrMXw/fS2y7+iZHNxv9sVbWFhWUvT156muLPN48r7+PJfkklySiy7/D8RU38I8pVv5AAAAAElFTkSuQmCCCg==">
41 <link rel="apple-touch-icon" href="data:image/png;charset=utf-8;base64,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"> 39 <link rel="apple-touch-icon" href="data:image/png;charset=utf-8;base64,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">
42 <link rel="shortcut icon" href="data:image/png;charset=utf-8;base64,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"> 40 <link rel="shortcut icon" href="data:image/png;charset=utf-8;base64,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">
43 41
44 <meta http-equiv="cleartype" content="on"> 42 <meta http-equiv="cleartype" content="on">
45 <meta name="apple-mobile-web-app-capable" content="yes"> 43 <meta name="apple-mobile-web-app-capable" content="yes">
46 44
47 <link rel="stylesheet" type="text/css" href="../../../../css/mobile.css" /> 45 <link rel="stylesheet" type="text/css" href="../../../../css/mobile.css" />
48 <!-- link rel="stylesheet" type="text/css" href="../../../../css/jqtouch.css" / --> 46 <!-- link rel="stylesheet" type="text/css" href="../../../../css/jqtouch.css" / -->
49 <!-- link rel="apple-touch-startup-image" href="data:image/png;charset=utf-8;base64,iVBORw0K...ggo=" --> 47 <!-- link rel="apple-touch-startup-image" href="data:image/png;charset=utf-8;base64,iVBORw0K...ggo=" -->
50 48
51<script> 49<script>
52 Clipperz_IEisBroken = false; 50 Clipperz_IEisBroken = false;
53 Clipperz_normalizedNewLine = '\n'; 51 Clipperz_normalizedNewLine = '\n';
54 Clipperz_dumpUrl = "/dump/"; 52 Clipperz_dumpUrl = "/dump/";
55 'use strict'; 53 'use strict';
56 54
57 if (typeof(MochiKit) == 'undefined') { 55 if (typeof(MochiKit) == 'undefined') {
58 MochiKit = {}; 56 MochiKit = {};
59 } 57 }
60 MochiKit['__export__'] = false; 58 MochiKit['__export__'] = false;
61</script> 59</script>
62 <!-- Zepto.js modules: polyfill zepto event detect fx ajax form apple-touch-icon--> 60 <!-- Zepto.js modules: polyfill zepto event detect fx ajax form apple-touch-icon-->
63 <script type='text/javascript' src='../../../../js/Zepto/polyfill.js'></script> 61 <script type='text/javascript' src='../../../../js/Zepto/polyfill.js'></script>
64 <script type='text/javascript' src='../../../../js/Zepto/zepto.js'></script> 62 <script type='text/javascript' src='../../../../js/Zepto/zepto.js'></script>
65 <script type='text/javascript' src='../../../../js/Zepto/event.js'></script> 63 <script type='text/javascript' src='../../../../js/Zepto/event.js'></script>
66 <script type='text/javascript' src='../../../../js/Zepto/detect.js'></script> 64 <script type='text/javascript' src='../../../../js/Zepto/detect.js'></script>
67 <script type='text/javascript' src='../../../../js/Zepto/fx.js'></script> 65 <script type='text/javascript' src='../../../../js/Zepto/fx.js'></script>
68 <script type='text/javascript' src='../../../../js/Zepto/ajax.js'></script> 66 <script type='text/javascript' src='../../../../js/Zepto/ajax.js'></script>
69 <script type='text/javascript' src='../../../../js/Zepto/form.js'></script> 67 <script type='text/javascript' src='../../../../js/Zepto/form.js'></script>
70 <script type='text/javascript' src='../../../../js/Zepto/touch.js'></script> 68 <script type='text/javascript' src='../../../../js/Zepto/touch.js'></script>
71 <script type='text/javascript' src='../../../../js/Zepto/gesture.js'></script> 69 <script type='text/javascript' src='../../../../js/Zepto/gesture.js'></script>
72 70
73 <script type='text/javascript' src='../../../../js/JQTouch/jqtouch.js'></script> 71 <script type='text/javascript' src='../../../../js/JQTouch/jqtouch.js'></script>
74 72
75 <script type='text/javascript' src='../../../../js/MochiKit/Base.js'></script> 73 <script type='text/javascript' src='../../../../js/MochiKit/Base.js'></script>
76 <script type='text/javascript' src='../../../../js/MochiKit/Iter.js'></script> 74 <script type='text/javascript' src='../../../../js/MochiKit/Iter.js'></script>
77 <script type='text/javascript' src='../../../../js/MochiKit/Logging.js'></script> 75 <script type='text/javascript' src='../../../../js/MochiKit/Logging.js'></script>
78 <script type='text/javascript' src='../../../../js/MochiKit/Format.js'></script> 76 <script type='text/javascript' src='../../../../js/MochiKit/Format.js'></script>
79 <script type='text/javascript' src='../../../../js/MochiKit/Async.js'></script> 77 <script type='text/javascript' src='../../../../js/MochiKit/Async.js'></script>
80 <script type='text/javascript' src='../../../../js/MochiKit/DOM.js'></script> 78 <script type='text/javascript' src='../../../../js/MochiKit/DOM.js'></script>
81 <script type='text/javascript' src='../../../../js/MochiKit/Style.js'></script> 79 <script type='text/javascript' src='../../../../js/MochiKit/Style.js'></script>
82 <script type='text/javascript' src='../../../../js/MochiKit/LoggingPane.js'></script> 80 <script type='text/javascript' src='../../../../js/MochiKit/LoggingPane.js'></script>
83 <!-- script type='text/javascript' src='../../../../js/MochiKit/Color.js'></script --> 81 <!-- script type='text/javascript' src='../../../../js/MochiKit/Color.js'></script -->
84 <script type='text/javascript' src='../../../../js/MochiKit/Signal.js'></script> 82 <script type='text/javascript' src='../../../../js/MochiKit/Signal.js'></script>
85 <!-- script type='text/javascript' src='../../../../js/MochiKit/Position.js'></script --> 83 <!-- script type='text/javascript' src='../../../../js/MochiKit/Position.js'></script -->
86 <script type='text/javascript' src='../../../../js/MochiKit/Selector.js'></script> 84 <script type='text/javascript' src='../../../../js/MochiKit/Selector.js'></script>
87 <!-- script type='text/javascript' src='../../../../js/MochiKit/Visual.js'></script --> 85 <!-- script type='text/javascript' src='../../../../js/MochiKit/Visual.js'></script -->
88 86
89 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 87 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
90 88
91 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
92 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 90 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
93 91
94 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 92 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
95 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 93 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
96 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 94 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
97 <!-- script type='text/javascript' src='../../../../js/Clipperz/CSVProcessor.js'></script --> 95 <!-- script type='text/javascript' src='../../../../js/Clipperz/CSVProcessor.js'></script -->
98 <!-- script type='text/javascript' src='../../../../js/Clipperz/KeePassExportProcessor.js'></script --> 96 <!-- script type='text/javascript' src='../../../../js/Clipperz/KeePassExportProcessor.js'></script -->
99 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 97 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 98 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 99 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
102 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 100 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
103 <!-- script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script --> 101 <!-- script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script -->
104 <!-- script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script --> 102 <!-- script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script -->
105 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 103 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
106 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 104 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
107 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 105 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
108 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 106 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
109 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 107 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
110 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 108 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
111 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 109 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
112 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 110 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
113 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script> 111 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/RSA.js'></script>
114 112
115 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script> 113 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script>
116 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 114 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
117 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 115 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
118 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 116 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js b/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js
index 15244b6..fcb8c1e 100644
--- a/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js
+++ b/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js
@@ -1,116 +1,114 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.Tests.GridLayout'); 24Clipperz.Base.module('Clipperz.Tests.GridLayout');
27 25
28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
29Clipperz.PM.Strings.Languages.initSetup(); 27Clipperz.PM.Strings.Languages.initSetup();
30 28
31Clipperz.Tests.GridLayout.Tester = function(args) { 29Clipperz.Tests.GridLayout.Tester = function(args) {
32 args = args || {}; 30 args = args || {};
33 31
34 Clipperz.Tests.GridLayout.Tester.superclass.constructor.call(this, args); 32 Clipperz.Tests.GridLayout.Tester.superclass.constructor.call(this, args);
35 //#this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 33 //#this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
36 this._user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); 34 this._user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}});
37 35
38 return this; 36 return this;
39}; 37};
40 38
41Clipperz.Base.extend(Clipperz.Tests.GridLayout.Tester, Object, { 39Clipperz.Base.extend(Clipperz.Tests.GridLayout.Tester, Object, {
42 40
43 'toString': function() { 41 'toString': function() {
44 return "Clipperz.Tests.GridLayout.Tester"; 42 return "Clipperz.Tests.GridLayout.Tester";
45 }, 43 },
46 44
47 //------------------------------------------------------------------------- 45 //-------------------------------------------------------------------------
48 46
49 'user': function () { 47 'user': function () {
50 return this._user; 48 return this._user;
51 }, 49 },
52 50
53 //------------------------------------------------------------------------- 51 //-------------------------------------------------------------------------
54 52
55 'run': function () { 53 'run': function () {
56 var deferredResult; 54 var deferredResult;
57 var proxy; 55 var proxy;
58 varcardDialogController; 56 varcardDialogController;
59 varcardDialogComponent; 57 varcardDialogComponent;
60 varcomponent; 58 varcomponent;
61 varfilterController; 59 varfilterController;
62 var cardsController; 60 var cardsController;
63 61
64 filterController = new Clipperz.PM.UI.Web.Controllers.FilterController(); 62 filterController = new Clipperz.PM.UI.Web.Controllers.FilterController();
65 cardsController = new Clipperz.PM.UI.Web.Controllers.CardsController({'filterController':filterController}); 63 cardsController = new Clipperz.PM.UI.Web.Controllers.CardsController({'filterController':filterController});
66 64
67 component = new Clipperz.Tests.GridLayout.TestPageComponent({element:MochiKit.DOM.getElement('component')}); 65 component = new Clipperz.Tests.GridLayout.TestPageComponent({element:MochiKit.DOM.getElement('component')});
68 66
69 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 67 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
70 68
71 deferredResult = new Clipperz.Async.Deferred("GridLayout_test.init", {trace:false}); 69 deferredResult = new Clipperz.Async.Deferred("GridLayout_test.init", {trace:false});
72 //# deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); 70 //# deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
73 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); 71 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
74 deferredResult.addMethod(this.user(), 'login'); 72 deferredResult.addMethod(this.user(), 'login');
75 73
76 deferredResult.addMethod(cardsController,'run', {slot:component.slotNamed('cardList'), user:this.user()}); 74 deferredResult.addMethod(cardsController,'run', {slot:component.slotNamed('cardList'), user:this.user()});
77 // deferredResult.addMethod(xxxxController,'run', {slot:component.slotNamed('cardGrid'), user:this.user()}); 75 // deferredResult.addMethod(xxxxController,'run', {slot:component.slotNamed('cardGrid'), user:this.user()});
78 76
79 deferredResult.callback(); 77 deferredResult.callback();
80 78
81 return deferredResult; 79 return deferredResult;
82 }, 80 },
83 81
84 //========================================================================= 82 //=========================================================================
85 83
86 'saveChanges': function () { 84 'saveChanges': function () {
87 return this.user().saveChanges(); 85 return this.user().saveChanges();
88 }, 86 },
89 87
90 //------------------------------------------------------------------------- 88 //-------------------------------------------------------------------------
91 89
92 'hasPendingChanges': function () { 90 'hasPendingChanges': function () {
93 return this.user().hasPendingChanges(); 91 return this.user().hasPendingChanges();
94 }, 92 },
95 93
96 //------------------------------------------------------------------------- 94 //-------------------------------------------------------------------------
97 95
98 'revertChanges': function () { 96 'revertChanges': function () {
99 return this.user().revertChanges(); 97 return this.user().revertChanges();
100 }, 98 },
101 99
102 //========================================================================= 100 //=========================================================================
103 __syntaxFix__: "syntax fix" 101 __syntaxFix__: "syntax fix"
104}); 102});
105 103
106 104
107 105
108 106
109init = function () { 107init = function () {
110 vartester; 108 vartester;
111 109
112 tester = new Clipperz.Tests.GridLayout.Tester(); 110 tester = new Clipperz.Tests.GridLayout.Tester();
113 tester.run(); 111 tester.run();
114}; 112};
115 113
116MochiKit.DOM.addLoadEvent(init); 114MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js b/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js
index a066001..f9bb5da 100644
--- a/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js
+++ b/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js
@@ -1,99 +1,97 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.Tests.GridLayout'); 24Clipperz.Base.module('Clipperz.Tests.GridLayout');
27 25
28Clipperz.Tests.GridLayout.TestPageComponent = function(args) { 26Clipperz.Tests.GridLayout.TestPageComponent = function(args) {
29 args = args || {}; 27 args = args || {};
30 Clipperz.Tests.GridLayout.TestPageComponent.superclass.constructor.call(this, args); 28 Clipperz.Tests.GridLayout.TestPageComponent.superclass.constructor.call(this, args);
31 29
32 this._element = args.element || null; 30 this._element = args.element || null;
33 31
34 this._slots = { 32 this._slots = {
35 'cardList' : this.getId('cardList'), 33 'cardList' : this.getId('cardList'),
36 'cardGrid' : this.getId('cardGrid') 34 'cardGrid' : this.getId('cardGrid')
37 }; 35 };
38 36
39 this.render(); 37 this.render();
40 38
41 39
42 return this; 40 return this;
43} 41}
44 42
45//============================================================================= 43//=============================================================================
46 44
47Clipperz.Base.extend(Clipperz.Tests.GridLayout.TestPageComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { 45Clipperz.Base.extend(Clipperz.Tests.GridLayout.TestPageComponent, Clipperz.PM.UI.Common.Components.BaseComponent, {
48 46
49 //------------------------------------------------------------------------- 47 //-------------------------------------------------------------------------
50 48
51 'toString': function () { 49 'toString': function () {
52 return "Clipperz.Tests.GridLayout.TestPageComponent component"; 50 return "Clipperz.Tests.GridLayout.TestPageComponent component";
53 }, 51 },
54 52
55 //------------------------------------------------------------------------- 53 //-------------------------------------------------------------------------
56 54
57 'renderSelf': function(/*aContainer, aPosition*/) { 55 'renderSelf': function(/*aContainer, aPosition*/) {
58 this.append(this.element(), [ 56 this.append(this.element(), [
59 {tag:'ul', cls:'testTabs', style:'', children:[ 57 {tag:'ul', cls:'testTabs', style:'', children:[
60 {tag:'li', id:this.getId('list'), children:[{tag:'span', html:'list'}]}, 58 {tag:'li', id:this.getId('list'), children:[{tag:'span', html:'list'}]},
61 {tag:'li', id:this.getId('grid'), children:[{tag:'span', html:'grid'}]} 59 {tag:'li', id:this.getId('grid'), children:[{tag:'span', html:'grid'}]}
62 ]}, 60 ]},
63 {tag:'ul', cls:'testPanels', children:[ 61 {tag:'ul', cls:'testPanels', children:[
64 {tag:'li', id:this.getId('listPanel'), children:[ 62 {tag:'li', id:this.getId('listPanel'), children:[
65 {tag:'div', /*id:this.getId('mainPanels'),*/ cls:'mainPanels', children:[ 63 {tag:'div', /*id:this.getId('mainPanels'),*/ cls:'mainPanels', children:[
66 {tag:'div', id:this.getId('cardList'), cls:'gridComponent cardGrid'} 64 {tag:'div', id:this.getId('cardList'), cls:'gridComponent cardGrid'}
67 ]} 65 ]}
68 ]}, 66 ]},
69 {tag:'li', id:this.getId('gridPanel'), children:[ 67 {tag:'li', id:this.getId('gridPanel'), children:[
70 {tag:'div', /*id:this.getId('mainPanels'),*/ cls:'mainPanels', children:[ 68 {tag:'div', /*id:this.getId('mainPanels'),*/ cls:'mainPanels', children:[
71 // {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'} 69 // {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'}
72 {tag:'h1', html:"Ciao"} 70 {tag:'h1', html:"Ciao"}
73 ]} 71 ]}
74 ]} 72 ]}
75 ]} 73 ]}
76 ]); 74 ]);
77 75
78 // this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'}); 76 // this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'});
79 // this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'}); 77 // this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'});
80 78
81 new Clipperz.PM.UI.Common.Controllers.TabPanelController({ 79 new Clipperz.PM.UI.Common.Controllers.TabPanelController({
82 component:this, 80 component:this,
83 configuration: { 81 configuration: {
84 'LIST': { 82 'LIST': {
85 tab:'list', 83 tab:'list',
86 panel:'listPanel' 84 panel:'listPanel'
87 }, 85 },
88 'GRID': { 86 'GRID': {
89 tab:'grid', 87 tab:'grid',
90 panel:'gridPanel' 88 panel:'gridPanel'
91 } 89 }
92 } 90 }
93 }); 91 });
94 }, 92 },
95 93
96 //------------------------------------------------------------------------- 94 //-------------------------------------------------------------------------
97 95
98 __syntaxFix__: "syntax fix" 96 __syntaxFix__: "syntax fix"
99}); 97});
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/User.data.js b/frontend/gamma/tests/tests/Components/GridLayout/User.data.js
index 142e511..3cee32d 100644
--- a/frontend/gamma/tests/tests/Components/GridLayout/User.data.js
+++ b/frontend/gamma/tests/tests/Components/GridLayout/User.data.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26testData = { 24testData = {
27 25
28 //------------------------------------------------------------------------- 26 //-------------------------------------------------------------------------
29 27
30 'simpleLogin_001': { 28 'simpleLogin_001': {
31 'users': [ 29 'users': [
32 { 30 {
33 'username': "joe", 31 'username': "joe",
34 'passphrase': "eoj", 32 'passphrase': "eoj",
35 'version': "0.2", 33 'version': "0.2",
36 'connectionVersion':"0.2", 34 'connectionVersion':"0.2",
37 'records':{ 35 'records':{
38 'record 1': { 36 'record 1': {
39 'notes':"Some notes here", 37 'notes':"Some notes here",
40 'fields':[ 38 'fields':[
41 { 'name': "username", 'value': "joe", 'type': "text" }, 39 { 'name': "username", 'value': "joe", 'type': "text" },
42 { 'name': "password", 'value': "1234", 'type': "password"} 40 { 'name': "password", 'value': "1234", 'type': "password"}
43 ], 41 ],
44 'directLogins':{ 42 'directLogins':{
45 "record 1 direct login": { 43 "record 1 direct login": {
46 'configuration':"", 44 'configuration':"",
47 'bindings':[ 45 'bindings':[
48 ], 46 ],
49 'favicon':"http://www.example.com/favicon.ico" 47 'favicon':"http://www.example.com/favicon.ico"
50 } 48 }
51 } 49 }
52 } 50 }
53 }, 51 },
54 'otp':[ 52 'otp':[
55 "12345678 90abcdef 12345678 90abcdef", 53 "12345678 90abcdef 12345678 90abcdef",
56 "fedcba09 87654321 fedcba09 87654321" 54 "fedcba09 87654321 fedcba09 87654321"
57 ] 55 ]
58 } 56 }
59 ] 57 ]
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'joe_clipperz_offline_copy_data': { 62 'joe_clipperz_offline_copy_data': {
65 users:{ 63 users:{
66 'catchAllUser': { 64 'catchAllUser': {
67 __masterkey_test_value__: 'masterkey', 65 __masterkey_test_value__: 'masterkey',
68 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 66 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
69 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 67 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
70 }, 68 },
71 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 69 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
72 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 70 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
73 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 71 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
74 version: '0.2', 72 version: '0.2',
75 maxNumberOfRecords: '100', 73 maxNumberOfRecords: '100',
76 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}', 74 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"jufmL1KVY0YBl8MSaL413hGtw12I/+sFnumcfeVku9RRMBmXaXCfE/vYnraxZyPxJxVS3qFRWDKsSGR3pScdACSwlBD+mzjifRn2SCfXWutD1/oJiqiMvq3YFzwyZJiXx+oS5u8DOTieQT9HZYt0pUmAod9QHiq2NAkueVjvRkZI1saRlWGtNXCaJIHwpuFJpHBDSD//6D9DYeTdVUeFEbej+4oNYpBCkyE1G2OL6q50YRBYp9yARRiy9juKHRWFvZiSeMGEJQS0f2gaP+xZkb9Z4qrfDgAZ1F7oDbPksr2SOYlSsm0bqa6c+7Wtopdo63Urf7Ze3Wg9n8TGBk6H88boseR8e3sHudlmtO1oLxcB9p3z/NTceF6SvWyJWTxHeMe6O72dZVmSnZlXhD/IJamRt13HLk3g05d8oXfrXM3iMhIGQ+EsXMxZfKdXlZpyYtjWD5tcQTKz7M5Qo3SFmdkwDu4jH5ke+bD8CeluDcMaHF6KHfdV8nEsmsjGwrH6lqSCT/9kBO5ETqUJKloOhJpFpNS/EN7nxjXF/QbqnUmWV4wngdyYmk9goNZNfZv7C2ouiyys55/QEfGsIsvEPPSfO670oJuncTyfFngFj2tdh2JpJ5vytuoRNLOm7XPM3hDCvZCOpUnjbm+jt4AvdOGU7ID8a2mtZFjb2noP5emAxTg6MO6f3+44eTkUcbCDskO5fe6jd0pTdODk21Ilp7WUjFwxEdJG8tRrGYpLooProJExamL7WShm/S/nhJL4+euW+1UIDjcZJA+a7aGdMSC63qBvrEsNyf57SDBk/o2eNJHs2sndCzgvK42IKGKcipq9D1Gyos9JQsA3My9ARMt68V/5FfzOkgPO6mblOsQMoTyQj/OCLzITEBfqA5IufhljSEkD3CLkfkeVwVf1NB2SsTPXJFChnynfsK7cMFy0O2XBNByCRTQDqBDBYo673tI1KTGnT4gLSAwCt96lq8UkEdt51jjkAJcvBXkbswuw3hvhtzLJ302hkN9CIHJrEN0oss5mWlxIxYrCyqE3ABME3FCR9r+V7exuIaQn6mdJTkMcRbYmVQQkexsROh2cdx8I/tuMN4ECWEAL948k9vEPZfgaQirWnrTtHoxLzNAUBDSQfzYXd8yr0T4vAHLnXaUalWPgLamJJ3eR+LDFcDQVvFkaomsF3RpOIS5fswTBFuRKGKEBSIINc9AyC4DtkSmDMTF2S0TgpnGdK94ZS8C/PM8WEsX738echa5qZG5qG0f+koOUUrbaORcDqaktCuDmsgFTYiUv1JxFskTvS/t/EM2Y0MEKVLZBsoG+4WXz4XEE0VJFoI9glaYll96WH/iMbaVXRnDwjyE62CAk/8DXIf//MJQVyO6ElFsvCrDfH03yLpCJhqwHv+mD5sRctVaq6Cp5Ts3bzdFeiLCX9rhSaqdG5AuMk4dCInlywxrsOvBfNaDBjX7NGCULri6px2T53FNiH6ineVjr9TfgY2uoMyevLiQsGd3GHS4wnxiUfIyz7/Yav5an4o82cHhMVOLvfKwF8C2dJQDg9woJ3ju1ha66UA2XGScJVd93w3OWco78+giXBE96R3CebxgaWQ5Zif6nI+FJnw6OipaRgd7EyrLrQTWadvTiYLfDknlsxFZd4XVs33/3xxF3RyoVsIFO7cpEX/BLVB69v+1TJvLdiyGwSl5FUKbrcrXycZ67uTKtHyAI/vrzwwoQxYV8e32xW86blEjH4pq/Zrijm1wGw7IrD9fYVgEO7nnWpE/ac85LrDaJpGOdZ+slcVWM6THHR9boKJGLtuc8V81gDVNtZ/f4Hx5YXZWKIIfpe57BybWejdQ8ZACWK+mXOGczyXJ88B4nIvaKnRlhSszQryAZzSqJry2k3t1v73BzL48TZWJ6yu1rFmqAUk2V5DCA4XnyHfPuiG8hZfTuu1YXQ+iBgbyDipTwozQqyTv3SxLBPTFxKZLuabMn7ZTo/kLXGfVO/2va58bv6kzW6WjwZ0D481N1Nyd1kZUw1lyxXklcAzZqaHUiIsy+/5DgV/qULYFqEBMNMA7QvBfRN4VZRlnNiemgzkBQXj+JGJOWZMz5cvss291rj1fAe91s10nkZoaddDrvfgfjTq6n9XLSyGSmnrIDMLVc9+YuDtuaQ4gwuiLG2X57Jzrc/Xy7jdZ82G1j+cfT/8Pvb40i1K9aid0Z3xl/tm7jBAqQ91Ehkbo6c8jUVPaQsRcfTumtsNf+Xa5PJmQtEGEPCUlGN6F7eFB5eOLXQFdsLRL1x+SzhS7k3aDri9sTMwYQij26AexwwzAPqcOOkkfbYf0lov5Gxx0LhsZAetDZCRFlxjDRDS8jE8dKBBXkWFazF8K2rdQXKNlclwezCEDBwUWhoJs/H5ndJ38MpSPfKo1YsVvlxi4QFyOTDPJIstCCvYnCjj1r7SrkRrbcuevITRTxD4FKgPCdsYFlGfhS1zWb23DWYWo6fPQ1/zlnN01gZStxsZKepB3NnxbTSjBgTSmzG6RzZajv6BtqivtvOa1hI2KZQtVGCDU2+NGmfbJ5TTJehYiTEPeBF9TfLRP9rktQTUngj2ohv+1TDL0jL3YWiSA9TJzYonsincEVy1aRUeGVazWF2Rrq2o4hCBp12BfuMGHOdVkg9rMXdusyl2y75YyEkcBNMz4zi8i1lVhjUg16rCR48uKJ9QO2KBbjoGTx13uxIXTR8ufXx6mW7iW3qVx+6k7BQGKlMo1G64O8HQ2UrboS/tCqlP0W+7XB2C3EaZMqfKeYcuzM4MLkM6CT2GKYmJPyevXLKE749BM8zRQUcrWieAxmyD+g0QQ4T1fl0RTNEFB1/0BIg3fQQHCLGUTahXwt0EluG9iNPVgmFwwBHybH6gmIEZ4xnD8I7QPwgYY3JF407NdLkHjOuXrP+GODGEvX49MMaUigUUO2fkdw9EJbaidhx6j1EsFpQrz4Lt/5sAu5c9B/365TXtnNnmaPkaFj1q+3ezVXUroimRqxZ9BMaTm7J1hjubO+Dxjb2QlR/UApvQ0ty8aZpmIrMi0xjfoodIMiH6IYdw3VRZSqup7irWWpnJhef2qqtcpoxdiYZaFyf5u2XpZqEnAJpTupqOg+qJN/7aQt6ZmP7POFPwUwzwAsfTYk2EwMlTVAXrawZZEYu2JZ4kIjazo1LgyuuWTieEuONnye8Hr9p70RjwWUdlErlPSCKKn6JRdsM2no13F3151cfgx8I02J9vDuiNa3vfJfmRnBOly5jq6Wlnm2rJN6YYQHwbikoq3lJvkX5ZANDRKFlMWKK42+fXLBuofAZShFt6xvlY384aYsv3EcR42GOLrgYPQy0a7lr/FS4mM2ErNwNYnCz/xTuPBjgXXplbAnyA3jpKdPN1EfUM1oA4kZjECmkXZOuyEQxrndS9eOGbPM6S131zpdWEw9dWSZdkSI34+OkLfAKf6W6z4G4Z+cMRrkYLHs+BavJOum4XTjyyXHIKhQiqz9mgEf+ulodXi+LNsbq1eCcGPWrGg+GNwN1SjJHZm78gidyrlEF6xuPCaZRvGQtk59nuJULOZWkC3Ns/EcFiAql8cu37Lp842fsHHeCVOq0e8ZII4TPg9HKPwDD4HLSg4frBzyeZwK0nN30C5ATCxWdL4Q60cKtZyIEM7Kn1a/vifsAbe019Ui3ovTOCYiTCAdOLaAL/NdpgWA/fDNOsTlPvnEYkq+4+bV3Wyye9ddxICD4TnC2yvXvjw4C/WnYYceJy5R4KamIJueEGIHGp22/0DSF3H4ji3QoUDiFB/H+CA8A2q9LO9q0NYcf2P5q2MfdJGu4bd49g68mltj35pRnGQaafflXY9VmMfrlAbBYfUnsKOb3DOUpq8asveE41/6WkGcXFIuSABcbBf0cHIfBn41wRWQhoCm/JL8pfqEZC/paBdFBRW4FjKkxhbg4BPvBL0aQyGGkU8eH8tr8nm4YN1HMFF/s3s8+9FPoBxPuXLoGSg7Rvdz+g=="},"version":"0.1"}',
77 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', 75 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
78 userDetailsVersion: '0.3', 76 userDetailsVersion: '0.3',
79 records: { 77 records: {
80 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 78 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
81 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx', 79 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
82 version: '0.2', 80 version: '0.2',
83 creationDate: 'Wed Mar 14 15:46:44 PDT 2007', 81 creationDate: 'Wed Mar 14 15:46:44 PDT 2007',
84 updateDate: 'Wed Mar 14 15:46:44 PDT 2007', 82 updateDate: 'Wed Mar 14 15:46:44 PDT 2007',
85 accessDate: 'Mon Jan 19 16:10:04 PDT 2009', 83 accessDate: 'Mon Jan 19 16:10:04 PDT 2009',
86 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 84 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
87 versions: { 85 versions: {
88 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 86 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
89 header: '####', 87 header: '####',
90 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 88 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
91 version: '0.2', 89 version: '0.2',
92 creationDate: 'Wed Mar 14 15:46:44 PDT 2007', 90 creationDate: 'Wed Mar 14 15:46:44 PDT 2007',
93 updateDate: 'Wed Mar 14 15:46:44 PDT 2007', 91 updateDate: 'Wed Mar 14 15:46:44 PDT 2007',
94 accessDate: 'Mon Jan 19 16:10:04 PDT 2009' 92 accessDate: 'Mon Jan 19 16:10:04 PDT 2009'
95 } 93 }
96 } 94 }
97 }, 95 },
98 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 96 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
99 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL', 97 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
100 version: '0.3', 98 version: '0.3',
101 creationDate: 'Fri Oct 17 16:49:20 PDT 2008', 99 creationDate: 'Fri Oct 17 16:49:20 PDT 2008',
102 updateDate: 'Mon Oct 27 08:58:49 PDT 2008', 100 updateDate: 'Mon Oct 27 08:58:49 PDT 2008',
103 accessDate: 'Mon Jan 19 16:09:39 PDT 2009', 101 accessDate: 'Mon Jan 19 16:09:39 PDT 2009',
104 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 102 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
105 versions: { 103 versions: {
106 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 104 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
107 header: '####', 105 header: '####',
108 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 106 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
109 version: '0.3', 107 version: '0.3',
110 creationDate: 'Fri Oct 17 17:00:31 PDT 2008', 108 creationDate: 'Fri Oct 17 17:00:31 PDT 2008',
111 updateDate: 'Fri Oct 17 17:00:31 PDT 2008', 109 updateDate: 'Fri Oct 17 17:00:31 PDT 2008',
112 accessDate: 'Fri Oct 17 17:00:31 PDT 2008' 110 accessDate: 'Fri Oct 17 17:00:31 PDT 2008'
113 }, 111 },
114 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 112 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
115 header: '####', 113 header: '####',
116 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 114 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
117 version: '0.3', 115 version: '0.3',
118 creationDate: 'Fri Oct 17 16:49:20 PDT 2008', 116 creationDate: 'Fri Oct 17 16:49:20 PDT 2008',
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/index.html b/frontend/gamma/tests/tests/Components/GridLayout/index.html
index f1ed116..400f958 100644
--- a/frontend/gamma/tests/tests/Components/GridLayout/index.html
+++ b/frontend/gamma/tests/tests/Components/GridLayout/index.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Card Dialog EDITING - test</title> 26 <title>Card Dialog EDITING - test</title>
29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 28 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 44
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
53 51
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
59 57
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
62 60
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script> 62 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script>
65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
66 64
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
73 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script --> 71 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
75 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script> 75 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
79 77
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
88 86
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js'></script>
92 90
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script> 91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
95 93
96 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ColumnManager.js'></script> 94 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/ColumnManager.js'></script>
97 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js'></script> 95 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js'></script>
98 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js'></script> 96 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js'></script>
99 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js'></script> 97 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DateColumnManager.js'></script> 98 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DateColumnManager.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js'></script> 99 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js'></script>
102 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/GridComponent.js'></script> 100 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/GridComponent.js'></script>
103 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script> 101 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js'></script>
104 102
105 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/FilterController.js'></script> 103 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/FilterController.js'></script>
106 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/GridController.js'></script> 104 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/GridController.js'></script>
107 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardsController.js'></script> 105 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardsController.js'></script>
108 106
109 <script type='text/javascript' src='./User.data.js'></script> 107 <script type='text/javascript' src='./User.data.js'></script>
110 <script type='text/javascript' src='./TestPageComponent.js'></script> 108 <script type='text/javascript' src='./TestPageComponent.js'></script>
111 <script type='text/javascript' src='./GridLayout_test.js'></script> 109 <script type='text/javascript' src='./GridLayout_test.js'></script>
112<script> 110<script>
113 Clipperz_IEisBroken = false; 111 Clipperz_IEisBroken = false;
114</script> 112</script>
115 113
116<!--[if IE]><script> 114<!--[if IE]><script>
117Clipperz_IEisBroken = true; 115Clipperz_IEisBroken = true;
118</script><![endif]--> 116</script><![endif]-->
diff --git a/frontend/gamma/tests/tests/Components/GridLayout/test.css b/frontend/gamma/tests/tests/Components/GridLayout/test.css
index e5983f4..b4bb372 100644
--- a/frontend/gamma/tests/tests/Components/GridLayout/test.css
+++ b/frontend/gamma/tests/tests/Components/GridLayout/test.css
@@ -1,40 +1,38 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26ul.testTabs { 24ul.testTabs {
27 list-style-type: none; 25 list-style-type: none;
28 padding: 0px; 26 padding: 0px;
29 padding-bottom: 30px; 27 padding-bottom: 30px;
30} 28}
31 29
32ul.testTabs li { 30ul.testTabs li {
33 display: inline-table; 31 display: inline-table;
34 padding: 0px 10px; 32 padding: 0px 10px;
35} 33}
36 34
37ul.testPanels { 35ul.testPanels {
38 list-style-type: none; 36 list-style-type: none;
39 padding: 0px; 37 padding: 0px;
40} \ No newline at end of file 38} \ No newline at end of file
diff --git a/frontend/gamma/tests/tests/Components/ProgressBar/index.html b/frontend/gamma/tests/tests/Components/ProgressBar/index.html
index 295c2c6..13b2586 100644
--- a/frontend/gamma/tests/tests/Components/ProgressBar/index.html
+++ b/frontend/gamma/tests/tests/Components/ProgressBar/index.html
@@ -1,117 +1,115 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>ProgressBar - test</title> 26 <title>ProgressBar - test</title>
29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 28 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 44
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
53 51
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
59 57
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
62 60
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 62 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
71 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script --> 69 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
75 73
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 75 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
84 82
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
86 84
87 <script type='text/javascript' src='./progressBar_test.js'></script> 85 <script type='text/javascript' src='./progressBar_test.js'></script>
88<script> 86<script>
89 Clipperz_IEisBroken = false; 87 Clipperz_IEisBroken = false;
90</script> 88</script>
91 89
92<!--[if IE]><script> 90<!--[if IE]><script>
93Clipperz_IEisBroken = true; 91Clipperz_IEisBroken = true;
94</script><![endif]--> 92</script><![endif]-->
95 93
96 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 94 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
97 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 95 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
98 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" /> 96 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
99 97
100</head> 98</head>
101<body> 99<body>
102 100
103<table border="0" cellpadding="50"><tr><td> 101<table border="0" cellpadding="50"><tr><td>
104 <div id="progressBar_5"></div><hr> 102 <div id="progressBar_5"></div><hr>
105 <div id="progressBar_10"></div><hr> 103 <div id="progressBar_10"></div><hr>
106 <div id="progressBar_15"></div><hr> 104 <div id="progressBar_15"></div><hr>
107 <div id="progressBar_20"></div><hr> 105 <div id="progressBar_20"></div><hr>
108 <div id="progressBar_50"></div><hr> 106 <div id="progressBar_50"></div><hr>
109</td><td> 107</td><td>
110 <div id="progressBar_80"></div><hr> 108 <div id="progressBar_80"></div><hr>
111 <div id="progressBar_85"></div><hr> 109 <div id="progressBar_85"></div><hr>
112 <div id="progressBar_90"></div><hr> 110 <div id="progressBar_90"></div><hr>
113 <div id="progressBar_95"></div><hr> 111 <div id="progressBar_95"></div><hr>
114 <div id="progressBar_100"></div><hr> 112 <div id="progressBar_100"></div><hr>
115</td></tr>></table> 113</td></tr>></table>
116</body> 114</body>
117</html> 115</html>
diff --git a/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js b/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js
index 8e2ce51..5a2cf9d 100644
--- a/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js
+++ b/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.Tests.ProgressBar'); 24Clipperz.Base.module('Clipperz.Tests.ProgressBar');
27 25
28Clipperz.PM.Strings.Languages.initSetup(); 26Clipperz.PM.Strings.Languages.initSetup();
29 27
30Clipperz.Tests.ProgressBar.Tester = function(args) { 28Clipperz.Tests.ProgressBar.Tester = function(args) {
31 args = args || {}; 29 args = args || {};
32 30
33 Clipperz.Tests.ProgressBar.Tester.superclass.constructor.call(this, args); 31 Clipperz.Tests.ProgressBar.Tester.superclass.constructor.call(this, args);
34 32
35 return this; 33 return this;
36}; 34};
37 35
38Clipperz.Base.extend(Clipperz.Tests.ProgressBar.Tester, Object, { 36Clipperz.Base.extend(Clipperz.Tests.ProgressBar.Tester, Object, {
39 37
40 'toString': function() { 38 'toString': function() {
41 return "Clipperz.Tests.ProgressBar.Tester"; 39 return "Clipperz.Tests.ProgressBar.Tester";
42 }, 40 },
43 41
44 //------------------------------------------------------------------------- 42 //-------------------------------------------------------------------------
45 43
46 'run': function () { 44 'run': function () {
47 var progressBar; 45 var progressBar;
48/* 46/*
49<div id="progressBar_5"></div><hr> 47<div id="progressBar_5"></div><hr>
50<div id="progressBar_10"></div><hr> 48<div id="progressBar_10"></div><hr>
51<div id="progressBar_15"></div><hr> 49<div id="progressBar_15"></div><hr>
52<div id="progressBar_20"></div><hr> 50<div id="progressBar_20"></div><hr>
53<div id="progressBar_50"></div><hr> 51<div id="progressBar_50"></div><hr>
54<div id="progressBar_80"></div><hr> 52<div id="progressBar_80"></div><hr>
55<div id="progressBar_85"></div><hr> 53<div id="progressBar_85"></div><hr>
56<div id="progressBar_90"></div><hr> 54<div id="progressBar_90"></div><hr>
57<div id="progressBar_95"></div><hr> 55<div id="progressBar_95"></div><hr>
58<div id="progressBar_100"></div><hr> 56<div id="progressBar_100"></div><hr>
59*/ 57*/
60 58
61 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_5')}); 59 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_5')});
62 progressBar.updateProgressHandler('5'); 60 progressBar.updateProgressHandler('5');
63 61
64 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_10')}); 62 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_10')});
65 progressBar.updateProgressHandler('10'); 63 progressBar.updateProgressHandler('10');
66 64
67 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_15')}); 65 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_15')});
68 progressBar.updateProgressHandler('15'); 66 progressBar.updateProgressHandler('15');
69 67
70 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_20')}); 68 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_20')});
71 progressBar.updateProgressHandler('20'); 69 progressBar.updateProgressHandler('20');
72 70
73 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_50')}); 71 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_50')});
74 progressBar.updateProgressHandler('50'); 72 progressBar.updateProgressHandler('50');
75 73
76 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_80')}); 74 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_80')});
77 progressBar.updateProgressHandler('80'); 75 progressBar.updateProgressHandler('80');
78 76
79 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_85')}); 77 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_85')});
80 progressBar.updateProgressHandler('85'); 78 progressBar.updateProgressHandler('85');
81 79
82 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_90')}); 80 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_90')});
83 progressBar.updateProgressHandler('90'); 81 progressBar.updateProgressHandler('90');
84 82
85 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_95')}); 83 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_95')});
86 progressBar.updateProgressHandler('95'); 84 progressBar.updateProgressHandler('95');
87 85
88 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_100')}); 86 progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_100')});
89 progressBar.updateProgressHandler('100'); 87 progressBar.updateProgressHandler('100');
90 }, 88 },
91 89
92 //========================================================================= 90 //=========================================================================
93 __syntaxFix__: "syntax fix" 91 __syntaxFix__: "syntax fix"
94}); 92});
95 93
96 94
97 95
98 96
99 97
100 98
101 99
102 100
103 101
104 102
105 103
106 104
107 105
108 106
109 107
110 108
111 109
112 110
113 111
114 112
115init = function () { 113init = function () {
116 vartester; 114 vartester;
117 115
118 tester = new Clipperz.Tests.ProgressBar.Tester(); 116 tester = new Clipperz.Tests.ProgressBar.Tester();
diff --git a/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html
index f09d9f6..15a777c 100644
--- a/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html
+++ b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html
@@ -1,112 +1,110 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Simple Message Panel - test</title> 26 <title>Simple Message Panel - test</title>
29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 28 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 44
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
53 51
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
59 57
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
62 60
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 62 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
71 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script --> 69 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
75 73
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script> 75 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
85 83
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
88 86
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
90 88
91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
92 90
93 <script type='text/javascript' src='./simpleMessagePanel_test.js'></script> 91 <script type='text/javascript' src='./simpleMessagePanel_test.js'></script>
94<script> 92<script>
95 Clipperz_IEisBroken = false; 93 Clipperz_IEisBroken = false;
96</script> 94</script>
97 95
98<!--[if IE]><script> 96<!--[if IE]><script>
99Clipperz_IEisBroken = true; 97Clipperz_IEisBroken = true;
100</script><![endif]--> 98</script><![endif]-->
101 99
102 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 100 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
103 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 101 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
104 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" /> 102 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
105 103
106</head> 104</head>
107<body> 105<body>
108 106
109<div id="tableWrapper"></div> 107<div id="tableWrapper"></div>
110 108
111</body> 109</body>
112</html> 110</html>
diff --git a/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js
index 8513909..2865f3a 100644
--- a/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js
+++ b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js
@@ -1,92 +1,90 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.Tests.SimpleMessagePanel'); 24Clipperz.Base.module('Clipperz.Tests.SimpleMessagePanel');
27 25
28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
29Clipperz.PM.Strings.Languages.initSetup(); 27Clipperz.PM.Strings.Languages.initSetup();
30 28
31Clipperz.Tests.SimpleMessagePanel.Tester = function(args) { 29Clipperz.Tests.SimpleMessagePanel.Tester = function(args) {
32 args = args || {}; 30 args = args || {};
33 31
34 Clipperz.Tests.SimpleMessagePanel.Tester.superclass.constructor.call(this, args); 32 Clipperz.Tests.SimpleMessagePanel.Tester.superclass.constructor.call(this, args);
35 //this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); 33 //this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}});
36 34
37 return this; 35 return this;
38}; 36};
39 37
40Clipperz.Base.extend(Clipperz.Tests.SimpleMessagePanel.Tester, Object, { 38Clipperz.Base.extend(Clipperz.Tests.SimpleMessagePanel.Tester, Object, {
41 39
42 'toString': function() { 40 'toString': function() {
43 return "Clipperz.Tests.SimpleMessagePanel.Tester"; 41 return "Clipperz.Tests.SimpleMessagePanel.Tester";
44 }, 42 },
45 43
46 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
47/* 45/*
48 'user': function () { 46 'user': function () {
49 return this._user; 47 return this._user;
50 }, 48 },
51*/ 49*/
52 //------------------------------------------------------------------------- 50 //-------------------------------------------------------------------------
53 51
54 'run': function () { 52 'run': function () {
55 var deferredResult; 53 var deferredResult;
56 var confirmationDialog; 54 var confirmationDialog;
57 55
58 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({ 56 confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({
59 title:"Alert", 57 title:"Alert",
60 text:"Should lost pending changes? But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness", 58 text:"Should lost pending changes? But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness",
61 type:'ALERT', 59 type:'ALERT',
62 buttons: [ 60 buttons: [
63 {text:"Cancel",result:'CANCEL', isDefault:true}, 61 {text:"Cancel",result:'CANCEL', isDefault:true},
64 {text:"Ok", result:'OK'} 62 {text:"Ok", result:'OK'}
65 ] 63 ]
66 }); 64 });
67 65
68 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false}); 66 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false});
69 deferredResult.addMethod(confirmationDialog, 'deferredShow', { 67 deferredResult.addMethod(confirmationDialog, 'deferredShow', {
70 'openFromElement': null, 68 'openFromElement': null,
71 'onOkCloseToElement': null, //this.getElement('cancelButton'), 69 'onOkCloseToElement': null, //this.getElement('cancelButton'),
72 'onCancelCloseToElement':null 70 'onCancelCloseToElement':null
73 }); 71 });
74 deferredResult.callback(); 72 deferredResult.callback();
75 73
76 return deferredResult; 74 return deferredResult;
77 }, 75 },
78 76
79 //========================================================================= 77 //=========================================================================
80 __syntaxFix__: "syntax fix" 78 __syntaxFix__: "syntax fix"
81}); 79});
82 80
83 81
84 82
85init = function () { 83init = function () {
86 vartester; 84 vartester;
87 85
88 tester = new Clipperz.Tests.SimpleMessagePanel.Tester(); 86 tester = new Clipperz.Tests.SimpleMessagePanel.Tester();
89 tester.run(); 87 tester.run();
90}; 88};
91 89
92MochiKit.DOM.addLoadEvent(init); 90MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/Tooltips/index.html b/frontend/gamma/tests/tests/Components/Tooltips/index.html
index 3772227..3f3327d 100644
--- a/frontend/gamma/tests/tests/Components/Tooltips/index.html
+++ b/frontend/gamma/tests/tests/Components/Tooltips/index.html
@@ -1,118 +1,116 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>TOOLTIPS - test</title> 26 <title>TOOLTIPS - test</title>
29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 28 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 44
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
53 51
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
59 57
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
62 60
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 62 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
71 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script --> 69 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
75 73
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 75 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
84 82
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
87 85
88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script> 86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js'></script>
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
90 88
91 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 89 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
92 90
93 <script type='text/javascript' src='./tooltips_test.js'></script> 91 <script type='text/javascript' src='./tooltips_test.js'></script>
94<script> 92<script>
95 Clipperz_IEisBroken = false; 93 Clipperz_IEisBroken = false;
96</script> 94</script>
97 95
98<!--[if IE]><script> 96<!--[if IE]><script>
99Clipperz_IEisBroken = true; 97Clipperz_IEisBroken = true;
100</script><![endif]--> 98</script><![endif]-->
101 99
102 <link rel="stylesheet" type="text/css" href="../../../../css/web.css" /> 100 <link rel="stylesheet" type="text/css" href="../../../../css/web.css" />
103 101
104<style> 102<style>
105 103
106div.leftColumn { 104div.leftColumn {
107 float:left; 105 float:left;
108} 106}
109 107
110div.rightColumn { 108div.rightColumn {
111 float:left; 109 float:left;
112} 110}
113 111
114div.boxWrapper { 112div.boxWrapper {
115 padding: 70px 200px; 113 padding: 70px 200px;
116} 114}
117 115
118div.box { 116div.box {
diff --git a/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js b/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js
index 9ed1c05..42ae70b 100644
--- a/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js
+++ b/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js
@@ -1,114 +1,112 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.Tests.Tooltips'); 24Clipperz.Base.module('Clipperz.Tests.Tooltips');
27 25
28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
29Clipperz.PM.Strings.Languages.initSetup(); 27Clipperz.PM.Strings.Languages.initSetup();
30 28
31Clipperz.Tests.Tooltips.Tester = function(args) { 29Clipperz.Tests.Tooltips.Tester = function(args) {
32 args = args || {}; 30 args = args || {};
33 31
34 Clipperz.Tests.Tooltips.Tester.superclass.constructor.call(this, args); 32 Clipperz.Tests.Tooltips.Tester.superclass.constructor.call(this, args);
35 33
36 return this; 34 return this;
37}; 35};
38 36
39Clipperz.Base.extend(Clipperz.Tests.Tooltips.Tester, Object, { 37Clipperz.Base.extend(Clipperz.Tests.Tooltips.Tester, Object, {
40 38
41 'toString': function() { 39 'toString': function() {
42 return "Clipperz.Tests.Tooltips.Tester"; 40 return "Clipperz.Tests.Tooltips.Tester";
43 }, 41 },
44 42
45 //------------------------------------------------------------------------- 43 //-------------------------------------------------------------------------
46 44
47 'run': function () { 45 'run': function () {
48 vartooltip; 46 vartooltip;
49 47
50//Clipperz.log("================== ABOVE =================="); 48//Clipperz.log("================== ABOVE ==================");
51 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ 49 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
52 'element':MochiKit.DOM.getElement('ABOVE'), 50 'element':MochiKit.DOM.getElement('ABOVE'),
53 'text': "Tooltip displayed above the element", 51 'text': "Tooltip displayed above the element",
54 'position':'ABOVE' 52 'position':'ABOVE'
55 }); 53 });
56 tooltip.show(); 54 tooltip.show();
57 55
58//Clipperz.log("================== BELOW =================="); 56//Clipperz.log("================== BELOW ==================");
59 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ 57 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
60 'element':MochiKit.DOM.getElement('BELOW'), 58 'element':MochiKit.DOM.getElement('BELOW'),
61 'text': "Tooltip displayed below the element", 59 'text': "Tooltip displayed below the element",
62 'position':'BELOW' 60 'position':'BELOW'
63 }); 61 });
64 tooltip.show(); 62 tooltip.show();
65 63
66//Clipperz.log("================== LEFT =================="); 64//Clipperz.log("================== LEFT ==================");
67 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ 65 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
68 'element':MochiKit.DOM.getElement('LEFT'), 66 'element':MochiKit.DOM.getElement('LEFT'),
69 'text': "Tooltip displayed to the left of the element", 67 'text': "Tooltip displayed to the left of the element",
70 'position':'LEFT' 68 'position':'LEFT'
71 }); 69 });
72 tooltip.show(); 70 tooltip.show();
73 71
74//Clipperz.log("================== RIGHT =================="); 72//Clipperz.log("================== RIGHT ==================");
75 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ 73 tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({
76 'element':MochiKit.DOM.getElement('RIGHT'), 74 'element':MochiKit.DOM.getElement('RIGHT'),
77 'text': "Tooltip displayed to the right the element", 75 'text': "Tooltip displayed to the right the element",
78 'position':'RIGHT' 76 'position':'RIGHT'
79 }); 77 });
80 tooltip.show(); 78 tooltip.show();
81 79
82 }, 80 },
83 81
84 //========================================================================= 82 //=========================================================================
85 __syntaxFix__: "syntax fix" 83 __syntaxFix__: "syntax fix"
86}); 84});
87 85
88 86
89 87
90 88
91 89
92 90
93 91
94 92
95 93
96 94
97 95
98 96
99 97
100 98
101 99
102 100
103 101
104 102
105 103
106 104
107init = function () { 105init = function () {
108 vartester; 106 vartester;
109 107
110 tester = new Clipperz.Tests.Tooltips.Tester(); 108 tester = new Clipperz.Tests.Tooltips.Tester();
111 tester.run(); 109 tester.run();
112}; 110};
113 111
114MochiKit.DOM.addLoadEvent(init); 112MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js b/frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js
index 49abe46..ba60878 100644
--- a/frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js
+++ b/frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26testData = { 24testData = {
27 25
28 //------------------------------------------------------------------------- 26 //-------------------------------------------------------------------------
29 27
30 'simpleLogin_001': { 28 'simpleLogin_001': {
31 'users': [ 29 'users': [
32 { 30 {
33 'username': "joe", 31 'username': "joe",
34 'passphrase': "eoj", 32 'passphrase': "eoj",
35 'version': "0.2", 33 'version': "0.2",
36 'connectionVersion':"0.2", 34 'connectionVersion':"0.2",
37 'records':{ 35 'records':{
38 'record 1': { 36 'record 1': {
39 'notes':"Some notes here", 37 'notes':"Some notes here",
40 'fields':[ 38 'fields':[
41 { 'name': "username", 'value': "joe", 'type': "text" }, 39 { 'name': "username", 'value': "joe", 'type': "text" },
42 { 'name': "password", 'value': "1234", 'type': "password"} 40 { 'name': "password", 'value': "1234", 'type': "password"}
43 ], 41 ],
44 'directLogins':{ 42 'directLogins':{
45 "record 1 direct login": { 43 "record 1 direct login": {
46 'configuration':"", 44 'configuration':"",
47 'bindings':[ 45 'bindings':[
48 ], 46 ],
49 'favicon':"http://www.example.com/favicon.ico" 47 'favicon':"http://www.example.com/favicon.ico"
50 } 48 }
51 } 49 }
52 } 50 }
53 }, 51 },
54 'otp':[ 52 'otp':[
55 "12345678 90abcdef 12345678 90abcdef", 53 "12345678 90abcdef 12345678 90abcdef",
56 "fedcba09 87654321 fedcba09 87654321" 54 "fedcba09 87654321 fedcba09 87654321"
57 ] 55 ]
58 } 56 }
59 ] 57 ]
60 }, 58 },
61 59
62 //------------------------------------------------------------------------- 60 //-------------------------------------------------------------------------
63 61
64 'joe_clipperz_offline_copy_data': { 62 'joe_clipperz_offline_copy_data': {
65 users:{ 63 users:{
66 'catchAllUser': { 64 'catchAllUser': {
67 __masterkey_test_value__: 'masterkey', 65 __masterkey_test_value__: 'masterkey',
68 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', 66 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
69 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' 67 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
70 }, 68 },
71 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { 69 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
72 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee', 70 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
73 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf', 71 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
74 version: '0.2', 72 version: '0.2',
75 maxNumberOfRecords: '100', 73 maxNumberOfRecords: '100',
76 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"6tqzHY7/lB/JVfDi3iJ7BIJTiX1Fih//aTUF7IDoLdlnafC9hoIQ/5lGk+/Ezilw59n11ocPN31aOA9ddFGc9oa2vQ1BdymV8F91sWGLGyWft+PRCWOqxy7U1XxvbgyRbCs0mbtSLp/qlC6gewnAXJpH6KT9oURIjKkyaR8jJ7ng6IlfGUIL2KUFnAv6KNoWO5cdXDU0nrrdSYehcApmXYlTyreHDbrFlLJ2YuR9JLvw9bDxXi/xBY1wZgwiUsGVlG3j0e4f63mJVrpmPI1jhaXD3BQD8cbl96l1ImhYe1Boz53gLq94KSk+3bkjG4GRhvlDPtvk8vdSZPsYPsbC0Cu0M4TMS70nPX7qNj5LDvzrd+S+zDj1/CW0yctRThXstrxDyG/L75k/xdZcVbMzXQHQR4OwWWFiqGOnLpyiZIHGfV5+xZ1a1uxT9TPDoDdwPuE5P1Uwh3PeGc9jatk3waQN6fo3g8PQrCOtPn7C7b6y4MEjpAG4e53HFb0B/hEfK6ApycT6QAglsA3qF/tZyZbwNCwert4pG52rIG/PODZ1XxVZHFX8VFWeSxuk/jnPpJg/pvfpRzBMyCGVDJb/i+dlwFcnOAVvqju5xXJk4mu05XrngF10NzHnVRMfxwXmdtTDYE/lDuODy1SiE5yBZlt/Ff6a0eMS/P8HLsUS8+dtz9yOIQ8rh+52nVS7F5tFWXFOvT7nfq1L4HaHCigY187Jk0Y3LCsZW6ziB5qhKZlbQxdCAx5UDNWNs/F59qxVWP5k2UagBgAJoh+iMTZAMWkaURqQxY84SVYIkm9vNZv6Jf+ppFJNn6s3ZZSUe8gmmgMPJP0Lmoh/VCPNypzR+sZULfVFpmPmNXfaAOQ875iDgvUuBWsDSBdyx2+8Q+fUO0w+W4WkDM09VGmFxrHHjfpRsOT1B3dVFti2ypyiCdkvm878pvTS2j4Obweh6+bmzE7lqOXJgtQUydKNZIb3hNbjB7LwPro6e70ctm3eM9OLFT73u+khVM2UtAhfMseEb+Ny+PldW+VgXnHFm8n5CDBHoDJPXBfJq60l6+1OnDPfB+7tIgnCVH56CZ0jFX2EbxWS63xAHNLttfMtxdbkf4AbpanqLJvNiU4P0ThW4+VNRKBid0v78WC40rWX4UTEv9HPvUA5JUsj1v6+I5UI+quCUfx0vQgeO/gAlI0YuVgDBB1ouWUSES9+U9QIGoUsVTHDo4ZOEInsnhjPbz+IFyRMoMfbiYx3gviHluxHNGYsIMFxo+yB8aW/CedyWYt54ijgViPIXhH+R8bMgFBX4JX6hu8l3NMSYvMV82ua9Pnyl7NxbwuL1S/0JAp2uh0OzGMX9iOOcFWqbWVAX7NCePAG4VTJ0wZ2iL/MUGAVG72qBWvCb1ckavQc1LTw8l2vPG6YwFf0frFHsVvZsGHRptswFTp+77U1bpn/TL2MUXJQ9gQWgCQHxE+STunbJDDWOe9FZeKkJgjqQQ2E70UFoyUp4U/H1fA5Sy9+gS8QMtOcPJ6tCbcIXnq1nif+6bDBjtQCofs59Mm7ibwnofXPGkWv8Id3SyhW9YZCYhJZss2dkMyWfqw4jDysWxQAHjxZg4qgVXA9xpwuhu7O82vMOutk7vPyEuJ4gqlDroN4aPecD405YOEXWeWrWsL2V3y5PwXBrYWq22XzJeL3PvS9usj1Vg2TtG2O3HLuB6Rm6+i7kraiRbENemst4MjLrZwYjI07ZD7DUifsrUvjA50JXXb8pjudYqwUrTKOzcE/uZ1WbSbm+2x8PYVimLtDE4/lOp34J07WV7ZxJL8yk4J4CYRxLnnS7xps8skfy6glRA8fTKRVLv+9VqVxJgE3X/G8Kfosd9K03DJbD+L+h3kvLAAZ6Xr6FpbnA5HeGXzfQ/k5lBqIS39iqT2kZKMxIOXhfwmmuTSS25nk7hD+0R1TdnnTOYQrEn8bdyPuFXzd08FxN9KSYm2H1Gdg+2h+N9UWTED7zXmv/H+gfzk5gfoNOKyWWoaEFT/NL3ky6ApzuiokUj3x+xvCwOXoozLHXhdeZYtYkIu1HlYWQx1YAk2ilg47nnRhQQaYjMvIHfsdYjdb1CpGO5K1dYlRBOCMttp+j5QVz/jCSeCrMh8dtu9ZGLEZ3QL06tqmXp03fCsvKOG0it/KuNG5EJpfb6bV+5DsZvI6k4VLXjcKvZhhh+VZSf2mr+mzFEGKBSeleZvii2g8dVyaEBms37SBFCdIwkMxFRmzo/n+1m8axx9o57NPwISU4q8eAjUK2bWrBECZaI4FwLqmlGK9hMPGB/lbrcuHtlqmv5qzo2TJb5/xoX0LyJB/FZVk5Wsm8vC+O8b7o6JDxaPkOgy07+p8Sg9wuKVy6hHrFRnZ+MEZO3Bbk74omg4+6y4HVuRCgxztzRyUiYTssFphqKBsC/e6fQN0QtSwhLSld/B5qoPMn/9CMs8UxmRbA2Ekwi+7Ss51YsWNmd8dKUqxMKWFZOQYe2dbvcYbRwKwjrARxR7d5aaQr8b96hKsWs0YkLQDn71C3AQfEUvClvDXJdJ97B9WkDHz/DQ9EaIp9+4ZSl3SIrew09vUkvUSVGU7egHzv1Oe2gf4jI/3zToRq307AzCT1tF4k0VbInDFKb8YSG35UaJAtfTENvkAQ+8KmR3gQyHRupLi6D8TNvy/03n8naG8BV8+EArzmUAgxmfv3PTipnn3bdsaIFK1+uldQXVUoHm7PgZidzOHpNXvNzgrL3c3gv7Et/s="},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"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"},"version":"0.1"}', 74 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"jufmL1KVY0YBl8MSaL413hGtw12I/+sFnumcfeVku9RRMBmXaXCfE/vYnraxZyPxJxVS3qFRWDKsSGR3pScdACSwlBD+mzjifRn2SCfXWutD1/oJiqiMvq3YFzwyZJiXx+oS5u8DOTieQT9HZYt0pUmAod9QHiq2NAkueVjvRkZI1saRlWGtNXCaJIHwpuFJpHBDSD//6D9DYeTdVUeFEbej+4oNYpBCkyE1G2OL6q50YRBYp9yARRiy9juKHRWFvZiSeMGEJQS0f2gaP+xZkb9Z4qrfDgAZ1F7oDbPksr2SOYlSsm0bqa6c+7Wtopdo63Urf7Ze3Wg9n8TGBk6H88boseR8e3sHudlmtO1oLxcB9p3z/NTceF6SvWyJWTxHeMe6O72dZVmSnZlXhD/IJamRt13HLk3g05d8oXfrXM3iMhIGQ+EsXMxZfKdXlZpyYtjWD5tcQTKz7M5Qo3SFmdkwDu4jH5ke+bD8CeluDcMaHF6KHfdV8nEsmsjGwrH6lqSCT/9kBO5ETqUJKloOhJpFpNS/EN7nxjXF/QbqnUmWV4wngdyYmk9goNZNfZv7C2ouiyys55/QEfGsIsvEPPSfO670oJuncTyfFngFj2tdh2JpJ5vytuoRNLOm7XPM3hDCvZCOpUnjbm+jt4AvdOGU7ID8a2mtZFjb2noP5emAxTg6MO6f3+44eTkUcbCDskO5fe6jd0pTdODk21Ilp7WUjFwxEdJG8tRrGYpLooProJExamL7WShm/S/nhJL4+euW+1UIDjcZJA+a7aGdMSC63qBvrEsNyf57SDBk/o2eNJHs2sndCzgvK42IKGKcipq9D1Gyos9JQsA3My9ARMt68V/5FfzOkgPO6mblOsQMoTyQj/OCLzITEBfqA5IufhljSEkD3CLkfkeVwVf1NB2SsTPXJFChnynfsK7cMFy0O2XBNByCRTQDqBDBYo673tI1KTGnT4gLSAwCt96lq8UkEdt51jjkAJcvBXkbswuw3hvhtzLJ302hkN9CIHJrEN0oss5mWlxIxYrCyqE3ABME3FCR9r+V7exuIaQn6mdJTkMcRbYmVQQkexsROh2cdx8I/tuMN4ECWEAL948k9vEPZfgaQirWnrTtHoxLzNAUBDSQfzYXd8yr0T4vAHLnXaUalWPgLamJJ3eR+LDFcDQVvFkaomsF3RpOIS5fswTBFuRKGKEBSIINc9AyC4DtkSmDMTF2S0TgpnGdK94ZS8C/PM8WEsX738echa5qZG5qG0f+koOUUrbaORcDqaktCuDmsgFTYiUv1JxFskTvS/t/EM2Y0MEKVLZBsoG+4WXz4XEE0VJFoI9glaYll96WH/iMbaVXRnDwjyE62CAk/8DXIf//MJQVyO6ElFsvCrDfH03yLpCJhqwHv+mD5sRctVaq6Cp5Ts3bzdFeiLCX9rhSaqdG5AuMk4dCInlywxrsOvBfNaDBjX7NGCULri6px2T53FNiH6ineVjr9TfgY2uoMyevLiQsGd3GHS4wnxiUfIyz7/Yav5an4o82cHhMVOLvfKwF8C2dJQDg9woJ3ju1ha66UA2XGScJVd93w3OWco78+giXBE96R3CebxgaWQ5Zif6nI+FJnw6OipaRgd7EyrLrQTWadvTiYLfDknlsxFZd4XVs33/3xxF3RyoVsIFO7cpEX/BLVB69v+1TJvLdiyGwSl5FUKbrcrXycZ67uTKtHyAI/vrzwwoQxYV8e32xW86blEjH4pq/Zrijm1wGw7IrD9fYVgEO7nnWpE/ac85LrDaJpGOdZ+slcVWM6THHR9boKJGLtuc8V81gDVNtZ/f4Hx5YXZWKIIfpe57BybWejdQ8ZACWK+mXOGczyXJ88B4nIvaKnRlhSszQryAZzSqJry2k3t1v73BzL48TZWJ6yu1rFmqAUk2V5DCA4XnyHfPuiG8hZfTuu1YXQ+iBgbyDipTwozQqyTv3SxLBPTFxKZLuabMn7ZTo/kLXGfVO/2va58bv6kzW6WjwZ0D481N1Nyd1kZUw1lyxXklcAzZqaHUiIsy+/5DgV/qULYFqEBMNMA7QvBfRN4VZRlnNiemgzkBQXj+JGJOWZMz5cvss291rj1fAe91s10nkZoaddDrvfgfjTq6n9XLSyGSmnrIDMLVc9+YuDtuaQ4gwuiLG2X57Jzrc/Xy7jdZ82G1j+cfT/8Pvb40i1K9aid0Z3xl/tm7jBAqQ91Ehkbo6c8jUVPaQsRcfTumtsNf+Xa5PJmQtEGEPCUlGN6F7eFB5eOLXQFdsLRL1x+SzhS7k3aDri9sTMwYQij26AexwwzAPqcOOkkfbYf0lov5Gxx0LhsZAetDZCRFlxjDRDS8jE8dKBBXkWFazF8K2rdQXKNlclwezCEDBwUWhoJs/H5ndJ38MpSPfKo1YsVvlxi4QFyOTDPJIstCCvYnCjj1r7SrkRrbcuevITRTxD4FKgPCdsYFlGfhS1zWb23DWYWo6fPQ1/zlnN01gZStxsZKepB3NnxbTSjBgTSmzG6RzZajv6BtqivtvOa1hI2KZQtVGCDU2+NGmfbJ5TTJehYiTEPeBF9TfLRP9rktQTUngj2ohv+1TDL0jL3YWiSA9TJzYonsincEVy1aRUeGVazWF2Rrq2o4hCBp12BfuMGHOdVkg9rMXdusyl2y75YyEkcBNMz4zi8i1lVhjUg16rCR48uKJ9QO2KBbjoGTx13uxIXTR8ufXx6mW7iW3qVx+6k7BQGKlMo1G64O8HQ2UrboS/tCqlP0W+7XB2C3EaZMqfKeYcuzM4MLkM6CT2GKYmJPyevXLKE749BM8zRQUcrWieAxmyD+g0QQ4T1fl0RTNEFB1/0BIg3fQQHCLGUTahXwt0EluG9iNPVgmFwwBHybH6gmIEZ4xnD8I7QPwgYY3JF407NdLkHjOuXrP+GODGEvX49MMaUigUUO2fkdw9EJbaidhx6j1EsFpQrz4Lt/5sAu5c9B/365TXtnNnmaPkaFj1q+3ezVXUroimRqxZ9BMaTm7J1hjubO+Dxjb2QlR/UApvQ0ty8aZpmIrMi0xjfoodIMiH6IYdw3VRZSqup7irWWpnJhef2qqtcpoxdiYZaFyf5u2XpZqEnAJpTupqOg+qJN/7aQt6ZmP7POFPwUwzwAsfTYk2EwMlTVAXrawZZEYu2JZ4kIjazo1LgyuuWTieEuONnye8Hr9p70RjwWUdlErlPSCKKn6JRdsM2no13F3151cfgx8I02J9vDuiNa3vfJfmRnBOly5jq6Wlnm2rJN6YYQHwbikoq3lJvkX5ZANDRKFlMWKK42+fXLBuofAZShFt6xvlY384aYsv3EcR42GOLrgYPQy0a7lr/FS4mM2ErNwNYnCz/xTuPBjgXXplbAnyA3jpKdPN1EfUM1oA4kZjECmkXZOuyEQxrndS9eOGbPM6S131zpdWEw9dWSZdkSI34+OkLfAKf6W6z4G4Z+cMRrkYLHs+BavJOum4XTjyyXHIKhQiqz9mgEf+ulodXi+LNsbq1eCcGPWrGg+GNwN1SjJHZm78gidyrlEF6xuPCaZRvGQtk59nuJULOZWkC3Ns/EcFiAql8cu37Lp842fsHHeCVOq0e8ZII4TPg9HKPwDD4HLSg4frBzyeZwK0nN30C5ATCxWdL4Q60cKtZyIEM7Kn1a/vifsAbe019Ui3ovTOCYiTCAdOLaAL/NdpgWA/fDNOsTlPvnEYkq+4+bV3Wyye9ddxICD4TnC2yvXvjw4C/WnYYceJy5R4KamIJueEGIHGp22/0DSF3H4ji3QoUDiFB/H+CA8A2q9LO9q0NYcf2P5q2MfdJGu4bd49g68mltj35pRnGQaafflXY9VmMfrlAbBYfUnsKOb3DOUpq8asveE41/6WkGcXFIuSABcbBf0cHIfBn41wRWQhoCm/JL8pfqEZC/paBdFBRW4FjKkxhbg4BPvBL0aQyGGkU8eH8tr8nm4YN1HMFF/s3s8+9FPoBxPuXLoGSg7Rvdz+g=="},"version":"0.1"}',
77 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/', 75 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
78 userDetailsVersion: '0.3', 76 userDetailsVersion: '0.3',
79 records: { 77 records: {
80 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': { 78 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
81 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx', 79 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
82 version: '0.2', 80 version: '0.2',
83 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 81 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
84 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 82 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
85 accessDate: 'Mon Jan 19 16:10:04 CET 2009', 83 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
86 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', 84 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
87 versions: { 85 versions: {
88 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { 86 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
89 header: '####', 87 header: '####',
90 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC', 88 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
91 version: '0.2', 89 version: '0.2',
92 creationDate: 'Wed Mar 14 15:46:44 CET 2007', 90 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
93 updateDate: 'Wed Mar 14 15:46:44 CET 2007', 91 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
94 accessDate: 'Mon Jan 19 16:10:04 CET 2009' 92 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
95 } 93 }
96 } 94 }
97 }, 95 },
98 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': { 96 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
99 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL', 97 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
100 version: '0.3', 98 version: '0.3',
101 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 99 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
102 updateDate: 'Mon Oct 27 08:58:49 CET 2008', 100 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
103 accessDate: 'Mon Jan 19 16:09:39 CET 2009', 101 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
104 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', 102 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
105 versions: { 103 versions: {
106 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': { 104 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
107 header: '####', 105 header: '####',
108 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP', 106 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
109 version: '0.3', 107 version: '0.3',
110 creationDate: 'Fri Oct 17 17:00:31 CEST 2008', 108 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
111 updateDate: 'Fri Oct 17 17:00:31 CEST 2008', 109 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
112 accessDate: 'Fri Oct 17 17:00:31 CEST 2008' 110 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
113 }, 111 },
114 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': { 112 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
115 header: '####', 113 header: '####',
116 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb', 114 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
117 version: '0.3', 115 version: '0.3',
118 creationDate: 'Fri Oct 17 16:49:20 CEST 2008', 116 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
diff --git a/frontend/gamma/tests/tests/Components/UnlockPassword/index.html b/frontend/gamma/tests/tests/Components/UnlockPassword/index.html
index 7a5e95b..a124739 100644
--- a/frontend/gamma/tests/tests/Components/UnlockPassword/index.html
+++ b/frontend/gamma/tests/tests/Components/UnlockPassword/index.html
@@ -1,114 +1,112 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>UnlockPassword - test</title> 26 <title>UnlockPassword - test</title>
29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 28 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 44
47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script> 45 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script> 46 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script> 47 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script> 48 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
51 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script> 49 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
52 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script> 50 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
53 51
54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script> 52 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script> 53 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script> 54 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script> 55 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script> 56 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
59 57
60 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script> 58 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script> 59 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
62 60
63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script> 61 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script> 62 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
65 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script> 63 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script> 64 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script> 65 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script> 66 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script> 67 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script> 68 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
71 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script --> 69 <!-- script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Field.js'></script -->
72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script> 70 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
73 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script> 71 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script> 72 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
75 73
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script> 74 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/BaseComponent.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script> 75 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Button.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script> 76 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ComponentSlot.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script> 77 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js'></script>
80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script> 78 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/ProgressBar.js'></script>
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script> 79 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script> 80 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script> 81 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/Tooltip.js'></script>
84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script> 82 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js'></script>
85 83
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script> 84 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script> 85 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js'></script>
88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js'></script> 86 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js'></script>
89 87
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script> 88 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js'></script>
91 89
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script> 90 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js'></script>
93 91
94 <script type='text/javascript' src='./User.data.js'></script> 92 <script type='text/javascript' src='./User.data.js'></script>
95 <script type='text/javascript' src='./unlockPassword_test.js'></script> 93 <script type='text/javascript' src='./unlockPassword_test.js'></script>
96<script> 94<script>
97 Clipperz_IEisBroken = false; 95 Clipperz_IEisBroken = false;
98</script> 96</script>
99 97
100<!--[if IE]><script> 98<!--[if IE]><script>
101Clipperz_IEisBroken = true; 99Clipperz_IEisBroken = true;
102</script><![endif]--> 100</script><![endif]-->
103 101
104 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 102 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
105 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 103 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
106 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" /> 104 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
107 105
108</head> 106</head>
109<body> 107<body>
110 108
111<div id="tableWrapper"></div> 109<div id="tableWrapper"></div>
112 110
113</body> 111</body>
114</html> 112</html>
diff --git a/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js b/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js
index 80a8c30..6722b60 100644
--- a/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js
+++ b/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js
@@ -1,118 +1,116 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26Clipperz.Base.module('Clipperz.Tests.SimpleMessagePanel'); 24Clipperz.Base.module('Clipperz.Tests.SimpleMessagePanel');
27 25
28Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 26Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
29Clipperz.PM.Strings.Languages.initSetup(); 27Clipperz.PM.Strings.Languages.initSetup();
30 28
31Clipperz.Tests.SimpleMessagePanel.Tester = function(args) { 29Clipperz.Tests.SimpleMessagePanel.Tester = function(args) {
32 args = args || {}; 30 args = args || {};
33 31
34 Clipperz.Tests.SimpleMessagePanel.Tester.superclass.constructor.call(this, args); 32 Clipperz.Tests.SimpleMessagePanel.Tester.superclass.constructor.call(this, args);
35 33
36 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:MochiKit.Base.method(this, 'getUserPassphrase')}); 34 this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:MochiKit.Base.method(this, 'getUserPassphrase')});
37 this._unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({ 35 this._unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({
38 'title':"Unlock account", 36 'title':"Unlock account",
39 'text': "Insert the passprase to unlock the account", 37 'text': "Insert the passprase to unlock the account",
40 'type': 'INFO', 38 'type': 'INFO',
41 'buttons': [ 39 'buttons': [
42 {text:"Cancel",result:'CANCEL'}, 40 {text:"Cancel",result:'CANCEL'},
43 {text:"Unlock", result:'OK',isDefault:true} 41 {text:"Unlock", result:'OK',isDefault:true}
44 ], 42 ],
45 'openFromElement': null, 43 'openFromElement': null,
46 'onOkCloseToElement': null, //this.getElement('cancelButton'), 44 'onOkCloseToElement': null, //this.getElement('cancelButton'),
47 'onCancelCloseToElement':null 45 'onCancelCloseToElement':null
48 }); 46 });
49 47
50 return this; 48 return this;
51}; 49};
52 50
53Clipperz.Base.extend(Clipperz.Tests.SimpleMessagePanel.Tester, Object, { 51Clipperz.Base.extend(Clipperz.Tests.SimpleMessagePanel.Tester, Object, {
54 52
55 'toString': function() { 53 'toString': function() {
56 return "Clipperz.Tests.SimpleMessagePanel.Tester"; 54 return "Clipperz.Tests.SimpleMessagePanel.Tester";
57 }, 55 },
58 56
59 //------------------------------------------------------------------------- 57 //-------------------------------------------------------------------------
60 58
61 'user': function () { 59 'user': function () {
62 return this._user; 60 return this._user;
63 }, 61 },
64 62
65 'unlockPasswordComponent': function () { 63 'unlockPasswordComponent': function () {
66 return this._unlockPasswordComponent; 64 return this._unlockPasswordComponent;
67 }, 65 },
68 66
69 //------------------------------------------------------------------------- 67 //-------------------------------------------------------------------------
70 68
71 'run': function () { 69 'run': function () {
72 var deferredResult; 70 var deferredResult;
73 var proxy; 71 var proxy;
74 72
75 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); 73 proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
76 74
77 deferredResult = new Clipperz.Async.Deferred("unlockPassword_test.run", {trace:false}); 75 deferredResult = new Clipperz.Async.Deferred("unlockPassword_test.run", {trace:false});
78 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); 76 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
79 deferredResult.addMethod(this.user(), 'login'); 77 deferredResult.addMethod(this.user(), 'login');
80 deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); 78 deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
81 // deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) { 79 // deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) {
82 // cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this}); 80 // cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this});
83 // cardDialogController.run(); 81 // cardDialogController.run();
84 // }, this)); 82 // }, this));
85 deferredResult.callback(); 83 deferredResult.callback();
86 84
87 return deferredResult; 85 return deferredResult;
88 }, 86 },
89 87
90 //========================================================================= 88 //=========================================================================
91 89
92 'getUserPassphrase': function () { 90 'getUserPassphrase': function () {
93 return this.unlockPasswordComponent().getPassphrase(); 91 return this.unlockPasswordComponent().getPassphrase();
94/* 92/*
95 var deferredResult; 93 var deferredResult;
96 var confirmationDialog; 94 var confirmationDialog;
97 95
98 confirmationDialog = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({ 96 confirmationDialog = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({
99 title:"Unlock account", 97 title:"Unlock account",
100 text:"Insert the passprase to unlock the account", 98 text:"Insert the passprase to unlock the account",
101 type:'INFO', 99 type:'INFO',
102 buttons: [ 100 buttons: [
103 {text:"Cancel",result:'CANCEL'}, 101 {text:"Cancel",result:'CANCEL'},
104 {text:"Unlock", result:'OK',isDefault:true} 102 {text:"Unlock", result:'OK',isDefault:true}
105 ] 103 ]
106 }); 104 });
107 105
108 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false}); 106 deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false});
109 deferredResult.addMethod(confirmationDialog, 'deferredShow', { 107 deferredResult.addMethod(confirmationDialog, 'deferredShow', {
110 'openFromElement': null, 108 'openFromElement': null,
111 'onOkCloseToElement': null, //this.getElement('cancelButton'), 109 'onOkCloseToElement': null, //this.getElement('cancelButton'),
112 'onCancelCloseToElement':null 110 'onCancelCloseToElement':null
113 }); 111 });
114 deferredResult.callback(); 112 deferredResult.callback();
115 113
116 return deferredResult; 114 return deferredResult;
117*/ 115*/
118 }, 116 },
diff --git a/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js
index 9908c6a..1585449 100644
--- a/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js
+++ b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js
@@ -1,63 +1,61 @@
1/* 1/*
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24*/ 22*/
25 23
26newWindow = function (anEvent) { 24newWindow = function (anEvent) {
27 var windowURL; 25 var windowURL;
28 var htmlString; 26 var htmlString;
29 var newWindow; 27 var newWindow;
30 28
31 anEvent.preventDefault(); 29 anEvent.preventDefault();
32 30
33 //htmlString = '<html><head><title>TARGET WINDOW</title></head><body><h3>this is the target window</h3></body></html>'; 31 //htmlString = '<html><head><title>TARGET WINDOW</title></head><body><h3>this is the target window</h3></body></html>';
34 // windowURL = 'data:text/html;charset=utf-8;base64,' + (new Clipperz.ByteArray(htmlString)).toBase64String(); 32 // windowURL = 'data:text/html;charset=utf-8;base64,' + (new Clipperz.ByteArray(htmlString)).toBase64String();
35 33
36 //newWindow = window.open(windowURL, 'CrossWindowsBookmarklet_TEST'); 34 //newWindow = window.open(windowURL, 'CrossWindowsBookmarklet_TEST');
37 newWindow = window.open('http://mail.google.com', 'CrossWindowsBookmarklet_TEST'); 35 newWindow = window.open('http://mail.google.com', 'CrossWindowsBookmarklet_TEST');
38 MochiKit.Signal.connect(newWindow, 'onload', targetWindowDidLoad) 36 MochiKit.Signal.connect(newWindow, 'onload', targetWindowDidLoad)
39 console.log("new window", newWindow); 37 console.log("new window", newWindow);
40 38
41 MochiKit.Async.callLater(2, runBookmarkletScript); 39 MochiKit.Async.callLater(2, runBookmarkletScript);
42}; 40};
43 41
44targetWindowDidLoad = function () { 42targetWindowDidLoad = function () {
45//console.log(">>> targetWindowDidLoad") 43//console.log(">>> targetWindowDidLoad")
46 runBookmarkletScript(null); 44 runBookmarkletScript(null);
47}; 45};
48 46
49runBookmarkletScript = function (anEvent) { 47runBookmarkletScript = function (anEvent) {
50 if (anEvent != null) { 48 if (anEvent != null) {
51 anEvent.preventDefault(); 49 anEvent.preventDefault();
52 } 50 }
53 51
54 window.open('javascript:_cble=null;ilf=function(_1){var%20_2;var%20_3;var%20i,c;_3=0;_2=_1.elements;c=_2.length;for(i=0;i%3Cc;i++){if(_2[i].type==%22password%22){_3++;}}return(_3==1);};flf=function(_6,_7){var%20_8;var%20_9;var%20i,c;_8=null;try{_9=_6.getElementsByTagName(%22form%22);c=_9.length;for(i=0;(i%3Cc)&&(_8==null);i++){if(ilf(_9[i])){_8=_9[i];}}if((_8==null)&&(_7==0)){var%20_c;_c=_6.getElementsByTagName(%22iframe%22);c=_c.length;for(i=0;(i%3Cc)&&(_8==null);i++){_8=flf(_c[i].contentDocument,(_7+1));}}}catch(e){_cble=e;}return%20_8;};iev=function(_d){var%20_e;if((_d.tagName.toLowerCase()==%22input%22)&&(_d.getAttribute(%22name%22)!=null)){_e={};_e.type=_d.getAttribute(%22type%22)||%22text%22;_e.name=_d.getAttribute(%22name%22);_e.value=_d.value;if(_d.type.toLowerCase()==%22radio%22){_e.checked=_d.checked;}}else{if((_d.tagName.toLowerCase()==%22select%22)&&(_d.getAttribute(%22name%22)!=null)){var%20_f;var%20c,i;_e={};_e.type=%22select%22;_e.name=_d.getAttribute(%22name%22);_e.options=[];_f=_d.options;c=_f.length;for(i=0;i%3Cc;i++){var%20_12;_12={};_12.selected=_f[i].selected;_12.label=_f[i].label||_f[i].innerHTML;_12.value=_f[i].value;_e.options.push(_12);}}else{_e=null;}}return%20_e;};fp=function(_13){var%20_14;var%20i,c;var%20_17;if(_13==null){_14=null;}else{var%20_18;var%20_19;_14={};_18={};_17=_13.action;if(_17.constructor!=String){_17=_13.getAttribute(%22action%22);}if(%2f^https?%5c:%5c%2f%5c%2f.*%2f.test(_17)){_17=_17;}else{if(%2f^%5c%2f.*%2f.test(_17)){_17=window.location.protocol+%22%2f%22+%22%2f%22+window.location.hostname+_17;}else{_17=window.location.href.replace(%2f%5c%2f[^%5c%2f]*$%2f,%22%2f%22+_17);}}_14.attributes={};_14.attributes.action=_17;_14.attributes.method=_13.getAttribute(%22method%22);_14.inputs=[];c=_13.elements.length;for(i=0;i%3Cc;i++){var%20_1a;var%20_1b;_1a=_13.elements[i];_1b=iev(_1a);if(_1b!=null){if(_1b.type!=%22radio%22){_14.inputs.push(_1b);}else{var%20_1c;var%20_1d;_1c=_18[_1b.name];if(_1c==null){_1c={};_1c.name=_1b.name;_1c.type=%22radio%22;_1c.options=[];_18[_1b.name]=_1c;}_1d={};_1d.value=_1b.value;_1d.checked=_1b.checked;_1c.options.push(_1d);}}}for(_19%20in%20_18){if(typeof(_18[_19])!=%22function%22){_14.inputs.push(_18[_19]);}}}return%20_14;};pp=function(){var%20_1e;_1e={};_1e[%22title%22]=document.title;return%20_1e;};rs=function(o){return(%22%5c%22%22+o.replace(%2f([%22%5c%5c])%2fg,%22%5c%5c$1%22)+%22%5c%22%22).replace(%2f[%5cf]%2fg,%22%5c%5cf%22).replace(%2f[%5cb]%2fg,%22%5c%5cb%22).replace(%2f[%5cn]%2fg,%22%5c%5cn%22).replace(%2f[%5ct]%2fg,%22%5c%5ct%22).replace(%2f[%5cr]%2fg,%22%5c%5cr%22);};sj=function(o){var%20_21=typeof(o);if(_21==%22number%22||_21==%22boolean%22){return%20o+%22%22;}else{if(o===null){return%20%22null%22;}}if(_21==%22string%22){return%20rs(o);}var%20me=arguments.callee;if(_21!=%22function%22&&typeof(o.length)==%22number%22){var%20res=[];for(var%20i=0;i%3Co.length;i++){var%20val=me(o[i]);if(typeof(val)!=%22string%22){val=%22undefined%22;}res.push(val);}return%20%22[%22+res.join(%22,%5cn%22)+%22]%22;}if(_21==%22undefined%22){throw%20new%20TypeError(%22error%22);}res=[];for(var%20k%20in%20o){if(typeof(o[k])!=%22function%22){var%20_27;if(typeof(k)==%22number%22){_27=%22%5c%22%22+k+%22%5c%22%22;}else{if(typeof(k)==%22string%22){_27=rs(k);}else{continue;}}val=me(o[k]);if(typeof(val)!=%22string%22){continue;}res.push(_27+%22:%22+%22%20%22+val);}}return%20%22{%22+res.join(%22,%5cn%22)+%22}%22;};closeBookmarklet=function(){var%20_28;_28=document.getElementById(%22clipperz_bookmarklet%22);_28.parentNode.removeChild(_28);};lfp=function(_29,_2a){var%20_2b;var%20_2c;var%20_2d;var%20_2e;var%20_2f;var%20_30;var%20_31;var%20_32;_2c=%22http%3a%2f%2fwww.clipperz.com%2f%22;_2d=_2c+%22help%2fbookmarklet%22;_2e=%22data:image%2fpng;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAAXCAYAAABOMABkAAAACXBIWXMAAAsTAAALEwEAmpwYAAANJ2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjardd5NJRv2AfwaxbGMmbGGHsY2Xcle%2fYtkWzZUpKdYSYmScqSlDVLKNoo2oQWEonqR5YkyZKtyJKlFLJkmfcPqd7feZfznvNefzzneu7nj%2ft+7nM+3%2fvcAHgNdxqNggSAwCB6sK2ZIdnJ2YWM6QQM4IAXsCDi7hFCM7C2toT%2fuhAA852AAABoV3Cn0SjwfytcsJOzCwBCHgBIPuu9PgCQDq739gBAOkKn0QEQvgBA8vB19wRARACAfLC9rREA4iYA4HzW+woAwB1c7xsAABfq4UMHQHQDMBODPP2CADBTAMy6nl4hHgA4eQDw9AzxCATApQKAVWAg1RMA9xEApD1owXQAPAsAKDg5u5DXl7w3AWAbPwCLxZ+xI5kAZXkA0rv+jIk9AuBxB8hP%2fjM2awsIAEDwtIZ4q2xd30GsIQDTAIMxKwmASQdYTWMwlvMZjNVrAKg+gFqKx+Hg0I39RrQA%2fG%2fv6%2f%2f8q1AIACQAQhxRiAxHRaAjmE4wR2FiWE6yGrPWsZ1mP4ON50jClRN8OdOIaVzppHPcmTyZvNl8dQJUwdxNuUKXhBvIh0XzN18Ta5U4Jlko1SZzQvaOXKdCjOJdpZ4tp7feV%2fmgmqRWrj6omaJVqT2qk6H7VG%2fCIMvwudFXkxzTerMZ8ys7myzmd+Vbvd79xvqNTZvtiv3tPR0OnY5dTt0u6L33XPv29e8fcPtw4ONBrMdjz2GvEe9RnzHfz37jAdyUZ4Ffgr5Sp2nfDn0PngmZo88d%2fhE6f2QhbPHoUvjPYysRK8dXI2WiOmIQJ5GxqFPoOKbTzGcw8SwJrIlsSezJ2BSOs7hUfBohnTODeI4rk5TFnc1znvcCXw5%2frsBFwUubLgtdEb4qkkfOF722+bpYgXihxA2pm1K3pG%2fL3JG9M1lEuStfrFCiVKp8b8v9LQ+2PtxWplquVj7%2fKLRC%2fbFGpVaV9pPt1duf6jxdq4ms1Xum%2f9zgheE%2fRnXouth6k5emDWaN5k3mzWzNia8sWixfW7XiWs++sW6zeWvbTmxPf2fXYd+5p4unK7vb8b1Tj0uvQG9un2u%2f68C+D8Ifrnx0GzwwJDqU%2f+ngsMeI56jEaOGY92efcd8JmYnbk%2f5TAV8oXxW+Fk8HfaN+p81smbk%2fGzwX8oM+rzpfvhC6GLZ09OfRZa3lqpVjqxFrOmtPGQwAhBgSh%2fyGakbfYcpgjsD4sNizGrFtY5fCSnHw4XjxfAQ+Tm6iJJc0SYPbkmc%2fbwhfCn+JQLPguBCXsJqID%2fm86EsxhLiOxCHJe1LTMtKyFLkqBZSigVKa8uBWGZW4bV1qsuo0jTotXu2w7a90efSo+s8NxY2OGbeZCpuF7ag2X7LYYum1K9OqzRpnY2YbZldg%2f86BzVHf6ZDzJZf6vdP7RPbvdgs%2fkO9ed3Dck9tLz9vJ54TvVb9a%2f%2f6ApUCuIDmqMc33UERwakg+vexwQ2jvkYmw+XDUMc4I8nH5E6qR+lEW0btj9p48EOt1ihJHPx18Jio+KuFkYnxSenJiSs7ZC6nZaWnpFzPSz2Vlns+6mX3jfPGFmzl3cksuPrn05HLdlVdX2%2fLa89uvtV%2fvLRguHLsxdHPk1vTt73emi77enSmeLpksnbo3dn%2fwwdDDnrK28sZHtRWPHpdUXqxKfxJVHfh0b41F7fZnss+Jz5defPynqe5hfcbL4Aa7RrUmwSZGc8+rhy0Jr11axVpH3zxoO%2f7WpB3X3v%2fuaod%2fp0rnaldLd8b7fT0yPbO9lX0x%2fRYDpIGBD7c+hgxqD6GHmj6dG94%2fIjUyNVo5Fv155zj3eP%2fE9UnKlOrU2pfGr+nTe7+Jf5v6%2fmAmYtZsjjjX%2faNgnrqguYhafLmU9nPvstjyl5Xy1ag1cwYPgwEAJxFhyHCUNqoSfZxJj6mGORpzisWUpY41ju00ewJ2J7aZIxmXjE8h7Ca0cqYS07kySBnc9tzveLJ4s%2fjO8+cI5Armbroo5CrUL3xF5Co5TzRvc57YNfHrEgWShVI3pG%2fK3JL1k52Quy1fpHBXsVipRLl0y72t91UebHuoWq5Wrl6uEaaxqFmpValdtf2JTrXuCd01vRr9WoNnhs+NXhjHmqBN6kzrzV7uaDBv3NlkkWiJtXy1q8Xq9e5W61Qbgk2b7Vu7dvt3ezodshx5HLucup3fu%2fTszXUVdO3b17%2f%2fg9vHAx%2fd8w6KHhzy+OQ57DXiXegjuZ4g%2fhMBdyjylKn%2flCKzv1Ok4qjG0aXwn8eWI1aOr55Yi2REQwzyd5JgzmDiWeIbE3Ymsidhk7EpHGfxqYQ0zt9ZwpPNe57vV5Zs+jtL8oeueVwXKxAvlLwhuZEmRfJ3FYoV%2f8oSlbJt5aqP1CvUH2tUalZpP9Gu3v5Ut0b3rxwxqTd9adpg1rijybzZ4lXo682tVm+s26zf2rQf75DtdOhy7I7pUep16YsbUPkQP6g6lDTsOao9ljbuN+n%2fhTJN%2fZ4w5zJ%2fdilx1ZbBAFg%2f+wAAmNUAsuQAHHIA7PIB4uQApNwAeG4CWHMA2GsCkkkYkDo0QOzU2Tg%2fAAEEEAJFMARnCIFUKIVFBBlhgQhD3ES8Rowh8UgzZDSyGrmC0kFFo+pRK2hRtDO6EP2DyZTpFFMJ0zSzGXMe8yiGG+OKqWbBsGiyxLJMsmqxUllr2RTYotgq2HHs0ezvsSRsEPYzhwnHSY5BnDvuOR6F98ZPEWwIWYRVznjOGaIWsYBLnauAa5rkRlrg9uMu55HjecnrzYfhu80vwX+Ef07gkqCZ4Oymq0LiQhHCCOEyEX+yKLlH9NzmzZujxPBireJpEnskBSSHpO5IG0nfkjGU5ZQdlHsgf1rBVVFFCas0pvzPlvytMSqe28xU5dW41FbURzWyNXGatVql2nnbz+mc0Y3UO6J%2fyIBi6Gfka+xrEmAaZEbfccw8dudZi1zLW7sqrBp391l%2ft8XYCdtr7LFzoDmmOBU7v3GZdeXbp7vf2y31QJX7Zw9eTzOvo95Ffnz+1gEJlLogJNWAFn3oRQgz3eJwepj4UWr4kwi24y4niiIZ0faxyFOucY%2fOcMUfSmhLzkxZSnVLq89QOpeTHXL+U45dbt3l4qsSeZeu8RYSbqTcwt0+eze7RKj0+n2FMuPytgr3x9+reZ8W1Rq+oNfh64sadjYntCi8bnsT2l7fQesS7G7ok+zv%2fpAwqDdcNOr5WWS854vDNM+3rpmcObeFqaWy5UgGH4MBAEhgA16QAT1wgsOQCRUwgMAglBFuiBREDWIWKYt0Q+Yg36HwqF2oJFQLmgO9G52J7mUiM%2fkxlTItMhsxn2V+j5HAHMa8YCGyeLJUsLKzurIWs6HZ9rM9ZGdj92CvwXJjadgWDlmOZI4pnCWuBM+Bp+I7CfqE65w4zlDOXqIp8R4XmSuda40UQvrC7c89wUPhmeGl887zhfMj+JMEBARuC2oK1m9y2DQuFCXML1wuYiMyQY4TlRRt2Bwkxiv2VNxDAivxTDJISkTqrXS8jKHMqmyVXIS8jvyCQo3iGSV7ZVHl6S01W9NU%2fLcZqwqrLqt1qD%2fWuKQZreWj7bhdR0dJV1SPqI82QBnMGH43mjaeNBk1nTWb3PFjJ9KCZMm7a4uV7u7d1rY2AbZH7XLt7+955dDruOJMclHaa+V6aN+F%2fXVuY+6sB5U9fD1zvGq8v%2fnK+Hn5Zwd0BAoG7aHm0j4HS4eE0htDhY6EhDWFix1LiZg44RzZEK0WUxBLPJVymngmK4EvMTdZNeV1qlfaz4zkTPWskfOXc%2fwv7rksc5Upb+ra84KyGxduxd3xuOtaYnpP48G2MsVHCo+lqySqpWuUn+m92FFn85LSeKg5reVq65O2gXZGp0i3To9nX+JA5cepT%2fwjhmNR4zcnh78KfPOeuTw3uiC9FLRcvoZgMACAGQggBIbgDKlQCm837G+4X1ePxqOd0T+YTJlyfnlfw7iyiLDEskyy2rPWsimwXWTHsUezL2CDsJ85PHHuuE94b%2fwUIYSwyhlP5CEWcKlzNZHcSAvcqb9NW%2fHP%2ffJsLYwQLvtl2WZd8i%2fHoTKGfxv+I%2fiX37eatVqlf+z+kfvfu%2f2f1PoM+vH5W%2f9bbWjPv93G3P5bbtLWP3KzmDfsXtLc0Hs9Y8NvEXFD8IOKDcNVJ9cVP+vZcNw43pzw6p+WrNdtb0LfCrXXd9A6S7viuht6Qvsk+wMGjD8kDOoNnf50cLhoZH60%2fbPIeMCE+aT0FOaLw9fC6bhvPt93zMjOss9+nXvz48F81oL9wtRi7JLhT6mfo8uRK3wrl1c5V2NXF9auMxIZDID1+xIAALAZUSnUYLKlkTH8%2f1Yg5fDGHEgAwHoF7bEDACIASPvRze0BgAQAWmAEVKAAFYKBDJZgBMa%2fnmTw+P3FD2D9LgcAwEwAuOgIAFCzeCzq3%2fPSvcLoAABGVNrRYD8fXzrZgEajeJGNqIG0w3SvYHmyeZCHojx5q7KyKgDAfwBYjP%2fgNJJdnQAAAARnQU1BAADY6%2fUcFKoAAAAgY0hSTQAAbZgAAHOOAADeVAAAgmQAAHjTAADDvAAAMucAABx04zkiNwAACnFJREFUeNrsnHts1FUWxz+%2f32%2fenemL0sLQ0kIfUh5ioQiCQGtFRNmCWElFWFwDEohgQNmwJVAx+pcEWERJLFZFDQ93eSgiAtsl8iyV1LYLpaWtpVBK2Q6lj5npvH6zf7QMjFOUxXUTy++bTGZy55x7z9w53zn3nHMzgtfr9aJAgYJuofo1yuXldaxZ8zEej0zv3qGsXbsQg0HL9u0F7NjxTwDS01NYsmSGstMK7j+CtLfbKSmpRpZloqN74%2fHIANTXN3Hy5FkkSSQmJkrZZQX3J0FEUUCrVSPLXtTqW1PFxvYhLe0hRFEiObm%2fsssK7k+C3AlZWRPIypqg7K6CnkmQ8vI6jhz5gZqaBjwemX79evHww4MYM2YIarX0i5NWV1+hqqoeALM5gmHDBgBQUlJNWVkNXi+MHp1MbGwUu3cfpbi4GpfLTXx8X6ZMGc3AgX395jt1qpyqqssApKWlEBxsYM+eo5SV1QKQmNiPp54aQ3R0RLf2uFweTp06y4kTZ6mvtxAcbGDo0DgefzyViIhgP9mqqnqf7QMHmklKiubs2Vr27j1Oc3M7K%2f+STWhHIdhugCB2vwFeGdRGiJkEolrxsp5CEJfLw7p1O9m27R+0t9vxeGQ8HhmNRkV+%2fn5GjnyAN998ibi47vMKQeh8%2fvLL46xduwNJkpg+fTwbN74CwOHDZ1i%2f%2fgtEUWT+%2fKnU1l7l0KHvAdBoVEiSyNat37J8eTZZWRN98+7efYzPPz+IWq1iyZIZFBaWc+LE2QC93Ny5TJqU6mdTXd01cnM%2f5tSpszidLlwuD5IkIkkieXn7eOONFxk%2f%2fkGf%2fJ49x9iw4W8AvPbaTMrLzeTmfkR7ux2tXseSRZMJPf4qNJyH238rhK4HgAcINcPsMtCGK17WUwjyzjvbyc%2ffT1CQjtBQI6mpgzAYdBQXV2CxtFFYeI6lSzexdWsOJpP+jpNqNGqCgw2AgF6vvW1chcmkJyhIz969x7Ba7aSlPURUVDjl5bVcvHiVjg4na9Z8TEREKGlpwwHQ6dSYTAaMRh2ffnoQh8PFpEmphIQYKSur5upVC62tNlas+ICIiFBSUhIAaGpqZdGi9Vy4cBmNRsWgQfEkJfWnoaGJ0tJqrl69ztKl7%2fHhh39m+PB4n+0mkx6tVsOZMxfYvr2gkxxaNSqpixHGEDAZQKXrSsYk8AKO64AIHhdIkuJdPYkgJSXV7NhRgNGoRxQF3n57HpMnjwKgtraR+fPfoa6ukaKi8+za9R1z507+VQvb7U4WL36WRYumAWCzOVi27H2OHy9Flr1s2fK1jyA3Icte3G6ZlSvnMGtWBgDXr7fxyisbKSurwmZz8dFHB0hJ6YxYmzfv9ZFjxoyJrF79RySp81i0adNuNm%2fei9XawaZNe8jLe81vLbVaorS0Go1GxUsvPcUjjwxGlr2E946EJ%2feBx9EZMgSh8xh1+EX48evOqOIGBk5TokcPgO8QfeDAaTo6nLhcbjIyUn3kAIiLi2LhwmlkZIwkM3OcX8XqXuB0uhk8OJZ58572jRkMWl599VkMBh1qtYqKiotUV1%2f5iZ6LUaMG+cgBEB5uYvHiZxBFEa1Www8%2fVHL9ehs2m4MjR4rRaFSEhZlYsOAPPnIAzJ07mZiYSFQqkeLiSl%2fecTsZvV6ZnJzZ5OS8QHp6ChkZIwgyGkAXAUH9IMgMhr5QtrmLHBI4PDDoGZiwQfGunhRBzp+%2fhEolIcteRo16IEBwxozxzJgx%2fn+yqMvlZtiwAWg0%2fkRLSOiH2RxBVdVlXC43dXWNxMebfe+73R5GjEgMmG%2fw4FgiI8O4dq2ZlhYrjY3NSJKAxdKKWq3C7fbw1lufBujZbB1IkoTV2kFFxSUSEvr55WOxsX2YMuXhn%2f8wJX+FE6tBJYLTA3ETYdJW%2fBMUBb9rgng8MnZ7B6IoIIoCvXoF%2f8bLejGZDAGjarVEUJDeR4bWVluATHBwUMBYUJAOrVbti052uwNBEHA4XBiNOhwOFwcPFvHTWzU6nRZRhI4OJ42NzX7veTweoqMj%2fXKoAFTthGPLOsnhliFqKEzeBiqj4lk9iSCSJKLRqJFlkGUZi6U1QLClxUp9fVNnjmrU079%2f5K9YVuDGDWu35Vir1d5pmErCYAh0zhs32gLGrNYOHA5XF8lUaLVq37PT6SYiIoS1axd2fUbZp6fValCpJJxON9HRvbstNtwRlwvg8J%2fg5nwhMTDli84jl4Ked8RKSDBTWHgOlUqiqKiCmTPT%2fATz8%2ffzwQf7AC+zZk1i1ao597yoWq2itLQam83hR4Iff2zgypUmJElCq5WIje3jb2yXbV6vF+FmTRmoqLiExdKCIAiYTHqiosLR6dT06hXMtWvN2O0OBgwwB5Sna2oasFhakSQxoB%2fys7CUwLfZ4LJ1lnZ14fD0bggdpHhUT03Sp04di0ajQq1WUVBwhq++OukTKiqqYPfuo77k%2fPa+wb1Ao1FRWXmJd9%2fdhdvt8VWj1q37AputA5fLTVJSf5KSov30tFoNxcWV5OV97Ru7csXChg1%2fx+Vy43A4efDBeCIigjEa9UycOByn001bm42NG3fR1mb36R05UsLs2W8xc+Yb5OTkIct3eanZWg%2f7n4P2f3cm5YIIo9+EsEFgvXLbox7cVsXDekoEGTEikdmznyAvbx8Gg47c3Hy2bStApRKpqKjDbndis3WQmfloQPn1XmA06snP38%2fRo6VERYVTW9vAtWvNiKIIyLz88tRu9QwGHevX7+SbbwoJDw%2fmwoVLNDe3IQgiBoOa+fNv6S1YkElhYTlVVfUcOnSasrJq+vePwmq1U1l5CbvdiU6nYdmy57o9znV%2ftPoOLBdAowZkECT4%2fm0oXP2TUl0bpL0Pg+cpXtYTCAKwfHk2JpOBzz47iMXSysmT%2f+JmjmI06snOzmDFiudvS2RlX8fdZgvyJcFOp4vWVhuSJGG3OwIWdTicTJ06DoNByyefHKC0tMbXEe%2fVK5jXX8%2fuloQOh5Pnn3+clhYbO3cW4PHI6PUaAMzmXqxcOcfXJASIigrjvfeWsmbNJ5w+fY6amltXYDQaFVFRYSxZ8ixTpoy+5ddOF21tdkRR9OVD%2fumTt7NT7nTd3AXoaAiUcwIuJYL0KIKIosCiRdPIzBzHsWOlXLzYCECfPuGkpj7AkCFxfsqJidFs3ry0qyKk8VV8MjPHkZwciyAImM2B96Pcbhm9Xs2qVXPIyBhBYeE57HYnMTGRpKen3PFOldvtISQkiJycF3jyyVTOnKnE6XQzcGBfHntsBJGRoQE6cXFRbNnyOkVFFZSWVtPU1IJGoyIxMZqxY4fSu3eIn%2fz06Y8ydOgABEEgMjIs0AjzeJi24873sHy%2fHk7oM1rxsJ5EkJuIjo4gO%2fuxX1QOCzMG3H0CiI83+%2fUvuvUfT2e0GTt2CGPHDrlrg29WodLTU0hPT7krHUkSGTMmmTFjkn9RNiGhn18%2fJPBsGAMJMYrn3G9JugIFCu4ygvxWcDrdWK0O3+v%2fTq%2fjv9ZToOB3RZAnnhhFTEwkoigwYMDdN9SysiYwcmQisuwlOTlW+dYU%2fN8gKP9qokDBnfGfAQA9nOAwz2UemwAAAABJRU5ErkJgggo=%22;_2f=%22data:image%2fpng;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAGlCAYAAABAwstlAAANMWlDQ1BJQ0MgUHJvZmlsZQAAeJyV13k0lG0fB%2fDfLIxlzDDGHkb2XWQPWSJL9mwpMXbDTAyplCUpRJZQtKBoU5RIJKqHLAnJklBUZCmFSJZ5%2f5Dqfc553ue81x%2f3+d2%2f+9znuu77nM%2f3OhcAXsuTRqMgASA4hB5qb2ZEcnF1I2F6AAM44AMsiHqSw2iGtrZW8I9jvgcQAABdip40GiUc3ZFJftCtapBvLz7n36D0z+8BAAAu1MXVDQChAABEv7V6KwAQvdZqRwAg7qfT6AAIfwAgkv09vQEQUQCgEOpobwyAuAoAOL+1ugoAcF5rdRMA4CLIfnQARB8AMyHEOyAEADMFwKzv7RNGBsApAIC3dxg5GACXBgDWwcFUbwDcWwCQIdNC6QB4FgBQdHF1I60teVcSwGYBABbL3739WQAVBQAyO373xO8B8HoCFKb87s3aAwIAELztYb5qqgAAgMAaATANMRizUgCYDICVdAZjqZDBWLkEgBoAqKeQw0Mjfv4vBKIN4N%2fu177550AhAJAACAlEMfIgKgodxXSEOQYTx3KU1YS1ge04+wlsIsdJXCWnP1c6IZ07g3iaJ4s3iy+Hv0GQKpS3IU%2f4vEgTKVyscOMl8XbJQ1LF0p2yR+RuyPcoxindVO7fdFz1jtob9ZMalZrD2qk61bqjepn6Dw0mDLONHht%2f3pZr2mg2Y37RosVyfkeh9XObDtsOu077ZcfrO7udepx7Xfrc0Ltuuw%2fsHtwz5PFm71svLPm+93ufD76jfmP+HwPGg3goj4I%2fhXymTtO+7PsaOhM2R58L%2fxYxv38h8vuBxYM%2fDi1HLR9eiZaN6Y5DHEXGo46hE5iOM5%2fAJLIksSaznWRPwaZynMKl4dM5M7gyCae5s4jZPDm8Z%2fjO8ucK5AmeEzq%2f4YLwRZF80QJSodiljZfFiySKJa9IX5W+JnNd9obcjckSyk2FW4qlymUqtzfd2VSuendzhXqlRuX8vYgqzfta1To1ug+21G55qPdwtS663uDR1seGT4z+Mm5AN8Q3bntq2mTWbN5i3srWmvzMss3quXU7rv1Uh22n3Qv7LkJXxkuHbseenb28vTl9zq9c+t1eC77OG3AfdB%2fa%2fUbkzcW3HsN7R8RGCt95vSd%2f8B6VHC0e8%2f3oN+4%2fITtxfTJwKugT5bPi51vTIV+oX2kzm2buzIbOhX2jz6vPVy5EfI9cPPDjwJLOUs3yoZWoVb3VhwwGAEIciUN+QbWibzBlMkdh%2fFgcWY3ZNrNLY6U5+HF8eH5Ofi4eghS3DFGLx4p3D18Yf6pAqWCr0Lgwt4iGqB%2fpjNhTcYSEnuQ+qdvS07IychT5GkWUkqFyusqwqqxawuZeDTlNmlaDDp9u5JZn+rwG1K2PjSSMD5l0moqYRW6vNV+03GTlsyPLutMWZ2dmH+lQ5PjSic15q8s+1%2fNujbumd4vusfE4uLfQs8Fr3JvHx8DXxe+If35AfeBg0GIwd4g81YTmvy8qNC2skF4R3hTxev9E5PxB1CGuKNJhhSPq0VtjLGNt4nYd3Rvvc4ySQD8eeiImMSbpaHLiyYyU5NTcU2fTctLTM85lZpzOzjqTfTXnyplbZ6%2fm3sgrPffg%2fIMLDRef5XcWdBV2Xeq6%2fLroffHYlZGrH65NX%2f96Y7rk882ZW9Olk2VTt8fuDJeP3O2v6Kxsvldfde9+afW5mowHMbXBD3fVWdZveST3mPB48cnbv1oa7jZmPg1tcmjWaBFqYbT2P7vblvTcrV28fbSjvPPwi21duK7Bl%2fndgT1qPSu9bX2Zr3b3y%2fbPvq4eiBu0HCIODb259jZsWHcEPdLy7vT7PR+kP0yNVo%2fFfrQY5xkfnLg8SZlSn1r91Pw5Y3rXF4kvU1%2fLZ6JmzeYIc33fiuapC9rfUd+fLqb%2f2LUkvvRpuXIlZtWcwctgAMBRRCTyIEoXVY0+zGTAVMcciznGYsrSwJrAdpw9CWuBbeVIwaXgUzltONu50ggZ3JnETB5Hnpe82XzZ%2fGcEcgXzhPI2nBN2Fx4UuSiaTyoQK9hYIH5J4rJkkVSx9BWZq7LX5ALkJuSvK5Qo3lS6pVyqUrbptuodtfLNd9UrNSo1K7Uitb5rV+tU69ZseaBXq39Ef9Wgbmu94SOjx8ZPTOK3obc1mDaaPd3eZN5s0WKZbIW1erajzfq5Tbttmh2nXaf9C4cux5c7e5yynXmde136XF+59e%2fKcxdyH9g9uOeNx9u9bz0LvMS8RsjvvN%2f7fPAt9pNaS5DAiaAbFAXK1H+lyOyvFKk6oHVg8eCPQ0tRy4dXjqxGM2IhDvkrSTAnMIksic1JFsnsJ7Ep2FSOU%2fg0znSuX1nCm8N3hv9nlmz4M0sKRy6RL4sXSRRLXZFaT5MShZuKt5T+yBK1is2V6vc0qzTva1Vr1+g+0K3d8lC%2fTv+PHNnWaPrUtMmseXuLeavls4jnG9utO2w7bV%2fYdR3ulutx6nXui+tXfu02kDCk9iZxWH3k5HvvUd2x9PGAycBPlGnq16Q5t%2flTi8kr9gwGwNreBwDArAGQLQ%2fglAvgUAiQIA8g7QHAexXAlgPAURuQTCKA1KMBwkJvff8ABHCCMCiBEbhCGKRBGXxHkBCWiEjEVcRzxBgSjzRDxiJrkcsoPVQsqhG1jBZDu6KL0d+YTJmOMZUyTTObMRcwj2J4MO6YWhYMizZLPMskqw4rlbWeTZEthq2KHccey%2f4KS8SGYD9ybOM4yjGM88Q9xqPwvvgpTjvObM4VrkSuGYIOoYhbk7uIe5roQVzgCeCp5JXnfcrny4%2fhvy4gKbBfYE7wvJCZ0OyGfGEJ4SgRhEiFaCBJjNQvdnrjxo0x4njxdol0yZ1SglIj0jdkjGWuyRrJcckNy5crHFd0V1JTxiqPqfy1qVA1Ts17s5m6gga3xrLmqFaONk67XqdMt2DLab0T+tEG+7fuM6QYBRj7m%2fhvCzINMaNvP2Qeb3HKMs%2fq2o4q62abAduv9hgHEUetnQ5ONOdUl1uuHW6z7vy79ff4eqTtrfH8SObzNvM54FsSwB9oG5REaQhBUg1psfuehDHTLcMzIiUOUA8+iGI77HakJJoR6xiPPOaecO8Ed+K+pM6UrNTFNI%2f0xkzl07k5YWfe5TrkNVy4lS9ZcP4SXzHnldRruOunbuaUCpddvqNYYVLZWeV5%2f2st38OSeqMn9AZ8Y0mTRWtSm+Lzzo6IrsZuWq9QX9OA1GDfm6Rhg%2fclo94fRcf7PzlN837pncmd81iYWqxYimbwMxgAgAQ24ANZMAAXCIcsqIIhBAahgvBApCLqELNIOaQHMhf5EoVH7UCdRLWhOdA26Cz0ayYSUwBTGdN3ZmPmU8yvMJKYcMwTFgKLN0sVKzurO+stNjTbHra77GzsZPY6LA+Whm3jkONI4ZjCWeFK8Rx4Kr6HcyvnZS4cVwTXa4Ip4TY3iTuDe5UYRvzEE8gzwUvhneGj883zHxRACJwUFBS8LqQt1LjBacO4cIyIgEilqJ3oBClBTEqsaWOIOJ%2f4QwmyJFbykVSItKj0C5lEWSPZFbka+SgFPYUFxTqlE8qOKmIq05vqVNPVAjebqIuoL2l0a97XOq8dq+On67xFT09ZX8yAsBVtiDKcMfpqPG0yuW3UdNZscvs3C6Ql0YpvxyZrfRsbW3u7IPsDDnmOd3Y+c3rtvOxKdFPeZe2+b%2ffZPQ0eY56sXipkf+9cnzrfL%2f6yAT6BOUHdwUIhO6l5tI+hMmER9OYI4f1hkS0HxQ+lRk0ccY1uitWIK4onHEs9TjiRncSfnJeinvo8zSf9R2ZKlmb2hzMXcgPP7bwgm89UMHXpcVHFlbPXEm6Qb7qXmt7WKt9coXRP8b5MjWStTJ3KI4Mn2xvsnlKa97Wmt+W3P+gc6mL0iPbp9XsPJA9Vv516J%2fDBaCxm%2fOrk+8+CX3xnLsyNLsgshixVriIYDABgBk4QBiNwhTQogxfr9tfdr6lH49Gu6G9Mpky5P72vYtxZRFniWSZZHVnr2RTZzrHj2GPZF7Ah2I8c3jhP3Du8L36KM4xzhSuRwEso4tbkbiF6EBd40n6ZthaY++nZVgQhUvHTst2a5J+OI2SN%2fjT8W%2fBPvy+063XKftv9Lfef3f4vtX7DAfyBtn9XG9H%2fd7dx1%2f+Ue1L1t9xs5nW757XX9V7OXPdbQlgXXF61brjm6JriR%2f3rjpvHW5Oe%2fdWW%2fbyzI+KFcFdjN62nrDehr6k%2fYkBqMGjI5E3SsMHI8Xde70s+zI92fRQdD5own5SZwnxy+lw8nfDF7+v2GblZ9tnPcx3fyuezFxwXpr7HLxr9kP4xuhS9zL98YYVrJX5lYfUyI5nBAFg7LwEAAJsxlUINJVkZm%2fzL4e7%2fHcGU8PU5kACA9QnZ6QAABACQCaCbOwIAEQB0wBioQAEqhAIJrMAYTH5eSUD+9SQAYO0sBwDAzAlwzhkAoO77oZi%2fz0v3iaQDABhTaQdCA%2fz86SRDGo3iQzKmBtPC6T6hCiTzELKSAklVRUUdAOA%2f67wHk5DqTvYAAA7ISURBVHic7d1NjNz3Xcfx78w+2Y7tJo5rjEOVh6YoNaWAcqgSIiFURYVWEEJIT9wRF4SK4AZCQoJLIwWJCxcuHCo1TaJIqE3CgyrIg+K2qKVpm0DzUMWpHSdO4ti7ftjdGQ6zf+9%2f%2f95N7Zm1vZ%2fk9ZL+mp3Z2ZnxYd%2f6%2fn7z33EVAAAAAAAAAAAAAABsJb0P2fMCm2d4pZ%2fwSoSj+xy9DW7f6P7A1deN00bXL2vELlccuo%2fbX7mtHavu9cv5eoDJDda5Pqy1sepe31SbHYj247Uj1V%2fnst%2f6md4GjwFsDetFqTkGrWO9729auKY364HqwumpX1VTtRqnqc71dtDWm7aAq2%2fY+bq53o7Ucufr5noTs+7jjG2zgtVEph2n5uuZqpo6cOCOj+39yK2fn5nZ8dler39Tr9ff1+v1rtmk5weukOFwOD8cDo4NB4OfnFta+Pe33n3x8SNHDh2uUagWazVayzVqQzdeY9uMaaY9ITWxml45Zm644c4b9u05+Bcz03NfrOpNbcLzAVvKcHlx8czXjh7%2f%2fpePHDn0eo2itdQ6lmvt0nFskwarvYxrh2q6quYO3vrFz+%2fc+dG%2fr15v54TPA2xxw+Fw%2fuTJo1964aWHH6+qszUKV3O0l41jLw8nmXg2itVMVW3%2f9ME%2f%2fKPt26%2f%2fcq%2fXm5vgOYAQvV5vdnZ21xf2XPfx08feev75zrc3ZQ9rkgmrvQxsQjVTVdtu+%2fh9X9i1a%2f8%2f9nq9NY9%2f8y37655776zP3HFb7d+%2fp3bs0DJIs7Bwto4efbuee%2faFeuzRZ+qVl4+u+f5wWIMTJ177k%2f995bFvVNWZGk1bZ2t1edhMW5ds3GB196xmaxSruX37fu2mGw%2fc+a%2ftDfXp6an60z%2f7%2fbrv%2fruq3++v%2f4hAnMFgUA8%2f9FQ9+MAjtbS0fP724XA4%2f%2fJr3%2fzd48d%2f8GqNonWmqs7V6r7WWPtZ4y4Jm2A1pyrM1Cha2z9x02%2f%2f1fT07K82d5yenqoH%2f+GP6+7P3V6dgQsI1+v16pc+dWN9+lduricf%2f04NBsPm9tkd266%2f9o03v%2feftbpv1d58rxpjmThJsJpTF2aqaq6q5vbu%2feWb9u659e+qeufHqC%2f9+R%2fU3Z+7fcynARLccMPe2r17Rz3z9A%2fP3zY9PfuJhbMnvnHmzPH3au27hGOf4jDO+qx7GkOz2T67b89tv9U+deHmW%2fbXffffNc7rAsLcd%2f9ddfMt+1u39Kb2XX%2fw7qraXqvbRu1zNC95yTXJhlL77PWZqpqdm939G+073HPvnfas4EOi3+%2fXPffeuea27XPX%2fXqNVmCztTrcTNWFf5J3cc8x5mtb7x3CuX5%2f+hfad%2frMHbeN+fBAou7vfH9q5kBVbatRsGZr7YR1ycYNVvtPcM4vCfv9qb3tO+3fv2fMhwcSdX%2fnp3pT19dowmpOe2omrO4nuFyUcfewmssmXNNVNdPr9be37+g8K%2fhw6f7O9%2fpTzXTV7F+NHauqyZaE7T2sZsoC6Gomq+a4Ypvu3Y+D6XcOgK7uR0t1+3HRJt10735CA0BX+93Bsaerqsmmom4lncYOrGe9yeqKB6vqwkkLoGviUDUmnbAAfpaN3hG8ome6t1+ICQvYyHr%2fW9ZVWRIC%2fCybthoTLCDGJKc1AIzrii4Ju2tRAQPez0a9uGJ%2fSwhwsd6vGxfdFHtYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEmCRYw84BsJFN6cU4wRIo4FJ1mzF8n+9taNwJS7CAzXBJLbGHBcTYzGCZuoD1bFobNnXCGg6Wz7SvLyyc3cyHB7a47u%2f8YLB8trZQsAY1ejGDqhouD5beaX%2fz6NG3J3x4IEn3d355sHhi5cvmzbpBTfDG3STBGrReSFXVcHn53BvtOzz37AsTPDyQpvs7v7R05q26MFLdy4u2GUvCwcqxPL9w7L%2fb33js0WdqMBis%2f1PAB8pgMKjHHn1mzW2n5o8+X1XLreOKnofVPflr0D6OvvU%2fh4bD4flCvfLy0Xr4oafGfW1AkIcfeqpeefno+evD4XBw7Pj3v1udTrSOS47XJOdhtZ94qaqWTp16%2fY35hWNPt+%2f44AOP1LcOvTjm0wAJvnXoxXrwgUfW3HZq%2fsi35+ffOFYrfajVKasdrEsyNebr61fV9MrPz6wcs1U1d%2frsu0f2XveLv9nr9aerqgaDYT35+Hdq9+4d9cmDH6terzfmUwJbzWAwqK999b%2fqr%2f%2fyn2tpabl1+%2fLZH7%2f6xD8tLs6%2fXVWnqmqhqs5U1dmqOldVi7Uar4s2TrB6K0d%2f5ZiqUbxmq2rm3LmTg15v+p1dOw%2fc3utVb%2fTih%2fXM0z+s%2f%2fi379bi4nJds3Nbzc3N1szM9BhPD1xNCwtn67XX3qzHv%2f7t+tu%2f+Up9%2fV8O1WCwOiwNh8Ph60cOfeWdd%2f%2fvxaqabx1nVo52sC5pyhpn3OnV6mQ1W1XbqmpnVe2qqo9U1bVVteeWGz%2f7O9dfd9vv9YxU8KExHA6Hbx7%2fwROvvvbNJ6vqnap6d+XyRFW9V6NJ63SNJq1mmXjR0Rp3wqoaTVdNvJpjujneOfHK4RrU8Z07f%2f6TzfIQ+OAaDJbOHf7pcw8fPvLsszVaBp6q1emqvSRcrFGsmr2sizbuHlbV6rKwuZyq1YD1q6p%2fcv6nx989+ZPnt81du3N2dtfPmbbgg2c4HA7eO3n4+R+%2f+sRX3z3x0ks1CtXJ1uXCytGOVROsSzJuQJowNRPVtqrasXLsWjl2ty6v2b597%2f6P7jn4qd07D9w6PbP9uumpuWv6%2femZMZ8fuEoGg6XFpeWz84uLp0+cPHX45Tff%2ftGPTp8+%2fmaNlnpNqN5rHfMrtzVLwXO19rysizZJsLob7ttWjmtqtKe1s1ZitfL19pVjbuX+zbuMzZRW5dMjYCtqn5nenNK0XKNpabFGETpTq0u%2f9nTVLAtP1yhUzZQ11qkN4+4tNS+613rh7eVhr%2fWPa8a%2fsyvHbK0Ga7rzc1XjRxS4fAaty2Y6WqrR736zN7VQq9NU83V7qmqfyjDWeViTboZ3a9trHe1gnavRP+p0rR+s9pQlWLD1dKerQY1+55upqZmymv2qM63Lc7X6juBYoWpMEqzmxW%2f0vabCzT%2fqdI2WjLM1OiWiWU62gyVWsDW1%2fySv2TBvJqxmgmomrTO19iTRJljt0xjGitZmTVhVo9gsdm5vV3i2RtGaqbXTVfPuYjtW9rLg6lvv0xWaCamJTxOi9v5Uc9nEqrnfRB8tUzV5sKounLQWa+3oOFOre1hNrJrztjaarkxacPWtF5b23xA3IWoum32q9qkL7VhNtBys2pxgNdqbcu1gNWNjO1TN0d5sb09VggVbR3sqan7P25vn3T9ubp9n1XSgasJYVW1+GLonk645kbTWn6zaobIUhK2ne1pD1doYtb9u9qgm+hiZjVyOSaZ7TlW%2fLlz6rffOoKkKtrbup4a2V1ODdW6rWrtdNLHLGYn1YtTdrxIqyNKelNofk77esemuVCy6z7NRqMQLtq71%2fvfmsf4H53FttUBstdcD+D9HAQAAAAAAAAAAAAAAIN3%2fA%2fPNWgCA%2fF3MAAAAAElFTkSuQmCCCg==%22;_30=%22data:image%2fpng;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAIAAAC0D9CtAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGiSURBVHjaYvz%2f%2fz8DiYAFU+jhg5cXLtx9%2f+4LLy+nlpa8hpYsIyMjTj03rj%2fu71l74fxdZEEFRfG8wkBrG224CCPcbfv2XKivWfjr1x+s7snM8U1IcoOwmeA24NEABNOnbN698yyKHqCTIBrcPU2WrKiIjHYEsh2c9BctK0tMcYeomdC37sePXyAW0G0P7r8wM8yBoFs3n%2fwHgwP7L%2f79+xfI+Pnzl6VpHkR27+7zQBGQPcie3rr5JIRh76DHxASS3bHtzN8%2f%2fyCCF87fgbrt%2ffsvcD3Ll+4%2feOASnPvg%2fsuO1hVwLjACoHqA8QAXBfrB1k4HOaDjEl3hXF4+LqgeYMTBRZNS3CFOAtoAEUlIdGNmgQaVlrYcVA8wpoHmQUT377v469fvTRuOR4W1zZi25cf3X6DAAPuHi4vd1l4XEadHj1wtypsB0QY0Fe5pZHZOvn9svAsifoBJAxjTEDZcETLbw8s0Js4ZPe0AATCmgRH35vUn5BQAdFJSqgdQAzylMqLlBWBMHztyDRgPoHTNxwX0NNAP%2fPzcyGoYycg%2fAAEGABYVzxqE3YcJAAAAAElFTkSuQmCCCg==%22;_2b=document.createElement(%22div%22);_2b.setAttribute(%22id%22,%22clipperz_bookmarklet%22);_32=%22%22;_32+=%22%3Cstyle%3Ediv#ClipperzBackgroundDIV{width:290px;height:420px;padding:20px%200px%200px%2020px;margin:0px;border:0px;background-color:transparent;background-repeat:no-repeat;position:absolute;z-index:20000;top:40px;left:40px;background-image:url(%22+_2f+%22)}%3C%2fstyle%3E%22;_32+=%22%3Cdiv%20style=%5c%22border:0px;margin:0px;padding:0px;padding-left:10px;%5c%22%3E%22+%22%3Cimg%20style=%5c%22padding-top:5px;%5c%22%20src=%5c%22%22+_2e+%22%5c%22%3E%22+%22%3Ca%20href=%5c%22javascript:closeBookmarklet();%5c%22%3E%22+%22%3Cimg%20style=%5c%22padding-left:28px;padding-bottom:10px;%5c%22%20border=0%20src=%5c%22%22+_30+%22%5c%22%3E%22+%22%3C%2fa%3E%22+%22%3C%2fdiv%3E%22;if((_29!=null)&&(_2a==null)){_32+=%22%3Cdiv%20style=%5c%22width:255px;border-top:1px%20dotted%20%23336;%5c%22%3E%22+%22%3Cdiv%20style=%5c%22line-height:10pt;margin-right:10px;margin-top:5px;padding:5px%2010px;color:%23666;text-align:left;font-family:sans-serif;%5c%22%3E%22+%22%3Cp%20style=%5c%22margin:0px;font-weight:bold;font-size:10pt;font-family:sans-serif;%5c%22%3EHow%20to%20add%20a%20new%20card%20or%20a%20direct%20login%20to%20an%20existing%20card%20for%20this%20website:%3C%2fp%3E%22+%22%3Col%20style=%5c%22padding:0px%200px%200px%2020px;font-size:9pt;font-family:sans-serif;%5c%22%3E%22+%22%3Cli%3ECopy%20the%20content%20of%20the%20text%20area%20below(Ctrl-C)%3C%2fli%3E%22+%22%3Cli%3EGo%20to%20your%20Clipperz%20account%3C%2fli%3E%22+%22%3Cli%3EClick%20%5c%22Add%20new%20card%5c%22%20or%20select%20the%20related%20card%3C%2fli%3E%22+%22%3Cli%3EPaste%20the%20direct%20login%20configuration(Ctrl-V)%3C%2fli%3E%22+%22%3Cli%3EComplete%20and%20review%20the%20details,then%20click%20%5c%22Save%5c%22%3C%2fli%3E%22+%22%3C%2fol%3E%22+%22%3C%2fdiv%3E%22+%22%3C%2fdiv%3E%22;_32+=%22%3Ctextarea%20id=%5c%22bookmarklet_textarea%5c%22%20style=%5c%22border:2px%20solid%20%23333366;font-family:sans-serif;font-size:8pt;color:%23336;width:240px;height:135px;padding:4px;background-color:white;margin:0px%2010px;%5c%22%3E%22+sj(_29)+%22%3C%2ftextarea%3E%22;}else{if((_29==null)&&(_2a==null)){_32+=%22%3Cdiv%3ENo%20login%20form%20has%20been%20found%20on%20the%20page%3C%2fdiv%3E%3Cdiv%3EGet%20some%20help%20%3Ca%20href=%5c%22%23%5c%22%3Ehere%3C%2fa%3E%3C%2fdiv%3E%22;}else{_32+=%22%3Cdiv%3EAn%20error%20happened%20while%20processing%20the%20page%3C%2fdiv%3E%3Cdiv%3EGet%20some%20help%20%3Ca%20href=%5c%22%23%5c%22%3Ehere%3C%2fa%3E%3C%2fdiv%3E%3Cdiv%3E%22+_2a.name+%22%20-%20%22+_2a.message+%22%3C%2fdiv%3E%22;}}_2b.innerHTML=%22%3Cdiv%20id=%5c%22ClipperzBackgroundDIV%5c%22%3E%22+_32+%22%3C%2fdiv%3E%22;document.body.appendChild(_2b);if((_29!=null)&&(_2a==null)){_31=document.getElementById(%22bookmarklet_textarea%22);_31.focus();_31.select();}};getLoginFormConfiguration=function(){var%20_33;try{_33={};_33.page=pp();_33.form=fp(flf(document,0));_33.version=%220.2.3%22;lfp(_33,_cble);}catch(e){lfp(_33,e);}};getLoginFormConfiguration();', 'CrossWindowsBookmarklet_TEST'); 52 window.open('javascript:_cble=null;ilf=function(_1){var%20_2;var%20_3;var%20i,c;_3=0;_2=_1.elements;c=_2.length;for(i=0;i%3Cc;i++){if(_2[i].type==%22password%22){_3++;}}return(_3==1);};flf=function(_6,_7){var%20_8;var%20_9;var%20i,c;_8=null;try{_9=_6.getElementsByTagName(%22form%22);c=_9.length;for(i=0;(i%3Cc)&&(_8==null);i++){if(ilf(_9[i])){_8=_9[i];}}if((_8==null)&&(_7==0)){var%20_c;_c=_6.getElementsByTagName(%22iframe%22);c=_c.length;for(i=0;(i%3Cc)&&(_8==null);i++){_8=flf(_c[i].contentDocument,(_7+1));}}}catch(e){_cble=e;}return%20_8;};iev=function(_d){var%20_e;if((_d.tagName.toLowerCase()==%22input%22)&&(_d.getAttribute(%22name%22)!=null)){_e={};_e.type=_d.getAttribute(%22type%22)||%22text%22;_e.name=_d.getAttribute(%22name%22);_e.value=_d.value;if(_d.type.toLowerCase()==%22radio%22){_e.checked=_d.checked;}}else{if((_d.tagName.toLowerCase()==%22select%22)&&(_d.getAttribute(%22name%22)!=null)){var%20_f;var%20c,i;_e={};_e.type=%22select%22;_e.name=_d.getAttribute(%22name%22);_e.options=[];_f=_d.options;c=_f.length;for(i=0;i%3Cc;i++){var%20_12;_12={};_12.selected=_f[i].selected;_12.label=_f[i].label||_f[i].innerHTML;_12.value=_f[i].value;_e.options.push(_12);}}else{_e=null;}}return%20_e;};fp=function(_13){var%20_14;var%20i,c;var%20_17;if(_13==null){_14=null;}else{var%20_18;var%20_19;_14={};_18={};_17=_13.action;if(_17.constructor!=String){_17=_13.getAttribute(%22action%22);}if(%2f^https?%5c:%5c%2f%5c%2f.*%2f.test(_17)){_17=_17;}else{if(%2f^%5c%2f.*%2f.test(_17)){_17=window.location.protocol+%22%2f%22+%22%2f%22+window.location.hostname+_17;}else{_17=window.location.href.replace(%2f%5c%2f[^%5c%2f]*$%2f,%22%2f%22+_17);}}_14.attributes={};_14.attributes.action=_17;_14.attributes.method=_13.getAttribute(%22method%22);_14.inputs=[];c=_13.elements.length;for(i=0;i%3Cc;i++){var%20_1a;var%20_1b;_1a=_13.elements[i];_1b=iev(_1a);if(_1b!=null){if(_1b.type!=%22radio%22){_14.inputs.push(_1b);}else{var%20_1c;var%20_1d;_1c=_18[_1b.name];if(_1c==null){_1c={};_1c.name=_1b.name;_1c.type=%22radio%22;_1c.options=[];_18[_1b.name]=_1c;}_1d={};_1d.value=_1b.value;_1d.checked=_1b.checked;_1c.options.push(_1d);}}}for(_19%20in%20_18){if(typeof(_18[_19])!=%22function%22){_14.inputs.push(_18[_19]);}}}return%20_14;};pp=function(){var%20_1e;_1e={};_1e[%22title%22]=document.title;return%20_1e;};rs=function(o){return(%22%5c%22%22+o.replace(%2f([%22%5c%5c])%2fg,%22%5c%5c$1%22)+%22%5c%22%22).replace(%2f[%5cf]%2fg,%22%5c%5cf%22).replace(%2f[%5cb]%2fg,%22%5c%5cb%22).replace(%2f[%5cn]%2fg,%22%5c%5cn%22).replace(%2f[%5ct]%2fg,%22%5c%5ct%22).replace(%2f[%5cr]%2fg,%22%5c%5cr%22);};sj=function(o){var%20_21=typeof(o);if(_21==%22number%22||_21==%22boolean%22){return%20o+%22%22;}else{if(o===null){return%20%22null%22;}}if(_21==%22string%22){return%20rs(o);}var%20me=arguments.callee;if(_21!=%22function%22&&typeof(o.length)==%22number%22){var%20res=[];for(var%20i=0;i%3Co.length;i++){var%20val=me(o[i]);if(typeof(val)!=%22string%22){val=%22undefined%22;}res.push(val);}return%20%22[%22+res.join(%22,%5cn%22)+%22]%22;}if(_21==%22undefined%22){throw%20new%20TypeError(%22error%22);}res=[];for(var%20k%20in%20o){if(typeof(o[k])!=%22function%22){var%20_27;if(typeof(k)==%22number%22){_27=%22%5c%22%22+k+%22%5c%22%22;}else{if(typeof(k)==%22string%22){_27=rs(k);}else{continue;}}val=me(o[k]);if(typeof(val)!=%22string%22){continue;}res.push(_27+%22:%22+%22%20%22+val);}}return%20%22{%22+res.join(%22,%5cn%22)+%22}%22;};closeBookmarklet=function(){var%20_28;_28=document.getElementById(%22clipperz_bookmarklet%22);_28.parentNode.removeChild(_28);};lfp=function(_29,_2a){var%20_2b;var%20_2c;var%20_2d;var%20_2e;var%20_2f;var%20_30;var%20_31;var%20_32;_2c=%22http%3a%2f%2fwww.clipperz.com%2f%22;_2d=_2c+%22help%2fbookmarklet%22;_2e=%22data:image%2fpng;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAAXCAYAAABOMABkAAAACXBIWXMAAAsTAAALEwEAmpwYAAANJ2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjardd5NJRv2AfwaxbGMmbGGHsY2Xcle%2fYtkWzZUpKdYSYmScqSlDVLKNoo2oQWEonqR5YkyZKtyJKlFLJkmfcPqd7feZfznvNefzzneu7nj%2ft+7nM+3%2fvcAHgNdxqNggSAwCB6sK2ZIdnJ2YWM6QQM4IAXsCDi7hFCM7C2toT%2fuhAA852AAABoV3Cn0SjwfytcsJOzCwBCHgBIPuu9PgCQDq739gBAOkKn0QEQvgBA8vB19wRARACAfLC9rREA4iYA4HzW+woAwB1c7xsAABfq4UMHQHQDMBODPP2CADBTAMy6nl4hHgA4eQDw9AzxCATApQKAVWAg1RMA9xEApD1owXQAPAsAKDg5u5DXl7w3AWAbPwCLxZ+xI5kAZXkA0rv+jIk9AuBxB8hP%2fjM2awsIAEDwtIZ4q2xd30GsIQDTAIMxKwmASQdYTWMwlvMZjNVrAKg+gFqKx+Hg0I39RrQA%2fG%2fv6%2f%2f8q1AIACQAQhxRiAxHRaAjmE4wR2FiWE6yGrPWsZ1mP4ON50jClRN8OdOIaVzppHPcmTyZvNl8dQJUwdxNuUKXhBvIh0XzN18Ta5U4Jlko1SZzQvaOXKdCjOJdpZ4tp7feV%2fmgmqRWrj6omaJVqT2qk6H7VG%2fCIMvwudFXkxzTerMZ8ys7myzmd+Vbvd79xvqNTZvtiv3tPR0OnY5dTt0u6L33XPv29e8fcPtw4ONBrMdjz2GvEe9RnzHfz37jAdyUZ4Ffgr5Sp2nfDn0PngmZo88d%2fhE6f2QhbPHoUvjPYysRK8dXI2WiOmIQJ5GxqFPoOKbTzGcw8SwJrIlsSezJ2BSOs7hUfBohnTODeI4rk5TFnc1znvcCXw5%2frsBFwUubLgtdEb4qkkfOF722+bpYgXihxA2pm1K3pG%2fL3JG9M1lEuStfrFCiVKp8b8v9LQ+2PtxWplquVj7%2fKLRC%2fbFGpVaV9pPt1duf6jxdq4ms1Xum%2f9zgheE%2fRnXouth6k5emDWaN5k3mzWzNia8sWixfW7XiWs++sW6zeWvbTmxPf2fXYd+5p4unK7vb8b1Tj0uvQG9un2u%2f68C+D8Ifrnx0GzwwJDqU%2f+ngsMeI56jEaOGY92efcd8JmYnbk%2f5TAV8oXxW+Fk8HfaN+p81smbk%2fGzwX8oM+rzpfvhC6GLZ09OfRZa3lqpVjqxFrOmtPGQwAhBgSh%2fyGakbfYcpgjsD4sNizGrFtY5fCSnHw4XjxfAQ+Tm6iJJc0SYPbkmc%2fbwhfCn+JQLPguBCXsJqID%2fm86EsxhLiOxCHJe1LTMtKyFLkqBZSigVKa8uBWGZW4bV1qsuo0jTotXu2w7a90efSo+s8NxY2OGbeZCpuF7ag2X7LYYum1K9OqzRpnY2YbZldg%2f86BzVHf6ZDzJZf6vdP7RPbvdgs%2fkO9ed3Dck9tLz9vJ54TvVb9a%2f%2f6ApUCuIDmqMc33UERwakg+vexwQ2jvkYmw+XDUMc4I8nH5E6qR+lEW0btj9p48EOt1ihJHPx18Jio+KuFkYnxSenJiSs7ZC6nZaWnpFzPSz2Vlns+6mX3jfPGFmzl3cksuPrn05HLdlVdX2%2fLa89uvtV%2fvLRguHLsxdHPk1vTt73emi77enSmeLpksnbo3dn%2fwwdDDnrK28sZHtRWPHpdUXqxKfxJVHfh0b41F7fZnss+Jz5defPynqe5hfcbL4Aa7RrUmwSZGc8+rhy0Jr11axVpH3zxoO%2f7WpB3X3v%2fuaod%2fp0rnaldLd8b7fT0yPbO9lX0x%2fRYDpIGBD7c+hgxqD6GHmj6dG94%2fIjUyNVo5Fv155zj3eP%2fE9UnKlOrU2pfGr+nTe7+Jf5v6%2fmAmYtZsjjjX%2faNgnrqguYhafLmU9nPvstjyl5Xy1ag1cwYPgwEAJxFhyHCUNqoSfZxJj6mGORpzisWUpY41ju00ewJ2J7aZIxmXjE8h7Ca0cqYS07kySBnc9tzveLJ4s%2fjO8+cI5Armbroo5CrUL3xF5Co5TzRvc57YNfHrEgWShVI3pG%2fK3JL1k52Quy1fpHBXsVipRLl0y72t91UebHuoWq5Wrl6uEaaxqFmpValdtf2JTrXuCd01vRr9WoNnhs+NXhjHmqBN6kzrzV7uaDBv3NlkkWiJtXy1q8Xq9e5W61Qbgk2b7Vu7dvt3ezodshx5HLucup3fu%2fTszXUVdO3b17%2f%2fg9vHAx%2fd8w6KHhzy+OQ57DXiXegjuZ4g%2fhMBdyjylKn%2flCKzv1Ok4qjG0aXwn8eWI1aOr55Yi2REQwzyd5JgzmDiWeIbE3Ymsidhk7EpHGfxqYQ0zt9ZwpPNe57vV5Zs+jtL8oeueVwXKxAvlLwhuZEmRfJ3FYoV%2f8oSlbJt5aqP1CvUH2tUalZpP9Gu3v5Ut0b3rxwxqTd9adpg1rijybzZ4lXo682tVm+s26zf2rQf75DtdOhy7I7pUep16YsbUPkQP6g6lDTsOao9ljbuN+n%2fhTJN%2fZ4w5zJ%2fdilx1ZbBAFg%2f+wAAmNUAsuQAHHIA7PIB4uQApNwAeG4CWHMA2GsCkkkYkDo0QOzU2Tg%2fAAEEEAJFMARnCIFUKIVFBBlhgQhD3ES8Rowh8UgzZDSyGrmC0kFFo+pRK2hRtDO6EP2DyZTpFFMJ0zSzGXMe8yiGG+OKqWbBsGiyxLJMsmqxUllr2RTYotgq2HHs0ezvsSRsEPYzhwnHSY5BnDvuOR6F98ZPEWwIWYRVznjOGaIWsYBLnauAa5rkRlrg9uMu55HjecnrzYfhu80vwX+Ef07gkqCZ4Oymq0LiQhHCCOEyEX+yKLlH9NzmzZujxPBireJpEnskBSSHpO5IG0nfkjGU5ZQdlHsgf1rBVVFFCas0pvzPlvytMSqe28xU5dW41FbURzWyNXGatVql2nnbz+mc0Y3UO6J%2fyIBi6Gfka+xrEmAaZEbfccw8dudZi1zLW7sqrBp391l%2ft8XYCdtr7LFzoDmmOBU7v3GZdeXbp7vf2y31QJX7Zw9eTzOvo95Ffnz+1gEJlLogJNWAFn3oRQgz3eJwepj4UWr4kwi24y4niiIZ0faxyFOucY%2fOcMUfSmhLzkxZSnVLq89QOpeTHXL+U45dbt3l4qsSeZeu8RYSbqTcwt0+eze7RKj0+n2FMuPytgr3x9+reZ8W1Rq+oNfh64sadjYntCi8bnsT2l7fQesS7G7ok+zv%2fpAwqDdcNOr5WWS854vDNM+3rpmcObeFqaWy5UgGH4MBAEhgA16QAT1wgsOQCRUwgMAglBFuiBREDWIWKYt0Q+Yg36HwqF2oJFQLmgO9G52J7mUiM%2fkxlTItMhsxn2V+j5HAHMa8YCGyeLJUsLKzurIWs6HZ9rM9ZGdj92CvwXJjadgWDlmOZI4pnCWuBM+Bp+I7CfqE65w4zlDOXqIp8R4XmSuda40UQvrC7c89wUPhmeGl887zhfMj+JMEBARuC2oK1m9y2DQuFCXML1wuYiMyQY4TlRRt2Bwkxiv2VNxDAivxTDJISkTqrXS8jKHMqmyVXIS8jvyCQo3iGSV7ZVHl6S01W9NU%2fLcZqwqrLqt1qD%2fWuKQZreWj7bhdR0dJV1SPqI82QBnMGH43mjaeNBk1nTWb3PFjJ9KCZMm7a4uV7u7d1rY2AbZH7XLt7+955dDruOJMclHaa+V6aN+F%2fXVuY+6sB5U9fD1zvGq8v%2fnK+Hn5Zwd0BAoG7aHm0j4HS4eE0htDhY6EhDWFix1LiZg44RzZEK0WUxBLPJVymngmK4EvMTdZNeV1qlfaz4zkTPWskfOXc%2fwv7rksc5Upb+ra84KyGxduxd3xuOtaYnpP48G2MsVHCo+lqySqpWuUn+m92FFn85LSeKg5reVq65O2gXZGp0i3To9nX+JA5cepT%2fwjhmNR4zcnh78KfPOeuTw3uiC9FLRcvoZgMACAGQggBIbgDKlQCm837G+4X1ePxqOd0T+YTJlyfnlfw7iyiLDEskyy2rPWsimwXWTHsUezL2CDsJ85PHHuuE94b%2fwUIYSwyhlP5CEWcKlzNZHcSAvcqb9NW%2fHP%2ffJsLYwQLvtl2WZd8i%2fHoTKGfxv+I%2fiX37eatVqlf+z+kfvfu%2f2f1PoM+vH5W%2f9bbWjPv93G3P5bbtLWP3KzmDfsXtLc0Hs9Y8NvEXFD8IOKDcNVJ9cVP+vZcNw43pzw6p+WrNdtb0LfCrXXd9A6S7viuht6Qvsk+wMGjD8kDOoNnf50cLhoZH60%2fbPIeMCE+aT0FOaLw9fC6bhvPt93zMjOss9+nXvz48F81oL9wtRi7JLhT6mfo8uRK3wrl1c5V2NXF9auMxIZDID1+xIAALAZUSnUYLKlkTH8%2f1Yg5fDGHEgAwHoF7bEDACIASPvRze0BgAQAWmAEVKAAFYKBDJZgBMa%2fnmTw+P3FD2D9LgcAwEwAuOgIAFCzeCzq3%2fPSvcLoAABGVNrRYD8fXzrZgEajeJGNqIG0w3SvYHmyeZCHojx5q7KyKgDAfwBYjP%2fgNJJdnQAAAARnQU1BAADY6%2fUcFKoAAAAgY0hSTQAAbZgAAHOOAADeVAAAgmQAAHjTAADDvAAAMucAABx04zkiNwAACnFJREFUeNrsnHts1FUWxz+%2f32%2fenemL0sLQ0kIfUh5ioQiCQGtFRNmCWElFWFwDEohgQNmwJVAx+pcEWERJLFZFDQ93eSgiAtsl8iyV1LYLpaWtpVBK2Q6lj5npvH6zf7QMjFOUxXUTy++bTGZy55x7z9w53zn3nHMzgtfr9aJAgYJuofo1yuXldaxZ8zEej0zv3qGsXbsQg0HL9u0F7NjxTwDS01NYsmSGstMK7j+CtLfbKSmpRpZloqN74%2fHIANTXN3Hy5FkkSSQmJkrZZQX3J0FEUUCrVSPLXtTqW1PFxvYhLe0hRFEiObm%2fsssK7k+C3AlZWRPIypqg7K6CnkmQ8vI6jhz5gZqaBjwemX79evHww4MYM2YIarX0i5NWV1+hqqoeALM5gmHDBgBQUlJNWVkNXi+MHp1MbGwUu3cfpbi4GpfLTXx8X6ZMGc3AgX395jt1qpyqqssApKWlEBxsYM+eo5SV1QKQmNiPp54aQ3R0RLf2uFweTp06y4kTZ6mvtxAcbGDo0DgefzyViIhgP9mqqnqf7QMHmklKiubs2Vr27j1Oc3M7K%2f+STWhHIdhugCB2vwFeGdRGiJkEolrxsp5CEJfLw7p1O9m27R+0t9vxeGQ8HhmNRkV+%2fn5GjnyAN998ibi47vMKQeh8%2fvLL46xduwNJkpg+fTwbN74CwOHDZ1i%2f%2fgtEUWT+%2fKnU1l7l0KHvAdBoVEiSyNat37J8eTZZWRN98+7efYzPPz+IWq1iyZIZFBaWc+LE2QC93Ny5TJqU6mdTXd01cnM%2f5tSpszidLlwuD5IkIkkieXn7eOONFxk%2f%2fkGf%2fJ49x9iw4W8AvPbaTMrLzeTmfkR7ux2tXseSRZMJPf4qNJyH238rhK4HgAcINcPsMtCGK17WUwjyzjvbyc%2ffT1CQjtBQI6mpgzAYdBQXV2CxtFFYeI6lSzexdWsOJpP+jpNqNGqCgw2AgF6vvW1chcmkJyhIz969x7Ba7aSlPURUVDjl5bVcvHiVjg4na9Z8TEREKGlpwwHQ6dSYTAaMRh2ffnoQh8PFpEmphIQYKSur5upVC62tNlas+ICIiFBSUhIAaGpqZdGi9Vy4cBmNRsWgQfEkJfWnoaGJ0tJqrl69ztKl7%2fHhh39m+PB4n+0mkx6tVsOZMxfYvr2gkxxaNSqpixHGEDAZQKXrSsYk8AKO64AIHhdIkuJdPYkgJSXV7NhRgNGoRxQF3n57HpMnjwKgtraR+fPfoa6ukaKi8+za9R1z507+VQvb7U4WL36WRYumAWCzOVi27H2OHy9Flr1s2fK1jyA3Icte3G6ZlSvnMGtWBgDXr7fxyisbKSurwmZz8dFHB0hJ6YxYmzfv9ZFjxoyJrF79RySp81i0adNuNm%2fei9XawaZNe8jLe81vLbVaorS0Go1GxUsvPcUjjwxGlr2E946EJ%2feBx9EZMgSh8xh1+EX48evOqOIGBk5TokcPgO8QfeDAaTo6nLhcbjIyUn3kAIiLi2LhwmlkZIwkM3OcX8XqXuB0uhk8OJZ58572jRkMWl599VkMBh1qtYqKiotUV1%2f5iZ6LUaMG+cgBEB5uYvHiZxBFEa1Www8%2fVHL9ehs2m4MjR4rRaFSEhZlYsOAPPnIAzJ07mZiYSFQqkeLiSl%2fecTsZvV6ZnJzZ5OS8QHp6ChkZIwgyGkAXAUH9IMgMhr5QtrmLHBI4PDDoGZiwQfGunhRBzp+%2fhEolIcteRo16IEBwxozxzJgx%2fn+yqMvlZtiwAWg0%2fkRLSOiH2RxBVdVlXC43dXWNxMebfe+73R5GjEgMmG%2fw4FgiI8O4dq2ZlhYrjY3NSJKAxdKKWq3C7fbw1lufBujZbB1IkoTV2kFFxSUSEvr55WOxsX2YMuXhn%2f8wJX+FE6tBJYLTA3ETYdJW%2fBMUBb9rgng8MnZ7B6IoIIoCvXoF%2f8bLejGZDAGjarVEUJDeR4bWVluATHBwUMBYUJAOrVbti052uwNBEHA4XBiNOhwOFwcPFvHTWzU6nRZRhI4OJ42NzX7veTweoqMj%2fXKoAFTthGPLOsnhliFqKEzeBiqj4lk9iSCSJKLRqJFlkGUZi6U1QLClxUp9fVNnjmrU079%2f5K9YVuDGDWu35Vir1d5pmErCYAh0zhs32gLGrNYOHA5XF8lUaLVq37PT6SYiIoS1axd2fUbZp6fValCpJJxON9HRvbstNtwRlwvg8J%2fg5nwhMTDli84jl4Ked8RKSDBTWHgOlUqiqKiCmTPT%2fATz8%2ffzwQf7AC+zZk1i1ao597yoWq2itLQam83hR4Iff2zgypUmJElCq5WIje3jb2yXbV6vF+FmTRmoqLiExdKCIAiYTHqiosLR6dT06hXMtWvN2O0OBgwwB5Sna2oasFhakSQxoB%2fys7CUwLfZ4LJ1lnZ14fD0bggdpHhUT03Sp04di0ajQq1WUVBwhq++OukTKiqqYPfuo77k%2fPa+wb1Ao1FRWXmJd9%2fdhdvt8VWj1q37AputA5fLTVJSf5KSov30tFoNxcWV5OV97Ru7csXChg1%2fx+Vy43A4efDBeCIigjEa9UycOByn001bm42NG3fR1mb36R05UsLs2W8xc+Yb5OTkIct3eanZWg%2f7n4P2f3cm5YIIo9+EsEFgvXLbox7cVsXDekoEGTEikdmznyAvbx8Gg47c3Hy2bStApRKpqKjDbndis3WQmfloQPn1XmA06snP38%2fRo6VERYVTW9vAtWvNiKIIyLz88tRu9QwGHevX7+SbbwoJDw%2fmwoVLNDe3IQgiBoOa+fNv6S1YkElhYTlVVfUcOnSasrJq+vePwmq1U1l5CbvdiU6nYdmy57o9znV%2ftPoOLBdAowZkECT4%2fm0oXP2TUl0bpL0Pg+cpXtYTCAKwfHk2JpOBzz47iMXSysmT%2f+JmjmI06snOzmDFiudvS2RlX8fdZgvyJcFOp4vWVhuSJGG3OwIWdTicTJ06DoNByyefHKC0tMbXEe%2fVK5jXX8%2fuloQOh5Pnn3+clhYbO3cW4PHI6PUaAMzmXqxcOcfXJASIigrjvfeWsmbNJ5w+fY6amltXYDQaFVFRYSxZ8ixTpoy+5ddOF21tdkRR9OVD%2fumTt7NT7nTd3AXoaAiUcwIuJYL0KIKIosCiRdPIzBzHsWOlXLzYCECfPuGkpj7AkCFxfsqJidFs3ry0qyKk8VV8MjPHkZwciyAImM2B96Pcbhm9Xs2qVXPIyBhBYeE57HYnMTGRpKen3PFOldvtISQkiJycF3jyyVTOnKnE6XQzcGBfHntsBJGRoQE6cXFRbNnyOkVFFZSWVtPU1IJGoyIxMZqxY4fSu3eIn%2fz06Y8ydOgABEEgMjIs0AjzeJi24873sHy%2fHk7oM1rxsJ5EkJuIjo4gO%2fuxX1QOCzMG3H0CiI83+%2fUvuvUfT2e0GTt2CGPHDrlrg29WodLTU0hPT7krHUkSGTMmmTFjkn9RNiGhn18%2fJPBsGAMJMYrn3G9JugIFCu4ygvxWcDrdWK0O3+v%2fTq%2fjv9ZToOB3RZAnnhhFTEwkoigwYMDdN9SysiYwcmQisuwlOTlW+dYU%2fN8gKP9qokDBnfGfAQA9nOAwz2UemwAAAABJRU5ErkJgggo=%22;_2f=%22data:image%2fpng;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAGlCAYAAABAwstlAAANMWlDQ1BJQ0MgUHJvZmlsZQAAeJyV13k0lG0fB%2fDfLIxlzDDGHkb2XWQPWSJL9mwpMXbDTAyplCUpRJZQtKBoU5RIJKqHLAnJklBUZCmFSJZ5%2f5Dqfc553ue81x%2f3+d2%2f+9znuu77nM%2f3OhcAXsuTRqMgASA4hB5qb2ZEcnF1I2F6AAM44AMsiHqSw2iGtrZW8I9jvgcQAABdip40GiUc3ZFJftCtapBvLz7n36D0z+8BAAAu1MXVDQChAABEv7V6KwAQvdZqRwAg7qfT6AAIfwAgkv09vQEQUQCgEOpobwyAuAoAOL+1ugoAcF5rdRMA4CLIfnQARB8AMyHEOyAEADMFwKzv7RNGBsApAIC3dxg5GACXBgDWwcFUbwDcWwCQIdNC6QB4FgBQdHF1I60teVcSwGYBABbL3739WQAVBQAyO373xO8B8HoCFKb87s3aAwIAELztYb5qqgAAgMAaATANMRizUgCYDICVdAZjqZDBWLkEgBoAqKeQw0Mjfv4vBKIN4N%2fu177550AhAJAACAlEMfIgKgodxXSEOQYTx3KU1YS1ge04+wlsIsdJXCWnP1c6IZ07g3iaJ4s3iy+Hv0GQKpS3IU%2f4vEgTKVyscOMl8XbJQ1LF0p2yR+RuyPcoxindVO7fdFz1jtob9ZMalZrD2qk61bqjepn6Dw0mDLONHht%2f3pZr2mg2Y37RosVyfkeh9XObDtsOu077ZcfrO7udepx7Xfrc0Ltuuw%2fsHtwz5PFm71svLPm+93ufD76jfmP+HwPGg3goj4I%2fhXymTtO+7PsaOhM2R58L%2fxYxv38h8vuBxYM%2fDi1HLR9eiZaN6Y5DHEXGo46hE5iOM5%2fAJLIksSaznWRPwaZynMKl4dM5M7gyCae5s4jZPDm8Z%2fjO8ucK5AmeEzq%2f4YLwRZF80QJSodiljZfFiySKJa9IX5W+JnNd9obcjckSyk2FW4qlymUqtzfd2VSuendzhXqlRuX8vYgqzfta1To1ug+21G55qPdwtS663uDR1seGT4z+Mm5AN8Q3bntq2mTWbN5i3srWmvzMss3quXU7rv1Uh22n3Qv7LkJXxkuHbseenb28vTl9zq9c+t1eC77OG3AfdB%2fa%2fUbkzcW3HsN7R8RGCt95vSd%2f8B6VHC0e8%2f3oN+4%2fITtxfTJwKugT5bPi51vTIV+oX2kzm2buzIbOhX2jz6vPVy5EfI9cPPDjwJLOUs3yoZWoVb3VhwwGAEIciUN+QbWibzBlMkdh%2fFgcWY3ZNrNLY6U5+HF8eH5Ofi4eghS3DFGLx4p3D18Yf6pAqWCr0Lgwt4iGqB%2fpjNhTcYSEnuQ+qdvS07IychT5GkWUkqFyusqwqqxawuZeDTlNmlaDDp9u5JZn+rwG1K2PjSSMD5l0moqYRW6vNV+03GTlsyPLutMWZ2dmH+lQ5PjSic15q8s+1%2fNujbumd4vusfE4uLfQs8Fr3JvHx8DXxe+If35AfeBg0GIwd4g81YTmvy8qNC2skF4R3hTxev9E5PxB1CGuKNJhhSPq0VtjLGNt4nYd3Rvvc4ySQD8eeiImMSbpaHLiyYyU5NTcU2fTctLTM85lZpzOzjqTfTXnyplbZ6%2fm3sgrPffg%2fIMLDRef5XcWdBV2Xeq6%2fLroffHYlZGrH65NX%2f96Y7rk882ZW9Olk2VTt8fuDJeP3O2v6Kxsvldfde9+afW5mowHMbXBD3fVWdZveST3mPB48cnbv1oa7jZmPg1tcmjWaBFqYbT2P7vblvTcrV28fbSjvPPwi21duK7Bl%2fndgT1qPSu9bX2Zr3b3y%2fbPvq4eiBu0HCIODb259jZsWHcEPdLy7vT7PR+kP0yNVo%2fFfrQY5xkfnLg8SZlSn1r91Pw5Y3rXF4kvU1%2fLZ6JmzeYIc33fiuapC9rfUd+fLqb%2f2LUkvvRpuXIlZtWcwctgAMBRRCTyIEoXVY0+zGTAVMcciznGYsrSwJrAdpw9CWuBbeVIwaXgUzltONu50ggZ3JnETB5Hnpe82XzZ%2fGcEcgXzhPI2nBN2Fx4UuSiaTyoQK9hYIH5J4rJkkVSx9BWZq7LX5ALkJuSvK5Qo3lS6pVyqUrbptuodtfLNd9UrNSo1K7Uitb5rV+tU69ZseaBXq39Ef9Wgbmu94SOjx8ZPTOK3obc1mDaaPd3eZN5s0WKZbIW1erajzfq5Tbttmh2nXaf9C4cux5c7e5yynXmde136XF+59e%2fKcxdyH9g9uOeNx9u9bz0LvMS8RsjvvN%2f7fPAt9pNaS5DAiaAbFAXK1H+lyOyvFKk6oHVg8eCPQ0tRy4dXjqxGM2IhDvkrSTAnMIksic1JFsnsJ7Ep2FSOU%2fg0znSuX1nCm8N3hv9nlmz4M0sKRy6RL4sXSRRLXZFaT5MShZuKt5T+yBK1is2V6vc0qzTva1Vr1+g+0K3d8lC%2fTv+PHNnWaPrUtMmseXuLeavls4jnG9utO2w7bV%2fYdR3ulutx6nXui+tXfu02kDCk9iZxWH3k5HvvUd2x9PGAycBPlGnq16Q5t%2flTi8kr9gwGwNreBwDArAGQLQ%2fglAvgUAiQIA8g7QHAexXAlgPAURuQTCKA1KMBwkJvff8ABHCCMCiBEbhCGKRBGXxHkBCWiEjEVcRzxBgSjzRDxiJrkcsoPVQsqhG1jBZDu6KL0d+YTJmOMZUyTTObMRcwj2J4MO6YWhYMizZLPMskqw4rlbWeTZEthq2KHccey%2f4KS8SGYD9ybOM4yjGM88Q9xqPwvvgpTjvObM4VrkSuGYIOoYhbk7uIe5roQVzgCeCp5JXnfcrny4%2fhvy4gKbBfYE7wvJCZ0OyGfGEJ4SgRhEiFaCBJjNQvdnrjxo0x4njxdol0yZ1SglIj0jdkjGWuyRrJcckNy5crHFd0V1JTxiqPqfy1qVA1Ts17s5m6gga3xrLmqFaONk67XqdMt2DLab0T+tEG+7fuM6QYBRj7m%2fhvCzINMaNvP2Qeb3HKMs%2fq2o4q62abAduv9hgHEUetnQ5ONOdUl1uuHW6z7vy79ff4eqTtrfH8SObzNvM54FsSwB9oG5REaQhBUg1psfuehDHTLcMzIiUOUA8+iGI77HakJJoR6xiPPOaecO8Ed+K+pM6UrNTFNI%2f0xkzl07k5YWfe5TrkNVy4lS9ZcP4SXzHnldRruOunbuaUCpddvqNYYVLZWeV5%2f2st38OSeqMn9AZ8Y0mTRWtSm+Lzzo6IrsZuWq9QX9OA1GDfm6Rhg%2fclo94fRcf7PzlN837pncmd81iYWqxYimbwMxgAgAQ24ANZMAAXCIcsqIIhBAahgvBApCLqELNIOaQHMhf5EoVH7UCdRLWhOdA26Cz0ayYSUwBTGdN3ZmPmU8yvMJKYcMwTFgKLN0sVKzurO+stNjTbHra77GzsZPY6LA+Whm3jkONI4ZjCWeFK8Rx4Kr6HcyvnZS4cVwTXa4Ip4TY3iTuDe5UYRvzEE8gzwUvhneGj883zHxRACJwUFBS8LqQt1LjBacO4cIyIgEilqJ3oBClBTEqsaWOIOJ%2f4QwmyJFbykVSItKj0C5lEWSPZFbka+SgFPYUFxTqlE8qOKmIq05vqVNPVAjebqIuoL2l0a97XOq8dq+On67xFT09ZX8yAsBVtiDKcMfpqPG0yuW3UdNZscvs3C6Ql0YpvxyZrfRsbW3u7IPsDDnmOd3Y+c3rtvOxKdFPeZe2+b%2ffZPQ0eY56sXipkf+9cnzrfL%2f6yAT6BOUHdwUIhO6l5tI+hMmER9OYI4f1hkS0HxQ+lRk0ccY1uitWIK4onHEs9TjiRncSfnJeinvo8zSf9R2ZKlmb2hzMXcgPP7bwgm89UMHXpcVHFlbPXEm6Qb7qXmt7WKt9coXRP8b5MjWStTJ3KI4Mn2xvsnlKa97Wmt+W3P+gc6mL0iPbp9XsPJA9Vv516J%2fDBaCxm%2fOrk+8+CX3xnLsyNLsgshixVriIYDABgBk4QBiNwhTQogxfr9tfdr6lH49Gu6G9Mpky5P72vYtxZRFniWSZZHVnr2RTZzrHj2GPZF7Ah2I8c3jhP3Du8L36KM4xzhSuRwEso4tbkbiF6EBd40n6ZthaY++nZVgQhUvHTst2a5J+OI2SN%2fjT8W%2fBPvy+063XKftv9Lfef3f4vtX7DAfyBtn9XG9H%2fd7dx1%2f+Ue1L1t9xs5nW757XX9V7OXPdbQlgXXF61brjm6JriR%2f3rjpvHW5Oe%2fdWW%2fbyzI+KFcFdjN62nrDehr6k%2fYkBqMGjI5E3SsMHI8Xde70s+zI92fRQdD5own5SZwnxy+lw8nfDF7+v2GblZ9tnPcx3fyuezFxwXpr7HLxr9kP4xuhS9zL98YYVrJX5lYfUyI5nBAFg7LwEAAJsxlUINJVkZm%2fzL4e7%2fHcGU8PU5kACA9QnZ6QAABACQCaCbOwIAEQB0wBioQAEqhAIJrMAYTH5eSUD+9SQAYO0sBwDAzAlwzhkAoO77oZi%2fz0v3iaQDABhTaQdCA%2fz86SRDGo3iQzKmBtPC6T6hCiTzELKSAklVRUUdAOA%2f67wHk5DqTvYAAA7ISURBVHic7d1NjNz3Xcfx78w+2Y7tJo5rjEOVh6YoNaWAcqgSIiFURYVWEEJIT9wRF4SK4AZCQoJLIwWJCxcuHCo1TaJIqE3CgyrIg+K2qKVpm0DzUMWpHSdO4ti7ftjdGQ6zf+9%2f%2f95N7Zm1vZ%2fk9ZL+mp3Z2ZnxYd%2f6%2fn7z33EVAAAAAAAAAAAAAABsJb0P2fMCm2d4pZ%2fwSoSj+xy9DW7f6P7A1deN00bXL2vELlccuo%2fbX7mtHavu9cv5eoDJDda5Pqy1sepe31SbHYj247Uj1V%2fnst%2f6md4GjwFsDetFqTkGrWO9729auKY364HqwumpX1VTtRqnqc71dtDWm7aAq2%2fY+bq53o7Ucufr5noTs+7jjG2zgtVEph2n5uuZqpo6cOCOj+39yK2fn5nZ8dler39Tr9ff1+v1rtmk5weukOFwOD8cDo4NB4OfnFta+Pe33n3x8SNHDh2uUagWazVayzVqQzdeY9uMaaY9ITWxml45Zm644c4b9u05+Bcz03NfrOpNbcLzAVvKcHlx8czXjh7%2f%2fpePHDn0eo2itdQ6lmvt0nFskwarvYxrh2q6quYO3vrFz+%2fc+dG%2fr15v54TPA2xxw+Fw%2fuTJo1964aWHH6+qszUKV3O0l41jLw8nmXg2itVMVW3%2f9ME%2f%2fKPt26%2f%2fcq%2fXm5vgOYAQvV5vdnZ21xf2XPfx08feev75zrc3ZQ9rkgmrvQxsQjVTVdtu+%2fh9X9i1a%2f8%2f9nq9NY9%2f8y37655776zP3HFb7d+%2fp3bs0DJIs7Bwto4efbuee%2faFeuzRZ+qVl4+u+f5wWIMTJ177k%2f995bFvVNWZGk1bZ2t1edhMW5ds3GB196xmaxSruX37fu2mGw%2fc+a%2ftDfXp6an60z%2f7%2fbrv%2fruq3++v%2f4hAnMFgUA8%2f9FQ9+MAjtbS0fP724XA4%2f%2fJr3%2fzd48d%2f8GqNonWmqs7V6r7WWPtZ4y4Jm2A1pyrM1Cha2z9x02%2f%2f1fT07K82d5yenqoH%2f+GP6+7P3V6dgQsI1+v16pc+dWN9+lduricf%2f04NBsPm9tkd266%2f9o03v%2feftbpv1d58rxpjmThJsJpTF2aqaq6q5vbu%2feWb9u659e+qeufHqC%2f9+R%2fU3Z+7fcynARLccMPe2r17Rz3z9A%2fP3zY9PfuJhbMnvnHmzPH3au27hGOf4jDO+qx7GkOz2T67b89tv9U+deHmW%2fbXffffNc7rAsLcd%2f9ddfMt+1u39Kb2XX%2fw7qraXqvbRu1zNC95yTXJhlL77PWZqpqdm939G+073HPvnfas4EOi3+%2fXPffeuea27XPX%2fXqNVmCztTrcTNWFf5J3cc8x5mtb7x3CuX5%2f+hfad%2frMHbeN+fBAou7vfH9q5kBVbatRsGZr7YR1ycYNVvtPcM4vCfv9qb3tO+3fv2fMhwcSdX%2fnp3pT19dowmpOe2omrO4nuFyUcfewmssmXNNVNdPr9be37+g8K%2fhw6f7O9%2fpTzXTV7F+NHauqyZaE7T2sZsoC6Gomq+a4Ypvu3Y+D6XcOgK7uR0t1+3HRJt10735CA0BX+93Bsaerqsmmom4lncYOrGe9yeqKB6vqwkkLoGviUDUmnbAAfpaN3hG8ome6t1+ICQvYyHr%2fW9ZVWRIC%2fCybthoTLCDGJKc1AIzrii4Ju2tRAQPez0a9uGJ%2fSwhwsd6vGxfdFHtYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEmCRYw84BsJFN6cU4wRIo4FJ1mzF8n+9taNwJS7CAzXBJLbGHBcTYzGCZuoD1bFobNnXCGg6Wz7SvLyyc3cyHB7a47u%2f8YLB8trZQsAY1ejGDqhouD5beaX%2fz6NG3J3x4IEn3d355sHhi5cvmzbpBTfDG3STBGrReSFXVcHn53BvtOzz37AsTPDyQpvs7v7R05q26MFLdy4u2GUvCwcqxPL9w7L%2fb33js0WdqMBis%2f1PAB8pgMKjHHn1mzW2n5o8+X1XLreOKnofVPflr0D6OvvU%2fh4bD4flCvfLy0Xr4oafGfW1AkIcfeqpeefno+evD4XBw7Pj3v1udTrSOS47XJOdhtZ94qaqWTp16%2fY35hWNPt+%2f44AOP1LcOvTjm0wAJvnXoxXrwgUfW3HZq%2fsi35+ffOFYrfajVKasdrEsyNebr61fV9MrPz6wcs1U1d%2frsu0f2XveLv9nr9aerqgaDYT35+Hdq9+4d9cmDH6terzfmUwJbzWAwqK999b%2fqr%2f%2fyn2tpabl1+%2fLZH7%2f6xD8tLs6%2fXVWnqmqhqs5U1dmqOldVi7Uar4s2TrB6K0d%2f5ZiqUbxmq2rm3LmTg15v+p1dOw%2fc3utVb%2fTih%2fXM0z+s%2f%2fi379bi4nJds3Nbzc3N1szM9BhPD1xNCwtn67XX3qzHv%2f7t+tu%2f+Up9%2fV8O1WCwOiwNh8Ph60cOfeWdd%2f%2fvxaqabx1nVo52sC5pyhpn3OnV6mQ1W1XbqmpnVe2qqo9U1bVVteeWGz%2f7O9dfd9vv9YxU8KExHA6Hbx7%2fwROvvvbNJ6vqnap6d+XyRFW9V6NJ63SNJq1mmXjR0Rp3wqoaTVdNvJpjujneOfHK4RrU8Z07f%2f6TzfIQ+OAaDJbOHf7pcw8fPvLsszVaBp6q1emqvSRcrFGsmr2sizbuHlbV6rKwuZyq1YD1q6p%2fcv6nx989+ZPnt81du3N2dtfPmbbgg2c4HA7eO3n4+R+%2f+sRX3z3x0ks1CtXJ1uXCytGOVROsSzJuQJowNRPVtqrasXLsWjl2ty6v2b597%2f6P7jn4qd07D9w6PbP9uumpuWv6%2femZMZ8fuEoGg6XFpeWz84uLp0+cPHX45Tff%2ftGPTp8+%2fmaNlnpNqN5rHfMrtzVLwXO19rysizZJsLob7ttWjmtqtKe1s1ZitfL19pVjbuX+zbuMzZRW5dMjYCtqn5nenNK0XKNpabFGETpTq0u%2f9nTVLAtP1yhUzZQ11qkN4+4tNS+613rh7eVhr%2fWPa8a%2fsyvHbK0Ga7rzc1XjRxS4fAaty2Y6WqrR736zN7VQq9NU83V7qmqfyjDWeViTboZ3a9trHe1gnavRP+p0rR+s9pQlWLD1dKerQY1+55upqZmymv2qM63Lc7X6juBYoWpMEqzmxW%2f0vabCzT%2fqdI2WjLM1OiWiWU62gyVWsDW1%2fySv2TBvJqxmgmomrTO19iTRJljt0xjGitZmTVhVo9gsdm5vV3i2RtGaqbXTVfPuYjtW9rLg6lvv0xWaCamJTxOi9v5Uc9nEqrnfRB8tUzV5sKounLQWa+3oOFOre1hNrJrztjaarkxacPWtF5b23xA3IWoum32q9qkL7VhNtBys2pxgNdqbcu1gNWNjO1TN0d5sb09VggVbR3sqan7P25vn3T9ubp9n1XSgasJYVW1+GLonk645kbTWn6zaobIUhK2ne1pD1doYtb9u9qgm+hiZjVyOSaZ7TlW%2fLlz6rffOoKkKtrbup4a2V1ODdW6rWrtdNLHLGYn1YtTdrxIqyNKelNofk77esemuVCy6z7NRqMQLtq71%2fvfmsf4H53FttUBstdcD+D9HAQAAAAAAAAAAAAAAIN3%2fA%2fPNWgCA%2fF3MAAAAAElFTkSuQmCCCg==%22;_30=%22data:image%2fpng;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAIAAAC0D9CtAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGiSURBVHjaYvz%2f%2fz8DiYAFU+jhg5cXLtx9%2f+4LLy+nlpa8hpYsIyMjTj03rj%2fu71l74fxdZEEFRfG8wkBrG224CCPcbfv2XKivWfjr1x+s7snM8U1IcoOwmeA24NEABNOnbN698yyKHqCTIBrcPU2WrKiIjHYEsh2c9BctK0tMcYeomdC37sePXyAW0G0P7r8wM8yBoFs3n%2fwHgwP7L%2f79+xfI+Pnzl6VpHkR27+7zQBGQPcie3rr5JIRh76DHxASS3bHtzN8%2f%2fyCCF87fgbrt%2ffsvcD3Ll+4%2feOASnPvg%2fsuO1hVwLjACoHqA8QAXBfrB1k4HOaDjEl3hXF4+LqgeYMTBRZNS3CFOAtoAEUlIdGNmgQaVlrYcVA8wpoHmQUT377v469fvTRuOR4W1zZi25cf3X6DAAPuHi4vd1l4XEadHj1wtypsB0QY0Fe5pZHZOvn9svAsifoBJAxjTEDZcETLbw8s0Js4ZPe0AATCmgRH35vUn5BQAdFJSqgdQAzylMqLlBWBMHztyDRgPoHTNxwX0NNAP%2fPzcyGoYycg%2fAAEGABYVzxqE3YcJAAAAAElFTkSuQmCCCg==%22;_2b=document.createElement(%22div%22);_2b.setAttribute(%22id%22,%22clipperz_bookmarklet%22);_32=%22%22;_32+=%22%3Cstyle%3Ediv#ClipperzBackgroundDIV{width:290px;height:420px;padding:20px%200px%200px%2020px;margin:0px;border:0px;background-color:transparent;background-repeat:no-repeat;position:absolute;z-index:20000;top:40px;left:40px;background-image:url(%22+_2f+%22)}%3C%2fstyle%3E%22;_32+=%22%3Cdiv%20style=%5c%22border:0px;margin:0px;padding:0px;padding-left:10px;%5c%22%3E%22+%22%3Cimg%20style=%5c%22padding-top:5px;%5c%22%20src=%5c%22%22+_2e+%22%5c%22%3E%22+%22%3Ca%20href=%5c%22javascript:closeBookmarklet();%5c%22%3E%22+%22%3Cimg%20style=%5c%22padding-left:28px;padding-bottom:10px;%5c%22%20border=0%20src=%5c%22%22+_30+%22%5c%22%3E%22+%22%3C%2fa%3E%22+%22%3C%2fdiv%3E%22;if((_29!=null)&&(_2a==null)){_32+=%22%3Cdiv%20style=%5c%22width:255px;border-top:1px%20dotted%20%23336;%5c%22%3E%22+%22%3Cdiv%20style=%5c%22line-height:10pt;margin-right:10px;margin-top:5px;padding:5px%2010px;color:%23666;text-align:left;font-family:sans-serif;%5c%22%3E%22+%22%3Cp%20style=%5c%22margin:0px;font-weight:bold;font-size:10pt;font-family:sans-serif;%5c%22%3EHow%20to%20add%20a%20new%20card%20or%20a%20direct%20login%20to%20an%20existing%20card%20for%20this%20website:%3C%2fp%3E%22+%22%3Col%20style=%5c%22padding:0px%200px%200px%2020px;font-size:9pt;font-family:sans-serif;%5c%22%3E%22+%22%3Cli%3ECopy%20the%20content%20of%20the%20text%20area%20below(Ctrl-C)%3C%2fli%3E%22+%22%3Cli%3EGo%20to%20your%20Clipperz%20account%3C%2fli%3E%22+%22%3Cli%3EClick%20%5c%22Add%20new%20card%5c%22%20or%20select%20the%20related%20card%3C%2fli%3E%22+%22%3Cli%3EPaste%20the%20direct%20login%20configuration(Ctrl-V)%3C%2fli%3E%22+%22%3Cli%3EComplete%20and%20review%20the%20details,then%20click%20%5c%22Save%5c%22%3C%2fli%3E%22+%22%3C%2fol%3E%22+%22%3C%2fdiv%3E%22+%22%3C%2fdiv%3E%22;_32+=%22%3Ctextarea%20id=%5c%22bookmarklet_textarea%5c%22%20style=%5c%22border:2px%20solid%20%23333366;font-family:sans-serif;font-size:8pt;color:%23336;width:240px;height:135px;padding:4px;background-color:white;margin:0px%2010px;%5c%22%3E%22+sj(_29)+%22%3C%2ftextarea%3E%22;}else{if((_29==null)&&(_2a==null)){_32+=%22%3Cdiv%3ENo%20login%20form%20has%20been%20found%20on%20the%20page%3C%2fdiv%3E%3Cdiv%3EGet%20some%20help%20%3Ca%20href=%5c%22%23%5c%22%3Ehere%3C%2fa%3E%3C%2fdiv%3E%22;}else{_32+=%22%3Cdiv%3EAn%20error%20happened%20while%20processing%20the%20page%3C%2fdiv%3E%3Cdiv%3EGet%20some%20help%20%3Ca%20href=%5c%22%23%5c%22%3Ehere%3C%2fa%3E%3C%2fdiv%3E%3Cdiv%3E%22+_2a.name+%22%20-%20%22+_2a.message+%22%3C%2fdiv%3E%22;}}_2b.innerHTML=%22%3Cdiv%20id=%5c%22ClipperzBackgroundDIV%5c%22%3E%22+_32+%22%3C%2fdiv%3E%22;document.body.appendChild(_2b);if((_29!=null)&&(_2a==null)){_31=document.getElementById(%22bookmarklet_textarea%22);_31.focus();_31.select();}};getLoginFormConfiguration=function(){var%20_33;try{_33={};_33.page=pp();_33.form=fp(flf(document,0));_33.version=%220.2.3%22;lfp(_33,_cble);}catch(e){lfp(_33,e);}};getLoginFormConfiguration();', 'CrossWindowsBookmarklet_TEST');
55 console.log("runBookmarkletScript"); 53 console.log("runBookmarkletScript");
56}; 54};
57 55
58init = function () { 56init = function () {
59 MochiKit.Signal.connect('newWindow', 'onclick', newWindow); 57 MochiKit.Signal.connect('newWindow', 'onclick', newWindow);
60 MochiKit.Signal.connect('runBookmarkletScript', 'onclick', runBookmarkletScript); 58 MochiKit.Signal.connect('runBookmarkletScript', 'onclick', runBookmarkletScript);
61}; 59};
62 60
63MochiKit.DOM.addLoadEvent(init); 61MochiKit.DOM.addLoadEvent(init);
diff --git a/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html
index 50928d2..0247fcc 100644
--- a/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html
+++ b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html
@@ -1,70 +1,68 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Cross Window Bookmarklet execution - test</title> 26 <title>Cross Window Bookmarklet execution - test</title>
29 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
30 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script> 28 <script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
31 29
32 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script> 30 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
33 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script> 31 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
34 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script> 32 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
35 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script> 33 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
36 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script> 34 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
37 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script> 35 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
38 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script> 36 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
39 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script> 37 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
40 38
41 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script> 39 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
42 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script> 40 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
43 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script> 41 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
44 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script> 42 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
45 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script> 43 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
46 44
47 <script type='text/javascript' src='./CrossWindowsBookmarklet_test.js'></script> 45 <script type='text/javascript' src='./CrossWindowsBookmarklet_test.js'></script>
48<script> 46<script>
49 Clipperz_IEisBroken = false; 47 Clipperz_IEisBroken = false;
50</script> 48</script>
51 49
52<!--[if IE]><script> 50<!--[if IE]><script>
53Clipperz_IEisBroken = true; 51Clipperz_IEisBroken = true;
54</script><![endif]--> 52</script><![endif]-->
55 53
56 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" /> 54 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/clipperz.css" />
57 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" /> 55 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/compact.css" />
58 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" /> 56 <link rel="stylesheet" type="text/css" href="../../../../css/clipperz/ytheme-clipperz.css" />
59 57
60</head> 58</head>
61<body> 59<body>
62 60
63<div id="tableWrapper"></div> 61<div id="tableWrapper"></div>
64 62
65<ul> 63<ul>
66 <li><a href="#" id="newWindow">open window</a></li> 64 <li><a href="#" id="newWindow">open window</a></li>
67 <li><a href="#" id="runBookmarkletScript">run bookmarklet script</a></li> 65 <li><a href="#" id="runBookmarkletScript">run bookmarklet script</a></li>
68</ul> 66</ul>
69</body> 67</body>
70</html> 68</html>
diff --git a/frontend/gamma/tests/tests/index.html b/frontend/gamma/tests/tests/index.html
index 9775f93..8d89092 100644
--- a/frontend/gamma/tests/tests/index.html
+++ b/frontend/gamma/tests/tests/index.html
@@ -1,45 +1,43 @@
1<!-- 1<!--
2 2
3Copyright 2008-2011 Clipperz Srl 3Copyright 2008-2013 Clipperz Srl
4 4
5This file is part of Clipperz Community Edition. 5This file is part of Clipperz, the online password manager.
6Clipperz Community Edition is an online password manager.
7For further information about its features and functionalities please 6For further information about its features and functionalities please
8refer to http://www.clipperz.com. 7refer to http://www.clipperz.com.
9 8
10* Clipperz Community Edition is free software: you can redistribute 9* Clipperz is free software: you can redistribute it and/or modify it
11 it and/or modify it under the terms of the GNU Affero General Public 10 under the terms of the GNU Affero General Public License as published
12 License as published by the Free Software Foundation, either version 11 by the Free Software Foundation, either version 3 of the License, or
13 3 of the License, or (at your option) any later version. 12 (at your option) any later version.
14 13
15* Clipperz Community Edition is distributed in the hope that it will 14* Clipperz is distributed in the hope that it will be useful, but
16 be useful, but WITHOUT ANY WARRANTY; without even the implied 15 WITHOUT ANY WARRANTY; without even the implied warranty of
17 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Affero General Public License for more details. 17 See the GNU Affero General Public License for more details.
19 18
20* You should have received a copy of the GNU Affero General Public 19* You should have received a copy of the GNU Affero General Public
21 License along with Clipperz Community Edition. If not, see 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
22 <http://www.gnu.org/licenses/>.
23 21
24--> 22-->
25 23
26<html> 24<html>
27<head> 25<head>
28 <title>Complete TEST suite</title> 26 <title>Complete TEST suite</title>
29 <script type="text/javascript" src="../../js/MochiKit/MochiKit.js"></script> 27 <script type="text/javascript" src="../../js/MochiKit/MochiKit.js"></script>
30 <script type="text/javascript" src="../SimpleTest/TestRunner.js"></script> 28 <script type="text/javascript" src="../SimpleTest/TestRunner.js"></script>
31</head> 29</head>
32<body> 30<body>
33<script> 31<script>
34TestRunner.runTests( 32TestRunner.runTests(
35 'Clipperz/index.html', 33 'Clipperz/index.html',
36 'Clipperz/Crypto/index.html', 34 'Clipperz/Crypto/index.html',
37 'Clipperz/PM/index.html', 35 'Clipperz/PM/index.html',
38 'Clipperz/PM/DataModel/index.html', 36 'Clipperz/PM/DataModel/index.html',
39 'Clipperz/PM/UI/index.html', 37 'Clipperz/PM/UI/index.html',
40 'Clipperz/PM/UI/Web/index.html', 38 'Clipperz/PM/UI/Web/index.html',
41 'Clipperz/PM/UI/Web/Controllers/index.html' 39 'Clipperz/PM/UI/Web/Controllers/index.html'
42); 40);
43</script> 41</script>
44</body> 42</body>
45</html> \ No newline at end of file 43</html> \ No newline at end of file